読者です 読者をやめる 読者になる 読者になる

座敷牢日誌

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

内部grepでバイナリファイルを対象外にする

Vim

仕事で使っているWindowsのgvimgrepをかけるとき、圧倒的に速い外部grep(cygwingrep)をできるだけ使うようにしているが、日本語を含むキーワードだとうまく検索でき ないことが多いので、内部grepと使い分けるようにしている。

:lvimgmrep /日本語/ **/* | lw

内部grepではこんな感じのコマンドで実行することが多いのだが、これだとバイナリファ イルまで引っ掛けてしまう問題がある (検索結果にでてくるわけではないが)。探したい ファイルがある程度わかっているなら、次のように拡張子を指定して実行すればいい。

:lvimgmrep /日本語/ **/*.xml | lw

ただ、最近はAndroidのソースを調べたりすることが多いため、できれば拡張子は指定せ ずに探したい場面がけっこうある。調べてみたところ、 海外のフォーラムの記事 で同じような話題があって、 wildignore というオプションにvimgrep実行時に無視さ せたいファイルの拡張子を設定しておけばいいらしいことがわかった。

:set wildignore=*.jpg,*.png,*.class,*.jar,*.apk

これで実現できたので、 _vimrc に設定追加して帰宅したのだが、翌日出社したら VimFilerが起動できなくなっていた。

wildignore の設定を外したら解決したので、 wildignore オプションについてヘル プで調べてみたら、次のようにあった。

ファイルパターンのリスト。パターンのどれかにマッチしたファイルは、ワイルドカー ド (|wildcards|) の展開時と、ファイル/ディレクトリ名の補完時に無視される。

なるほど。なんだかわからんが、これはいろいろ影響でそうだ。

そのため、内部grep実行時にだけ wildignore オプションに無視するファイルパター ンを設定し、検索が終わったら設定した値を削除するようにしてみた。

autocmd QuickFixCmdPre * setlocal wildignore=*.jpg,*.png,*.class,*.jar,*.apk
autocmd QuickFixCmdPost * setlocal wildignore=

これで wildignore を設定することによるリスクをかなり抑えられると思う。まあ、 少しは速度の向上に寄与しているとは思うが、内部grepが圧倒的に遅いことに変わりが ないので、できるだけ対象ファイルを少なく抑えるようにしたほうがいいことは間違い ない。

これを参考に導入する人は、前述した autocmd コマンドの2行を .vimrc/_vimrc に 追記してください。指定するファイル拡張子は好きなようにしてください。

広告を非表示にする