VI是Linux/Unix下標配的一個純字元介面的文字編輯器。由於不支援滑鼠功能,也沒有圖形介面,相關的操作都要通過鍵盤指令來完成,需要記憶大量命令。因此很多人不大喜歡它,但同時由於鍵盤的方式往往比滑鼠來得快,一旦熟練後用起來是有種非常流暢的感覺的,也有人因此而非常喜歡它。
不管你喜歡也好,不喜歡也好,VI是Linux的標配編輯器,很多時候你也只有這一個編輯器可用,如果要做一個Linux Coder,熟悉VI還是非常有必要的。
PS:由於VI的命令非常多,本文主要只介紹一些基礎命令。並且就算是這些基礎命令中,也有許多是不大常用的,我就把這些命令以灰色文字顯示了,初學者可以不用太關注這些灰色命令。
兩種工作模式
前面已經說過,由於VI沒有圖形介面,如翻頁、移動游標、儲存、退出等操作都必須藉助鍵盤來完成。另外,VI還提供了大量快速鍵來加速操作,因此,VI統的編輯模式下,還引入了一種新的工作模式——命令模式。
- 編輯模式: 在此模式下,輸入可見字元時和傳統Windows環境下輸入字元的功能相同。按Esc鍵可切換值命令模式。
- 命令模式: 在此模式下,輸入的可見字元對應的是命令。當插入命令執行後進入編輯模式。
PS:有的文章中還列舉了一種Last Line模式,這個可以算作一種特殊的命令模式,只不過命令會顯示在最後一行,並且需要敲斷行符號才能執行。這些命令通常以 :/?$ 等特殊字元開頭。
模式查詢:要判斷當前處於那種模式,可以通過最後一行(狀態列)來判斷:如果處於編輯模式,則顯示為如下兩種狀態。
模式間的切換:在編輯模式下,通過Esc鍵可以進入命令模式;命令模式下,執行某些插入命令後進入編輯模式。如果你不知道當前處於那種模式下,按ESC進入命令模式,按Insert進入編輯模式。
啟動VI
VI的啟動參數有不少,但通常的使用方式如下:vi filename
如果參數中的檔案存在,則開啟該檔案,如果參數中的檔案不存在,則會建立該檔案(不是立即建立,而是在儲存的時候建立)。
插入文本
剛進入VI時,是出於命令模式的,這是是無法輸入文本的,因此需要進入插入模式。進入插入模式的命令有如下幾個:
- i 從目前游標所在之處插入文字
- a 從目前游標所在下一個字元插入文字
- o 往下插入一個空行
- O 往上插入一個空行
輸入這幾個命令後,就進入了編輯模式,可以通過螢幕下方最後一行看到當前為插入狀態:
可以通過Insert鍵切換插入狀態和改寫狀態(和映像介面中一樣)。
另外,在命令模式下,也可以通過Insert鍵進入編輯模式(插入狀態),不過通常還是前面介紹的四個命令來進入編輯模式。
離開和儲存檔案
在VI中,離開和儲存檔案對應的命令有這幾個(使用前記得進入命令模式):
- :w 儲存
- :w filename 另存新檔
- :wq 儲存並退出 [常用]
- :q! 強制退出
- SHIFT+zz 儲存並退出,功能同:wq [常用]
移動游標
在VI中,移動游標並不是我們遊戲中常用的WASD,而是h、j、k、l,分別控制游標左、下、上、右移一格,分別分布在右手四個指頭,新手需要一段時間來適應。使用非常頻繁,需要熟練掌握。
其它一些游標控制命令如下:
- Ctrl+B:螢幕往後移動一頁。
- Ctrl+F:螢幕往前移動一頁。
- Ctrl+U:螢幕往後移動半頁。
- Ctrl+D:螢幕往前移動半頁。
- gg:移動文章的開頭。
- G:移動到文章的最後。
- w:游標跳到下個word的開頭。
- e:游標跳到下個word的字尾。
- b:游標回到上個word的開頭。
- $:移到游標所在行的行尾。
- ^:移到該行第一個非空白的字元。
- 0:移到該行的開頭位置。
- #:移到該行的第#個位置,例:51、121。
另外,還有幾個行操作相關命令集中介紹一下
- :set nu 顯示行號
- :set nonu 隱藏行號
- :# 移動到第#行,如:15
- Ctrl+G: 在狀態列顯示當前進度
- #G: 移動到第#行,例:15G
刪除文字
- x:刪除游標所在位置的後面一個字元。
- #x:例如,6x 表刪除游標所在位置的後面6個字元。
- X:大字的X,每按一次刪除游標所在位置的前面一個字元。
- #X:例如,20X 表刪除游標所在位置的前面20個字元。
- dd:刪除游標所在行。
- #dd:例如,6dd表刪除從游標所在的該行往下數6行之文字。
複製粘貼
我個人並不是很習慣VI提供的複製粘貼,由於沒有高亮選中,用起來感覺不是很方便。平時大都是用的終端工具的複製粘貼功能,因此這裡的命令我都加灰了,感興趣的可以看看。
- yw:將游標所在處到字尾的字元複製到緩衝區中。
- p:將緩衝區內的字元粘貼到游標所在位置(指令'yw'與'p必須搭配使用)。
- yy:複製游標所在行。[超常用]
- p:複製單行到您想粘貼之處。(指令'yy'與'p'必須搭配使用)
- #yy:如:6yy表示拷貝從游標所在的該行往下數6行之文字。[常用]
- p: 複製多行到您想粘貼之處。(指令'#yy'與'p'必須搭配使用)
- ayy:將複製行放入buffer a, vi提供buffer功能,可將常用的資料存在buffer
- ap:將放在buffer a的資料粘貼。
- b3yy:將三行資料存入buffer b。
- b3p:將存在buffer b的資料粘貼
撤銷和重做
撤銷和重做在任何編輯器裡都是非常有用的命令:
- u:假如您誤操作一個指令,可以馬上按u,回複到上一個操作。
- .: 重複執行上一次的指令
尋找和替換
尋找和替換的文法筆記複雜,先簡單的介紹一下尋找的文法:
- /pattern<Enter> :向下尋找pattern匹配字串
- ?pattern<Enter> :向上尋找pattern匹配字串
使用了尋找命令之後,使用如下兩個鍵快速尋找:
至於替換的文法,限於篇幅所限,這裡就不介紹了,給一個連結供大家參考一下:http://blog.csdn.net/lanxinju/article/details/5731843。
VI對編程的支援
VI對編程還是提供了一定的支援的。例如,它是支援括弧配對、文法高亮顯示的。
不過,由於並不支援文法解析功能,作為編碼工具和專業的代碼編輯器如SourceInsight、VisualStudio等比起來還是有很大差距的。個人感覺做小型項目和臨時修改代碼用還行,但做大型項目是有點力不從心的。