shell相关:指令篇 基础篇 脚本欣赏 编程实例 shell问问 shell视频教程 技巧篇 水平测试 E文资料 vi编辑器 高级Bash脚本编程指南
其他:mysql perl c语言
在前面有介紹過一些用來修改文章的指令,如【 x 】、【 s 】、【 p 】和 dd 、 yy 等。在這上一篇文章也有示範過把【 d 】和巡弋指令結合的用法,接下來要說的是關於這部分。
基本
最簡單的指令就是【 x 】和【 X 】。【 x 】是刪除游標上面的字元,相當於 Delete;【 X 】則是刪除左邊的字元,相當於 Backspace。如果前面加上一個正整數 n,則相當於同一個指令按 n 次。
【 s 】會刪除游標所在的字元,然後在被刪除的位置進入 input mode;【 S 】則是刪除游標所在的列,然後則那一列的開頭進入 input mode。如果前面加上一個正整數 n 則代表刪除的動作做 n 次,然後再進入 input mode。
dd 會刪除一整列; yy 則會複製一整列。如果再前面加上一個正整數 n,則代表刪除或複製 n 列。
當你刪除或複製文字以後,文字都會複製一份放在暫存區中。如果你按【 p 】或【 P 】,資料便會放入文章中。
如果你之前輸入 2dd 刪除了兩列文字,那你按【 p 】這兩列文字便會再放入文章中,但是你如果是連按兩次 dd,那你只有第二次被刪除的那一列會回到文章中。所以在指令前面加上正整數 n 並不完全等於同一個指令按 n 遍。
如果你的刪除或複製動作不是以列為單位,那當你按【 p 】或【 P 】時便會在游標的右邊或左邊插入文字。如果是以列為單位,那 vi 便會自動換列,在游標的下一列或上一列插入文字。
【 d 】、【 y 】、【 c 】
【 d 】、【 y 】、和【 c 】都是編輯文章的指令,但是這些指令後面都要再跟一些其他的指令。【 d 】是刪除,【 y 】是複製,【 c 】是修改。
前面也有提到 dd 會刪除一列,yy 複製一列,由此可推想,cc 會刪除一列文字,進入 input mode。
這三個指令後面都可以加上巡弋指令,代表從游標目前的位置動作到巡弋指令移動到的位置。
除了巡弋指令以外,還可以加上移動指令。例如 d3l 表示向右邊刪除三個字元, d8G 表示由目前的位置刪除到第八列,向上刪除或向下刪除則要看你游標的位置決定﹝這可不會發生 wrap ﹞。
暫存區
當你刪除文字的時候,vi 會自動把文字儲存到暫存區中,這些暫存區分別以 1~9 來編號。當你刪除文字時,被刪除的文字便會放到暫存區 1 中,而原來放在暫存區的文字便會存放到下一個暫存區,而 9 號暫存區的文字便會徹底消失。
除了上述的九個暫存區,還有一個暫存區 0。這個暫存區是用來放你最近一次的複製,當你按【 p 】時,vi 會自動在暫存區 0 和暫存區 1 之間選一個放到你的文章中。當然 vi 選的永遠是你最近一次刪除或複製的文字。
要使用暫存區,先按雙引號【 " 】然後再按暫存區的編號,再下指令【 p 】,這樣被指定的暫存區的文字便會印出來。
之前的暫存區是用來儲存被刪除的文字,當你複製一段文字時,並不會被放到這些暫存區中。但是 vi 另外提供了從 a-z 的二十六個暫存區讓我們使用,這些暫存區只要使用者沒有去動它們,裡面的文字就不會被變更。例如下指令 "ay8G 則暫存區 a 便會放入從目前的位置到第八列的文字。
至於 A-Z 所指的暫存區和小寫字母是相同的,當你下指令【 p 】時,大小寫效果完全一樣。當你要把文字放入暫存區時,大寫字母表示把新的文字接到暫存區原有的文字的尾巴。例如先下指令 "a3yy 會複製三列文字到暫存區 a 中,再下指令 "A2dd 會刪除兩列文字,並把被刪除的文字接到暫存區 a 的後面。所以暫存區 a 裡面就應該要有五列文字。
編輯多個檔案
有的時候,你會希望將一個檔案的文字複製到另外一個檔案之中。在 command mode 中,下指令 :vi file 或 :e file, vi 將會開啟檔案 file。
在開啟一個新的檔案之前,vi 會先將舊的檔案關閉。只要你修改過檔案內容而尚未紀錄,vi 會拒絕為你開啟另一個檔案。如果你想要放棄自己所做過的修改,你可以下指令 :vi! file 或 :e! file,這樣 vi 就會放棄你之前的修改,進入另一個檔案。
只要你不離開 vi,不管你在幾個檔案之中切換,暫存區中的資料都不會消失。因此你可以將檔案的文字放到暫存區中,然後切換到另一個檔案,再複製上去。