CTAGS(1)

名称
ctags - タグファイルを作成する

書式
ctags [-BFadtuwvx] [-f tagsfile] name ...

解説
ctags は、指定された C, Pascal, Fortran, YACC, lex, lisp のソースから、 ex(1) コマンド用のタグファイルを作成します。 タグファイルは、指定されたオブジェクトが一群のファイル中の どの場所にあるかを示すものです。 タグファイルの各行はオブジェクトの名前、定義されているファイル、 オブジェクトの定義を見つけるための検索パターンを含み、 各々は空白で区切られています。 この tags ファイルを用いることにより、 ex(1) でこれらのオブジェクトが定義されている場所をすばやく見つけることが できます。 ctags に与えられるオプションによりますが、オブジェクトは subroutine 、 typedef 、 define 、 struct 、 enum 、 union から 構成されます。

-B  後方検索パターン (?...?) を用います。

-F  前方検索パターン (/.../) を用います(デフォルト)。

-a  既存の tags ファイルに追加します。

-d  引数を持たない #define に関してもタグを作成します。引数を持つ #define は自動的にタグが作成されます。

-f tagsfile
    tagsfile で指定されたファイル名でタグファイルを生成します。 デフォルトでは tags というファイル名でタグファイルを生成します。

-t  typedef, struct, union, enum 宣言のタグを生成します。

-u  tags ファイル内の指定されたファイルに関する情報を更新します。 すなわち、関係するファイルへのすべての参照が削除され、新しいタグ情報が ファイルに追加されます。 (注意: このオプションはあまりスピードのでないような実装しか おこなわれていません。単に tags ファイルを再構築した方が早く終了するでしょう。)

-v  vgrind(1) 形式のファイル一覧が標準出力に出力されます。 この一覧はオブジェクト名、ファイル名、1 ページあたり 64 行とした場合の ページ番号から構成されます。 出力は辞書式の順番でソートされているので、この後に sort(1) を通した方がよいでしょう。次のように使います。

        ctags -v files | sort -f > index
        vgrind -x index

-w  診断用メッセージを表示しないようにします。

-x  ctags はオブジェクト名、行番号、ファイル名、その行の内容からなる一覧を作成し、 それを標準出力に出力します。 これはオフラインでも読みやすいように印刷できる簡単な関数一覧として 利用できます。

.c や.h で終わる名前のファイルは、 C 言語のソースファイルとみなされ、 C の形式の関数・マクロ定義が検索されます。.y で終わる名前のファイルは、 YACC のソースファイルとみなされます。.l で終わる名前のファイルは、最初の空白でない文字が `;' か `(' か `[' で あれば lisp のファイルであるとみなされ、そうでなければ lex のファイルと みなされます。 その他のファイルは、まず Pascal か Fortran の定義が含まれるか どうかがチェックされ、含まれない場合には C 形式の定義が検索されます。

C 言語の場合、 main は特別に扱われ、元のソースファイルのパス名部分と末尾の.c の部分を取り除いたファイル名に対し、その先頭に M を付加したものをオブジェクト名とします。 これにより、同じディレクトリに複数のプログラムがある場合でも ctags を実用的に使うことができます。

yacc と lex のファイルには特殊なタグがあります。 yyparse は yacc ファイルの第二セクションの始まりを示し、 yylex は lex ファイルの第二セクションの始まりを示します。

関連ファイル
tags
    デフォルトで出力されるタグファイル

診断
ctags はエラーが発生すると 1 を返し、それ以外では 0 を返します。 同じ名前のオブジェクトが複数出てきてもエラーとはみなされません。

関連項目
ex(1), vi(1)

バグ
FORTRAN と Pascal 用の 関数(function) 、 サブルーチン(subroutine) 、 手続き(procedure) の認識にはとても単純な方法を用いています。 ブロック構造が解釈できないので、異なるブロックに同じ名前の Pascal 手続きが 存在するとうまく動作しません。 ctags は Pascal の型(type)も理解しません。

C か Pascal か FORTRAN かを判断する方法はとりあえず動いている、という程度のものです。

ctags はきちんと整形された入力に頼っています。 また、ソースファイルに文法的な間違いがあると 簡単に混乱してしまいます。 文法的に間違っていなくても混乱する場合があります。 例えば、 #ifdef を理解しないので(バグではなく仕様です)、 #ifdef 内に括弧のつりあっていないコードがあると混乱してしまいます。 同様に、定義が複数行にわたっている場合、オブジェクトの先頭行ではなく 最終行が検索パターンにマッチします。 複数行にわたる typedef に関しても同様です。

歴史
ctags コマンドは 3.0BSD から登場しました。