歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> FreeBSD文件編輯vi指令大全

FreeBSD文件編輯vi指令大全

日期:2017/2/28 11:20:20   编辑:關於Unix


編輯文件是最基本的系統操作之一,FreeBSD提供了兩個最基本的全屏幕編輯器:ee和vi。全屏幕編輯通過終端設備進入全屏幕模式,提供直觀的編輯功能。如果終端設備的類型設置不正確,會導致全屏幕模式不正確,無法進行正確的編輯工作。
1) 終端設備及其描述
終端設備文件為標識用戶與系統連接的終端設備的設備文件,這是一種典型的字符設備文件。普通的終端一般使用串口和主機相連接,系統使用終端文件來描述這個連接的終端。通常第一個串口連接的設備為ttyd0(標准個人計算機第一個串口連接的常常是鼠標),第二個串口為ttyd1,依次類推。
如果用戶是使用telnet或其他遠程登錄的方式,那麼系統使用一個偽設備文件與用戶的偽終端相對應,這些偽終端設備文件為ttyp0到ttysv,ttyP0到ttySv。這樣就能支持相當多用戶同時登錄系統。
Unix是多用戶、多任務系統,但是個人計算機僅僅有一個屏幕,熟練Unix用戶喜歡同時進行幾個工作,例如在一邊下載文件,一邊進行編程等,對於直接使用控制台的FreeBSD用戶來講,FreeBSD提供的虛擬終端能完美的解決這個問題。
對於在控制台上的虛擬終端,對應的終端設備文件為ttyv0、ttyv1、ttyv3等,與鍵盤上的12個功能鍵相對應。控制台設備被系統用來輸出很多必要的信息,包括各種登錄信息等對系統安全非常相關的信息。由於在控制台上操作就是在個人計算機前面操作,因此通常在控制台上能完成許多在其他終端上不能完成的操作,例如:使用Ctrl+Alt+Del重起系統等。為了保證系統安全,必須限制對控制台的物理訪問。
對於不在控制台的用戶,就需要額外的應用程序的支持,才能使用多個終端。例如可以在支持多窗口的計算機上多開幾個telnet會話,或者使用X window系統開出多個xterm窗口,每個窗口對應一個偽終端。甚至在一個字符終端上,也可以通過應用程序screen打開幾個偽終端,但這需要安裝相應的軟件screen。這些偽終端都使用ttyp0等偽設備文件。
與終端相關的另一個問題為不同的終端設備分為不同的終端類型,這是因為雖然終端是字符型設備,但又要求它能夠具備更復雜的功能,例如進行全屏幕操作等。這樣就要求終端設備能接受和識別一些控制字符,而不同的終端設備具備不同的控制字符。
登錄用戶可以使用TERM環境變量來告訴應用程序當前使用的終端類型,常用的終端類型有vt100,ansi等,FreeBSD控制台的終端類型為cons25,但是其他Unix中一般不識別這個類型,因此如果在FreeBSD上通過telnet等連接到其他Unix上之後,應該改變TERM變量的值為ansi或其他標准一些的終端類型。
在FreeBSD中,終端類別對應的控制字符使用termcap的方法定義,而System V中使用terminfo的方式。所有的終端類型記錄在/usr/share/misc/termcap文件中,並定義這些終端對應的控制字符。
登錄到系統之後,將有一個終端設備文件與用戶的這個登錄過程相聯系。這個終端設備文件在控制台上登錄時可能是/dev/ttyv0,如果從網絡上遠程登錄可能是/dev/ttyp0,但無論是那種情況,系統總使用/dev/tty來代表用戶當前使用的終端,直接訪問/dev/tty將對當前的終端進行直接操作。
2) 編輯文件
當執行全屏幕編輯任務的時候,必須將TERM變量設置正確,否則系統就無法正確放置光標的位置,進而無法進行正常的編輯工作。
FreeBSD下的最基本編輯器為ee,ee編輯器是一種簡單易用的編輯器,它在啟動之後,將一些操作的組合熱鍵放在了屏幕的上方,用戶可以隨時得到提示。而如果需要進行保存、退出等操作時,使用Esc鍵則可以激活菜單,進行相應的操作。Ee還是系統安裝程序所使用的缺省編輯器。
另一種更為流行的編輯器是vi,vi是Unix下的一種標准編輯工具,幾乎所有的Unix都支持這個編輯器,並將其作為基本配置。因此,對於一個Unix系統管理員來講,掌握vi應該是基本功之一。
然而,由於vi是為了使用終端的使用者來設計的,就與習慣於使用個人計算機的用戶的一些習慣有些矛盾,因此很多用戶都抱怨講vi是非常難用的一種編輯器,例如,打算使用箭頭鍵移動光標,卻有時成功,有時輸入了一些亂七八糟的字符等等。
這些錯誤的原因是用戶沒有了解vi操作的一些基本原則,原則上,vi是為了只使用鍵盤進行輸入的用戶進行設計的,如果使用者的手總是在鍵盤、鼠標之間換來換去,在主鍵盤和小鍵盤之間換來換去,在主鍵盤和方向鍵之間換來換去,就很難認識到vi的魅力的。因此,對於達到了接近盲打層次的輸入者,就會自然而然的認識到vi在輸入方面的優勢。
由於vi只使用主鍵盤,那麼當需要控制vi的時候,就需要輸入一些與普通輸入過程不同的指令,在Windows編輯器中,是使用菜單,有些編輯器是使用組合鍵,而vi則使用一個不同的命令模式,允許用戶輸入控制指令。
因此,vi分為兩個基本模式,一個為命令模式,另一個為編輯模式,當處於編輯模式的時候,不能做移動光標、刪除字符等操作,而處於命令模式的時候,鍵盤輸入的都是控制命令,當然包括使用”:”使用戶能輸入一系列的指令,例如使用”:w”保存文件,”:x”保存文件並退出系統,”:q”放棄保存文件並退出系統,等等。
使用Esc鍵使vi從編輯模式轉換到命令模式,使用’i’、’A’等鍵盤命令使vi從命令模式轉換到編輯模式。
設計vi的目的是僅僅利用基本鍵盤,不需要擴展鍵盤的幫助就能完成所有的基本操作,使用vi的時候不需要Ctrl、箭頭等特殊的鍵,唯一需要的特殊鍵為Esc鍵,這對於一個熟悉鍵盤的輸入者來講,是非常友好的。當一個使用者使用’F’和’J’鍵上的特殊突起確定了手的位置之後,他的右手不需要移動的,他的左手只需要在按ESC鍵的是否略微離開一些標准的輸入位置,使用者能很輕松的可以使用h,j,k,l來移動光標的位置,使用x刪除自負,使用i轉換到編輯模式,等等,由於不需要額外的移動,輸入的效率事實上更高。
一個熟練的vi使用者是不需要將手離開基本鍵盤,去使用箭頭鍵或鼠標進行操作的,個人計算機的標准101鍵盤對於熟悉鍵盤的操作人員來講,明顯是一種浪費。
以下是一些常用的vi指令例子:
Esc 返回命令狀態,如果不清楚當前狀態,最好使用這個鍵確保處於命令狀態;
h 向左移動光標;
j 向上移動光標;
k 向下移動光標;
l 向右移動光標;
i 在當前位置上進入輸入狀態;
A 在行尾進入輸入狀態;
x 刪除當前字符;
dd 刪除當前行,並放入緩沖區;
d7d 刪除7行並放入緩沖區,可以改變7為任意其他數字;
yy 復制當前行並放入緩沖區;
y17y 復制17行並放入緩沖區,可以改變17為任意其他數字;
p 將dd、yy等放在緩沖區的數據粘貼在下一行;
1G 跳到文件的第一行,0表示文件的末尾;
+10G 向前跳10行;
-10G 向後跳10行;
/somestring 向後搜索somestring;
?somestring 向前搜索somestring;
n 重復上次搜索動作;
:w 保存文件;
:w filename 保存當前編輯的文件到filename中;
:q 退出vi,如果文件已經改變則退出失敗;
:q! 強制退出vi,不管文件是否被更改過,!用於強制vi執行操作;
:x 保存退出,相當於:wq;
:e filename,編輯另一個文件filename,如果放棄當前改變,使用!強制;
:% s/string1/string2/g 在整個文件范圍內查找string1,用string2替換;
-----------------------------------
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號刪除寄存器中
Copyright © Linux教程網 All Rights Reserved