About
Swaroop C H is 29 years of age. He is a coder and startupper. He has previously worked at Yahoo!, Adobe, his own startup and Infibeam.
Views
Support
Personal tools
COLLECTION
Collection
Vim zh-tw:模式
From Notes
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> 回常態模式
正如同 i 和 I 的關係,a 和 A 之間也有關係,如果要在行尾添加文字的話就按 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,裡頭有探討為什麼這種編輯方式比較好的原因。
Please add your comments by clicking on the 'Discussion' link in the left sidebar.