Vim 復制粘貼探秘
Vim 作為最好用的文本編輯器之一,使用vim來編文檔,寫代碼實在是很愜意的事情。每當學會了vim的一個新功能,就會很大地提高工作效率。有人使用vim幾 十年,還沒有完全掌握vim的功能,這也說明了vim的強大。而這樣何嘗不是一件好事呢,只要有的學習,就有的提高。
最近使用Vim來寫博客,發現在Vim中粘貼Python代碼后,縮進就全亂了。仔細研究了以下,原來是自動縮進的緣故,於是做如下設置:
:set noai nosi
取消了自動縮進和智能縮進,這樣粘貼就不會錯行了。但在有的vim中不行,還是排版錯亂。
后來發現了更好用的設置:
:set paste
進入paste模式以后,可以在插入模式下粘貼內容,不會有任何變形。這個真是灰常好用,情不自禁看了一下幫助,發現它做了這么多事:
- textwidth設置為0
- wrapmargin設置為0
- set noai
- set nosi
- softtabstop設置為0
- revins重置
- ruler重置
- showmatch重置
- formatoptions使用空值
下面的選項值不變,但卻被禁用:
- lisp
- indentexpr
- cindent
怪不得之前只設置noai和nosi不行,原來與這么多因素有關!
但這樣還是比較麻煩的,每次要粘貼的話,先set paste,然后粘貼,然后再set nopaste。有沒有更方便的呢?你可能想到了,使用鍵盤映射呀,對。我們可以這樣設置::
:map <F10> :set paste<CR> :map <F11> :set nopaste<CR>
這樣在粘貼前按F10鍵啟動paste模式,粘貼后按F11取消paste模式即可。其實,paste有一個切換paste開關的選項,這就是pastetoggle。通過它可以綁定快捷鍵來激活/取消 paste模式。比如::
:set pastetoggle=<F11>
這樣減少了一個快捷鍵的占用,使用起來也更方便一些。
但,這是最方便的嗎?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
選擇緩沖區和系統剪切板啥子區別?讓我們繼續研究。