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