← Vim道場

同じ名前をまとめて直す

変数名を変えるのは日常的な作業です。Vimには一括置換とドット繰り返しという2つの道があり、場面によって速いほうが変わります。両方を手で試して、感覚をつかんでください。

第7章 腕試しレッスン 32 / 36

置換と繰り返しの使い分け

:%s は速いかわりに、意図しない場所まで書き換わることがあります。user を置換したつもりが username まで変わった、というのはよくある事故です。単語として一致させるなら :%s/\<user\>/member/g のように単語境界を書きます。

いっぽう *. の組み合わせは、1か所ずつ目で見て決められます。* は最初から単語単位で検索するので、部分一致の巻き込みも起きません。数か所なら、こちらのほうが安全です。

確認しながら置換する

:%s/user/member/gc のように c を付けると、1か所ごとに置換するかどうかを聞いてきます。一括置換の速さと目視の安全さの中間です。

名前を変えるときに見落とす場所

変数名を置換するとき、コードの中の識別子だけを見ていると取りこぼしが出ます。文字列リテラルの中、コメント、ログに出しているメッセージ、テストの期待値などにも同じ名前が書かれていることがあります。

逆に、それらを機械的に一括置換すると、変えてはいけない文言まで変わります。c フラグを付けて1件ずつ確認するか、まず / で検索して当たる場所を眺めてから範囲を決めるのが確実です。

範囲を絞って置換する

ファイル全体ではなく特定の関数の中だけを直したいときは、範囲を書きます。ビジュアルモードで選んでから : を押せば :'<,'>s/user/member/g の形になり、選んだ範囲だけが対象になります。

行番号で :10,40s/user/member/g と書くこともできます。範囲を絞れば単語境界を書かなくても事故が起きにくくなるので、書き方が思い出せないときはこちらでも構いません。

エディタの機能でリネームする方法もある

NeovimでLSPを設定していれば、識別子の上で grn を押すことで言語サーバーによるリネームができます。文字列やコメントを巻き込まず、他のファイルにある参照もまとめて直せるので、本格的なリファクタリングではこちらが向きます。

この練習で扱っているのは、1つのバッファの中を自分の目で確かめながら直す方法です。LSPが使えない環境や、設定ファイル・ログ・原稿のようにコードではないテキストでは、こちらの手が必要になります。

このレッスンで扱うキー

キー動き
:%sファイル全体を置換
*カーソル位置の単語を検索
ciw単語を書き換え
.直前の変更を繰り返す
n次の検索結果へ

関連記事

レッスン一覧へ戻るキーの逆引き一覧検定を受ける