web-dev-qa-db-ja.com

Emacsのタグ:etags、ebrowse、cscope間の関係GNUグローバルおよび熱狂的なctags

私はC++プロジェクトに取り組んでおり、Alex Ottの CEDETのガイド およびStackOverflowのタグに関する他のスレッドを試しましたが、Emacsがこれらの異なるタグシステムとどのようにインターフェースしてオートコンプリートを促進するかについてまだ混乱しています定義のアップ、ソースコードベースのナビゲーション、またはドキュメント文字列のプレビュー。

  1. etagsebrowseexuberant ctagscscopeGNU Global および GTagsEmacsでそれらを使用するには何をする必要がありますか?

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

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

97

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

ポイント1:

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

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

まとめると:

ctags oneを使用すると、シンボルの宣言/定義(一方向検索と呼ばれるもの)に移動できます。 ctagsは、多くの言語に役立つ汎用ツールです。

一方(プロジェクトのページで述べたように)cscopeを使用すると、次のことができます。

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

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

ポイント2。

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

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

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

ポイント3。

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

うまくいけば、私の説明が理にかなっていて、あなたにとって役立つことを願っています。

追伸私はglobalebrowseにあまり精通していませんが、メモリが私に役立つなら、彼らはetagsを利用しました。

67
Bozhidar Batsov

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)があります。 cscopeパッケージの一部であるxcscope.elを使用して、Emacsからcscopeを使用できます。
  • GNU GLOBALは、ソースコードのタグ付けシステムです。上記のツールに似ていますが、エディタに依存している点で異なり、コマンドライン以外のユーザーインターフェイスはありません。 Gtagsは、GLOBAL用のタグファイル(GTAGS、GRTAGS、GPATH)を生成するコマンドです。 GLOBALパッケージの一部であるgtags.elを使用して、emacsからGLOBALを使用できます。これに加えて、多くのelispライブラリがあります(xgtags.el、ggtags.el、anything-gtags.el、helm-gtags.elなど)。

比較

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

組み合わせ

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

以下を試してください:(それぞれ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は参照を処理しないため、このメソッドでは参照を処理できません。)

CscopeをGNU GLOBAL。のクライアントとして使用することもできます。GLOBALパッケージには、cscopeのポートである 'gtags-cscope'というコマンドが含まれます。 cscopeの検索エンジンではなく、検索エンジンとしてのGLOBAL。

$ gtags-cscope          # this is GLOBAL version of cscope

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

がんばろう!

40
shigio

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-tag、ただし etags-select は、複数の一致がある場合により良いUIを提供します。

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

TAGSファイルはさまざまなツールで作成できます

ctags (以前は「universal ctags」または「exuberant ctags」として知られていました)は、TAGSファイルを生成でき、幅広い言語をサポートしています。 githubで積極的に管理されています。

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

jsctagshasktags など、TAGSファイルを生成するための言語固有のツールもあります。

その他のファイル形式

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

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

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)

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

8
Wilfred Hughes

[ shigio 'sから更新された回答]

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

それは何ですか?

  1. Etags は、 Emacsのタグファイル形式 であるTAGSファイルを生成します。 Emacsの一部であるetags.elでEtagsファイルを使用できます。
  2. Ctagsは、Viのネイティブタグファイル形式であるtagsファイルを生成できるものの総称です。 niversal Ctags (別名UCtags、以前のExuberant Ctags)は、-eオプションを使用してEtagsを生成することもできます。
  3. Cscope は、独自のタグデータベース(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タグファイルは flat です。 CscopeおよびGtagsのタグファイルは、より強力な key-valueデータベース です。これにより、(たとえば)増分更新が可能になります。
  • CscopeとGtagsには、grepのような検索エンジンがあります。
  • Ctagsには、より多くの言語とデータ形式の組み込みサポートがあります。現在のリポジトリ niversal Ctagsパーサーのリスト を参照してください。 UCtagsには 独自のパーサーの開発方法が文書化されています もあります。
  • CscopeとGtagsはエディターに依存しません。
  • Gtagsは独自のユーザーインターフェイスを提供していませんが、現在(2016年10月)コマンドライン(CLI)、Emacsと親族、Viと親族、less(ページャー)、 Doxygen から使用できます、および任意のWebブラウザー。
  • GtagsはGLOBALパッケージ経由でgtags.elを提供しますが、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

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

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

がんばろう!

5
TomRoche

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

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

 (semanticdb-enable-cscope-databases)

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

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

3
Clément B.