座敷牢日誌

都落ちした元SEがソフトウェアやネット関連のことを書いています

vimでgrepする

vimからgrepかける場合、内部grepと外部grepの2種類がある。内部grepvimに内蔵されているvimgrepを使う。外部grepはWindowsであれば「findstr」というコマンドを、Win以外なら「grep」コマンドを使って検索する。

内部grepは簡単

仕事ではWindowsのkaoriya版を使っていて、ほとんどvimgrepしか使っていない。

指定したファイルの中身を検索する。

:vimgrep /キーワード/ ファイル名

開いているファイルの中身を検索する。

:vimgrep /キーワード/ %

カレントディレクトリにあるファイルすべてを検索する。

:vimgrep /キーワード/ *

カレントディレクトリにあるファイル・ディレクトリから再帰的に検索する。

:vimgrep /キーワード/ **/*

「:cn」と「:cp」で該当箇所を順次参照できる。「:cw」で検索結果をQuickFixに表示できる。vimgrep実行時のコマンドの末尾に「|cw」をつけると、検索終了後にQuickFixが表示される。

他にも指定できるオプションがあるけど、概ねこれくらい知っていれば、他のテキストエディタ(秀丸やサクラエディタ)とかと双肩する程度の検索効率は得られた。

外部grepを試してみる

vimのgrepについて調べるとすぐに分かることだけど、vimgrepは遅いらしい。Windowsのfindstrはよくわからない、grepコマンドは再帰検索のやり方がよくわからなかったのでちょっと敬遠していたが*1、調べて試してみた。

まず外部grepで使うコマンドは「grepprg」というオプションで指定している。使っているLinux Mintvimではデフォルトで次のように指定されている。

grep -n $* /dev/null

「-n」は行番号の出力のこと。

この設定で外部grepする場合は次のように実行する。

:grep "キーワード" ファイル名

再帰的に検索する場合は、次のように指定する。

:grep -r "キーワード" *

このままだとバイナリファイルが対象になってしまうので、これを除外するには「-I」を指定する。

:grep -I "キーワード" *

検索中の出力が下にがーっと出てくるのを抑制したければ、「:sil」で実行する。

:sil grep -I "キーワード" *

やってみると簡単だった。ただ、後ろに「|cw」をつけると、「E488: 余分な文字が後ろにあります」とでてしまう。「:cw」でちゃんとQuickFixで参照できるので、そんなに大きな問題にはならないと思うけど。
外部grepはWindowsでも試してみたいな。

あわせてよく使っていたコマンド

「:CdCurrent」で現在開いているファイル・ディレクトリをカレントディレトリに変更する。同じ事をvimfiler上で行う場合は「gc」。vimfilerは独自のカレントディレクトリを持っているので、「:CdCurrent」で変更できない。「:CdCurrent」はkaoriya版vimに同梱されているプラグインだけど、kaoriya版じゃなくても使うことは出来る。

参考にしたサイト

vimのgrepの設定と使い方 - fudist

外部grepは圧倒的に速いメリットがあるけど、実際には一長一短あるようなので、適宜使い分けていくべきなんだろう。

*1:再帰的にgrepするために「find -type f -print0|xargs -0 grep "hogehoge"」としていたくらいだから