高效率編輯器 Vim——操作篇,非常適合 Vim 新手

雖然從很久前就開始用 Vim 了,但一直都是半吊子,翻來覆去只用自己會的命令。最近為了提高書寫程式碼的效率,還有 coding 時候的樂趣,又重新鑽研了一下 Vim,發現了一篇很好的 Vim 入門的文章,原文是英文版的,我覺得非常適合 Vim 使用入門,所以翻譯了過來。這裡是簡單的介紹了 Vim 的操作方式,並沒有說為什麼要用 Vim,如果你想知道答案可以去 Google,Vim 被譽為編輯器之神。

高效率編輯器 Vim——操作篇,非常適合 Vim 新手

這篇教程寫了在不同工作模式下使用 Vim 的一些基本技巧——即插入模式(insert mode), 命令模式(command mode), 存取檔案等。目的是幫助剛剛接觸 Vim 的新手更加有效率的使用這個出色的編輯器。

說明:在這篇文章裡面, 代表 Ctrl + X——就是按住 Ctrl 鍵然後再按 X。而且你可以在很多情況下使用 :help command 來獲得大部分命令的幫助,這個是 Vim 的內部幫助檔案命令。

高效率移動

在插入模式之外

基本上來說,你應該儘可能少的呆在插入模式裡面,因為在插入模式裡面 Vim 就像一個“啞巴”編輯器一樣。很多新手都會一直呆在插入模式裡面,因為這樣易於使用。但 Vim 的強大之處在於他的命令列模式!你會發現,在你越來越瞭解 Vim 之後,你就會花越來越少的時間使用插入模式了。

使用 h、j、k、l

使用 Vim 高效率編輯的第一步,就是放棄使用箭頭鍵。使用 Vim,你就不用頻繁的在箭頭鍵和字母鍵之間移來移去了,這會節省你很多時間。當你在命令模式時,你可以用 h、j、k、l 來分別實現左、下、上、右箭頭的功能。一開始可能需要適應一下,但一旦習慣這種方式,你就會發現這樣操作的高效之處了。

在你編輯你的電子郵件或者其他有段落的文字時,你可能會發現使用方向鍵和你預期的效果不一樣,有時候可能會一次跳過了很多行。這是因為你的段落在 Vim 看來是一個大的長長的行。這時你可以在按 h、j、k 或者 l 之前鍵入一個 g,這樣 Vim 就會按螢幕上面的行如你所願的移動了。

在當前行裡面有效的移動游標

很多編輯器只提供了簡單的命令來控制游標的移動(比如左、上、右、下、到行首/尾等)。Vim 則提供了很多強大的命令來滿足你控制游標的慾望。當游標從一點移動到另外一點,在這兩點之間的文字(包括這兩個點)稱作被“跨過”,這裡的命令也被稱作是 motion。(簡單說明一下,後面會用到這個重要的概念)

這裡是常用到的一些命令(motion):

fx:移動游標到當前行的下一個 x 處。很明顯,x 可以是任意一個字母,而且你可以使用 ; 來重複你的上一個 f 命令。tx:和上面的命令類似,但是是移動到 x 的左邊一個位置。(這真的很有用)Fx:和 fx 類似,不過是往回找。w:游標往前移動一個詞。b:游標往後移動一個詞。0:移動游標到當前行首。^:移動游標到當前行的第一個字母位置。$:移動游標到行尾。):移動游標到下一個句子。( :移動游標到上一個句子。在整個檔案裡面有效移動游標

Vim 有很多命令,可以用來到達檔案裡面你想到達的地方。下面是一些在檔案裡面移動的命令:

:向下移動一屏。:向上移動一屏。G:到檔案尾numG:移動游標到指定的行(num)。(比如 10G 就是到第 10 行)gg:到檔案首H:移動游標到螢幕上面M:移動游標到螢幕中間L:移動游標到螢幕下面*:讀取游標處的字串,並且移動游標到它再次出現的地方。#:和上面的類似,但是是往反方向尋找。/text:從當前游標處開始搜尋字串 text,並且到達 text 出現的地方。必須使用回車來開始這個搜尋命令。如果想重複上次的搜尋的話,按 n。?text:和上面類似,但是是反方向。ma:在當前游標的位置標記一個書籤,名字為 a。書籤名只能是小寫字母。你看不見書籤的存在,但它確實已經在那裡了。`a:到書籤 a 處。注意這個不是單引號,它一般位於大部分鍵盤的 1 的左邊。`。:到你上次編輯檔案的地方。這個命令很有用,而且你不用自己去標記它。

高效率編輯器 Vim——操作篇,非常適合 Vim 新手

高效的輸入

使用關鍵詞自動完成

Vim 有一個非常漂亮的關鍵詞自動完成系統。這表示,你可以輸入一個長詞的一部分,然後按一下某個鍵,然後 Vim 就替你完成了這個長詞的輸入了。舉個例子:你有一個變數名為 iAmALongAndAwkwardVarName 在你寫的程式碼的某個地方。也許你不想每回都自己一個一個字母的去輸入它。

使用關鍵詞自動完成功能,你只需要輸入開始幾個字母(比如 iAmAL),然後按 (按住 Ctrl,再按 N)或者 。如果 Vim 沒有給出你想要的詞,繼續按,直到你滿意為止,Vim 會一直迴圈它找到的匹配的字串。

聰明的進入插入模式

很多新手進入插入模式都只是用 i。這樣當然可以進入插入模式,但通常不是那麼合適,因為 Vim 提供了很多進入插入模式的命令。下面是最常用的一些:

i:在當前字元的左邊插入I:在當前行首插入a:在當前字元的右邊插入A:在當前行尾插入o:在當前行下面插入一個新行O:在當前行上面插入一個新行c{motion}:刪除 motion 命令跨過的字元,並且進入插入模式。比如:c$,這將會刪除從游標位置到行尾的字元並且進入插入模式。ct!,這會刪除從游標位置到下一個歎號(但不包括),然後進入插入模式。被刪除的字元被存在了剪貼簿裡面,並且可以再粘貼出來。d{motion}:和上面差不多,但是不進入插入模式。

有效的移動大段的文字

使用可視選擇(visual selections)和合適的選擇模式

不像最初的 VI,Vim 允許你高亮(選擇)一些文字,並且進行操作。這裡有三種可視選擇模式:

v:按字元選擇。經常使用的模式,所以親自嘗試一下它。V:按行選擇。這在你想複製或者移動很多行的文字的時候特別有用。:按塊選擇。非常強大,只在很少的編輯器中才有這樣的功能。你可以選擇一個矩形塊,並且在這個矩形裡面的文字會被高亮。在選擇模式的時候使用上面所述的方向鍵和命令(motion)。比如,vwww,會高亮游標前面的三個詞。Vjj 將會高亮當前行以及下面兩行。

在可視選擇模式下剪下和複製

一旦你高亮了選區,你或許想進行一些操作:

d:剪貼選擇的內容到剪貼簿。y:複製選擇的內容到剪貼簿。c:剪貼選擇的內容到剪貼簿並且進入插入模式。在非可視選擇模式下剪下和複製

如果你很清楚的知道你想複製或者剪下什麼,那你根本就不需要進入可視選擇模式。這樣也會節省時間:

d{motion}:剪下 motion 命令跨過的字元到剪貼簿。比如,dw 會剪下一個詞而 dfS 會將從當前游標到下一個 S 之間的字元剪下至剪貼簿。y{motion}:和上面類似,不過是複製。c{motion}:和 d{motion} 類似,不過最後進入插入模式。dd:剪切當前行。yy:拷貝當前行。cc:剪切當前行並且進入插入模式。D:剪下從游標位置到行尾到剪貼簿。Y:拷貝當前行。C:和 D 類似,最後進入插入模式。x:剪切當前字元到剪貼簿。s:和x類似,不過最後進入插入模式。

貼上

貼上很簡單,按 p。

使用多重剪貼簿

很多編輯器都只提供了一個剪貼簿。Vim 有很多。剪貼簿在 Vim 裡面被稱為暫存器(Registers)。你可以列出當前定義的所有暫存器名和它們的內容,命令為“:reg”。最好使用小寫字母來作為暫存器的名稱,因為大寫的有些被 Vim 佔用了。

使用暫存器的命令為雙引號 “。

比如:我們要拷貝當前行到暫存器 k。你應該按 ”kyy。(你也可以使用 V“ky。為什麼這樣也可以呢?)現在當前行應該已經存在了暫存器 k 裡面直到你又複製了一些東西進入暫存器 k。現在你可以使用命令 ”kp 來貼上暫存器 k 裡面的內容到你想要的位置。

避免重複

令人驚奇的 。 命令

在 Vi 裡面,輸入 。 (小數點符號),將會重複你輸入的上一個命令。比如,你上個命令為“dw”(刪除一個詞),Vi 將會接著再刪除一個詞。

使用數字

使用數字也是 Vim 強大的而且很節省時間的重要特性之一。在很多 Vim 的命令之前都可以使用一個數字,這個數字將會告訴 Vim 這個命令需要執行幾次。比如:

3j 將會把游標向下移動三行。10dd 將會刪除十行。y3“ 將會複製從當前游標到第三個出現的引號之間的內容到剪貼簿。數字是擴充套件 motion 命令作用域非常有效的方法。

記錄宏

有時候,你會發現你自己在文章的每段或者每行都重複相同的一系列動作。Vim 允許你記錄一個宏來完成你的特殊需要。

qregister:記錄宏到暫存器 register,這裡 register 是任意的你的暫存器的名字。比如 qa,將會記錄並且把宏存在暫存器 a 裡面。q:結束宏的記錄。@register:使用存在暫存器 register 的宏。比如 @a,將會使用存在暫存器 a 裡面的宏。必須要記住的是,宏只記錄了你的系列按鍵並且重複執行它們。它們不是魔法。因為在 Vim 裡面完成目的的方法有很多,所以有時候你要小心選擇命令來記錄你的宏。因為它們會在所有你要執行它的地方執行。

用 Vim 寫程式碼

Vim 是一個用來寫程式碼的絕好編輯器,因為它有一些特性是專門為程式設計師而設計的。這裡是一些常用的:

]p:和 p 的功能差不多,但是它會自動調整被貼上的文字的縮排去適應當前程式碼的位置。試一下!%:匹配花括號、方括號、括號等。在一個括號的上面,然後按 %,滑鼠就會出現在匹配的另外一半括號處。>>:縮排所有選擇的程式碼<<:和上面類似,但是反縮排gd:到達游標所在處函式或者變數的定義處。K:在 Man 裡面查詢游標當前所在處的詞。