next up previous contents
Next: vim 的額外功能 Up: vi 編輯器 Previous: vi 與 vim   Contents

vi 的使用

  1. vi 共分為三種模式,分別是『一般模式』、『編輯模式』與『指令列命令模式』三種。

    \begin{picture}(140,110)% setlength\{ unitlength\}\{1pt\}
\put(0,0){\dashbox{1}(...
...1}(120,45){\shortstack{command mode \\ read, save file \\ other}}}
\end{picture}
  2. 簡易範例
    1. 使用 vi 進入一般模式
      [dywang@dywOffice tmp]$ vim test.txt
      
    2. 按下 i 進入編輯模式,開始編輯文字。
    3. 按下 [Esc] 按鈕回到一般模式。
    4. 在一般模式中按下 :wq 儲存後離開 vi。
  3. 常用指令列表
    一般模式 移動游標
    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 的字串。
    n 重複前一個搜尋。
    N 反向進行前一個搜尋動作。
    :n1,n2s/word1/word2/g 在第 n1 與 n2 行之間尋找 word1 這個字串,並將該字串取代為 word2 。
    :1,$s/word1/word2/g 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 。
    :1,$s/word1/word2/gc 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 且在取代前顯示提示字元給使用者確認是否需要取代。
    一般模式 刪除、複製與貼上
    x, X x 為向後刪除一個字元,X 為向前刪除一個字元
    nx 向後刪除 n 個字元
    dd 刪除游標所在的那一整列
    ndd 刪除游標所在的向下 n 列,例如 20dd 則是刪除 20 列
    d1G 刪除游標所在到第一行的所有資料
    dG 刪除游標所在到最後一行的所有資料
    dw 刪除一個字(delete word)。不適用於中文。
    yy 複製游標所在的那一行(常用)
    nyy 複製游標所在的向下 n 列,例如 20yy 則是複製 20 列
    y1G 複製游標所在列到第一列的所有資料
    yG 複製游標所在列到最後一列的所有資料
    p, P p 為複製的資料在游標下一行貼上,P 則為貼在游標上一行。
    J 將游標所在列與下一列的資料結合成同一列
    u 復原前一個動作。
    [Ctrl]+r 反復原前一個動作。
    . 重做上一個動作。
    進入編輯模式
    i, I 插入:i(I) 在目前的游標所在處(所在行第一個非空白字元處)插入輸入之文字;
    a, A 增加:a(A) 由目前游標所在的下一個(最後一個)字元處開始輸入:
    o, O 插入新的一行:o(O) 從游標所在的下(上)一行插入新的一行;
    r, R 取代:r 會取代游標所在的那一個字元;R 會一直取代游標所在的文字,直到按下 ESC 為止;
    Esc 退出編輯模式,回到一般模式中。
    指令列命令模式
    :w 將編輯的資料寫入硬碟檔案中
    :w! 若檔案屬性為『唯讀』時,強制寫入該檔案
    :q 離開 vi
    :q! 若曾修改過檔案,又不想儲存,使用 ! 為強制離開不儲存檔案。
    :wq 儲存後離開,若為 :wq! 則為強制儲存後離開
    :x 與 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 ]
  4. vi 編輯中回復與暫存檔
    1. 如果編輯檔案為 /home/csie/vitest.txt,則同時會有一個暫存檔 /home/csie/.vitest.txt.swp 產生,其為隱藏檔。
    2. 結束 vi 編輯時暫存檔也會刪除。
    3. 若不知因素導致 vi 程式中斷,則在下次編輯該檔案時會出現是否回復的訊息。

練習題

  1. vi 有那三種模式?
    Sol. 一般模式、編輯模式與指令列模式
  2. 在 vi 一般模式下,可以那四個字元鍵進行游標向左、下、上、右移動一個字元?
    Sol. h j k l
  3. 在 vi 一般模式下,如何使螢幕『向前』移動一頁?
    Sol. [Ctrl]+f
  4. 在 vi 一般模式下,如何使螢幕『向後』移動一頁?
    Sol. [Ctrl]+b
  5. 在 vi 一般模式下,如何使螢幕『向前』移動半頁?
    Sol. [Ctrl]+d
  6. 在 vi 一般模式下,如何使螢幕『向後』移動半頁?
    Sol. [Ctrl]+u
  7. 在 vi 一般模式下,如何使游標移動到非空白字元的下一列?
    Sol. 按 + 鍵
  8. 在 vi 一般模式下,如何使游標移動到非空白字元的上一列?
    Sol. 按 - 鍵
  9. 在 vi 一般模式下,如何使游標向右移動這一行的 12 個字元?
    Sol. 按 12<space> 鍵
  10. 在 vi 一般模式下,如何使游標移動到這一行的最前面字元處?
    Sol. 按 0 鍵
  11. 在 vi 一般模式下,如何使游標移動到這一行的最後面字元處?
    Sol. 按 $ 鍵
  12. 在 vi 一般模式下,如何使游標移動到這個螢幕的最上方那一行?
    Sol. 按 H 鍵
  13. 在 vi 一般模式下,如何使游標移動到這個螢幕的中央那一行?
    Sol. 按 M 鍵
  14. 在 vi 一般模式下,如何使游標移動到這個螢幕的最下方那一行?
    Sol. 按 L 鍵
  15. 在 vi 一般模式下,如何使游標移動到這個螢幕的最後一行?
    Sol. 按 G 鍵
  16. 在 vi 一般模式下,如何使游標移動到這個檔案的第 12 行?
    Sol. 輸入 12G
  17. 在 vi 一般模式下,如何使游標游標向下移動 12 行?
    Sol. 輸入 12<Enter>
  18. 在 vi 一般模式下,如何向游標之後尋找一個字串名稱為 word 的字串,接著重複搜尋?
    Sol. 輸入 /word ,接著按 n 鍵
  19. 在 vi 一般模式下,如何向游標之後尋找一個字串名稱為 word 的字串,接著反向重複搜尋?
    Sol. 輸入 /word ,接著按 N 鍵
  20. 在 vi 一般模式下,如何向游標之前尋找一個字串名稱為 word 的字串,接著重複搜尋?
    Sol. 輸入 ?word ,接著按 n 鍵
  21. 在 vi 一般模式下,如何向游標之前尋找一個字串名稱為 word 的字串,接著反向重複搜尋?
    Sol. 輸入 ?word ,接著按 N 鍵
  22. 在 vi 一般模式下,如何向游標後刪除一個字元?
    Sol. 按 x 鍵
  23. 在 vi 一般模式下,如何向游標前刪除一個字元?
    Sol. 按 X 鍵
  24. 在 vi 一般模式下,如何向游標後刪除 12 個字元?
    Sol. 按 12x 鍵
  25. 在 vi 一般模式下,如何向游標前刪除 12 個字元?
    Sol. 按 12X 鍵
  26. 在 vi 一般模式下,如何刪除游標所在的那一整列?
    Sol. 按 dd
  27. 在 vi 一般模式下,如何刪除一個字?(不適用於中文)
    Sol. 按 dw
  28. 在 vi 一般模式下,如何刪除游標所在的向下 12 列?
    Sol. 按 12dd
  29. 在 vi 一般模式下,如何刪除游標所在到最後一行的所有資料?
    Sol. 按 d1G
  30. 在 vi 一般模式下,如何複製游標所在的那一行?
    Sol. 按 yy
  31. 在 vi 一般模式下,如何複製游標所在的向下 12 列?
    Sol. 按 12yy
  32. 在 vi 一般模式下,如何複製游標所在列到第一列的所有資料?
    Sol. 按 y1G
  33. 在 vi 一般模式下,如何複製游標所在列到最後一列的所有資料?
    Sol. 按 yG
  34. 在 vi 一般模式下,如何將複製的資料在游標下一行貼上?
    Sol. 按 p
  35. 在 vi 一般模式下,如何將複製的資料在游標上一行貼上?
    Sol. 按 P
  36. 在 vi 一般模式下,如何將游標所在列與下一列的資料結合成同一列?
    Sol. 按 J
  37. 我已經在 vi 內進行很多動作,但現在想要復原,如何做?
    Sol. 一直重複按 u 即可;
  38. 在 vi 的一般模式中,反復原前一個動作?
    Sol. [Ctrl]+r
  39. 在 vi 的一般模式中,重做前一個動作?
    Sol. .
  40. vi 如何由一般模式進入編輯模式(在目前游標處插入輸入之文字)?
    Sol. i
  41. vi 如何由一般模式進入編輯模式(所在行第一個非空白字元處插入輸入之文字)?
    Sol. I
  42. vi 如何由一般模式進入編輯模式(由目前游標所在的下一個字元處開始輸入)?
    Sol. a
  43. vi 如何由一般模式進入編輯模式(由目前游標所在的最後一個字元處開始輸入)?
    Sol. A
  44. vi 如何由一般模式進入編輯模式(從游標所在的下一行插入新的一行)?
    Sol. o
  45. vi 如何由一般模式進入編輯模式(從游標所在的上一行插入新的一行)?
    Sol. O
  46. vi 如何由一般模式進入編輯模式(會取代游標所在的那一個字元)?
    Sol. r
  47. vi 如何由一般模式進入編輯模式(會一直取代游標所在的文字,直到退出編輯模式)?
    Sol. R
  48. vi 如何退出編輯模式,回到一般模式中?
    Sol. 按下 ESC
  49. 在 vi 的一般模式中,輸入 13 後按 Enter 與輸入 13 後按下 G ,代表什麼意義?
    Sol. 向下移動 13 行,以及去到第 13 行。
  50. 在 vi 的一般模式中,先以指令將游標移到第 13 行,複製 13 到 17 行,再以指令將游標移到第 20 行,最後將資料貼到 20 行以後,如何做?
    Sol. 13G 5yy 20G p
  51. 在 vi 的一般模式中,先以指令將游標移到第 50 行,刪除 50 到 55 行,如何做?
    Sol. 50G 6dd
  52. 在 vi 的一般模式中,如何以指令將游標移到第 5 行,再連結第 5, 6 行?
    Sol. 5G J
  53. 在 vi 的一般模式,輸入 /find 代表什麼意義?另外,輸入 j 又代表什麼意義?輸入 5k 代表什麼
    Sol. 搜尋 find 這個字串; 向下移動: 向上移動 5 個字元。
  54. 在 vi 的一般模式中,我想要取代目前檔案第 100 到 200 行之間的 test 成為 TEST 且不詢問,要如何做?
    Sol. :100,200s/test/TEST/g
  55. 在 vi 的一般模式中,我想要取代目前檔案第 100 到 200 行之間的 test 成為 TEST 且取代前詢問,要如何做?
    Sol. :100,200s/test/TEST/gc
  56. 在 vi 的一般模式中,我想要取代目前檔案第 1 到最後一行之間的 test 成為 TEST 且不詢問,要如何做?
    Sol. :1,$s/test/TEST/g
  57. 在 vi 的一般模式中,我想要取代目前檔案第 1 到最後一行之間的 test 成為 TEST 且取代前詢問,要如何做?
    Sol. :1,$s/test/TEST/gc
  58. 在 vi 的一般模式中,如何儲存並結束檔案後離開?
    Sol. 在一般模式下執行 :wq 或 :x
  59. 在 vi 的指令列模式中,『 :q! 』代表什麼意思?
    Sol. 不儲存,強制離開 vi
  60. 在 vi 的一般模式當中,輸入 ZZ 代表什麼意思?
    Sol. 若檔案已更動,則儲存後離開,若未被更動,則直接離開 vi 。
  61. 在 vi 的一般模式中,如何將編輯的資料寫入硬碟檔案中?
    Sol. 輸入 :w
  62. 在 vi 的一般模式中,如何將目前編輯的檔案另存為 file1.txt?
    Sol. 輸入 :w file1.txt
  63. 在 vi 的一般模式中,若目前編輯的檔案為唯讀檔,如何強制存回?
    Sol. 輸入 :w!
  64. 在 vi 的一般模式中,如何離開 vi?
    Sol. 輸入 :q
  65. 在 vi 的一般模式中,如何強制離開不儲存檔案?
    Sol. 輸入 :q!
  66. 在 vi 的一般模式中,如何儲存後離開?
    Sol. 輸入 :wq 或 :x
  67. 在 vi 的一般模式中,如何強制儲存後離開?
    Sol. 輸入 :wq! 或 :x!
  68. 在 vi 的一般模式中,如何將目前編輯的檔案還原到原始狀態?
    Sol. 輸入 :e!
  69. 在 vi 的一般模式中,如何設定顯示行號?
    Sol. 輸入 :set nu
  70. 在 vi 的一般模式中,如何取消設定顯示行號?
    Sol. 輸入 :set nonu
  71. 在 vi 的一般模式中,如何讀取另一檔案 file.txt?
    Sol. 輸入 :r file.txt
  72. 在 vi 的一般模式中,如何將 10 到 20 的內容儲存成 file1.txt 這個檔案?
    Sol. 輸入 :10,20 w file1.txt
  73. 在 vi 的一般模式中,如何將 10 到最後一行的內容儲存成 file1.txt 這個檔案?
    Sol. 輸入 :10,$ w file1.txt
  74. 在 vi 的一般模式中,如何暫時離開,執行指令 ls -l?
    Sol. 輸入 :! ls -l
  75. 在 vi 編輯檔案 file.txt 中,同時會產生一暫存檔,其檔名為何?
    Sol. .file.txt.swp
  76. 如果要以 vi 編輯檔案 file.txt 時,出現是否回復的訊息,表示有那個暫存檔存在?
    Sol. .file.txt.swp


next up previous contents
Next: vim 的額外功能 Up: vi 編輯器 Previous: vi 與 vim   Contents
De-Yu Wang 2018-10-11