在Vim的InsertLeave中存在滞后

时间:2014-08-04 03:12:43

标签: vim statusline

我在.vimrc中有这些行来改变Vim的插入模式的状态行的颜色。 StatusLine快速响应InsertEnter。但是,对于InsertLeave,约有。 --INSERT--消失与StatusLine中颜色变化之间的1秒延迟。我可以帮忙解决这个问题吗?

set laststatus=2
if version >= 700
  au InsertEnter * hi StatusLine term=reverse ctermbg=15 ctermfg=22
  au InsertLeave * hi StatusLine term=reverse ctermbg=16 ctermfg=0
endif

我尝试了:au Insertleave,只显示了一个命令:

--- Auto-Commands ---
InsertLeave
    *         hi StatusLine term=reverse ctermbg=16 ctermfg=0

感谢任何帮助。

由于

2 个答案:

答案 0 :(得分:5)

Vim无法告诉您正在离开插入模式,因为它所看到的只是一个逃脱。箭头键通常设置为由终端vim解释为<ESC>OA<ESC>OB<ESC>OC<ESC>OD。所以vim在做任何事之前都在等待序列中的下一个键。这也是因为如果您键入<ESC>OO只是在屏幕上停留一秒钟而不是在当前位置上打开一个新行,这也是原因。

Vim使用timeoutlen来确定按键之间等待的时间。默认为1000毫秒。你可以减少这个,但是它会使输入映射变得更难。

如果您在某些映射的一部分之后立即键入内容,则autocmd也会被更快地触发。

要查看的相关选项包括:h timeout:h ttimeout:h timeoutlen:h ttimeoutlen

答案 1 :(得分:1)

仅当按下Escape键时才可以使用timer_start函数与当前vim mode check一起执行命令,而不能在序列内部(箭头移动,键绑定等)执行命令。

function <SID>condInsertLeave()
    if mode() == "n"
        hi StatusLine term=reverse ctermbg=16 ctermfg=0
    endif
endfunction

autocmd InsertLeave * call timer_start(200, { tid -> <SID>condInsertLeave()})