Vimにおいて文字列で検索を行う方法は、第216回でカーソル移動について解説した際に取り上げた。ノーマルモードで「/」キーや「?」キーを押すとコマンドラインモードに移行し、Vim下部にプロンプトが表示される。ここで文字列を入力してエンターキーを押せば入力した文字列で検索が行われ、該当箇所までカーソルが移動するわけだ。

モード 入力 内容
ノーマルモード / コマンドラインモードへ移行(後方検索)
ノーマルモード ? コマンドラインモードへ移行(前方検索)

検索は、Vim内部で目的とする場所に素早く移動するための基本的な方法の1つとなる。編集作業を行いたい場合、編集箇所の文字列についてはすでにわかっていることが多いので、この機能を使用することで該当箇所にダイレクトに移動できるわけだ。

Vimの検索で指定できる文字列には「パターン」と呼ばれるものがあり、これに該当する文字列はただの文字列としてではなく、意味のある指示として解釈される。この機能を使いこなすと、より複雑な検索指定が可能になる。全てを覚える必要はないのだが、”武器”として知っていると知っていないのとでは使い勝手が大きく変わってくる。今回は、このパターンについて紹介しよう。

検索で使えるパターン

検索で使える主なパターンを次にまとめておく。使いそうにないパターンは省いてある。

パターン 内容
^ 行頭(パターンの先頭でのみ指定可能)
$ 行末(パターンの末尾でのみ指定可能)
. 任意の1文字(行末には使用できない)
\%^ ファイルの先頭
\%$ ファイルの終了
\%V Visual領域の中
\%# カーソルの位置
\%’m マークm位置
\%数字l 指定行
\%数字c 指定列
\%数字v 指定仮想列
\_^ 行頭(パターンのどこでも指定可能)
\_$ 行末(パターンのどこでも指定可能)
\_. 任意の1文字(行末としても指定可能)
\< 単語の先頭
\> 単語の末尾
\zs 一致の開始を指定
\ze 一致の終了を指定
\^ ^
\$ $
. .
\e <ESC>
\t <TAB>
\r <CR>
\b <BS>
\n 行末
[] カッコ内に指定した文字のどれかに一致
\c 大文字小文字を区別せずに一致
\C 大文字小文字を区別して一致
\%d 10進数に一致
\%x 16進数に一致
\%o 8進数に一致
\%u マルチバイト文字に一致
\%U ラージマルチバイト文字に一致
\%C 合成文字に一致
\i 識別子文字
\I 識別子文字(数字は含まない)
\k キーワード文字
\K キーワード文字(数字は含まない)
\f ファイル名文字
\F ファイル名文字(数字は含まない)
\p 印刷可能文字
\P 印刷可能文字(数字は含まない)
\s 空白とタブ
\S 空白とタブ以外の文字
\d 数字([0-9])
\D 数字以外([^0-9])
\x 16進数([0-9A-Fa-f])
\X 16進数以外([^0-9A-Fa-f])
\o 8進数([0-7])
\O 8進数以外([^0-7])
\w 単語文字([0-9A-Za-z_])
\W 単語文字以外([^0-9A-Za-z_])
\h 単語の先頭文字([A-Za-z_])
\H 単語の先頭文字以外([^A-Za-z_])
\a アルファベット([A-Za-z])
\A アルファベット以外([^A-Za-z])
\l 小文字アルファベット([a-z])
\L 小文字アルファベット以外([^a-z])
\u 大文字アルファベット([A-Z])
\U 大文字アルファベット以外([^A-Z])
\_d 数字(行末を含む)
\_D 数字以外(行末を含む)
\_x 16進数(行末を含む)
\_X 16進数以外(行末を含む)
\_o 8進数(行末を含む)
\_O 8進数以外(行末を含む)
\_w 単語文字(行末を含む)
\_W 単語文字以外(行末を含む)
\_h 単語の先頭文字(行末を含む)
\_H 単語の先頭文字以外(行末を含む)
\_a アルファベット(行末を含む)
\_A アルファベット以外(行末を含む)
\_l 小文字アルファベット(行末を含む)
\_L 小文字アルファベット以外(行末を含む)
\_u 大文字アルファベット(行末を含む)
\_U 大文字アルファベット以外(行末を含む)

上記以外にも、直前に指定した文字を何回繰り返すか、といった繰り返し指定を行うことができる。主なものとして、次のような繰り返し指定がある。

パターン 内容
* 直前指定の0回以上の繰り返し(より長いほうに一致)
\+ 直前指定の1回以上の繰り返し(より長いほうに一致)
\= 直前指定の0回または1回の繰り返し(より長いほうに一致)
\? 直前指定の0回または1回の繰り返し(より長いほうに一致)
\{n,m} 直前指定のn回以上m回以下の繰り返し(より長いほうに一致)
\{n} 直前指定のn回の繰り返し
\{n,} 直前指定のn回以上の繰り返し(より長いほうに一致)
\{,m} 直前指定のm回以下の繰り返し(より長いほうに一致)
\{} 直前指定の0回以下の繰り返し(より長いほうに一致)
\{-n,m} 直前指定のn回以上m回以下の繰り返し(より短いほうに一致)
\{-n} 直前指定のn回の繰り返し
\{-n,} 直前指定のn回以上の繰り返し(より短いほうに一致)
\{-,m} 直前指定のm回以下の繰り返し(より短いほうに一致)
\{-} 直前指定の0回以下の繰り返し(より短いほうに一致)

上記パターンは覚えておいて損はない書き方なのだが、正直なところ、上記パターンを全て覚えるというのは現実的ではないと思う。最初は最低限の知識として、次のパターンくらいを覚えればよいのではないだろうか。

パターン 内容
^ 行頭(パターンの先頭でのみ指定可能)
$ 行末(パターンの末尾でのみ指定可能)
. 任意の1文字(行末には使用できない)
\^ ^
\$ $
. .
[] カッコ内に指定した文字のどれかに一致
* 直前指定の0回以上の繰り返し(より長いほうに一致)
\+ 直前指定の1回以上の繰り返し(より長いほうに一致)
\{n,m} 直前指定のn回以上m回以下の繰り返し(より長いほうに一致)
\{n} 直前指定のn回の繰り返し
\{n,} 直前指定のn回以上の繰り返し(より長いほうに一致)
\{,m} 直前指定のm回以下の繰り返し(より長いほうに一致)

上記パターンは、正規表現でも似たような表記を行うので、正規表現を使った経験があるなら比較的すんなりと覚えられるはずだ。逆にこれまでに正規表現を使ったことがなくても、上記パターンを覚えておけば正規表現に応用が効く。バックスラッシュを記述するか、しないかといった違いはあるが、その辺りは同じソフトウエアでもモードが変わったり、実装系が変わったりすると変わる部分なので、仕方がないところだろう。その時々で応用を利かせて利用できればよいだけの話だ。

パターンオプション

余談となるが、パターンオプションについてもここで説明しておこう。Vimのパターンオプションには4つの種類があり、それぞれ「magic」「nomagic」「very magic」「very nomagic」と呼ばれている。パターンオプションを変更すると、パターンの意味が変わるようになっている。パターンオプションとその内容を簡潔にまとめると次のようになる。

パターンオプション名 内容 開始文字
magic デフォルトおよび推奨設定。.、*、~、^、$、バックスラッシュなどが特別な意味を持つ \m
nomagic .、*、~がmagicと真逆の振る舞い \M
very magic 0〜9、a〜z、A〜Z、_以外の文字すべてに特別な意味がある \v
very nomagic very magicと真逆の振る舞い \V

ただし、機能としては用意されているものの、これらを切り替えて使うのは特定の理由がない限り行わないほうがよい。とても混乱するからだ。デフォルトではmagicが設定されているので、それをそのまま使うことをお薦めする。

実際、Vimのヘルプでもパターンオプションはmagicを使うことを推奨している。バックスラッシュでエスケープする必要がある文字ばかりを検索するということであれば、パターンオプションでデフォルトの設定を変更してしまうのはありだと思うが、そうでないなら変にいじらずにそのまま使ったほうがよいだろう。

繰り返すが、最初からパターンを全て覚える必要はない。しかし、覚えておいて損のない記述ではあるので、最初のうちは「こんな機能があるらしい」ということをぼんやりと覚えておいて、必要になった段階で調べて徐々に身に付けていっていただきたい。