1.1 為何要學(xué) vim
2. vi 的使用
2.1 簡易執(zhí)行范例
2.2 按鍵說明
2.3 一個案例的練習(xí)
2.4 vim 的暫存檔、救援回復(fù)與開啟時的警告訊息
3. vim 的額外功能
3.1 區(qū)塊選擇(Visual Block)
3.2 多檔案編輯
3.3 多窗口功能
3.4 vim 環(huán)境設(shè)定與記錄: ~/.vimrc, ~/.viminfo
3.5 vim 常用指令示意圖
4. 其他 vim 使用注意事項
4.1 中文編碼的問題
4.2 DOS 與 Linux 的斷行字符: dos2unix, unix2dos
4.3 語系編碼轉(zhuǎn)換: iconv
5. 重點(diǎn)回顧
6. 本章習(xí)題
7. 參考數(shù)據(jù)與延伸閱讀
8. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?t=23883
由前面一路走來,我們一直建議使用文本模式來處理 Linux 的系統(tǒng)設(shè)定問題,因為不但可以讓你比較容易了解到 Linux 的運(yùn)作狀況,也比較容易了解整個設(shè)定的基本精神,更能『保證』你的修改可以順利的被運(yùn)作。 所以, 在 Linux 的系統(tǒng)中使用文本編輯器來編輯你的 Linux 參數(shù)配置文件,可是一件很重要的事情呦 !也因此呢,系統(tǒng)管理員至少應(yīng)該要熟悉一種字處理器的!
在 Linux 的世界中,絕大部分的配置文件都是以 ASCII 的純文本形態(tài)存在,因此利用簡單的文字編輯軟件就能夠修改設(shè)定了! 與微軟的 Windows 系統(tǒng)不同的是,如果你用慣了 Microsoft Word 或 Corel Wordperfect 的話,那么除了 X window 里面的圖形接口編輯程序(如 xemacs )用起來尚可應(yīng)付外,在 Linux 的文本模式下,會覺得文書編輯程序都沒有窗口接口來的直觀與方便。
Tips:
什么是純文本檔?其實檔案記錄的就是 0 與 1 ,而我們透過編碼系統(tǒng)來將這些 0 與 1 轉(zhuǎn)成我們認(rèn)識的文字就是了。 在 第零章里面的數(shù)據(jù)表示方式 有較多說明,請自行查閱。 ASCII 就是其中一種廣為使用的文字編碼系統(tǒng),在 ASCII 系統(tǒng)中的圖標(biāo)與代碼可以參考 http://zh.wikipedia.org/wiki/ASCII 呢! |
![]() |
那么 Linux 在文字接口下的文書編輯器有哪些呢?其實有非常多喔!常常聽到的就有:
emacs
,
pico
,
nano
,
joe
, 與
vim
等等(
注1
)。 既然有這么多文字接口的文書編輯器,那么我們?yōu)槭裁匆欢ㄒ獙W(xué) vi 啊?還有那個 vim 是做啥用的?底下就來談一談先!

文書編輯器那么多,我們之前在 第五章 也曾經(jīng)介紹過那簡單好用的 nano ,既然已經(jīng)學(xué)會了 nano ,干嘛鳥哥還一直要你學(xué)這不是很友善的 vi 呢?其實是有原因的啦!因為:
- 所有的 Unix Like 系統(tǒng)都會內(nèi)建 vi 文書編輯器,其他的文書編輯器則不一定會存在;
- 很多個別軟件的編輯接口都會主動呼叫 vi (例如未來會談到的 crontab , visudo , edquota 等指令);
- vim 具有程序編輯的能力,可以主動的以字體顏色辨別語法的正確性,方便程序設(shè)計;
- 因為程序簡單,編輯速度相當(dāng)快速。
其實重點(diǎn)是上述的第二點(diǎn),因為有太多 Linux 上面的指令都默認(rèn)使用 vi 作為數(shù)據(jù)編輯的接口,所以你必須、一定要學(xué)會 vi ,否則很多指令你根本就無法操作呢!這樣說,有刺激到你務(wù)必要學(xué)會 vi 的熱情了嗎? ^_^
那么什么是 vim 呢?其實你可以將 vim 視作 vi 的進(jìn)階版本,vim 可以用顏色或底線等方式來顯示一些特殊的信息。 舉例來說,當(dāng)你使用 vim 去編輯一個 C 程序語言的檔案,或者是我們后續(xù)會談到的 shell script 程序時,vim 會依據(jù)檔案的擴(kuò)展名或者是檔案內(nèi)的開頭信息, 判斷該檔案的內(nèi)容而自動的呼叫該程序的語法判斷式,再以顏色來顯示程序代碼與一般信息。也就是說, 這個 vim 是個『程序編輯器』啦!甚至一些 Linux 基礎(chǔ)配置文件內(nèi)的語法,都能夠用 vim 來檢查呢! 例如我們在第八章談到的 /etc/fstab 這個檔案的內(nèi)容。
簡單的來說, vi 是老式的字處理器,不過功能已經(jīng)很齊全了,但是還是有可以進(jìn)步的地方。 vim 則可以說是程序開發(fā)者的一項很好用的工具,就連 vim 的官方網(wǎng)站 ( http://www.vim.org ) 自己也說 vim 是一個『程序開發(fā)工具』而不是文字處理軟件~^_^。 因為 vim 里面加入了很多額外的功能,例如支持正規(guī)表示法的搜尋架構(gòu)、多檔案編輯、區(qū)塊復(fù)制等等。 這對于我們在 Linux 上面進(jìn)行一些配置文件的修訂工作時,是很棒的一項功能呢!
底下鳥哥會先就簡單的 vi 做個介紹,然后再跟大家報告一下 vim 的額外功能與用法呢!
基本上 vi 共分為三種模式,分別是『 一般模式 』、『 編輯模式 』與『 指令列命令模式 』。 這三種模式的作用分別是:
-
一般模式
:
以 vi 打開一個檔案就直接進(jìn)入一般模式了(這是默認(rèn)的模式)。在這個模式中, 你可以使用『上下左右』按鍵來移動光標(biāo),你可以使用『刪除字符』或『刪除整行』來處理檔案內(nèi)容, 也可以使用『復(fù)制、貼上』來處理你的文件數(shù)據(jù)。
-
編輯模式
:
在一般模式中可以進(jìn)行刪除、復(fù)制、貼上等等的動作,但是卻無法編輯文件內(nèi)容的! 要等到你按下『 i, I, o, O, a, A, r, R 』等任何一個字母之后才會進(jìn)入編輯模式。注意了!通常在 Linux 中,按下這些按鍵時,在畫面的左下方會出現(xiàn)『 INSERT 或 REPLACE 』的字樣,此時才可以進(jìn)行編輯。而如果要回到一般模式時, 則必須要按下『 Esc 』這個按鍵即可退出編輯模式。
-
指令列命令模式
:
在一般模式當(dāng)中,輸入『 : / ? 』三個中的任何一個按鈕,就可以將光標(biāo)移動到最底下那一行。在這個模式當(dāng)中, 可以提供你『搜尋資料』的動作,而讀取、存盤、大量取代字符、離開 vi 、顯示行號等等的動作則是在此模式中達(dá)成的!
簡單的說,我們可以將這三個模式想成底下的圖標(biāo)來表示:

圖 2.1、vi 三種模式的相互關(guān)系
注意到上面的圖示,你會發(fā)現(xiàn)
一般模式可與編輯模式及指令列模式切換, 但編輯模式與指令列模式之間不可互相切換
喔!這非常重要啦! 閑話不多說,我們底下以一個簡單的例子來進(jìn)行說明吧!

如果你想要使用 vi 來建立一個名為 test.txt 的檔案時,你可以這樣做:
-
使用 vi 進(jìn)入一般模式;
[root@www ~]# vi test.txt
圖 2.1.1、用 vi 開啟一個新檔案
如果你開啟的檔案是舊檔(已經(jīng)存在的檔案),則可能會出現(xiàn)如下的信息:
圖 2.1.2、用 vi 開啟一個舊檔案
如上圖 2.1.2 所示,箭頭所指的那個『"/etc/man.config" 141L, 4617C』代表的是『檔名為 /etc/man.conf, 檔案內(nèi)有 141 行 以及具有 4617 個字符』的意思! 那一行的內(nèi)容并不是在檔案內(nèi),而是 vi 顯示一些信息的地方喔!此時是在一般模式的環(huán)境下啦。 接下來開始來輸入吧!
-
按下 i 進(jìn)入編輯模式,開始編輯文字
在一般模式之中,只要按下 i, o, a 等字符就可以進(jìn)入編輯模式了!在編輯模式當(dāng)中,你可以發(fā)現(xiàn)在左下角狀態(tài)欄中會出現(xiàn) –INSERT- 的字樣,那就是可以輸入任意字符的提示啰!這個時候,鍵盤上除了 [Esc] 這個按鍵之外,其他的按鍵都可以視作為一般的輸入按鈕了,所以你可以進(jìn)行任何的編輯啰!
圖 2.1.3、開始用 vi 來進(jìn)行編輯 -
按下 [ESC] 按鈕回到一般模式
好了,假設(shè)我已經(jīng)按照上面的樣式給他編輯完畢了,那么應(yīng)該要如何退出呢?是的!沒錯!就是給他按下 [Esc] 這個按鈕即可!馬上你就會發(fā)現(xiàn)畫面左下角的 – INSERT – 不見了!
-
在一般模式中按下 :wq 儲存后離開 vi
OK,我們要存檔了,存盤并離開的指令很簡單,輸入『:wq』即可存檔離開! (注意了,按下 : 該光標(biāo)就會移動到最底下一行去!) 這時你在提示字符后面輸入『 ls -l 』即可看到我們剛剛建立的 test.txt 檔案啦!整個圖示有點(diǎn)像底下這樣:
圖 2.1.4、儲存并離開 vi 環(huán)境
如此一來,你的檔案 test.txt 就已經(jīng)建立起來啰!需要注意的是,如果你的檔案權(quán)限不對,例如為 -r--r--r-- 時,那么可能會無法寫入,此時可以使用『強(qiáng)制寫入』的方式嗎?可以!使用『 :wq! 』 多加一個驚嘆號即可!不過,需要特別注意呦!那個是在『你的權(quán)限可以改變』的情況下才能成立的! 關(guān)于權(quán)限的概念,請自行回去翻一下 第六章 的內(nèi)容吧!

除了上面簡易范例的 i, [Esc], :wq 之外,其實 vim 還有非常多的按鍵可以使用喔!在介紹之前還是要再次強(qiáng)調(diào), vim 的三種模式只有一般模式可以與編輯、指令列模式切換,編輯模式與指令列模式之間并不能切換的! 這點(diǎn)在
圖2.1
里面有介紹到,注意去看看喔!底下就來談?wù)?vim 軟件中會用到的按鍵功能吧!
- 第一部份:一般模式可用的按鈕說明,光標(biāo)移動、復(fù)制貼上、搜尋取代等
移動光標(biāo)的方法 | |
h 或 向左箭頭鍵(←) | 光標(biāo)向左移動一個字符 |
j 或 向下箭頭鍵(↓) | 光標(biāo)向下移動一個字符 |
k 或 向上箭頭鍵(↑) | 光標(biāo)向上移動一個字符 |
l 或 向右箭頭鍵(→) | 光標(biāo)向右移動一個字符 |
如果你將右手放在鍵盤上的話,你會發(fā)現(xiàn) hjkl 是排列在一起的,因此可以使用這四個按鈕來移動光標(biāo)。 如果想要進(jìn)行多次移動的話,例如向下移動 30 行,可以使用 "30j" 或 "30↓" 的組合按鍵, 亦即加上想要進(jìn)行的次數(shù)(數(shù)字)后,按下動作即可! | |
[Ctrl] + [f] | 屏幕『向下』移動一頁,相當(dāng)于 [Page Down]按鍵 ( 常用 ) |
[Ctrl] + [b] | 屏幕『向上』移動一頁,相當(dāng)于 [Page Up] 按鍵 ( 常用 ) |
[Ctrl] + [d] | 屏幕『向下』移動半頁 |
[Ctrl] + [u] | 屏幕『向上』移動半頁 |
+ | 光標(biāo)移動到非空格符的下一列 |
- | 光標(biāo)移動到非空格符的上一列 |
n<space> | 那個 n 表示『數(shù)字』,例如 20 。按下數(shù)字后再按空格鍵,光標(biāo)會向右移動這一行的 n 個字符。例如 20<space> 則光標(biāo)會向后面移動 20 個字符距離。 |
0 或功能鍵[Home] | 這是數(shù)字『 0 』:移動到這一行的最前面字符處 ( 常用 ) |
$ 或功能鍵[End] | 移動到這一行的最后面字符處( 常用 ) |
H | 光標(biāo)移動到這個屏幕的最上方那一行的第一個字符 |
M | 光標(biāo)移動到這個屏幕的中央那一行的第一個字符 |
L | 光標(biāo)移動到這個屏幕的最下方那一行的第一個字符 |
G | 移動到這個檔案的最后一行( 常用 ) |
nG | n 為數(shù)字。移動到這個檔案的第 n 行。例如 20G 則會移動到這個檔案的第 20 行(可配合 :set nu) |
gg | 移動到這個檔案的第一行,相當(dāng)于 1G 啊! ( 常用 ) |
n<Enter> | n 為數(shù)字。光標(biāo)向下移動 n 行( 常用 ) |
搜尋與取代 | |
/word | 向光標(biāo)之下尋找一個名稱為 word 的字符串。例如要在檔案內(nèi)搜尋 vbird 這個字符串,就輸入 /vbird 即可! ( 常用 ) |
?word | 向光標(biāo)之上尋找一個字符串名稱為 word 的字符串。 |
n | 這個 n 是英文按鍵。代表『 重復(fù)前一個搜尋的動作 』。舉例來說, 如果剛剛我們執(zhí)行 /vbird 去向下搜尋 vbird 這個字符串,則按下 n 后,會向下繼續(xù)搜尋下一個名稱為 vbird 的字符串。如果是執(zhí)行 ?vbird 的話,那么按下 n 則會向上繼續(xù)搜尋名稱為 vbird 的字符串! |
N | 這個 N 是英文按鍵。與 n 剛好相反,為『反向』進(jìn)行前一個搜尋動作。 例如 /vbird 后,按下 N 則表示『向上』搜尋 vbird 。 |
使用 /word 配合 n 及 N 是非常有幫助的!可以讓你重復(fù)的找到一些你搜尋的關(guān)鍵詞! | |
:n1,n2s/word1/word2/g |
n1 與 n2 為數(shù)字。在第 n1 與 n2 行之間尋找 word1 這個字符串,并將該字符串取代為 word2 !舉例來說,在 100 到 200 行之間搜尋 vbird 并取代為 VBIRD 則:
『:100,200s/vbird/VBIRD/g』。( 常用 ) |
:1,$s/word1/word2/g | 從第一行到最后一行尋找 word1 字符串,并將該字符串取代為 word2 !( 常用 ) |
:1,$s/word1/word2/gc | 從第一行到最后一行尋找 word1 字符串,并將該字符串取代為 word2 !且在取代前顯示提示字符給用戶確認(rèn) (confirm) 是否需要取代!( 常用 ) |
刪除、復(fù)制與貼上 | |
x, X | 在一行字當(dāng)中,x 為向后刪除一個字符 (相當(dāng)于 [del] 按鍵), X 為向前刪除一個字符(相當(dāng)于 [backspace] 亦即是退格鍵) ( 常用 ) |
nx | n 為數(shù)字,連續(xù)向后刪除 n 個字符。舉例來說,我要連續(xù)刪除 10 個字符, 『10x』。 |
dd | 刪除游標(biāo)所在的那一整列( 常用 ) |
ndd | n 為數(shù)字。刪除光標(biāo)所在的向下 n 列,例如 20dd 則是刪除 20 列 ( 常用 ) |
d1G | 刪除光標(biāo)所在到第一行的所有數(shù)據(jù) |
dG | 刪除光標(biāo)所在到最后一行的所有數(shù)據(jù) |
d$ | 刪除游標(biāo)所在處,到該行的最后一個字符 |
d0 | 那個是數(shù)字的 0 ,刪除游標(biāo)所在處,到該行的最前面一個字符 |
yy | 復(fù)制游標(biāo)所在的那一行( 常用 ) |
nyy | n 為數(shù)字。復(fù)制光標(biāo)所在的向下 n 列,例如 20yy 則是復(fù)制 20 列( 常用 ) |
y1G | 復(fù)制游標(biāo)所在列到第一列的所有數(shù)據(jù) |
yG | 復(fù)制游標(biāo)所在列到最后一列的所有數(shù)據(jù) |
y0 | 復(fù)制光標(biāo)所在的那個字符到該行行首的所有數(shù)據(jù) |
y$ | 復(fù)制光標(biāo)所在的那個字符到該行行尾的所有數(shù)據(jù) |
p, P | p 為將已復(fù)制的數(shù)據(jù)在光標(biāo)下一行貼上,P 則為貼在游標(biāo)上一行! 舉例來說,我目前光標(biāo)在第 20 行,且已經(jīng)復(fù)制了 10 行數(shù)據(jù)。則按下 p 后, 那 10 行數(shù)據(jù)會貼在原本的 20 行之后,亦即由 21 行開始貼。但如果是按下 P 呢? 那么原本的第 20 行會被推到變成 30 行。 ( 常用 ) |
J | 將光標(biāo)所在列與下一列的數(shù)據(jù)結(jié)合成同一列 |
c | 重復(fù)刪除多個數(shù)據(jù),例如向下刪除 10 行,[ 10cj ] |
u | 復(fù)原前一個動作。( 常用 ) |
[Ctrl]+r | 重做上一個動作。( 常用 ) |
這個 u 與 [Ctrl]+r 是很常用的指令!一個是復(fù)原,另一個則是重做一次~ 利用這兩個功能按鍵,你的編輯,嘿嘿!很快樂的啦! | |
. | 不要懷疑!這就是小數(shù)點(diǎn)!意思是重復(fù)前一個動作的意思。 如果你想要重復(fù)刪除、重復(fù)貼上等等動作,按下小數(shù)點(diǎn)『.』就好了! ( 常用 ) |
- 第二部份:一般模式切換到編輯模式的可用的按鈕說明
進(jìn)入插入或取代的編輯模式 | |
i, I |
進(jìn)入插入模式(Insert mode):
i 為『從目前光標(biāo)所在處插入』, I 為『在目前所在行的第一個非空格符處開始插入』。 ( 常用 ) |
a, A |
進(jìn)入插入模式(Insert mode):
a 為『從目前光標(biāo)所在的下一個字符處開始插入』, A 為『從光標(biāo)所在行的最后一個字符處開始插入』。( 常用 ) |
o, O |
進(jìn)入插入模式(Insert mode):
這是英文字母 o 的大小寫。o 為『在目前光標(biāo)所在的下一行處插入新的一行』; O 為在目前光標(biāo)所在處的上一行插入新的一行!( 常用 ) |
r, R |
進(jìn)入取代模式(Replace mode):
r 只會取代光標(biāo)所在的那一個字符一次;R會一直取代光標(biāo)所在的文字,直到按下 ESC 為止;( 常用 ) |
上面這些按鍵中,在 vi 畫面的左下角處會出現(xiàn)『--INSERT--』或『--REPLACE--』的字樣。 由名稱就知道該動作了吧!!特別注意的是,我們上面也提過了,你想要在檔案里面輸入字符時, 一定要在左下角處看到 INSERT 或 REPLACE 才能輸入喔! | |
[Esc] | 退出編輯模式,回到一般模式中( 常用 ) |
- 第三部份:一般模式切換到指令列模式的可用的按鈕說明
指令列的儲存、離開等指令 | |
:w | 將編輯的數(shù)據(jù)寫入硬盤檔案中( 常用 ) |
:w! | 若文件屬性為『只讀』時,強(qiáng)制寫入該檔案。不過,到底能不能寫入, 還是跟你對該檔案的檔案權(quán)限有關(guān)啊! |
:q | 離開 vi ( 常用 ) |
:q! | 若曾修改過檔案,又不想儲存,使用 ! 為強(qiáng)制離開不儲存檔案。 |
注意一下啊,那個驚嘆號 (!) 在 vi 當(dāng)中,常常具有『強(qiáng)制』的意思~ | |
:wq | 儲存后離開,若為 :wq! 則為強(qiáng)制儲存后離開 ( 常用 ) |
ZZ | 這是大寫的 Z 喔!若檔案沒有更動,則不儲存離開,若檔案已經(jīng)被更動過,則儲存后離開! |
:w [filename] | 將編輯的數(shù)據(jù)儲存成另一個檔案(類似另存新檔) |
:r [filename] | 在編輯的數(shù)據(jù)中,讀入另一個檔案的數(shù)據(jù)。亦即將 『filename』 這個檔案內(nèi)容加到游標(biāo)所在行后面 |
:n1,n2 w [filename] | 將 n1 到 n2 的內(nèi)容儲存成 filename 這個檔案。 |
:! command |
暫時離開 vi 到指令列模式下執(zhí)行 command 的顯示結(jié)果!例如
『:! ls /home』即可在 vi 當(dāng)中察看 /home 底下以 ls 輸出的檔案信息! |
vim 環(huán)境的變更 | |
:set nu | 顯示行號,設(shè)定之后,會在每一行的前綴顯示該行的行號 |
:set nonu | 與 set nu 相反,為取消行號! |
特別注意, 在 vi 中,『數(shù)字』是很有意義的!數(shù)字通常代表重復(fù)做幾次的意思! 也有可能是代表去到第幾個什么什么的意思。 舉例來說,要刪除 50 行,則是用 『50dd』 對吧! 數(shù)字加在動作之前~那我要向下移動 20 行呢?那就是『20j』或者是『20↓』即可。
OK!會這些指令就已經(jīng)很厲害了,因為常用到的指令也只有不到一半!通常 vi 的指令除了上面鳥哥注明的常用的幾個外,其他是不用背的,你可以做一張簡單的指令表在你的屏幕墻上, 一有疑問可以馬上的查詢呦!這也是當(dāng)初鳥哥使用 vim 的方法啦!

來來來!趕緊測試一下你是否已經(jīng)熟悉 vi 這個指令呢?請依照底下的需求進(jìn)行指令動作。 (底下的操作為使用 CentOS 5.2 中的 man.config 來做練習(xí)的,該檔案你可以在這里下載: http://vbird.dic.ksu.edu.tw/linux_basic/0310vi/man.config 。) 看看你的顯示結(jié)果與鳥哥的結(jié)果是否相同啊?
- 請在 /tmp 這個目錄下建立一個名為 vitest 的目錄;
- 進(jìn)入 vitest 這個目錄當(dāng)中;
- 將 /etc/man.config 復(fù)制到本目錄底下(或由上述的連結(jié)下載 man.config 檔案);
- 使用 vi 開啟本目錄下的 man.config 這個檔案;
- 在 vi 中設(shè)定一下行號;
- 移動到第 58 行,向右移動 40 個字符,請問你看到的雙引號內(nèi)是什么目錄?
- 移動到第一行,并且向下搜尋一下『 bzip2 』這個字符串,請問他在第幾行?
- 接著下來,我要將 50 到 100 行之間的『小寫 man 字符串』改為『大寫 MAN 字符串』,并且一個一個挑選是否需要修改,如何下達(dá)指令?如果在挑選過程中一直按『y』, 結(jié)果會在最后一行出現(xiàn)改變了幾個 man 呢?
- 修改完之后,突然反悔了,要全部復(fù)原,有哪些方法?
- 我要復(fù)制 65 到 73 這九行的內(nèi)容(含有MANPATH_MAP),并且貼到最后一行之后;
- 21 到 42 行之間的開頭為 # 符號的批注數(shù)據(jù)我不要了,要如何刪除?
- 將這個檔案另存成一個 man.test.config 的檔名;
- 去到第 27 行,并且刪除 15 個字符,結(jié)果出現(xiàn)的第一個單字是什么?
- 在第一行新增一行,該行內(nèi)容輸入『I am a student...』;
- 儲存后離開吧!
整個步驟可以如下顯示:
- 『mkdir /tmp/vitest』
- 『cd /tmp/vitest』
- 『cp /etc/man.config .』
- 『vi man.config』
- 『:set nu』然后你會在畫面中看到左側(cè)出現(xiàn)數(shù)字即為行號。
- 先按下『58G』再按下『40→』會看到『/dir/bin/foo』這個字樣在雙引號內(nèi);
- 先執(zhí)行『1G』或『gg』后,直接輸入『/bzip2』,則會去到第 118 行才對!
- 直接下達(dá)『 :50,100s/man/MAN/gc 』即可!若一直按『y』最終會出現(xiàn)『在 23 行內(nèi)置換 25 個字符串』的說明。
- (1)簡單的方法可以一直按『 u 』回復(fù)到原始狀態(tài),(2)使用不儲存離開『 :q! 』之后,再重新讀取一次該檔案;
- 『65G』 然后再『 9yy 』之后最后一行會出現(xiàn)『復(fù)制九行』之類的說明字樣。 按下『 G 』到最后一行,再給他『 p 』貼上九行!
- 因為 21~42 22 行,因此『 21G 』→『 22dd 』就能刪除 22 行,此時你會發(fā)現(xiàn)游標(biāo)所在 21 行的地方變成 MANPATH 開頭啰, 批注的 # 符號那幾行都被刪除了。
- 『 :w man.test.config 』,你會發(fā)現(xiàn)最后一行出現(xiàn) "man.test.config" [New].. 的字樣。
- 『27G』 之后,再給他『 15x 』即可刪除 15 個字符,出現(xiàn)『 you 』的字樣;
- 先『 1G 』去到第一行,然后按下大寫的『 O 』便新增一行且在插入模式;開始輸入『I am a student...』后, 按下[Esc]回到一般模式等待后續(xù)工作;
- 『:wq』
如果你的結(jié)果都可以查的到,那么 vi 的使用上面應(yīng)該沒有太大的問題啦!剩下的問題會是在…打字練習(xí)…。

在目前主要的編輯軟件都會有『回復(fù)』的功能,亦即當(dāng)你的系統(tǒng)因為某些原因而導(dǎo)致類似當(dāng)機(jī)的情況時, 還可以透過某些特別的機(jī)制來讓你將之前未儲存的數(shù)據(jù)『救』回來!這就是鳥哥這里所謂的『回復(fù)』功能啦! 那么 vim 有沒有回復(fù)功能呢?有的! vim 就是透過『暫存檔』來救援的啦!
當(dāng)我們在使用 vim 編輯時, vim 會在與被編輯的檔案的目錄下, 再建立一個名為 .filename.swp 的檔案 。 比如說我們在上一個小節(jié)談到的編輯 /tmp/vitest/man.config 這個檔案時, vim 會主動的建立 /tmp/vitest/.man.config.swp 的暫存檔,你對 man.config 做的動作就會被記錄到這個 .man.config.swp 當(dāng)中喔!如果你的系統(tǒng)因為某些原因斷線了, 導(dǎo)致你編輯的檔案還沒有儲存,這個時候 .man.config.swp 就能夠發(fā)會救援的功能了!我們來測試一下吧! 底下的練習(xí)有些部分的指令我們尚未談到,沒關(guān)系,你先照著做,后續(xù)再回來了解啰!
[root@www ~]# cd /tmp/vitest [root@www vitest]# vim man.config # 此時會進(jìn)入到 vim 的畫面,請在 vim 的一般模式下按下『 [ctrl]-z 』的組合鍵 [1]+ Stopped vim man.config <==按下 [ctrl]-z 會告訴你這個訊息 |
當(dāng)我們在 vim 的一般模式下按下 [ctrl]-z 的組合按鍵時,你的 vim 會被丟到背景去執(zhí)行! 這部份的功能我們會在 第十七章的程序管理 當(dāng)中談到, 你這里先知道一下即可。回到命令提示字符后,接下來我們來模擬將 vim 的工作不正常的中斷吧!
[root@www vitest]# ls -al total 48 drwxr-xr-x 2 root root 4096 Jan 12 14:48 . drwxrwxrwt 7 root root 4096 Jan 12 13:26 .. -rw-r--r-- 1 root root 4101 Jan 12 13:55 man.config -rw-r--r-- 1 root root 4096 Jan 12 14:48 .man.config.swp <==就是他,暫存檔 -rw-r--r-- 1 root root 4101 Jan 12 13:43 man.test.config [root@www vitest]# kill -9 %1 <==這里仿真斷線停止 vim 工作 [root@www vitest]# ls -al .man.config.swp -rw-r--r-- 1 root root 4096 Jan 12 14:48 .man.config.swp <==暫存檔還是會存在! |
那個 kill 可以仿真將系統(tǒng)的 vim 工作刪除的情況,你可以假裝當(dāng)機(jī)了啦! 由于 vim 的工作被不正常的中斷,導(dǎo)致暫存盤無法藉由正常流程來結(jié)束, 所以暫存檔就不會消失,而繼續(xù)保留下來。 此時如果你繼續(xù)編輯那個 man.config ,會出現(xiàn)什么情況呢? 會出現(xiàn)如下所示的狀態(tài)喔:
[root@www vitest]# vim man.config E325: ATTENTION <==錯誤代碼 Found a swap file by the name " .man.config.swp " <==底下數(shù)行說明有暫存檔的存在 owned by: root dated: Mon Jan 12 14:48:24 2009 file name: /tmp/vitest/man.config <==這個暫存盤屬于哪個實際的檔案? modified: no user name: root host name: www.vbird.tsai process ID: 11539 While opening file "man.config" dated: Mon Jan 12 13:55:07 2009 底下說明可能發(fā)生這個錯誤的兩個主要原因與解決方案! (1) Another program may be editing the same file. If this is the case, be careful not to end up with two different instances of the same file when making changes. Quit, or continue with caution. (2) An edit session for this file crashed. If this is the case, use ":recover" or "vim -r man.config" to recover the changes (see ":help recovery"). If you did this already, delete the swap file ".man.config.swp" to avoid this message. Swap file ".man.config.swp" already exists! 底下說明你可進(jìn)行的動作 [O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort: |
由于暫存盤存在的關(guān)系,因此 vim 會主動的判斷你的這個檔案可能有些問題,在上面的圖示中 vim 提示兩點(diǎn)主要的問題與解決方案,分別是這樣的:
-
問題一:可能有其他人或程序同時在編輯這個檔案:
由于 Linux 是多人多任務(wù)的環(huán)境,因此很可能有很多人同時在編輯同一個檔案。如果在多人共同編輯的情況下, 萬一大家同時儲存,那么這個檔案的內(nèi)容將會變的亂七八糟!為了避免這個問題,因此 vim 會出現(xiàn)這個警告窗口! 解決的方法則是:
-
找到另外那個程序或人員,請他將該 vim 的工作結(jié)束,然后你再繼續(xù)處理。
- 如果你只是要看該檔案的內(nèi)容并不會有任何修改編輯的行為,那么 可以選擇開啟成為只讀(O)檔案, 亦即上述畫面反白部分輸入英文『 o 』即可 ,其實就是 [O]pen Read-Only 的選項啦!
-
找到另外那個程序或人員,請他將該 vim 的工作結(jié)束,然后你再繼續(xù)處理。
-
問題二:在前一個 vim 的環(huán)境中,可能因為某些不知名原因?qū)е?vim 中斷 (crashed):
這就是常見的不正常結(jié)束 vim 產(chǎn)生的后果。解決方案依據(jù)不同的情況而不同喔!常見的處理方法為:
-
如果你之前的 vim 處理動作尚未儲存,此時你應(yīng)該要按下『R』,亦即使用 (R)ecover 的項目, 此時 vim 會載入 .man.config.swp 的內(nèi)容,讓你自己來決定要不要儲存!這樣就能夠救回來你之前未儲存的工作。 不過那個 .man.config.swp 并不會在你結(jié)束 vim 后自動刪除,所以
你離開 vim 后還得要自行刪除 .man.config.swp 才能避免每次打開這個檔案都會出現(xiàn)這樣的警告
!
- 如果你確定這個暫存盤是沒有用的,那么你可以直接按下『D』刪除掉這個暫存盤,亦即 (D)elete it 這個項目即可。 此時 vim 會載入 man.config ,并且將舊的 .man.config.swp 刪除后,建立這次會使用的新的 .man.config.swp 喔!
-
如果你之前的 vim 處理動作尚未儲存,此時你應(yīng)該要按下『R』,亦即使用 (R)ecover 的項目, 此時 vim 會載入 .man.config.swp 的內(nèi)容,讓你自己來決定要不要儲存!這樣就能夠救回來你之前未儲存的工作。 不過那個 .man.config.swp 并不會在你結(jié)束 vim 后自動刪除,所以
你離開 vim 后還得要自行刪除 .man.config.swp 才能避免每次打開這個檔案都會出現(xiàn)這樣的警告
!
至于這個發(fā)現(xiàn)暫存盤警告訊息的畫面中,有出現(xiàn)六個可用按鈕,各按鈕的說明如下:
-
[O]pen Read-Only:
打開此檔案成為只讀檔, 可以用在你只是想要查閱該檔案內(nèi)容并不想要進(jìn)行編輯行為時。一般來說,在上課時,如果你是登入到同學(xué)的計算機(jī)去看他的配置文件, 結(jié)果發(fā)現(xiàn)其實同學(xué)他自己也在編輯時,可以使用這個模式;
-
(E)dit anyway
:還是用正常的方式打開你要編輯的那個檔案, 并不會載入暫存檔的內(nèi)容。不過很容易出現(xiàn)兩個使用者互相改變對方的檔案等問題!不好不好!
-
(R)ecover
:就是加載暫存盤的內(nèi)容,用在你要救回之前未儲存的工作。 不過當(dāng)你救回來并且儲存離開 vim 后,還是要手動自行刪除那個暫存檔喔!
-
(D)elete it
:你確定那個暫存檔是無用的!那么開啟檔案前會先將這個暫存盤刪除! 這個動作其實是比較常做的!因為你可能不確定這個暫存檔是怎么來的,所以就刪除掉他吧!哈哈!
-
(Q)uit
:按下 q 就離開 vim ,不會進(jìn)行任何動作回到命令提示字符。
- (A)bort :忽略這個編輯行為,感覺上與 quit 非常類似! 也會送你回到命令提示字符就是啰!
其實,目前大部分的 distributions 都以 vim 取代 vi 的功能了!如果你使用 vi 后,卻看到畫面的右下角有顯示目前光標(biāo)所在的行列號碼,那么你的 vi 已經(jīng)被 vim 所取代啰~ 為什么要用 vim 呢?因為 vim 具有顏色顯示的功能,并且還支持許多的程序語法 (syntax), 因此,當(dāng)你使用 vim 編輯程序時( 不論是 C 語言,還是 shell script ), 我們的 vim 將可幫你直接進(jìn)行『程序除錯 (debug)』的功能!真的很不賴吧!^_^
如果你在文本模式下,輸入 alias 時,出現(xiàn)這樣的畫面:
[root@www ~]# alias ....其他省略.... alias vi='vim' <==重點(diǎn)在這行啊! |
這表示當(dāng)你使用 vi 這個指令時,其實就是執(zhí)行 vim 啦!如果你沒有這一行,那么你就必須要使用 vim filename 來啟動 vim 啰!基本上, vim 的一般用法與 vi 完全一模一樣~沒有不同啦!那么我們就來看看 vim 的畫面是怎樣啰!假設(shè)我想要編輯 /etc/man.config ,則輸入『 vim /etc/man.config 』

圖3.0.1、 vim 的圖示示意
上面是 vim 的畫面示意圖,在這個畫面中有幾點(diǎn)特色要說明喔:
- 由于 man.config 是系統(tǒng)規(guī)劃的配置文件,因此 vim 會進(jìn)行語法檢驗,所以你會看到畫面中內(nèi)部主要為深藍(lán)色, 且深藍(lán)色那一行是以批注符號 (#) 為開頭;
- 最底下一行的左邊顯示該檔案的屬性,包括 141行與 4617 字符;
- 最底下一行的右邊出現(xiàn)的 1,1 表示光標(biāo)所在為第一行, 第一個字符位置之意(請看一下上圖中的游標(biāo)所在);
所以,如果你向下移動到其他位置時,出現(xiàn)的非批注的數(shù)據(jù)就會有點(diǎn)像這樣:

圖3.0.2、 vim 的圖示示意
看到了喔!除了批注之外,其他的行就會有特別的顏色顯示呢!可以避免你打錯字啊!而且, 最右下角的 30% 代表目前這個畫面占整體檔案的 30% 之意!這樣瞭乎?

剛剛我們提到的簡單的 vi 操作過程中,幾乎提到的都是以行為單位的操作。那么如果我想要搞定的是一個區(qū)塊范圍呢? 舉例來說,像底下這種格式的檔案:
192.168.1.1 host1.class.net 192.168.1.2 host2.class.net 192.168.1.3 host3.class.net 192.168.1.4 host4.class.net .....中間省略...... |
這個檔案我將他放置到 http://vbird.dic.ksu.edu.tw/linux_basic/0310vi/hosts ,你可以自行下載來看一看這個檔案啊!現(xiàn)在我們來玩一玩這個檔案吧!假設(shè)我想要將 host1, host2... 等等復(fù)制起來, 并且加到每一行的后面,亦即每一行的結(jié)果要是『 192.168.1.2 host2.class.net host2 』這樣的情況時, 在傳統(tǒng)或現(xiàn)代的窗口型編輯器似乎不容易達(dá)到這個需求,但是咱們的 vim 是辦的到的喔!那就使用區(qū)塊選擇 (Visual Block) 吧!當(dāng)我們按下 v 或者 V 或者 [Ctrl]+v 時, 這個時候光標(biāo)移動過的地方就會開始反白,這三個按鍵的意義分別是:
區(qū)塊選擇的按鍵意義 | |
v | 字符選擇,會將光標(biāo)經(jīng)過的地方反白選擇! |
V | 行選擇,會將光標(biāo)經(jīng)過的行反白選擇! |
[Ctrl]+v | 區(qū)塊選擇,可以用長方形的方式選擇資料 |
y | 將反白的地方復(fù)制起來 |
d | 將反白的地方刪除掉 |
來實際進(jìn)行我們需要的動作吧!就是將 host 再加到每一行的最后面,你可以這樣做:
- 使用 vim hosts 來開啟該檔案,記得該檔案請由 上述的連結(jié) 下載先!
-
將光標(biāo)移動到第一行的 host 那個 h 上頭,然后按下 [ctrl]-v ,左下角出現(xiàn)區(qū)塊示意字樣:
圖 3.1.1、進(jìn)入?yún)^(qū)塊功能的示意圖 -
將光標(biāo)移動到最底部,此時光標(biāo)移動過的區(qū)域會反白!如下圖所示:
圖 3.1.2、區(qū)塊選擇的結(jié)果示意圖 - 此時你可以按下『 y 』來進(jìn)行復(fù)制,當(dāng)你按下 y 之后,反白的區(qū)塊就會消失不見啰!
-
最后,將光標(biāo)移動到第一行的最右邊,并且再用編輯模式向右按兩個空格鍵,回到一般模式后, 再按下『 p 』后,你會發(fā)現(xiàn)很有趣!如下圖所示:
圖 3.1.3、將區(qū)塊的資料貼上后的結(jié)果
透過上述的功能,你可以復(fù)制一個區(qū)塊,并且是貼在某個『區(qū)塊的范圍』內(nèi),而不是以行為單位來處理你的整份文件喔! 鳥哥個人是覺得這玩意兒非常的有幫助啦!至少在進(jìn)行排列整齊的文本文件中復(fù)制/刪除區(qū)塊時,會是一個非常棒的功能!

假設(shè)一個例子,你想要將剛剛我們的 hosts 內(nèi)的 IP 復(fù)制到你的 /etc/hosts 這個檔案去, 那么該如何編輯?我們知道在 vi 內(nèi)可以使用 :r filename 來讀入某個檔案的內(nèi)容, 不過,這樣畢竟是將整個檔案讀入啊!如果我只是想要部分內(nèi)容呢?呵呵!這個時候多檔案同時編輯就很有用了。 我們可以使用 vim 后面同時接好幾個檔案來同時開啟喔!相關(guān)的按鍵有:
多檔案編輯的按鍵 | |
:n | 編輯下一個檔案 |
:N | 編輯上一個檔案 |
:files | 列出目前這個 vim 的開啟的所有檔案 |
在過去,鳥哥想要將 A 檔案內(nèi)的十條消息『移動』到 B 檔案去,通常要開兩個 vim 窗口來復(fù)制, 偏偏每個 vim 都是獨(dú)立的,因此并沒有辦法在 A 檔案下達(dá)『 nyy 』再跑到 B 檔案去『 p 』啦! 在這種情況下最常用的方法就是透過鼠標(biāo)圈選, 復(fù)制后貼上。不過這樣一來還是有問題,因為鳥哥超級喜歡使用 [Tab] 按鍵進(jìn)行編排對齊動作, 透過鼠標(biāo)卻會將 [Tab] 轉(zhuǎn)成空格鍵,這樣內(nèi)容就不一樣了!此時這個多檔案編輯就派上用場了!
現(xiàn)在你可以做一下練習(xí)看看說!假設(shè)你要將剛剛鳥哥提供的 hosts 內(nèi)的前四行 IP 數(shù)據(jù)復(fù)制到你的 /etc/hosts 檔案內(nèi),那可以怎么進(jìn)行呢?可以這樣啊:
- 透過『 vim hosts /etc/hosts 』指令來使用一個 vim 開啟兩個檔案;
-
在 vim 中先使用『 :files 』察看一下編輯的檔案數(shù)據(jù)有啥?結(jié)果如下所示。 至于下圖的最后一行顯示的是『按下任意鍵』就會回到 vim 的一般模式中!
圖 3.2.1、多檔案編輯示意圖" - 在第一行輸入『 4yy 』復(fù)制四行;
- 在 vim 的環(huán)境下輸入『 :n 』會來到第二個編輯的檔案,亦即 /etc/hosts 內(nèi);
- 在 /etc/hosts 下按『 G 』到最后一行,再輸入『 p 』貼上;
- 按下多次的『 u 』來還原原本的檔案數(shù)據(jù);
- 最終按下『 :q 』來離開 vim 的多檔案編輯吧!
看到了吧?利用多檔案編輯的功能,可以讓你很快速的就將需要的資料復(fù)制到正確的檔案內(nèi)。 當(dāng)然啰,這個功能也可以利用窗口接口來達(dá)到,那就是底下要提到的多窗口功能。

在開始這個小節(jié)前,先來想象兩個情況:
-
當(dāng)我有一個檔案非常的大,我查閱到后面的數(shù)據(jù)時,想要『對照』前面的數(shù)據(jù), 是否需要使用 [ctrl]+f 與 [ctrl]+b (或 pageup, pagedown 功能鍵) 來跑前跑后查閱?
- 我有兩個需要對照著看的檔案,不想使用前一小節(jié)提到的多檔案編輯功能;
在一般窗口接口下的編輯軟件大多有『分割窗口』或者是『凍結(jié)窗口』的功能來將一個檔案分割成多個窗口的展現(xiàn), 那么 vim 能不能達(dá)到這個功能啊?可以啊!但是如何分割窗口并放入檔案呢? 很簡單啊!在指令列模式輸入『:sp {filename}』即可!那個 filename 可有可無, 如果想要在新窗口啟動另一個檔案,就加入檔名,否則僅輸入 :sp 時, 出現(xiàn)的則是同一個檔案在兩個窗口間 !
讓我們來測試一下,你先使用『 vim /etc/man.config 』打開這個檔案,然后『 1G 』去到第一行,之后輸入『 :sp 』 再次的打開這個檔案一次,然后再輸入『 G 』,結(jié)果會變成底下這樣喔:

圖 3.3.1、窗口分割的示意圖
萬一你再輸入『 :sp /etc/hosts 』時,就會變成下圖這樣喔:

圖 3.3.2、窗口分割的示意圖
怎樣?帥吧!兩個檔案同時在一個屏幕上面顯示,你還可以利用『[ctrl]+w+↑』及『[ctrl]+w+↓』 在兩個窗口之間移動呢!這樣的話,復(fù)制啊、查閱啊等等的,就變的很簡單啰~ 分割窗口的相關(guān)指令功能有很多,不過你只要記得這幾個就好了:
多窗口情況下的按鍵功能 | |
:sp [filename] | 開啟一個新窗口,如果有加 filename, 表示在新窗口開啟一個新檔案,否則表示兩個窗口為同一個檔案內(nèi)容(同步顯示)。 |
[ctrl]+w+ j
[ctrl]+w+↓ |
按鍵的按法是:先按下 [ctrl] 不放, 再按下 w 后放開所有的按鍵,然后再按下 j (或向下箭頭鍵),則光標(biāo)可移動到下方的窗口。 |
[ctrl]+w+ k
[ctrl]+w+↑ |
同上,不過光標(biāo)移動到上面的窗口。 |
[ctrl]+w+ q | 其實就是 :q 結(jié)束離開啦! 舉例來說,如果我想要結(jié)束下方的窗口,那么利用 [ctrl]+w+↓ 移動到下方窗口后,按下 :q 即可離開, 也可以按下 [ctrl]+w+q 啊! |
鳥哥第一次玩 vim 的分割窗口時,真是很高興啊!竟然有這種功能!太棒了! ^_^

有沒有發(fā)現(xiàn),如果我們以 vim 軟件來搜尋一個檔案內(nèi)部的某個字符串時,這個字符串會被反白, 而下次我們再次以 vim 編輯這個檔案時,該搜尋的字符串反白情況還是存在呢!甚至于在編輯其他檔案時, 如果其他檔案內(nèi)也存在這個字符串,哇!竟然還是主動反白耶!真神奇! 另外,當(dāng)我們重復(fù)編輯同一個檔案時,當(dāng)?shù)诙芜M(jìn)入該檔案時, 游標(biāo)竟然就在上次離開的那一行上頭呢!真是好方便啊~但是,怎么會這樣呢?
這是因為我們的 vim 會主動的將你曾經(jīng)做過的行為登錄下來,好讓你下次可以輕松的作業(yè)啊! 那個記錄動作的檔案就是: ~/.viminfo !如果你曾經(jīng)使用過 vim, 那你的家目錄應(yīng)該會存在這個檔案才對。這個檔案是自動產(chǎn)生的, 你不必自行建立。而你在 vim 里頭所做過的動作,就可以在這個檔案內(nèi)部查詢到啰~ ^_^
此外,每個 distributions 對 vim 的預(yù)設(shè)環(huán)境都不太相同,舉例來說,某些版本在搜尋到關(guān)鍵詞時并不會高亮度反白, 有些版本則會主動的幫你進(jìn)行縮排的行為。但這些其實都可以自行設(shè)定的,那就是 vim 的環(huán)境設(shè)定啰~ vim 的環(huán)境設(shè)定參數(shù)有很多,如果你想要知道目前的設(shè)定值,可以在一般模式時輸入『 :set all 』 來查閱,不過.....設(shè)定項目實在太多了~所以,鳥哥在這里僅列出一些平時比較常用的一些簡單的設(shè)定值, 提供給你參考啊。
vim 的環(huán)境設(shè)定參數(shù) | |
:set nu
:set nonu |
就是設(shè)定與取消行號啊! |
:set hlsearch
:set nohlsearch |
hlsearch 就是 high light search(高亮度搜尋)。 這個就是設(shè)定是否將搜尋的字符串反白的設(shè)定值。默認(rèn)值是 hlsearch |
:set autoindent
:set noautoindent |
是否自動縮排?autoindent 就是自動縮排。 |
:set backup | 是否自動儲存?zhèn)浞輽n?一般是 nobackup 的, 如果設(shè)定 backup 的話,那么當(dāng)你更動任何一個檔案時,則源文件會被另存成一個檔名為 filename~ 的檔案。 舉例來說,我們編輯 hosts ,設(shè)定 :set backup ,那么當(dāng)更動 hosts 時,在同目錄下,就會產(chǎn)生 hosts~ 文件名的檔案,記錄原始的 hosts 檔案內(nèi)容 |
:set ruler | 還記得我們提到的右下角的一些狀態(tài)欄說明嗎? 這個 ruler 就是在顯示或不顯示該設(shè)定值的啦! |
:set showmode | 這個則是,是否要顯示 --INSERT-- 之類的字眼在左下角的狀態(tài)欄。 |
:set backspace=(012) | 一般來說, 如果我們按下 i 進(jìn)入編輯模式后,可以利用退格鍵 (backspace) 來刪除任意字符的。 但是,某些 distribution 則不許如此。此時,我們就可以透過 backspace 來設(shè)定啰~ 當(dāng) backspace 為 2 時,就是可以刪除任意值;0 或 1 時,僅可刪除剛剛輸入的字符, 而無法刪除原本就已經(jīng)存在的文字了! |
:set all | 顯示目前所有的環(huán)境參數(shù)設(shè)定值。 |
:set | 顯示與系統(tǒng)默認(rèn)值不同的設(shè)定參數(shù), 一般來說就是你有自行變動過的設(shè)定參數(shù)啦! |
:syntax on
:syntax off |
是否依據(jù)程序相關(guān)語法顯示不同顏色? 舉例來說,在編輯一個純文本檔時,如果開頭是以 # 開始,那么該行就會變成藍(lán)色。 如果你懂得寫程序,那么這個 :syntax on 還會主動的幫你除錯呢!但是, 如果你僅是編寫純文本檔案,要避免顏色對你的屏幕產(chǎn)生的干擾,則可以取消這個設(shè)定 。 |
:set bg=dark
:set bg=light |
可用以顯示不同的顏色色調(diào),預(yù)設(shè)是『 light 』。如果你常常發(fā)現(xiàn)批注的字體深藍(lán)色實在很不容易看, 那么這里可以設(shè)定為 dark 喔!試看看,會有不同的樣式呢! |
總之,這些設(shè)定值很有用處的啦!但是......我是否每次使用 vim 都要重新設(shè)定一次各個參數(shù)值? 這不太合理吧?沒錯啊!所以,我們可以透過配置文件來直接規(guī)定我們習(xí)慣的 vim 操作環(huán)境呢! 整體 vim 的設(shè)定值一般是放置在 /etc/vimrc 這個檔案,不過,不建議你修改他! 你可以修改 ~/.vimrc 這個檔案 (預(yù)設(shè)不存在,請你自行手動建立!),將你所希望的設(shè)定值寫入! 舉例來說,可以是這樣的一個檔案:
[root@www ~]# vim ~/.vimrc "這個檔案的雙引號 (") 是批注 set hlsearch "高亮度反白 set backspace=2 "可隨時用退格鍵刪除 set autoindent "自動縮排 set ruler "可顯示最后一行的狀態(tài) set showmode "左下角那一行的狀態(tài) set nu "可以在每一行的最前面顯示行號啦! set bg=dark "顯示不同的底色色調(diào) syntax on "進(jìn)行語法檢驗,顏色顯示。 |
在這個檔案中,使用『 set hlsearch 』或『 :set hlsearch 』,亦即最前面有沒有冒號『 : 』效果都是一樣的! 至于雙引號則是批注符號!不要用錯批注符號,否則每次使用 vim 時都會發(fā)生警告訊息喔! 建立好這個檔案后,當(dāng)你下次重新以 vim 編輯某個檔案時,該檔案的預(yù)設(shè)環(huán)境設(shè)定就是上頭寫的啰~ 這樣,是否很方便你的操作啊!多多利用 vim 的環(huán)境設(shè)定功能呢!^_^

vim 其實不是那么好學(xué),雖然他的功能確實非常強(qiáng)大!所以底下我們還有一些需要注意的地方要來跟大家分享喔!

很多朋友常常哀嚎,說他們的 vim 里面怎么無法顯示正常的中文啊?其實這很有可能是因為編碼的問題! 因為中文編碼有 big5 與 utf8 兩種,如果你的檔案是使用 big5 編碼制作的,但在 vim 的終端接口中你使用的是萬國碼(utf8), 由于編碼的不同,你的中文檔案內(nèi)容當(dāng)然就是一堆亂碼了!怎么辦?這時你得要考慮許多東西啦!有這些:
- 你的 Linux 系統(tǒng)默認(rèn)支持的語系數(shù)據(jù):這與 /etc/sysconfig/i18n 有關(guān);
- 你的終端界面 (bash) 的語系: 這與 LANG 這個變數(shù)有關(guān);
- 你的檔案原本的編碼;
- 開啟終端機(jī)的軟件,例如在 GNOME 底下的窗口接口。
事實上最重要的是上頭的第三與第四點(diǎn),只要這兩點(diǎn)的編碼一致,你就能夠正確的看到與編輯你的中文檔案。 否則就會看到一堆亂碼啦!
一般來說,中文編碼使用 big5 時,在寫入某些數(shù)據(jù)庫系統(tǒng)中,在『許、蓋、功』這些字體上面會發(fā)生錯誤! 所以近期以來大多希望大家能夠使用萬國碼 utf8 來進(jìn)行中文編碼!但是在 Windows XP 上的軟件常常默認(rèn)使用 big5 的編碼, 包括鳥哥由于沿用以前的文件數(shù)據(jù)文件,也大多使用 big5 的編碼。此時就得要注意上述的這些咚咚啰。
在 Linux 本機(jī)前的 tty1~tty6 原本默認(rèn)就不支持中文編碼,所以不用考慮這個問題!因為你一定會看到亂碼!呵呵! 現(xiàn)在鳥哥假設(shè)俺的文件檔案內(nèi)編碼為 big5 時,而且我的環(huán)境是使用 Linux 的 GNOME ,啟動的終端接口為 GNOME-terminal 軟件, 那鳥哥通常是這樣來修正語系編碼的行為:
[root@www ~]#
LANG=zh_TW.big5
|
然后在終端接口工具欄的 『終端機(jī)』-->『設(shè)定字符編碼』 -->『中文 (正體) (BIG5)』 項目點(diǎn)選一下, 如果一切都沒有問題了,再用 vim 去開啟那個 big5 編碼的檔案,就沒有問題了!以上!報告完畢!

我們在 第七章 里面談到 cat 這個指令時,曾經(jīng)提到過 DOS 與 Linux 斷行字符的不同。 而我們也可以利用 cat -A 來觀察以 DOS (Windows 系統(tǒng)) 建立的檔案的特殊格式, 也可以發(fā)現(xiàn)在 DOS 使用的斷行字符為 ^M$ ,我們稱為 CR 與 LF 兩個符號。 而在 Linux 底下,則是僅有 LF ($) 這個斷行符號。這個斷行符號對于 Linux 的影響很大喔! 為什么呢?
我們說過,在 Linux 底下的指令在開始執(zhí)行時,他的判斷依據(jù)是 『Enter』,而 Linux 的 Enter 為 LF 符號, 不過,由于 DOS 的斷行符號是 CRLF ,也就是多了一個 ^M 的符號出來, 在這樣的情況下,如果是一個 shell script 的程序檔案,呵呵~將可能造成『程序無法執(zhí)行』的狀態(tài)~ 因為他會誤判程序所下達(dá)的指令內(nèi)容啊!這很傷腦筋吧!
那怎么辦啊?很簡單啊,將格式轉(zhuǎn)換成為 Linux 即可啊!『廢話』,這當(dāng)然大家都知道,但是, 要以 vi 進(jìn)入該檔案,然后一個一個刪除每一行的 CR 嗎?當(dāng)然沒有這么沒人性啦! 我們可以透過簡單的指令來進(jìn)行格式的轉(zhuǎn)換啊!
[root@www ~]# dos2unix [-kn] file [newfile] [root@www ~]# unix2dos [-kn] file [newfile] 選項與參數(shù): -k :保留該檔案原本的 mtime 時間格式 (不更新檔案上次內(nèi)容經(jīng)過修訂的時間) -n :保留原本的舊檔,將轉(zhuǎn)換后的內(nèi)容輸出到新檔案,如: dos2unix -n old new 范例一:將剛剛上述練習(xí)的 /tmp/vitest/man.config 修改成為 dos 斷行 [root@www ~]# cd /tmp/vitest [root@www vitest]# cp -a /etc/man.config . [root@www vitest]# ll man.config -rw-r--r-- 1 root root 4617 Jan 6 2007 man.config [root@www vitest]# unix2dos -k man.config unix2dos: converting file man.config to DOS format ... # 屏幕會顯示上述的訊息,說明斷行轉(zhuǎn)為 DOS 格式了! [root@www vitest]# ll man.config -rw-r--r-- 1 root root 4758 Jan 6 2007 man.config # 斷行字符多了 ^M ,所以容量增加了! 范例二:將上述的 man.config 轉(zhuǎn)成 man.config.linux 的 Linux 斷行字符 [root@www vitest]# dos2unix -k -n man.config man.config.linux dos2unix: converting file man.config to file man.config.linux in UNIX format ... [root@www vitest]# ll man.config* -rw-r--r-- 1 root root 4758 Jan 6 2007 man.config -rw------- 1 root root 4617 Jan 6 2007 man.config.linux |
因為斷行字符以及 DOS 與 Linux 操作系統(tǒng)底下一些字符的定義不同,因此, 不建議你在 Windows 系統(tǒng)當(dāng)中將檔案編輯好之后,才上傳到 Linux 系統(tǒng),會容易發(fā)生錯誤問題。 而且,如果你在不同的系統(tǒng)之間復(fù)制一些純文本檔案時,千萬記得要使用 unix2dos 或 dos2unix 來轉(zhuǎn)換一下斷行格式啊!

很多朋友都會有的問題,就是想要將語系編碼進(jìn)行轉(zhuǎn)換啦!舉例來說,想要將 big5 編碼轉(zhuǎn)成 utf8 。 這個時候怎么辦?難不成要每個檔案打開會轉(zhuǎn)存成 utf8 嗎?不需要這樣做啦!使用 iconv 這個指令即可! 鳥哥將之前的 vi 章節(jié)做成 big5 編碼的檔案,你可以照底下的連結(jié)來下載先:
在終端機(jī)的環(huán)境下你可以使用『 wget 網(wǎng)址』來下載上述的檔案喔!鳥哥將他下載在 /tmp/vitest 目錄下。 接下來讓我們來使用 iconv 這個指令來玩一玩編碼轉(zhuǎn)換吧!
[root@www ~]# iconv --list [root@www ~]# iconv -f 原本編碼 -t 新編碼 filename [-o newfile] 選項與參數(shù): --list :列出 iconv 支持的語系數(shù)據(jù) -f :from ,亦即來源之意,后接原本的編碼格式; -t :to ,亦即后來的新編碼要是什么格式; -o file:如果要保留原本的檔案,那么使用 -o 新檔名,可以建立新編碼檔案。 范例一:將 /tmp/vitest/vi.big5 轉(zhuǎn)成 utf8 編碼吧! [root@www ~]# cd /tmp/vitest [root@www vitest]# iconv -f big5 -t utf8 vi.big5 -o vi.utf8 [root@www vitest]# file vi* vi.big5: ISO-8859 text, with CRLF line terminators vi.utf8: UTF-8 Unicode text, with CRLF line terminators # 是吧!有明顯的不同吧! ^_^ |
這指令支持的語系非常之多,除了正體中文的 big5, utf8 編碼之外,也支持簡體中文的 gb2312 , 所以對岸的朋友可以簡單的將鳥站的網(wǎng)頁數(shù)據(jù)下載后,利用這個指令來轉(zhuǎn)成簡體,就能夠輕松的讀取文件數(shù)據(jù)啰! 不過,不要將轉(zhuǎn)成簡體的檔案又上傳成為您自己的網(wǎng)頁啊!這明明是鳥哥寫的不是嗎? ^_^
不過如果是要將正體中文的 utf8 轉(zhuǎn)成簡體中文的 utf8 編碼時,那就得費(fèi)些功夫了! 舉例來說,如果要將剛剛那個 vi.utf8 轉(zhuǎn)成簡體的 utf8 時,可以這樣做:
[root@www vitest]# iconv -f utf8 -t big5 vi.utf8 | \ > iconv -f big5 -t gb2312 | iconv -f gb2312 -t utf8 -o vi.gb.utf8 |
- Linux 底下的配置文件多為文本文件,故使用 vim 即可進(jìn)行設(shè)定編輯;
- vim 可視為程序編輯器,可用以編輯 shell script, 配置文件等,避免打錯字;
- vi 為所有 unix like 的操作系統(tǒng)都會存在的編輯器,且執(zhí)行速度快速;
- vi 有三種模式,一般模式可變換到編輯與指令列模式,但編輯模式與指令列模式不能互換;
- 常用的按鍵有i, [Esc], :wq 等;
- vi 的畫面大略可分為兩部份,(1)上半部的本文與(2)最后一行的狀態(tài)+指令列模式;
- 數(shù)字是有意義的,用來說明重復(fù)進(jìn)行幾次動作的意思,如 5yy 為復(fù)制 5 行之意;
- 光標(biāo)的移動中,大寫的 G 經(jīng)常使用,尤其是 1G, G 移動到文章的頭/尾功能!
- vi 的取代功能也很棒! :n1,n2s/old/new/g 要特別注意學(xué)習(xí)起來;
- 小數(shù)點(diǎn)『 . 』為重復(fù)進(jìn)行前一次動作,也是經(jīng)常使用的按鍵功能!
- 進(jìn)入編輯模式幾乎只要記住: i, o, R 三個按鈕即可!尤其是新增一行的 o 與取代的 R
- vim 會主動的建立 swap 暫存檔,所以不要隨意斷線!
- 如果在文章內(nèi)有對齊的區(qū)塊,可以使用 [ctrl]-v 進(jìn)行復(fù)制/貼上/刪除的行為
- 使用 :sp 功能可以分割窗口
- vim 的環(huán)境設(shè)定可以寫入在 ~/.vimrc 檔案中;
- 可以使用 iconv 進(jìn)行檔案語系編碼的轉(zhuǎn)換
- 使用 dos2unix 及 unix2dos 可以變更檔案每一行的行尾斷行字符。
本章練習(xí)
(要看答案請將鼠標(biāo)移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看)
-
在第八章的情境模擬題二的第五點(diǎn),編寫 /etc/fstab 時,當(dāng)時使用 nano 這個指令, 請嘗試使用 vim 去編輯 /etc/fstab ,并且將第八章新增的那一行的 defatuls 改成 default ,會出現(xiàn)什么狀態(tài)? 離開前請務(wù)必要修訂成原本正確的信息。此外,如果將該行批注 (最前面加 #),你會發(fā)現(xiàn)字體顏色也有變化喔!
-
嘗試在你的系統(tǒng)中,你慣常使用的那個賬號的家目錄下,將本章介紹的 vimrc 內(nèi)容進(jìn)行一些常用設(shè)定,包括:
- 設(shè)定搜尋高亮度反白
- 設(shè)定語法檢驗啟動
- 設(shè)定默認(rèn)啟動行號顯示
- 設(shè)定有兩行狀態(tài)欄 (一行狀態(tài)+一行指令列) :set laststatus=2
簡答題部分:
-
我用 vi 開啟某個檔案后,要在第 34 行向右移動 15 個字符,應(yīng)該在一般模式中下達(dá)什么指令?
(1)先按下 34G 到第 34 行;(2)再按下 [ 15 + 向右鍵 ],或 [ 15l ] 亦可!
-
在 vi 開啟的檔案中,如何去到該檔案的頁首或頁尾?
去頁首按下 1G 或 gg ;去頁尾按下 G 即可
-
在 vi 開啟的檔案中,如何在光標(biāo)所在行中,移動到行頭及行尾?
移動到行頭,按 0 ,移動到行尾按 $ 即可!
-
vi 的一般模式情況下,按下『 r 』有什么功能?
取代光標(biāo)所在的那個字符
-
在 vi 的環(huán)境中,如何將目前正在編輯的檔案另存新檔名為 newfilename?
:w newfilename
-
在 linux 底下最常使用的文書編輯器為 vi ,請問如何進(jìn)入編輯模式?
在一般模式底下輸入: i, I, a, A 為在本行當(dāng)中輸入新字符;(出現(xiàn) –Insert- )
在一般模式當(dāng)中輸入: o, O 為在一個新的一行輸入新字符;
在一般模式當(dāng)中輸入: r, R 為取代字符!(左下角出現(xiàn) –Replace-) -
在 vi 軟件中,如何由編輯模式跳回一般模式?
可以按下[Esc]
-
在 vi 環(huán)境中,若上下左右鍵無法使用時,請問如何在一般模式移動光標(biāo)?
[h, j, k, l]分別代表[左、下、上、右]
-
在 vi 的一般模式中,如何刪除一行、n行;如何刪除一個字符?
分別為 dd, ndd, x 或 X (dG 及 d1G 分別表示刪除到頁首及頁尾)
-
在 vi 的一般模式中,如何復(fù)制一行、n行并加以貼上?
分別為 yy, nyy, p 或 P
-
在 vi 的一般模式中如何搜尋 string 這個字符串?
?string (往前搜尋)
/string (往后搜尋) -
在 vi 的一般模式中,如何取代 word1 成為 word2,而若需要使用者確認(rèn)機(jī)制,又該如何?
:1,$s/word1/word2/g 或
:1,$s/word1/word2/gc (需要使用者確認(rèn)) -
在 vi 目前的編輯檔案中,在一般模式下,如何讀取一個檔案 filename 進(jìn)來目前這個檔案?
:r filename
-
在 vi 的一般模式中,如何存盤、離開、存檔后離開、強(qiáng)制存檔后離開?
:w; :q: :wq; :wq!
-
在 vi 底下作了很多的編輯動作之后,卻想還原成原來的檔案內(nèi)容,應(yīng)該怎么進(jìn)行?
直接按下 :e! 即可恢復(fù)成檔案的原始狀態(tài)!
-
我在 vi 這個程序當(dāng)中,不想離開 vi ,但是想執(zhí)行 ls /home 這個指令,vi 有什么額外的功能可以達(dá)到這個目的:
事實上,可以使用[ :! ls /home ]不過,如果你學(xué)過后面的章節(jié)之后,你會發(fā)現(xiàn),執(zhí)行[ ctrl + z ]亦可暫時退出 vi 讓你在指令列模式當(dāng)中執(zhí)行指令喔!
- 維基百科:ASCII 的代碼與圖示對應(yīng)表: http://zh.wikipedia.org/wiki/ASCII
-
注1:常見文書編輯器項目計劃連結(jié):
- emacs: http://www.gnu.org/software/emacs/
- pico: http://www.ece.uwaterloo.ca/~ece250/Online/Unix/pico/
- nano: http://sourceforge.net/projects/nano/
- joe: http://sourceforge.net/projects/joe-editor/
- vim: http://www.vim.org
- 常見文書編輯器比較: http://encyclopedia.thefreedictionary.com/List+of+text+editors
- 維基百科的文書編輯器比較: http://en.wikipedia.org/wiki/Comparison_of_text_editors
- 關(guān)于 vim 是什么的『中文』說明: http://www.vim.org/6k/features.zh.txt 。
- 李果正兄的:大家來學(xué) vim (http://info.sayya.org/~edt1023/vim/)
-
麥克星球 Linux Fedora 心得筆記:
正體/簡體中文的轉(zhuǎn)換方法: http://blog.xuite.net/michaelr/linux/15650102
?來源:http://vbird.dic.ksu.edu.tw/linux_basic/0310vi.php
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
