
一. Vim是什么
都說程序員只用兩種編輯器,一種是編輯器之神Vim,一種是神的編輯器Emacs,可現(xiàn)實生活中,我發(fā)現(xiàn)真正用這兩種編輯器的人很少,所以我開始有點懷疑這句話的真實性。
剛畢業(yè)那會,我對實際的軟件開發(fā)了解甚少,于是糊里糊涂的進(jìn)入了服務(wù)器開發(fā)領(lǐng)域,現(xiàn)在回想起來真是覺得既幸運又后怕。幸運的是,在我完全不了解的情況下竟然選擇了后端開發(fā),后怕的是,既然不了解,就很可能選擇到其他方向,而另一個選擇可能會造就一個完全不同的人生軌跡。雖然從現(xiàn)在的眼光去看軟件開發(fā)的每個方向,都非常有趣和有挑戰(zhàn),但服務(wù)器領(lǐng)域才是我最向往的地方,且它極大程度的滿足了我的好奇心。
不知道為什么,我對很古老的東西很感興趣,服務(wù)器開發(fā)日常面對的是一個終端界面,沒有圖形化的豐富表現(xiàn),只有常規(guī)的字符,讓我著迷的肯定不是它的表現(xiàn)形式,更深層次的講,它更接近于計算機(jī)最開始的樣子,在這種環(huán)境下工作可以幫助我更容易的掌握機(jī)算機(jī)的原理和思想。
區(qū)別于Windows這樣的操作系統(tǒng),Unix/Linux系統(tǒng)的設(shè)計原則是簡約(Kiss原則),可能有點違背直覺,大多數(shù)人認(rèn)為Windows更為容易上手,確實如此,但這并不意味著它的設(shè)計就是簡單的,使用起來就是高效的。而Unix不同,其中的每一個程序都只完成單一的功能,程序之間可以很容易的交互數(shù)據(jù),這樣,通過將不同程序進(jìn)行任意組合,可以創(chuàng)造出任意的功能,既匹配了程序員這一創(chuàng)造性工作,又極大的提升了工作效率。試比較——在同一目錄下,將所有jpg后綴轉(zhuǎn)換為png后綴的操作——在哪個系統(tǒng)上操作更為方便。
Unix設(shè)計原則對于大多數(shù)程序員來說,是一種“信仰”,而Vim也是其中一個具備KISS原則的產(chǎn)品。
所謂程序員只用兩種編輯器,我現(xiàn)在似乎明白為什么使用它們的程序員實際上并不多的原因了,這句話缺少了一個時間的維度,在過去,圖形界面不發(fā)達(dá),人們用計算機(jī)只能使用命令行,在命令行中也只能使用Vim或Emacs編輯器,而隨著時代的變遷,人們更傾向于使用易于上手的圖形化軟件,他們希望速成,不愿意在編輯器上花成本,而逐漸忘卻了Vim或Emacs。時至今日,這句話變成了:
程序員都用兩種編輯器,大多數(shù)人使用圖形化編輯器,少數(shù)人使用Vim或Emacs。
二. 我為什么使用Vim
我為什么會選擇Vim,一是因為Vim可以在所有操作系統(tǒng)及終端中使用,真正做到了“一招鮮,吃遍天”。學(xué)會了Vim,你再也不需要學(xué)習(xí)其他編輯器。
相反,如果你使用IDE的話,可能這輩子要學(xué)習(xí)很多編輯器,例如當(dāng)你使用C/C++時,你可能會用VS/SourceInsignt/SublimeText等,當(dāng)你使用Java時,你可能會換成Eclipse/Android Studio,而當(dāng)你做前端開發(fā)時,你需要學(xué)習(xí)使用WebStorm/Atom等。同時,這些IDE都無法在終端中運行,這時你要編碼和調(diào)試,需要跨越兩個環(huán)境,效率極低,如果你想改變這種現(xiàn)狀,你還得學(xué)習(xí)Vim。
而對于程序員來說,一個順手的開發(fā)環(huán)境決定了他的開發(fā)效率和幸福指數(shù),有時為了一個穩(wěn)定又一致的開發(fā)環(huán)境,我會放棄公司的辦公電腦,取而代之的是背一部幾公斤重的筆記本來來回回。
二是Vim的效率很高,它會想盡一切辦法將你的雙手放在主鍵盤區(qū),甚至不需要碰小鍵盤或鼠標(biāo),更深一層,為了達(dá)到相同的目的,它會讓你盡可能減少按鍵次數(shù)。這樣做都是為了讓你更加專注,集中精力去完成當(dāng)前的工作,而右手經(jīng)常在鼠標(biāo)和鍵盤之間來回切換,無疑是一種“打斷”。
最后一個原因,使用Vim真的很酷,因為Vim學(xué)習(xí)曲線比較陡峭,即便對于程序員同學(xué)來說,它不好用,或是一頭難以馴服的猛獸,所以在這種情況下,如果你可以把它運用自如,你擁有的就是別人從未有過的一種體驗。
三. 至少要掌握的知識
說Vim學(xué)習(xí)曲線陡峭,其實也是相對于其他編輯器來說的,其實也并沒有多陡峭,下面主要從以5個概念,來談一下Vim的最少必要知識,這是我平時使用Vim的過程中,總結(jié)出來的:對于一個新人,至少要知道哪些用法呢?
- 模式
- 命令
- 窗口,Buffer
- 配置
- 插件
模式
模式是Vim區(qū)別于其他編輯器的首要功能,它要解決的問題是“只使用鍵盤就可以完成所有工作”,你可以想象一下,當(dāng)你在使用電腦時,克制自己不用鼠標(biāo)或觸控板時的感受:你也許會感覺非常無力吧。而當(dāng)你在使用Vim時,這件事情不會給你帶來任何不適,相反如果你適應(yīng)了Vim的模式后,看到別人的右手在鍵盤和鼠標(biāo)之間來回切換,你才會覺得那個人的效率和自己比起來是多么低效。
Vim中的三個模式分別是
- 普通模式normal
- 插入模式insert
- 可視模式visual
普通模式相對于插入模式,它用來控制光標(biāo)移動、復(fù)制/粘貼文本、排版等,并將這些功能映射到指定的快捷鍵中,這樣當(dāng)你輸入一個按鍵,它就會幫你完成以上功能。
<Esc>
<Esc>按鍵幫你從其他模式切換到普通模式,所以當(dāng)蘋果在最新版的macbook pro中取消<esc>按鍵時,一大批Vimer第一個反應(yīng)就是macbook pro不適合開發(fā)者,不過我覺得這應(yīng)該不是什么大問題,在切換到Vim時,肯定會彈出相應(yīng)的虛擬按鍵,只是手感上應(yīng)該會差很多,但如果要追求更好的手感,我推薦你去外接一個機(jī)械鍵盤,真的不一樣。
h/j/k/l
這四個鍵在鍵盤的最中間,當(dāng)你處于普通模式時,h/j/k/l這四個按鍵分別代表了光標(biāo)向左/下/上/右移動一個字符,當(dāng)然你完全不需進(jìn)行刻意的記憶,打開電腦練習(xí)幾次就習(xí)慣了。學(xué)會了這幾個按鍵,你的手指再也不需要移動到小鍵盤上去了。

移動
ctrl+f/b/d/u
這四個快捷鍵,可以幫助你翻頁,實現(xiàn)光標(biāo)在文件中快速移動。
- ctrl+f:向下翻一頁
- ctrl+b:向上翻一頁
- ctrl+d:向上翻半頁
- ctrl+u:向下翻半頁
移動
b/w/e/shift+^/shift+$
普通模式下,h和l每次只能向左或向右移動一個字符,這無疑是非常慢的,下面幾個快捷鍵,可以幫助你在行內(nèi)快速移動
- b:將光標(biāo)移動到上一個單詞的第一個字符
- w:將光標(biāo)移動到下一個單詞的第一個字符
- e:將光標(biāo)移動到下一個單詞的最后一個字符
- shift+^:將光標(biāo)移動到行首
- shift+$:將光標(biāo)移動到行尾
移動
f/F'a'
在行內(nèi)快速移動的“升級版”,單引號中的內(nèi)容可以用任意字符代替,例如f'b'/F'b'
- fa:將光標(biāo)移到右邊的第一個字符a上,繼續(xù)按';'(分號),可以延相同的方向找到下一個a,繼續(xù)按','(逗號),可以延反方向找到下一個a
- Fa:將光標(biāo)移到左邊的第一個字符a上,繼續(xù)按';'(分號),可以延相同的方向找到下一個a,繼續(xù)按','(逗號),可以延反方向找到下一個a
當(dāng)你熟練使用這個快捷鍵,你就知道我為什么會說:
Vim會盡量減少你敲鍵盤的次數(shù)
移動
H/M/L
這幾個快捷鍵,可以幫你把光標(biāo)移動到屏幕的上方/中間/下方,注意是要打開大寫鎖定或按住shift
- H(high):將光標(biāo)移動到屏幕上方
- M(middle):將光標(biāo)移動到屏幕中間
- L(low):將光標(biāo)移動到屏幕下方
移動
[n]jk
中括號中的n可以用任意數(shù)字代替,例如10j表示將光標(biāo)向下移動10行,而10k則相反
- [n]j:將光標(biāo)向下移動n行
- [n]k:將光標(biāo)向上移動n行
移動
[n]G
同[n]jk命令,[n]G命令會幫你把光標(biāo)移動到指定的行數(shù),例如100G,會將光標(biāo)移動到文件的第100行
移動
gg/G
這兩個快捷鍵,會將光標(biāo)移動到文檔的第一行或最后一行
- gg:將光標(biāo)移動到文檔的第一行
- G:將光標(biāo)移動到文檔的最后一行
移動
zz
這個快捷鍵會將當(dāng)前光標(biāo)所在行居中
移動
%
該快捷鍵實質(zhì)上是shift+5兩個鍵的組合,可以讓你的光標(biāo)在成對的括號間跳轉(zhuǎn),例如大括號、圓括號、方括號等,該功能在寫代碼時經(jīng)常使用。
移動
*/#/n/N
-
*:在文件中查找光標(biāo)下的單詞(向下),如果要繼續(xù)查找,可以按n向下查找,按N反向查找 -
#:在文件中查找光標(biāo)下的單詞(向上),如果要繼續(xù)查找,可以按n向上查找,按N反向查找
移動
[[、]]、{、}
這套指令也特別容易記憶,因為大括號或花括號的方向即是你的光標(biāo)所移動的方向
- [[:將光標(biāo)移動到上一個代碼段(或函數(shù))的行首
- ]]:將光標(biāo)移動到下一個代碼段(或函數(shù))的行首
- {:將光標(biāo)移動到上一個空行行首
- }:將光標(biāo)移動到下一個空行行首

以上是在普通模式中最常用的移動操作,熟練掌握以上操作,Vim便成了你手中的“六脈神劍”,可以任由你“指哪打哪”了。
u/ctrl+r
- u:撤銷
- ctrl+r :重做
編輯
y/yy/p/P/"+y/"+p
這幾個命令表示基本的復(fù)制和粘貼
- y:復(fù)制,比較常用的是先進(jìn)入可視模式,然后按y,復(fù)制所選文本
- yy:復(fù)制一整行
- p:從光標(biāo)右邊開始粘貼,注意不能粘貼到Vim外的程序中
- P:大P,從光標(biāo)左邊開始粘貼
- "+y:復(fù)制到系統(tǒng)剪貼板,這樣就可以粘貼到Vim外面去了
- "+p:將Vim外復(fù)制的內(nèi)容粘貼進(jìn)來
+"y/p這種三個鍵的快捷鍵不是很方便,所以我們可以在vim中建立按鍵映射,將它的操作簡化,例如在~/.vimrc(沒有該文件的情況下要手動創(chuàng)建)中加入:
" 定義快捷鍵的前綴,即<Leader>
let mapleader="'"
" 在可視模式下,'+y則為復(fù)制到剪貼板
vnoremap <Leader>y "+y
" 普通模式下,'+p則為從剪貼板粘貼到Vim
nmap <Leader>p "+p
編輯
a/i/A/I/r/cc/cw
這幾個快捷鍵可以幫助你編輯文本
- a:從光標(biāo)右邊開始插入,進(jìn)入插入模式
- i:從光標(biāo)左邊開始插入,進(jìn)入插入模式
- A:從行尾插入,進(jìn)入插入模式
- I:從行首插入,進(jìn)入插入模式
- r:替換光標(biāo)下的字符,不進(jìn)入插入模式,例如rx,將光標(biāo)下的字符替換為x
- cc:修改光標(biāo)所在行,進(jìn)入插入模式
- cw:修改光標(biāo)開始以右的單詞,這個組合鍵在編碼的時候也經(jīng)常使用,Vim中的組合鍵由
動作+范圍組成,如c為修改動作,w為一個單詞的范圍,再如d2j表示:刪除光標(biāo)所在行及下一行,其中d為刪除動作,2j為下兩行
編輯
.
點號鍵可以幫你重復(fù)上次編輯操作,例如你想手動將文件中所有的int轉(zhuǎn)換為int64,只需要:
- 進(jìn)入普通模式,將光標(biāo)移到int下
- 敲擊*查找int
- 敲擊cw替換int,輸入int64
- 按ESC繼續(xù)進(jìn)入普通模式
- 敲擊n查找下一個int
- 敲擊.重復(fù)執(zhí)行替換,然后繼續(xù)執(zhí)行第5步驟
編輯
插入模式?jīng)]什么可說的,在這種模式下和其他編輯器沒有什么區(qū)別,下面說下可視模式
v/V/ctrl+v
v、V或ctrl+v進(jìn)入可視模式,在這種模式下你可以自由選擇你需要操作的文本,然后進(jìn)行批量操作
- v:進(jìn)入可視模式,按[n]hjkl調(diào)整范圍,n代表分別對hjkl做的次數(shù),例如v10l表示選擇光標(biāo)右邊的10個字符
- V:選擇光標(biāo)下的行,V10j表示選擇光標(biāo)及光標(biāo)下的10行
- ctrl+v:可以選擇一個塊狀的區(qū)域,這個功能能夠很好的幫你完成塊注釋或塊反注釋
下圖展示了我將某一個代碼塊注釋掉的動作
- 首先ctrl+v,然后敲擊6j,垂直選擇6行
- 輸入
:s,^,//,|noh將行首替換為注釋符號//,noh是禁止高亮的意思

選擇
命令
在Vim中可以通過輸入命令的方式進(jìn)行交互,在普通模式下,輸入:調(diào)出命令欄——Vim最底部的一欄,命令分為兩種
- Vim調(diào)用shell的命令,前面要加一個感嘆號,例如輸入
:!pwd執(zhí)行pwd - Vim內(nèi)置或用戶通過插件實現(xiàn)的命令,例如下面的幾個常用命令
:/ :?
查找命令
- :/id:從當(dāng)前光標(biāo)向下查找文件中的id字符串,為了方便,你可以直接敲擊
/id - :?id:從當(dāng)前光標(biāo)向上查找文件中的id字符串,為了方便,你可以直接敲擊
?id
:%s,Id,ID,g
:s為替換命令,上文可視模式中已經(jīng)展示了批量替換的威力,另外一種比較常用的是全文替換,例如:%s,Id,ID,g表示將全文中的Id替換為ID,g的意思是一行里面如果有多個匹配項,則都進(jìn)行替換,和sed中的替換是一個概念
:q :w :x :e
學(xué)到這里你已經(jīng)掌握了Vim中的基本用法,現(xiàn)在可以退出休息一下了:)
- :q 退出
- :w 保存
- :x 保存并退出
- :e 編輯文件,不存在則創(chuàng)建,例如
:e ~/.vimrc會編輯~/.vimrc這個文件
:help
即便看完了以上內(nèi)容,你可以順使用Vim了,但最好還是瀏覽一遍幫助文檔,這樣當(dāng)你遇到某個問題時,可以通過help進(jìn)行查找。
Window,Buffer
Vim一次可以打開多個文件,同時打開的文件暫存在Buffer對象中,每個打開的文件對應(yīng)一個buffer對象,你可以選擇性的通過打開某個Buffer來顯示對應(yīng)的文件,而一旦該文件顯示出來,用來顯示該文件的窗口被稱為Window,如果你的屏幕夠大,你可以把Vim分成多個窗口,即實現(xiàn)了多個文件同時進(jìn)行編輯的功能,非常方便你編寫代碼。這也是Vim和其他編輯器在理念上不一樣的地方,其他編輯器使用Tab來打開多個文件,雖然Vim也有Tab功能,但Window+Buffer的方式更符合習(xí)慣
:split vsplit ctrl-w+h/j/k/l
這幾個是Vim中操作窗口的命令
- :split 將光標(biāo)所在的Window分為上下兩個窗口
- :vsplit 將光標(biāo)所在的Window分為左右兩個窗口
- ctrl-w h/j/k/l 幫助你在不同窗口間進(jìn)行切換,h/j/k/l分別代表了切換到左/下/上/右窗口
看完了以上內(nèi)容,再看這幅濃縮圖,就會覺得格外清晰

配置
Vim是高度可定制的編輯器,你可以通過配置從而把它打造成一個非常強(qiáng)大的IDE,而所有的配置基本上都在~/.vimrc中完成,非常方便管理,網(wǎng)上講配置的文章和文檔非常多,相信你可以在網(wǎng)上找到你想要的內(nèi)容。
插件
插件本質(zhì)上是配置的一種,而掌握了Vim插件的安裝和使用后,你就可以將Vim運用到實際工作中了,基本的邏輯是,先明確自己的需求,然后在google中搜索對應(yīng)的關(guān)鍵字便可以找到你所需要的插件,這里就介紹一個非常重要的插件
NERDTree
NERDTree插件配合窗口功能非常好用,NERDTree插件可以幫你列出系統(tǒng)中的目錄和文件樹,打開其中文件的同時,還可以幫你進(jìn)行分屏,有了這樣的插件,你應(yīng)該會更得心應(yīng)手。
版權(quán)申明:
此文章首發(fā)于公眾號程序員在深圳,搜索studycode即可關(guān)注
本文無需授權(quán)即可轉(zhuǎn)載,甚至無需保留以上版權(quán)聲明
關(guān)注作者:
