Vim 的 `q` 巨集(Macro)就像是你的專屬「動作錄製機」。很多人覺得它難用,是因為錄製過程一旦出錯就要重來,或者錄出來的巨集「不夠強健」,換一行就失效。
身為 Java 內網開發者,你一定常遇到要把一堆 Log 轉成 JSON,或是要把 50 個變數宣告改成 Setter。以下是幾個讓 `q` 巨集從「堪用」變成「神級工具」的進階建議:
---
### 1. 錄製時的「絕對準則」:使用語義移動
錄製巨集最忌諱用「方向鍵」或「h/j/k/l」。如果你錄了「往右按 5 次」,只要下一行的長度不一樣,巨集就毀了。
* **用 `0` 或 `^` 開始**:確保每一行的起點一致。
* **用 `f` 或 `t` 找字元**:例如錄製 `f(` 跳到左括號,而不是按右鍵按到死。
* **用 `w`, `e`, `b` 跳單字**:這能確保你準確落在變數名稱上。
* **用 `A`, `I`, `C` 進入插入模式**:這比 `i` 再手動移動更快且更準。
---
### 2. 「遞迴巨集」:錄一次,跑全檔案
如果你有 1000 行要處理,手動按 `1000@a` 很累。你可以錄製一個會「自我呼叫」的巨集:
1. 先清空暫存器:`qaq`。
2. 開始錄製:`qa`。
3. 執行你的操作。
4. 最後加一個 `j`(跳到下一行)。
5. 按 `@a`(呼叫自己)。
6. 按 `q` 結束錄製。
7. 現在按一次 `@a`,它就會**自動跑到底**,直到某一行操作失敗為止。
---
### 3. 不要重錄!直接「修改」巨集
錄製到一半出錯不必瘋掉。巨集其實就存在你的暫存器裡(像剪貼簿一樣)。
* **貼出來**:在新的一行輸入 `"ap`(把暫存器 `a` 的內容貼出來)。
* **編輯它**:你會看到一串像 `^Ipublic void...` 的文字,直接像編輯一般文字一樣修改它。
* **存回去**:游標移到這行,按 `0"ay$`(從開頭抓取整行存回 `a`)。
* **再執行**:`@a`。
---
### 4. 搭配「視覺模式」批量執行
如果你不想用遞迴,也可以用「選取執行」:
1. 錄好巨集(假設在 `q`)。
2. 用 `V` 選取你要處理的所有行。
3. 輸入 `:`,畫面會出現 `:'<,'>`。
4. 接著補完指令:`:'<,'>normal @q`。
5. 這會對選取的每一行分別執行巨集。
---
### 5. 巨集 vs `.` (點號) vs `:%s`
架構師選用工具的時機:
* **`.` (Dot)**:簡單的小修改(例如在行尾加個分號)。
* **`:%s` (Regex)**:結構非常規律、可以用關鍵字取代的情況。
* **`q` (Macro)**:**需要跨行邏輯**、**複雜的條件移動**,或是**一連串不同指令組合**時。
---
### 巨集
要使用Vim的巨集功能,可以按照以下步驟進行:
1. 錄製巨集:進入Normal模式,按下"q"鍵後接一個字母(用來指定巨集的名稱),然後進行需要錄製的操作步驟。操作完畢後再按下"q"鍵停止錄製。
1. 執行巨集:在Normal模式下輸入 "@" 後接巨集的名稱(剛剛錄製時指定的字母),然後按下Enter鍵即可執行巨集。
1. 重複執行巨集:若要重複執行巨集,可以在Normal模式下輸入一個數字(表示執行幾次)後再接 "@" 和巨集的名稱,按下Enter鍵即可重複執行。
1. `:reg` 命令用於顯示當前 vim 緩衝中的暫存器內容。透過這個命令可以查看、複製或刪除已複製的文字內容。
1. 存儲巨集:若要將巨集永久保存,可以將巨集存入vimrc文件中。可以使用以下命令:`:let @a='巨集內容'` 中的 'a' 是巨集的名稱。