2012年11月15日木曜日

風のごとく飛ぶ: etags

みなさんは、プログラムのソースコードを書いているときに
「あれ、この関数どうやって使うんだったっけな」とか
「途中まで関数の名前出てるけど最後まで思い出せない」とか思ったときありませんか?
そんなときすぐにその関数の詳細を見たいけど、「どのファイルで定義してあったかな」とか「確かあのファイルにあるけど開くのめんどくせー」とかっていうオチになるでしょう。
そんなとき、Emacsなら風のようにすぐにその関数の定義に飛ぶことが出来ます。
それにはetagsという機能を使います。


etagsは、たくさんの関数の定義がどのファイルの何行目にあるのかというような情報をある一つのファイルにテーブルとして保持しておき、 そのテーブルファイルに関数名を問い合わせてそのソースファイルを開きます。
例えるなら、たくさんのソースファイルが参考書で、その索引がテーブルファイルに当たります。

では使い方。
まずはテーブルファイルを作りましょう。
Cプログラマなら".c"や".h"ファイルがまとめて置いてあるライブラリフォルダでやるのが適切だと思います。
ターミナルでそのフォルダに移動したら、以下を入力します。
$ etags *.[ch]

これだけでそのフォルダにテーブルファイル"TAGS"というものが出来ます。

次はEmacsとTAGSファイルを関連づける作業です。
Emacsを開いたら以下のコマンドを入力します。
M-x visit-tags-table
そしたら、先ほどのライブラリフォルダにパスを通します。
設定はこれだけです。

使い方としては、ある関数名にカーソルを合わせて
M-.
これで[Enter]を押せば同じウィンドウに関数の定義を表示させます。
作業ウィンドウが置き換わってしまうのが嫌な場合は
C-x 4 .
これで[Enter]で他のウィンドウに関数の定義を表示させることができます。

で、例えば途中まで同じ名前だけど目的の関数とは違うものが出てきてしまったときは
C-u M-.
これで次の候補に移ります。

さらに。
上記のやり方ではEmacsの起動ごとにテーブルファイルを設定しないといけませんが以下のコードを.emacs.elファイルに書いておくことで起動時に自動的にテーブルファイルを設定してくれるようになります。
(setq tags-table-list '("~/path/to/library"))

ダブルクォーテーションでくくった部分を何個も書けば複数のテーブルファイルを設定できるみたいです。

さらにさらに。
C言語だけでなくC++も使う人にとっては".c"と".cpp"ファイルが混在していて先ほどのetagsコマンドの正規表現では".cpp"ファイルを見つけてくれません。
さらにさらにさらに、ヘッダファイルとソースファイルを別々に管理している筆者にとってはカレントディレクトリ直下のサブディレクトリの中にまであるファイルに関連付けてもらわないと不便です。
なので、テーブルファイル作成コマンドを以下のように変更します。
$ find . \( -name '*.[ch]' -or -name '*.cpp' \) -print | etags -

Unixのコマンドを組み合わせて少し複雑になってますが、これでカレントディレクトリより下のディレクトリの".c", ".h", ".cpp"ファイルをテーブル化してくれます。

お分かりいただけただろうか?

注意事項として、ライブラリを更新したらテーブルファイルの更新も忘れずにすること。
そして、etagsで飛んでくれる場所は関数の"宣言"ではなくて"定義"部分であるということ。

つーわけで、etagsより便利になったgtagsというのがあるらしいので誰か調べてください!

1 件のコメント :

  1. etagsをさらに便利にする追加lisp,auto-complete-etags
    http://d.hatena.ne.jp/whitypig/20110415/1302865110

    返信削除