Linux系列3:vi與vim編輯器

0 引言

編輯文件需要使用文件編輯器,vi是很多Linux內建的編輯器。vi是一個功能強大的編輯器。而將vim 可以視作 vi 的進階版本,vim 可以用顏色或底線等方式來顯示一些特殊的信息。舉例來說,當你使用 vim 去編輯一個 C 程序語言的檔案,或者是我們後續會談到的 shell script 程序時,vim 會依據檔案的擴展名或者是檔案內的開頭信息, 判斷該檔案的內容而自動的呼叫該程序的語法判斷式,再以顏色來顯示程序代碼與一般信息。也就是說, 這個 vim 是個『程序編輯器』啦!甚至一些 Linux 基礎配置文件內的語法,都能夠用 vim 來檢查呢!

1 vi的使用

1.1 vi的模式介紹

基本上 vi 共分爲三種模式,分別是『一般模式』、『編輯模式』與『指令列命令模式』。 這三種模式的作用分別是:

  • 一般模式:
    以 vi 打開一個檔案就直接進入一般模式了(這是默認的模式)。在這個模式中, 你可以使用『上下左右』按鍵來移動光標,你可以使用『刪除字符』或『刪除整行』來處理檔案內容, 也可以使用『複製、貼上』來處理你的文件數據。

  • 編輯模式:
    在一般模式中可以進行刪除、複製、貼上等等的動作,但是卻無法編輯文件內容的! 要等到你按下『i, I, o, O, a, A, r, R』等任何一個字母之後纔會進入編輯模式。注意了!通常在 Linux 中,按下這些按鍵時,在畫面的左下方會出現『 INSERT 或 REPLACE 』的字樣,此時纔可以進行編輯。而如果要回到一般模式時, 則必須要按下『Esc』這個按鍵即可退出編輯模式。

  • 指令列命令模式(底行模式):
    在一般模式當中,輸入『 : / ? 』三個中的任何一個按鈕,就可以將光標移動到最底下那一行。在這個模式當中, 可以提供你『搜尋資料』的動作,而讀取、存盤、大量取代字符、離開 vi 、顯示行號等等的動作則是在此模式中達成的!

一般模式可與編輯模式及指令列模式切換, 但編輯模式與指令列模式之間不可互相切換喔!

1.2 簡易示例

如果你想要使用 vi 來建立一個名爲 test.txt 的檔案時,你可以這樣做:

使用 vi 進入一般模式:

[root@www ~]# vi test.txt

直接輸入『 vi 檔名』就能夠進入 vi 的一般模式了。請注意,記得 vi 後面一定要加檔名,不管該檔名存在與否! 整個畫面主要分爲兩部份,上半部與最底下一行兩者可以視爲獨立的。如下圖 2.1.1 所示,圖中那個虛線是不存在的, 鳥哥用來說明而已啦!上半部顯示的是檔案的實際內容,最底下一行則是狀態顯示列(如下圖的[New File]信息), 或者是命令下達列喔!
在這裏插入圖片描述
如果你開啓的檔案是舊檔(已經存在的檔案),則可能會出現如下的信息:
在這裏插入圖片描述
如上圖 2.1.2 所示,箭頭所指的那個『"/etc/man.config" 141L, 4617C』代表的是『檔名爲 /etc/man.conf, 檔案內有 141 行 以及具有 4617 個字符』的意思! 那一行的內容並不是在檔案內,而是 vi 顯示一些信息的地方喔!此時是在一般模式的環境下啦。 接下來開始來輸入吧!
按下 i 進入編輯模式,開始編輯文字:
在一般模式之中,只要按下 i, o, a 等字符就可以進入編輯模式了!在編輯模式當中,你可以發現在左下角狀態欄中會出現 –INSERT- 的字樣,那就是可以輸入任意字符的提示囉!這個時候,鍵盤上除了 [Esc] 這個按鍵之外,其他的按鍵都可以視作爲一般的輸入按鈕了,所以你可以進行任何的編輯囉!
在這裏插入圖片描述
按下 [ESC] 按鈕回到一般模式:
好了,假設我已經按照上面的樣式給他編輯完畢了,那麼應該要如何退出呢?是的!沒錯!就是給他按下 [Esc] 這個按鈕即可!馬上你就會發現畫面左下角的 – INSERT – 不見了!
在一般模式中按下 :wq 儲存後離開 vi

OK,我們要存檔了,存盤並離開的指令很簡單,輸入『:wq』即可存檔離開! (注意了,按下 : 該光標就會移動到最底下一行去!) 這時你在提示字符後面輸入『 ls -l 』即可看到我們剛剛建立的 test.txt 檔案啦!整個圖示有點像底下這樣:
在這裏插入圖片描述
如此一來,你的檔案 test.txt 就已經建立起來囉!需要注意的是,如果你的檔案權限不對,例如爲 -r–r--r-- 時,那麼可能會無法寫入,此時可以使用『強制寫入』的方式嗎?可以!使用『 :wq! 』 多加一個驚歎號即可!不過,需要特別注意呦!那個是在『你的權限可以改變』的情況下才能成立的!

1.3 功能鍵介紹

除了上面簡易範例的 i, [Esc], :wq 之外,其實 vim 還有非常多的按鍵可以使用喔!在介紹之前還是要再次強調, vim 的三種模式只有一般模式可以與編輯、指令列模式切換,編輯模式與指令列模式之間並不能切換的!底下就來談談 vim 軟件中會用到的按鍵功能吧!

第一部份:一般模式可用的按鈕說明,光標移動、複製貼上、搜尋取代等
在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述
第二部份:一般模式切換到編輯模式的可用的按鈕說明
在這裏插入圖片描述
第三部份:一般模式切換到指令列模式的可用的按鈕說明
在這裏插入圖片描述
特別注意,在 vi 中,『數字』是很有意義的!數字通常代表重複做幾次的意思! 也有可能是代表去到第幾個什麼什麼的意思。舉例來說,要刪除 50 行,則是用 『50dd』 對吧! 數字加在動作之前~那我要向下移動 20 行呢?那就是『20j』或者是『20↓』即可。

OK!會這些指令就已經很厲害了,因爲常用到的指令也只有不到一半!通常 vi 的指令除了上面鳥哥註明的常用的幾個外,其他是不用背的,你可以做一張簡單的指令表在你的屏幕牆上, 一有疑問可以馬上的查詢呦!這也是當初鳥哥使用 vim 的方法啦!

1.4 案例練習

來來來!趕緊測試一下你是否已經熟悉 vi 這個指令呢?請依照底下的需求進行指令動作。 (底下的操作爲使用 CentOS 5.2 中的 man.config 來做練習的,該檔案你可以在這裏下載: http://cn.linux.vbird.org/linux_basic/0310vi/man.config。) 看看你的顯示結果與鳥哥的結果是否相同啊?

  1. 請在 /tmp 這個目錄下建立一個名爲 vitest 的目錄;
  2. 進入 vitest 這個目錄當中;
  3. 將 /etc/man.config 複製到本目錄底下(或由上述的連結下載 man.config 檔案);
  4. 使用 vi 開啓本目錄下的 man.config 這個檔案;
  5. 在 vi 中設定一下行號;
  6. 移動到第 58 行,向右移動 40 個字符,請問你看到的雙引號內是什麼目錄?
  7. 移動到第一行,並且向下搜尋一下『 bzip2 』這個字符串,請問他在第幾行?
  8. 接着下來,我要將 50 到 100 行之間的『小寫 man 字符串』改爲『大寫 MAN 字符串』,並且一個一個挑選是否需要修改,如何下達指令?如果在挑選過程中一直按『y』, 結果會在最後一行出現改變了幾個 man 呢?
  9. 修改完之後,突然反悔了,要全部復原,有哪些方法?
  10. 我要複製 65 到 73 這九行的內容(含有MANPATH_MAP),並且貼到最後一行之後;
  11. 21 到 42 行之間的開頭爲 # 符號的批註數據我不要了,要如何刪除?
  12. 將這個檔案另存成一個 man.test.config 的檔名;
  13. 去到第 27 行,並且刪除 15 個字符,結果出現的第一個單字是什麼?
  14. 在第一行新增一行,該行內容輸入『I am a student…』;
  15. 儲存後離開吧!

整個步驟可以如下顯示:

  1. 『mkdir /tmp/vitest』
  2. 『cd /tmp/vitest』
  3. 『cp /etc/man.config .』
  4. 『vi man.config』
  5. 『:set nu』然後你會在畫面中看到左側出現數字即爲行號。
  6. 先按下『58G』再按下『40→』會看到『/dir/bin/foo』這個字樣在雙引號內;
  7. 先執行『1G』或『gg』後,直接輸入『/bzip2』,則會去到第 118 行纔對!
  8. 直接下達『 :50,100s/man/MAN/gc 』即可!若一直按『y』最終會出現『在 23 行內置換 25 個字符串』的說明。
  9. (1)簡單的方法可以一直按『 u 』回覆到原始狀態,(2)使用不儲存離開『 :q! 』之後,再重新讀取一次該檔案;
  10. 『65G』 然後再『 9yy 』之後最後一行會出現『複製九行』之類的說明字樣。 按下『 G 』到最後一行,再給他『 p 』貼上九行!
  11. 因爲 21~42 22 行,因此『 21G 』→『 22dd 』就能刪除 22 行,此時你會發現遊標所在 21 行的地方變成 MANPATH 開頭囉, 批註的 # 符號那幾行都被刪除了。
  12. 『 :w man.test.config 』,你會發現最後一行出現 “man.test.config” [New]… 的字樣。
  13. 『27G』 之後,再給他『 15x 』即可刪除 15 個字符,出現『 you 』的字樣;
  14. 先『 1G 』去到第一行,然後按下大寫的『 O 』便新增一行且在插入模式;開始輸入『I am a student…』後, 按下[Esc]回到一般模式等待後續工作;
  15. 『:wq』

如果你的結果都可以查的到,那麼 vi 的使用上面應該沒有太大的問題啦!剩下的問題會是在…打字練習…。

1.5 vim的暫存,恢復與開啓時的警告

在目前主要的編輯軟件都會有『回覆』的功能,亦即當你的系統因爲某些原因而導致類似當機的情況時, 還可以透過某些特別的機制來讓你將之前未儲存的數據『救』回來!這就是鳥哥這裏所謂的『回覆』功能啦! 那麼 vim 有沒有回覆功能呢?有的! vim 就是透過『暫存檔』來救援的啦!

當我們在使用 vim 編輯時, vim 會在與被編輯的檔案的目錄下,再建立一個名爲 .filename.swp 的檔案。 比如說我們在上一個小節談到的編輯 /tmp/vitest/man.config 這個檔案時, vim 會主動的建立 /tmp/vitest/.man.config.swp 的暫存檔,你對 man.config 做的動作就會被記錄到這個 .man.config.swp 當中喔!如果你的系統因爲某些原因斷線了, 導致你編輯的檔案還沒有儲存,這個時候 .man.config.swp 就能夠發會救援的功能了!我們來測試一下吧! 底下的練習有些部分的指令我們尚未談到,沒關係,你先照着做,後續再回來瞭解囉!

[root@www ~]# cd /tmp/vitest
[root@www vitest]# vim man.config
# 此時會進入到 vim 的畫面,請在 vim 的一般模式下按下『 [ctrl]-z 』的組合鍵

[1]+  Stopped             vim man.config  <==按下 [ctrl]-z 會告訴你這個訊息

當我們在 vim 的一般模式下按下 [ctrl]-z 的組合按鍵時,你的 vim 會被丟到背景去執行! 這部份的功能我們會在程序管理當中談到, 你這裏先知道一下即可。回到命令提示字符後,接下來我們來模擬將 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 可以仿真將系統的 vim 工作刪除的情況,你可以假裝當機了啦! 由於 vim 的工作被不正常的中斷,導致暫存盤無法藉由正常流程來結束, 所以暫存檔就不會消失,而繼續保留下來。此時如果你繼續編輯那個 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  <==這個暫存盤屬於哪個實際的檔案?
          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
底下說明可能發生這個錯誤的兩個主要原因與解決方案!
(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』,亦即使用 ®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:還是用正常的方式打開你要編輯的那個檔案, 並不會載入暫存檔的內容。不過很容易出現兩個使用者互相改變對方的檔案等問題!不好不好!

  • ®ecover:就是加載暫存盤的內容,用在你要救回之前未儲存的工作。 不過當你救回來並且儲存離開 vim 後,還是要手動自行刪除那個暫存檔喔!

  • (D)elete it:你確定那個暫存檔是無用的!那麼開啓檔案前會先將這個暫存盤刪除! 這個動作其實是比較常做的!因爲你可能不確定這個暫存檔是怎麼來的,所以就刪除掉他吧!哈哈!

  • (Q)uit:按下 q 就離開 vim ,不會進行任何動作回到命令提示字符。

  • (A)bort:忽略這個編輯行爲,感覺上與 quit 非常類似! 也會送你回到命令提示字符就是囉!

2 vim的額外功能

其實,目前大部分的 distributions 都以 vim 取代 vi 的功能了!如果你使用 vi 後,卻看到畫面的右下角有顯示目前光標所在的行列號碼,那麼你的 vi 已經被 vim 所取代囉~ 爲什麼要用 vim 呢?因爲 vim 具有顏色顯示的功能,並且還支持許多的程序語法 (syntax), 因此,當你使用 vim 編輯程序時( 不論是 C 語言,還是 shell script ), 我們的 vim 將可幫你直接進行『程序除錯 (debug)』的功能!真的很不賴吧!_

如果你在文本模式下,輸入 alias 時,出現這樣的畫面:

[root@www ~]# alias
....其他省略....
alias vi='vim'  <==重點在這行啊!

這表示當你使用 vi 這個指令時,其實就是執行 vim 啦!如果你沒有這一行,那麼你就必須要使用 vim filename 來啓動 vim 囉!基本上, vim 的一般用法與 vi 完全一模一樣~沒有不同啦!那麼我們就來看看 vim 的畫面是怎樣囉!假設我想要編輯 /etc/man.config ,則輸入『vim /etc/man.config』
在這裏插入圖片描述
上面是 vim 的畫面示意圖,在這個畫面中有幾點特色要說明喔:

  1. 由於 man.config 是系統規劃的配置文件,因此 vim 會進行語法檢驗,所以你會看到畫面中內部主要爲深藍色, 且深藍色那一行是以批註符號 (#) 爲開頭;
  2. 最底下一行的左邊顯示該檔案的屬性,包括 141行與 4617 字符;
  3. 最底下一行的右邊出現的 1,1 表示光標所在爲第一行, 第一個字符位置之意(請看一下上圖中的遊標所在);

所以,如果你向下移動到其他位置時,出現的非批註的數據就會有點像這樣:
在這裏插入圖片描述
看到了喔!除了批註之外,其他的行就會有特別的顏色顯示呢!可以避免你打錯字啊!而且, 最右下角的 30% 代表目前這個畫面佔整體檔案的 30% 之意!

2.1 區塊選擇

剛剛我們提到的簡單的 vi 操作過程中,幾乎提到的都是以行爲單位的操作。那麼如果我想要搞定的是一個區塊範圍呢? 舉例來說,像底下這種格式的檔案:
在這裏插入圖片描述
這個檔案我將他放置到 http://cn.linux.vbird.org/linux_basic/0310vi/hosts ,你可以自行下載來看一看這個檔案啊!現在我們來玩一玩這個檔案吧!假設我想要將 host1, host2… 等等複製起來, 並且加到每一行的後面,亦即每一行的結果要是『 192.168.1.2 host2.class.net host2 』這樣的情況時, 在傳統或現代的窗口型編輯器似乎不容易達到這個需求,但是咱們的 vim 是辦的到的喔!那就使用區塊選擇 (Visual Block) 吧!當我們按下 v 或者 V 或者 [Ctrl]+v 時, 這個時候光標移動過的地方就會開始反白,這三個按鍵的意義分別是:
在這裏插入圖片描述
來實際進行我們需要的動作吧!就是將 host 再加到每一行的最後面,你可以這樣做:

  1. 使用 vim hosts 來開啓該檔案,記得該檔案請由上述的連結下載先!
  2. 將光標移動到第一行的 host 那個 h 上頭,然後按下 [ctrl]-v ,左下角出現區塊示意字樣:
    在這裏插入圖片描述
  3. 將光標移動到最底部,此時光標移動過的區域會反白!如下圖所示:
  4. 此時你可以按下『 y 』來進行復制,當你按下 y 之後,反白的區塊就會消失不見囉!
  5. 最後,將光標移動到第一行的最右邊,並且再用編輯模式向右按兩個空格鍵,回到一般模式後, 再按下『 p 』後,你會發現很有趣!如下圖所示:
    在這裏插入圖片描述
    透過上述的功能,你可以複製一個區塊,並且是貼在某個『區塊的範圍』內,而不是以行爲單位來處理你的整份文件喔! 鳥哥個人是覺得這玩意兒非常的有幫助啦!至少在進行排列整齊的文本文件中複製/刪除區塊時,會是一個非常棒的功能!

2.2 多文件編輯

假設一個例子,你想要將剛剛我們的 hosts 內的 IP 複製到你的 /etc/hosts 這個檔案去, 那麼該如何編輯?我們知道在 vi 內可以使用 :r filename 來讀入某個檔案的內容, 不過,這樣畢竟是將整個檔案讀入啊!如果我只是想要部分內容呢?呵呵!這個時候多檔案同時編輯就很有用了。 我們可以使用 vim 後面同時接好幾個檔案來同時開啓喔!相關的按鍵有:
在這裏插入圖片描述
在過去,鳥哥想要將 A 檔案內的十條消息『移動』到 B 檔案去,通常要開兩個 vim 窗口來複制, 偏偏每個 vim 都是獨立的,因此並沒有辦法在 A 檔案下達『 nyy 』再跑到 B 檔案去『 p 』啦! 在這種情況下最常用的方法就是透過鼠標圈選, 複製後貼上。不過這樣一來還是有問題,因爲鳥哥超級喜歡使用 [Tab] 按鍵進行編排對齊動作, 透過鼠標卻會將 [Tab] 轉成空格鍵,這樣內容就不一樣了!此時這個多檔案編輯就派上用場了!

現在你可以做一下練習看看說!假設你要將剛剛鳥哥提供的 hosts 內的前四行 IP 數據複製到你的 /etc/hosts 檔案內,那可以怎麼進行呢?可以這樣啊:

  1. 透過『 vim hosts /etc/hosts 』指令來使用一個 vim 開啓兩個檔案;
  2. 在 vim 中先使用『 :files 』察看一下編輯的檔案數據有啥?結果如下所示。 至於下圖的最後一行顯示的是『按下任意鍵』就會回到 vim 的一般模式中!
    3.
  3. 在第一行輸入『 4yy 』複製四行;
  4. 在 vim 的環境下輸入『 :n 』會來到第二個編輯的檔案,亦即 /etc/hosts 內;
  5. 在 /etc/hosts 下按『 G 』到最後一行,再輸入『 p 』貼上;
  6. 按下多次的『 u 』來還原原本的檔案數據;
  7. 最終按下『 :q 』來離開 vim 的多檔案編輯吧!

看到了吧?利用多檔案編輯的功能,可以讓你很快速的就將需要的資料複製到正確的檔案內。 當然囉,這個功能也可以利用窗口接口來達到,那就是底下要提到的多窗口功能。

2.3 多窗口功能

在開始這個小節前,先來想象兩個情況:

  • 當我有一個檔案非常的大,我查閱到後面的數據時,想要『對照』前面的數據, 是否需要使用 [ctrl]+f 與 [ctrl]+b (或 pageup, pagedown 功能鍵) 來跑前跑後查閱?

  • 我有兩個需要對照着看的檔案,不想使用前一小節提到的多檔案編輯功能;

在一般窗口接口下的編輯軟件大多有『分割窗口』或者是『凍結窗口』的功能來將一個檔案分割成多個窗口的展現, 那麼 vim 能不能達到這個功能啊?可以啊!但是如何分割窗口並放入檔案呢? 很簡單啊!在指令列模式輸入『:sp {filename}』即可!那個 filename 可有可無, 如果想要在新窗口啓動另一個檔案,就加入檔名,否則僅輸入 :sp 時, 出現的則是同一個檔案在兩個窗口間!

讓我們來測試一下,你先使用『 vim /etc/man.config 』打開這個檔案,然後『 1G 』去到第一行,之後輸入『 :sp 』 再次的打開這個檔案一次,然後再輸入『 G 』,結果會變成底下這樣喔:
在這裏插入圖片描述
萬一你再輸入『 :sp /etc/hosts 』時,就會變成下圖這樣喔:
在這裏插入圖片描述
怎樣?帥吧!兩個檔案同時在一個屏幕上面顯示,你還可以利用『[ctrl]+w+↑』及『[ctrl]+w+↓』 在兩個窗口之間移動呢!這樣的話,複製啊、查閱啊等等的,就變的很簡單囉~ 分割窗口的相關指令功能有很多,不過你只要記得這幾個就好了:
在這裏插入圖片描述
鳥哥第一次玩 vim 的分割窗口時,真是很高興啊!竟然有這種功能!太棒了! _

2.4 vim的補全功能

在這裏插入圖片描述
在這裏插入圖片描述

2.5 vim環境設定與記錄

有沒有發現,如果我們以 vim 軟件來搜尋一個檔案內部的某個字符串時,這個字符串會被反白, 而下次我們再次以 vim 編輯這個檔案時,該搜尋的字符串反白情況還是存在呢!甚至於在編輯其他檔案時, 如果其他檔案內也存在這個字符串,哇!竟然還是主動反白耶!真神奇! 另外,當我們重複編輯同一個檔案時,當第二次進入該檔案時, 遊標竟然就在上次離開的那一行上頭呢!真是好方便啊~但是,怎麼會這樣呢?

這是因爲我們的 vim 會主動的將你曾經做過的行爲登錄下來,好讓你下次可以輕鬆的作業啊! 那個記錄動作的檔案就是: ~/.viminfo !如果你曾經使用過 vim, 那你的家目錄應該會存在這個檔案纔對。這個檔案是自動產生的, 你不必自行建立。而你在 vim 裏頭所做過的動作,就可以在這個檔案內部查詢到囉~ _

此外,每個 distributions 對 vim 的預設環境都不太相同,舉例來說,某些版本在搜尋到關鍵詞時並不會高亮度反白, 有些版本則會主動的幫你進行縮排的行爲。但這些其實都可以自行設定的,那就是 vim 的環境設定囉~ vim 的環境設定參數有很多,如果你想要知道目前的設定值,可以在一般模式時輸入『 :set all 』 來查閱,不過…設定項目實在太多了~所以,鳥哥在這裏僅列出一些平時比較常用的一些簡單的設定值, 提供給你參考啊。
在這裏插入圖片描述
總之,這些設定值很有用處的啦!但是…我是否每次使用 vim 都要重新設定一次各個參數值? 這不太合理吧?沒錯啊!所以,我們可以透過配置文件來直接規定我們習慣的 vim 操作環境呢! 整體 vim 的設定值一般是放置在 /etc/vimrc 這個檔案,不過,不建議你修改他! 你可以修改 ~/.vimrc 這個檔案 (預設不存在,請你自行手動建立!),將你所希望的設定值寫入! 舉例來說,可以是這樣的一個檔案:


[root@www ~]# vim ~/.vimrc
"這個檔案的雙引號 (") 是批註
set hlsearch            "高亮度反白
set backspace=2         "可隨時用退格鍵刪除
set autoindent          "自動縮排
set ruler               "可顯示最後一行的狀態
set showmode            "左下角那一行的狀態
set nu                  "可以在每一行的最前面顯示行號啦!
set bg=dark             "顯示不同的底色色調
syntax on               "進行語法檢驗,顏色顯示。

在這個檔案中,使用『 set hlsearch 』或『 :set hlsearch 』,亦即最前面有沒有冒號『 : 』效果都是一樣的! 至於雙引號則是批註符號!不要用錯批註符號,否則每次使用 vim 時都會發生警告訊息喔! 建立好這個檔案後,當你下次重新以 vim 編輯某個檔案時,該檔案的預設環境設定就是上頭寫的囉~ 這樣,是否很方便你的操作啊!多多利用 vim 的環境設定功能呢!_

3 vim的注意事項

3.1 中文編碼問題

很多朋友常常哀嚎,說他們的 vim 裏面怎麼無法顯示正常的中文啊?其實這很有可能是因爲編碼的問題! 因爲中文編碼有 big5 與 utf8 兩種,如果你的檔案是使用 big5 編碼製作的,但在 vim 的終端接口中你使用的是萬國碼(utf8), 由於編碼的不同,你的中文檔案內容當然就是一堆亂碼了!怎麼辦?這時你得要考慮許多東西啦!有這些:

  1. 你的 Linux 系統默認支持的語系數據:這與 /etc/sysconfig/i18n 有關;
  2. 你的終端界面 (bash) 的語系: 這與 LANG 這個變數有關;
  3. 你的檔案原本的編碼;
  4. 開啓終端機的軟件,例如在 GNOME 底下的窗口接口。

事實上最重要的是上頭的第三與第四點,只要這兩點的編碼一致,你就能夠正確的看到與編輯你的中文檔案。 否則就會看到一堆亂碼啦!

一般來說,中文編碼使用 big5 時,在寫入某些數據庫系統中,在『許、蓋、功』這些字體上面會發生錯誤! 所以近期以來大多希望大家能夠使用萬國碼 utf8 來進行中文編碼!但是在 Windows XP 上的軟件常常默認使用 big5 的編碼, 包括鳥哥由於沿用以前的文件數據文件,也大多使用 big5 的編碼。此時就得要注意上述的這些咚咚囉。

在 Linux 本機前的 tty1~tty6 原本默認就不支持中文編碼,所以不用考慮這個問題!因爲你一定會看到亂碼!呵呵! 現在鳥哥假設俺的文件檔案內編碼爲 big5 時,而且我的環境是使用 Linux 的 GNOME ,啓動的終端接口爲 GNOME-terminal 軟件, 那鳥哥通常是這樣來修正語系編碼的行爲:

3.2 DOS與Linux的換行符的區別

我們在第七章裏面談到 cat 這個指令時,曾經提到過 DOS 與 Linux 斷行字符的不同。 而我們也可以利用 cat -A 來觀察以 DOS (Windows 系統) 建立的檔案的特殊格式, 也可以發現在 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 格式了!
[root@www vitest]# ll man.config
-rw-r--r-- 1 root root 4758 Jan  6  2007 man.config
# 斷行字符多了 ^M ,所以容量增加了!

範例二:將上述的 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 來轉換一下斷行格式啊!

3.3 語系編碼轉換

很多朋友都會有的問題,就是想要將語系編碼進行轉換啦!舉例來說,想要將 big5 編碼轉成 utf8 。 這個時候怎麼辦?難不成要每個檔案打開會轉存成 utf8 嗎?不需要這樣做啦!使用 iconv 這個指令即可! 鳥哥將之前的 vi 章節做成 big5 編碼的檔案,你可以照底下的連結來下載先:

  • http://cn.linux.vbird.org/linux_basic/0310vi/vi.big5

在終端機的環境下你可以使用『 wget 網址』來下載上述的檔案喔!鳥哥將他下載在 /tmp/vitest 目錄下。 接下來讓我們來使用 iconv 這個指令來玩一玩編碼轉換吧!

[root@www ~]# iconv --list
[root@www ~]# iconv -f 原本編碼 -t 新編碼 filename [-o newfile]
選項與參數:
--list :列出 iconv 支持的語系數據
-f     :from ,亦即來源之意,後接原本的編碼格式;
-t     :to ,亦即後來的新編碼要是什麼格式;
-o file:如果要保留原本的檔案,那麼使用 -o 新檔名,可以建立新編碼檔案。

範例一:將 /tmp/vitest/vi.big5 轉成 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 , 所以對岸的朋友可以簡單的將鳥站的網頁數據下載後,利用這個指令來轉成簡體,就能夠輕鬆的讀取文件數據囉! 不過,不要將轉成簡體的檔案又上傳成爲您自己的網頁啊!這明明是鳥哥寫的不是嗎? _

不過如果是要將正體中文的 utf8 轉成簡體中文的 utf8 編碼時,那就得費些功夫了! 舉例來說,如果要將剛剛那個 vi.utf8 轉成簡體的 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 即可進行設定編輯;
  • vim 可視爲程序編輯器,可用以編輯 shell script, 配置文件等,避免打錯字;
  • vi 爲所有 unix like 的操作系統都會存在的編輯器,且執行速度快速;
  • vi 有三種模式,一般模式可變換到編輯與指令列模式,但編輯模式與指令列模式不能互換;
  • 常用的按鍵有i, [Esc], :wq 等;
  • vi 的畫面大略可分爲兩部份,(1)上半部的本文與(2)最後一行的狀態+指令列模式;
  • 數字是有意義的,用來說明重複進行幾次動作的意思,如 5yy 爲複製 5 行之意;
  • 光標的移動中,大寫的 G 經常使用,尤其是 1G, G 移動到文章的頭/尾功能!
  • vi 的取代功能也很棒! :n1,n2s/old/new/g 要特別注意學習起來;
  • 小數點『 . 』爲重複進行前一次動作,也是經常使用的按鍵功能!
  • 進入編輯模式幾乎只要記住: i, o, R 三個按鈕即可!尤其是新增一行的 o 與取代的 R
  • vim 會主動的建立 swap 暫存檔,所以不要隨意斷線!
  • 如果在文章內有對齊的區塊,可以使用 [ctrl]-v 進行復制/貼上/刪除的行爲
  • 使用 :sp 功能可以分割窗口
  • vim 的環境設定可以寫入在 ~/.vimrc 檔案中;
  • 可以使用 iconv 進行檔案語系編碼的轉換
  • 使用 dos2unix 及 unix2dos 可以變更檔案每一行的行尾斷行字符。

摘自鳥哥的Linux私房菜第十章、vim 程序編輯器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章