内部 grep (internal grep) と外部 grep (external grep)
Vim には自身に搭載されている検索機能を実行する 内部 grep
と、外部の grep 系コマンドを実行する 外部 grep
の機能が存在します。
- 内部 grep を起動するコマンド …
:vim
(:vimgrep
の省略形) - 外部 grep を起動するコマンド …
:grep
:vimgrep
による検索(内部 grep)
:vimgrep
の概要
内部 grep(:vim
あるいは :vimgrep
)は、Vim に組み込まれた grep 機能を使用するため、どの OS 上でも共通の振る舞いの検索を実行することができます。
検索にヒットした行は Vim 内部の QuickFix List という配列データに追加され、そこから見つけた行にジャンプすることができます(参考: :help quickfix.txt
)。
g
オプション … 同じ行の中にパターンに一致する部分が複数あった場合に、QuickFix List に別々に追加します。デフォルトでは、同じ行内で複数回検索にヒットしても、その行は 1 度だけ QuickFix List に追加されます。多くのケースでは、このオプションを指定する必要はないでしょう。j
オプション … デフォルトでは検索で最初にマッチした行にカーソルが移動します。j
オプションを付けると、カーソルの位置は移動しません。
基本的な検索
%
は現在開いているファイル名を表します。
大文字・小文字の区別
デフォルトではパターンの大文字・小文字を区別して検索しますが、オプション ignorecase
がセットされている場合は、パターンの大文字・小文字を区別せずに検索します。
ignorecase
の設定に関わらず、大文字・小文字を区別して検索したい場合は、パターンの中に \C
を含めます。
逆に、大文字・小文字を区別せずに検索したい場合は、パターンの中に \c
を含めます。
QuickFix List のウィンドウを開く
:vim
(:vimgrep
) による検索が終了したら、copen
で QuickFix List のウィンドウ(QuickFix ウィンドウ)を開いて、見つけた行の一覧を確認することができます。
対象の行に移動して Enter
キーを入力することで、その場所にジャンプすることができます。
:vimgrep
の実行と同時に QuickFix ウィンドウを開きたいときは、以下のように cw[indow]
コマンドを続けて実行します。
毎回 | cw
と入力するのが面倒な場合は、.vimrc
に以下のように設定しておきます。
この設定により、vimgrep
を実行した後に、自動的に copen
が実行されるようになります。
上記の例では、他にも grep
、grepadd
、vimgrepadd
を実行した際も QuickFix ウィンドウを開くよう設定しています。
必要に応じて変更してください。
:copen
コマンドの C はおそらく “Current List of Errors” の C です。
:copen
コマンドで開いたウィンドウの buftype
は quickfix
となり、全体で 1 つだけ表示できるようになっています。
すでに QuickFix ウィンドウが開いている状態で :vimgrep
や :grep
を実行した場合、そのウィンドウに検索結果が表示されます。:grep
による検索(外部 grep)
:vimgrep
コマンドの代わりに :grep
コマンドを使用すると、grepprg
オプションに設定されている外部の grep 系コマンドを実行することができます。
grepprg
オプションのデフォルト値は、Windows の場合は findstr /n
、Linux の場合は grep -n $* /dev/null
に設定されています。
通常は、以下のような感じで実行できるはずです。
:vimgrep
コマンドと同様、:copen
コマンドで QuickFix ウィンドウを開いて、検索にヒットした行にジャンプできます。
おまけ
:vimgrep (:vim)
や :grep
コマンドの代わりに、:vimgrepadd
や :grepadd
コマンドを使用すると、検索結果を既存の QuickFix List に追加することができます。
setqflist()
関数を呼び出すと、QuickFix List の内容を修正することができます。
次のように実行すると、QuickFix List がクリアされます(空配列 []
がセットされます)。