Vim 内で grep を実行して見つかったファイルへジャンプする (:vimgrep, :grep)

内部 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)。

書式
:vim /{pattern}/[g][j] {file} ...
  • g オプション … 同じ行の中にパターンに一致する部分が複数あった場合に、QuickFix List に別々に追加します。デフォルトでは、同じ行内で複数回検索にヒットしても、その行は 1 度だけ QuickFix List に追加されます。多くのケースでは、このオプションを指定する必要はないでしょう。
  • j オプション … デフォルトでは検索で最初にマッチした行にカーソルが移動します。j オプションを付けると、カーソルの位置は移動しません。

基本的な検索

例: 現在開いているファイルを grep
:vim /hoge/ %

% は現在開いているファイル名を表します。

例: *.txt ファイルを grep
:vim /hoge/ *.txt
例: カレントディレクトリ以下のファイルをすべて grep
:vim /hoge/ **/*.txt

大文字・小文字の区別

デフォルトではパターンの大文字・小文字を区別して検索しますが、オプション ignorecase がセットされている場合は、パターンの大文字・小文字を区別せずに検索します。 ignorecase の設定に関わらず、大文字・小文字を区別して検索したい場合は、パターンの中に \C を含めます。 逆に、大文字・小文字を区別せずに検索したい場合は、パターンの中に \c を含めます。

例: 大文字・小文字を区別して include という文字列を検索
:vim /\Cinclude/ **/*.cpp

QuickFix List のウィンドウを開く

:vim (:vimgrep) による検索が終了したら、copen で QuickFix List のウィンドウ(QuickFix ウィンドウ)を開いて、見つけた行の一覧を確認することができます。 対象の行に移動して Enter キーを入力することで、その場所にジャンプすることができます。

QuickFix ウィンドウを開く
:copen

:vimgrep の実行と同時に QuickFix ウィンドウを開きたいときは、以下のように cw[indow] コマンドを続けて実行します。

検索と同時に QuickFix ウィンドウを開く
:vim /hoge/ *.txt | cw

毎回 | cw と入力するのが面倒な場合は、.vimrc に以下のように設定しておきます。

:vimgrep 後に自動で copen する設定
au QuickfixCmdPost grep,grepadd,vimgrep,vimgrepadd copen

この設定により、vimgrep を実行した後に、自動的に copen が実行されるようになります。 上記の例では、他にも grepgrepaddvimgrepadd を実行した際も QuickFix ウィンドウを開くよう設定しています。 必要に応じて変更してください。

☝️ ワンポイント :copen コマンドの C はおそらく “Current List of Errors” の C です。 :copen コマンドで開いたウィンドウの buftypequickfix となり、全体で 1 つだけ表示できるようになっています。 すでに QuickFix ウィンドウが開いている状態で :vimgrep:grep を実行した場合、そのウィンドウに検索結果が表示されます。

:grep による検索(外部 grep)

:vimgrep コマンドの代わりに :grep コマンドを使用すると、grepprg オプションに設定されている外部の grep 系コマンドを実行することができます。

外部 grep の実行
:grep [arguments]

grepprg オプションのデフォルト値は、Windows の場合は findstr /n、Linux の場合は grep -n $* /dev/null に設定されています。

grepprg オプションの値を確認
:set grepprg?  " grep -n $* /dev/null のように表示されます

通常は、以下のような感じで実行できるはずです。

外部 grep による検索
:grep hoge *.txt   " *.txt ファイルを grep
:grep hoge %       " 編集中のファイルを grep

:vimgrep コマンドと同様、:copen コマンドで QuickFix ウィンドウを開いて、検索にヒットした行にジャンプできます。

QuickFix ウィンドウを開く
:copen

おまけ

:vimgrep (:vim):grep コマンドの代わりに、:vimgrepadd:grepadd コマンドを使用すると、検索結果を既存の QuickFix List に追加することができます。

既存の QuickFix List に検索結果を追加する
:vimgrepadd /AAA/ *.txt
:grepadd AAA *.txt

setqflist() 関数を呼び出すと、QuickFix List の内容を修正することができます。 次のように実行すると、QuickFix List がクリアされます(空配列 [] がセットされます)。

QuickFix List をクリアする
:call setqflist([])