簡體   English   中英

插入模式Ctrl-O而不觸發autocmds

[英]Insert mode Ctrl-O without triggering autocmds

從默認狀態欄到自定義狀態,再到整潔狀態,電源線,航空公司,再回到自定義狀態欄,整個功能圈已成為一種奇特的功能,其顏色取決於狀態而定。 因此,有幾個autocmds可以在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實際上觸發了autocmds,我喜歡將Up和Down映射到gk gj,以按顯示行而不是整個包裹行移動。 在“插入”模式下快速滾動瀏覽文件時,這可能會導致相當明顯的顏色變化閃爍(最壞的一種)。 (在對COBOL進行編碼時,當您需要在DATA DIVISION和PROCEDURE DIVISION之間來回滾動時,這種情況經常發生,但這不重要。)

無論如何,我將在插入模式下使用tsk-tsks來使用光標鍵,但是我想知道是否有一種方法可以

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

在不觸發InsertLeave InsertEnter autocmds的情況下,重新繪制狀態行只是為了更改顏色,在這種情況下非常不必要。 或者以另一種方式在插入模式下使用光標鍵,這些光標鍵按顯示行而不是換行行移動。

我只想到了一種非常簡單的方法

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

i_CTRL-c不會觸發InsertLeave自動命令事件,因此我希望在您的情況下,它不閃爍。

然后我發現了這個出色的Ingo Karkat答案

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM