カーソル下の単語を一発検索する(*/#/g*/g#)
同じ変数名がファイルの中に何箇所あるか確認したいだけなのに、/を押してから変数名を入力し直していました。カーソルが乗っている単語をそのまま検索してくれるコマンドがあり、これを使えば入力の手間がまるごと省けます。
| キー | これだけ覚える |
|---|---|
| * / # | カーソル下の単語を完全一致で下方向 / 上方向へ検索 |
| g* / g# | 境界なしの部分一致で下方向 / 上方向へ検索 |
カーソル下の単語を検索する
* " 下方向(前方)へ検索
# " 上方向(後方)へ検索
カーソルが単語の上にあれば、その単語をそのまま検索パターンとして使います。カーソルが単語の外(空白など)にある場合は、その行でカーソルより後ろにある最初の単語が対象になります。/\<keyword\>と同じように、完全一致でのみヒットする点も覚えておくと安心です。
部分一致で検索する:g*/g#
g* " 下方向、記号を含む部分一致
g# " 上方向、記号を含む部分一致
通常の*/#は単語の境界(\<と\>)を自動的に付けて完全一致で検索しますが、gを前置きすると境界を付けずに検索します。カーソルが独立した単語userの上にあるとき、*は同じ独立したuserしか対象にしませんが、g*ならuser_idのようにuserを含む他の単語にもヒットします。
user = 1
user_id = 2
username = 3
user = 1
user_id = 2
username = 3
同じ場面で*を実行しても、独立したuserは他に存在しないため、カーソルは動きません(一致なしとして自分自身に戻ります)。
単語以外の範囲を検索パターンにしたいとき
*/#はあくまで「単語」単位が対象になります。単語をまたいだ任意の文字列を選択してそのまま検索したい場合は、ビジュアルモードで範囲を選択したうえで検索パターンに変換するキーマッピングを自作している人も多いです。定番の手順としてよく知られているので、興味があれば「vim visual star search」で調べると見つかります。
使い分けの目安
| 状況 | おすすめ |
|---|---|
| 同じ変数名を正確に追いたい | */# |
| 接頭辞・接尾辞が同じ単語もまとめて追いたい | g*/g# |
長い関数の中で、ある変数がどこで使われているかを確認する作業で*を多用するようになってから、検索コマンドを打つ回数自体が減りました。g*の存在を知ってからは、似た名前の変数群をまとめて洗い出したいときにも重宝しています。
検索してから編集につなげる
*で検索したあとにそのままcgnを実行すれば、検索した単語をその場で書き換えられます。単語を検索して終わりではなく、見つけた箇所を編集したいところまでを1つの流れとして覚えておくと使い勝手が広がります。詳しくはcgnの記事を参照してください。検索から編集までの動作をひとつなぎで覚えておくと、都度立ち止まって次のコマンドを考える必要がなくなります。指の動きとして一連の流れが染みつくと、考えるより先に手が動くようになり、編集作業全体のテンポが上がります。小さなコマンドの積み重ねが、結果として大きな速度差になって表れます。
まとめ
カーソル下の単語検索は、正確に一致させたいか関連語も拾いたいかで*系とg*系を使い分けます。検索結果のハイライトが煩わしいときは別記事を参照してください。