如果我在 Vim 中处于插入模式,然后按下Control + W
,它会等待片刻,然后删除前一个单词。如果我按下 后立即开始输入,它会立即删除前一个单词并将其替换为我输入的内容。
不管哪种情况,前一个单词都会被删除,而我接下来输入的任何内容都会替换它。那么为什么要暂停呢?那时我还能做些什么吗?
更新
这是在 OSX Snow Leopard 上的 MacVim 7.3 (55) 上。我刚刚使用 vanilla 配置登录服务器并尝试了一下,删除是即时的。所以也许是我的配置出了问题?
答案1
你可能有一个以 Ctrl-W 开头的映射,因此 Vim 会等待一段时间来判断你是否要使用它,请检查:verbose imap <C-W>
答案2
作为Raimondi 提到,你的 .vimrc 对 有一个不明确的映射<C-w>
。
我发现更有用的是完全地重新映射Ctrl-w
以获得我想要的“更改窗口”行为:
imap <C-w> <esc><C-w>
现在,我仍然可以<C-w><C-w>
像映射一样转到下一个窗口,但它允许我使用全部窗口移动(参见:help window-moving
Vim)。对我来说,这更强大,尽管我失去了默认<C-w>
行为。
回到你的延迟和模糊映射。你在 .vimrc 中定义了一个,并且 Vim 中内置了一个映射,因此你有:
imap <C-w> [built-in behavior: delete previous word]
(不是真正的语法,仅用于说明)
imap <C-w><C-w> <esc><C-w><C-w>
虽然 Vi 根本不允许这样的映射,但 Vim 可以处理模糊映射;:help map-ambiguous
Vim 中的描述很好地解释了您的情况:
map-ambiguous When two mappings start with the same sequence of characters, they are ambiguous. Example: :imap aa foo :imap aaa bar When Vim has read "aa", it will need to get another character to be able to decide if "aa" or "aaa" should be mapped. This means that after typing > "aa" that mapping won't get expanded yet, Vim is waiting for another character. If you type a space, then "foo" will get inserted, plus the space. If you type "a", then "bar" will get inserted. {Vi does not allow ambiguous mappings}
如果你想保持该<C-w>
行为可用,最好的办法可能是将其映射到 Ctrl-Backspace。这样做并不直观,但根据https://vim.fandom.com/wiki/Map_Ctrl-Backspace_to_delete_previous_word有可能的:
在终端 Vim 中映射 Ctrl-Backspace 不起作用。以下是解决方法。
noremap! <C-BS> <C-w> noremap! <C-h> <C-w>