承接上篇基礎操作,本文深入講解 vi 的多次操作命令、命令列模式、檔案級讀寫與多檔案編輯技巧,助你從「會用」邁向「精通」。
語法:[次數][命令]。例如:
50dd:一次刪除 50 行,替代連按 50 次 dd。50yy:複製當前行以下 50 行。2cw:修改光標起始的 2 個單字(如將 hello myself 改為 hi world)。超過 2-3 次重複操作時,務必使用此語法,擊鍵數可減少 90% 以上。
輸入 : 進入命令列,支援行號範圍操作:
| 命令 | 說明 |
|---|---|
:2,3d | 刪除第 2 至 3 行(絕對) |
:.,+1d | 刪除當前行至下一行(相對) |
:+1,+2d | 刪除下一行至再下一行 |
:2,$d | 刪除第 2 行至檔案末尾($ 表末行) |
:1,$s/hello/hi/g | 全檔替換 hello 為 hi |
查看當前行號:Ctrl-g 顯示 The cursor is at line 1 of 3。
經驗法則:20 行內用相對法,大量刪改用絕對法。
場景:將 a.c 中的 open_deal 函數複製到 b.c。
vi a.c
/open_deal # 搜尋函數名
n # 定位到函數起始
Ctrl-g # 記錄起始行號(如 243)
G # 跳至函數末尾
Ctrl-g # 記錄結束行號(如 343)
:243,343w open.c # 將區塊寫入 open.c
:q!
vi b.c
G # 移至欲插入位置
:r open.c # 讀入 open.c 內容
:x!
核心指令:n1,n2w filename 寫入區塊,r filename 讀入檔案。
vi *.c # 一次開啟所有 .c 檔
/open_deal # 在第一個檔搜尋
:n # 切換下一個檔案
/open_deal # 繼續搜尋,直到找到
:n 切換緩衝區,配合搜尋可快速定位分散在多檔的函數。
vi file 編輯單檔
vi *.c 編輯多檔
:q 未修改時退出
:q! 強制放棄修改退出
:x / :wq 存檔退出
:x! 強制存檔退出
i / I 當前字符前/行首插入
a / A 當前字符後/行尾插入
o / O 當前行下/上方新增行
r 替換單一字符
cw 修改當前單字
x 刪除當前字符
dd 刪除當前行
u 撤銷上一步操作
yy 複製當前行
p 貼上到下一行
:1 / 1G 檔案首行
G 檔案尾行
. 當前行
+n 當前行往下 n 行
Ctrl-g 顯示行號資訊
n[命令] 重複命令 n 次
/pattern 向下搜尋
n 下一個匹配
:n1,n2s/s1/s2/g 區間全域替換
:n1,n2 w f 區塊寫入檔案 f
:r f 讀入檔案 f 到當前行下
同樣結果,擊鍵越少代表命令選擇越精準。例:
Ahello<Esc>(7 鍵)優於移動游標再插入(57 鍵)。D+A(16 鍵)優於逐字刪改(25 鍵)。盲打速度與命令精準度同樣重要,優秀工程師編輯如行雲流水,停頓不超 2 秒。
vi 與 C 語言、Unix 共生共長,是劈開程式碼硬柴的利刃。掌握這 7 步驟,編輯層面幾乎無懼任何 C 專案。精通無終點,但每一次擊鍵優化,都是向大師邁進的一步。