1. 程式人生 > >教你解決 Vim 貼上縮排錯亂問題

教你解決 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 預設的設定會有點遲鈍的感覺。