Vimの文字列検索の基本(/ と ?)と正規表現の入り口
Vimの検索は/を打つだけでも十分使えますが、正規表現を少し知っているだけで検索の精度が大きく変わります。最初に押さえておくと効くパターンをまとめます。この記事はいま開いているファイルの中を探す話で、複数ファイルやファイル名まで含めた全体は検索まとめにあります。
目次(10項目)
| キー | これだけ覚える |
|---|---|
| / / ? | 下方向 / 上方向へ検索 |
| n / N | 同方向 / 逆方向に次のマッチへ |
| zz | マッチ行を画面中央に再配置 |
基本の検索方向
/{文字列} " 下方向(カーソルより後ろ)へ検索
?{文字列} " 上方向(カーソルより前)へ検索
検索後はnで同じ方向に次のマッチへ、Nで逆方向に移動します。/で検索したときと?で検索したときではnの実際の移動方向が変わる点に注意してください。nは常に「最初に指定した検索方向」を維持します。
set hlsearch のあと /config で検索したところ。一致した箇所が全部光る覚えておきたい正規表現パターン
| パターン | 意味 |
|---|---|
/^text | 行頭が「text」の行を検索 |
/text$ | 行末が「text」の行を検索 |
/foo\|bar | 「foo」または「bar」を検索 |
/\d\d\d | 連続する3桁の数字を検索 |
^と$は他の言語の正規表現とも共通する感覚で使えますが、Vimの正規表現は独自の癖があり、括弧やパイプ(OR)を素の状態で使うには\でエスケープする必要があります(\|や\(など)。\v(very magic)を先頭に付けると、他言語の正規表現に近い書き方でエスケープを減らせます。
/\v(foo|bar)
INFO: start
ERROR: code 404
INFO: end
/\d\d\dINFO: start
ERROR: code 404
INFO: end
カーソルは行単位ではなく、マッチした文字列の先頭に正確に移動します。
検索履歴を再利用する
q/
q/を実行すると検索履歴のウィンドウが開き、過去に検索したパターンを一覧から選んで再実行できます。長い正規表現を何度も打ち直したくないときに便利で、コマンドラインモードで上下キーを押しても同じように履歴をたどれます。
大文字小文字を区別するかどうか
デフォルトではignorecaseの設定に従いますが、パターンの中に大文字が含まれていると自動的に区別するsmartcaseという設定もよく使われます。検索が思った通りにヒットしないときは、まずこの大文字小文字の扱いを疑うと解決します。
\|でOR検索、\dで数字を検索します。\vを使えば普段慣れた正規表現の書き方に近づけられます。
ログファイルから特定のエラーコード(3桁の数字)だけを含む行を探したいとき、/\d\d\dで一発で絞り込めることに気づいてから、検索コマンドを正規表現込みで使う機会が一気に増えました。\vを知ってからはエスケープの数を数える手間も減りました。
検索中にカーソルを画面中央へ
検索でヒットした行が画面の端に寄っていて見づらいときは、zzでカーソル行を画面中央に、ztで画面上部に、zbで画面下部に再配置できます。検索直後にこれらを組み合わせると、周辺の文脈を見ながら次の作業に移りやすくなります。特にzzは使用頻度が高く、検索後の定番動作として指に覚えさせておく価値があります。nで次のマッチへ移動するたびにzzを挟む人も多く、慣れると無意識のセットになり、画面が大きく揺れる感覚もなくなって、読みやすさが目に見えて安定します。
検索をそのまま範囲として使う
Vimの検索は移動のキーなので、削除や書き換えの範囲としてそのまま渡せます。行数を数えずに「次にこの文字列が出てくるまで」を指定できます。
d/return<Enter> " 次の return の手前まで消す
d/return/e<Enter> " return を含めて消す
y?function<Enter> " 前の function までコピー
検索モーションは見つかった位置を含まないので、その語ごと消したいときは末尾に /e を付けます。この指定は検索そのものにも効き、/return/e だけを打てば語の末尾にカーソルが止まります。
ファイルの端で折り返さないようにする
既定の検索は、末尾まで行くと先頭に戻って続きます。便利な反面、オペレータと組み合わせたときにこれが起きると、カーソルより前の位置が範囲の端になり、意図しない方向が消えます。
set nowrapscan " 端まで行ったら止まる
折り返さない設定にすると、見つからなければ何も起きません。範囲の指定に検索を使うことが多い人は、こちらのほうが事故が起きにくくなります。
ハイライトを消す
hlsearch を有効にしていると、検索した語が画面に残り続けます。用が済んだら :nohlsearch で消せますが、毎回打つのは手間です。
:noh " 一時的に消す(次の検索で戻る)
nnoremap <Esc><Esc> :noh<CR> " Esc 2回で消す
Neovimでは Ctrl-l が画面の描き直しとハイライトの解除を兼ねているので、設定なしでこのキーで消せます。Vimで同じようにしたいなら、Ctrl-l に :nohlsearch を足す割り当てを書きます。複数ファイルを横断して探すときはvimgrepの記事にまとめています。
まとめ
基本の//?に加えて、行頭行末指定とOR検索を覚えるだけで検索の実用性が大きく上がります。カーソル下の単語をそのまま検索したい場合は別記事を参照してください。
ここで扱ったキーは、ブラウザ上で動くVim道場の検索でジャンプするでそのまま試せます。インストールもログインも要りません。