禁用 esc 键超时

Disable timeout on esc key

问题

我在insert mode,然后我可能会输入一个数字,然后快速ESC,因为我停止输入所以它会变成visual mode. 然后发生的是 cursor 跳转,不仅如此,我所在的行(我刚刚输入)的数字也减少了。 这是一场噩梦!

这是什么原因造成的?

这是某种默认行为吗?如果是这样,我该如何禁用它? 这可能是导致它的插件吗?因为我并不总是有这个"feature"。 几个月来我一直在努力弄清楚是什么原因造成的,我已经发布了这个 generic question.

特别是在编程时,数字自动递减会引起很多麻烦,所以我禁用了它的默认映射,通过在我的 .vimrc 中映射 <C-a> <Nop>;更多信息 .

您的问题似乎与 'timeout' 选项及其朋友 'timeoutlen''ttimeout''ttimeoutlen'.

有关

试试这个命令:

:set timeout timeoutlen=3000 ttimeoutlen=100

取自:h 'ttm:

The timeout only happens when the 'timeout' and 'ttimeout' options tell so. A useful setting would be :set timeout timeoutlen=3000 ttimeoutlen=100 (time out on mapping after three seconds, time out on key codes after a tenth of a second).


就个人而言,我使用这些设置:

set timeout
set ttimeout
set timeoutlen=3000
set ttimeoutlen=50

前 2 个命令分别启用映射和键码超时。

第三个命令 set timeoutlen=3000 告诉 Vim 等待 3s 让我完成映射左侧的输入。

第 4 个命令 set ttimeoutlen=50 告诉 Vim 只等待 50ms 键码序列完成。例如,在我的机器上,F1 生成键码序列 Escape O P(通过在插入模式下键入 C-v F1 确认,显示 ^[OP^[ 代表Escape).

您最初的问题可能是因为您的 'ttimeoutlen' 选项的值太高,因此键码序列的超时时间不够快,允许 Vim 有时会将您键入的一系列击键解释为您未按下的其他键所产生的。通过降低其值,您可以防止这种情况发生。


如果您在 vimrc 中设置了之前的选项后问题仍然存在,则可能是插件随后更改了它们。

在这种情况下,当您的问题再次出现时,请键入以下命令:

:verb set timeout?
:verb set ttimeout?
:verb set timeoutlen?
:verb set ttimeoutlen?

它们中的每一个都会告诉您选项的当前值,但更重要的是它会告诉您更改值的最后一个文件的名称。