vim-users.jp

Hack #129: 複数のファイルから検索する

Posted at 2010/03/05
このエントリーをはてなブックマークに追加

時折、大量にあるテキストファイルから特定のテキストを検索したい場合があります。grep などのプログラムが有名ですが、やはり検索結果から直接該当のファイルにジャンプできると便利です。

:grep コマンド

:grep コマンドは、'grepprg' オプションで指定された外部プログラムを実行してテキストの検索を行い、結果を 'errorformat' オプションに従って解釈したあと、quickfix ウィンドウへ出力します。quickfix 上で結果を選択して <Enter> を押すことで目的のファイルの目的の行にジャンプすることができます。 各オプションにはデフォルトで適切な値が設定されており、通常はいじる必要はありません。

:grepadd と言うコマンドもあり、これは quickfix ウィンドウの中身を置き代えずに追記します。複数の grep の結果を見るのに便利です。

:vimgrep コマンド

:grep コマンドは外部のプログラムに依存するため、その実装によって挙動が異なることがあります。例えば、Windows では標準では findstr が使用されます。これは grep とはまったく異なるものなので、指定する引数も使える正規表現も違います。

そういう経緯もあってかどうかは知りませんが、Vim には :vimgrep と言う自力で grep を行う組み込みコマンドがあります。基本的な使い方は :grep と同じです。

:vimgrep /pattern/ {file}...
:vimgrepadd /pattern/ {file}...

pattern には Vim の正規表現が使えます。単純な単語の場合、前後の / は省略可能です。

{file} の部分に検索対象のファイルを指定します。指定にはワイルドカードが使えます(:help wildcard)。これは ** による再帰的な探索に対応しています。

:vimgrep /\<variable\>/ **/*.c

パターンの後ろにフラグを付けることで挙動を変更できます。

フラグ意味
g1 つの行に複数のマッチが見つかった場合、同じ行を複数回列挙します。
j通常、検索対象が見つかった場合は最初の候補にジャンプしますが、このジャンプを抑制します。
:vimgrep /\<variable\>/j **/*.c

コマンドの前に数字を置くことで、検索件数の上限を指定できます。これにより検索時間を短縮できます。例えば、最初に見つかった 1 件だけを表示するには以下のようにします。

:1vimgrep /\<variable\>/ **/*.c

'grepprg' に "internal" と設定すると、:grep で :vimgrep が使われるようになります。

set grepprg=internal

:vimgrep は挙動が統一されているので、様々な環境で同じように grep を行いたい場合に非常に便利です。

thinca

もどる
blog comments powered by Disqus