helm-gtags-modeを導入してソースコードの読解する

Posted by Tatsuyano on Wed, Sep 17, 2014
In
Tags emacs

helm-gtagsを導入すると、メソッドの定義先に簡単に移動できたり(メソッドジャンプ)、 メソッドの参照元の一覧を表示できたりと大変便利です。

helm-gtagsGNU GLOBAL(gtag)というソフトウェアを使って上記の機能を実装しています。 ただGNU GLOBALは今まではC言語やJava、PHPなど一部言語しか対応していませんでした。

GNU GLOBAL(gtag)とは、ソースファイルを解析し、インデックスファイルを生成してくれるソフトウェアです

しかし、バージョン6.3.2からglobal-pygments-pluginが取り込まれたことで、Rubyなど多くの言語に対応しました。

今回は、RubyとPHPをhelm-gtags-modeに対応するようにしました。

ソフトウェアの依存関係

少しややこしいので整理しておきますと、

  1. helm-gtags(複数言語対応)GNU GLOBAL 6.3.2が必要
  2. GNU GLOBALに取り込まれたglobal-pygments-pluginは、Pygmentが必要
  3. PygmentPython 2.6以上が必要

[helm-gtags] <- [GLOBAL] <- [Pygment] <- [Python 2系] という関係性なので、 まずは、Python 2系からインストールします。

注意 Pygmentのコマンドはpygmentizeで、初めからインストールされている可能性があります。 その場合は、Python 2系Pygmentのインストール手順はスルーしてください。

$ which pygmentize
$ /usr/bin/pygmentize

$ pygmentize -V
$ Pygments version 1.4, (c) 2006-2008 by Georg Brandl.

Python 2系のインストール

pyenvを使って2系をインストールします。 pyenvのインストールはこちらを参考にしてください。

$ pyenv install 2.7.8
$ pyenv global 2.7.8
$ pyenv version
2.7.8

Pygmentsのインストール

$ pip install Pygments

$ $HOME/.anyenv/envs/pyenv/versions/2.7.8/bin/pygmentize -V
$ Pygments version 1.6, (c) 2006-2013 by Georg Brandl.

GNU GLOBALのインストール

ダウンロード

$ sudo bash
# cd /usr/local/src
# wget http://tamacom.com/global/global-6.3.2.tar.gz

インストール

# tar xvzf global-6.3.2.tar.gz
# cd global-6.3.2
# ./configure
# make
# make install

 

$ which global
/usr/local/bin/global

$ global --version
global (GNU GLOBAL) 6.3.2

 

$ which gtags
/usr/local/bin/gtags

$ gtags --version
gtags (GNU GLOBAL) 6.3.2

rootでも使えるようリンクを貼っておきます

$ sudo ln -s /usr/local/bin/gtags /usr/bin/gtags
$ sudo ln -s /usr/local/bin/global /usr/bin/global

global-pygments-pluginの設定

デフォルトのままだと、Rubyには対応していないので、設定ファイルをダウンロードします。

$ wget https://raw.githubusercontent.com/yoshizow/global-pygments-plugin/master/sample.globalrc
$ mv sample.globalrc $HOME/.globalrc

設定ファイルでは、拡張子.ttがTreetopというパーサ?に設定されていますが、Rubyを解析時にエラーがでたので、 とりあえずコメントアウトします。

$HOME/.globalrc

#:langmap=Treetop\:.treetop.tt:\     #:gtags_parser=Treetop\:/usr/local/lib/gtags/pygments-parser.la:\

gtagsを使ってみる

とりあえず単体でGNU GLOBAL(gtags)が使えるようになっているはずなので、テストしてみます。 GNU GLOBALはプロジェクトの直下にインデックスファイル(GPATH、GRTAGS、GTAGS)を生成することで、検索が可能になります。

$ cd /tmp/gtags_test
$ cat > hoge.php
<?php
class Hoge
{
    public function hello()
    {
        print "hello\n";
    }
}

 

$ gtags --gtagslabel=pygments --debug
$ tree
.
├── GPATH
├── GRTAGS
├── GTAGS
└── hoge.php

 

$ global -sx hello hoge.php
hello               4 hoge.php             public function hello()

helm-gtagsのインストール

$HOME/.emacs.d/Cask

(depends-on "helm-gtags")

$HOME/.emacs.d/init_loader/02_helm.el

(add-hook 'helm-gtags-mode-hook
'(lambda ()
;;入力されたタグの定義元へジャンプ
(local-set-key (kbd "M-t") 'helm-gtags-find-tag)

;;入力タグを参照する場所へジャンプ
(local-set-key (kbd "M-r") 'helm-gtags-find-rtag)  

;;入力したシンボルを参照する場所へジャンプ
(local-set-key (kbd "M-s") 'helm-gtags-find-symbol)

;;タグ一覧からタグを選択し, その定義元にジャンプする
(local-set-key (kbd "M-l") 'helm-gtags-select)

;;ジャンプ前の場所に戻る
(local-set-key (kbd "C-t") 'helm-gtags-pop-stack)))

(add-hook 'php-mode-hook 'helm-gtags-mode)
(add-hook 'ruby-mode-hook 'helm-gtags-mode)

helm-gtags-modeの使い方

先ほどphp-moderuby-modehelm-gtags-modeをホークしたので、Rubyファイルを開くと自動でhelm-gtags-modeが起動します。

ただインデックスファイルがないと検索できないので、helm-gtags-modeのショートカットを実行すると ミニバッファにFile GTAGS not found. Run 'gtags'? (yes or no)というメッセージが出てくるので、インデックスファイルを作って下さい。

インデックスファイルが正常に作成されないと、エラーがミニバッファに出るので、その場合は一度Emacsから出て $ gtags --gtagslabel=pygments --debugで確認してください。

すごく便利ですね!お疲れ様でした。

参考サイト

関連する記事