vi 命令 用法

edagarli發表於2014-03-14
一、Unix編輯器概述
      編輯器是使用計算機的重要工具之一,在各種作業系統中,編輯器都是必不可少的部件。Unix及其相似的ix 作業系統系列中,為方便各種使用者在各個不同的環境中使用,提供了一系列的ex編輯器,包括 ex, edit,ed  vi.其中ex,edit,ed都是行編輯器,現在已很少有人使用,Unix提供他們的原因是考慮到滿足各種使用者特別是某些終端使用者的需要。值得慶幸的是,Unix提供了全螢幕的Vi編輯器,這使我們的工作輕鬆不少。不少DOS使用者抱怨Vi編輯器不象 DOS下的編輯器如edit那麼好用,這是因為Vi考慮到各種使用者的需要,沒有使用某些通用的編輯鍵(在各個不同的終端機上他們的定義是不同的,在某些終端機上甚至沒有這些鍵)。而是採用狀態切換的方法,但這只是習慣的問題,一旦你熟練的使用上了vi你就會覺得它其實也很好用。
      雖然 Vi採用了狀態切換的方法,但電腦的硬體及作業系統多種多樣,某些電腦的鍵盤上沒有特定的幾個功能鍵!那麼不就有某些功能不能用了?這個問題在 Unix 系統上也一樣,幾乎各大電腦廠商都有自己的 Unix 系統,而 vi 的操作方法也會隨之有點出入。這裡我們採用 PC 的鍵盤來說明 vi 的操作,但在具體的環境中還要參考相應的資料,這一點是值得注意的。

二、Vi入門

(一)、進入vi 
      在系統提示字元($#)下敲入vi <檔案名稱>,vi 可以自動幫你載入所要編輯的檔案或是開啟一個新檔案(如果該檔案不存在或缺少檔名)。進入 vi 後螢幕左方會出現波浪符號,凡是列首有該符號就代表此列目前是空的。

(二)、兩種模式
       如上所述,vi存在兩種模式:指令模式和輸入模式。在指令模式下輸入的按鍵將做為指令來處理:如輸入 avi即認為是在當前位置插入字元。而在輸入模式下,vi則把輸入的按鍵當作插入的字元來處理。指令模式切換到輸入模式只需鍵入相應的輸入命令即可(如a,A),而要從輸入模式切換到指令模式,則需在輸入模式下鍵入ESC鍵,如果不曉得現在是處於什麼模式,可以多按幾次[ESC],系統如發出嗶嗶聲就表示已處於指令模式下了。
付:在指令模式進入輸入模式的指令:
新增 (append) 
:從游標所在位置後面開始新增資料,游標後的資料隨新增資料向後移動。
A從游標所在列最後面的地方開始新增資料。

插入 (insert) 
i從游標所在位置前面開始插入資料,游標後的資料隨新增資料向後移動。
:從游標所在列的第一個非空白字元前面開始插入資料。

開始 (open) 
:在游標所在列下新增一列並進入輸入模式。
O: 在游標所在列上方新增一列並進入輸入模式。

(三)、退出vi
      在指令模式下鍵入:q,:q!,:wq:x(注意:號),就會退出vi。其中:wq:x是存檔退出,而:q是直接退出,如果檔案已有新的變化,vi會提示你儲存檔案而:q命令也會失效,這時你可以用:w命令儲存檔案後再用:q 退出,或用:wq:x命令退出,如果你不想儲存改變後的檔案,你就需要用:q!命令,這個命令將不儲存檔案而直接退出vi


(四)、基本編輯

       配合一般鍵盤上的功能鍵,像是方向鍵、[Insert] [Delete] 等等,現在你應該已經可以利用 vi 來編輯檔案了。當然 vi 還提供其他許許多多功能讓文字的處理更為方便。
      何謂編輯?一般認為是文字的新增、修改以及刪除,甚至包括文字區塊的搬移、複製等等。先這裡介紹 vi 的如何做刪除與修改。(注意:在 vi 的原始觀念裡,輸入跟編輯是兩碼子事。編輯是在指令模式下操作的,先利用指令移動游標來定位要進行編輯的地方,然後才下指令做編輯。)

刪除與修改檔案的命令:
x刪除游標所在字元。
dd :刪除游標所在的列。
:修改游標所在字元,後接著要修正的字元。
R進入取替換狀態,新增文字會覆蓋原先文字,直到按 [ESC] 回到指令模式下為止。
s刪除游標所在字元,並進入輸入模式。
S刪除游標所在的列,並進入輸入模式。

      其實呢,在PC上根本沒有這麼麻煩!輸入跟編輯都可以在輸入模式下完成。例如要刪除字元,直接按 [Delete] 不就得了。而插入狀態與取代狀態可以直接用 [Insert] 切換,犯不著用什麼指令模式的編輯指令。不過就如前面所提到的,這些指令幾乎是每臺終端機都能用,而不是僅僅在 PC 上。在指令模式下移動游標的基本指令是 h, j, k, l 。想來各位現在也應該能猜到只要直接用 PC 的方向鍵就可以了,而且無論在指令模式或輸入模式下都可以。多容易不是。當然 PC 鍵盤也有不足之處。有個很好用的指令 u 可以恢復被刪除的文字,而 U 指令則可以恢復游標所在列的所有改變。這與某些電腦上的 [Undo] 按鍵功能相同。

三、附件:vi詳細指令表

進入vi的命令
vi filename: 開啟或新建檔案,並將游標置於第一行首 
vi +n filename: 
開啟檔案,並將游標置於第n行首 
vi + filename: 
開啟檔案,並將游標置於最後一行首 
vi +/pattern filename: 
開啟檔案,並將游標置於第一個與pattern匹配的串處 
vi -r filename: 
在上次正用vi編輯時發生系統崩潰,恢復filename 
vi filename....filename: 
開啟多個檔案,依次進行編輯 

移動游標類命令
h: 
游標左移一個字元 
l: 
游標右移一個字元 
space: 
游標右移一個字元 
Backspace: 
游標左移一個字元 
k
Ctrl+p: 游標上移一行 
j
Ctrl+n: 游標下移一行 
Enter: 
游標下移一行 
w
W : 游標右移一個字至字首 
b
B : 游標左移一個字至字首 
e
E : 游標右移一個字至字尾 
): 
游標移至句尾 
 (: 
游標移至句首 
}: 
游標移至段落開頭 
{: 
游標移至段落結尾 
nG: 
游標移至第n行首 
n+: 
游標下移n 
n-: 
游標上移n 
n$: 
游標移至第n行尾 
H: 
游標移至螢幕頂行 
M: 
游標移至螢幕中間行 
L: 
游標移至螢幕最後行 
0: 
游標移至當前行首 
$: 
游標移至當前行尾 

螢幕翻滾類命令
Ctrl+u: 
向檔案首翻半屏 
Ctrl+d: 
向檔案尾翻半屏 
Ctrl+f: 
向檔案尾翻一屏 
Ctrl
b: 向檔案首翻一屏 
nz: 
將第n行滾至螢幕頂部,不指定n時將當前行滾至螢幕頂部。 

插入文字類命令
i: 
在游標前 
I: 
在當前行首 
a: 
游標後 
A: 
在當前行尾 
o: 
在當前行之下新開一行 
O: 
在當前行之上新開一行 
r: 
替換當前字元 
R: 
替換當前字元及其後的字元,直至按ESC 
s: 
從當前游標位置處開始,以輸入的文字替代指定數目的字元 
S: 
刪除指定數目的行,並以所輸入文字代替之 
ncw
nCW: 修改指定數目的字 
nCC: 
修改指定數目的行 

刪除命令
ndwndW: 刪除游標處開始及其後的n-1個字 
do: 
刪至行首 
d$: 
刪至行尾 
ndd: 
刪除當前行及其後n-1 
x
X: 刪除一個字元,x刪除游標後的,而X刪除游標前的 
Ctrl+u: 
刪除輸入方式下所輸入的文字 

搜尋及替換命令
/pattern: 
從游標開始處向檔案尾搜尋pattern
?pattern: 
從游標開始處向檔案首搜尋pattern
n: 
在同一方向重複上一次搜尋命令
N: 
在反方向上重複上一次搜尋命令
:s/p1/p2/g: 
將當前行中所有p1均用p2替代
:n1,n2s/p1/p2/g: 
將第n1n2行中所有p1均用p2替代
:g/p1/s//p2/g: 
將檔案中所有p1均用p2替換


選項設定
all
:列出所有選項設定情況
term
:設定終端型別
ignorance
:在搜尋中忽略大小寫
list
:顯示製表位(ctrl+i)和行尾標誌($)
number
:顯示行號
report
:顯示由面向行的命令修改過的數目
terse
:顯示簡短的警告資訊
warn
:在轉到別的檔案時若沒儲存當前檔案則顯示no write資訊
nomagic
:允許在搜尋模式中,使用前面不帶“/”的特殊字元
nowrapscan
:禁止vi在搜尋到達檔案兩端時,又從另一端開始
mesg
:允許vi顯示其他使用者用write寫到自己終端上的資訊

最後行方式命令
n1,n2 co n3:將n1行到n2行之間的內容拷貝到第n3行下
n1,n2 m n3:將n1行到n2行之間的內容移至到第n3行下
n1,n2 d :將n1行到n2行之間的內容刪除
:儲存當前檔案
e filename:開啟檔案filename進行編輯
x:儲存當前檔案並退出
q:退出vi
q!:不儲存檔案並退出vi
!command:執行shell命令command
n1,n2 w!command:將檔案中n1行至n2行的內容作為command的輸入並執行之,若不指定n1n2,則表示將整個檔案內容作為command的輸入
r!command:將命令command的輸出結果放到當前行
暫存器操作
"?nyy:將當前行及其下n行的內容儲存到暫存器?中,其中?為一個字母,n為一個數字
"?nyw:將當前行及其下n個字儲存到暫存器?中,其中?為一個字母,n為一個數字
"?nyl:將當前行及其下n個字元儲存到暫存器?中,其中?為一個字母,n為一個數字
"?p:取出暫存器?中的內容並將其放到游標位置處。這裡?可以是一個字母,也可以是一個數字
ndd:將當前行及其下共n行文字刪除,並將所刪內容放到1號刪除暫存器中。