
「内部グレップ」編ではVim7.xで利用できる内臓grep機能について紹介しました。
だいぶ時間がたってしまいましたが、第二回の今回は外部のgrepツール(GNU grep)を使った、一歩進んだgrep方法についてまとめてみます。
内臓grep機能は手軽に利用できるメリットがある反面、検索が遅かったりMRUを汚染してしまうというやっかいな点がありました。
外部grepを利用すればこのような問題も解決してより快適にgrepが使えるようになります。
(追記2008-01-16:残念ながらWindows版のGNU grepでは、日本語の検索についていくつか問題があるようです。記事末の追記部分を参照のこと。)
grep.vimのセットアップ
外部のGrepツールを利用するには、grep.vimを使うのが便利です。
grep.vimは外部GrepツールとしてGNU grepを使用しますので、Windowsの場合は上記配布ページに記載のリンク先から「GNU Grep」と「GNU FindUtils」をそれぞれダウンロード・インストールしてください。
vimrcの設定は以下のようにします。(インストール先は適宜修正のこと)
let Grep_Path = 'C:\GnuWin32\bin\grep.exe'
let Fgrep_Path = 'C:\GnuWin32\bin\grep.exe -F'
let Egrep_Path = 'C:\GnuWin32\bin\grep.exe -E'
let Grep_Find_Path = 'C:\GnuWin32\bin\find.exe'
let Grep_Xargs_Path = 'C:\GnuWin32\bin\xargs.exe'
let Grep_Shell_Quote_Char = '"'
最後の「Grep_Shell_Quote_Char」は、Windowsで再帰的なgrep(rgrep)を行う際に必要になりますので忘れず設定してください。
他、検索対象から除外するディレクトリ、ファイルなども指定できます。(半角スペース区切り)
let Grep_Skip_Dirs = '.svn'
let Grep_Skip_Files = '*.bak *~'
オプションについて詳しくはドキュメントをご覧ください。
基本的な使い方
では早速動作を確認してみましょう。
grep.vimでは:Grepなどのコマンドが使えるようになりますが、これらのコマンドは引数がすべてオプション(任意)になっています。
引数を省略した場合はコマンドラインで対話的にgrepの条件(検索パターン、対象ファイルなど)を指定することが出来ます。
「:Grep」と入力してコマンドを実行してみてください。
すると、検索する文字列パターンと、対象ファイルが順番に聞かれます。
パターンを指定
ファイルを指定(*はカレントディレクトリのすべてのファイル)
それぞれ適当に入力して実行すれば、結果がQuickfixリストに一覧表示されます。(Quickfixリストの使い方については「内部グレップ」編などをご覧ください。)
対話形式で実行する利点
grep.vimのコマンドを対話形式で実行することには、以下のような利点があります。
- 検索する文字列パターンとしてカーソル下にあった単語がデフォルトで入力される
- 複数キーワードでの検索が可能(フレーズ検索する場合は「”」で囲う)
また、対話形式であるかにかかわらず、コマンドラインでの基本的な機能として以下のような操作も可能です。
- キーワードの指定では上下キーで履歴が参照可能
- 対象ファイルの指定ではファイル名の保管が可能
- Ctrl+Uで左を全部消す
- Ctrl+Wで左の単語を消す
いろいろなgrep
grep.vimで利用できるコマンドは:Grepだけではありません。
むしろ、沢山ありすぎて分かりにくくなっています。
正直私もすべて理解しているわけではないのですが、主なものだけ紹介しましょう。
:Grep
最も基本的な、GNU grepを使用したgrepを行います。
GNU grepではPOSIX標準に加えて独自の拡張が行われており、基本正規表現だけでなく拡張正規表現も使用することが出来ます。(参考:Manpage of GREP、正規表現メモ)
ただし、メタキャラクタ「?, +, {, |, (, )」を使用する際にはすべて「\」を付けなければその機能を果たさないことに注意してください。
「:Rgrep」で再帰的な(フォルダの中身を含む)検索ができます。
:Egrep
grepとegrepは通常、それぞれ「基本正規表現」と「拡張正規表現」を使用することで区別されますが、GNU grepにおいては前述の通りどちらも拡張正規表現が使用できるため機能的にはあまり違いがありません。
ただ、egrepを使用した場合はメタキャラクタにバックスラッシュをつける必要がないところが違いになります。
こちらのほうがパターンの指定が楽になりますので、普段から:Grepではなく:Egrepを使ってしまうのが便利そうです。
「:Regrep」で再帰的な(フォルダの中身を含む)検索ができます。
:Bgrep
:Bgrepはバッファとして開いているファイルを対象にgrepを行います。
注意すべきは、保存されている内容のみが対象となり、編集中の内容は検索に反映されないということです。
編集中のバッファを対象にgrepを行う方法については、「内部グレップ」編の「開いている全てのバッファからgrep」を参照してください。
おわりに
以上、続き物として宣言していた外部grep編もなんとか書きあげられて一安心。(だいぶ遅れて申し訳なかったですorz)
grep.vimはドキュメントも結構なボリュームで、英語が苦手な私としてはなかなか手が出せませんでしたが、使ってみれば意外とシンプルかつ使いやすくてびっくり。
Linuxでもシェルでgrepするより断然便利かもしれませんね。
参考書籍
grepでは検索パターンとして正規表現が使えます。もし正規表現に興味をお持ちであれば、個人的にはこの本がおすすめ。読み物とリファレンスの中間のような構成で、初心者にも分かりやすい。
連載一覧
- VimでGrepする覚え書き 1/2 「内部grep」編
- VimでGrepする覚え書き 2/2 「外部grep」編
追記(2008-01-13)
重要なことを書き忘れていました。
どうも私の環境(Kaoriya版7.x)では「-i」オプションがうまく働いてくれません。(「-w」オプションは大丈夫なのですが・・・)
何か情報をお持ちの方がいたら教えてください(^^;
追記(2008-01-14)
むむむ、どうやらsjisの「ー」は検索できない予感・・・。
mylog: WindowsのVimでGNUのGrepを使う
ところで・・・grep-2.5.1はマルチバイト対応しててナイスなんですがちょっとバグってるのが嫌な感じです・・・。”Re: bug report on GREP” によれば0×815B、shift_jisで言えば「ー」がダメなようで、あまりダラダラした文章を書いてはいかんということですなー(←禁止)。
vimgrepなら大丈夫なんですけどね。とりあえず「ー」にはご注意を。
追記(2008-01-16)
追記が多くてすみません。
上記Windows関係のエラーについて、ときどきの雑記帖 i戦士篇 2008年1月(中旬)にて言及いただきました。(いつも読ませていただいているサイトだったので、自分のブログのことが書いてあってビビリましたw ありがとうございます)
GNUユーティリティのマルチバイト対応は Windows では有効になっていない 可能性が高いです。マルチバイト対応が有効なら上の例のようなダメ文字が食えないわけはないんで。
な、なんだってー! ということでUTF-8で保存した日本語をGrepしてみたら・・・マッチせずorz(そもそもEUCもダメっぽい?日本語が検索できるのはSJISだけかorz)
ちなみに、私がWindows環境で使っていたGNU grepは「Grep for Windows」にある2.5.1aだったのですが、ためしに「Native Win32 ports of some GNU utilities」の2.4.2を使ってみたところ、やはりこちららも「ー」はうまく行きませんでした。(文字コードの問題も同じく)
ただ、2.4.2だと-iオプションは正しく動いてくれるようなので、そこだけは解決できました。(ちょっと私の書き方が悪かったですが、コマンドプロンプトで試しても同じ結果だったので、VimではなくGNU grep側の問題のようでした。)
んー、しかし日本語の検索がこの状態ではつらいなぁ。どうしたものか。
追記(2008-03-01)
GNU grepをマルチバイト対応に修正してコンパイルする方法について、上記「ときどきの雑記帖」さんのところでご紹介いただいています。現在はShiftJISのみの対応のようですが、今後解決されるかもしれません。期待大!
Comments»
[…] 参考URL:http://okap-plog.blogspot.com/2009/04/vim-grepvim.html http://blog.blueblack.net/item_199 Author: admin Filed Under Category: 未分類 Article Comments: « Discover Shiretokoバナーキャンペーンに参加 […]
[…] あとWindowsはgrepが使えないので、windows版のgnu grepなんかもgvimと合わせて使ってみようと思う。 ということで少し調べたところ、こちらが分かりやすくてよい。 http://blog.blueblack.net/item_199 […]