書籍購入:いつもお世話になっております。『GNU GLOBALハンドブック』

何だかんだで数年前からGNU GLOBALには助けられているので、お布施と今後の使いこなし度向上を兼ねて購入した。

GNU GLOBALハンドブック―ソースコードタグシステム

GNU GLOBALハンドブック―ソースコードタグシステム

BOKINウェアなので本当は寄付するのが正しいお布施のスタイルだと思うけど、どうもこう、何ていうか、精神的に敷居が高くて躊躇してしまう。これに限らず手軽に小額を決済できる仕組みがあればよいのだけど。

GNU GLOBALは数年間使い続けている割に未だに使い方がよく分からなく*1、多分GNU GLOBALを使い始めて2〜3週間の人に負ける程度に使いこなせてない。ただhtagsでHTML化できるので重宝している。GNU GLOBALに限らず「エディタ上でタグジャンプする」という使い方自体がどうも苦手で、ブラウザで表示するようにしている。

本来は公式のドキュメントを読むべきなのだけど英語は苦手だ。ネット上の他の情報は断片的だったり表面的だったり古かったりして、参考になるようでならなかったりする。

そういった意味では本書はGNU GLOBALの作者自身が網羅的に書いている訳で、ある意味「日本語版の公式ドキュメント」と言える。各種コマンドの使い方からVimEmacsといった他のツールとの連携、プラグインパーサの作り方までキッチリ書かれている。

そういえばVimに古いgtags.vimを入れたままだった。新しいgtags.vimにして使い方を勉強し直そうかなあ。

おまけ:lessでタグジャンプ

GNU GLOBALハンドブック』にはページャーのlessとの連携について丸々1章書いてある(第11章)。勉強不足なものでlessでタグジャンプできることを初めて知った。

本来は色々と環境変数を設定するべきらしいけど面倒だ。私の場合は作業環境がWindowsの素のコマンドプロンプトcygwinですらない)なので一時的に環境変数を設定するのも面倒だったりする。lessのバージョンが古い(GnuWin32のless-394)のも気になる。

ただlessは標準入力からタグリストを読み込むことができるらしく、その方法なら環境変数の設定をしなくても問題なく使えるようだ。

タグリストを標準入力に流し込む場合はctags-xフォーマットでないと駄目なようだ。これはExuberant Ctagsにオプション -x を付けて実行した時の出力らしい。ということはctagsでlessでタグジャンプできるはずだ、と考えて試してみた。

ctags -f - -u -x foo.c | less -T-

ctagsでfoo.cのタグを生成してファイルではなく標準出力に出力し、それをlessで受けた。ファイル中の各種定義に対してタグが存在する状態なので、`t' ないし `T' で各要素に順番にジャンプしていく。オプション -u を付けている点に注意。これを付けないとタグがアルファベット順にソートされるので、less上でタグジャンプする時にアルファベット順(正確にはその逆順)にジャンプしていくことになる。

このコマンドはGNU GLOBALを使うとこうなる。

global -f foo.c | less -T-

less上での挙動は同じ。ただlessに流し込まずに出力されるタグを表示させてみるとctagsとglobalでは微妙に違いがある。ctagsの出力には各シンボルの型(例えばtypedef、macro、variable、function)を示すフィールドがあるけどglobalの出力には無いようだ。

globalを使う場合は『GNU GLOBALハンドブック』に書かれているように必要なタグのみを生成してlessに流し込むことができる。

# シンボル main へのタグのみ出力(『GNU GLOBALハンドブック』より)
global -x main | less -T-

# `comment' でgrepして、該当する行についてタグ出力する
global -gx comment | less -T-

ctagsを使う場合は「global -g」のようにgrepする方法は無いようだし*2、特定のシンボルへのタグのみ出力したい場合は別のツールでフィルタするしか方法はなさそうだ。

# 再帰的にタグを生成して、シンボル main へのタグのみ出力
ctags -f - -u -x -R . | egrep '^main' | less -T-

まあlessのタグジャンプの仕組みでは標準でctagsを使うようになっているので、標準出力経由で流しこまずに普通にタグファイルを作っておけばless上で特定のシンボルにのみタグジャンプすることは可能だ。*3

とはいえGNU GLOBALの方が生成できるタグの自由度が高いので、慣れれば便利そうだ。

*1:私の場合、こういうことは決して珍しくない。他のツール(VimとかEmacsとかGDBとかVisual StudioとかXcodeとか)も大抵は使い方がよく分からないまま使い続けている。

*2:あ、でも--regex-を使えばいけるのか? ちょっと裏技っぽいけど。

*3:もっともそれは、環境変数を正しく設定すればglobalでも可能だが。ただlessのバージョンが新しいほうが良いようだ。