2

我有这些行.vimrc来更改 Vim 插入模式的状态行颜色。StatusLine 对InsertEnter. 然而,对于InsertLeave,有大约。StatusLine的消失--INSERT--和颜色变化之间有 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

任何帮助表示赞赏。

谢谢

4

2 回答 2

5

Vim 无法判断您正在离开插入模式,因为它所看到的只是一个转义。箭头键通常设置为终端 vim 解释为<ESC>OA<ESC>OB<ESC>OC<ESC>OD。所以 vim 在执行任何操作之前都在等待序列中的下一个键。这也是如果您键入只是坐在屏幕上一秒钟而不是在当前上方打开新行的<ESC>O原因。O

Vim 用于timeoutlen确定按键之间的等待时间。默认为 1000 毫秒。如果你愿意,你可以减少它,但它会使键入映射更加困难。

如果您紧接着键入不属于某些映射的内容,则 autocmd 也将被更快地触发。

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

于 2014-08-04T03:50:49.040 回答
1

您可以将timer_start函数与当前 vim模式检查一起使用,仅在按下 Escape 键而不是在序列内(箭头移动、键绑定等)时执行您的命令。

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()})
于 2020-04-30T18:12:38.920 回答