2013年12月21日土曜日

[Clojure][Emacs]MilkodeでClojureのソースを検索できるようにしよう

仕事では、メソッド名や変数名等をキーワードにして、複数のプロジェクトのソースを横断的に検索することが多い。
結構な規模で、ファイル数が多く、grepによる検索では非常に時間がかかり、効率が悪い。
Milkodeは全文検索エンジンgroongaを使った、ソースコード検索用のツールで、数万ファイルを対象にしても、瞬時に検索できる。
Webアプリとしても動作し、ブラウザを使って検索もできる。
検索するソースの追加も簡単なので、重宝している。

Clojureのソースを検索できるようにしよう。

インストール

MilodeはRubyアプリである。
gem でインストールできる。
rroonga(groongaのRuby用API)
$ gem install rroonga
$ gem install milkode

これでmilkコマンドが使えるようになる。

データベースの作成

$ milk init --default
create     : /home/satoshi/.milkode/milkode.yaml
create     : /home/satoshi/.milkode/db/milkode.db created.

Clojureソースの取得

srcディレクトリにソースリポジトリをcloneする。
$ mkdir src
$ cd src
$:~/src git clone https://github.com/clojure/clojure.git

ソースプロジェクトの登録

$ milk add clojure
package    : clojure
result     : 1 packages, 279 records, 279 add. (1.56sec)
*milkode*  : 1 packages, 279 records in /home/satoshi/.milkode/db/milkode.db.

登録したプロジェクトの確認

$ milk list
clojure ← ◆登録された
*milkode*  : 1 packages, 279 records in /home/satoshi/.milkode/db/milkode.db.

コマンドラインでの検索

gmilkコマンドで検索できる。

$:~/src cd clojure
$:~/src/clojure gmilk RETRY_LIMIT
src/jvm/clojure/lang/LockingTransaction.java:25:public static final int RETRY_LIMIT = 10000;
src/jvm/clojure/lang/LockingTransaction.java:28://public static int COMMUTE_RETRY_LIMIT = 10;
src/jvm/clojure/lang/LockingTransaction.java:252:    for(int i = 0; !done && i < RETRY_LIMIT; i++)

ソースのディレクトリ内でgmilkコマンドを実行しないと、検索できないことに注意。
ソースのディレクトリ外の場合は、パッケージ名をオプション指定する。
詳細は gmilkコマンドのマニュアルhttp://milkode.ongaeshi.me/gmilk.htmlを参照。

Webアプリでの検索

次のコマンドで検索用のWebアプリを起動する。
$ milk web
デフォルトではブラウザを起動する。

ブラウザを起動せずに、外部からの接続を許可した状態で起動するには、以下のコマンドを実行する。
$ milk web -n -o 0.0.0.0

詳細は milk help web コマンドを参照。

次は検索結果の画面。

Emacsでの検索

検索用のELispもある。
https://github.com/ongaeshi/emacs-milkode

auto-installが使えば、
(auto-install-from-url "https://raw.github.com/ongaeshi/emacs-milkode/master/milkode.el")
でインストールできる。

init.elに次の設定を追加する。
(require 'milkode)

検索するには
M-x milkode:search
を実行する。
ミニバッファに gmilk: と表示されるので、検索文字列を入力する。

図は -a RETRY_LIMIT を入力した例。VPSに接続したターミナル内のEmacsなので、少し表示が汚ない。

-a は 全プロジェクトを対象にする場合のオプション。
(-a を付けないと正しく検索できなかった。カレントディレクトリがソースのディレクトリ内ではないから?)

参考