vi 文書處理軟體
本文已不再維護,新文章請參考 此處
最近更新日期:2003/02/25
 
一個系統管理員至少應該要熟悉一種文字處理軟體,以方便未來的系統管理,包括系統設定與架站時候的參數設定檔修訂等等工作之進行。在 Unix-Like 系統中,肯定看的到的文書編輯器就是 vi 啦,他算是最正規的文字介面下的文書處理器了。為什麼文書處理器很重要呢?還記得前兩個章節中我們提到的 /etc/fstab 這個檔案嗎?您如果想要修改他的話,要如何修改呢?當然是使用文書編輯器來編輯他囉,那麼在 Linux 的指令列模式當中使用什麼文書編輯器呢呢?當然幾乎就是 vi 啦!此外,後續的 shell scripts 章節與 Linux 架站設定的檔案等等,幾乎都是使用他來進行設定耶!那 vi 重不重要呢?你猜猜?
 
vi 簡易說明
簡易執行範例
命令列內容說明
一個案例練習
本章與 LPI 的關係
本章習題練習

vi 簡易說明
由前面一路走來,我們一直建議使用文字模式來處理 Linux 的系統設定問題,因為不但可以讓您比較容易瞭解到 Linux 的運作狀況,也比較容易瞭解整個設定的基本精神,更能『保證』您的修改可以順利的被運作 ( 這裡要再次的強調,不同的 Linux distribution 各有其不同的附加軟體,例如 Red Hat 的 userconf, Linuxconf, ntsysv 與 setup 等等,而 Caldera 則有 COAS 等等,因此,如果您只會使用此種類型的軟體來控制您的 Linux 系統時,當接管不同的 Linux distribution 時,呵呵!那可就苦惱了! ) 所以,在 Linux 的系統中使用文字編輯器來編輯您的 Linux 參數設定檔,嗯!可是一件很重要的事情呦!所以說嘛!系統管理員至少應該要熟悉一種文書處理器的!

Linux是什麼 介紹中,我們知道 Linux 與 Unix 系統中的參數檔幾乎都是 ASCII 碼的『純文字』檔!因此,利用簡單的文字編輯軟體就可以馬上修改 Linux 的參數檔囉!然而,與 Windows 不同的是,如果您用慣了 Microsoft Word 或 Corel Wordperfect 的話,那麼除了 Xwindows 裡面的編輯程式(如 xemacs )用起來尚可應付外,於 Linux 的文字模式下,會覺得檔案編輯程式都沒有 Windows 程式那麼方便。( 註:什麼是 ASCII 的純文字檔案呢?說穿了,就是您開啟的檔案可以將內容給您看到的檔案,而不是呈現亂碼的檔案,那就是純文字檔了!當您以 Windows 的 word 存一個檔案時,在 DOS 的情況下使用 type ,嗯!完全不知到內容是什麼?因為會出現很多的亂碼,那並非是純文字檔,而如果以 word 在存檔時,選擇『純文字類型』,嗯!那就可以使用 type 看到該檔案的內容了!總之,純文字檔相當的容易修改就是了! )

無論如何,要管理好 Linux 系統,純文字的手工設定仍然是需要的!所以請您千萬不要嫌麻煩,努力的將下文參詳一下吧!以下我們以最常見到的 vi 這套文書軟體來介紹 Linux 底下的文書編輯動作。 ( 註: vi 是 Unix 預設的文書處理軟體,當然,也是 Linux 預設的文書處理軟體! )

基本上 vi 共分為三種模式,分別是『一般模式』、『編輯模式』與『指令列命令模式』三種!

簡單的說,我們可以將這三個模式想成底下的圖示來表示之:
閒話不多說,我們底下以一個簡單的例子來進行說明吧!

簡易執行範例
我們怎麼使用 vi 建立一個檔名為 test.txt 的資料呢?也是很簡單的啦,
  1. 使用 vi 進入一般模式;
  2. [root @test root]# vi test.txt
    直接輸入『 vi 檔名』即可進入 vi 了!如下圖所示,左下角還會顯示這個檔案目前的狀態!如果是新建檔案會顯示 [New File],如果是以存在的檔案,則會顯示目前的檔名、行數與字元數,例如:『"/etc/man.config" 145L, 4614C』

     
  3. 按下 i 進入編輯模式,開始編輯文字;

  4. 在一般模式之中,只要按下 I, o, a 等字元,就可以進入編輯模式了!在編輯模式當中,您可以發現在左下角會出現 –INSERT- 的畫面,那就是可以輸入任意字元的提示囉!這個時候,鍵盤上除了 [Esc] 這個按鍵之外,其他的按鍵都可以視作為一般的輸入按鈕了,所以您可以進行任何的編輯囉!(註:在 vi 裡面, [tab] 這個按鈕所得到的結果與空白字元所得到的結果是不一樣的,特別強調一下!)

     
  5. 按下 [ESC] 按鈕回到一般模式;

  6. 好了,假設我已經按照上面的樣式給他編輯完畢了,那麼應該要如何退出呢?是的!沒錯!就是給他按下 [Esc] 這個按鈕即可!馬上你就會發現畫面左下角的 – INSERT – 不見了!
     
  7. 在一般模式中按下 :wq 儲存後離開 vi !

  8. OK,我們要存檔了,存檔並離開的指令很簡單,輸入『:wq』即可存檔離開!(注意了,按下 : 該游標就會移動到最底下一行去!)這時你在提示字元後面輸入『 ls -l 』即可看到我們剛剛建立的 test.txt 檔案啦!整個圖示有點像底下這樣:

    如此一來,您的檔案 test.txt 就已經建立起來囉!很簡單吧!需要注意的是,如果您的檔案權限不對,例如為 -r--r--r-- 時,那麼可能會無法寫入,那麼可以使用『強制寫入』的方式嗎?可以!使用『:wq!』多加一個驚嘆號即可!不過,需要特別注意呦!那個是在『您的權限可以改變』的情況下才能成立的!關於權限的概念,請參考一下 Linux 的檔案權限概念 囉!

命令列內容說明
如前所述,所謂的命令列或命令模式,就是在最下面一行沒有顯示『--INSERT--』或者『--REPLACE--』字樣的時候。通常在命令列中的指令有下面幾種:(注意,當按下 『:』 時,游標會自動移動到螢幕的最下面一行!)
 
一般模式: 移動游標
h 或 向左方向鍵
游標向左移動一個字元
j 或 向下方向鍵
游標向下移動一個字元
k 或 向上方向鍵
游標向上移動一個字元
l 或 向右方向鍵
游標向右移動一個字元
[Ctrl] + [f]
螢幕『向前』移動一頁常用
[Ctrl] + [b]
螢幕『向後』移動一頁常用
[Ctrl] + [d]
螢幕『向前』移動半頁
[Ctrl] + [u]
螢幕『向後』移動半頁
+
游標移動到非空白字元的下一列
-
游標移動到非空白字元的上一列
n<space>
按下數字後再按空白鍵,游標會向右移動這一行的 n 個字元。例如 20<space> 則游標會向後面移動 20 個字元距離。
0
這是數字『 0 』:移動到這一行的最前面字元處常用
$
移動到這一行的最後面字元處常用
H
游標移動到這個螢幕的最上方那一行
M
游標移動到這個螢幕的中央那一行
L
游標移動到這個螢幕的最下方那一行
G
移動到這個檔案的最後一行常用
nG
移動到這個檔案的第 n 行。例如 20G 則會移動到這個檔案的 20 行(可配合 :set nu)
n<Enter>
游標向下移動 n 行常用
一般模式: 搜尋與取代
/word
向游標之後尋找一個字串名稱為 word 的字串。常用
?word
向游標之前尋找一個字串名稱為 word 的字串。
:n1,n2s/word1/word2/g
在第 n1 與 n2 行之間尋找 word1 這個字串,並將該字串取代為 word2 !常用
:1,$s/word1/word2/g
從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 !常用
:1,$s/word1/word2/gc
從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 !且在取代前顯示提示字元給使用者確認(conform)是否需要取代!(常用
一般模式: 刪除、複製與貼上
x, X
x 為向後刪除一個字元, X 為向前刪除一個字元常用
nx
向後刪除 n 個字元
dd
刪除游標所在的那一整列常用
ndd
刪除游標所在的向下 n 列,例如 20dd 則是刪除 20 列常用
d1G
刪除游標所在到第一行的所有資料
dG
刪除游標所在到最後一行的所有資料
yy
複製游標所在的那一行常用
nyy
複製游標所在的向下 n 列,例如 20yy 則是複製 20 列常用
y1G
複製游標所在列到第一列的所有資料
yG
複製游標所在列到最後一列的所有資料
p, P
p 為複製的資料在游標下一行貼上,P 則為貼在游標上一行!常用
J
將游標所在列與下一列的資料結合成同一列
c
重複刪除多個資料,例如向下刪除 10 行,[ 10cj ]
u
復原前一個動作。常用
進入編輯模式  
i, I
插入:在目前的游標所在處插入輸入之文字,已存在的文字會向後退;(常用
a, A
增加:由目前游標所在的下一個字開始輸入,已存在的文字會向後退:(常用
o, O
插入新的一行:從游標所在的下一行枝行首開始輸入文字;(常用
r, R
取代:r 會取代游標所在的那一個字元;R會一直取代游標所在的文字,直到按下 ESC 為止;(常用
Esc
退出編輯模式,回到一般模式中常用
指令列命令模式  
:w
將編輯的資料寫入硬碟檔案中常用
:w!
若檔案屬性為『唯讀』時,強制寫入該檔案
:q
離開 vi 常用
:q!
若曾修改過檔案,又不想儲存,使用 ! 為強制離開不儲存檔案。
:wq
儲存後離開,若為 :wq! 則為強制儲存後離開常用
:e!
將檔案還原到最原始的狀態!
ZZ
若檔案沒有更動,則不儲存離開,若檔案已經經過更動,則儲存後離開!
:w [filename]
將編輯的資料儲存成另一個檔案(類似另存新檔)
:r [filename]
在編輯的資料中,讀入另一個檔案的資料。亦即將 『filename』 這個檔案內容加到游標所在行後面
:set nu
顯示行號,設定之後,會在每一行的字首顯示該行的行號
:set nonu
與 set nu 相反,為取消行號!
n1,n2 w [filename]
將 n1 到 n2 的內容儲存成 filename 這個檔案。
:! command
暫時離開 vi 到指令列模式下執行 command 的顯示結果!例如[ :! ls /home ]

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


一個案例練習
來來來!測試一下您是否已經熟悉 vi 這個指令呢?請依照底下的需求進行您的指令動作( 請注意,該檔案為 Mandrake 9.0 所附上的檔案內容,如果是其他的 distribution ,可能結果會不太一樣! ),然後看一下結果在螢幕前面顯示什麼?
  1. 請在 /root 這個目錄下建立一個名為 vitest 的目錄;
  2. 進入 vitest 這個目錄當中;
  3. 將 /etc/man.config 拷貝到本目錄底下;
  4. 使用 vi 開啟本目錄下的 man.config 這個檔案;
  5. 在 vi 中設定一下行號;
  6. 移動到第62 行,向右移動 40 個字元,請問您看到的雙引號內是什麼目錄?
  7. 移動到第一行,並且向下搜尋一下『 teTeX 』這個字串,請問他在第幾行?
  8. 接著下來,我要將 50 到 100 行之間的 man 改為 MAN ,並且一個一個挑選是否需要修改,如何下達指令?
  9. 修改完之後,突然反悔了,要全部復原,有哪些方法?
  10. 我要複製 51 到 60 行這十行的內容,並且貼到最後一行之後;
  11. 刪除 11 到 30 行之間的 20 行;
  12. 將這個檔案另存成一個 man.test.config 的檔名;
  13. 去到第 29 行,並且刪除 15 個字元;
  14. 請問目前的檔案有多少行與多少字元?
  15. 儲存後離開吧!
整個的步驟可以如下所示:
  1. mkdir /root/vitest
  2. cd /root/vitest
  3. cp /etc/man.config .
  4. vi man.config
  5. : set nu
  6. 先按下 62G ,再按下 40 + 向右鍵,會看到『/dir/bin/foo』
  7. 先按下 1G ,然後按下 /teTeX 搜尋,會看到他在第 51 行!
  8. :50,100s/man/MAN/gc
  9. (1)簡單的方法可以一直按 u 回復到原始狀態,(2)使用不儲存離開 :q! 之後,再重新讀取一次該檔案
  10. 51G 然後在 10yy 之後按下 G 到最後一行,再給他 p 貼上十行!
  11. 11G 之後,再給他 20dd 即可刪除 20 行了;
  12. :w man.test.config
  13. 29G 之後,再給他 15x 即可刪除 15 個字元;
  14. 135行,共 3903 個字元
  15. :wq!
如果您的結果都可以查的到,那麼 vi 的使用上面應該沒有太大的問題啦!剩下的問題會是在…..打字練習….

本章與 LPI 的關係:
http://www.lpi.org 所提供的 topic 當中, LPI 101 的 Topic 103 之 1.103.8 提到:『應試者應該能夠學會使用 vi 文書編輯器,學習的目標包含了 vi 的插入、編輯、刪除、複製與搜尋等功能的練習!』至於使用到的指令與 vi 當中所會用到的資料與指令為:

本章習題練習 ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
vi 文書處理軟體

2002/04/05:第一次完成
2003/02/07:重新編排與加入 FAQ
2003/02/25:新加入本章節與 LPI 的相關性說明!
http://info.sayya.org/~edt1023/vim/