Vimのドットコマンド(.)で直前の編集を繰り返す
同じ変更を数カ所に繰り返したいだけなのに、毎回同じキー操作を打ち直していた。Vimには直前の編集をまるごと繰り返す1文字のコマンドがあり、これを覚えるだけで手数が大きく減る。
使い方はキー1つ
.
.(ドット)を押すと、直前に行った「変更」がそのまま繰り返される。ciwで単語を書き換えたあとなら、次の単語に移動して.を押すだけで同じ書き換えが再現される。ここでいう「変更」とは、インサートモードに入ってからEscで抜けるまでの一連の入力・削除操作を指す。
マクロとの違い
複数の操作を繰り返すという点ではマクロと似ているが、決定的な違いは「記録の手間がいらない」ことだ。マクロは事前にqで記録を開始しておく必要があるが、.は直前の変更を自動的に覚えていて、いつでも呼び出せる。単発の変更を数カ所に繰り返すだけなら、わざわざマクロを組むまでもなく.で十分なことが多い。複雑な複数ステップの操作を繰り返したいならマクロのほうが向いている。
繰り返しやすい編集を組み立てるコツ
.を活かすには、変更そのものを「同じ形」で組み立てることを意識するとよい。たとえばciwで単語を書き換える操作は、カーソルが単語のどこにあっても同じ結果になるため、次の対象に移動して.を押すだけで再現できる。逆に、カーソル位置に強く依存する操作(cwなど)は、対象ごとにカーソルの位置がずれていると同じ結果にならないことがある。繰り返し前提の編集をするときは、この違いを意識しておくと失敗が減る。
削除やインデント変更でも同じように使える
.が繰り返せるのは挿入を伴う変更だけではない。dd(行削除)や>>(インデント下げ)のようなインサートモードを伴わない操作も、直前の実行内容として記憶され.で繰り返せる。複数行を1行ずつ同じ理由で削除したいときなど、幅広い場面で使える汎用的な仕組みだと考えてよい。
移動と組み合わせる
ciwNEW " 単語を書き換える
w. " 次の単語へ移動して同じ書き換えを繰り返す
w. " さらに次へ
移動コマンド(wやfなど)と.を交互に打つリズムが身につくと、複数箇所の単純な書き換えが驚くほど速く終わるようになる。
.で十分。マクロは複数ステップの複雑な操作向けと使い分けるとよい。カーソル位置に依存しない変更を心がけると.の再現性が上がる。
似た変数名の書き換えを何十箇所も繰り返す作業で、.の存在を知る前は置換コマンドで無理やり済ませていた。ciwと.の組み合わせを覚えてからは、対象を目で確認しながら1つずつ確実に処理できるようになり、置換コマンドで意図しない箇所まで変えてしまう事故もなくなった。目視確認しながら進められる安心感は、一括置換にはない大きな利点だと感じている。
まとめ
.はVimの基本コマンドの中でも特に費用対効果が高い。1文字で直前の変更を繰り返せる手軽さは、覚えた瞬間から編集速度に直結する。