Go, Ruby, PythonでGNU GLOBAL(gtags)+α

![global.png](https://qiita-image-store.s3.amazonaws.com/0/54186/bf86d400-6beb-52e2-94b3-78709eb2846f.png)

# 概要

[GNU GLOBALへのPygmentsパーサー取り込みでソースコード読みが信じられないくらいに捗るはず](http://qiita.com/5t111111/items/c14ac68f762ce71a7760)

大変便利な機能が紹介されていたのでLinux版を書いてみました。(上記はMacです)
また最後にEmacs向けの設定も載せています。


# GNU GLOBALインストール

最新バージョンはこちらからご確認ください。
[Getting GLOBAL](http://www.gnu.org/software/global/download.html)

homebrew or linuxbrew

```zsh
brew install global
```

ソースインストール

```zsh
VERSION=6.4
wget http://tamacom.com/global/global-${VERSION}.tar.gz
tar xvf global-${VERSION}.tar.gz
cd global-${VERSION}
./configure
make
make install
```

# GNU GLOBAL設定

```zsh
cp /usr/local/share/gtags/gtags.conf /etc/
```

今回はgtags.confを修正する必要がありませんが、pygments-parser.laのパスが異なる場合には適宜修正してください。
GNU GLOBALの設定をユーザごとに指定したい場合は`gtags.conf`を`$HOME/.globalrc`に配置することで設定を上書き可能です。


# Pythonのインストール

Linuxの場合はほとんどのディストリビューションで予めインストールされていると思います。
インストールされていない場合は各ディストリビューションのパッケージマネージャからPythonをインストールしてください。


私はPython 2.6.6で動作確認をしています。


# pipのインストール

pipはPythonで書かれたパッケージソフトウェアをインストール・管理するためのパッケージ管理システムです。

```zsh
curl -kL https://bootstrap.pypa.io/get-pip.py | python
```


# Pygmentsのインストール

Pygmentsは様々な言語に対応したシンタックスハイライターです。

```zsh
pip install pygments
```

# 動作確認

タグの生成とタグの参照はこちらをご参考ください。
[GNU GLOBALへのPygmentsパーサー取り込みでソースコード読みが信じられないくらいに捗るはず](http://qiita.com/5t111111/items/c14ac68f762ce71a7760)

私の手元で確認した限りRuby, Python,Goすべてでタグの生成は成功しましたが、`global`コマンドを用いたGoのタグの参照だけがうまくいきませんでした。
(実行しても何も標準出力されません)
しかし下記のhelm-gtagsからはGoのタグの参照が成功するので、`global`コマンドからのタグの参照だけがうまくいかない模様です。

# コマンド、Vim, EmacsからのGNU GLOBAL利用方法

- [GNU GLOBAL（gtags）ソースコードタグシステムの使い方](http://uguisu.skr.jp/Windows/gtags.html)

`gtags.vim`と`gtags.el`は`/usr/local/share/gtags/`に存在します。

```zsh
ll /usr/local/share/gtags/gtags.{vim,el}
-rw-r--r-- 1 root root 36494 Sep 17 19:50 /usr/local/share/gtags/gtags.el
-rw-r--r-- 1 root root 16170 Sep 17 19:50 /usr/local/share/gtags/gtags.vim
```

# +α for Emacs

上記ではgtags.elが紹介されていますが、より便利なhelm-gtags.elを紹介します。
Emacs 24.3,helm, helm-gtags,go-modeをインストールしてください。

helm-gtagsについてはこちらを参照ください。
[helm-gtags - Emacs JP](http://emacs-jp.github.io/packages/helm/helm-gtags.html)

```el
(require 'helm-gtags)          
(add-hook 'go-mode-hook (lambda () (helm-gtags-mode)))
(add-hook 'python-mode-hook (lambda () (helm-gtags-mode)))  
(add-hook 'ruby-mode-hook (lambda () (helm-gtags-mode)))                         
(setq helm-gtags-path-style 'root)                       
(setq helm-gtags-auto-update t)
(add-hook 'helm-gtags-mode-hook
          '(lambda ()                                                                   
             (local-set-key (kbd "M-g") 'helm-gtags-dwim)
             (local-set-key (kbd "M-s") 'helm-gtags-show-stack)
             (local-set-key (kbd "M-p") 'helm-gtags-previous-history)
             (local-set-key (kbd "M-n") 'helm-gtags-next-history)))                        
```
あとはEmacsを起動して対象にカーソルを合わせてM-gで関数ジャンプが出来ます。

ページトップの画像はEmacs + helm-gtagsでGoのタグを参照しているところです。



これでPython, Ruby, Goどれでもgtagsコマンドさえ1度実行しておけばEmacsの設定を特別にせずとも関数ジャンプができるようになります！

感動です。


## 参考

- [GNU GLOBALへのPygmentsパーサー取り込みでソースコード読みが信じられないくらいに捗るはず](http://qiita.com/5t111111/items/c14ac68f762ce71a7760)
- [Pygments を利用して GNU GLOBAL の対応言語を大幅に増やす | あるエンジニアの情熱](http://www.turtlewalk.org/blog/2014/03/09/global-pygments-plugin/)
- [helm-gtags + go - Life is very short]
(http://d.hatena.ne.jp/syohex/20140915/1410791973)