本文件是李正果先生所写的
《大家来学vim》的摘录,强烈建议初学者看一下这本书,我觉得这本书对初学vim的人非常有帮助。
var:查看版本信息
移动光标
h 左,或 Backspace 或方向鍵。
j 下,或 Enter 或 +(要 Shift 鍵),或方向鍵。
k 上,或 方向鍵或 -(不必 Shift 鍵)。
l 右,或 Space 或方向鍵。
Ctrl+f 即 PageDown 翻頁(Forward,向前、下翻頁)。
Crtl+b 即 PageUp 翻頁(Backward,向後、上翻頁)。
0 是數目字 0 而不是英文字母 o。或是 Home 鍵,移至行首,(含空白字元)。
^ 移至行首第一個非空白字元,注意,要 Shift 鍵。
$ 移至行尾,或 End 鍵。要 Shift 鍵。
G 移至檔尾(全文最後一行的第一個非空白字元處)
gg 移至檔首(全文第一行之第一個非空白字元處)。
H 移至螢幕頂第一個非空白字元。
M 移至螢幕中間第一個非空白字元。
L 移至螢幕底第一個非空白字元。這和 PageDown,PageUp 不一樣,內文內容並未動,只是游標在動而已。
n| 移至第 n 個字元(欄)處。注意,要用 Shift 鍵。n 是從頭起算的。
:n 移至第 n 行行首。或 nG。
进入编辑
i 在游標所在字元前開始輸入文字(insert)。
a 在游標所在字元後開始輸入文字(append)。
o 在游標所在行下開一新行來輸入文字(open)。
I 在行首開始輸入文字。此之行首指第一個非空白字元處,要從真正的第一個字元處開始輸人文字,可使用 0i 或 gI(Vim 才有)。
A 在行尾開始輸入文字。這個好用,您不必管游標在此行的什麼地方,只要按 A 就會在行尾等著您輸入文字。
O 在游標所在行上開一新行來輸入文字。
J 將下一行整行接至本行(Joint)。
删除命令
x 刪除游標所在處之字元,在中文指一個中文字。在 Vim 可用 Del 鍵。
X 刪除游標前之字元。不可使用 Backspace 鍵,除非是在插入模式。Vim 可以正確使用以上兩個指令於中文,會刪去一個中文字。。
dd 刪除一整行(delete line)。
dw 刪除一個字(delete word)。不能適用於中文。
dG 刪至檔尾。
d1G 刪至檔首。或 dgg(只能用於 Vim)。
D 刪至行尾,或 d$(含游標所在處字元)。
d0 刪至行首,或 d^(不含游標所在處字元)。請回憶一下 $ 及 ^ 所代表的意義,您就可以理解 d$ 及 d^ 的動作,這就是 vi(m) 可愛之處。
复制粘贴
yy 複製游標所在行整行。或大寫一個 Y。
2yy 複製兩行,y2y 也可以。ㄟ,請舉一反三好不好!:-)
y^ 複製至行首,或 y0。不含游標所在處字元。
y$ 複製至行尾。含游標所在處字元。
yw 複製一個 word。
y2w 複製兩個字。
yG 複製至檔尾。
y1G 複製至檔首。
p 小寫 p 代表貼至游標後(下)。
P 大寫 P 代表貼至游標前(上)。整行的複製,按 p 或 P 時是插入式的貼在下(上)一行。非整行的複製則是貼在游標所在處之後(前)。
"ayy 將本行文字複製到 a 緩衝區。
a 可為 26 個英文字母中的一個,如果是小寫的話,原先的內容會被清掉,如果是大寫的話是 append 的作用,會把內容附加到原先內容之後。" 是 Enter 鍵隔壁的那一個同上符號(ditto marks),當然是要和 shift 鍵同時按的。
"ap 將 a 緩衝區的內容貼上。
這個緩衝區的術語在 Vim 稱為 registers,Vim 擴充了相當多的功能。您用 d、c、s、x、y 等指令改變或刪除的內容都是放在 registers 中的。例如:您用 dd 刪除的一行,也是可以使用 p 來貼上的。只要是在緩衝區的內容都可以使用 p 來貼上,不是一定要 y 起來的內容才能用 p。因此您認為 p 是 paste 也可以,認為是 put 可能較正確。
5"ayy 複製五行內容至 a 緩衝區。
5"Ayy 再複製五行附在 a 內容之後,現在 a 中有十行內容了!
ㄟ!不要我一直用 a 您就認為只有 a 可以用喔。26 個英文字母都可以的,交叉運用下,您會發覺 Vim 肚量不小。
查找代换
/ 在 c-mode 的情形下,按 / 就會在左下方出現一個 /,然後鍵入您要尋找的字串,按個 Enter 就會開始找。? 和 / 相同,只是 / 是向前(下)找, ? 則是向後(上)找。
n 繼續尋找。
N 繼續尋找(反向)。
代换语法:“:[range]s/pattern/string/[c,e,g,i]”
range 指的是範圍,1,7 指從第一行至第七行,1,$ 指從第一行至最後一行,也就是整篇文章,也可以 % 代表。還記得嗎? % 是目前編輯的文章,# 是前一次編輯的文章。
string 將 pattern 由 string 所取代。
c confirm,每次替換前會詢問。
e 不顯示 error。
g globe,不詢問,整行替換。
i ignore 不分大小寫。
书签功能
mx x 代表 26 個小寫英文字母,這樣游標所在處就會被 mark。
`x 回到書籤原設定位置。` 是 backward quote,就是 Tab 鍵上面那一個。
'x 回到書籤設定行行首。' 是 forward quote,是 Enter 鍵隔壁那一個。
這裡舉個簡單的子,請隨便開一個現成的檔案,把游標移到任一個位置,然後按 ma 做個 mark,再按大寫 G 移到檔尾,然後按 'a 看現在在什麼地方?
注:小写字母只能用于一个档案内,大写字母可用于多个档案。例如 mA 會在 viminfo 中紀錄下這個檔案及位置,結束 vim,然後再啟動 vim,按 'A 就會回到當初做標記的那個檔案及所在位置(vim 會自動開啟做有 A 標記的檔案)。'0 是回到前一次編輯檔案中離開前的最後位置,'1 則是回到前二次編輯檔案的最後位置,依此類推。
想返回原來的位置(或檔案),可以按 Ctrl + O。
:marks 显示目前所有书签的列表
多档编辑
:n 編輯下一個檔案。
:2n 編輯下二個檔案。
:N 編輯前一個檔案。注意,這種用法只能用於 argument list 的情形。
:e 檔名 這是在進入 vim 後,在不離開 vim 的情形下再開其它檔案。只要您要編輯的檔案是在目前目錄,Tab 補全鍵還是可以使用。
:e# 或 Ctrl+^ 編輯前一個檔案,用於兩檔互相編輯時相當好用。這種用法不管是 argument list 或 buffer list 檔案間皆可使用。還記得嗎?# 代表的是前一次編輯的檔案。
:files 或 :buffers 或 :ls,會列出目前 buffer 中的所有檔案。在 buffers 中,減號 -表示這個 buffer 並未載入,不過,不必擔心,載入相當快速的。加號 + 表示這個 buffer 已經修改過了。# 代表前一次編輯的檔案,% 是目前編輯中的檔案,這兩個代號應該很熟悉了吧!
:bn buffer next。編輯次一個 buffer 的檔案。
:bp buffer previous。編輯前一個 buffer 的檔案。
:bl buffer last。編輯 buffer 中最後一個檔案。
:b檔名或編號 移至該檔。
在 :ls 中就會出示各檔案的編號,這個編號在未離開 vim 前是不會變的。當然 :e#編號 也是可以的,這樣的用法則是所有 vi clone 都通用了。如果您是使用 Vim 的 GUI,那就在功能表上就會有 Buffers 這個選項,可以很容易的知道及移動各 buffer 間。
:bd(elete) buffer 在未離開 vim 前是不會移除的,可使用這個指令移除。其實移除她幹什麼呢?vim 是您在叫用時才會載入的,因此這些 buffers 並不是像 cache 一般要佔記憶體的。
:e! 檔名 這樣也是會開檔,但會放棄目前編輯檔案的改變,否則如果檔案已有變動,vim 預設是不讓您隨便離開的。:e! 後不接什麼的話,代表捨棄一切修改,重新載入編輯中檔案。
:f 或 Ctrl+g 顯示目前編輯的檔名、是否經過修改及目前游標所在之位置。
:f 檔名 改變編輯中的檔名。(file)
:r 檔名 在游標所在處插入一個檔案內容。(read)
:35 r 檔名 將檔案插入至 35 行之後。
gf 這是 vim 的特殊叫檔法,會叫出游標所在處的 word 為名的檔案,當然,這個檔案要在目前目錄內,否則會開新檔案。
离开
:q 如本文有修改而沒存檔,會警告,且無法離開。(quit)
:q! 捨棄所有修改,強迫離開。
:wq 存檔後離開。縱使檔案未曾修改也是會再存一次檔。
:x 也是存檔後離開,但如果檔案沒有修改,則不會做存檔的動作。
ZZ 和 :x 完全一樣,隨您高興用哪一個。
:w 檔名 另存他檔。不加檔名就是寫入原檔。(write)
:q 及 :q! 是對目前編輯中的檔案作用,如果多檔編輯的情形並不會離開 vim,這時可下 :qa 或 :qa! 來整個離開 vim。a 就是 all 的意思。:指令!,這個 ! 的意思是強迫中止目前正在編輯的動作,而去執行所下的指令。各位應該到目前為止碰過好幾次了吧!
多档编辑
多檔編輯會有兩種情形,一種是在進入 vim 前所用的參數就是多個檔(這種情形稱為 argument list)。另一種情形是進入 vim 後另外再開其它的檔(稱為 buffer list)。不過都可以統稱為 buffer。
:n 編輯下一個檔案。
:2n 編輯下二個檔案。
:N 編輯前一個檔案。注意,這種用法只能用於 argument list 的情形。
:e 檔名 這是在進入 vim 後,在不離開 vim 的情形下再開其它檔案。只要您要編輯的檔案是在目前目錄,Tab 補全鍵還是可以使用。
:e# 或 Ctrl+^ 編輯前一個檔案,用於兩檔互相編輯時相當好用。這種用法不管是 argument list 或 buffer list 檔案間皆可使用。還記得嗎?# 代表的是前一次編輯的檔案。
:files 或 :buffers 或 :ls,會列出目前 buffer 中的所有檔案。在 elvis 中可使用 :b 來叫出 buffers。在 buffers 中,減號 -表示這個 buffer 並未載入,不過,不必擔心,載入相當快速的。加號 + 表示這個 buffer 已經修改過了。# 代表前一次編輯的檔案,% 是目前編輯中的檔案,這兩個代號應該很熟悉了吧!
:bn buffer next。編輯次一個 buffer 的檔案。
:bp buffer previous。編輯前一個 buffer 的檔案。
:bl buffer last。編輯 buffer 中最後一個檔案。以上兩個指令 elvis 不適用。
:b檔名或編號 移至該檔。
在 :ls 中就會出示各檔案的編號,這個編號在未離開 vim 前是不會變的。這個指令在 elvis 也是可以使用。當然 :e#編號 也是可以的,這樣的用法則是所有 vi clone 都通用了。如果您是使用 Vim 的 GUI,那就在功能表上就會有 Buffers 這個選項,可以很容易的知道及移動各 buffer 間。
:bd(elete) buffer 在未離開 vim 前是不會移除的,可使用這個指令移除。其實移除她幹什麼呢?vim 是您在叫用時才會載入的,因此這些 buffers 並不是像 cache 一般要佔記憶體的。
:e! 檔名 這樣也是會開檔,但會放棄目前編輯檔案的改變,否則如果檔案已有變動,vim 預設是不讓您隨便離開的。:e! 後不接什麼的話,代表捨棄一切修改,重新載入編輯中檔案。
:f 或 Ctrl+g 顯示目前編輯的檔名、是否經過修改及目前游標所在之位置。
:f 檔名 改變編輯中的檔名。(file)
:r 檔名 在游標所在處插入一個檔案內容。(read)
:35 r 檔名 將檔案插入至 35 行之後。
gf 這是 vim 的特殊叫檔法,會叫出游標所在處的 word 為名的檔案,當然,這個檔案要在目前目錄內,否則會開新檔案。
存档/离开
:q 如本文有修改而沒存檔,會警告,且無法離開。(quit)
:q! 捨棄所有修改,強迫離開。
:wq 存檔後離開。縱使檔案未曾修改也是會再存一次檔。
:x 也是存檔後離開,但如果檔案沒有修改,則不會做存檔的動作。
ZZ 和 :x 完全一樣,隨您高興用哪一個。
:w 檔名 另存他檔。不加檔名就是寫入原檔。(write)
:q 及 :q! 是對目前編輯中的檔案作用,如果多檔編輯的情形並不會離開 vim,這時可下 :qa 或 :qa! 來整個離開 vim。a 就是 all 的意思。:指令!,這個 ! 的意思是強迫中止目前正在編輯的動作,而去執行所下的指令。各位應該到目前為止碰過好幾次了吧!
加密
:X 对文件进行加密
标示指令
v 小寫 v,這是屬於字元標示(character visual),按下 v 後您就可以移動游標,游標走過的地方就會標示起來。再按一次 v 或按 Esc 鍵就會結束 v-mode。
V 大寫 V,這是行標示(line visual),按下 V 後會整行標示起來(包括行首前空白的部分),您移動上下鍵,會標示多行。再按一次 V 或 Esc 鍵就會結束 v-mode。
Ctrl+v 這是區塊標示(blockwise visual),可縱向標示矩形區域。再按一次 Ctrl+v 就會結束 v-mode。結束 v-mode 的方式亦可使用 Esc 鍵,或統一使用 Ctrl+c。Windows 系統下 Ctrl+v 是複製鍵,可以使用 Ctrl+Q 來替代。
d 刪除標示區內容。
y 複製標示區內容。
c 替換標示區內容。
標示區內容大小寫互換。
gq 重排標示區內容。ㄟ…… 是要先標示好才按的。"ay 還能不能用呢?當然可以,這樣就會把標示區內容存於 a 緩衝區中。可以用 "ap 來貼上。
Shift+> 標示區內容向右移一個 Tab。
Shift+< 標示區內容向左移一個 Tab。
视窗操作
Ctrl+w n 即 :new。開一空的新視窗。
這在 Vim 會開在原視窗上半方,也就是視窗一分為二。凡是視窗操作的按鍵都是由 Ctrl+w 來起頭的,w 就是 window 的意思。
Ctrl+w s 即 :sp(lit),會開一新視窗,且原檔分屬兩個視窗。
Ctrl+w f 開一新視窗,並編輯游標所在處之 word 為檔名的檔案。
Ctrl+w q 即 :q 結束分割出來的視窗。
Ctrl+w o 即 :only! 使游標所在之視窗,成為目前唯一顯示的視窗其它視窗會隱藏起來。
Ctrl+w j 移至下視窗。
Ctrl+w k 移至上視窗。還記得 hjkl 的按鍵移動方式嗎?
:sp 檔名 開另一新視窗來編輯檔案。
如果您覺得這樣分割個視窗來編輯檔案不怎麼方便,那您可以利用 X 下的虛擬桌面,多開個 rxvt + Vim 來做多檔編輯也是可以的啦!不過這樣不僅會多佔記憶體,而且 Vim 中好用的書籤功能就沒法使用了。
shell命令
:!外部指令 執行外部指令。當然您的指令要在 $PATH 環境變數內。
:!! 執行前一次執行之外部指令。在這裡的 ! 可不是強迫中止喔!
@: 這是 Vim 的一個很特殊的指令,可以重複前一次的冒號命令。
:sh(ell) 執行 shell。使用 exit 回到 vim。
這在 Vim GUI 會在原視窗內顯示執行結果。至於是用哪一種 shell 是可以另外設定的,可由 :set shell= 來設定。
另外,在此補充一下補全的功能。不是只有 Tab 鍵的補全功能喔!也可以使用上下方向鍵,叫出歷史指令,叫出歷史指令可用於冒號命令及尋找命令(/)。例如,您前已下了 :!ps aux 這個指令,您可以按 : 後就直接按向上方向鍵。別忘了!尋找指令也是可以這樣用喔!
:r !commond 這個就妙了!會在游標所在處次一行插入外部指令 commond 執行後的輸出內容。例如 :r !date 就會插入日期時間。這在 elvis 是會插入在游標所在處那一行。
:n,mw !commond 以 n 至 m 行內之資料,當做外部指令 commond 的 input。這算是相當高級的用法了,初學者大概還用不上,不過印象中留有一個這樣的功能,以後總是會用得上的。
K 大寫 K 會顯示游標所在處之 word 的 man page 系統線上使用手冊。
折疊的產生
手動產生折疊的指令是 zf、zF、:fo[ld],以下以例子來說明較清楚。
zfap 將游標所在處的那個段落折疊成一行。
zf7G 自游標所在處至全文第 7 行折疊起來。
:3,9fold 將第 3 行至第 7 行折疊起來。
5zF 將游標所在處起算 5 行的內容折疊起來。
也可以將所要折疊的部份以 Shift+v 標記起來,然以按 zf 就會將標記的內容折疊起來。
折疊的操作
zo 將游標所在處的折疊打開。open。
zc 將游標所在處已打開的內容再度折疊起來。close。
zr 將全文的所有折疊依層次通通打開。reduce。
zm 將全文已打開的折疊依層次通通再折疊起來。more。
zR 作用和 zr 同,但會打開含巢狀折疊(折疊中又還有折疊)的所有折疊。
zM 作用和 zm 同,但對於巢狀折疊亦有作用。
zi 這是個切換,是折疊與不折疊指令間的切換。
zn 打開全文的所有折疊。fold none。
zN 這是 zn 的相對指令,回復所有的折疊。
那這個 zn 和 zR 不是都一樣嗎?不是的,zR 的作用於 foldlevel 這個設定項,是控制折疊的層次,而 zn 則是作用於 foldenable 這個設定項,他是不管層次的,只有全關或全開。當然,所得到的結果有許多情形下是一樣的,但裡子不一樣,這在寫 Vim script 時得小心分辨。
通常,游標在折疊處向左或向右移的話,折疊也會自動打開。在進入編輯模式,例如按 i 或 o,這是也會自動打開折疊。
其他的複製、刪除及替換等動作還是可以和一般正常文稿一樣的操作,例如 dd 就會刪掉一整個折疊,yy 會複製一整個折疊,p 會貼上一整個折疊。把整個折疊就當做是一行就行了。
手動折疊,在下一次開檔時就消失了,但我們可以使用 :mkview 把折疊的情形記憶起來,下一次載入同一個檔案時就可以下 :loadview,記憶起以前折疊的情況。