etags の使い方メモ

概要

emacs では, あらかじめ関数定義をタグテーブルにまとめておくことで, 関数定義元ファイルの検索を容易にすることがきる.
この機能は etags.el で実装されている.
以下, emacs manual の内容を適当に要約して, 少し加筆したものをメモしておく.

タグテーブルの作成

etags コマンドを使うことで TAGS という名前のタグテーブルが生成される.

$ etags *.el

etags コマンドに複数のファイル名を渡せば, すべてのファイルの情報をもった1つの TAGS ファイルが生成できる.

emacs 内でのタグテーブルの管理

emacs はタグテーブルのリスト tags-table-list をもっており, リストの中から現在選択しているタグテーブルのファイル名を変数 tags-file-name に格納している.
tags-file-name は検索開始ファイルを表し, tags-table-list は検索するタグテーブルのリストを表す.
後に示す find-tag 等のタグ検索コマンドを実行した際は, tags-file-name で指定されるファイルから検索を開始し, tags-table-list 内のファイルを順番に1周して, すべてのファイルを検索する.

タグテーブルの選択

タグテーブルを変更する場合は M-x visit-tags-table を実行すればよい.
M-x visit-tags-table を実行すると, タグテーブルのファイル名を聞かれる.
タグテーブルのファイル名として tags-teble-list に含まれるものを指定した場合は, 単に tags-file-name の値が変更され, 検索開始位置が変更される.
一方, M-x visit-tags-table で新しいファイル名を指定すると,

Keep current list of tags tables also?
(現在のタグテーブルリストを保持しますか?)

と質問される.

yes と答えると, 現在の tags-table-list が保持され, 新たに指定したファイル名が tags-table-list に追加される.
tags-file-name は新しく指定したファイル名を指すようになる.

no と答えると, 現在の tags-table-list を破棄し, 新しく指定したタグテーブルのみを含むリストが tags-table-list に格納される.
tags-file-name は当然新しく指定したファイル名を指す.

タグテーブルリストを事前に指定

tags-table-list にあらかじめ, 検索するタグテーブルを登録しておくと便利.

(setq tags-table-list
       '("~/emacs" "/usr/local/lib/emacs/src"))

とすると, ~/emacs/TAGS と /usr/local/lib/emacs/src/TAGS が登録される.
tags-table-list に登録するファイル名は, TAGSを含むディレクトリ名でも, TAGS 本体でもどちらでもよい. すなわち,

(setq tags-table-list
       '("~/emacs/TAGS" "/usr/local/lib/emacs/src/TAGS"))

でもよい.
ディレクトリ名で指定した場合は, etagse.el 内の関数 tags-expand-table-name が後ろに TAGS を付けたものに変換している.
また, tags-expand-table-name はパスの展開も行ってくれるので, パスの指定も上記のように相対パスでもよい.

emacs の標準関数の TAGS ファイルを作成

emacsMakefile には TAGS の生成ルールが用意されているので, emacs に標準で含まれている関数の TAGS ファイルを生成するには, Makefile を含むディレクトリで,

$ make tags

を実行すればよい.
./src 以下に, TAGS と TAGS-LISP というファイルが生成される.
TAGS が C の関数のタグファイル. TAGS-LISPLISP の関数のタグファイル.
TAGS-LISP は TAGS 内でインクルードされているので, tags-table-list には TAGS のみを登録すればよい.

etags のコマンド

使いそうなコマンドだけメモ.

find-tag

M-. に find-tag が割り当てられている.
前置引数を変えると, 前方に検索したり, 後方に検索したりできる.

  • M-. tag
    • `tag' で指定した関数定義を探す.
  • C-u M-. (M-0 M-.)
    • 前回検索したタグの次の候補を探す.
  • C-u - M-. (M-- M-.)
    • 前回検索したタグの前の候補を探す.
find-tag-regexp

次のタグを探すときは, find-tag と同様 "C-u M-." を使う.

pop-tag-mark
  • M-*
    • 最後に find-tag を起動した位置に戻る.