タグテーブルファイルを作成するには、etags
プログラムを使います。
etags
は、数種類の言語について、
構文を解析しタグを取り出すことができます。
つぎのように実行します。
etags inputfiles...
etags
は指定されたファイルを読み、
カレント作業ディレクトリのTAGSという名前のファイルに
タグテーブルを書き出します。
etags
は、ファイル名とその内容から自動的に使用言語を識別します。
後述の‘--language=name’オプションで、
言語を明示することもできます。
ファイルを変更するなどしてタグテーブルの内容が古くなった場合、 テーブルを更新するには、最初にタグテーブルを作成した手順を 繰り返します。 頻繁に更新する必要はありません。
タグテーブルに記録できなかったり、誤ったファイルを記録してしまった場合、 Emacsはタグの定義をみつけることはできません。 しかし、(タグの定義を含んだファイルを多少編集するなどしたために) タグテーブルに記録された位置が多少ズレている程度ならば、 タグをみつけるのに通常より少し時間がかかるだけです。 記録された位置が大幅に狂っていたとしても、 Emacsはタグをみつけることができますが、 そのためにファイル全体を調べなくてはなりません。
ですから、新しいタグを定義したとき、タグの定義を別のファイルに移動したとき、 ファイルを相当変更したときには、タグテーブルの更新が必要です。 しかし、ファイルを編集するつどタグテーブルを更新する必要はありませんし、 毎日更新する必要すらないでしょう。
タグテーブルに別のタグテーブルを取り込むこともできます。 取り込むタグファイル名をオプション‘--include=file’で 指定してタグファイルを作成します。 このように作成したタグファイルには、 指定したソースファイルに加えて、 取り込んだタグファイルに記録されていたファイルも含まれます。
etags
を実行するときに相対ファイル名でソースファイルを指定すると、
タグファイルには、タグファイルを書き出したときのディレクトリを
基準にしたファイル名が記録されます。
こうした場合、
タグファイルとソースファイルを含んだディレクトリ木構造全体を
移動することができ、しかも、タグファイルはソースファイルを正しく指し続けます。
etags
の引数として絶対ファイル名を指定すると、
タグファイルには絶対ファイル名が記録されます。
こうした場合、ソースファイルが同じ場所にある限り、
タグファイルを移動してもタグファイルは同じファイルを指し続けます。
絶対ファイル名は、‘/’、あるいは、
MS-DOSとMS-Windowsでは‘device:/’で始まります。
非常に多数のファイルからタグテーブルを作成する場合、
コマンド行の長さを制限しているシステムもあるので、
ファイル名をコマンドラインで指定するときに問題が起こる可能性があります。
この制限を回避するもっとも単純な方法は、
つぎのように、ファイル名を指定する位置にダッシュを打って、
etags
に標準入力からファイル名を読み込ませることです。
find . -name "*.[chCH]" -print | etags -
オプション‘--language=name’を使えば、
言語を明示的に指定できます。
このオプションはファイル名と混ぜていくつでも使用できます。
それぞれ、あとに続くファイル名に適用されます。
‘--language=auto’を指定すると、
etags
はファイル名とその内容からふたたび使用言語を推測します。
‘--language=none’を指定すれば、
言語に依存した処理をいっさい行わないようになります。
すると、etags
は正規表現による一致だけに
基づいてタグを認識します。
etags
が知っている言語と、言語を推測するファイル名規則を表示するには、
‘etags --help’を指定します。
‘--regex’オプションは、 正規表現による一致に基づいてタグを認識させる一般的な方法です。 このオプションとファイル名を自由に混ぜて使用できます。 各‘--regex’オプションは、それ以前に指定した正規表現に追加され、 オプションのあとにあるファイルに適用されます。 オプションの構文はつぎのとおりです。
--regex=/tagregexp[/nameregexp]/
ここで、tagregexpは、行に一致させてタグを取り出すために使われます。
これはつねに位置が固定されています。
つまり、‘^’が前置されているかのように扱われます。
字下げ分を考慮したければ、正規表現を‘[ \t]*’で始めて、
行頭の任意個の空白に一致するようにします。
正規表現においては、‘\’は直後の文字をクォートし、
‘\t’はタブ文字を表します。
etags
では、これら以外にはCで使われるエスケープシーケンスを
扱えないことに注意してください。
etags
の正規表現の構文は、Emacsのものと同じで、
反復回数演算子(interval operator)が拡張されています。
この演算子は、grep
やed
で使えるものと同じ動作をします。
反復回数演算子の構文は‘\{m,n\}’であり、
直前の正規表現のm回以上n回以下の繰り返しに一致します。
tagregexpがタグとして認識したい部分よりも長く一致するようには しないでください。 tagregexpに一致する部分が必要以上に長くなるのが避けられないならば、 タグの範囲を狭めるためにnameregexpを追加するとよいかもしれません。 正規表現を利用した例をいくつか紹介しましょう。
‘-R’オプションは、それまでに‘--regex’オプションで定義した すべての正規表現を削除します。 つぎの使用例からもわかるように、 オプションのあとに続くファイルに適用されます。
etags --regex=/reg1/ voo.doo --regex=/reg2/ \ bar.ber -R --lang=lisp los.er
この例では、etags
は、
voo.dooとbar.berに対しては、その内容から使用言語を推定します。
さらに、voo.dooから余分にタグを認識するためにreg1を使い、
bar.berから余分にタグを認識するためには
reg1とreg2の両方を使います。
los.erからタグを認識するには、
Lispのタグ構文規則だけを使い、正規表現による一致はいっさい使いません。
別の例を示しましょう。 ここでは、シェルが解釈しないように正規表現をクォートします。
DEFVAR
マクロをタグとする。
--regex='/[ \t]*DEFVAR_[A-Z_ \t(]+"\([^"]+\)"/'
--language=none --regex='/[ \t]*\(ARCHITECTURE\|CONFIGURATION\) +[^ ]* +OF/' --regex='/[ \t]*\(ATTRIBUTE\|ENTITY\|FUNCTION\|PACKAGE\ \( BODY\)?\|PROCEDURE\|PROCESS\|TYPE\)[ \t]+\([^ \t(]+\)/\3/'
--lang=none --regex='/proc[ \t]+\([^ \t]+\)/\1/'
他のオプション一覧を表示するには、
etags --help
を実行してください。