ホームへ

Emacsでのコードリーディング環境を整えておく

1. はじめに

前回の続きで「Emacsコーディング環境を整えよう」シリーズ。
今日はコードリーディング環境について。

プログラマというのは意外にコードを書くよりも読むことの方が多いらしい。 そこで、いかに効率的に読むかということを考える必要があると思う。

ここで「効率的に読むとはこういうことだ!」とドヤ顔で言えるといいのだが、自分は大規模なアプリケーションのコードリーディングをやった経験があまりないので、そういう話はできるはずもない。 ここでできることは、コードリーディングのための道具立てを整えておくぐらいだろうか。

コードリーディングを素晴らしくはかどらせてくれるツールにGNU GLOBALというものがある。 これはソースコードをタギングをするシステムで、そこで作成したタグをもとに縦横無尽にソースコード内を暴れまわることができるので、非常に便利である。

ちなみに、このシステム自体はEmacsでしか使えないわけではなく、Vimからでも使えるし、コマンドラインからも使える。

2. Emacsから使いたい

EmacsからGNU GLOBALを使う方法には色々とあると思うのだが(適当)、自分はEmacsの基本的なオペレーションをHelmというパッケージでやっているので、そこから使えるようにしたい。

Helm自体はとても素晴らしいのだが、さらに素晴らしいことにhelm-gtagsというパッケージがある。 このパッケージを使えば、EmacsのHelm上でGNU GLOBALを使ったタグジャンプが可能になる。 ここまで便利なパッケージを作ってくれているHelm界隈の人やGNU GLOBALを作っておられるJapaneseの方にはもう頭が上がりまへん。

(タグジャンプというのは、タグ情報に基づいてソースコード内に書かれているファイルに移動したり、関数の呼び出し元からその関数が定義されている場所に移動したりすること)

3. helm-gtagsの導入

helm-gtagsを導入したいのだが、依存関係もあるので色々と段階を踏んでいかねばならない。

a. MELPAからhelmを導入

何はともあれ、まずはhelmが必要なので、導入する。

b. GNU GLOBALをソースからからビルドして、インストール

tarballをゲットしてきて、展開し、ビルドし、インストールする。

wget http://tamacom.com/global/global-6.6.2.tar.gz
tar xf global-6.6.2.tar.gz
cd global-6.6.2
./configure --prefix=/usr/local
make
make install
export GTAGSCONF=/usr/local/share/gtags/gtags.conf

c. Pygmentsを導入して、パーサーとして利用できるようにする

GNU GLOBALにビルトインされているパーサーではCやC++などの6言語にしか対応していないが、Pygments + exuberant-ctagsを利用することによってPython、Rubyなど26言語まで対応言語が増える。 Pygmentsをpipでインストール。(Pythonが必要、今はPython3系でよい)

pip3 install Pygments
apt-get install exuberant-ctags

gtagsにpygmentsパーサーを使うようにさせてから、実行。

export GTAGSLABEL=pygments
gtags

もしくはgtags実行時に指定する。

gtags --gtagslabel=pygments

d. MELPAからhelm-gtagsをインストール

MELPAからhelm-gtagsをインストール。

4. 使えるか確認

何かソースコードを準備した上で、ディレクトリ内で以下のようにシェル上でタグファイルを生成する。

# 出力あり
gtags -v

# 出力なし
gtags

# GPATH GRTAGS GTAGSが生成されているのを確認 

その上で、Emacsを使って、ソースコード上の関数を呼び出しているところに移動してみる。

そして、

helm-gtags-find-tag

を実行する。 そうすると、関数の定義元に一発で移動する。
もし移動できていれば、helm-gtagsが使える状態だということだ。

もし、もう一度関数の呼び出し元に戻りたい場合は、

helm-gtags-pop-stack

を実行すればよい。

その他のhelm-gtagsの基本的なコマンドはこちらに掲載されているので、そちらを参照してほしい。

syohex/emacs-helm-gtags

5. おわりに

まだまだ、全てを使いこなせていない感のあるhelm-gtags。 便利なコマンドを見つけたり、キーバインドを設定したりして、手の内に入れていきたいところである。

2018/07/09 16:30:37に更新

カプセルで書く技術ログ
Capsule-Man on Github