post

Vim zh-tw:模式

Contents

簡介

我們在前一章初次遇見了模式,現在來探討模式的概念以及處於這些模式下可以做些甚麼。

模式種類

Vim 有三種基本模式 – 常態、插入和反白(標示)模式。

  • 常態模式下你可以輸入命令,這是進入 Vim 後的預設模式。
  • 插入模式中可以插入,也就是輸入文字。
  • 反白模式裡則是可以讓你選擇一堆文字,然後在這部份的文字上執行指令或是作處理。

常態模式

預設情況下你都是會待在常態模式,來看可以在這模式裡做什麼事。

輸入 :echo "hello world" 後按 enter,應該會看到鼎鼎大名的 hello world 的回應。你剛剛其實是執行了 Vim 的 :echo 命令,這個命令會把你輸入的文字立即輸出在螢幕上。

輸入 /hello 然後按 enter,Vim 會搜尋這個字串然後跳到第一個符合的地方。

這只是常態模式下可用命令的其中兩個簡單的例子,之後的章節會看到更多類似的指令。

該怎麼利用使用手冊

學會怎麼用 :help 這個命令和了解常態模式一樣重要,從使用手冊裡可以學到許多 Vim 的命令。

你不需要記住所有的 Vim 指令,知道哪裡可以找到合用的命令簡單多了。例如 :help usr_toc 就是參考手冊的目錄。也可以在 :help index 搜尋你感興趣的主題,例如執行 /insert mode 以參考插入模式的相關資訊。

如果一開始這兩個說明主題記不起來,就按 F1 或者執行 :help

插入模式

進入 Vim 是在常態模式,我們已經知道用 i 來切換到插入模式。從常態模式進入插入模式也有其他方式:

  • 執行 :e dapping.txt
  • i
  • 如實輸入以下的段落,不要理會錯字,之後會更正:

means being determined about being determined and being passionate about being passionate

  • <Esc> 鍵回到常態模式。
  • 執行 :w

糟糕,看來我們句子一開始少打了一個字,不過游標現在在行尾,怎麼辦?

回到行首並插入少打單字的最有效率的方法是什麼?需要用滑鼠把游標移到行首嗎?還是要用方向鍵一路按到行首?或者是按 home 鍵再按 i 切換到插入模式?

結果證明最有效率的方式是按 I (大寫的 i):

  • I
  • 輸入 Dappin
  • <Esc> 回到常態模式。

我們用了不一樣的鍵切換到插入模式,特別的地方是游標移到行首後會直接進入插入模式。

你一打完字就要切回常態模式,相當重要。把這變成一種習慣對你大有助益,因為在你初期的寫作階段結束後,絕大部份的時間會花在常態模式,就是最重要的改寫、編輯和潤飾發生的時機。

現在針對 i 指令做一些變化。按 i 進入插入模式,游標會停在目前位置之前。游標要停在目前位置之後(’a’fter)的話要按 a

  • a
  • 輸入 g (完成 “Dapping” 這個字)
  • <Esc> 回常態模式

正如同 iI 的關係,aA 之間也有關係,如果要在行尾添加文字的話就按 A

  • A
  • 輸入 . (有句點就是完整的句子)
  • <Esc> 回常態模式

總結一下我們到目前為止學的四個按鍵:

命令 動作
i 在游標之前插入文字
I 在行首插入文字
a 在游標之後添加文字
A 在行尾添加文字

注意到大寫的命令是小寫命令’大一點’的版本。

我們已經能在目前的這一行上十分熟練地快速移動游標了,來看看怎麼移到新的一行。如果你想要開(’o’pen)新的一行來輸入文字,按 o

  • o
  • 輸入 I'm a rapper.
  • <Esc> 回常態模式。

嗯,如果我們寫的句子在獨立的一個段落會好看許多。

  • O (大寫的 ‘O’)
  • <Esc> 回常態模式。

總結一下我們剛學會的兩個按鍵:

命令 動作
o 在所在行的下一行開新的一行
O 在所在行的上一行開新的一行

大寫和小寫的 ‘o’ 是在相反的方向開新的一行。

剛剛打的字還有什麼不對的地方嗎?阿,應該是 ‘dapper’,不是 ‘rapper’!只要改一個字元,有什麼快的方法嗎?

我們可以i 進入插入模式,再按 <Del> 鍵刪掉 r,輸入 d 然後按 <Esc> 回常態模式。這麼簡單的更改竟然要四個步驟!有比較好的方法嗎?你可以用 s 鍵,取代(’s’ubstitute)的意思。

  • 把游標移到 r 的地方,可以按 b 回到(’b’ack)字首。
  • s
  • 輸入 d
  • <Esc> 回常態模式

嗯,好吧,就現在來說的確是沒有省很多時間,不過想像一下整天一直重複這種過程的情況!能愈快處理掉這種一般的操作對我們來說愈有幫助,因為這有益於我們專注在更富有創造力而有趣的部份。就像 Linus Torvalds 說過的 “不只是做事更快,而是因為是這麼的快而讓你作事的方式都不一樣了。”

s 一樣有比較大的版本,S 會取代整行。

  • S
  • 輸入 Be a sinner.
  • <Esc> 回常態模式。
命令 動作
s 取代目前字元
S 取代所在行

回到最後一個動作… 可以更有效率一點嗎?因為我們只想替換( ‘r’eplace)掉一個字元。可以,用 r 鍵。

  • 把游標移到 sinner 的第一個字元。
  • r
  • 數入 d

這裡我們不用按 <Esc> 就會回到常態模式。

r 也有比較大的版本,R 可以替換連續的字元。

  • 移動游標到 dinner 的 ‘i’。
  • R
  • 輸入 app (現在是 ‘dapper’)
  • <Esc> 回常態模式。
命令 動作
r 替換目前字元
R 替換連續字元

整個句子現在應該看起來像:

Dapping means being determined about being determined and being passionate about being passionate.

Be a dapper.

呼。這個章節涵蓋了好多東西,不過我保證這是最難的一個步驟。只要你學會了,就會知道 Vim 核心的運作方式,其他的功能不過是錦上添花罷了。

再強調一次,了解模式運作的方式和如何在模式間切換是成為 Vimmer 的重要關鍵,所以如果你還沒消化上面的例子,可以隨時重讀一遍。慢慢來。

如果想看這些指令更具體的細節,可以參考 :help inserting:help replacing

反白(標示)模式

假設你想選一段文字然後把這些文字全都替換掉,你會怎麼做?

一種方式是在那段文字的一開始按下滑鼠左鍵,按著不要放,拖到尾巴之後放開手指。這種方式看起來還滿糟糕的。

也可以用 <Del> 或是 <Backspace> 把字都刪掉,不過這更沒效率。

最快的方法是把游標移到最前面,按 v 進入反白模式後,用方向鍵或是其他移動游標的指令把游標移到最後面,例如按 5e 會從所在位置往後移到第五個字的尾巴,再按 c 把字改(’c’hange)掉。變得非常有效率。

在這個操作結束後(c 指令),你會停留在插入模式,所以得按 <Esc> 回到常態模式。

v 指令是以字元為基礎,要以行為單位的話就按大寫的 V

總結

下面這張圖是不同模式間的關係:


               +---------+  i,I,a,A,o,O,r,R,s,S  +----------+
               | Normal  +---------->------------+ Insert   |
               | mode    |                       | mode     |
               |         +----------<------------+          |
               +-+---+---+        <Esc>          +----------+
                 |   |
                 |   |
                 |   |
                 |   |
                 |   |
           v,V   V   ^  <Esc>
                 |   |
                 |   |
                 |   |
                 |   |
             +---+---+----+
             | Visual     |
             | mode       |
             +------------+

(這張圖是用Dr.Chip’s DrawIt 外掛 和 Vim 畫的)

參考 :help vim-modes-intro:help mode-switching ,有對不同模式以及在模式間切換的詳細介紹。

如果你還是懷疑模式的概念是 Vim 簡單卻強大的來源,可以讀一下這兩篇文章,“Why Vi”the vi input model,裡頭有探討為什麼這種編輯方式比較好的原因。