Vim でカレントファイル内の文字列を検索する (/, ?, *, #)

検索の基本

Vim でカレントファイル内の文字列を検索するには、次のような検索コマンドを使用します。

入力説明
/pattern [Enter]パターンを検索(順方向)
?pattern [Enter]パターンを検索(逆方向)
n次の一致箇所にジャンプ
N前の一致箇所にジャンプ
/ [Enter]同じパターンで再検索(順方向)
? [Enter]同じパターンで再検索(逆方向)
*カーソル下の単語を後方検索(g* で部分一致検索)
#カーソル下の単語を前方検索(g# で部分一致検索)

パターンによる検索 (/, ?)

検索パターンでは正規表現を使用できます。

例: void で始まる行を検索 ^
/^void    " ^ は行頭に一致
例: 0 回以上の繰り返しに一致 *
/te*    " t, te, tee などに一致
例: 1 回以上の繰り返しに一致 \+
/te\+    " te, tee, teee などに一致
例: 0 回あるいは 1 回に一致 \=
/te\=    " t あるいは te に一致
例: 任意のアルファベット (A-Za-z) に 1 文字だけ一致 \a
/\a\a\a    " 任意の 3 文字のアルファベットに一致
例: 任意の数字に 1 文字だけ一致 \d
/\d\d\d    " 任意の 3 桁の数字に一致
例: いずれかの文字に一致 [...]
/[Tt]he      " The, the を検索 (:set ignorecase しておく手もあり)
/x[+*%]y     " x+y, x*y, x%y を検索
/x[\^\-]y    " x^y, x-y を検索 (ブラケット式の中の ^ や - はエスケープする)
例: 繰り返し回数の指定 \{min,max}
/a\{3,5}     " aaa, aaaa, aaaaa に一致 (aaaaa があれば aaaaa に一致する)
/a\{-3,5}    " aaa, aaaa, aaaaa に一致 (aaaaa があっても aaa に一致する)
/a\{3,}      " 3 個以上の a に一致
/a\{,3}      " 3 個以下の a に一致
/a\{3}       " 3 個の a に一致
例: グルーピング \(...\)
/\(abc\)\+      " abc, abcabc, abcabcabc などに一致
                " \( と \) で囲まれた部分に一致したテキストの繰り返し
/\(ab\+c\)\1    " abcabc, abbcabbc などに一致
                " \( と \) で囲まれた部分に一致したテキストを \1 で参照
例: OR 検索(文字列1\|文字列2)
/foo\|bar    " foo か bar に一致
例: print で始まる単語を検索 \<
/\<print    " \< は単語の先頭に一致
例: 単語 word を検索 \< ... \>
/\<word\>    " \< は単語の先頭、\> は単語の末尾に一致
例: 文字クラスの利用 [: ... :]
/^[[:digit:]]    " 数字で始まる行を検索
                 " ブラケット式の中の [:digit:] という文字クラスは数字を表す

検索履歴

/? による検索モードで、CTRL-PCTRL-N(あるいは上下カーソルキー)を入力すると、検索履歴を表示することができます。 過去に入力した複雑な検索パターンで再検索したいときに便利です。

カーソル位置の単語を検索する (*, #)

Vim のノーマルモードで、*# を入力すると、カーソル位置にある単語を後方検索、前方検索することができます。

入力説明
*カーソルの下の単語を後方検索(g* で単語を一部に含む文字列も検索)
#カーソルの下の単語を前方検索(g# で単語を一部に含む文字列も検索)

続けて、n(あるいは N)を入力することで、次の一致場所にジャンプすることができます。

検索後は同じ単語の上にカーソルが移動するので、実際には続けて * を入力することでも次の一致場所にジャンプすることができます。 つまり、同じ単語で連続して検索する場合、連続して入力するキーは、n* のどちらでも構いません。

応用

識別子検索
[I    " カーソル位置のキーワードを含む行をすべて表示する
[D    " カーソル位置のマクロ定義を含む行をすべて表示する
例: 行内に限定して検索
fx    " カレント行の次の文字 x へ移動
Fx    " カレント行の前の文字 x へ移動
tx    " カレント行の次の文字 x のひとつ前の文字へ移動
Tx    " カレント行の前の文字 x のひとつ後ろの文字へ移動
;     " 前回の行内の文字検索を繰り返し(同じ方向)
,     " 前回の行内の文字検索を繰り返し(逆の方向)
例: ピリオドまでのテキストを削除
dt.
例: 閉じ括弧 `)` までのテキストを置換
ct)
例: 空白スペースまでを削除
dt    " 最後にスペースを入力しています