vimの範囲置換
ある程度コードを書いてから、自分の設計ミスに気づいて今書いたところを直して…と思ったらその修正もおじゃんなので再び書きなおして…という三歩進んで二歩下がる水前寺清子式開発を実践している僕です。
vimを1年以上使っていながら今日初めて選択範囲置換の方法を知りました。行単位かファイル単位での置換しかしらなかったので、すごく便利です。これで僕の三百六十五歩のデスマーチも捗りそうです。
というわけでvimでの置換についておさらいしたので覚書。
文字単位で置換
r
カーソルを置換したい文字に合わせて r を入力し、その後に置換したい文字を入力すると、カーソルの文字が置換される。
行単位で置換
:s/{置換前文字}/{置換後文字}/[オプション]
これでカーソル行内にある文字を置換できる。
置換時のオプションには次の文字が使える
- g 行の中でマッチしたすべての文字を置換する
- c マッチするたびに置換するかどうか聞く
- i 大文字小文字のを無視する
- I 大文字小文字を判別する
- n 該当する箇所が何箇所あったか教えてくれる、教えてくれるだけで置換は行わない
また以下のようにスラッシュをセミコロンで代用できる。
:s;{置換前文字};{置換後文字};[オプション]
例えば/var/www/のようなスラッシュの入った語を置換したい時なんかに使用する。
範囲を指定して置換する
:'<,'>s/{置換前文字}/{置換後文字}/[オプション]
ヴィジュアルモードで行など選択中にコロンを押すと「:'<,'>」がコマンドラインに挿入される。なのでそこに行単位置換のコマンドを追加すればいい。
また、以下のようにしてある行からある行までを指定してそのなかで置換させることもできる。
:開始行,終了行s/{置換前テキスト}/{置換後テキスト}/[オプション]
どちらもオプションを使うことができる。
ファイル単位での置換
:%s/{置換前文字}/{置換後文字}/[オプション]
%を挿入することで、ファイル全体を対象とした置換ができる。