[英]In Vim, why is temporary Normal Mode (Ctrl-O from Insert Mode) executing commands much slower?
[英]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.