FreeBSD 中 vi 的指令用法

vi:

vi 有三種狀態,分別是命令模式 ( Command mode )插入模式 ( Insert mode )、和底線模式 ( Last line )。各模式的功能區分如下:

  • Command mode:此模式在於控制游標移動、刪除字元或搬移某個區塊。
  • Insert mode:只有在此模式下,才可以輸入文字。
  • Last line mode:此模式在於儲存檔案、離開 vi、找尋字串、列出行號和求助等等。

你可以鍵入 vi  <filename>或 v i來進入 vi 編輯器。不同的是 vi  <filename> 會以 filename 做為文件的預設檔名。如果 filename 存在時,則直接編輯此檔。而直接鍵入 vi 時則不會預設文件檔的檔名,也不會開啟已存在的檔案。一開始進入 vi 時是在 Command mode 下。你可以從 Command mode 轉為 Insert mode,或從 Command mode 轉為 Last line mode。注意,要開始輸入文字一定要進入 Insert mode。以下說明如何在各種模式中轉換。

  1. Command mode -> Insert mode
    在 Command mode 下按 i、a 或 o 都可以進入 Insert mode,並且可以開始輸入字元資料。這三種輸入文字的方式不太一樣:


    •  i :插入,從目前游標所在之處插入所輸入之文字。
    • a :增加,從目前游標所在的下一個字開始輸入文字。
    • o :插入新的一行,並從行首開始輸入文字。


  2. Insert mode -> Command mode
    只要在 Insert mode 下按 [ESC] 即可回 Command mode。
  3. Command mode -> Last line mode
    當在 Command mode 下按 : 、 / 或 ? 都可進入 Last line mode。這時你所鍵入的指令都會出現在最下面一行。這三種進入方式分別代表三種功能:
    • ::按 : 後,你可以接著鍵一些特殊的指令如存檔、離開...等等。
    • /:鍵入 / 以後,你可以輸入你所要找尋的字串。vi 會從文件開頭往上往下找尋符合的字串
    • ?:鍵入 ? 以後,你可以輸入你所要找尋的字串。vi 會從文件尾端由下往上找尋符合的字串
    • :e filename:編輯另一個檔 filename,如果放棄當前改變,使用 ! 強制
    • :% s/string1/string2/g 在整個文章範圍內尋找 string1,用 string2 取代

前面我們提到過,當你啟動vi以後,會在 Command mode 下。如果你要鍵入文字時,你必須轉到 Insert mode。這時若你又想刪除文字,你會發現按倒退鍵居然沒有作用。原來 vi 必須轉換到 Command mode 下刪除文字。等你文件打完想存檔的時候,你又會發現在 Command mode 下居然沒有存檔的指令。原來存檔的指令是在 Last line mode 下。所以底下我們將介紹 Command mode 和 Last line mode 下幾個比較常用的功能:

Command mode
  1. 移動游標:

    • 除了上、下、左、右鍵可以移動游標外,小寫英文字母 h、j、k、l 也可以用來移動游標。h、j、k、l 分別代表 左、下、上、右。
    • 按 [ctrl + b]:螢幕往後移動一頁。
    • 按 [ctrl + f ]:螢幕往前移動一頁。
    • 按 [ctrl + u]:螢幕往後移動半頁。
    • 按 [ctrl + d]:螢幕往前移動半頁。
    • 按 G:移動到文章的最後一行。
    • 按1G:移動到文章的第一行
    • 按 w:游標移到下個 word 的開頭。
    • 按 e:游標移到下個 word 的字尾。
    • 按 b:游標回到上個 word 的開頭。
    • 按 0:游標移動到所在行的開頭
    • 按 $:游標移到所在行的最後一個字元。
    • 按 ^:移到該行第一個非空白字元。
    • 按 n:重複上次搜尋動作。
    • 按 #|:移到該行的第 # 個字元,# 為一個數字。如 5| 表示移動游標到第五個字元。

  2. 刪除文字:
    • x    :每按一次就刪除游標所在位置的後面一個字元。
    • #x  :刪除游標所在位置的後面 # 個字元,如 6x。
    • X   :每按一次就刪除游標所在位置的前面一個字元。
    • #X :刪除游標所在位置的前面 # 個字元,如 20X。
    • dd  :刪除一整行,此行位於游標所在位置。
    • #dd:往下刪除 # 行文字。
  3. 複製
    • yw :將游標所在之處到字尾的字元複製到緩衝區中。
    • yy  :複製游標所在之行。
    • #yy:拷貝目前游標往下數 # 行的文字。
    • p   :將緩衝區內的字元貼到游標所在位置。
  4. 取代
    • r :取代游標所在處之字元。
    • R:取代字元直到按 [ESC] 為止。
  5. 復原上一個指令
    • u:若你不小心操作錯誤,可以按 u 來回復資料。
  6. 更改
    • cw:更改游標所在處的字到字尾 $ 處。
    • c#w:如 c3w 代表更改三個字。
  7. 跳至指定之行
    • [ctrl+g]:列出游標所在之行的行號。
    • #G:跳至第 # 行。

 Last line mode
進入 Last line mode 之前,一定要先進入 Command mode 才行。然後按 :、/、? 都可以進入 Last line mode。前面已經講過按 / 和 ? 都是在做搜尋字串之用,所以我們現在只介紹按 : 後所能輸入的功能。記得輸入這些命令之前一定要在 Command mode 下按 :。
  1. 列出行號

    • set nu:鍵入這個命令以後會在文章的每一行前面列出行號。

  2. 跳到文章的某一行

    • #:井號代表一個數字。比如你輸入 15 並按 Enter 以後,游標就會跳到第 15 行。

  3. 存檔

    • w:若你已經有預設文件檔的檔名,則下這個指令可以將你編輯過的檔案存起來。
    • w  filename:下這個指令可以把你編輯過的文件存在 <filename> 這個檔案之中。
    • #,#  w  filename:# 是指數字,如 20,30  w  test.txt。這個意思是說把 20 行到 30 行的資料存到 test.txt 檔案中。

  4. 離開

    • q:離開 vi
    • q!:強制離開 vi。有時候按 q 不能離開 vi 的話就可以鍵入這個指令強制離開。
    • wq:存檔並離開。
    • x :存檔並離開,相當於:wq

  5. 求助
    • help:vi 的指令真的是又多又繁雜,所以要背住所有的指令簡直是不可能的事。所以如果你想查詢某個指令的功能時,鍵入 help 就可以達到這個功能。這是鍵入 help 以後所出現的畫面。請看下面那幾行。第一行是說如果你要查詢 vi 的命令,請鍵入 :viusage。所以你只好再乖乖鍵入一次指令,它就會出現 vi 命令的列表了。第二行說明如果要看 ex 命令的話,請鍵入 :exusage。