linux vi命令詳解:屏幕文本編輯器Vi

linux vi命令詳解:屏幕文本編輯器Vi
本章將詳細介紹linux vi命令。文本編輯器是所有計算機系統中最常使
用的一種工具。用戶在使用計算機的時候,往往需要建立自己的文件,無
論是一般的文本文件、數據文件,還是編寫的源程序文件,這些工作都離
不開linux vi命令。
Linux系統提供了一個完整的編輯器家族系列,如Ed、Ex、Vi和
Emacs等,按功能它們可以分爲兩大類:行編輯器(Ed、Ex)和全屏幕編
輯器(Vi、Emacs)。行編輯器每次只能對一行進行操作,使用起來很不
方便。而全屏幕編輯器可以對整個屏幕進行編輯,用戶編輯的文件直接顯
示在屏幕上,修改的結果可以立即看出來,克服了行編輯的那種不直觀的
操作方式,便於用戶學習和使用,具有強大的功能。
linux vi命令是Linux系統的第一個全屏幕交互式編輯程序,它從誕生
至今一直得到廣大用戶的青睞,歷經數十年仍然是人們主要使用的文本編
輯工具,足見其生命力之強,而強大的生命力是其強大的功能帶來的。
本章中,我們將循序漸進地介紹如何使用linux vi命令來建立、編輯、
顯示以及處理文件。(注:文中的大寫字母爲[shift]鍵+相應的小寫字
母的組合)
linux vi命令簡介
linux vi命令是“Visual interface”的簡稱,它在Linux上的地位就彷彿
Edit程序在DOS上一樣。它可以執行輸出、刪除、查找、替換、塊操作等
衆多文本操作,而且用戶可以根據自己的需要對其進行定製,這是其他編
輯程序所沒有的。
linux vi命令不是一個排版程序,它不象Word或WPS那樣可以對字
體、格式、段落等其他屬性進行編排,它只是一個文本編輯程序。linux vi命令沒有菜單,只有命令,且命令繁多。Vi有三種基本工作模
式:命令行模式、文本輸入模式和末行模式。
命令行模式
任何時候,不管用戶處於何種模式,只要按一下鍵,即可使linux vi命
令行模式;我們在shell環境(提示符爲$)下輸入啓動linux vi命令,進入
編輯器時,也是處於該模式下。
在該模式下,用戶可以輸入各種合法的linux vi命令,用於管理自己的
文檔。此時從鍵盤上輸入的任何字符都被當做編輯命令來解釋,若輸入的
字符是合法的linux vi命令,則linux vi命令在接受用戶命令之後完成相應
的動作。但需注意的是,所輸入的命令並不在屏幕上顯示出來。若輸入的
字符不是Vi的合法命令,Vi會響鈴報警。
文本輸入模式
在命令模式下輸入插入命令i、附加命令a 、打開命令o、修改命令c、
取代命令r或替換命令s都可以進入文本輸入模式。在該模式下,用戶輸入
的任何字符都被Vi當做文件內容保存起來,並將其顯示在屏幕上。在文本
輸入過程中,若想回到命令模式下,按鍵即可。
末行模式
末行模式也稱ex轉義模式。
linux vi命令和Ex編輯器的功能是相同的,二者主要區別是用戶界
面。在Vi中,命令通常是單個鍵,例如i、a、o等;而在Ex中,命令是以
按回車鍵結束的正文行。linux vi命令有一個專門的“轉義”命令,可訪問很
多面向行的Ex命令。在命令模式下,用戶按“:”鍵即可進入末行模式下,
此時linux vi命令會在顯示窗口的最後一行(通常也是屏幕的最後一行)顯
示一個“:”作爲末行模式的提示符,等待用戶輸入命令。多數文件管理命令都是在此模式下執行的(如把編輯緩衝區的內容寫到文件中等)。末行命
令執行完後,linux vi命令自動回到命令模式。例如:
:1,$s / A / a / g
則從文件第一行至文件尾將大寫A全部替換成小寫a。
若在末行模式下輸入命令過程中改變了主意,可按鍵,或用退格鍵將
輸入的命令全部刪除之後,再按一下退格鍵,即可使linux vi命令回到命令
模式下。
如果要從命令模式轉換到編輯模式,可以鍵入命令a或者i;如果需要
從文本模式返回,則按Esc鍵即可。在命令模式下輸入“:”即可切換到末行
模式,然後輸入命令。
linux vi命令的進入與退出
linux vi命令的進入
用戶登錄到系統中之後,系統給出提示符“$”。在提示符後鍵入Vi和
想要編輯(或建立)的文件名,便可進入Vi。
[例1] 鍵入命令:
$ vi example.c
屏幕顯示如下:
~
~
~
~
~
~~
~
~
~
~
~
~
“ example.c” [New File]
如果只鍵入Vi,而不帶文件名,也可以進入Vi。之後在光標處鍵入文
件內容,退出Vi時,只需在退出命令後輸入文件名即可。
進入Vi之後,首先進入的就是命令模式,也就是說等待命令輸入而不是文
本輸入。這時輸入的字母都將作爲命令來解釋。光標停在屏幕第一行首位
上(用表示),其餘各行行首均有一個“~”符號,表示該行爲空行。最後
一行也稱狀態行,顯示出當前正在編輯的文件名以及其狀態。如本例是
[New File],表示example.c是一個新建的文件。如果example.c文件已在
系統中存在,那麼輸入上述命令後,則在屏幕上顯示出該文件的內容,並
且光標停在第一行的首位,在狀態行顯示出該文件的文件名、行數和字符
數。
[例2] 鍵入命令:
$ vi example.c
然後鍵入:
#include
main ( )
{ int k ;
for ( k=0 ; k<3 ; k++) add( );}
add( )
{ static int x=0;
x++ ;
printf(“x = %d\n”, x);
}
~
~
~
~
“ example.c” [ New File]
注意,在這裏我們爲了節省篇幅起見,屏幕只顯示15行。事實上,初
始的顯示行數與用戶所用終端有關,一般的CRT終端可顯示25行。在窗口
系統中,顯示行數與運行linux vi命令的那個窗口有關。然而我們可以對顯
示行數進行設置。例如,在能顯示25行的CRT終端上,讓Vi只顯示15行。
設置的方法將在本節後面介紹。
當用linux vi命令建立一個新文件時,在進入linux vi命令中也可以不
給出文件名,當編輯完文件需要保存數據時,再由用戶指定文件名。
進入linux vi命令時,用戶不僅可以指定一個待編輯的文件名,而且還
有許多附加操作。
如果希望在進入linux vi命令之後,光標處於文件中特定的某行上,可
在linux vi命令後加上任選項+n,其中n爲指定的行數。
[例3] 鍵入命令:
$ vi +5 example1.c後,屏幕顯示如下:
#include
main ( )
{ int k ;
for ( k=0 ; k<3 ; k++) add( );
}
add( )
{ static int x=0;
x++ ;
printf(“x = %d\n”, x);
}
~
~
~
~
~
“ example.c” 12 lines, 125 characters
光標將位於文件example1.c中的第5行上。
如果希望在進入linux vi命令之後光標處於文件最末行,則只需把命令
中附加項“+”後面的數字n省略掉即可。
在進入linux vi命令時,除了可以指定一個光標起始行號之外,還可以
在命令中指定一個模式串,此時在進入linux vi命令後,光標就處於文件中
第一個與指定模式串相匹配的那行上。
[例4] 鍵入命令:$ vi +/int example1.c
屏幕顯示如下:
#include
main ( )
{ int k ;
for ( k=0 ; k<3 ; k++) add( );
}
add( )
{ static int x=0;
x++ ;
printf(“x = %d\n”, x);
}
~
~
~
~
~
“ example.c” 12 lines, 125 characters
光標將位於文件example1.c中的第3行上。
使用linux vi命令可以同時編輯多個文件,只要在進入linux vi命令的
命令中寫入所要操作的文件即可,還可以使用通配符。
[例5] 鍵入命令:
$ vi *.cat
就可以編輯所有後綴爲cat的文件了。當然,您還可以使用shell中內置的模式匹配來裝載文件,這樣會更富技巧性。一旦您在命令行中包含了所
有的待編輯文件名,就可以在linux vi命令中方便地移來移去。
退出Vi
當編輯完文件,準備退出Vi返回到shell時,可以使用以下幾種方法之
一。
在命令模式中,連按兩次大寫字母Z,若當前編輯的文件曾被修改
過,則Vi保存該文件後退出,返回到shell;若當前編輯的文件沒被修改
過,則Vi直接退出, 返回到shell。
在末行模式下,輸入命令:w
linux vi命令保存當前編輯文件,但並不退出,而是繼續等待用戶輸入
命令。在使用w命令時,可以再給編輯文件起一個新的文件名。
[例6]
:w newfile
此時Vi將把當前文件的內容保存到指定的newfile中,而原有文件保持不
變。若newfile是一個已存在的文件,則Vi在顯示窗口的狀態行給出提示信
息:
File exists (use ! to override)
此時,若用戶真的希望用文件的當前內容替換newfile中原有內容,可
使用命令
:w! newfile
否則可選擇另外的文件名來保存當前文件。
在末行模式下,輸入命令:q系統退出linux vi命令返回到shell。若在用此命令退出Vi時,編輯文件
沒有被保存,則Vi在顯示窗口的最末行顯示如下信息:
No write since last change (use ! to overrides)
提示用戶該文件被修改後沒有保存,然後linux vi命令並不退出,繼續
等待用戶命令。若用戶就是不想保存被修改後的文件而要強行退出linux vi
命令時,可使用命令:q!
linux vi命令放棄所作修改而直接退到shell下。
在末行模式下,輸入命令:wq
linux vi命令將先保存文件,然後退出linux vi命令返回到shell。
在末行模式下,輸入命令:x
該命令的功能同命令模式下的ZZ命令功能相同。
linux vi命令中的行號
linux vi命令中的許多命令都要用到行號及行數等數值。若編輯的文件
較大時,自己去數是非常不方便的。爲此linux vi命令提供了給文本加行號
的功能。這些行號顯示在屏幕的左邊,而相應行的內容則顯示在行號之
後。
使用的命令爲:在末行方式下輸入命令:
:set number
需要說明的是,這裏加的行號只是顯示給用戶看的,它們並不是文件
內容的一部分。
一、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存在兩種模式:指令模式和輸入模式。在指令模式下輸入的按鍵將
做爲指令來處理:如輸入 a,vi即認爲是在當前位置插入字符。而在輸入模式下,vi
則把輸入的按鍵當作插入的字符來處理。指令模式切換到輸入模式只需鍵入相應的輸
入命令即可(如a,A),而要從輸入模式切換到指令模式,則需在輸入模式下鍵入
ESC鍵,如果不曉得現在是處於什麼模式,可以多按幾次 [ESC],系統如發出嗶嗶聲
就表示已處於指令模式下了。
付:在指令模式進入輸入模式的指令:
新增 (append)
a :從光標所在位置後面開始新增資料,光標後的資料隨新增資料向後移動。
A:從光標所在列最後面的地方開始新增資料。插入 (insert)
i:從光標所在位置前面開始插入資料,光標後的資料隨新增資料向後移動。
I :從光標所在列的第一個非空白字元前面開始插入資料。
開始 (open)
o :在光標所在列下新增一列並進入輸入模式。
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 :修改光標所在字元,r 後接著要修正的字符。
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: 修改指定數目的行 刪除命令
ndw或ndW: 刪除光標處開始及其後的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: 將第n1至n2行中所有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行之間的內容刪除
:w :保存當前文件
:e filename:打開文件filename進行編輯
:x:保存當前文件並退出
:q:退出vi
:q!:不保存文件並退出vi
:!command:執行shell命令command
:n1,n2 w!command:將文件中n1行至n2行的內容作爲command的輸入並執行
之,若不指定n1,n2,則表示將整個文件內容作爲command的輸入
:r!command:將命令command的輸出結果放到當前行
寄存器操作
"?nyy:將當前行及其下n行的內容保存到寄存器?中,其中?爲一個字母,n爲一個
數字
"?nyw:將當前行及其下n個字保存到寄存器?中,其中?爲一個字母,n爲一個數字
"?nyl:將當前行及其下n個字符保存到寄存器?中,其中?爲一個字母,n爲一個數字
"?p:取出寄存器?中的內容並將其放到光標位置處。這裏?可以是一個字母,也可
以是一個數字
ndd:將當前行及其下共n行文本刪除,並將所刪內容放到1號刪除寄存器中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章