3. 基本編輯指令

這個單元就開始進入主題了。下編輯指令都是在常態模式,就是您一進入 Vim 時的模式,只能下指令,不能鍵入文字。如果印象模糊,請瞄一下第一個單元的內容。這個單元說的是基本的編輯指令,有些比較特殊的編輯指令,因為太有個性了,所以會獨立成一個單元來說明。


3.1 五種額外模式(additional mode)

這裡要對基本模式(請參考第 1.4 節,頁 [*])外的五種額外模式做介紹,以下的章節會有機會碰上。為什麼會有這麼多模式?這樣豈不是很易就搞混?其實一般編輯不必太在意一些模式,您只要在各種模式下親自去操作幾次就會知道這些模式的作用,不必特意去記憶他,這些模式和基本模式都有連帶關係的。

3.1.1 操作等待模式(operator-pending mode)

這其實和一般的常態模式一樣,只不過是指在常態模式下了某些編輯指令,等待其他動作的狀態。


3.1.2 取代模式(replace mode)

指下 R 指令時所處的狀態。請參考第 3.4 節,頁 [*]。在狀態列會有 - REPLACE - 字樣。

3.1.3 插入常態模式(insert normal mode)

這是一個很特殊的模式,在插入模式時,進入輸入狀態,但按 Ctrl+O 就會進入插入常態模式,和常態模式一樣,只不過執行完所下的指令後又會馬上返回原來的插入模式繼續輸入文字。狀態列會有 - (insert) - 字樣,是小寫有小號的。

3.1.4 插入反白模式(insert visual mode)

這和插入常態模式一樣,只不過在按 Ctrl+O 後所執行的是反白的 Ctrl+VVv 而進入反白模式,等反白模式結束又會返回原來的插入模式。狀態列會有 - (insert) VISUAL - 字樣。

3.1.5 插入選擇模式(insert select mode)

這和插入反白模式一樣,只不過進入的是選擇模式,而非反白模式。狀態列會有 - (insert) SELECT - 字樣。


3.2 進入插入模式的指令

i 在游標所在字元前開始輸入文字(insert)。
a 在游標所在字元後開始輸入文字(append)。
o 在游標所在行下開一新行來輸入文字(open)。
I 在行首開始輸入文字。此之行首指第一個非空白字元處,要從真正的第一個字元處開始輸人文字,可使用 0i 或 gI(Vim 才有)。
A 在行尾開始輸入文字。這個好用,您不必管游標在此行的什麼地方,只要按 A 就會在行尾等著您輸入文字。
O 在游標所在行上開一新行來輸入文字。
J 將下一行整行接至本行(Joint)。

並無相對的 split 功能,可在插入模式下按 Enter 來達成,當然如果您熟 macro 的話,可自行定義。使用 J 時,預設會消去本行的 EOL(End Of Line) 字元,且上下行接縫間會留下一個空白字元,這符合英文習慣,卻對中文會造成困擾,欲不留空白字元,可使用 gJ(大寫 J) 指令,但這是 Vim 的擴充功能,elvis 不適用。要和中文相容,可參考底下會說明的重排功能的 Vim script。 請您隨便找一個檔案來試看看,光看文字說明太抽象了。


3.3 刪除指令

x 刪除游標所在處之字元,在中文指一個中文字。在 Vim 及 elvis 亦可用 Del 鍵。
X 刪除游標前之字元。不可使用 Backspace 鍵,除非是在插入模式。Vim 可以正確使用以上兩個指令於中文,會刪去一個中文字。elvis 則不行,一個中文字要刪兩次,即使用 xx。
dd 刪除一整行(delete line)。
dw 刪除一個字(delete word)。不能適用於中文。
dG 刪至檔尾。
d1G 刪至檔首。或 dgg(只能用於 Vim)。
D 刪至行尾,或 d$(含游標所在處字元)。
d0 刪至行首,或 d^(不含游標所在處字元)。請回憶一下 $ 及 ^ 所代表的意義,您就可以理解 d$ 及 d^ 的動作,這就是 vi(m) 可愛之處。


3.4 取代及還原

r 取代游標所在處之字元。
R 進入取代模式(replace mode),取代字元至按 Esc 為止。
cc 取代整行內容。或大寫 S 亦可。
cw 替換一個英文字(word),中文不適用。(change)
~ 游標所在處字元之大小寫互換。當然不能用於中文。別忘了 Shift
C 取代至行尾,即游標所在處以後的字都會被替換。或 c$。
c0 取代至行首,或 c^。
s 替換一個字元為您所輸入的字串。和 R 不同,R 是覆蓋式的取代,s 則是插入式的取代,您可親自實驗看看。ㄟ!是小寫的 s。
u 這個太重要了,就是 undo,傳統的 vi 僅支援一次 undo,Vim 及 elvis 就不只了,Vim 幾乎是沒有限制的。
U 在游標沒離開本行之前,回復所有編輯動作。
Crtl+r 這個也是很重要,就是 redo 鍵。

Vim 很有個性的,您在常態模式按了 r 她就會停在那裡等主人鍵入所要替代的字元,希望您這個當主人的,不要傻呼呼的也楞在那裡,趕快鍵入您的新字元吧!:-) Vim 中可用於中文字,也就是可以替換一個中文字,elvis 則不行。當然您的 Vim 是要設在 big5/cp950 的才行。怎麼樣!有沒有看過如此有個性的取代方式?ㄚ!r 就是 replace 啦!


3.5 加上數目字

喔!騷到 Vim 的癢處了,這是 Vim 一個非常騷包的功能,只此一家別無分號(當然同源的 ed,sed 等不在此限)。就是您可以在大部份的指令前加上數目字,代表要處理幾次的意思。以下用實例來說明比較清楚。

5dd 刪除游標所在處(含)起算以下五行內容。妙吧!
3r 按了 3r 後,您鍵入一個英文字,則三個字元皆會被您所鍵入的英文取代。只要 locale 設定正確,中文也通喔!
5J 將五行合併成一行。
3x 刪除三個字元。中文也通。
5i A 然後按 Ecs,插入五個 A。中文也可以!
2i sys Esc 插入 syssys。中文也可以!
5G 游標移至第五行,是從檔首開始起算。和 :5 作用相同。
5l 移至右第五個字元處,當然 j 是可以用方向鍵取代的。

所有移動指令(參考第 2 章,頁 [*])都可以加上數目字來控制,中文也通喔!其它的指令和數目字結合,就留待各位去發掘吧!最重要的是請您親自操作看看,使用 Vim 常常要動動腦筋,會有更妙的操作方式,想一次可以用很久喔!有人說,學電腦的人,動腦筋就是為了偷懶。:-)


3.6 簡單重排功能

» 整行向右移一個 shiftwidth(預設是 8 個字元,可重設)。
« 整行向左移一個 shiftwidth(預設是 8 個字元,可重設)。:set shiftwidth? 可得知目前的設定值。:set shiftwidth=4 可馬上重設為 4 個字元。shiftwidth 可簡寫成 sw。ㄟ,別忘了 Shift 鍵!
:ce(nter) 本行文字置中。注意是冒號命令!
:ri(ght) 本行文字靠右。
:le(ft) 本行文字靠左。所謂置中、靠左右,是參考 textwidth(tw) 的設定。如果 tw 沒有設定,預設是80,就是以 80 個字元為總寬度為標準來置放。當然您也可以如 sw 一樣馬上重設。
gqap 整段重排,或 gqip,在段落中位何地方都可以使用。和中文的配合見下述。
gqq 本行重排。
gqG 全文重排,是以游標所在處的段落開始重排至檔尾。以空白行為段落的間隔。

重排的依據也是 textwidth。這裡的重排是指您鍵入文字時沒有按 Enter 鍵,就一直在 keyin,這樣會形成一個很長的一行(雖然螢幕上會替您做假性折行),重排後,則會在每一行最後加入 EOL。gq 重排功能是 Vim 才有的功能。

如果是利用 visual mode 所標記起來的部份,只要按 gq 就會只重排被標記的部份。請參考第七章的標示指令一節。

基本上 gq 就是一個獨立的重排指令,就像 d 或 y 是獨立的刪除、複製的指令一樣,所以,當然是可以加上數目字加以控制,或和其他指一起用的,例如:

gq3q => 重排三行
gq2ap => 重排兩個段落
gq5j => 重排游標以下五行(別忘了 j 是向下移動,5j 就是向下移動五行,包括游標所在處就是六行)
gq} => well,這是什麼哇?
gq) => 這又是啥麼哇?請複習一下第 2 章的第 2.3 特殊移動一節。並親自做一下實驗看看。在中文文稿,通常就是一個段落。

重排的功能本不是編輯器的主要功能,而是文書排版軟體的工作,但簡單的重排也是很方便,對於中文而言,處理上得多花些工夫,對於希望有中文重排功能的朋友,可下載 Vim script 來使用:

http://info.sayya.org/~edt1023/vim/format.vim

這是修改自日本朋友的貢獻。把他置於 $VIMRUNTIME/plugin 目錄下,重新開啟 vim 就會生效,對於 J 及 gqap 都會考慮中文的細節。當然,Vim 只是個文字編輯器,如果要做進一步的排版,需要由 office 類的文書處理軟體,或更進一步的專業 TeX/LaTeX/texinfo/troff/groff 排版軟體來處理。

Compiled by Edward G.J. Lee (2003-03-03)