为什么要使用vi?
vi是一个很不友好的文本编辑器,但为什么还要使用它?因為:
- 所有的 Unix Like 系統都會內建 vi 文書編輯器,其他的文書編輯器則不一定會存在;
- 很多個別軟體的編輯介面都會主動呼叫 vi
- vim 具有程式編輯的能力,可以主動的以字體顏色辨別語法的正確性,方便程式設計;
- 因為程式簡單,編輯速度相當快速。
什麼是 vim ?
你可以將 vim 視作 vi 的進階版本,vim 可以用顏色或底線等方式來顯示一些特殊的資訊。目前大部分的 distributions 都以 vim 取代 vi 的功能了。如果你使用 vi 後,卻看到畫面的右下角有顯示目前游標所在的行列號碼,那麼你的 vi 已經被 vim 所取代。舉例來說,當你使用 vim 去編輯一個 C 程式語言的檔案,或者是我們後續會談到的 shell script 程式時,vim 會依據檔案的副檔名或者是檔案內的開頭資訊, 判斷該檔案的內容而自動的呼叫該程式的語法判斷式,再以顏色來顯示程式碼與一般資訊
vi 的使用
基本上 vi 共分為三種模式,分別是『一般模式』、『編輯模式』與『指令列命令模式』。 這三種模式的作用分別是:
- 一般模式:
以 vi 打開一個檔案就直接進入一般模式了(這是預設的模式)。在這個模式中, 你可以使用『上下左右』按鍵來移動游標,你可以使用『刪除字元』或『刪除整行』來處理檔案內容,也可以使用『複製、貼上』來處理你的文件資料。在一般模式中可以進行刪除、複製、貼上等等的動作,但是卻無法編輯文件內容的!
- 編輯模式:
在一般模式中可以進行刪除、複製、貼上等等的動作,但是卻無法編輯文件內容的! 要等到你按下『i, I, o, O, a, A, r, R』等任何一個字母之後才會進入編輯模式。通常在 Linux 中,按下這些按鍵時,在畫面的左下方會出現『 INSERT 或 REPLACE 』的字樣,此時才可以進行編輯。而如果要回到一般模式時, 則必須要按下『Esc』這個按鍵即可退出編輯模式。该模式下鍵盤上除了 [Esc] 這個按鍵之外,其他的按鍵都可以視作為一般的輸入按鈕了,所以你可以進行任何的編輯囉!
- 指令列命令模式:
在一般模式當中,輸入『: / ?』三個中的任何一個按鈕,就可以將游標移動到最底下那一行。在這個模式當中, 可以提供你『搜尋資料』的動作,而讀取、存檔、大量取代字元、離開 vi 、顯示行號等等的動作則是在此模式中達成的!最重要的指令就是“:wq”,它会保存当前文档并離開 vi
vi 三種模式的關係图
注意:一般模式可與編輯模式及指令列模式切換, 但編輯模式與指令列模式之間不可互相切換
一般模式可用的按鈕說明,游標移動、複製貼上、搜尋取代等
移動游標的方法 | |
h 或 向左方向鍵(←) | 游標向左移動一個字元 |
j 或 向下方向鍵(↓) | 游標向下移動一個字元 |
k 或 向上方向鍵(↑) | 游標向上移動一個字元 |
l 或 向右方向鍵(→) | 游標向右移動一個字元 |
如果你將右手放在鍵盤上的話,你會發現 hjkl 是排列在一起的,因此可以使用這四個按鈕來移動游標。 如果想要進行多次移動的話,例如向下移動 30 行,可以使用 "30j" 或 "30↓" 的組合按鍵, 亦即加上想要進行的次數(數字)後,按下動作即可! | |
[Ctrl] + [f] | 螢幕『向下』移動一頁,相當於 [Page Down]按鍵 (常用) |
[Ctrl] + [b] | 螢幕『向上』移動一頁,相當於 [Page Up] 按鍵 (常用) |
[Ctrl] + [d] | 螢幕『向下』移動半頁 |
[Ctrl] + [u] | 螢幕『向上』移動半頁 |
+ | 游標移動到非空白字元的下一列 |
- | 游標移動到非空白字元的上一列 |
n<space> | 那個 n 表示『數字』,例如 20 。按下數字後再按空白鍵,游標會向右移動這一行的 n 個字元。例如 20<space> 則游標會向後面移動 20 個字元距離。 |
0 或功能鍵[Home] | 這是數字『 0 』:移動到這一行的最前面字元處 (常用) |
$ 或功能鍵[End] | 移動到這一行的最後面字元處(常用) |
H | 游標移動到這個螢幕的最上方那一行的第一個字元 |
M | 游標移動到這個螢幕的中央那一行的第一個字元 |
L | 游標移動到這個螢幕的最下方那一行的第一個字元 |
G | 移動到這個檔案的最後一行(常用) |
nG | n 為數字。移動到這個檔案的第 n 行。例如 20G 則會移動到這個檔案的第 20 行(可配合 :set nu) |
Gg | 移動到這個檔案的第一行,相當於 1G 啊! (常用) |
n<Enter> | n 為數字。游標向下移動 n 行(常用) |
搜尋與取代 | |
/word | 向游標之下尋找一個名稱為 word 的字串。例如要在檔案內搜尋 vbird 這個字串,就輸入 /vbird 即可! (常用) |
?word | 向游標之上尋找一個字串名稱為 word 的字串。 |
n | 這個 n 是英文按鍵。代表『重複前一個搜尋的動作』。舉例來說, 如果剛剛我們執行 /vbird 去向下搜尋 vbird 這個字串,則按下 n 後,會向下繼續搜尋下一個名稱為 vbird 的字串。如果是執行 ?vbird 的話,那麼按下 n 則會向上繼續搜尋名稱為 vbird 的字串! |
N | 這個 N 是英文按鍵。與 n 剛好相反,為『反向』進行前一個搜尋動作。 例如 /vbird 後,按下 N 則表示『向上』搜尋 vbird 。 |
使用 /word 配合 n 及 N 是非常有幫助的!可以讓你重複的找到一些你搜尋的關鍵字! | |
:n1,n2s/word1/word2/g | n1 與 n2 為數字。在第 n1 與 n2 行之間尋找 word1 這個字串,並將該字串取代為 word2 !舉例來說,在 100 到 200 行之間搜尋 vbird 並取代為 VBIRD 則: |
:1,$s/word1/word2/g | 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 !(常用) |
:1,$s/word1/word2/gc | 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 !且在取代前顯示提示字元給使用者確認 (confirm) 是否需要取代!(常用) |
刪除、複製與貼上 | |
x, X | 在一行字當中,x 為向後刪除一個字元 (相當於 [del] 按鍵), X 為向前刪除一個字元(相當於 [backspace] 亦即是倒退鍵) (常用) |
Nx | n 為數字,連續向後刪除 n 個字元。舉例來說,我要連續刪除 10 個字元, 『10x』。 |
Dd | 刪除游標所在的那一整列(常用) |
Ndd | n 為數字。刪除游標所在的向下 n 列,例如 20dd 則是刪除 20 列 (常用) |
d1G | 刪除游標所在到第一行的所有資料 |
dG | 刪除游標所在到最後一行的所有資料 |
d$ | 刪除游標所在處,到該行的最後一個字元 |
d0 | 那個是數字的 0 ,刪除游標所在處,到該行的最前面一個字元 |
Yy | 複製游標所在的那一行(常用) |
Nyy | n 為數字。複製游標所在的向下 n 列,例如 20yy 則是複製 20 列(常用) |
y1G | 複製游標所在列到第一列的所有資料 |
yG | 複製游標所在列到最後一列的所有資料 |
y0 | 複製游標所在的那個字元到該行行首的所有資料 |
y$ | 複製游標所在的那個字元到該行行尾的所有資料 |
p, P | p 為將已複製的資料在游標下一行貼上,P 則為貼在游標上一行! 舉例來說,我目前游標在第 20 行,且已經複製了 10 行資料。則按下 p 後, 那 10 行資料會貼在原本的 20 行之後,亦即由 21 行開始貼。但如果是按下 P 呢? 那麼原本的第 20 行會被推到變成 30 行。 (常用) |
J | 將游標所在列與下一列的資料結合成同一列 |
C | 重複刪除多個資料,例如向下刪除 10 行,[ 10cj ] |
U | 復原前一個動作。(常用) |
[Ctrl]+r | 重做上一個動作。(常用) |
這個 u 與 [Ctrl]+r 是很常用的指令!一個是復原,另一個則是重做一次~ 利用這兩個功能按鍵,你的編輯,嘿嘿!很快樂的啦! | |
. | 不要懷疑!這就是小數點!意思是重複前一個動作的意思。 如果你想要重複刪除、重複貼上等等動作,按下小數點『.』就好了! (常用) |
一般模式切換到編輯模式的可用的按鈕說明
進入插入或取代的編輯模式 | |
i, I | 進入插入模式(Insert mode): |
a, A | 進入插入模式(Insert mode): |
o, O | 進入插入模式(Insert mode): |
r, R | 進入取代模式(Replace mode): |
上面這些按鍵中,在 vi 畫面的左下角處會出現『--INSERT--』或『--REPLACE--』的字樣。 由名稱就知道該動作了吧!!特別注意的是,我們上面也提過了,你想要在檔案裡面輸入字元時, 一定要在左下角處看到 INSERT 或 REPLACE 才能輸入喔! | |
[Esc] | 退出編輯模式,回到一般模式中(常用) |
一般模式切換到指令列模式的可用的按鈕說明
指令列的儲存、離開等指令 | |
:w | 將編輯的資料寫入硬碟檔案中(常用) |
:w! | 若檔案屬性為『唯讀』時,強制寫入該檔案。不過,到底能不能寫入, 還是跟你對該檔案的檔案權限有關啊! |
:q | 離開 vi (常用) |
:q! | 若曾修改過檔案,又不想儲存,使用 ! 為強制離開不儲存檔案。 |
注意一下啊,那個驚嘆號 (!) 在 vi 當中,常常具有『強制』的意思~ | |
:wq | 儲存後離開,若為 :wq! 則為強制儲存後離開 (常用) |
ZZ | 這是大寫的 Z 喔!若檔案沒有更動,則不儲存離開,若檔案已經被更動過,則儲存後離開! |
:w [filename] | 將編輯的資料儲存成另一個檔案(類似另存新檔) |
:r [filename] | 在編輯的資料中,讀入另一個檔案的資料。亦即將 『filename』 這個檔案內容加到游標所在行後面 |
:n1,n2 w [filename] | 將 n1 到 n2 的內容儲存成 filename 這個檔案。 |
:! command | 暫時離開 vi 到指令列模式下執行 command 的顯示結果!例如 |
vim 環境的變更 | |
:set nu | 顯示行號,設定之後,會在每一行的字首顯示該行的行號 |
:set nonu | 與 set nu 相反,為取消行號! |
vim 的暫存檔、救援回復與開啟時的警告訊息
vim有『回復』的功能,亦即當你的系統因為某些原因而導致類似當機的情況時, 還可以透過某些特別的機制來讓你將之前未儲存的資料『救』回來。vim 就是透過『暫存檔』來救援。
當我們在使用 vim 編輯時, vim 會在與被編輯的檔案的目錄下,再建立一個名為 .filename.swp 的檔案。如果你的系統因為某些原因斷線了, 導致你編輯的檔案還沒有儲存,這個時候 .man.config.swp 就能夠發會救援的功能了
我们做以下测试
[root@www vitest]# vim man.config
# 此時進入到 vim ,在vim 的一般模式下按下『 [ctrl]-z 』的組合鍵
# 你的 vim 會被丟到背景去執行
[1]+ Stopped vim man.config <==按下 [ctrl]-z 會告訴你這個訊息
接下來我們來模擬將 vim 的工作不正常的中斷
[root@www vitest]# ls -al
-rw-r--r-- 1 root root 4101 Jan 12 man.config
-rw-r--r-- 1 root root 4096 Jan 12 .man.config.swp <==就是他,暫存檔
[root@www vitest]# kill -9 %1 <==這裡模擬斷線停止 vim 工作
[root@www vitest]# ls -al .man.config.swp
-rw-r--r-- 1 root root 4096 Jan .man.config.swp <==暫存檔還是會存在!
此時如果你繼續編輯那個 man.config ,會出現什麼情況呢?
[root@www vitest]# vim man.config
E325: ATTENTION <==錯誤代碼
Found a swap file by the name ".man.config.swp" <==說明有暫存檔
owned by: root dated: Mon Jan 12 14:48:24 2009
file name: /tmp/vitest/man.config <==這個暫存檔屬於哪個實際的檔案?
While opening file "man.config"
dated: Mon Jan 12 13:55:07 2009
底下說明可能發生這個錯誤的兩個主要原因與解決方案!
(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!底下說明你可進行的動作
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
由於暫存檔存在的關係,因此 vim 會主動的判斷你的這個檔案可能有些問題,在上面的圖示中 vim 提示兩點主要的問題與解決方案,分別是這樣的:
- 問題一:可能有其他人或程式同時在編輯這個檔案:
由於 Linux 是多人多工的環境,因此很可能有很多人同時在編輯同一個檔案。如果在多人共同編輯的情況下,萬一大家同時儲存,那麼這個檔案的內容將會變的亂七八糟!為了避免這個問題,因此 vim 會出現這個警告視窗! 解決的方法則是:
-
- 找到另外那個程式或人員,請他將該 vim 的工作結束,然後你再繼續處理。
- 如果你只是要看該檔案的內容並不會有任何修改編輯的行為,那麼可以選擇開啟成為唯讀(O)檔案, 亦即上述畫面反白部分輸入英文『 o 』即可,其實就是 [O]pen Read-Only 的選項啦!
- 問題二:在前一個 vim 的環境中,可能因為某些不知名原因導致 vim 中斷 (crashed):
這就是常見的不正常結束 vim 產生的後果。解決方案依據不同的情況而不同喔!常見的處理方法為:
-
- 如果你之前的 vim 處理動作尚未儲存,此時你應該要按下『R』,亦即使用 (R)ecover 的項目, 此時 vim 會載入 .man.config.swp 的內容,讓你自己來決定要不要儲存!這樣就能夠救回來你之前未儲存的工作。 不過那個 .man.config.swp 並不會在你結束 vim 後自動刪除,所以你離開 vim 後還得要自行刪除 .man.config.swp 才能避免每次打開這個檔案都會出現這樣的警告!
- 如果你確定這個暫存檔是沒有用的,那麼你可以直接按下『D』刪除掉這個暫存檔,亦即 (D)elete it 這個項目即可。 此時 vim 會載入 man.config ,並且將舊的 .man.config.swp 刪除後,建立這次會使用的新的 .man.config.swp 喔!
至於這個發現暫存檔警告訊息的畫面中,有出現六個可用按鈕,各按鈕說明如下:
- [O]pen Read-Only:打開此檔案成為唯讀檔,可以用在你只是想要查閱該檔案內容並不想要進行編輯行為時。一般來說,在上課時,如果你是登入到同學的電腦去看他的設定檔, 結果發現其實同學他自己也在編輯時,可以使用這個模式;
- (E)dit anyway:還是用正常的方式打開你要編輯的那個檔案, 並不會載入暫存檔的內容。不過很容易出現兩個使用者互相改變對方的檔案等問題!不好不好!
- (R)ecover:就是載入暫存檔的內容,用在你要救回之前未儲存的工作。 不過當你救回來並且儲存離開 vim 後,還是要手動自行刪除那個暫存檔喔!
- (D)elete it:你確定那個暫存檔是無用的!那麼開啟檔案前會先將這個暫存檔刪除! 這個動作其實是比較常做的!因為你可能不確定這個暫存檔是怎麼來的,所以就刪除掉他吧!哈哈!
- (Q)uit:按下 q 就離開 vim ,不會進行任何動作回到命令提示字元。
- (A)bort:忽略這個編輯行為,感覺上與 quit 非常類似! 也會送你回到命令提示字元就是囉!
VIM的區塊選擇(Visual Block)功能
这是一个非常重要的功能!例如,对于下面这个文件:
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
如果我想将每一行的”host#”复制到每一行的尾部,亦即每一行的結果要是『 192.168.1.2 host2.class.net host2 』這樣的情況時, 在傳統或現代的視窗型編輯器似乎不容易達到這個需求,但是vim 是辦的到的喔!那就使用區塊選擇 (Visual Block) 吧!當我們按下 v 或者 V 或者 [Ctrl]+v 時, 這個時候游標移動過的地方就會開始反白,這三個按鍵的意義分別是:
區塊選擇的按鍵意義 | |
v | 字元選擇,會將游標經過的地方反白選擇! |
V | 行選擇,會將游標經過的行反白選擇! |
[Ctrl]+v | 區塊選擇,可以用長方形的方式選擇資料 |
y | 將反白的地方複製起來 |
d | 將反白的地方刪除掉 |
那么將 host# 再加到每一行的最後面,你可以這樣做:
- 用vim打开該檔案
- 將游標移動到第一行的 host 那個 h 上頭,然後按下 [ctrl]-v ,左下角出現區塊示意字樣:
- 將游標移動到最底部,此時游標移動過的长方形區域會反白!
- 按下『 y 』來進行複製,當你按下 y 之後,反白的區塊就會消失不見囉!
- 最後,將游標移動到第一行的最右邊,並且再用編輯模式向右按兩個空白鍵,回到一般模式後, 再按下『 p 』後即可!
透過该功能,你可以複製一個區塊,並且是貼在某個『區塊的範圍』內,而不是以行為單位來處理你的整份文件喔!
通过VIM进行多檔案編輯
假設想要將file 1里的某些内容复制到file 2里,那么在vim里该如何操作?我們知道在 vi 內可以使用 :r filename 來讀入某個檔案的內容, 不過,這樣畢竟是將整個檔案讀入啊!如果我只是想要部分內容呢?呵呵!這個時候多檔案同時編輯就很有用了。 我們可以使用 vim 後面同時接好幾個檔案來同時開啟喔!相關的按鍵有:
多檔案編輯的按鍵 | |
:n | 編輯下一個檔案 (在vim里档案切换是通过:n or :N) |
:N | 編輯上一個檔案 (在vim里档案切换是通过:n or :N) |
:files | 列出目前這個 vim 的開啟的所有檔案 |
如果你想同时开兩個 vim視窗来打开file 1和file 2來複製,是行不通的,每個 vim 都是獨立的,因此並沒有辦法在 A 檔案下達『 nyy 』再跑到 B 檔案去『 p 』啦! 在這種情況下最常用的方法就是透過滑鼠圈選, 複製後貼上。不過這樣一來還是有問題,因為鳥哥超級喜歡使用 [Tab] 按鍵進行編排對齊動作, 透過滑鼠卻會將 [Tab] 轉成空白鍵,這樣內容就不一樣了!此時這個多檔案編輯就派上用場了!
下面演示如何通过vim来copy file 1 some content to file 2:
- 透過『 vim file1 file2 』指令來使用一個 vim 開啟兩個檔案;
- 在 vim 中先使用『 :files 』察看一下編輯的檔案資料有啥?結果会列出2 files: file1 and file2。『按下任意鍵』就會回到 vim 的一般模式中!
- 而此时vim显示的是第一个文件file1的内容。在第一行輸入『 4yy 』複製四行;
- 在 vim 的環境下輸入『 :n 』會來到第二個檔案file2;
- 在file2下按『 G 』到最後一行,再輸入『 p 』貼上;
- 按下多次的『 u 』來還原原本的檔案資料;
- 最終按下『 :q 』來離開 vim 的多檔案編輯吧!
另外,对多个文档进行编辑也可以利用視窗介面來達到,那就是底下要提到的多視窗功能。
多視窗功能
在開始這個小節前,先來想像兩個情況:
- 當我有一個檔案非常的大,我查閱到後面的資料時,想要『對照』前面的資料, 是否需要使用 [ctrl]+f 與 [ctrl]+b (或 pageup, pagedown 功能鍵) 來跑前跑後查閱?
- 我有兩個需要對照著看的檔案,而前一小節提到的多檔案編輯功能并不能同时显示多个档案,只能逐个显示;
这种情况,vim的『分割視窗』功能就最适用!使用分割视窗只需要在指令列模式輸入『:sp {filename}』即可!那個 filename 可有可無, 如果想要在新視窗啟動另一個檔案,就加入檔名,否則僅輸入 :sp 時, 出現的則是同一個檔案在兩個視窗間!
來測試一下,你先使用『vim file1』打開這個檔案,之後輸入『:sp』 就会出现分割窗口来再打开file1一次。当你再輸入『:sp file2』時,就会再开一个分割窗口打开file2.
当多个檔案同時在一個vim螢幕上面时,可以利用『[ctrl]+w+↑』及『[ctrl]+w+↓』 在視窗之間移動呢!分割視窗的相關指令功能有很多,不過你只要記得這幾個就好了:
多視窗情況下的按鍵功能 | |
:sp [filename] | 開啟一個新視窗,如果有加 filename, 表示在新視窗開啟一個新檔案,否則表示兩個視窗為同一個檔案內容(同步顯示)。 |
[ctrl]+w+ j | 按鍵的按法是:先按下 [ctrl] 不放, 再按下 w 後放開所有的按鍵,然後再按下 j (或向下方向鍵),則游標可移動到下方的視窗。 |
[ctrl]+w+ k | 同上,不過游標移動到上面的視窗。 |
[ctrl]+w+ q | 其實就是 :q 結束離開啦! 舉例來說,如果我想要結束下方的視窗,那麼利用 [ctrl]+w+↓ 移動到下方視窗後,按下 :q 即可離開, 也可以按下 [ctrl]+w+q 啊! |
vim 常用指令示意圖
VIM解决DOS 與 Linux 的斷行字元
DOS 與 Linux 斷行字元的不同。在 DOS 使用的斷行字元為 ^M$ ,我們稱為 CR 與 LF 兩個符號。 而在 Linux 底下,則是僅有 LF ($) 這個斷行符號。這個斷行符號對於 Linux 的影響很大喔! 為什麼呢?
在 Linux 底下的指令在開始執行時,他的判斷依據是 『Enter』,而 Linux 的 Enter 為 LF 符號, 不過,由於 DOS 的斷行符號是 CRLF ,也就是多了一個 ^M 的符號出來, 在這樣的情況下,如果是一個 shell script 的程式檔案,呵呵~將可能造成『程式無法執行』的狀態~ 因為他會誤判程式所下達的指令內容啊!這很傷腦筋吧!
那怎麼辦啊?很簡單啊,將格式轉換成為 Linux 即可啊!『廢話』,這當然大家都知道,但是, 要以 vi 進入該檔案,然後一個一個刪除每一行的 CR 嗎?當然沒有這麼沒人性啦! 我們可以透過簡單的指令來進行格式的轉換啊!
[root@www ~]# dos2unix [-kn] file [newfile]
[root@www ~]# unix2dos [-kn] file [newfile]
選項與參數:
-k:保留該檔案原本的 mtime 時間格式 (不更新檔案上次內容經過修訂的時間)
-n:保留原本的舊檔,將轉換後的內容輸出到新檔案,如: dos2unix -n old new
範例一:將剛剛上述練習的 /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 ...
# 螢幕會顯示上述的訊息,說明斷行轉為 DOS 格式了!
範例二:將上述的 man.config 轉成 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 作業系統底下一些字符的定義不同,因此, 不建議你在 Windows 系統當中將檔案編輯好之後,才上傳到 Linux 系統,會容易發生錯誤問題。 而且,如果你在不同的系統之間複製一些純文字檔案時,千萬記得要使用 unix2dos 或 dos2unix 來轉換一下斷行格式啊!
VIM中文編碼的問題
若发现vim 裡無法顯示正常的中文,其實這很有可能是因為編碼的問題!因為中文編碼有 big5 與 utf8 兩種,如果你的檔案是使用 big5 編碼製作的,但在 vim 的終端介面中你使用的是萬國碼(utf8), 由於編碼的不同,你的中文檔案內容當然就是一堆亂碼了!怎麼辦?這時你得要考慮許多東西啦!有這些:
- 你的 Linux 系統預設支援的語系資料:這與/etc/sysconfig/i18n有關;
- 你的終端介面 (bash) 的語系: 這與 LANG 這個變數有關;
- 你的檔案原本的編碼;
- 開啟終端機的軟體,例如在 GNOME 底下的視窗介面。
事實上最重要的是上頭的第三與第四點,只要這兩點的編碼一致,你就能夠正確的看到與編輯你的中文檔案。否則就會看到一堆亂碼啦!
一般來說,中文編碼使用 big5 時,在寫入某些資料庫系統中,在『許、蓋、功』這些字體上面會發生錯誤!所以近期以來大多希望大家能夠使用萬國碼 utf8 來進行中文編碼!但是在 Windows XP 上的軟體常常預設使用 big5 的編碼, 包括鳥哥由於沿用以前的文件資料檔案,也大多使用 big5 的編碼。此時就得要注意上述的這些咚咚囉。
在 Linux 本機前的 tty1~tty6 原本預設就不支援中文編碼,所以不用考慮這個問題!因為你一定會看到亂碼!呵呵! 現在鳥哥假設俺的文件檔案內編碼為 big5 時,而且我的環境是使用 Linux 的 GNOME ,啟動的終端介面為 GNOME-terminal 軟體, 那鳥哥通常是這樣來修正語系編碼的行為:
[root@www ~]# LANG=zh_TW.big5
然後在終端介面工具列的『終端機』-->『設定字元編碼』 -->『中文 (正體) (BIG5)』項目點選一下, 如果一切都沒有問題了,再用 vim 去開啟那個 big5 編碼的檔案,就沒有問題了!以上!報告完畢!
語系編碼轉換
很多朋友都會有的問題,就是想要將語系編碼進行轉換啦!想要將文件由big5 編碼轉成 utf8 ,使用 iconv 這個指令即可!
接下來看看如何使用 iconv 這個指令来把一个big5编码的file “file_big5”进行編碼轉換吧!
[root@www ~]# iconv --list
[root@www ~]# iconv -f 原本編碼 -t 新編碼 filename [-o newfile]
選項與參數:
--list :列出 iconv 支援的語系資料
-f :from ,亦即來源之意,後接原本的編碼格式;
-t :to ,亦即後來的新編碼要是什麼格式;
-o file:如果要保留原本的檔案,那麼使用 -o 新檔名,可以建立新編碼檔案。
範例一:將big5编码的file “file_big5” 轉成 utf8 編碼吧!
[root@www vitest]# iconv -f big5 -t utf8 file_big5 -o file_utf8
這指令支援的語系非常之多,除了正體中文的 big5, utf8 編碼之外,也支援簡體中文的 gb2312 , 所以對岸的朋友可以簡單的將鳥站的網頁資料下載後,利用這個指令來轉成簡體,就能夠輕鬆的讀取文件資料囉! 不過,不要將轉成簡體的檔案又上傳成為您自己的網頁啊!這明明是鳥哥寫的不是嗎? ^_^
不過如果是要將正體中文的 utf8 轉成簡體中文的 utf8 編碼時,那就得費些功夫了!舉例來說,如果要將剛剛那個 vi.utf8 轉成簡體的 utf8 時,可以這樣做:
[root@www vitest]# iconv -f utf8 -t big5 file_utf8 | /
> iconv -f big5 -t gb2312 | iconv -f gb2312 -t utf8 -o file_gb_utf8