到目前為止,我們只知道可以用 i 來進入插入模式。 而 vim 身為一個模式編輯器,如果只有一種進入插入模式的方法,這樣怎麼會好用呢? 所以接下來我要多介紹幾個在 vim 進入插入模式的按鍵,學會後可以方便一些。 首先介紹跟 i 成對的按鍵 a 。 vim 預設的游標在普通模式中應該會是方塊狀的,也就是游標所在的文字上會有一個方格一閃一閃的。 當進入插入模式時,則會變成一根棒子在兩個文字間閃爍。 i 進入插入模式後游標會是在普通模式時游標所選的文字前面, a 則相反,是在文字的後面。 亦即 i 適合將文字插到文字前,而 a 則適合將文字插在文字後。 比如要在行尾進入插入模式可以輸入 $a ,要在一個詞的後面進入插入模式則可以用 ea 。 要記得 a ,可以從英文下手, a 即為 append (加到後面的意思) 的縮寫。 vim 還提供了更簡單的方式在行首及行尾進入插入模式,即 I 與 A ,這兩個按鍵分別對應到 ^i 跟 $a 。 接著介紹插入空白行的按鍵,如果不知道怎麼做的話,用前面學的可以用 I RETURN 和 A RETURN 分別向上及向下插入一空白行。 vim 有另外的按鍵做到類似的事,即 O 和 o 。可以想成 oneline (一行) 或是 other line (另一行)。 o 會向下插入空白行並進入插入模式,而 O 則會向上插入空白行進入插入模式。 值得一提的是, o 和 O 也可以接受數字前綴,其意思為插入的行數,比如 2o 會向下插入兩行。 藉由在 o 和 O 加上數字前綴進入插入模式後會有一點小小的不同,稍後再提。
前一節才提過運算子,希望大家有看,也還記得其強大之處。 vim 裡面有個與 d 對應的運算子來進入插入模式,即 c ,這是 change (改變) 的縮寫。 知道 c 為運算子代表了什麼?這表示我們可以透過前面學過的多種方式來進入插入模式。 cc 直接重寫這一行, cw 砍掉一個詞做修改, cis 修改一整句話, ggcG 整個檔案砍掉重練,…等等。 另外前面好像沒提到 D 可以刪掉從游標到行尾的文字,而對應的 C 砍掉到行尾的文字後會進入插入模式。 前面有講過 x 即 dl ,相對應的 s 為 cl 。 仔細一看,這四個按鍵在 QWERTY 鍵盤上根本就擠在一起,不知道當初是不是因為這樣才將這四個按鍵功能設的相近。 奇怪的是, X 為 dh ,而 S 卻是 cc ,不過我也沒常用這兩個按鍵,都用 BACKSPACE 跟 cc 。
之前看到其他編輯器有所謂的列編輯,於是就來查查 vim 有沒有這種功能,結果沒想到還真的有,雖然只能做到連續的幾行做列編輯,不過還是覺得不錯用。 vim 做到列編輯的方式就是使用前面提過,但怪怪的區塊選取 CTRL-v 。 用 CTRL-v 選取文字後按下 I ,便可以在選取的文字前插入文字,實際使用可以發現只有最上面那行插入文字,說好的列編輯呢? 別急,等輸入好文字之後按一下 ESC 跳回普通模式,只要隨便動一下游標,就會發現用 CTRL-v 選取的每一行都插入了同樣的文字。 下面放個示意圖
原文字
abc abc abc
用 CTRL-v 後 I 插入文字
123abc abc abc
離開插入模式後動一下游標
123abc 123abc 123abc
說到這個,我就得提一下,列編輯離開插入模式後要動一下才會更新,感覺這像是 vim 的 bug,可是又沒人去修。 而我現在用的 neovim 則處理了這個問題,只要一離開插入模式,列編輯的結果馬上出現,感覺舒爽多了。 所以我就跑去用 neovim 了。(雖然主要原因是內建 terminal,以及專案的目標感覺很有趣,架構應該會比 vim 好)
離題了,除了 I 之外, A 可以插入文字到區塊選取文字的後面,而 c 則可以刪掉區塊並做編輯。 另外就是前面提到, o 和 O 加數字前綴會有點不同,就是指列編輯。 當 o 或 O 加數字前綴插入空白行後,可以發現其實 vim 只插了一行,而輸入文字後離開插入模式,可以發現 vim 插入的每一行都是剛才輸入的文字。 所以只想插入空白行,比如插入兩行空白行,請用 2o ESC 。