GNU GLOBALへのPygmentsパーサー取り込みでソースコード読みが信じられないくらいに捗るはず


先日リリースされたGLOBAL-6.3.2で、yoshizowさん作の、Pygmentsを使ったプラグインパーサーが公式に取り込まれました。

[GLOBAL-6.3.2 released.]
(http://lists.gnu.org/archive/html/info-global/2014-09/msg00000.html)

https://github.com/yoshizow/global-pygments-plugin

つまりこれは、GLOBALがサポートしていなかった言語についても、Pygmentsの豊富な言語に対応したlexerを利用してGLOBALのタグを生成することができるということです。
そして、ctagsパーサーでは不可能だった参照タグもできる！

### 追記 (2014-09-16)

MacでHomebrewからインストールする場合、Homebrew側に修正が入り、`--with-pygments` オプションが追加されました。
これを指定すると、Python 2.xが依存パッケージとなり、更に自動的にPygmentsをPypiからダウンロードしてインストールするようになっています。

https://github.com/Homebrew/homebrew/pull/32148

したがって、Homebrewからインストールする場合には、

```console
$ brew install global --with-exuberant-ctags --with-pygments
```

とすればOKです。

この記事で書いているファイルの修正などは不要になりました。

その際、設定ファイルの`gtags.conf`が`/usr/local/etc`にインストールされますが、既存のファイルが存在する場合には上書きはされません。
Pygmentsパーサーの設定を含まない古いバージョンの設定ファイルが残っていると期待どおりに動かないことがあるので、その時は以下のファイルを`/usr/local/etc`に上書きすればよいでしょう。たぶん。

```
/usr/local/Cellar/global/6.3.2/share/gtags/gtags.conf
```

## GLOBALのインストール

では、早速インストールしてみましょう。
ctagsパーサーも必要になるので、`exuberant-ctags`もインストールしておきます。

```console
$ brew install ctags
```

```console
$ brew install global --with-exuberant-ctags
```

## Pygmentsのインストール


当然、PythonおよびPygmentsパッケージを事前にインストールしておくことが必要です。

MacでシステムのPythonを弄りたくなければ、Homebrewで最新のPython 2.7.xをインストールした上でPygmentsを導入するとよいでしょう(Python 3.xには未対応)。

※ただし、システムのPython以外にインストールしたPygmentsを使う場合、後でスクリプトを修正する必要があります。

### Pythonのインストール

```console
$ brew install python
$ type python
python is /usr/local/bin/python
```

### Pygmentsのインストール

```console
$ pip install pygments
```

## 設定ファイルの修正

Macの場合、デフォルトの設定ファイルを修正して、パーサーで指定するライブラリファイルを変更してあげないと動きません。
デフォルトの設定ファイルは以下の2箇所に格納されてます。

```text
/usr/local/Cellar/global/6.3.2/share/gtags/gtags.conf
/usr/local/etc/gtags.conf
```

上記を直接修正したり、`~/.globalrc`にコピーしてユーザーの設定ファイルとしてもよいですが、
gtagsの実行時に読み込む設定ファイルは指定できるので、まずはコピーしたものを変更して動作を試してみましょう。

```console
$ mkdir ~/global-test
$ cd ~/global-test
$ cp /usr/local/Cellar/global/6.3.2/share/gtags/gtags.conf .
```

設定ファイルではパーサーに`/usr/local/Cellar/global/6.3.2/lib/gtags/pygments-parser.la`が指定されていますが、
Homebrewからインストールした場合にはそのファイルが存在しないため、`pygments-parser.so`に書き換える必要があります。

```text
:gtags_parser=Python\:/usr/local/Cellar/global/6.3.2/lib/gtags/pygments-parser.la:\
```

書き換え実行。

```console
$ sed -i -e "s/pygments-parser\.la/pygments-parser.so/g" gtags.conf
```



## スクリプトの修正

前述したとおり、HomebrewでインストールしたPythonなどPygmentsをインストールした場合など、
システムのPython以外にインストールしたPygemntsを使いたい場合、パーサーで実行される`pygments_parser.py`を修正しないとエラーになります。

エラーの理由は`pygments_parser.py`内でPythonインタプリタに`/usr/bin/python`が明示されているからなので、
それを`/usr/bin/env python`などに変更します。

```console
$ sed -i -e "s?#\!/usr/bin/python?#\!/usr/bin/env python?g" /usr/local/Cellar/global/6.3.2/share/gtags/script/pygments_parser.py
```


## タグの生成

準備ができました。では、適当なソースコードを用意してタグを生成してみましょう。

[example.rb]

```ruby
#!/usr/bin/env ruby

def hello(s)
  puts "hello #{s}!"
end

hello('GLOBAL with Pygments')
```

```console
$ gtags --gtagsconf=gtags.conf --gtagslabel=pygments --debug
File './example.rb' is handled as follows:
	suffix:   |.rb|
	language: |Ruby|
	parser:   |parser|
	library:  |/usr/local/Cellar/global/6.3.2/lib/gtags/pygments-parser.so|
File './GPATH' is skipped by skip variable (type 1).
File './GRTAGS' is skipped by skip variable (type 1).
File './GTAGS' is skipped by skip variable (type 1).
```

`--debug`を指定しているのは、Pygmentsが使われていることを確認するためです。
うむ、ちゃんと使われているね。

```
$ ls -l
total 152
-rw-r--r--  1 mubae  staff  16384  9 12 12:33 GPATH
-rw-r--r--  1 mubae  staff  16384  9 12 12:33 GRTAGS
-rw-r--r--  1 mubae  staff  16384  9 12 12:33 GTAGS
-rw-r--r--  1 mubae  staff     90  9 12 12:21 example.rb
-rw-r--r--  1 mubae  staff  24352  9 12 12:14 gtags.conf
```

タグが生成されました！


## タグの参照

では、できたタグを参照してみましょう。

### 関数の定義場所

```
$ global -ax -t hello
hello	/Users/mubae/global-test/example.rb	3
```

おお！

### 関数の参照場所

```console
$ global -ax -r hello
hello               7 /Users/mubae/global-test/example.rb hello('GLOBAL with Pygments')
```

おおおおお！
マジでテンションあがる！！！

## まとめ

これでまた、GNU GLOBALの至高っぷりが格段に強化されました。

一応、デフォルトのパーサーやctagsに比べて遅いという欠点などはあるようですが、正直そんなのどうでもいいくらい便利さがUPすることでしょう。

ちなみに、上記で行ったいくつかの修正点はHomebrew側のFormulaの修正で対応できるかもしれませんが、まだ見てません。