コンテンツにスキップ

Vimマクロ入門:繰り返し作業を一瞬で自動化する

概要

Vim のマクロ機能を使うと、キー操作の列を記録して何度でも再生できる。q{レジスタ名} で記録開始、q で終了、@{レジスタ名} で実行。単純な繰り返し作業であれば、マクロ1つで数十〜数百行の編集を瞬時に終わらせられる。

詳細

基本的な使い方

# マクロの記録
q a         → レジスタ a への記録開始(qの後に任意のアルファベット)
  ...操作...
q           → 記録終了

# マクロの実行
@ a         → レジスタ a のマクロを1回実行
10 @ a      → 10回繰り返す
@ @         → 直前に実行したマクロをもう一度

具体的なユースケース

ケース1: CSV の各行にクォートを追加

# 変換前
name,age,city
Alice,30,Tokyo
Bob,25,Osaka

# 変換後
"name","age","city"
"Alice","30","Tokyo"
"Bob","25","Osaka"

# マクロ操作(1行目にカーソルを合わせて実行)
qa          記録開始
0           行頭へ
i"<Esc>     先頭にクォートを挿入
f,          最初のカンマへ
i"<Esc>     クォートを挿入
a"<Esc>     カンマの後にクォートを挿入
...(同様に繰り返す)
j0          次の行の先頭へ
q           記録終了
99@a        残りの行に適用

ケース2: 連番の変数名を生成

" 変換前(1行だけある状態から)
" let var1 = ""
" ↓ 以下を生成したい
" let var2 = ""
" let var3 = ""
" ...

qa          記録開始
yy          現在行をコピー
p           下にペースト
Ctrl-a      行内の数字をインクリメント
q           記録終了
9@a         9回繰り返して var2〜var10 を生成

ケース3: Markdown のリスト整形

# 変換前(各行が "- item" の形式)
- foo
- bar
- baz

# 変換後(番号付きリスト)
1. foo
2. bar
3. baz

# マクロ操作
qa
0df         先頭の "- " を削除
i1. <Esc>   番号を挿入
j0
q

マクロの確認と編集

" レジスタの中身を確認
:reg a

" マクロを編集する(一度バッファに展開して編集)
:let @a = substitute(@a, '\n', '', 'g')

" 現在のマクロをファイルに保存
:echo @a

応用: 再帰マクロ

" ファイルの末尾まで同じ操作を繰り返す(末尾でエラーになって自動停止)
qa
  (操作)
  @a        ← 自分自身を呼び出す
q
@a          実行開始(末尾に到達したら自動停止)

なぜ重要か / いつ使うか

  • ログファイルや CSV を手作業で整形する必要があるとき
  • 数十〜数百行に同じ編集パターンを適用したいとき
  • プラグインなしで Vim 標準機能だけで完結させたいとき
  • . コマンドで対応できないような複数ステップの繰り返しに向く
  • 「この作業、マクロにできないか」と考える癖をつけると Vim 熟練度が上がる