重複上一個編輯指令

在 vi 中編輯,有時候你會做同一個編輯的動作好幾次。 這個時候你便可以按【 . 】來重複上一個編輯動作。 編輯動作就是會改變文章內容的動作﹝不包括【 u 】﹞。 其他移動或搜尋指令並沒有包含在內﹝雖然沒有改變文章內容, 但是複製也是編輯動作﹞。

下面舉幾個例子:

如果你發現自己的文章把「在」弄錯,打成了「再」, 那你就必須檢查整篇文章的「再」,把錯誤的「再」改成「在」。 這個時候你可以先按【 / 】,輸入「再」,vi 便會自動尋找「再」這個字。 當你發現如果第一個被搜尋到的「再」是正確的, 你就按【 n 】搜尋下一個「再」字一直到找到你要修改的字。 當你找到你要修改的「再」以後, 你可以下指令 r在 便會將「再」修改成「在」 ﹝【 r 】(replace) 會修改目前游標上的字,但不會進入 input mode。 而且只會讀入一個字,當你在前面輸入一個正整數 n 時, vi 便會將游標後 n 個字改成你接在【 r 】後的那個字。﹞。 之後當你繼續用【 n 】找到要修改的「再」字, 只要按【 . 】就會把「再」改成「在」了。 因為【 n 】並不是編輯動作,所以你每次按【 . 】, vi 都等於是在重複 r在 這個指令﹝前提是你沒再下其他編輯指令﹞。

【 i 】、【 a 】及【 o 】也是一種編輯動作,你可能用【 i 】進入 input mode , 輸入文字之後按【 Esc 】回到 command mode,發現你想重複之前的輸入, 這時你也可以按【 . 】來重複之前的輸入。 例如 iabcd【 Esc 】 就是插入 abcd 四個字元, 那麼按【 . 】就會再插入 abcd 四個字元。 甚至你也可以在前面加一個正整數 n, 這就等於上一個指令前面加上一個正整數 n。 所以你輸入的文字便會輸出 n 次﹝就和在【 i 】前面加上正整數一樣的效果﹞。

如果你上一個編輯指令前面有加上一個正整數, 那你按【 . 】時這個正整數會被計算進去,但是你要是在【 . 】前面也加上個正整數, 那上一個指令的正整數就會被忽視。 例如你下指令 "a2yy表示複製兩行文字到暫存區 a 中, 如果你接著下指令 4. 就等於下指令 "a4yy。 接著你馬上在按【 . 】也還是等於下指令 "a4yy, 因為這正是你的上一個編輯動作。

最後,還有一件重要的事情,那就是中文。 Vi 的版本有好幾種,對中文的支援也不盡相同。 以中央數學現在﹝2002 年夏季﹞linux 所用的 vi 來說, 不僅可以顯示中文,也「認得」中文字,一個中文字當一個字元。 而之前的版本﹝不詳﹞雖然也會顯示中文,但是卻是一個中文字當兩個字元。

當一個中文字被當成兩個字元時,上面介紹的指令【 r 】就會出問題。 假設你照上面的第一個例子下指令, 那你會發現修改之後會出現亂碼,這是因為 vi 不「認得」中文字的結果。 所以碰到這種情況,你應該用 2s在【 Esc 】這個指令而不該用 r在

除了【 r 】以外,也有其他編輯指令會受到中文的影響,例如【 x 】, 要刪除一個中文字你就得按兩次【 x 】,光按一次【 x 】只能殺掉一半, 有時甚至會造成亂碼。 移動指令也會受到影響,【 l 】和【 h 】都要多按一次才能經過一個中文字。

任何版本的 vi 都無法讓【 w 】這類的指令在中文正常移動, 而巡弋指令如【 f 】也無法在中文運作﹝但是【 / 】沒問題﹞。 所以讀者在編輯中文時就不要用到這些指令。 不管是哪個版本的 vi,在編輯中文時多多少少會有問題, 像是中央數學目前 linux 的 vi,雖然認得中文字, 但是【 Backspace 】碰到中文就是會出錯‧‧‧

[ 前一節 ]‧[ 後一節 ]‧[ 回目錄 ]


製作人、
修改記錄
李易霖 (02/8/15) ---