教你解決 Vim 貼上縮排錯亂問題
今天各種實驗我的vim,發現一個問題就是我把從vim外的複製貼上到vim裡時,縮排完全無解錯亂噁心,好在,強大的網友給出了很完美的答案
Thanks
Problems & Solutions
via vincent178
當Vim的自動縮排開啟的時候,你貼上到終端Vim的code會出現縮排錯亂的情況。當然這個問題只是出現在從其他應用裡面複製內容,並且不是用的MacVim或者Gui Vim的時候.
原因是在終端的vim中沒有相應的程式來處理這個從其他應用複製貼上的過程,所以Vim通過插入鍵盤輸入的buffer來模擬這個貼上的過程,這個時候Vim會以為這是使用者輸入的。
問題就是出在這:當上一行結束,游標進入下一行時Vim會自動以上一行的的縮排為初始位置。這樣就會破壞原始檔案的縮排。
好在Vim提供了past和pastetoggle選項,你只要把這一行加入你的vimrc檔案。
set pastetoggle=<F2>
還有更高階的
nnoremap <F2> :set invpaste paste?<CR> imap <F2> <C-O>:set invpaste paste?<CR> set pastetoggle=<F2>
第一行的作用是在命令模式下,按F2會在狀態列顯示paste
第二行的作用是在insert模式下,按F2會在狀態列顯示paste
這樣可以在狀態列中顯示paste,不賴吧。。。
對於vim沒什麼特別要求的,以下是我選擇的方法
via nightire (Albert Yu)
autocmd InsertEnter * set local paste
autocmd InsertLeave * set local nopaste
這個的效果呢,就是當你進入Insert
模式的時候自動開啟paste
,此時你從外面複製貼上進來的東西就會保持原有隊形了。之後你回到 Normal 模式的時候,Vim 會自動關閉paste
。這個比較適合不喜歡按快捷鍵的純粹懶人,不過請小心,一直處於 paste 開啟的狀態下雖然不影響基本的功能,但是可能會影響其他的外掛正常工作哦!
最好的辦法還是使用鍵位對映在你需要貼上的時候手動開啟
paste
,不過可以保留離開時自動nopaste
的功能,省點事兒,因為有時候你開啟paste
複製完,然後退出Insert
時忘記了nopaste
,那麼下次再進入Insert
的時候還是paste
的。不過實際使用中最好把
autocmd
的命令用一個自定義的augroup
包起來,並在最開始用autocmd!
重置一下,以避免重複修改.vimrc
造成的autocmd
過載多次。具體的作法我放個圖:
截圖裡還給了一個有用的設定,讓從 Insert 模式下離開的時候沒有延遲,Vim 預設的設定會有點遲鈍的感覺。