插入模式Ctrl-O而不触发autocmds

时间:2015-11-07 11:07:33

标签: vim

从默认状态线,到自定义,通过neatstatus,powerline,航空公司以及返回到自定义状态线的整个圈子,其中一个奇特的功能是根据模式的彩色状态线。所以,在InsertEnter和InsertLeave上触发颜色更改的几个autocmds,一切都很好,很快,带有视觉颜色提示,几乎全部在

set statusline=%-22.(%5l\ of\ %5L,%4c:%4v%)\ %P\ %6o\ %03b\ %<%F\ %y\ %h%m%r%=b:%2n\ %{strftime('%a\ %b\ %e\ %I:%M\ %p')}

但是,插入模式Ctrl-O实际上触发了autocmds,我喜欢上下移动到gk gj,按显示行而不是整个包裹线移动。在插入模式下快速滚动文件的那些时间内,这会导致相当多的几乎不会引人注意的颜色变化闪烁(最差类型)。 (当编码COBOL时,这种情况经常发生,当你需要在DATA DIVISION和PROCEDURE DIVISION之间来回滚动时,但这不是重点)。

无论如何,我会在插入模式下使用tsk-tsks来使用光标键,但我想知道是否有办法

inoremap <Up> <C-O>gk
inoremap <Down> <C-O>gj

没有触发InsertLeave InsertEnter autocmds,重新绘制状态行只是为了改变颜色,在这种情况下非常不必要。或者在插入模式下使用光标键的另一种方法是按显示行移动而不是换行。

1 个答案:

答案 0 :(得分:2)

我只想到如何做到这一点非常简单

inoremap <Up> <C-c>gka
inoremap <Down> <C-c>gja

i_CTRL-c不会触发InsertLeave自动命令事件,所以我希望在你的情况下它意味着没有闪存。

然后我发现这个优秀的Ingo Karkat answer

function! IgnoreOn( motion )
    set eventignore+=InsertLeave,InsertEnter
    return "\<C-o>" . a:motion
endfunction
function! IgnoreOff()
    set eventignore-=InsertLeave,InsertEnter
    return "\<Left>\<Right>" | " Workaround for missing screen update.
endfunction
inoremap <expr> <SID>IgnoreOff IgnoreOff()
inoremap <expr> <SID>IgnoredDown IgnoreOn('gj')
inoremap <script> <Down> <SID>IgnoredDown<SID>IgnoreOff
inoremap <expr> <SID>IgnoredUp IgnoreOn('gk')
inoremap <script> <Up> <SID>IgnoredUp<SID>IgnoreOff