09 May 2015

gnu global と pygments の導入

gnu global (gtags) のサポートしている言語が増えたことを知った。正確には Pygments という python の syntax higlighter を利用してパースするプラグインが追加されたらしい。というわけで改めてインストールと設定を行った。

gnu global ができること

  • 関数の定義元にジャンプする
  • その関数を参照している場所にジャンプする
  • 変数などの名前を元にジャンプする

など。ネイティブでは C, C++, Yacc, Java, PHP4 and assembly しかサポートされていないが、前述のように Pygments を使ったプラグインによって他の言語も対応できるようになった。(とはいえ 結構前から だけど)

インストール

brew install global --with-exuberant-ctags --with-pygments

だけで OK

設定

emacs から使う。

まずは global についてくる gtags.el を load-path が通ったところに置く。デフォルトでは /usr/local/Cellar/global/6.4/share/gtags/gtags.el などにあるはず。

cp /usr/local/Cellar/global/6.4/share/gtags/gtags.el ~/.emacs.d/elisp/

つぎに .emacs に以下を記述

(setq gtags-prefix-key "\C-c")
(require 'gtags)
(require 'anything-gtags)
(setq gtags-mode-hook
      '(lambda ()
         (define-key gtags-mode-map "\C-cs" 'gtags-find-symbol)
         (define-key gtags-mode-map "\C-cr" 'gtags-find-rtag)
         (define-key gtags-mode-map "\C-ct" 'gtags-find-tag)
         (define-key gtags-mode-map "\C-cf" 'gtags-parse-file)
         (define-key gtags-mode-map "\C-cb" 'gtags-pop-stack)))
(add-hook 'c-mode-common-hook
          '(lambda()
             (gtags-mode 1)))

defined-key のあたりはキーバインドの指定で、add-hooktags-mode を有効にするモードの指定。それぞれ必要に応じて変更する。

基本的にはこれでいいが、anything-gtags.el なども追加でインストールしておくと便利かもしれない。

簡単な使い方

gtags コマンドで事前にインデックスを作る。ネイティブでサポートしている言語であればオプションなしで良いが、そうでないなら以下のようにする。

gtags --gtagslabel=pygments

これで GPATHGRTAGSGTAGS というファイルが生成される。

次に該当の読みたいコードを emacs で開く。C-c s で定義元へジャンプする。引数を与えなければ、カーソルのある位置の関数名で検索する。同様に、C-c r で参照元へ飛ぶ。ジャンプ前の位置に戻るには C-c b。という感じ。

注意点

pygments プラグインを使ったインデックス作成処理は時間がかかる。自分の場合、iconv-lite というモジュールの古いバージョンにある big5.js という大きな json を含むファイルのパースが一向に終わらなかった。

また言語によってはパースがうまくいかないものもあるらしい。もとがそもそもシンタックスハイライトのためのモジュールなので仕方ない部分がある。