Emacsのタグ:etags、ebrowse、cscope、GNU Global、および活発なctags間の関係


102

私はC ++プロジェクトで作業していて、Alex OttのCEDETおよびStackOverflowのタグに関する他のスレッドのガイドを読みましたが、オートコンプリート、定義の検索、ソースのナビゲーションを容易にするためにEmacsがこれらの異なるタグシステムとどのようにインターフェースするかについてはまだ混乱しています。コードベースまたはdoc-stringsのプレビュー。

  1. 間(例えば機能の面で)違いは何ですか etagsebrowseexuberant ctagscscopeGNU GlobalとはGTagsEmacsでそれらを使用するには何をする必要がありますか?

  2. タグを使用してシンボルをナビゲート/オートコンプリートする場合、セマンティック/セネター(CEDET)が必要ですか?

  3. セマンティックは、これらのさまざまなタグユーティリティの上に何をもたらすでしょうか。これらのツールとどのように連携しますか?


2
トランクで判断するとGTagsリンク先のプロジェクトはかなり死んでいます。誰かがについて話しているのならgtags、おそらくGNU Globalを参照しているでしょう。
ゴードングスタフソン

回答:


71

これは、ここで最近読んだのと同じくらいよい質問なので、違いをさらに詳しく説明してみましょう。

ポイント1:

etagsまた、ctagsどちらもソースファイルにある言語オブジェクトのインデックス(別名tag / TAGS)ファイルを生成します。これにより、テキストエディターやその他のユーティリティでこれらのアイテムをすばやく簡単に見つけることができます。タグは、インデックスエントリが利用可能な言語オブジェクト(または、そのオブジェクトに対して作成されたインデックスエントリ)を示します。ctagsによって生成されるタグはメタデータの点でより豊富ですが、Emacsはとにかく追加のデータを解釈できないため、多かれ少なかれ同じであると考える必要があります(主な利点はctags、より多くの言語をサポートすることです)。タグファイルの主な用途は、クラス/メソッド/関数/定数/ etc宣言/定義の検索です。

cscopeより強力な獣です(少なくともC / C ++とJavaに関する限り)。それは多かれ少なかれ同じ原理(有用なメタデータのファイルを生成する)で動作しますが、シンボルへのすべての参照の検索、関数が呼び出されている場所の確認など、より洗練された操作を実行できます(定義も検索できます) 。

要約すると:

ctags1つは、シンボル宣言/定義(一部は一方向ルックアップと呼ぶもの)にナビゲートすることを可能にします。ctagsは、多くの言語に役立つ汎用ツールです。

一方、(プロジェクトのページで言及されているように)次のcscopeことができます。

  • シンボルの宣言に行く
  • シンボルへのすべての参照の選択可能なリストを表示する
  • グローバル定義を検索
  • 関数によって呼び出される関数
  • 関数を呼び出す関数
  • テキスト文字列を検索する
  • 正規表現パターンを検索する
  • ファイルを探す
  • ファイルを含むすべてのファイルを検索する

この時点で誰も驚かないはずです。C/ C ++プロジェクトを扱うとき、私はを多用し、cscopeほとんど気にしませんctags。他の言語を扱う場合、状況は明らかに逆になります。

ポイント2。

インテリジェントなオートコンプリートを使用するには、真のソースコードパーサー(セマンティックなど)が必要です。そうでない場合、アプリケーション内のオブジェクトのタイプ(たとえば)と、それらで呼び出すことができるメソッドがわかりません。多くの異なるソースに基づくオートコンプリートを使用できますが、最良の結果を得るには、最終的にパーサーが必要になります。構文の強調表示についても同様です。現在、Emacsのメジャーモードでの構文の強調表示は、正規表現に基づいているだけで、非常に壊れやすく、エラーが発生しやすくなっています。Emacs 23.2(以前は外部パッケージでした)にセマンティックを含めることで、より多くの用途(バッファソースコードを分析して適切にハイライトするために使用するなど)が見られるようになれば幸いです。

Emacs 24.1以降、セマンティックはEmacs補完フレームワークから使用できます。これをテストする最も簡単な方法は、Cソースコードファイルを開いて入力するM-TABC-M-i、セマンティックが自動的に完了するのを監視することです。セマンティックがデフォルトで有効になっていない言語の場合、選択したメジャーモードフックに次の行を追加できます。

(add-to-list 'completion-at-point-functions 'semantic-completion-at-point-function)

ポイント3。

セマンティックは真のコード認識をもたらし(現在サポートされているいくつかの言語に対して)、IDEとEmacsの間のギャップを埋めます。etagsやなどのツールと実際に連動cscopeするわけではありませんが、それらを一緒に使用できないという意味ではありません。

うまくいけば、私の説明は意味があり、あなたにとって役立つでしょう。

PS私はと非常に慣れていないんだglobalebrowse、しかし、メモリが私を提供する場合、彼らはのetagsを利用しました。


1
これは素晴らしい。ありがとう!cscopeEmacsでどのように使用できるか知っていますか?xcscope.elEmacsWikiでここを読みましが、ファイルへのリンクが見つかりませんでした。また、Emacsで.el取得するためにどのファイルを使用しますcscopeか?
Amelio Vazquez-Reina

1
xcscope.elにありますcscope/contrib/xcscope/(これは配布パッケージにあります)。それが私が使うものです。
Bozhidar Batsov

もう1つの質問:どのようにsemantic比較しcscopeますか?ソースコードのナビゲートに関して、セマンティックは提供しない機能を提供cscopeしますか?両方使用しますか?
Amelio Vazquez-Reina

4
GNU Globalがetagsを使用しているとは信じていません。IIRCは(フラットテキストファイルをスキャンするのではなく)「適切な」データベースを維持および照会します。これにより、照会と(特に)タグの更新の両方で多くのパフォーマンス上の利点があります。
phils '17

@BozhidarBatsovあなたが言っFor languages where semantic is not enabled by default, you can add the following line to your major mode hook of choice ... <code>たとき。そのコードスニペットは正確に何をしますか?
Amelio Vazquez-Reina

45

1に説明を追加してみます。

それは何ですか?

  • Etagsは、Emacs用のタグファイルである「TAGS」ファイルを生成するコマンドです。emacsパッケージの一部であるetags.elでファイルを使用できます。
  • Ctagsは、viのタグファイルである「タグ」ファイルを生成するコマンドです。Exuberant Ctagsは-eオプションで 'TAGS'ファイルを生成できるようになり、41のプログラミング言語をサポートしています。
  • Cscopeは、C言語用のオールインワンのソースコード閲覧ツールです。独自のCUI(キャラクターユーザーインターフェイス)とタグデータベース(cscope.in.out、cscope.out、cscope.po.out)を備えています。Emacsからcscopeを使用するには、cscopeパッケージの一部であるxcscope.elを使用します。
  • GNU GLOBALは、ソースコードのタグ付けシステムです。上記のツールに似ていますが、エディタに依存している点が異なり、コマンドライン以外のユーザーインターフェースはありません。Gtagsは、GLOBAL(GTAGS、GRTAGS、GPATH)のタグファイルを生成するコマンドです。GLOBALパッケージの一部であるgtags.elを使用して、emacsからGLOBALを使用できます。これに加えて、多くのelispライブラリがあります(xgtags.el、ggtags.el、anything-gtags.el、helm-gtags.elなど)。

比較

  • Ctagsとetagsは定義のみを扱います。CscopeとGNU GLOBALは、定義だけでなく参照も扱います。
  • Ctagsとetagsはフラットテキストタグファイルを使用します。CscopeとGNU GLOBALはKey-Valueタグデータベースを使用します。
  • CscopeとGNU GLOBALには、grepに似た検索エンジンとタグファイルの増分更新機能があります。

組み合わせ

Extagrant Ctagsの豊富な言語サポートとGNU GLOBALのデータベース機能を組み合わせるには、ctagsをGLOBALのプラグインパーサーとして使用します。

以下を試してください:(GLOBAL-6.0、Exuberant Ctags-5.5以降がそれぞれ必要)

GNU GLOBALの構築:

$ ./configure --with-exuberant-ctags=/usr/local/bin/ctags
$ sudo make install

使用法:

$ export GTAGSCONF=/usr/local/share/gtags/gtags.conf
$ export GTAGSLABEL=ctags
$ gtags                     # invokes Exuberant Ctags internally
$ emacs -f gtags-mode       # load gtags.el

(ただし、ctagsは参照を処理しないため、この方法では参照を処理できません。)

GNU GLOBALのクライアントとしてcscopeを使用することもできます。GLOBALパッケージには、cscopeのポートである「gtags-cscope」という名前のコマンドが含まれています。つまり、cscopeの検索エンジンの代わりにGLOBALを検索エンジンとして使用することを除いて、それはcscope自体です。

$ gtags-cscope          # this is GLOBAL version of cscope

組み合わせにより、41言語のcscopeを使用できます。

幸運を!


1
DebianおよびUbuntuなどの派生物のユーザーの場合:GNU GLOBAL Webページは、これらのLinuxディストリビューションに同梱されている.debパッケージに日付が付いているため、使用しないように警告します。私の場合、GLOBALはバージョン5.7.1で、Emacs 24でgtags.el、ggtags.el、helm-gtags.elを適切に動作させることができませんでした。GNUGLOBAL 6.5をゼロからコンパイルし、Exuberant Ctagsをサポートしています(私は5.8を使用しました)御馳走を働いた。(優れたポインタをありがとう、@ shigio)。
Rob

9

TAGSファイルには定義が含まれています

TAGSファイルには、関数やクラスが定義されている場所のリストが含まれています。これは通常、プロジェクトのルートに配置され、次のようになります。

^L
configure,3945
as_fn_success () { as_fn_return 0; }^?as_fn_success^A180,5465
as_fn_failure () { as_fn_return 1; }^?as_fn_failure^A181,5502
as_fn_ret_success () { return 0; }^?as_fn_ret_success^A182,5539
as_fn_ret_failure () { return 1; }^?as_fn_ret_failure^A183,5574

これにより、Emacsは定義を見つけることができます。基本的なナビゲーションはに組み込まれてfind-tagetags-selectますが、複数の一致がある場合により優れたUIを提供します。

コード補完にはTAGSファイルを使用することもできます。たとえば、会社のetagsバックエンドはTAGSファイルを使用します

TAGSファイルはさまざまなツールで構築できます

ctags(以前は 'universal ctags'または 'exuberant ctags'と呼ばれていました)はTAGSファイルを生成でき、幅広い言語をサポートしています。githubで積極的にメンテナンスされています。

Emacsにはetags、およびと呼ばれるTAGSファイルを生成する2つのプログラムが付属していますctags。Emacs ctagsetags、ユニバーサルctagsと同じCLIインターフェイスを備えています。混乱を避けるために、多くのディストリビューションはこれらのプログラムの名前を変更しています(ctags.emacs24Debianなど)。

などTAGSファイルを生成するための言語固有のツールもありますjsctagsとはhasktags

その他のファイル形式

ebrowseEmacsに同梱されているCプログラムです。C / C ++コードのインデックスを作成し、BROWSEファイルを生成します。ebrowse.elは、通常の検索定義と補完を提供します。BROWSEEmacsでファイルを直接開いて、コードベースで定義されたクラス/関数の概要を取得することもできます。

GNU GlobalにGTAGSGRTAGSGPATHファイルで構成される独自のデータベース形式があります。これらのファイルは、gtagsC / C ++コードを解析するコマンドで生成できます。他の言語では、GNU Globalはユニバーサルctagsによって生成されたファイルを読み取ることができます。

GNU Globalは、「このシンボルはどこに言及されているのですか?」のような、より洗練された質問をするためのCLIインターフェースも提供します。Emacsパッケージgtags.elが梱されていますが、ggtags.elもGNUグローバルデータベースへのアクセスに人気があります。

Cscopeは、精神的にはGNU Globalに似ています。C/ C ++を独自のデータベース形式に解析します。また、「この関数のすべての呼び出し元/呼び出し先を見つける」などの質問にも答えることができます。

グローバルとcscopeを比較するこのHNディスカッションも参照してください。

クライアント/サーバープロジェクト

rtagsパーシスタントサーバーを使用してC / C ++を解析およびインデックス付けします。Clangパーサーを使用するため、C ++を非常にうまく処理します。サーバーを照会するためのEmacsパッケージが同梱されています。

google-gtagsは、大きなTAGSファイルがサーバーに保存されるプロジェクトでした。サーバーを照会すると、検索に関連するTAGSファイルのサブセットが提供されます。

セマンティック(CEDET)

セマンティックは組み込みのEmacsパッケージであり、C / C ++のパーサーが含まれているため、定義を見つけることもできます。また、TAGSファイル、csopeデータベース、その他のソースからデータをインポートすることもできます。CEDETには、このデータを使用するIDEスタイルの機能(クラス階層のUML図の生成など)も含まれています。


7

【回答はshigioさんから更新】

質問のパート1にいくつかの説明を追加してみます。

それは何ですか?

  1. EtagsTAGSは、Emacsのタグファイル形式であるファイルを生成します。etags.elEmacsの一部であるEtagsファイルを使用できます。
  2. CtagstagsViのネイティブタグファイル形式である、ファイルを生成できるものの総称です。Universal Ctags(別名UCtags、以前はExuberant Ctags)も、-eオプションでEtagsを生成できます。
  3. cscopeのは、(独自のタグデータベースと、C(C ++およびJavaのためのより少ないサポート)するためのオールインワンソースコードブラウジングツールでありcscope.in.outcscope.outcscope.po.out)とTUI。CscopeのサポートはVimに組み込まれています。xcscope.elパッケージを使用して、EmacsからCscopeを使用できますCscopeベースのGUIもあります。
  4. GNU GLOBAL(別名Gtags)は、タグファイルも生成するという点で、さらに別のソースコードタギングシステムです(大きな違いがあります-次のセクションを参照)。

比較

  • CtagsとEtagsは、定義(変数や関数など)のみを扱います。CscopeとGtagsも参照を扱います。
  • CtagsおよびEtagsタグファイルはフラットです。CscopeおよびGtagsタグファイルは、(たとえば)増分更新を可能にする、より強力なKey-Valueデータベースです。
  • CscopeとGtagsには-にgrep似た検索エンジンがあります。
  • Ctagsには、より多くの言語とデータ形式のサポートが組み込まれています。ユニバーサルCtagsパーサーの現在のリポジトリリストを参照してください。UCtagsは、独自のパーサーを開発する方法文書化しています
  • CscopeとGtagsはエディターに依存しません。
  • Gtagsは独自のユーザーインターフェイスを提供していませんが、現在(2016年10月)、コマンドライン(CLI)、Emacsと親戚、Viと親戚、less(ページャー)、Doxygen、および任意のWebブラウザーから使用できます。
  • Gtagsはgtags.elGLOBALパッケージを介して提供しますが、xgtags.el、ggtags.el、anything-gtags.el、helm-gtags.elなど、他の多くのelisp拡張機能もあります。

組み合わせ

CtagsをGLOBALプラグインパーサーとして使用することにより、Universal Ctagsの豊富な言語サポートとGtagsのデータベース機能および多数の拡張機能を組み合わせることができます。

# build GNU GLOBAL
./configure --with-exuberant-ctags=/usr/local/bin/ctags
sudo make install

# use it
export GTAGSCONF=/usr/local/share/gtags/gtags.conf
export GTAGSLABEL=ctags
gtags                     # invokes Universal Ctags internally
emacs -f gtags-mode       # load gtags.el

GtagsのパーサーとしてCtagsを使用すると、Gtagsが提供する参照(変数の使用法、関数呼び出しなど)を処理できなくなることに注意してください。基本的に、GtagsのリファレンストラッキングとCtagsの組み込み言語サポートとをトレードオフします。

CscopeをGtagsのクライアントとして使用することもできますgtags-cscope

幸運を!


「CtagsをGtagsのパーサーとして使用すると、Gtagsが提供する参照(変数の使用法、関数呼び出しなど)を処理できなくなることに注意してください。基本的に、Gtagsの参照追跡は、 Ctagsの組み込み言語サポートの強化。」Emacsに同梱されている古いctagsについても同じですか、それともUniversal Ctagsについても同じですか?また、「Universal Ctagのリッチ言語を組み合わせる」を読みましたが、--with-exuberant-ctags=...2019年現在、--with-universal-ctagsオプションがあるシェルスニペットで使用されています。後者に変更する必要がありますか?
bgoodr

3

実際には確認していませんが、CEDETのマニュアル(http://www.randomsample.de/cedetdocs/common/cedet/CScope.html)によると、

セマンティックはCScopeをデータベース検索のバックエンドとして使用できます。これを有効にするには、以下を使用します。

 (semanticdb-enable-cscope-databases)

これにより、すべてのCおよびC ++バッファーでcscopeを使用できるようになります。

CScopeは、既存のセマンティックデータベース検索ですべてのファイルが解析されなかった場合のバックアップとして、プロジェクト全体の検索に使用されます。


1
これは、Emacs 24.3.1では機能しないようです。同梱されているバニラCEDET 2.0を使用します(semanticdb-enable-cscope-databasesメソッドなし)。
Rob
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.