« 外食記,遠百麻布茶房 人參考 »
Mon 22 Aug 2005
前一次我們已經看過在 vim 下的模式切換以及一些基本的操作。如果你只是想要有 vim 的 undo/redo 以及不怕電腦當機跳電的安全備份功能的話,其實使用 vim 一點也不複雜,因為你真正需要的也不過就是 a i o 加上 :w :q :wq :q! 這些而已。
但是如果你想要更進一步的話,那就需要指令模式了。所以今天我們會談論在指令模式下怎麼作刪除文字,以及一些和刪除命令有關的事情。
在正式談指令模式下的刪除行為之前,我們先稍微講一下指令模式下的游標移動(事實上 vim 的游標移動裡面有很多功能是相當好用的)。
- 上下左右 :
- 一行的最前和最後 :
- 整份文件的最前一行和最後一行 :
- 移動一個 word :
在 windows 下你可以用鍵盤上的上下左右鍵,但是在 un*ix 上或是許多系統上的你要在 vim 移動游標的話可能要透過 h(左)、 j(下)、 k(上)、 l(右)來移動。
移到一行的最前面和最後面在 windows 是可以用 <Home >和 <End> ,但若在 un*ix 不能用這兩個鍵達到你想要的目的時,就得使用 「0」(數字零,不是英文字母 o)到一行的最前面,和用「$」到一行的最後面。
gg : 代表把游標移到整份文件的最前面一行。
G : 代表把游標移到整份文件的最後一行。
w : 這個功能在中文中可能不常用,你要用的話也不是不行,不過它就不像英文那樣會跳一個 word,而是會跳一大串中文字。其實這個只是根據標點符號以及空白鍵來作的區隔,因為中文的詞並不會有空白或是有什麼明顯且固定的區隔,所以這個功能在中文來說,以我自己來說是不太常用的。
約略提了一下游標移動之後,我們就可以來講刪除的動作了。
在 vim 的指令模式裡面,刪除的命令不外乎兩個字母 x 和 d 。
- x 的刪除行為:
- d 的刪除行為:
先來講 x 。 x 代表刪除游標後面的字元。所以根據你的編碼和設定,如果是英文的話 x 所砍的就是一個字母,如果是中文的話, x 所砍的就是一個中文字。如果你還記得 vim 的設計想法,你大概可以馬上知道大寫 X 代表什麼意思?沒錯,就是往前砍。
一般來說 x 的刪除行為都是指單一的,像是一個字元或是指定刪除的個數。比方說你可以打 3x ,那它就是往後砍三個字元。
x 和 d 不同的地方是,d 通常泛指不定範圍長度的刪除。但是如果是在選取模式的話,則二者幾無分別,因為對 x 來說,在你選取的時候事實上是已經指定刪除的個數,而對 d 而言,選取的部分也算是不定範圍,所以當你選取一段想要刪除的範圍時(選取的區域會反白),你就可以按下 x 或是 d 都可以把反白的區域刪除掉。
前面提過 d 通常泛指不定範圍長度的刪除,比方說我們想要刪除一行,那就是用「 dd 」,套剛剛在 x 的想法,假如想往後砍三行很直覺就會想到是「 3dd 」。
那如果想包括這行砍到檔案的結尾或是開頭呢?那剛剛的游標移動就有用了:「 dgg 」就是往前砍到檔案開頭,「 dG 」就是往後砍到檔案結尾。
聰明的你可能也會想到如果是想從游標位置砍到這行的開頭和結尾就分別是「 d0 」和「 d$ 」。不過我通常不會用「 d$ 」這個指令,而是用「 D 」來表示。這個 D 就有點和之前講的 vim 設計想法中的另外一類—指大範圍的想法—的相通,雖然可能多多少少有點不太一樣,不過在這裡我們只要會用就可以了。
其實對於一般的刪除行為來說,上面這些已經差不多夠用了。但是對於使用者來說,像我,我根本不會去計算從現在這個位置砍到我想要停的位置中間經過多少行或是多少個字元。那這個時候怎麼辦呢?
還記得我們的選取模式嗎?假如你想要砍的單位是用行計算的話,就是用大寫「 V 」,如果你不確定的話,可以按小寫「 v 」來選。在選取的時候,那些游標移動的指令是完全可以使用的,所以你可以用 0、$、gg、G、w 來作游標控制。一旦你確定好範圍之後,一個 d 或是 x 就可以把剛剛那些選出來的反白區域清除掉。
如果你是寫程式的人,這裡可以提供一個小技巧: vim 裡面有提供一個「%」的游標移動方式。這個功能會選擇這些符號「 { [ ( 」的配對組合,也就是說當你在這些符號上面,比方說是「 { 」這個符號上按「 % 」游標會從「 { 」跳到它所對應「 } 」 ,反之亦然。
8 Responses to “不是打 vi 的廣告, vim 指令模式下的刪除行為”
Leave a Reply
« 外食記,遠百麻布茶房 人參考 »
August 22nd, 2005 at 7:05 pm
怎麼好像有某篇文章消失了? XD
August 22nd, 2005 at 11:43 pm
有嗎? vim 應該目前是只有三篇… 如果有什麼文章消失還麻煩告知一下。其他非 vim 介紹的文章應該比較有可能會消失,因為最近想整理一下人參的功用,覺得人參所謂大補氣一說實在有點懷疑,所以文章可能會到處散,如果有發生消失狀況可能就是在改來改去的時候不小心弄錯了。
August 23rd, 2005 at 2:16 am
阿咧~!!真的有文章消失了,我現在把一些文章補回來,希望下次不會發生了。不過… 我不確定到底為什麼會這樣。
August 24th, 2005 at 7:48 am
[…] 在我們之前講了模式選擇,和一般編輯和刪除的方式,這些可以算是最基本的 vim 操作。但是對於一份龐大的文件來說,我們經常只是想要修改其中的一小部分而已,這個時候我們就會需要 search (搜尋)的功能,來幫我們在龐大的文件找到我們想要的那一小部分。 […]
August 28th, 2005 at 11:56 pm
[…] 在vim裡面除了我們在講刪除時所講的那些以外,事實上還有很多都是跟游標移動有關的指令。不過今天我們講的內容和 ctags 這個小傢伙比較有關。 簡單地說, ctags 主要是用來幫助程式寫作用的。怎麼說呢?如果你現在正在接手一套大程式,但事實上你需要維護的只是這大程式裡的某一條執行程序,你當然不會想說我要把這整個程式都看懂才要來做維護的工作,等到你看懂可能公司也準備請你走路了。所以這個時候 ctags 就可能幫上你的忙。它會把程式中函數(function)以及變數(variable)的定義區紀錄下來。比方說你現在看到目前在追的執行程序中呼叫了一個 line_extraction_algo(…) ,如果你想知道這個函數在幹什麼你會怎麼做?以前也許你就會用 grep 或是搜尋字串的方式看看這個東西在哪個檔案裡面,說不定還要一個個看到底哪個才是定義的地方。現在在 windows 或是一些整合性環境(IDE)大概都會提供在上面按兩下之後就會跳到函數或是變數的宣告區裡面。但是現有的IDE環境大概都沒有提供像 vim 那樣有很多好用的功能,這些等我們講到取代的時候大家就會逐漸發現 vim 的好。 […]
September 10th, 2005 at 11:51 am
[…] 在談命令模式下的刪除行為時,我們提到可以選擇要刪除的區域。如果你使用的是小寫「v」,那配合 vim 的游標移動,你可以作更複雜的選取方式。甚至你可以進入選取模式後使用「 / 」和「n」的組合更快速選到你想到的區域去。 […]
September 27th, 2005 at 9:48 pm
October 5th, 2005 at 10:41 pm