Vimで行内の文字を置換する4つの方法、どれを使えばいいか
Vimには「今いる行の一部を書き換える」だけでも複数のやり方があります。最初はどれか1つを覚えて満足しますが、場面によって向き不向きがあるので、4つとも知っておいて損はありません。
目次(7項目)
| キー | これだけ覚える |
|---|---|
| R | 置換モード。同じ文字数の上書きに |
:s/置換前/置換後/ | ファイル全体・複数行の一括置換 |
| ciw | 単語単位ですばやく書き換え |
| . | 直前の変更を繰り返す |
1. 置換モード(R)
R{変更後のテキスト}
対象の位置に移動してRを押すと置換モードに入り、上書きで文字を打ち込めます。初心者が最初に覚えやすい方法ですが、置換前後で文字数が変わる編集には向きません。
let value = 100;
let value = 200;
文字数が同じ書き換えに限定される点が弱点です。桁数が変わる書き換えでは、余分な文字が残ったり足りなくなったりします。
2. 置換コマンド(:substitute)
:s/置換前/置換後/
他のエディタでもおなじみの置換コマンドです。gフラグで行内の複数箇所を一括置換、cフラグで確認しながら置換できます。ファイル全体や複数行にまたがる置換には非常に強力ですが、1行のちょっとした書き換えに使うにはタイプ数が多くなります。
3. ビジュアルモード+オペレータ
v{範囲を選択}c
ビジュアルモードで範囲を選択してからcで変更します。矩形選択したいときはCtrl-vを使います。選択した範囲がそのまま見えるので直感的ですが、範囲指定のたびにカーソルを動かす手間があり、同じ操作を繰り返す用途にはやや不向きです。
4. オペレータ+モーション/テキストオブジェクト
cw " 単語の頭にいる場合
ciw " 単語のどこにいてもよい場合
移動を最小限にして、範囲指定と変更を1つのコマンドで済ませる方法です。tやfで素早く目的の位置まで移動し、そこからcwやciwで書き換える、という流れが定番になります。cwとciwの使い分けは別記事で詳しく扱っています。
同じ書き換えを繰り返すなら . と組み合わせる
どの方法を選んだ場合でも、同じ変更を別の場所にも繰り返したいなら.(ドットコマンド)が効きます。ciwで単語を書き換えたあと、次の対象へtやfで移動して.を押すだけで、直前と同じ変更を再現できます。置換コマンドの:sはパターンマッチなので繰り返しに強いですが、単発の書き換えを複数箇所に展開したいときはciw系と.の組み合わせのほうが手数が少ないことが多くあります。
どれを選べばいいか
| 状況 | おすすめ |
|---|---|
| 同じ文字数で単純に上書き | 置換モード(R) |
| ファイル全体・複数行の一括置換 | 置換コマンド(:s) |
| 選択範囲を目で確認しながら変更 | ビジュアルモード |
| 単語単位の書き換えを素早く | オペレータ+モーション |
最初は:sだけで何でも済ませていましたが、単語単位の書き換えが多い作業では明らかにオペレータ+モーションのほうが手数が少なくなりました。逆にファイル全体にまたがる置換でciwを繰り返すのは非効率で、結局は状況に応じて使い分けるのが一番速いという当たり前の結論に落ち着きました。
まとめ
行内の置換方法は1つに絞る必要はありません。文字数が同じならR、範囲が広いなら:s、単語単位ならオペレータ+モーション、と場面で切り替えられるようになると編集速度が安定します。