vi命令是unix下常用而重要命令,可在全屏幕方式下編輯一個(gè)或多個(gè)文件。若在vi執(zhí)行時(shí)
沒(méi)有指定一個(gè)文件,那么vi命令會(huì)自動(dòng)產(chǎn)生一個(gè)無(wú)名的空的工作文件。若指定的文件不存在,
那么就按指定的文件名創(chuàng)建一個(gè)新的文件。若對(duì)文件的修改不保存的話,v i命令并不改變?cè)?
來(lái)文件的內(nèi)容。
注意:vi命令并不鎖住所編輯的文件,因此多個(gè)用戶可能在同時(shí)編輯一個(gè)文件,那么最后
保存的文件版本將被保留。
下面是vi命令使用的一些選項(xiàng)及含義:
-c sub-command 在對(duì)指定的文件編輯前,先執(zhí)行指定的命令 sub-command .
-r filename 恢復(fù)指定的文件filename .
-R 將指定的文件以只讀的方式放入編輯器中,這樣不會(huì)保存對(duì)文件的任何修 改。
-y number 將編輯窗口的大小設(shè)為number行。
下面是vi編輯所處的三種模式:
.命令模式 進(jìn)入vi時(shí)所處的模式。在此模式下用戶可輸入各種子命令對(duì)進(jìn)行*作,如刪除行、
粘貼行、移向下一個(gè)字、移向不同行等。
.文本輸入模式 在此模式下可以修改一行的內(nèi)容并增添新行。在命令模式下鍵入a 、i 或
c鍵可進(jìn)入文本輸入模式,按Escape鍵可返回命令模式。
.命令項(xiàng)模式 在此模式下,可以通過(guò)子命令輸入更多的參數(shù)。如:w子命令要求輸入一文
件名,"/"子命令要求輸入一個(gè)查找項(xiàng)。用戶使用Escape鍵返回命令模式。
下面是自命令模式下執(zhí)行的,在同一行上移動(dòng)的自命令:
h 將光標(biāo)左移一格。
l 將光標(biāo)右移一格。
j 將光標(biāo)下移一格。
k 將光標(biāo)上移一格。
w 將光標(biāo)移到下一個(gè)小字的前面。
W 將光標(biāo)移到下一個(gè)大字的前面。
b 將光標(biāo)移到前一個(gè)小字的前面。
B 將光標(biāo)移到前一個(gè)大字的前面。
e 將光標(biāo)移到下一個(gè)小字的后面。
E 將光標(biāo)移到前一個(gè)大字的后面。
fc 把光標(biāo)移到同一行的下一個(gè)c字符處。
Fc 把光標(biāo)移到同一行的前一個(gè)c字符處。
tc 把光標(biāo)移到同一行的下一個(gè)字符c的前一格。
Tc 把光標(biāo)移到同一行的前一個(gè)字符c的后一格。
number| 把光標(biāo)移到遞number列上。
下面是命令模式下在行間移動(dòng)的子命令:
+或Enter 把光標(biāo)移至下一行第一個(gè)非空白字符。
- 把光標(biāo)移至上一行第一個(gè)非空白字符。
0 把光標(biāo)移到當(dāng)前行的第一個(gè)字符處。
$ 把光標(biāo)移到當(dāng)前行的最后一個(gè)字符處。
H 把光標(biāo)移到屏幕最頂端一行。
L 把光標(biāo)移到屏幕最底端一行。
M 把光標(biāo)移到屏幕中間。
下面是命令模式下改變屏幕顯示的子命令:
z- 把當(dāng)前行作為屏幕的最后一行,并重新顯示屏幕。
z. 把當(dāng)前行作為屏幕的中間一行,并重新顯示屏幕。
Ctrl+l 重新顯示屏幕當(dāng)前內(nèi)容。
/pattern/z- 尋找pattern的下一個(gè)位置,并把所在行設(shè)為屏幕的最后一行。
下面是在命令模式下用來(lái)顯示頁(yè)面的子命令:
Ctrl + f向后滾一頁(yè)。
Ctrl + d向后滾半頁(yè)。
Ctrl + b向前滾一頁(yè)。
Ctrl + u向前滾半頁(yè)。
Ctrl + e屏幕向下滾一行。
Ctrl + y屏幕項(xiàng)上滾一行。
下面是在命令模式下用來(lái)查找字符串所使用的子命令:
/pattern 向后尋找指定的pattern ,若遇到文件尾,則從頭再開(kāi)始。
?pattern 向前尋找指定的pattern ,若遇到文件頭,則從尾再開(kāi)始。
n 在上次指定的方向上,再次執(zhí)行上次定義的查找。
N 在上次指定的方向的相反方向上,再次執(zhí)行上次定義的查找。
/pattern/+number 將光標(biāo)停在包含pattern的行后面第number行上。
/pattern/-number 將光標(biāo)停在包含pattern的行前面第number行上。
% 移到匹配的"()"或"{}"上。
下面是在文本輸入模式下用來(lái)輸入文本的子命令(用戶可在任何時(shí)候按Escape返回到命令模式):
a 在光標(biāo)之后開(kāi)始輸入文本。
A在行尾開(kāi)始輸入文本。
i在光標(biāo)之前開(kāi)始輸入文本。
I在行首第一個(gè)非空白字符前輸入文本。
o在光標(biāo)所在行后插入一空行。
O在光標(biāo)所在行前插入一空行。
下面是在命令模式下改變文本所使用的子命令(用戶可在任何的時(shí)候按Escape鍵返回到命令模式):
cc或S 修改一整行。
C 改變一行光標(biāo)位置以后的部分。
cw 改變光標(biāo)所在單詞。
dd刪除當(dāng)前行。
D 刪除光標(biāo)所在行光標(biāo)后面的內(nèi)容。
dw刪除光標(biāo)所在的單詞。
J 把下一行內(nèi)容加到本行行尾。
rc把光符所在字符替換成c .
R 覆蓋本行內(nèi)容。
u恢復(fù)上一次的修改。
x刪除光標(biāo)所在的字符。
~ 改變光標(biāo)所在出字符的大小寫(xiě)。
. 重復(fù)上一個(gè)*作。
<<把當(dāng)前行移到左邊。
>>把當(dāng)前行移到右邊。
下面是用于文件中拷貝文本的字命令:
p 將緩沖區(qū)內(nèi)容取到光標(biāo)所在行的下面一行。
P 將緩沖區(qū)內(nèi)容取到光標(biāo)所在行的上面一行。
"bd 將文本刪除至有名緩沖區(qū)b .
"bp 張貼有名緩沖區(qū)b中內(nèi)容。
yy把當(dāng)前行放入緩沖區(qū)。
Y 把當(dāng)前行放入緩沖區(qū)。
Yw把光標(biāo)所在的單詞放入緩沖區(qū)。
下面是用于保存文件的子命令:
:w 回寫(xiě)修改后的文件。
:w filename 當(dāng)filename不存在時(shí),把修改后的文件存為文件filename ,當(dāng)文件filename
存在時(shí),報(bào)錯(cuò)。
!w filename 如果文件filename存在時(shí),把修改后的文件保存為文件filename .
下面列出了在vi編輯的多個(gè)文件之間切換所用的子命令:
:n開(kāi)始編輯vi激活的文件列表中的下一個(gè)文件。
:n filenames 指定將被編輯的新的文件列表。
下面列出了用于在當(dāng)前文件和另外一個(gè)文件間切換的子命令:
:e filename 使用filename激活vi (在vi中裝入另一個(gè)文件filename)。
e!重新裝入當(dāng)前文件,若當(dāng)前文件有改動(dòng),則丟棄以前的改動(dòng)。
:e+filename 使用filename激活vi ,并從文件尾部開(kāi)始編輯。
:e+number filename 使用filename激活vi ,并在第number行開(kāi)始編輯。
:e# 開(kāi)始編輯另外一個(gè)文件。
下面是在本文件中加入其他文件代碼所使用的子命令:
:r filename讀取filename文件,并將其內(nèi)容加到當(dāng)前文件后。
:r ! command執(zhí)行command文件,并將其輸出加到當(dāng)前文件后。
下面是vi中其他的子命令:
ctrl+g 取得正在編輯文件的有關(guān)信息。
:sh啟動(dòng)sh ,從sh中返回可用exit或ctrl+d .
:! Command 執(zhí)行命令command .
!!重新執(zhí)行上次的:! Command子命令。
:q退出vi ,若用戶對(duì)編輯的文件有所修改,系統(tǒng)不會(huì)讓用戶使用q命令退出。
:q!退出vi而不管是否對(duì)文件有改動(dòng)。
ZZ或:wq 保存對(duì)文件的修改并退出vi .
用戶可在一個(gè)特殊的文件.exrc中定義特殊的vi命令。在vi中使用這些命令時(shí),必須在該
命令前加上一個(gè)冒號(hào)( :) 。
-------------------------------------------------------
另一篇:
-------------------------------------------------------
vi 的模式
vi 是在很久以前就寫(xiě)的程序。在那個(gè)時(shí)候,鍵盤(pán)上沒(méi)有現(xiàn)在熟悉的那么多功能鍵。所以,vi 設(shè)計(jì)成通過(guò)輸入字符和 ESC 來(lái)控制輸入和修改文本。
可能這對(duì)于一些人來(lái)說(shuō)是個(gè)遺憾,但是你會(huì)發(fā)現(xiàn)你不需要改變手在鍵盤(pán)上的位置就可以完成所有的功能。結(jié)果是你的輸入將快速起來(lái)。
為了完成交互的全屏幕編輯工作, vi 有三種模式。插入模式 (insert) 用于輸入文本。在插入模式下,你輸入的任何字符都將顯示在屏幕并存于文件。命令 (command) 模式用于大多數(shù)編輯功能。在命令模式下,所有的輸入都將產(chǎn)生一定的響應(yīng)而不是 直接到文本中,例如移動(dòng)光標(biāo)、刪除一塊文本、拷貝文本等。第三個(gè)模式是執(zhí)行另 外的功能,例如查找、全局替換、處理多個(gè)文件等。這種模式是基于 ex 編輯器的。
啟動(dòng) vi
當(dāng) vi 啟動(dòng)后,默認(rèn)的模式是命令模式。按照下面的步驟試一試:輸入程序名稱(chēng)啟動(dòng) vi :
$ vi
你將看到類(lèi)似下面的東西:
~~~~~~~~~~~~~~~~~~~~~~~~~Empty buffer
i--插入
現(xiàn)在我們輸入 "i" 進(jìn)入插入模式。字符 "i" 將不會(huì)回顯。此后你輸入的任何東西都將顯示在緩存中。現(xiàn)在我們來(lái)輸入一段文字。 例子中的話來(lái)自英文版的孫子兵法。注意光標(biāo)的位置在例子中是個(gè)下劃 線。
If wise, a commander is able to recognize changing circumstances and toact expediently. If sincere, his men will have no doubt of the certainty ofrewards and punishments. If humane, he loves mankind, sympathizes with others,and appreciates their industry and toil. If courageous, he gains victory byseizing opportunity without hesitation. If strict, his troops are disciplinedbecause they are in awe of him and are afraid of punishment. Shen Pao-hsu ... said: 'If a general is not courageous he will be unableto conquer doubts or to create great plans.'~~~~~~~~~~~~~~~~
Esc--Cancel
當(dāng)你輸入完了,按下 Esc 鍵返回到命令模式。 (如果你已經(jīng)處于命令模式下,按 Esc 時(shí)會(huì)聽(tīng)到喇叭的聲音。) Esc 可以撤消未完成的命令和終止插入模式。按 Esc 后,光標(biāo)將停留在你最后輸入的字符的下面。
很不幸,沒(méi)有一個(gè)明顯的標(biāo)志表明你現(xiàn)在處于什么模式下。但是有簡(jiǎn)單的方 法來(lái)告訴你現(xiàn)在你所處的模式。如果你按下鍵,相應(yīng)的字符出現(xiàn)在屏幕上,那么 你是在插入模式下,否則是命令模式下。如果你不能確定你現(xiàn)在所處的模式,那么 按 Esc 兩次以聽(tīng)到喇叭聲來(lái)確信你在命令模式下。
移動(dòng)光標(biāo)和簡(jiǎn)單的編輯
是看一看基本的移動(dòng)光標(biāo)命令的時(shí)候了。訓(xùn)練訓(xùn)練你的手指,讓他們以后自動(dòng)的執(zhí)行你所想的命令吧。
最重要的移動(dòng)命令
讓我們來(lái)看看有多少影響光標(biāo)移動(dòng)的命令。
hh--光標(biāo)左移
首先,按 5 下 h 讓光標(biāo)左移動(dòng) 5 個(gè) (如果你看到 h 跑到屏幕上了的話,一定是你忘記了按 Esc )。光標(biāo)現(xiàn)在應(yīng)該在 "plans" 中的 "p" 下面 (看下面的例子):
If wise, a commander is able to recognize changing circumstances and toact expediently. If sincere, his men will have no doubt of the certainty ofrewards and punishments. If humane, he loves mankind, sympathizes with others,and appreciates their industry and toil. If courageous, he gains victory byseizing opportunity without hesitation. If strict, his troops are disciplinedbecause they are in awe of him and are afraid of punishment. Shen Pao-hsu ... said: 'If a general is not courageous he will be unableto conquer doubts or to create great plans.'~~~~~~~~~~~~~~~
kk--光標(biāo)上移
現(xiàn)在我們來(lái)按 5 次 k 讓光標(biāo)上移 5 行。也許你該認(rèn)為應(yīng)該有快捷方式了。好,現(xiàn)在就有個(gè)簡(jiǎn)單的方法:在你要采取的 行動(dòng)前加上數(shù)字。按下 5k 你可以和按 5 下 k 有相同的結(jié) 果了。光標(biāo)現(xiàn)在該在 "he" 的"e"下了。
If wise, a commander is able to recognize changing circumstances and toact expediently. If sincere, his men will have no doubt of the certainty ofrewards and punishments. If humane, he loves mankind, sympathizes with others,and appreciates their industry and toil. If courageous, he gains victory byseizing opportunity without hesitation. If strict, his troops are disciplinedbecause they are in awe of him and are afraid of punishment. Shen Pao-hsu ... said: 'If a general is not courageous he will be unableto conquer doubts or to create great plans.'~~~~~~~~~~~~~~~~
在使用這些功能的時(shí)候有些限制的。例如使用 h 或 l 移動(dòng)光標(biāo)超過(guò)了一行文字的頭或尾,光標(biāo)將停留在頭或尾部,喇叭鳴叫提醒 你。
還有其他的類(lèi)似 h 和 k 的嗎?看一看表3.2。最好的熟悉他們 的的方法是多用他們。
表 3.2. 常見(jiàn)的方向鍵
命令 |
移動(dòng) |
h |
左一個(gè)字符 |
j |
下一行 |
k |
上一行 |
l |
右一個(gè)字符 |
w, W |
前一個(gè)單詞 (W 忽略標(biāo)點(diǎn)) |
b, B |
后一個(gè)單詞 (B 忽略標(biāo)點(diǎn)) |
$ |
到行尾 |
^ |
到行首第一個(gè)非空字符 |
0 |
行首 |
G |
到緩沖首 |
nG |
到第 n 行 |
大小寫(xiě)的命令是有一些區(qū)別的。小寫(xiě)字母一般以標(biāo)點(diǎn)區(qū)分 "words.",而大寫(xiě)則忽略他們。
最重要的編輯程序
讓我們看看最簡(jiǎn)單也是最常用的編輯過(guò)程:
修改 沒(méi)有人不犯錯(cuò)誤。所以遲早你會(huì)碰到修改你輸入的文本的時(shí)候。實(shí)際上花在字處理上的大多數(shù)時(shí)間是修改而不是輸入新的東西。因此,你要知道如何方便地修改就很重要。
x--刪除一個(gè)字符 刪除文字的最簡(jiǎn)單的方式是用 x。這個(gè)命令的結(jié)果是光標(biāo)所處 的字符的消失,后面的文字左移動(dòng)。如果你刪除的字符是一行最后的一個(gè)字符, 那么光標(biāo)將向左移動(dòng)一個(gè),這樣光標(biāo)就不會(huì)停留在不存在的字符的下面了。假如 沒(méi)有任何文字了,喇叭就叫。
d--刪除對(duì)象 這個(gè)命令的右邊還要有一定的文字對(duì)象。文字對(duì)象就是一塊文字。他右邊接的就是在控制光標(biāo)移動(dòng)的那些字符。例如 w 表示向前一個(gè)單詞,那么 dw 將刪除下一個(gè)單詞。5w 表示前進(jìn) 5 個(gè)單詞,那么 d5w 將刪除他們。
dd--刪除一行 最常用的 d 系列命令之一。和前面一樣, 5dd 將刪除 5 行
D--整個(gè)刪除 大寫(xiě)形式的 D 用來(lái)刪除從光標(biāo)到行尾。和 d$ 一樣效果。
u--恢復(fù) 要后悔嗎?他不僅僅撤消刪除,還撤消你所有的編輯工作。
.--重復(fù) 重復(fù)編輯工作。