vi
vi是一個古老(?)的文字編輯器,它廣泛被預設安裝在各種Linux與FreeBSD系統上(還有MacOS),可以直接透過CLI(command line interface)來操作。對於學習生物資訊的同學來說,你可能經常會需要透過SSH練線來編輯或修改一些用手稿語言寫成的文件。如果能熟悉vi的基本操作,對工作的效率會有很大的幫助。不過學習vi編輯器的使用,對於一向習慣使用視窗環境的初學者來說,會需要一些時間和耐性。以下整理了我在課堂上所講的相關內容:
操作時的三種模式
一般人因為在視窗環境下使用文字編輯器(譬如Word),可能已經習慣了透過滑鼠操作視窗選單,快速選單,各種快捷按鈕去編輯文件。然而當我們在CLI下編輯純文字文件的時候,上述那些選單裡面許多的功能,譬如一些格式設定,各種插入圖像表格的功能其實都是不需要或不存在的。想像你只有靠鍵盤在編輯純文字的話,你覺得一個文字編輯器應該具備哪些功能?這些功能如何讓使用者在鍵盤上達成呢?沒錯!你不可避免的需要用到一些快捷鍵。
用鍵盤輸入文字,最陽春的想法就是像打字機一樣的模式吧?但是電腦跟打字機不一樣,打字機都是一行一行從頭打到尾,在電腦的文字編輯過程中,我們通常可以靠游標的移動,選擇從文件不同的位置進行編輯。所以有些時候,鍵盤的功能不僅是要輸入本文的字元,而是要被拿來下編輯命令,譬如你可呢希望按下按鍵時,是移動游標、刪除游標上的文字、複製、貼上等等。有時候則是像打字機一樣純粹用鍵盤進行字元的輸入。而在第三種情境裡,你還會需要在鍵盤上它進行存檔、離開編輯器等操作。因此vi編輯器有三種主要的模式:命令模式(Command Mode)、插入模式(Insert Mode)、和所謂的最後一行模式(Last Line Mode)。
首先,你可以在CLI裡面打vi啟用vi文字編輯器,並且進入vi的畫面:
vi filename
如果檔案不存在,vi會自己建立一個新的檔案
命令模式(Command Mode)
當 vi 啟動時,默認處於命令模式。在命令模式下,vi 將你輸入的任何字符解釋為命令,而不是文本。因此你在這個模式下看不到你在鍵盤上按下的東西。命令模式允許你在文件中進行移動游標、刪除、複製或粘貼文本等動作。
- 進入命令模式:按
Esc
鍵。從其它模式切換到命令模式都是這樣。簡單來說,如果你也不確定你當下是什麼模式,你先按Esc再下命令就對了。
以下是在命令模式裡的一些基本命令操作,請按Esc,進入命令模式,然後:
移動游標
- 左移:按 h
- 右移:按 l
- 上移:按 k
- 下移:按 j
- 到當前這行的最前面:按 0
- 到當前這行的最後面:按 $
- 到文件的最後(最底下):按 G
- 到文件的開頭(最上面):按 gg
- 到下一頁:Ctrl + f
- 到上一頁:Ctrl + b
刪除
- 刪除當前字元:按 x
- 刪除當前行:按 dd
搜尋文字
按 /,輸入要搜尋的文字,譬如 example,然後按 Enter。vi 會跳到下一個出現 example 的位置。
跳到下一個匹配項:按小寫 n,會跳到下一個匹配的 example。
跳到上一個匹配項:按大寫 N,會跳到上一個匹配的 example。
注意:在 vi 編輯器中搜尋包含特殊字元的內容時,需要對這些特殊字元前面加上 \
,讓 vi 知道你是要搜尋這些字元本身,而不是它們的特殊含義。譬如說 /,請打\/,而 ?變成\?,*變成\*,+變成\* 等等。常見的情況例如你要搜尋文件裡面的 /opt/anaconda3/bin/python3 ,你就要在命令模式下(Esc),輸入 /\/opt\/anaconda3\/bin\/python3 然後按下Enter搜尋喔!
複製和粘貼
- 複製當前行:按 yy
- 粘貼:按 p
全部取代
將文本中的每一個apples都換成bananas
:%s/apples/bananas/g
當我們把檔案在不同的作業系統之間傳送的時候,偶爾會錯誤地出現一堆所謂換行符號。當你在 Unix 系統中打開一個從 DOS/Windows 系統傳來的文件時,可能會看到每行結尾處有一個額外的 ^M 符號(所謂的carriage-return character),這是因為來自DOS/Windows的文件用所謂的CRLF來標註每一行的結尾,它的樣子像\r\n, 在Unix 系統下這些符號會被顯示為一個看起來像是 ^M 的符號 (它是一個符號不是兩個)。有一些老的Perl手稿上傳到Linux裡面不能用,常常是這種原因。這樣的問題其實只要把這些符號去除就可以完全解決了。用vi開啟編輯這樣的檔案,你會看到在每一行的盡頭都出現了一個像是^M的符號。以下是在vi中去除掉所有^M的方法。附帶一提,這個^M符號輸入的方法是按下 (Ctrl+v+m)
:%s/^M//g
插入模式(Insert Mode)
進入插入模式:在命令模式下,按 i 進入插入模式 (或者按a,差別是會把輸入的內容append在游標後面一個位置)。
在插入模式下,你用鍵盤輸入的所有字元都會被視為文本被插入在游標的位置上。簡單來說這就是打字模式!
你可以隨時按 Esc 鍵離開插入模式,進入命令模式。
最後一行模式(Last Line Mode, Escape Mode)
從命令模式下,按冒號 (:) 就可以進入最後一行模式,做存檔、離開等動作。按下Enter則會回到Command Mode。當你在插入模式下要進入最後一行模式,你會需要先按Esc (到命令模式),然後按下冒號 (:) (從命令模式進入到最後一行模式)
退出 vi
- 存檔並退出:: (冒號鍵) + wq + Enter
- 直接退出(不存檔):: (冒號鍵) + q! + Enter