Vim做爲最好用的文本編輯器之一,使用vim來編文檔,寫代碼實在是很愜意的事情。每當學會了vim的一個新功能,就會很大地提升工做效率。有人使用vim幾十年,尚未徹底掌握vim的功能,這也說明了vim的強大。而這樣未嘗不是一件好事呢,只要有的學習,就有的提升。vim
最近使用Vim來寫博客,發如今Vim中粘貼Python代碼後,縮進就全亂了。仔細研究瞭如下,原來是自動縮進的緣故,因而作以下設置: 編輯器
:set noai nosi
取消了自動縮進和智能縮進,這樣粘貼就不會錯行了。但在有的vim中不行,仍是排版錯亂。學習
後來發現了更好用的設置:spa
:set paste
進入paste模式之後,能夠在插入模式下粘貼內容,不會有任何變形。這個真是灰常好用,不由自主看了一下幫助,發現它作了這麼多事:orm
下面的選項值不變,但卻被禁用:blog
怪不得以前只設置noai和nosi不行,原來與這麼多因素有關!ip
但這樣仍是比較麻煩的,每次要粘貼的話,先set paste,而後粘貼,而後再set nopaste。有沒有更方便的呢?你可能想到了,使用鍵盤映射呀,對。咱們能夠這樣設置::ci
:map <F10> :set paste<CR> :map <F11> :set nopaste<CR>
這樣在粘貼前按F10鍵啓動paste模式,粘貼後按F11取消paste模式便可。其實,paste有一個切換paste開關的選項,這就是pastetoggle。經過它能夠綁定快捷鍵來激活/取消 paste模式。好比::文檔
:set pastetoggle=<F11>
這樣減小了一個快捷鍵的佔用,使用起來也更方便一些。terminal
但,這是最方便的嗎?Vimer們對高效的追求永無止境。還有其餘更好地方法嗎?
你可能想到了,vim寄存器。對,使用vim寄存器 「+p 粘貼便可。根本不用考慮是否自動縮進,是否paste模式,直接原文傳遞!:
"+p
要說vim寄存器,就要從vim文件間的複製粘貼提及。
Vim中,若要複製當前行,普通模式下按 yy 便可,在要粘貼的地方按 p 。這是vim將複製內容保存到了本身的寄存器中的緣故。若是在其餘地方執行yy,新的內容將覆蓋掉原寄存器中內容。若是想保存原寄存器中內容而同時增長新的內容呢?這時就要在yy前增長標籤了。標籤以雙引號開始,跟着的是標籤名稱,能夠是數字0-9,也能夠是26個字母,而後就是複製操做,這樣就把複製內容保存到該標籤寄存器裏。經過下面命令顯示全部寄存器內容::
:reg
其中注意兩個特殊的寄存器:」* 和 「+。這兩個寄存器是和系統相通的,前者關聯繫統選擇緩衝區,後者關聯繫統剪切板。經過它們能夠和其餘程序進行數據交換。
若寄存器列表裏無」* 或 「+ 寄存器,則多是因爲沒有安裝vim的圖形界面所致。Debian/Ubuntu下能夠經過安裝vim-gnome解決。
$ sudo apt-get install vim-gnome
選擇緩衝區和系統剪切板啥子區別?讓咱們繼續研究。
不一樣於Windows,Linux系統裏存在兩個剪切板:一個叫作選擇緩衝區(X11 selection buffer),另外一個纔是剪切板(clipboard)。
選擇緩衝區是實時的,當使用鼠標或鍵盤選擇內容時,內容已經存在於選擇緩衝區了,這或許就是選擇緩衝區的由來吧。
使用下面的命令查看選擇緩衝區的內容::
$ xclip -out
若是沒有xclip命令,Debian/Ubuntu下能夠經過以下命令安裝::
$ sudo apt-get install xclip
可使用鼠標中鍵或鍵入Shift+Insert來粘貼選擇緩衝區的內容。但對於有些GUI程序,好比gedit,只能經過鼠標中鍵調用選擇緩衝區的內容,使用Shift+Insert的話,調用的是剪切板的內容。
剪切板和Windows的剪切板相似,在選擇文字內容後,執行Ctrl + c或在菜單裏選擇‘複製’的話,這時內容才存放到剪切板裏。
使用下面的命令查看剪切板的內容::
$ xclip -out -sel clipboard
而使用剪切板的內容,則是Ctrl+v。 但在有些狀況下,好比gnome-terminal,不能直接使用Ctrl+c,Ctrl+v,這時就要用Shift+Ctrl+c,Shift+Ctrl+v代替。
好了,瞭解了選擇緩衝區和剪切板,下面就是實現保留格式粘貼的完美解決方案:
這時,若是要複製的內容也是vim編輯器中的內容,那麼如何複製才更方便呢?
vim有一個可視模式(Visual Mode),在此模式下能夠選擇區域。能夠在普通模式下鍵入v進入可視模式,也能夠個性化一點,鍵入V進入行可視模式,或者鍵入Ctrl+v進入列可視模式。這時移動光標就能夠選擇內容了。注意這時被選內容已經實時保存於選擇緩衝區了,固然你也能夠鍵入」+y將此內容也保存到剪切板裏,或者」ay將內容保存到標籤爲a的寄存器中。但要知道,只有前兩個中的內容能夠在其餘程序中使用,而a寄存器中的內容只能在該vim編輯器內使用。
也能夠經過鼠標來複制。這裏首先要打開鼠標模式。:
:set mouse=a
這樣在普通模式下能夠直接使用鼠標選擇區域複製到選擇緩衝區。但這種狀況下不能複製到剪切板。
若要使用鼠標複製內容到剪切板,則須要作以下設置::
:set mouse=v
這種狀況下,除了能夠像上面同樣直接使用鼠標選擇區域複製到選擇緩衝區之外,還能夠在右鍵菜單中選擇「複製」來保存到剪切板裏。但新問題又出來了。若顯示行號,也會將行號一併選擇。你會想到,這好辦呀,若是不須要行號的話,在複製前,先執行set nonu來取消行號顯示唄。
其實不必這樣,若是不須要複製行號的話,用在可視模式下用鍵盤來選擇不就能夠嗎?
而且,從上面的討論,咱們不可貴出,使用選擇緩衝區比使用剪切板要方便的多,能夠節省不少步驟。
因此,最終咱們獲得了vim文件間複製粘貼的完美方案,文件傳輸的中轉使用選擇緩衝區。
在~/.vimrc中增長以下一行::
set mouse=v
複製內容到選擇緩衝區。
將選擇緩衝區中內容粘貼到vim文件:普通模式下按 「*p 。
設置vim中默認使用選擇緩衝區寄存器 「*:
set clipboard = unnamed
則能夠直接經過y,p和系統選擇緩衝區進行數據交換。