为什么此Vim映射的行为会有所不同,具体取决于输入可视模式的方式?

时间:2013-04-25 17:38:08

标签: vim insert keymapping

这个问题促成了我之前的一个问题:Vim's '(insert) VISUAL' mode?

在那个问题中,我询问了“VISUAL”模式与“(insert) VISUAL”模式,您可以直接从插入模式进入可视模式。我找到了一个根据视觉模式的“子类型”行为不同的映射,我不明白为什么:

vnoremap x <Esc>jjj
vnoremap <A-[> <C-G>ugv

第一个映射说明了Vim是如何使映射保持一致的:从“VISUAL”模式按 x 并从 x (insert) VISUAL”模式将光标向下移动3行。后者不会退出插入模式并输入三个j。因此,<Esc>的行为不同,具体取决于模式,即使在映射之外,它的行为也会与这两种模式不同。

第二个映射说明了一些地图的行为不一致。如果您突出显示一个单词并按 ALT + [,那么如果从“ugv”模式完成,该单词将替换为VISUAL,但如果没有任何反应,从“(insert) VISUAL”模式完成。据推测这是因为Vim正在执行“撤消”和“重新选择 - 视觉”的正常模式命令ugv

这是一个奇怪的不一致。这是我在调试映射时遇到的一个最小的例子,并且想知道它为什么会这样工作。

1 个答案:

答案 0 :(得分:1)

我可以重现您的示例,我认为您的分析是正确的。

当我从(插入)视觉模式输入 <C-G>ugv时,我得到了预期的结果:<C-G>切换到(插入)选择模式,ugv用这些字符替换选择。映射应该以相同的方式运行。

我猜这是一个错误;整个(插入)子模式非常特殊,不经常使用,因此容易出错。您可以自己深入研究源代码,或者在vim_dev mailing list上提出此问题。由于问题的模糊性,可能很难从开发者那里获得很大的兴趣。