開場白
Vim是一個十分強大的文本編輯器,被譽為”編輯器之神”,熟練地使用Vim會使你處理文本、編輯代碼的效率提升n個數(shù)量級!如果你現(xiàn)在還在使用gedit甚至是”記事本”的話,我奉勸你趕快把它扔到垃圾桶,馬上開始你的Vim之旅。這里列出一些我經(jīng)常使用的基本的Vim命令和技巧,Vim的使用是一個長期的學(xué)習(xí)、實踐、再學(xué)習(xí)、再實踐的過程。Here we go.
安裝Vim/Gvim
如果你現(xiàn)在沒使用過Vim/Gvim,你首先需要安裝它們,當(dāng)前的版本為7.2。Debian/Ubuntu下面,sudo apt-get install vim-gnome即可。其他系統(tǒng)也有相應(yīng)的包管理程序來直接安裝。對于Windows,你需要到Vim的官方網(wǎng)站來下載安裝。安裝時記得選中”設(shè)置Vim環(huán)境變量”的選項,這樣你就可以直接在cmd下使用vim了。
在正式開始之前,最好在終端(cmd)里運行vimtutor,一步步按照提示操作,以對vim的操作有一個初步的了解。
快速的移動
別在總在插入模式里呆著
除了敲代碼,不要總在插入模式里呆著,因為這樣的Vim就和諸如gedit等普通的編輯器就沒什么區(qū)別了。這就是為什么一些新手總是在插入模式的原因了,”好用”或者說”友好”。但是,Vim真正的威力卻在于其命令模式,你將會發(fā)現(xiàn),隨著你對Vim的了解和熟練,你用插入模式的時間會越來越少。
使用h, j, k, l
為了有效的編輯文件,你首先應(yīng)該做的就是戒掉那些個方向鍵 ←↓↑→,代以h, j, k, l,即左、下、上、右。這樣的好處是很明顯的,你的手不用再不停地在字母鍵和方向鍵之間來回挪動了,這會為你節(jié)省相當(dāng)可觀的時間,但或許你需要一定的時間來適應(yīng)這種轉(zhuǎn)變。
在使用中你可能會遇到這樣的文件,每一行(這里行以\n, \r標(biāo)識)的文字都很長,以至于需要用視覺上的多行來顯示,這時候使用j或者k會跳過若干行,以至于你不得不使用h或者l來在行內(nèi)移動。當(dāng)然,你可以不這么做,方法就是在j, k前面加g即可在視覺行間移動。
使用motion在當(dāng)前行內(nèi)高效地移動
許多其他的編輯器僅僅提供少量的命令來移動光標(biāo)(左,上,右,下,行首/末等等)。Vim有很多強大的命令來高效地移動,它們被成為motion,motion都通常都有一個開始點(通常就是當(dāng)前光標(biāo)處)和一個目標(biāo)點。下面列出一些有用的motion:
- fx :向右移動至字母x在當(dāng)前行內(nèi)下一次出現(xiàn)的位置f指forward,x可以是任一個字母。你還可以用;來重復(fù)執(zhí)行剛才的fx操作,這兩個命令的結(jié)合是極其有用的。
- tx :同fx,區(qū)別在于光標(biāo)會停留到x的右側(cè)。
- Fx :同fx,只是向左移動。
- w :向右移動一個單詞,光標(biāo)停留在下一個單詞的首字母,同樣地,b向左移動。類似的還有一個命令e也是想右移動一個單詞,只是光標(biāo)會停留在單詞的末尾。
- 0 :移動到行首,注意:這是零而不是O!
- $ :移動到行末。
- ^ :移動到當(dāng)前行的第一個字符。
- ( :移動到下一個句子。
- ) :移動到上一個句子。注:這兩個命令在編寫代碼是較少用到,但在編輯普通的文本文章時比較有用。
- zz、z.、z-、zt:重畫當(dāng)前屏幕,使當(dāng)前行顯示在屏幕的中間、中間、底部、頂部,具體請:help cmd。
在整個文件域內(nèi)高效地移動
下面的一些命令可以讓你在整個文件范圍內(nèi)移動,從而擺脫掉鼠標(biāo)滾輪。
- <C-f> :向下滾動一屏。
- <C-b> :向上滾動一屏。
- G :即<S-g>,移動到文件末尾。
- nG :移動到第n行。注:幾乎所有可重復(fù)性操作都可以使用前綴數(shù)字執(zhí)行n次。
- gg :移動到文件開頭。
- H :移動到屏幕的最上方。
- M :移動到屏幕正中間。
- L :移動到屏幕最下方。
- * :這個命令比較強大,它記錄當(dāng)前光標(biāo)處的單詞,并移動到該單詞下次出現(xiàn)的位置。
- # :和*相同,但方向相反。
- g* and g#:同上,但匹配包含當(dāng)前單詞的單詞,而不是完全匹配。
- /pattern :向下查找模式pattern指定的字符串,pattern可以是一個正則表達(dá)式,當(dāng)然也可以僅僅是一個單詞。
- pattern :同上,但方向相反。
- mb :在當(dāng)前光標(biāo)處設(shè)定一個書簽bookmark,雖然你看不到,但它確實存在。注:此處b可以是任何一個字母或者數(shù)字。
- `b :即ESC下面的”反引號”,移動到一個已經(jīng)設(shè)定的書簽處b。注:是`而不是’,不過’也是可以的,但只能移動到書簽b所在的行,你可以根據(jù)自己的需要來使用。
- `. :這個更牛叉,可以移動到你最近一次修改過的地方。
高效地輸入
關(guān)鍵字自動補全
Vim還有關(guān)鍵字自動補全的功能,這意味著:如果你已經(jīng)定義了一個很長的變量,比如iAmALongLongVariableName,下次就不必在這個名字再完整地敲一遍,而只需要輸入iAmA然后按下<C-n>,Vim就會為你自動補全這個變量名,如果前面不止一個類似的變量()那么Vim會彈出一個列表供你選擇,在這個列表中你可以用<C-p>和<C-n>上下移動,空格會選擇當(dāng)前高亮的變量名。
選擇適當(dāng)?shù)倪M(jìn)入插入模式的方法
很多新手,總是先移動至指定位置,然后再用i進(jìn)入到插入模式。這確實能夠達(dá)到目的,但有時卻并不合適。比如你現(xiàn)在在行末,需要在行首插入,如果一頓h或者聰明點的用nh或者nb,始終還是不夠高效。下面有幾個命令可供使用:
- i :在當(dāng)前光標(biāo)左側(cè)插入。
- I(大小i) :在行首插入。
- a :在當(dāng)前光標(biāo)右側(cè)插入。
- A :在行末插入。
- o :在當(dāng)前行下面新建一行并進(jìn)入插入模式。
- O :同o,但在當(dāng)前行的上面新建一行。
- c{motion} :刪除和移動的復(fù)合,其中motion是上文中提到過的。比如cfx,會從當(dāng)前光標(biāo)處開始刪除至字母x(不包括x)并進(jìn)入插入模式。被刪除的字符被保存到剪切板,可以被稍候粘貼到其他地方。
- d{motion} :同上,當(dāng)并不進(jìn)入插入模式。
高效地移動文本塊
可視化選擇
不同于Vim的前身vi,Vim允許你高亮(即Visual可視化模式)某個文本塊并對它執(zhí)行某些操作。選擇文本塊的方式有三種:
- v 進(jìn)入可視化模式,此時可以使用前面的移動命令在選取高亮區(qū)域。
- V 進(jìn)入行可視化模式,按行選擇,即正行地選擇。
- <C-V> 這個很有特色,它可以允許你在文本的任意地方選出一塊矩形區(qū)域!當(dāng)然,前提是那里確實有字符,很少有編輯器有這個功能。
按上述方法進(jìn)入可視化模式后,你可以使用前面的移動命令在選取高亮區(qū)域,比如vwww會高亮接下來的三個單詞,vjj會選擇下面的兩行,etc.
剪切和復(fù)制
- d :剪切,即刪除并放入剪切板。
- y :復(fù)制。
- c :同d,但還會進(jìn)入插入模式。
- d{motion} :和c{motion}類似。
- dd :剪切當(dāng)前行。
- yy :復(fù)制當(dāng)前行。
- cc :修改當(dāng)前行。
- D :剪切至行尾。
- Y :同yy。
- C :類似D。
- x:剪切光標(biāo)處字符。
- s :同x,但進(jìn)入插入模式。
- p :粘貼。
- n”+yy :這個稍顯復(fù)雜,它從當(dāng)前行開始向下復(fù)制n行,但和nyy不同的是,文本會被復(fù)制到系統(tǒng)剪切板,而不是Vim的剪切板,這樣你就能在其他程序比如瀏覽器中進(jìn)行Ctrl+V。
- ”+p :從系統(tǒng)剪切板粘貼。
- d’a, y’a:剪切和復(fù)制從當(dāng)前到書簽a之間各行。
- ”+y’a:這個看起來有些復(fù)雜,它是前面幾個命令的整合,和上一個命令功能相同,只是將當(dāng)前行至?xí)瀉所在行復(fù)制到系統(tǒng)剪切板。
- ”+ynumG:從當(dāng)前行一直復(fù)制到第num行,相比上面的,這個選擇性更大一點。
減少重復(fù)性操作
使用.
好吧,我為它單獨開了一個章節(jié),.功能實用使用簡單,但使用頻率卻十分的高。一個.可以重復(fù)你剛剛執(zhí)行過的編輯操作,比如刪除、粘貼等。
使用宏記錄
有時候,你會發(fā)現(xiàn)你自己在文章的每段或者每行都重復(fù)相同的一系列動作。VIM 允許你記錄一個宏來完成你的特殊需要。
- qregister:記錄宏到寄存器 register,這里 register 是任意的你的寄存器的名字。比如 qa,將會記錄并且把宏存在寄存器 a 里面。
- q:結(jié)束宏的記錄。
- @register:使用存在寄存器 register 的宏。比如 @a,將會使用存在寄存器 a 里面的宏。
寫代碼的時候
VIM 是一個用來寫代碼的絕好編輯器,因為它有一些特性是專門為程序員而設(shè)計的。這里是一些常用的基本命令:
- ]p:和 p 的功能差不多,但是它會自動調(diào)整被粘貼的文本的縮進(jìn)去適應(yīng)當(dāng)前代碼的位置。試一下!
- %:匹配花括號、方括號、括號等。在一個括號的上面,然后按 %,鼠標(biāo)就會出現(xiàn)在匹配的另外一半括號處。
- [{:光標(biāo)移動至當(dāng)前塊(block)起始處,即上文最近的一個{處。再次[{移動到當(dāng)前塊所在的塊起始處。
- ]}:同上,移動至塊末尾。
- [/:用于注釋塊(comment block)中,移動至塊起始。
- ]/:移動至注釋塊末尾。
- »:縮進(jìn)所有選擇的代碼
- «:和上面類似,但是反縮進(jìn)
- gd:到達(dá)光標(biāo)所在處函數(shù)或者變量的定義處。
- <C-]>:同上。
- <C-o>:返回<C-]>操作前的位置。操作前的位置
鍵綁定
發(fā)揮你想象力的時候到了。如你所見,Vim本身已經(jīng)提供了大量的命令供你調(diào)遣,但不是所有的命令或者命令組合都適合所有的人。為此,Vim同學(xué)給了你根據(jù)個人習(xí)慣綁定命令的自由。vimrc中的一個簡單的map命令即可做到,譬如
“ <cr>標(biāo)示回車(Enter) map ,w :w<cr> |
列出常用的一些特殊按鍵的代號,
- <cr>, <Cr>, or <CR>:回車;
- <Space>:空格;
- <Esc>:Esc;
- <c-x> or <C-x>:Ctrl + x;
- <a-x>:Alt + x;
- <m-x>:Meta + x;
- <Left>, <Right>, <Up>, <Down>:方向鍵;
- <BS>:Backspace;
- <F10>:功能鍵F10;
- <cword>:當(dāng)前單詞(類似a-b_c2);
- <cWORD>:當(dāng)前單詞(不含空白符的字符串);
- <cfile>:當(dāng)前單詞為名的文件;
- <Home>:Home,不是所有鍵盤都有的;
- Last but not the least, 所有的字母鍵都以