在 UNIX 操作系統(tǒng)中,文檔編輯器有很多種,其中最友好的工具就是 vi. 該文檔編輯器可以讓用戶在文件中基于上下文執(zhí)行編輯操作。
現(xiàn)在,用戶可以使用 vi 文檔編輯器的升級版 VIM.這里的 VIM 中的 M 就是源自改善的意思。
vi 通常會被認(rèn)為是 UNIX 編輯器的實(shí)施標(biāo)準(zhǔn),原因如下:
用戶可以使用 vi 編輯器來編輯已經(jīng)存在的文件,當(dāng)然也可以使用它創(chuàng)建一個新的文件。此外,用戶也可以使用它來瀏覽一個文本文件。
用戶可以通過下面幾種方法來開啟 vi 編輯器:
指令 | 描述 |
---|---|
vi filename | 如果文件不存在,則創(chuàng)建這個文件,否則打開這個文件 |
vi -R filename | 以只讀的方式打開一個已存在的文件 |
view filename | 以只讀的方式打開一個已存在的文件 |
下面是一個創(chuàng)建新文件 testfile 的例子,當(dāng)然,前提是該文件在當(dāng)前目錄內(nèi)不存在。
$vi testfile
然后用戶會在屏幕上看到如下顯示:
|
~
~
~
~
~
~
~
~
~
~
~
~
"testfile" [New File]
此時,應(yīng)該注意到的是在每一行都的開頭都會有一個波浪號(~),這個波浪號代表該行并沒有被使用。如果某一行沒有以波浪號開頭,那么這就意味著有空格存在,也可能是換行符或其他的不易看見的符號。
所以,在我們正式使用 vi 編輯器之前,讓我們理解一些微小但是很重要的。
使用 vi 編輯器時通常會在下面兩個模式之間來回切換:
vi 編輯器通常會以指令模式打開。如果用戶希望鍵入文本的話,用戶必須把當(dāng)前模式切換為插入模式。切換模式到插入模式時,用戶可以簡單的按 i 鍵。離開插入模式,可以按 Esc 鍵。
值得注意的是,如果用戶不清楚當(dāng)前處于哪種模式,用戶可以按兩次 Esc 鍵,編輯器就會回到指令模式。用戶可以使用 vi 編輯器打開一個文本,并且鍵入一些字符,然后切換到指令模式,體驗(yàn)一下這前后的差別。
離開 vi 編輯器的指令是 :q
。在指令模式下,一旦鍵入冒號后跟字母 q,再單擊回車。如果文檔有修改的話,編輯器會報(bào)出提示。如果不想看到這樣的提示信息,用戶可以使用 :q!
。這個指令可以在不保存更改的情況下離開 vi 編輯器。
保存文檔的指令時 :w
。用戶可以將其與上述的離開指令融合在一起使用,比如 :wq
,然后單擊回車。
保存文件更新且退出的最快捷的方法就是 ZZ 指令。當(dāng)用戶在指令模式下鍵入 zz 指令后,效果等同于 :wq
。
用戶也可以通過再 :w 后指定特定的文件名來指定不同的文件名來保存。比如,如果用戶希望將文件保存為 filename2,用戶可以鍵入:w filename2, 然后點(diǎn)擊回車。
為了在文件內(nèi)不影響文本內(nèi)容的情況下移動光標(biāo),用戶必須在指令模式(連續(xù)兩次按下 Esc 鍵)下來操作。下面是文件內(nèi)移動光標(biāo)的相關(guān)指令:
指令 | 描述 |
---|---|
k | 向上移動一行 |
j | 向下移動一行 |
h | 將光標(biāo)往左移動一個字符 |
l | 將光標(biāo)往右移動一個字符 |
下面是兩個需要注意的重點(diǎn):
還有其他一些在文件內(nèi)移動光標(biāo)的方法。需要格外注意的是必須在指令模式下來操作。下面是其他在文件內(nèi)移動光標(biāo)的方法。
指令 | 描述 |
---|---|
0 或 l | 光標(biāo)回到行首 |
$ | 光標(biāo)回到行末尾 |
w | 光標(biāo)移動到下一個字 |
b | 光標(biāo)移動到前一個字 |
( | 光標(biāo)移動到當(dāng)前句子的開頭 |
) | 光標(biāo)移動到下個句子的開頭 |
E | 光標(biāo)移動空白分割單詞的末尾 |
{ | 光標(biāo)往后移動一段 |
} | 光標(biāo)往前移動一段 |
[[ | 光標(biāo)往后移動一節(jié) |
]] | 光標(biāo)往前移動一節(jié) |
n| | 光標(biāo)移動到當(dāng)前行的n列 |
1G | 光標(biāo)移動到文件的第一行 |
G | 光標(biāo)移動到文件的最后一行 |
nG | 光標(biāo)移動到文件的第 n 行 |
:n | 光標(biāo)移動到文件的第 n 行 |
fc | 光標(biāo)往前移動到 c |
Fc | 光標(biāo)往后移動到 c |
H | 光標(biāo)移動到屏幕的首部 |
nH | 光標(biāo)移動到屏幕從頂部查第 n 行 |
M | 光標(biāo)移動到屏幕的中間 |
L | 光標(biāo)移動到屏幕的底部 |
nL | 光標(biāo)移動到從屏幕底部往上第 n 行 |
:x | 光標(biāo)移動到行號為 x 的行 |
下面是一些和 Control 鍵配合使用的指令:
指令 | 描述 |
---|---|
CTRL+d | 向前移動半個屏幕 |
CTRL+f | 向前移動整個屏幕 |
CTRL+u | 向后移動半個屏幕 |
CTRL+b | 向后移動整個屏幕 |
CTRL+e | 屏幕往上移動一行 |
CTRL+y | 屏幕往下移動一行 |
CTRL+u | 屏幕往上移動半個頁面 |
CTRL+f | 屏幕往下移動一個頁面 |
CTRL+l | 重繪屏幕 |
只有在插入模式下才可以對文本進(jìn)行編輯。從指令模式切換為插入模式可以有很多種方法:
指令 | 描述 |
---|---|
i | 當(dāng)前位置前插入文本 |
I | 當(dāng)前行首插入文本 |
a | 當(dāng)前位置后插入文本 |
A | 當(dāng)前行末尾插入文本 |
o | 在光標(biāo)位置下方新建一行來輸入文本 |
a | 在光標(biāo)位置上方新建一行來輸入文本 |
下面是關(guān)于用來在打開的文件中刪除字符或行的指令列表:
指令 | 描述 |
---|---|
x | 刪除光標(biāo)位置下的字符 |
X | 刪除光標(biāo)位置前的字符 |
dw | 刪除光標(biāo)位置到下一個字間的所有字符 |
d^ | 刪除光標(biāo)位置到行首間的所有字符 |
d$ | 刪除光標(biāo)位置到行末尾間的所有字符 |
D | 刪除光標(biāo)位置到當(dāng)前行末尾間的所有字符 |
dd | 刪除一整行 |
正如前面所述,vi 中的大部分指令都可以在前面加數(shù)字來表示希望執(zhí)行的次數(shù)。比如,2x 意味著會刪除當(dāng)前光標(biāo)位置下的兩個字符,2dd 意味著刪除兩行。
本教程建議在學(xué)習(xí)后面相關(guān)內(nèi)容前可以多多練習(xí)以上內(nèi)容。
用戶可以在不刪除文本的情況下對字符、字和行進(jìn)行更改。下面是相關(guān)指令:
指令 | 描述 |
---|---|
cc | 刪除當(dāng)前行,僅留下用戶鍵入的文本 |
cw | 刪除光標(biāo)所在的單詞,并進(jìn)入插入模式 |
r | 替換掉光標(biāo)下的字符,vi 在替換結(jié)束后回到指令模式 |
R | 覆寫當(dāng)前光標(biāo)處的多個字符,只有使用 Esc 才可以停止覆寫 |
s | 將當(dāng)前字符替換為用戶鍵入的字符,之后,仍處于插入模式 |
S | 刪除光標(biāo)所在行,替換為用戶鍵入的文本,之后,系統(tǒng)仍處于插入模式 |
用戶可以從一個地方復(fù)制一行或一個字,然后粘貼到其他地方,相關(guān)指令如下:
指令 | 描述 |
---|---|
yy | 復(fù)制當(dāng)前行 |
yw | 復(fù)制當(dāng)前字 |
p | 在光標(biāo)后粘貼 |
P | 在光標(biāo)前粘貼 |
有一些高級的指令可以簡化日常編輯操作:
指令 | 描述 |
---|---|
J | 當(dāng)前行與下一行想連接,定義一個數(shù)字可以連接好多行 |
當(dāng)前行往左跳轉(zhuǎn),一個 shift 的寬度 | |
>> | 當(dāng)前行往右跳轉(zhuǎn),一個 shift 的寬度 |
~ | 當(dāng)前光標(biāo)下,大小寫切換 |
U | 將當(dāng)前行重新回到光標(biāo)剛到這里的狀態(tài) |
u | 撤銷該文件的最后一個更改,再次鍵入u就是重新實(shí)現(xiàn)更新 |
:f | 在屏幕上顯示當(dāng)前光標(biāo)的半分比、文件名級文件總數(shù) |
:f filename | 重命名當(dāng)前文件到 filename |
:w filename | 寫到文件 filename |
:e filename | 打開另一個文件 filename |
:cd dirname | 切換當(dāng)前目錄到目錄 dirname |
:e # | 在兩個已打開的文件間切換 |
:n | 用戶在使用 vi 打開多個文件的情況下,使用該指令一次切換到下一個文件 |
:p | 用戶在使用 vi 打開多個文件的情況下,使用該指令一次切換到上一個文件 |
:N | 用戶在使用 vi 打開多個文件的情況下,使用該指令一次切換到下一個文件 |
:r file | 讀取文件 file,然后在當(dāng)前行的后面進(jìn)入插入模式 |
:nr file | 讀取文件 file,然后在當(dāng)前行的后面n行進(jìn)入插入模式 |
vi 編輯器有兩種搜索方式:字符串和字符。對于字符串搜索,需要使用到 /
和 ?
指令。當(dāng)用戶開始鍵入這些指令的時候,這些指令就會顯示在屏幕的底部,這樣,用戶就可以加入指定的字符串來進(jìn)行搜索了。
這兩個指令僅僅在搜索方向上有所不同:
/
指令是從上往下搜索。?
指令時從下往上搜索。n 和 N 指令用于以同樣或相反的方向重復(fù)上述搜索指令。在搜索指令中,一些字符串擁有特殊的意義。就需要使用轉(zhuǎn)意符(\)。
指令 | 描述 |
---|---|
^ | 在行的首部開始搜索 |
. | 匹配單個字符 |
* | 匹配0個或更多個前面的字符 |
$ | 在行末尾開始搜索 |
[ | 啟動一個匹配或者不匹配的表達(dá)式 |
在表達(dá)式中,來找到一個字的開頭或結(jié)尾 | |
> | 參考上面的 |
用戶可以通過如下指令來改變 vi 界面的外觀和友好程度:set 指令。下述指定必須在指令模式下鍵入。
指令 | 描述 |
---|---|
:set ic | 搜索的時候忽略大小寫 |
:set ai | 設(shè)置自動縮進(jìn) |
:set noai | 不設(shè)置自動縮進(jìn)/td> |
:set nu | 在左側(cè)顯示行號 |
:set sw | 設(shè)置制表符的寬度。比如,:set sw=4 意味著將制表符寬度設(shè)置為4 |
:set ws | 如何循環(huán)搜索被設(shè)置,則如果在文件底部沒有搜索到,會重新從文件開頭開始搜索。 |
:set wm | 如果這個選項(xiàng)有一個值大于零,編輯器會“自動換行”。 |
:set ro | 更改文件讀寫類型為只讀 |
:set term | 輸出終端類型 |
:set bf | 忽略控制字符 |
vi 編輯器可以運(yùn)行指令集。為此,用戶必須在指令模式下輸入 :!
指令。
比如,如果用戶在保存文件前,希望檢測文件是否已存在,那么用戶可以鍵入 :! ls
,然后用戶就看以在屏幕上看到 ls 指令的的輸出。
按任意鍵后,會回到 vi 界面。
:s/
指令可以快速替換字或者一組字。下面是語法:
:s/search/replace/g
g 代表全局。該指令的意思就是出現(xiàn)在光標(biāo)所在行的所有匹配字符都會被替換。
下面是使用 vi 編輯器時的重要提示:
更多建議: