Ctags

Ctags（英: Ctags）はソース及びヘッダ内にある名前のインデックス（又はタグ）ファイルを生成するプログラム。様々なプログラミング言語に対応している。言語に依存するが、サブルーチン(関数)、変数、クラスのメンバ、マクロ等がインデックス化される。これらのタグによりテキストエディタなどのツールで高速かつ容易に定義を参照できる。相互参照ファイルを出力でき、また名前についての情報を人が読みやすい形で列挙した言語ファイルを生成することもできる。

Ctagsはケン・アーノルドがBSD Unix用に開発した。後にJim KlecknerによりFortranがサポートされ、ビル・ジョイによりPascalがサポートされた。

ctagsをサポートするエディタ 

タグインデックスファイルは下記を含む数多くのソースコードエディタでサポートされている。
 AcroEdit
 BBEdit（バージョン8以降、要Exuberant Ctags）
 GNU EmacsとXEmacs
 EmEditor Professional
 Gedit (リンク先のgedit-symbol-browser-pluginでサポート)
 JED
 jEdit (CodeBrowser、Tags、ClassBrowser、CtagsSideKick、Jumpのプラグインでサポート。)
 JOE
 KDevelop
 KATE (右記リンク先のkate-ctags-pluginでサポートKDE-apps)
 NEdit
 Notepad++ (OpenCTagsプラグインでサポート)
 Programmer's Notepad
 QDevelop
 TextMate (CodeBrowser-PlugInでサポート)
 UltraEdit
 VEDIT
 Vi (及びElvis、Nvi、Vim、vile等の派生版)
 ViVi
 Zeus IDE

ctagsの派生版 

ctagsにはいくつかの派生版が存在する。

Etags 

EtagsはEmacs上で動作するctagsである。ctagsが生成するViフォーマットのタグファイル用にのみ意味のあるオプションはetagsでは解釈されず無視される。

Exuberant Ctags 

Darren Hiebertが開発したExuberant Ctagsは元々Vimと共に配布されていたが、Vim 6のリリースに合わせて独立したプロジェクトになった。Emacs互換機能をサポートしている。

Exuberant Ctagsは正規表現を用いることにより数多くのプログラミング言語に対応でき、30以上の言語に対応している。

タグファイルのフォーマット 

複数のタグファイルフォーマットがある。その一部を以下で説明する。説明中の<\x##>は16進数でバイトを表している。

Ctagsフォーマット及びExuberant Ctagsフォーマット 

オリジナルのctagsフォーマットとExuberant Ctagsフォーマットはファイルフォーマットが似ている。

Ctagsフォーマット 
エディター「vi」系用のフォーマット。タグファイルは通常は tags という名前である。

タグファイルは行単位でフォーマットされている。

{タグ名}<Tab>{タグファイル}<Tab>{タグアドレス}

各フィールドは以下のように定義される。

タグファイルの検索を高速にするためタグファイルは {タグ名} のフィールドでソートされる。

Exuberant Ctagsフォーマット 

Vim用のフォーマット。後方互換性のため出力フォーマットとしてオリジナルのctagsフォーマットと拡張フォーマットを選択できる。

各フィールドは以下のように定義される。

{タグ名}<Tab>{タグファイル}<Tab>{タグアドレス}[;"<Tab>{タグフィールド}...]
{タグアドレス}までのフィールドは上記のctagsと同じである。

拡張フィールド
;" – セミコロンとダブルコーテーション。vi のコメントと同じ表記により{タグアドレス}を終了させる。
{タグフィールド}

拡張フォーマットでは ex コマンドの後ろに ex コメントを続ける形でオリジナルの vi の実装との下位互換性を維持したままで{タグアドレス}フィールドを拡張できる。これらの拡張フィールドはタブで区切られたキー・バリューのペアである。詳細はctagsのマニュアルを参照のこと。

Etagsフォーマット 

Emacs用の etags のフォーマット。タグファイルは通常は TAGS という名前である。

etags のファイルは複数のセクションで構成されている。入力ソースファイル毎に1つのセクションを持つ。各セクションはプレーンなテキストファイルであるが、特別な制御用にアスキー外の文字を使用する。以下の説明においてこれらの文字は<>で囲まれた16進数のコードで表す。

セクションは2行のヘッダで始まる。1行目は<\x0c>一文字のみを含む。2行目は次のようになる。

{ソースファイル<},{タグ定義データのバイト数}

ヘッダの後にはタグの定義が続く。各定義毎に1行。フォーマットは以下の通り。

{タグ定義テキスト}<\x7f>{タグ名}<\x01>{行番号},{バイトオフセット}

タグ定義よりタグの名称が導き出せる場合は{タグ名} とその後ろの \x01 が無視される。

例 
ソースコードとして次のような1行だけのtest.cを読み込ませた場合、

#define CCC(x)

TAGS ファイルは次のようになる。

<\x0c>
test.c,21
#define CCC(<\x7f>CCC<\x01>1,0

参考文献

外部リンク 
 Exuberant ctagsのホームページ
 VMS用のCtags
 Emacsのvtags.elモジュールのソースコード

フリープログラミングツール
標準UNIXプログラム