当我使用多行插页时,如果我执行Ctrl-V
,DownArrow
多次选择,I
要插入,请说我输入空格:
foo
bar
qux
现在,如果我Ctrl-C
,则变为
foo
bar
qux
即刻
但如果我Ctrl-[
或ESC
,Vim 滞后半秒,则在所有三行之前插入一个空格
foo
bar
qux
同样地,我说我正在处理一些Ruby代码
def foo
bar
end
我仍处于插入模式,光标停留在end
之后
如果我Ctrl-C
,则end
会停留在那里,错误地缩进
如果我Ctrl-[
或ESC
,Vim 滞后半秒,请正确缩进end
,因此它变为:
def foo
bar
end
如何消除这种滞后?
答案 0 :(得分:2)
当您按某些键或执行某些操作时,您的终端会将转义序列发送到Vim(或任何其他程序)。例如,尝试输入cat
并按向上箭头,即可得到:
llama@llama:~$ cat
^[[A
请注意,当您按向上箭头键时,您的终端实际获得的是 Esc [ A (快速连续)。 (^[
代表Esc。)
当您转动鼠标上的滚轮等时,会发送类似的转义序列
Vim解释这些转义序列(例如,您可以使用终端内的滚轮在Vim中滚动)。但是因为它们以逃脱角色开头,所以这会造成一些歧义。
例如,当Vim在插入模式下获取Escape字符时,它必须决定它是否意味着“退出插入模式”,或者它是否是转义序列的第一部分(“向上滚动”)。
Vim有几个设置:ttimeoutlen
,这是Vim决定“延迟”的数量“好吧,这不是一个转义序列,它是一个实际的转义字符。”这是以毫秒为单位,如果您希望在.vimrc中使用set ttimeoutlen=foo
,则可以更改它(其中foo是Vim等待的时间量,以毫秒为单位)。
还有esckeys
选项,告诉Vim是否要解释这些转义序列。如果您不关心它们,可以在.vimrc中使用set noesckeys
完全删除超时(以及转义序列的功能)。