helm-cscope.elをMELPAに登録しました

最近 (遅ればせながら) helmを使い始めました。なぜ使うようになったかというと、Emacs24に移行したから。これまで、ある事情からEmacs23を使い続けていたのですが、Emacs24以降しかサポートしないパッケージが増えてきたため、ついに見切りをつけました。Emacs23ではanythingでしたが、バッファ・ファイル選択程度であまり積極的には使っていませんでした。helmは、MELPAにたくさんパッケージが登録されているのが大きなメリットですね。おかげで簡単に機能を追加していくことができます。

私は、Emacsを使う時間の半分以上はCのプログラム開発なので、タグジャンプ機能は欠かせません。タグジャンプのためのツールと言えば、GNU globalcscopeが二大メジャーです (よね?)。当然ながら、GNU globalのhelm版helm-gtagsはあるのですが、何故かcscopeの方はMELPAに見当たりませんでした。ググってみたところ、

の2つがありましたが、後者は何かエラーで動作せず、前者はanything版 (多分これが元ネタ) をhelm版に書き換えたもののようで、一応普通に動作はしますが若干機能不足ということで、自分で作ってみることにしました。helmの拡張を書く練習にちょうどいいと思ったというのもあります。

helm-cscope.el

リポジトリこちらにあります。一応MELPAに登録するからには、少なくとも上記の2つよりは機能的に整っていないと申し訳ないので、現時点でそれなりに使えるものにはなっていると思います (helm-gtagsには及びませんが...)。特徴的な点としては、以下があります。

データベースリストのサポート

xcscope.elでは、cscope-database-regexpsという変数で検索対象のタグデータベースを複数登録することができますが、helm-cscope.elでもこの変数をそのまま利用できます。helm-cscope.elでは、データベース毎にhelmの1つの情報源として結果が表示されます。

シンボル位置のfuzzyな検索

これもxcscope.elの機能をそのまま拝借したもので、通常編集中 (未保存) のファイルに対して検索すると結果はズレてしまいますが、指定した範囲 (デフォルトは1000文字) の範囲で対象のシンボルをパターンマッチして調整してくれます。コードを書きながら検索するときは、地味に便利な機能です。

GNU global vs cscope

今回helm-cscopeを書くのにあたって、GNU globalとcscopeを改めて比較してみました。元々cscopeを使い始めたのは、数年前にGNU globalしか知らなかったときにcscopeを見つけて、cscopeの方が検索機能が優れていると思ったからです。しかし、GNU globalはPygmentsプラグインパーサの取り込みにより対応言語を大幅に拡張するなど、最近も活発に開発が続けられている一方、cscopeは2012年8月のリリースが最新で、あまり開発が行われていないようです (元々、それまでも3年おきくらいにしかリリースされていないようですが...)。なので、将来性からするとGNU globalを使った方がよいかもしれません。あと、C言語以外の場合も。

ただ、C言語に限って言うと、今でもcscopeの方が優れていると思います。そもそもシステム的な違いなのかもしれませんが、GNU globalはグローバル変数の宣言位置にジャンプすることができません (シンボル検索で見つけることはできますが)。これがあるため、私はまだcscopeを使い続けると思います。

あと、変数cscope-programを"gtags-cscope"に設定することで、helm-cscopeでGNU globalのタグファイルを利用することもできます。まぁ、GNU globalしか使わない人は素直にhelm-gtagsを使えばいいですが、cscopeと併用する場合はこの方法でhelm-cscopeにUIを統一できるので、一応選択肢としてありますということで。