【问题标题】:Insert mode Ctrl-O without triggering autocmds插入模式 Ctrl-O 不触发自动命令
【发布时间】:2015-11-08 02:39:25
【问题描述】:

从默认状态线到自定义状态线的完整循环,通过整洁状态、电力线、航空公司和返回到自定义状态线,其中一个奇特的功能是根据模式的彩色状态线。因此,几个自动命令触发 InsertEnter 和 InsertLeave 上的颜色变化,一切都很好,活泼,带有视觉颜色提示,而且几乎都在

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 实际上会触发自动命令,我喜欢将 Up 和 Down 映射到 gk gj,以便按显示行而不是整个换行行移动。在插入模式下快速滚动文件时,这可能会导致相当多的几乎不明显颜色变化闪烁(最糟糕的一种)。 (这在编写 COBOL 代码时经常发生,当您需要在 DATA DIVISION 和 PROCEDURE DIVISION 之间来回滚动时,但这不是重点)。

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

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

在不触发 InsertLeave InsertEnter 自动命令的情况下,重新绘制状态行只是为了改变颜色,在这种情况下是不必要的。或者以不同的方式在插入模式下使用光标键移动显示行而不是换行。

【问题讨论】:

    标签: vim


    【解决方案1】:

    我只考虑了非常简单的方法

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

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

    然后我发现了这个很棒的Ingo Karkatanswer

    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
    

    【讨论】:

      猜你喜欢
      • 2019-06-08
      • 2016-05-29
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多