vim-logo.gif前一次我們已經看過在 vim 下的模式切換以及一些基本的操作。如果你只是想要有 vim 的 undo/redo 以及不怕電腦當機跳電的安全備份功能的話,其實使用 vim 一點也不複雜,因為你真正需要的也不過就是 a i o 加上 :w :q :wq :q! 這些而已。

但是如果你想要更進一步的話,那就需要指令模式了。所以今天我們會談論在指令模式下怎麼作刪除文字,以及一些和刪除命令有關的事情。

在正式談指令模式下的刪除行為之前,我們先稍微講一下指令模式下的游標移動(事實上 vim 的游標移動裡面有很多功能是相當好用的)。

  • 上下左右 :
  • 在 windows 下你可以用鍵盤上的上下左右鍵,但是在 un*ix 上或是許多系統上的你要在 vim 移動游標的話可能要透過 h(左)、 j(下)、 k(上)、 l(右)來移動。

  • 一行的最前和最後 :
  • 移到一行的最前面和最後面在 windows 是可以用 <Home >和 <End> ,但若在 un*ix 不能用這兩個鍵達到你想要的目的時,就得使用 「0」(數字零,不是英文字母 o)到一行的最前面,和用「$」到一行的最後面。

  • 整份文件的最前一行和最後一行 :
  • gg : 代表把游標移到整份文件的最前面一行。
    G : 代表把游標移到整份文件的最後一行。

  • 移動一個 word :
  • w : 這個功能在中文中可能不常用,你要用的話也不是不行,不過它就不像英文那樣會跳一個 word,而是會跳一大串中文字。其實這個只是根據標點符號以及空白鍵來作的區隔,因為中文的詞並不會有空白或是有什麼明顯且固定的區隔,所以這個功能在中文來說,以我自己來說是不太常用的。

約略提了一下游標移動之後,我們就可以來講刪除的動作了。

在 vim 的指令模式裡面,刪除的命令不外乎兩個字母 x 和 d 。

  • x 的刪除行為
  • 先來講 x 。 x 代表刪除游標後面的字元。所以根據你的編碼和設定,如果是英文的話 x 所砍的就是一個字母,如果是中文的話, x 所砍的就是一個中文字。如果你還記得 vim 的設計想法,你大概可以馬上知道大寫 X 代表什麼意思?沒錯,就是往前砍。

    一般來說 x 的刪除行為都是指單一的,像是一個字元或是指定刪除的個數。比方說你可以打 3x ,那它就是往後砍三個字元。

    x 和 d 不同的地方是,d 通常泛指不定範圍長度的刪除。但是如果是在選取模式的話,則二者幾無分別,因為對 x 來說,在你選取的時候事實上是已經指定刪除的個數,而對 d 而言,選取的部分也算是不定範圍,所以當你選取一段想要刪除的範圍時(選取的區域會反白),你就可以按下 x 或是 d 都可以把反白的區域刪除掉。

  • d 的刪除行為
  • 前面提過 d 通常泛指不定範圍長度的刪除,比方說我們想要刪除一行,那就是用「 dd 」,套剛剛在 x 的想法,假如想往後砍三行很直覺就會想到是「 3dd 」。

    那如果想包括這行砍到檔案的結尾或是開頭呢?那剛剛的游標移動就有用了:「 dgg 」就是往前砍到檔案開頭,「 dG 」就是往後砍到檔案結尾。

    聰明的你可能也會想到如果是想從游標位置砍到這行的開頭和結尾就分別是「 d0 」和「 d$ 」。不過我通常不會用「 d$ 」這個指令,而是用「 D 」來表示。這個 D 就有點和之前講的 vim 設計想法中的另外一類—指大範圍的想法—的相通,雖然可能多多少少有點不太一樣,不過在這裡我們只要會用就可以了。

其實對於一般的刪除行為來說,上面這些已經差不多夠用了。但是對於使用者來說,像我,我根本不會去計算從現在這個位置砍到我想要停的位置中間經過多少行或是多少個字元。那這個時候怎麼辦呢?

還記得我們的選取模式嗎?假如你想要砍的單位是用行計算的話,就是用大寫「 V 」,如果你不確定的話,可以按小寫「 v 」來選。在選取的時候,那些游標移動的指令是完全可以使用的,所以你可以用 0、$、gg、G、w 來作游標控制。一旦你確定好範圍之後,一個 d 或是 x 就可以把剛剛那些選出來的反白區域清除掉。

如果你是寫程式的人,這裡可以提供一個小技巧: vim 裡面有提供一個「%」的游標移動方式。這個功能會選擇這些符號「 { [ ( 」的配對組合,也就是說當你在這些符號上面,比方說是「 { 」這個符號上按「 % 」游標會從「 { 」跳到它所對應「 } 」 ,反之亦然。