當您輸入電子信箱、訂閱本公司之「電子報」時,我們會向您蒐集、處理、利用的個資為您的「電子信箱」以及「提交日期」,當您輸入電子信箱並送出時,即表示您同意我們使用您的個資,為保障您的權益,關於更多相關政策更新資訊,請務必閱讀我們的「 隱私權政策 」、「 使用條款 」及「 免責聲明 」。如您不同意本網站之「隱私權政策」、「使用條款」及「 免責聲明」,您可以隨時「 取消訂閱 」,謝謝您。

習慣了視窗平台的文字編輯器操作,到了 linux terminal 上會手足無措嗎 ? 沒有 notepad++ sublime ,連 gedit 都沒有,怎麼看程式碼,怎麼查 log ,怎麼改設定檔 ?

滑鼠不能用, ctrl-c ctrl-v 不能用,編輯文字檔變成漫長的 try-and-error?

介紹您在 linux 上的文字編輯好夥伴 vi ,只要記住幾個簡單的操作指令,讓你在 terminal 上也能有如神助。

所有的 Unix Like 系統都會內建 vi 文字編輯器,其他的文字編輯器則不一定會存在 ( : emacs pico nano joe ) ,而 vi 一般會有 vi vim 兩種不同版本, vim 可視為 vi 的進階版,甚至可以作為程式開發工具使用,但在某些地方會因為管理規則的關係,只允許使用 vi ,因此本文會以 vi 的操作方式為主。

另一個使用 vi 的原因是,當透過 terminal 連上客戶端主機進行設定或是 log 檢查時,通常都不會有 x-window 的環境,也就不會有圖形介面可以用 , 故剩下唯一可以依靠的就是 vi 了。當然,你可以把想要檢查的 log 檔抓到本地端電腦上打開進行檢查,或是將想更改的設定檔抓到本地端電腦上,更改完後再上傳到主機上,但總是會多了一個檔案上傳 / 下載的動作,如果需要檢查的檔案數量變多,或是會即時的變動內容,就可能造成作業上的困難。

vi 在使用時會分不同的模式,一般常用的有下列幾種

指令模式 (command mode)

進入 vi 時是處於指令模式,只能下按鍵指令,不能輸入文字。

此模式下可以進行 : 移動游標 ; 刪除、複製、貼上 ; 復原、重做 ; 區塊範圍 ( 選取、複製、貼上 )

編輯模式 (insert mode)

指令模式輸入 i o a r 即可進入編輯模式,編輯結束時按 Esc 會回到 指令模式。

插入功能: i o a; 取代功能: r

命令列模式 (command-line mode)

指令模式輸入 / ? : 就會進入 命令列模式,畫面最下方一列會出現輸入的指令,可下指令。一樣按 Esc 可回 指令模式。

此模式下可以進行 : 搜尋、取代 ; 儲存、離開、讀入檔案 ; 顯示行號 ; 多檔案編輯。

新手常犯的錯誤是,一進 vi 後,就先按 i 進入編輯模式,再用方向鍵移到需要編輯的地方進行編輯,這樣其實是比較慢的做法,如果先用指令定位或搜尋找到要編輯的地方,再開始編輯,會省下許多時間。

一般會盡量讓 vi 處於指令模式,以避免不小心更改到檔案內容。 換另外一種說法,只有在需要進行編輯時,才進入編輯模式。不知道目前到底是處於哪一種模式下 ? 只要看一下螢幕上最後一列,如果出現 – INSERT – 或是 – REPLACE – 那就是在編輯模式,如果輸入的指令會出現在最後一列上,那就是命令列模式,想要回到指令模式,只要按 ESC 即可。

以下簡介操作時的常用指令

開啟檔案 :

由命令列來開檔

$ vi filename

開檔後游標會落在檔案最後一行的行尾

$ vi + filename

方便由檔案結尾處繼續編輯

開檔後游標會落在第 n 行的行首

$ vi +n filename

開檔後游標就會落在第一個找到的 string

$ vi +/string filename

可以按 n 繼續找 下一個

一次開啟多個檔

$ vi 1.txt 2.txt 3.txt

稱為 argument list

多檔編輯時,可用切換檔案指令

:n 編輯下一個檔案。

:2n 編輯下二個檔案。

:N 編輯前一個檔案。

只能用於 argument list 的情形

進入 vi 後再開檔

進入 vi 後,使用

:e filename

filename 不存在,會開一個以 filename 為名的新檔案

編輯前一個檔案

:e#

Ctrl-^

用於同時編輯兩個檔案,或將檔案一的部分內容複製到檔案二時相當好用。

編輯檔案:

進入 vi 後,按 i o a r 進入 編輯模式,就可以進行檔案編輯。

vi 中游標的移動可以由方向鍵來移動。 Backspace 鍵可消去前一個字元。 Del 鍵可刪除游標所在處的字元。

基本游標移動指令

Backspace 或方向鍵

Enter + ,或方向鍵

方向鍵或 -

Space 或方向鍵

向下翻頁 (PageDown)

Ctrl-f

向上翻頁 (PageUp)

Crtl-b

尋找、替換檔案內容

vi 最特殊的地方是和正規表示式 (regular expression) 結合在一起。在執行如尋找或替換等動作時,依據正規表示式的 pattern ,所有符合 pattern 的地方就會執行我們想要執行的動作。

指令模式 的情形下,按 / ? 就會進入命令列模式,在左下角出現一個 / ? ,然後輸入要尋找的字串,按下 Enter 就會開始尋找。

/ 是由前往後找, ? 則是由後往前找。要找下一個的時候,只要輸入 n 即可,輸入 N 時則是反向尋找。

取代 (substitute)

指令模式 的情形下,按 : 就會進入命令列模式,在左下角出現一個 : ,然後依照替換格式輸入要尋找及替換的字串,按下 Enter 就會開始進行取代。

:[range]s/pattern/string/[c e g i]

range

指定取代範圍

1 7 指從第一行至第七行, 1 $ 指從第一行至最後一行,也可用 % 代表。

pattern

要被取代掉的字串

可用一般字串或正規表示式來表示

string

要將 pattern 取代的內容

每次取代前會詢問是否確認取代

不顯示 error

不詢問,指定取代範圍內全部替換

沒有加上 g 時只會取代範圍內第一個找到的位置

不分大小寫

vi 一開檔就會建立一個檔名為 <filename> swp 的隱藏檔,可用於回復檔案用,一般與所開啟的檔案位於同一目錄下,可以用 :set noswf swap 的功能關掉,但如果編輯的檔案較大,則不建議關閉 swap ,會很吃記憶體。

回復指令如下 :

$ vi -r filename

或進入 vi 後,下 :recover filename

通常在 vi 不正常結束時才會需要進行緊急回復。

visual mode 底下可以對檔案的內容作標示的動作。

v ( 小寫 )

字元標示,按下 v 後移動游標,游標經過的地方會被標示起來。再按一次 v 結束標示。同用 mouse 拉出的標示區。

V ( 大寫 )

行標示,按下 V 後會將游標所在處整行標示起來 ( 包括行首前空白的部分 ) ,以上下鍵移動游標,可標示多行。再按一次 V 結束標示。

Ctrl-v

區塊標示,可縱向標示矩形區域。再按一次 Ctrl-v 結束標示。

刪除標示區內容

複製標示區內容

Esc Ctrl-c

結束 v-mode

把標示區內容存於 a 緩衝區中

Shift->

標示區內容向右移一個 Tab

Shift-<

標示區內容向左移一個 Tab

:set :se 會顯示所有經過修改的部份,就是和預設值不一樣的部份。

:set all 顯示目前所有設定值內容。

:set option? 顯示 option 這設定的目前值。

:set option 直接線上設定,有些設定需加 = 後加上設定值內容。

:set nooption 取消該設定。

:set 可以同時設定多個參數。例如 :set autoindent noconfirm autowrite

以下為更改設定的範例 :

:set number 顯示行號。

:set nonumber 取消顯示行號。

依據程式相關語法顯示不同顏色

:syntax on

:syntax off