Vim 入門教程
轉載請保留以上信息
Vim 的教程相對比較零散,系統的教程比較少,我也閱讀過不少教程,走過很 多彎路。借着 Vim-china 組織組建這一契機,整理下自己學習過的內容, 分享給大家。如有任何問題,可以提交issue進行討論.
簡介
Vim 是一款開源的模式化文本編輯器,項目源碼公開在 Github。Windows 用戶 可以從此下載最新的每日構建版: vim-win32-installer。
如何退出 vim
別緊張。確保你使用的是英文輸入法,然后按如下順序敲擊鍵盤:
- 按一下 ESC
- 輸入一個 :
- 輸入一個 q
- 輸入一個 !
- 按一下回車,即鍵盤上的 Enter
做得很好,你已經安全了。
什么是模式
Vim 不同於其他編輯器的主要特點就是模式化。什么叫做模式化?可以理解為 編輯器的一種狀態,不同的狀態下對用戶的輸入采取不同的響應方式。比較常 見的模式有 Normal(普通模式),Insert(插入模式)和 Visual(可視模式)。
Vim 打開是默認的模式是 Normal 模式,在這一模式下,按鍵不能直接將字符插入至文件,而是執行各種命令。比如 h
按鍵不是輸入字符 h,而是將光標 向左移動一個字符位置。
插入模式,顧名思義,在這個模式下,按鍵的字符是直接插入的。
可視模式,這一模式有點類似於在普通編輯器里按住鼠標左鍵移動鼠標,即進行選擇。
如何在模式之間切換
普通模式是 Vim 默認模式,任何模式下通過 <ESC>
按鍵都可以切換到普通模式。 普通模式想要切換到插入模式,方法有很多。比較常用的按鍵如下:
按鍵 | 描述 | 助記 |
---|---|---|
i |
在當前光標字符前插入 | insert |
a |
在當前光標字符后插入 | append |
I |
在當前行首插入 | Insert |
A |
在當前行尾插入 | Append |
o |
在下方開一新行,插入 | open |
O |
在上方開一新行,插入 | Open |
普通模式切換到可視模式,按鍵就比較單一了,比較常用的是:
按鍵 | 描述 | 助記 |
---|---|---|
v |
選中當前光標字符,並進入可視模式 | visual |
V |
不同於小寫 v ,這時移動光標只會按行選擇 |
Visual |
<Ctrl-v> |
塊選擇模式,此時移動光標會選擇一個矩形塊 |
可視模式切換到輸入模式一般有以下幾種情況:
按鍵 | 描述 | 助記 |
---|---|---|
s |
刪除當前已選擇的內容,並進入插入模式 | |
c |
刪除當前已選擇的內容,並進入插入模式 | change |
di |
刪除當前已選擇的內容,並進入插入模式 |
可視模式回到普通模式也有很多方式,比較直接的就是<ESC>
,當然,還有其他一些按鍵:
按鍵 | 描述 | 助記 |
---|---|---|
y |
復制當前選擇區域,並退出可視模式 | yank |
Y |
復制當前選擇區域(按行),並退出可視模式 | Yank |
基本概念
Vim 的各種命令是可以靈活組合變通的,命令是解決問題的手段。
基本操作
移動命令
Vim 的各種移動命令主要是在 Normal 模式下。最基本的移動命令是光標的上下 左右移動,當然,你可以使用方向鍵,但是我想更多的 Vim 用戶比較喜歡使用 h、j、k、l 按鍵。
按鍵 | 描述 |
---|---|
h |
光標左移 |
j |
光標下移 |
k |
光標上移 |
l |
光標右移 |
學會了這四個移動命令,你就可以自由地移動你的光標了,開始盡情地上下左右!
慢着,一個光標一個光標移動多慢啊,電腦上的其他編輯器可以鼠標定位, 還有那么多觸控設備可以直接定位光標,用 Vim 的用戶難道是慢吞吞的烏龜么?
還記得一開始說的靈活使用命令么?你可以輸入“數字+移動命令”,一次性進行多次移動。
按鍵 | 描述 |
---|---|
n+h |
光標左移 n 個位置 ,n(umber) 指數字 |
n+j |
光標下移 n 個位置 ,n(umber) 指數字 |
n+k |
光標上移 n 個位置 ,n(umber) 指數字 |
n+l |
光標右移 n 個位置 ,n(umber) 指數字 |
帶上了數字后,你發現光標健步如飛,仿佛穿上了跑鞋:)
開放思想,當你編輯一個小文件時,正好光標在一行中部,你想跳到行首,你可以99h
, 當你在文件中部,你可以99k
跳到第一行,同理其他移動命令來達成行尾、末行的效果。
但如果一個文件有幾萬行幾萬列,我們也這樣輸入一個無窮大的數字來跳轉么?
放心,Vim 已經內置了這些該有的命令。
當然 Vim 還有其他常用的移動光標的按鍵:
按鍵 | 描述 | 助記 |
---|---|---|
0 |
跳到行首,可以理解為無窮大的h |
|
^ |
跳到行首開始的第一個非空白字符 | |
$ |
跳到行尾,可以理解為無窮大的l |
|
gg |
跳到首行,可以理解為無窮大的k |
|
G |
跳到末行,可以理解為無窮大的j |
|
w |
跳到下一個詞首 | word |
b |
跳到上一個詞首 | back-word |
e |
跳到下一個詞尾 | end |
ge |
跳到上一個詞尾 |
詞間跳轉中,“上一個詞首”的精確斷句為“上一個/詞首”,即如果當前光標不在詞首,則跳到本詞詞首; 如果當前光標已經在詞首,才跳到上一個詞的詞首。 “下一個詞尾”與此類似。
詞間跳轉也是支持“數字+移動命令”的,比如輸入 5w
可以向后移動 5 個詞。
除了 Normal 模式,移動命令也可以在可視模式下使用。 在可視模式下移動光標時,從進入可視模式時的光標位置到移動后的光標位置之間的文本將會被選中。
操作命令
編輯文檔的過程,實際上就是不斷操作特定文本的過程:刪除、修改、復制,等等。 Vim 下的操作命令(Operator Commands)即特指一系列針對特定文本的操作。 常用的操作命令包括:
按鍵 | 描述 | 助記 |
---|---|---|
c |
刪除,並進入插入模式 | change |
d |
刪除 | delete |
y |
復制 | yank |
gu |
變為小寫字母 | |
gU |
變為大寫字母 | |
g~ |
顛倒字母的大小寫 | |
> |
右縮進 | |
< |
左縮進 | |
= |
自動縮進 |
你可能會問,那怎么指定這些操作命令作用的文本對象呢?
操作命令+移動命令
記住我們剛開始所說的,Vim 的各種命令都是可以靈活組合變通的! 操作特定文本,Vim 的解決方案是"操作命令+移動命令", 即操作命令的對象由移動命令來指定,舉例:
dl
:向右刪除一個字符(刪除當下字符,右側字符不會被刪);dh
:向左刪除一個字符(刪除左側字符,當下字符不會被刪);d3l
:向右刪除 3 個字符(3dl
亦有相同效果,下同);d3w
:刪除文本至右側第三個詞首之前;de
:刪除當下字符至下一個詞尾;y2w
:復制當下位置至右側第二個詞首之間的文本;gUe
:將當下字符至下一個詞尾變成大寫;
其他請以此類推。你會發現,由於操作命令和移動命令的多種多樣,能夠組合出來的文本操作也是多種多樣。 再結合數字,可以實現的功能就更強大了。
需要注意的是,一個操作命令只會對緊隨其后的一個移動命令有效。所以 dll
的作用是 “向右刪除一個字符后再右移一位”,而不是“向右刪除兩個字符”。 如果要實現“向右刪除兩個字符”,應使用 d2l
。 2l
雖然相當於移動兩次,當應視為單個移動命令(因為單獨一個數字不構成一個完整命令)。
操作命令二連擊 = 行操作
針對一整行的操作是很常見的。 比如,如果要刪除一整行,應該如何操作呢? 根據上面的講解,你可能會回答:先用 0
回到行首,再用 d$
刪至行尾。 這未免顯得繁瑣了些。而且,這只是刪除了行內字符,並沒有將整行刪掉。
Vim 提供了“操作命令二連擊”的方式來實現真正的行操作:
按鍵 | 描述 |
---|---|
cc |
刪除整行,並進入 insert (插入)模式 |
dd |
刪除整行 |
yy |
復制整行 |
guu /gugu |
整行變為小寫字母 |
gUU /gUgU |
整行變為大寫字母 |
g~~ /g~g~ |
顛倒整行字母的大小寫 |
>> |
行右縮進 |
<< |
行左縮進 |
== |
行自動縮進 |
可視模式下操作命令
可視模式下使用操作命令則直觀得多。 進入可視模式,用移動命令選擇文本,再鍵入操作命令,指定的操作就會作用在選中文本上。 操作完成后,會自動退回 Normal 模式。
可視模式下“移動指令+操作指令”,和 Normal 模式下“操作指令+移動指令”,各有利弊。
Normal 模式的好處顯而易見,不用切換模式,更快捷。
可視模式的好處是操作對象更精准可控,因為選中的文本會被高亮; 相比之下,Normal 模式下就有點“黑燈瞎火”的感覺,如果移動指令稍微有點復雜,就易出錯 (比如 d7w
,詞數太多很可能數錯)。 此外,Normal 模式下,操作命令對光標移動的起始和終末字符是否生效,容易產生混淆,比如 de
會連包括詞尾在內的字符一起刪掉,而 dw
卻是刪到下一個詞首之前的字符為止。
總之,完成一種操作,在 Vim 下往往有多種解決方案,應在實踐中找到適合自己的最佳方案。
更多常用命令
上述操作命令在 Normal 模式都無法單獨生效,需要二連擊或者配合移動指令之類才能起作用。
Normal 模式下“一擊即中”的常用命令則包括:
按鍵 | 描述 | 助記 |
---|---|---|
p |
粘貼於當前光標之后 | paste/put |
P |
粘貼於當前光標之前 | Paste/Put |
x |
刪除當前字符,相當於 dl |
|
s |
刪除當前字符並插入,相當於 cl |
|
C |
刪除至行尾並插入,相當於 c$ |
|
D |
刪除至行尾 | |
S |
從當前行首個非空字符刪除至行尾並插入,相當於 ^C |
|
u |
撤銷上一次修改 | undo |
<Ctrl-r> |
重做上一次修改,u 的逆過程 |
redo |
. |
在當前光標處重復上一次修改 |
一個小思考題:d2w
和 dw.
都可以實現相同的效果,它們本質上一樣嗎? 如果它們之后跟着一個 u
或 .
,效果有什么不同? 考慮一下,如果你要刪除接連幾個詞,大概會使用怎樣的鍵入組合。
對了,重做命令是 <Ctrl-r>
而非 r
,因為 r
被另一個常用命令占用了,即替代命令:
按鍵 | 描述 | 助記 |
---|---|---|
r |
替代字符,將當前字符替代為緊跟着輸入的字符 | replace |
R |
進入替代模式,將當前及之后的字符都替代為緊跟着輸入的字符串,直到按 <Esc> 返回 Normal 模式 |
Replace |
轉自:https://github.com/vim-china/hello-vim/blob/master/quick-start-guide.md