同じ名前をまとめて直す
変数名を変えるのは日常的な作業です。Vimには一括置換とドット繰り返しという2つの道があり、場面によって速いほうが変わります。両方を手で試して、感覚をつかんでください。
置換と繰り返しの使い分け
:%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 | 次の検索結果へ |