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

Pebble's Diary

プログラマーの作業メモ

smartgrep.vim ソースコメントを除外するgrepプラグイン

Vim Advent Calendar 2012 55日目の記事です。

こんにちは@pebble8888です。自作したvimのプラグインについて書きます。

プラグイン名はsmartgrep.vimです。

外部grepバイナリsmartgrepと合わせて使うgrepプラグインです。
唯一の機能は、「ソースコメントをgrep結果から除外できる」です。

過去のソースがコメントアウトされて残っている部分を除外したり、
コメント内に説明のために関数名、変数名などが書かれている部分を除外する
のが目的です。

if( isCute( hermionie ) && isBrave( harry ) ){
/ BUGFIX
petrify( harry );
/
petrify( hermionie );
}

例えば、上記のソースで普通に"petrify"でgrepすると、

petrify( harry );
petrify( hermionie );

の2行が出力されますが、

petrify( hermionie );
の1行だけが出力されて欲しいのです。

最近は、subversionやgitの普及で過去のソースをコメントアウトして
残すということが少なくなったと思います。
ですが、関係のない行を極力grep結果に出さないことは
効率化を求めるvimユーザーのニーズに合っていると思います。
ちなみに秀丸エディタにはだいぶ前から、この機能がありますが、vim用のは
誰も作ってくれなさそうなので、自分で作ることにしました。

関数や変数の宣言部をgrepしたい時は、ヘッダファイル(.h)のみを対象にしたり、
関数や変数の使用部分をgrepをしたい時はすべてのファイルを対象にしたり
といった使い分けが可能です。
コメント記法が、/**/ // #if 0の言語
(C, C++, Objective-C, C#, Java Script)
Ruby(#)
Python(#,""")
に対応しています。

個人的には主にC,C++,Objective-C,Pythonで使っています。
[追記2013-05-06]

対応OSはWindows/Mac/Unixとなっています。

<使い方>
例えば、次のソースファイルを開いているとしましょう。

f:id:pebble8888:20131107045243p:plain


ここで「IDEEditorArea」という単語をgrepしたい場合、
IDEEditorAreaの単語上にカーソルがある状態で、「,g」とタイプします。
すると、以下のようにIDEEditorAreaをlgrepした時のようにgrep結果が
ロケーションリストとして現れます。
ロケーションリストはvim7で追加された機能です。

f:id:pebble8888:20131107045249p:plain


lgrepとの違いは、ソースコメント内の「IDEEditorArea」が含まれないことと、
設定したディレクトリ配下の全てのソースファイルが対象になることです。

lopenコマンドを利用しているため、ウィンドウ分割した場合に、2つ以上の
ロケーションリストを利用したりもできます。

また、grepしたい単語上にカーソルがある状態で「,h」とタイプすると.hのファイルのみ
を対象にしたり、「:R {検索する単語}+Enter」で単語を入力することもできます。

なお、外部grepバイナリを利用しているのは処理速度のためです。
ソースの量が10万ステップ以上になると内部grep(vimgrep)では遅すぎて使いづらいのです。

<インストール方法>
target="_blank">https://github.com/pebble8888/smartgrep
上記からgit cloneで取得して、
smartgrep.vimを設定し、さらにsmartgrepバイナリを
パスが通った位置に置いて下さい。
バイナリは用意していないので、WindowsはminGWやVC6など、
Unix,Mac環境ではmakeで自前ビルドして下さい。

その後、~/.vimrcファイルに以下の一行を追加します。
let g:smartgrep_basedir="/hogehoge/fugafuga"

Windowsの場合は
let g:smartgrep_basedir="C:\hogehoge\fugafuga"
のようにします。

/hogehoge/fugafugaの部分はgrepを行う基準ディレクトリを設定します。
grepはこのディレクトリ配下のソースファイル全てに対して行われます。

以上です。

Vim Advent Calendar 2012 明日は@tyru1さんです。