GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/emacs/Create-Tags-Table.html ・ emacs-doc.conao3.com

30.4.2.2 タグテーブルの作成

etags プログラムは、タグテーブルファイルの作成に使用されます。このプログラムは、ソースファイルのタグ構文に記載されている通り、複数の言語の構文に対応しています。etags の実行方法は以下の通りです。

etags inputfiles...

etags プログラムは指定されたファイルを読み込み、現在の作業ディレクトリに TAGS という名前のタグテーブルを書き出します。‘--output=file’ オプションを使用することで、タグテーブルに別のファイル名を任意に指定できます。ファイル名として - を指定すると、タグテーブルが標準出力に出力されます。また、‘--append’ オプションを使用することで、新しく作成されたタグテーブルを既存のファイルに追記することもできます。

指定されたファイルが存在しない場合、etags はその圧縮版を探し出して展開し、読み込みます。MS-DOS では、コマンドラインで mycode.c が指定され、かつ mycode.c が存在しない場合、etags は mycode.cgz のようなファイル名も探します。

tagsテーブルに記載されているファイルの変更によりテーブルが古くなった場合は、etagsプログラムを再度実行することで更新できます。tagsテーブルにタグが記録されていない場合や、誤ったファイルに記録されている場合、tagsテーブルを更新するまでEmacsはその定義を見つけることができません。ただし、(他の編集によって)tagsテーブルに記録された位置がわずかにずれた場合でも、Emacsはわずかな遅延を伴いながら正しい位置を特定できます。

したがって、編集のたびにタグテーブルを更新する必要はありません。掲載したい新しいタグを定義した場合や、タグの定義をあるファイルから別のファイルへ移動させた場合、あるいは変更内容が大幅になった場合に、タグテーブルを更新してください。

後述するetags-regen-modeマイナーモードが有効になっている場合、Emacsは必要に応じてタグテーブルを自動的に最新の状態に保ちます。

etags に ‘--include=file’ オプションを渡すことで、あるタグテーブルに別のタグテーブルを含めることができます。これにより、含められたタグファイルがカバーするすべてのファイルに加え、そのファイル自体もカバーされるようになります。

etags を実行する際にソースファイルを相対ファイル名で指定した場合、タグファイルにはタグファイルが最初に書き込まれたディレクトリを基準としたファイル名が格納されます。これにより、タグファイルとソースファイルの両方を含むディレクトリツリー全体を移動させても、タグファイルは引き続きソースファイルを正しく参照できます。一方、タグファイルが - であるか、あるいは /dev ディレクトリにある場合は、ファイル名は現在の作業ディレクトリを基準として指定されます。これは、例えばタグを標準出力に書き出す場合などに便利です。

相対ファイル名を使用する場合、別のディレクトリにあるタグファイルを指すシンボリックリンクにしてはいけません。そうすると、一般的にファイル名が無効になるためです。

etags の引数として絶対ファイル名を指定すると、タグファイルには絶対ファイル名が格納されます。これにより、ソースファイルが同じ場所に留まっている限り、タグファイルを移動させても同じファイルを参照し続けることができます。絶対ファイル名は、‘/’ または MS-DOS および MS-Windows では ‘device:/’ で始まります。

大量のファイルからタグテーブルを作成しようとする際、システムによっては長さに制限があるため、コマンドラインにファイル名を列挙するのに苦労することがあります。この制限を回避するには、次のようにファイル名の代わりにハイフンを入力し、etags に標準入力からファイル名を読み込ませるように指定します。

find . -name "*.[chCH]" -print | etags -

etags は、入力ファイルのファイル名と内容に基づいて、使用されている言語を判別します。まず、ファイル名と拡張子を、特定の言語で一般的に使用されるものと照合しようとします。言語によっては、既知の名称を持つインタプリタが存在するため(例:Perl 用の perl や Prolog 用の pl)、次に etags は入力ファイルの1行目にある「#!interp」という形式のインタプリタ指定を探し、それを既知のインタプリタと照合します。これらで判別できない場合や、言語の自動検出を上書きしたい場合は、--language=name オプションで言語を明示的に指定できます。これらのオプションはファイル名と組み合わせて使用でき、各オプションはその後に続くファイル名に適用されます。--language=auto を指定すると、etags はファイル名とファイル内容から言語の推測を再開します。--language=none を指定すると、言語固有の処理を完全に無効にします。その場合、etags は正規表現マッチングのみでタグを判別します(Etags Regexps を参照)。これは、入力ファイルが etags でまだサポートされていない言語を使用しており、etags がデフォルト言語として Fortran や C にフォールバックするのを避けたい場合に便利です。

また、‘--no-fallback-lang’ オプションを指定することで、etags が Fortran や C にフォールバックするのを防ぐこともできます。‘--fallback-lang’ オプションを指定すると、この設定は無効になります。

オプション ‘--parse-stdin=file’ は、主にプログラムから etags を呼び出す際に有用です。コマンドライン上のファイル名の代わりに(1回のみ)使用できます。etags は標準入力から読み込み、生成されたタグをファイル file に属するものとしてマークします。

CおよびC++において、ソースファイルがGNUコーディング標準の「関数やstruct定義などのトップレベル定義にのみ0列目に中括弧({および})を配置する」という規約に従っていない場合は、etagsが0列目の閉じ中括弧を誤って解釈するのを防ぐため、--ignore-indentationオプションを使用することを推奨します。

‘etags --help’ は、etags が認識する言語の一覧と、言語を推測するためのファイル名規則を出力します。また、利用可能なすべての etags オプションの一覧を、簡潔な説明とともに表示します。続けて1つ以上の ‘--language=lang’ オプションが指定された場合は、lang のタグがどのように生成されるかに関する詳細情報を出力します。

デフォルトでは、etags はスキャンしたすべてのファイル(タグが全く見つからなかったファイルを含む)をタグテーブルに含めます。これを防ぐには ‘--no-empty-file-entries’ を指定してください。これにより、タグのないファイルはタグテーブルに記載されなくなります。ただし、tags-search(識別子による検索と置換を参照)のように、タグテーブルに記載されたファイルを処理するコマンドは、このようにタグテーブルから除外されたファイルも処理することに注意してください。‘--empty-file-entries’ オプションを指定すると、この動作が無効になります。

etagsを手動で実行してtagsテーブルを作成・更新する代わりに、Emacsに自動的に行わせることができます。グローバルマイナーモードのetags-regen-modeを有効にすると、必要に応じてtagsテーブルを自動的に生成し、タグの元となるソースファイルのいずれかを編集した際に更新処理を行います。このモードでは、現在のプロジェクト設定(プロジェクトの操作を参照)を用いて、プロジェクトのtagsテーブルを再生成するためにetagsに送信するファイルを決定します。以下のユーザーオプションを使用して、このマイナーモードの動作をカスタマイズできます。

etags-regen-program

タグテーブルを再生成するプログラム。デフォルトは etags。

etags-regen-program-options

タグテーブルを再生成するプログラムに渡すコマンドラインオプション。

etags-regen-ignores

タグテーブルの再生成時に無視するファイルを指定するglobワイルドカードパターンの一覧。

M-x visit-tags-table を使用してタグテーブルを手動で選択した場合(タグテーブルの選択を参照)、etags-regen-mode は実質的に無効になります。タグテーブルの手動管理を希望している場合、以降タグテーブルの自動作成および更新は行われなくなります。visit-tags-table を使用したこの効果は、コマンド tags-reset-tags-tables を実行することで解除できます。