内部 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オプションを付けると、カーソルの位置は移動しません。
基本的な検索
:vim /hoge/ %% は現在開いているファイル名を表します。
:vim /hoge/ *.txt:vim /hoge/ **/*.txt大文字・小文字の区別
デフォルトではパターンの大文字・小文字を区別して検索しますが、オプション ignorecase がセットされている場合は、パターンの大文字・小文字を区別せずに検索します。
ignorecase の設定に関わらず、大文字・小文字を区別して検索したい場合は、パターンの中に \C を含めます。
逆に、大文字・小文字を区別せずに検索したい場合は、パターンの中に \c を含めます。
:vim /\Cinclude/ **/*.cppQuickFix List のウィンドウを開く
:vim (:vimgrep) による検索が終了したら、copen で QuickFix List のウィンドウ(QuickFix ウィンドウ)を開いて、見つけた行の一覧を確認することができます。
対象の行に移動して Enter キーを入力することで、その場所にジャンプすることができます。
:copen:vimgrep の実行と同時に QuickFix ウィンドウを開きたいときは、以下のように cw[indow] コマンドを続けて実行します。
:vim /hoge/ *.txt | cw毎回 | cw と入力するのが面倒な場合は、.vimrc に以下のように設定しておきます。
au QuickfixCmdPost grep,grepadd,vimgrep,vimgrepadd copenこの設定により、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 系コマンドを実行することができます。
:grep [arguments]grepprg オプションのデフォルト値は、Windows の場合は findstr /n、Linux の場合は grep -n $* /dev/null に設定されています。
:set grepprg? " grep -n $* /dev/null のように表示されます通常は、以下のような感じで実行できるはずです。
:grep hoge *.txt " *.txt ファイルを grep
:grep hoge % " 編集中のファイルを grep:vimgrep コマンドと同様、:copen コマンドで QuickFix ウィンドウを開いて、検索にヒットした行にジャンプできます。
:copenおまけ
:vimgrep (:vim) や :grep コマンドの代わりに、:vimgrepadd や :grepadd コマンドを使用すると、検索結果を既存の QuickFix List に追加することができます。
:vimgrepadd /AAA/ *.txt
:grepadd AAA *.txtsetqflist() 関数を呼び出すと、QuickFix List の内容を修正することができます。
次のように実行すると、QuickFix List がクリアされます(空配列 [] がセットされます)。
:call setqflist([])