111

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

  1. etagsebrowseexuberant ctagscscopeGNU Globalの違い (機能など) は GTags何ですか? Emacsでそれらを使用するにはどうすればよいですか?

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

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

4

5 に答える 5

73

それは私が最近ここで読んだのと同じくらい良い質問なので、違いをより詳細に説明しようとします:

ポイント 1:

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

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

要約すると:

ctags1 つは、シンボルの宣言/定義に移動できるようにします (一方向ルックアップと呼ばれるものもあります)。ctags多くの言語で役立つ汎用ツールです。

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

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

私が C/C++ プロジェクトを扱うとき、私は .NET を多用しcscopectags. 他の言語を扱う場合、状況は明らかに逆になります。

ポイント2。

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

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

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

ポイント3。

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

うまくいけば、私の説明が理にかなっていて、あなたに役立つでしょう.

PS私は と に精通してglobalebrowseませんが、記憶が私に役立つ場合、彼らはetagsを利用しました。

于 2012-10-16T21:50:46.823 に答える
46

1にいくつか説明を加えてみます。

それは何ですか?

  • Etags は、Emacs 用のタグファイルである 'TAGS' ファイルを生成するコマンドです。このファイルは、emacs パッケージの一部である etags.el で使用できます。
  • Ctags は vi のタグファイルである「tags」ファイルを生成するコマンドです。Exuberant Ctags の後継である Universal 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 など)。

比較

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

組み合わせ

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

以下を試してください: (それぞれ GLOBAL-6.5.3+ および Universal Ctags が必要です)

GNU GLOBAL のビルド:

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

使用法:

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

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

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

$ gtags-cscope          # this is GLOBAL version of cscope

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

幸運を!

于 2013-03-02T01:18:17.063 に答える
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(以前は「ユニバーサル ctags」または「exuberant ctags」と呼ばれていました) は、TAGS ファイルを生成でき、幅広い言語をサポートします。github で積極的にメンテナンスされています。

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

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

その他のファイル形式

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

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

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

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

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

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

rtagsは、永続的なサーバーを使用して C/C++ を解析およびインデックス付けします。これは clang パーサーを使用するため、C++ を非常にうまく処理します。サーバーにクエリを実行するための Emacs パッケージが同梱されています。

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

セマンティック (CEDET)

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

于 2016-03-05T14:36:25.833 に答える
3

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

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

 (semanticdb-enable-cscope-databases)

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

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

于 2013-02-24T20:42:36.027 に答える