1. ホーム
  2. emacs

[解決済み] Emacsのためのタグ。etags, ebrowse, cscope, GNU Global と exuberant ctags の関係

2022-11-04 05:15:25

質問

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

  1. との違い (例えば機能面) は何ですか? etags , ebrowse , exuberant ctags , cscope , GNU Global そして GTags ? で使用するにはどうすればよいのでしょうか? Emacs ?

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

  3. これらの異なるタグユーティリティの上に、semantic は何をもたらすのでしょうか?これらのツールとのインターフェイスはどうなっているのでしょうか?

どのように解決するのですか?

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

ポイント1:

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

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

要約すると

ctags は、シンボルの宣言や定義に移動することができます(一部では 一方向ルックアップ ). ctags は多くの言語で有用な汎用ツールです。

一方、(プロジェクトのページで紹介されているように) cscope を使えば

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

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

ポイント2。

インテリジェントなオートコンプリートを行うには、真の ソースコードパーサ (そうでなければ、アプリケーション内のオブジェクト (たとえば) の型や、オブジェクトに対して呼び出すことのできるメソッドを知ることができないからです。多くの異なるソースに基づいて自動補完を行うことができますが、最良の結果を得るためには、最終的にパーサーが必要になります。シンタックスハイライトも同様で、現在Emacsのメジャーモードでのシンタックスハイライトは単に正規表現に基づいており、非常に壊れやすく、エラーが発生しやすいものです。Emacs 23.2 のセマンティック (それ以前は外部パッケージでした) の搭載により、より多くの用途 (バッファのソース コードを解析して適切にハイライトするために使用するなど) を見始められるとよいのですが......。

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

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

ポイント3

semanticは(現在サポートしているいくつかの言語に対して)真のコード認識をもたらし、IDEとEmacsの間のギャップを埋めることができます。のようなツールとのインターフェイスはありません。 etagscscope を併用できないわけではありません。

私の説明が意味を持ち、あなたにとって有用であることを願っています。

追伸:私はあまり詳しくないのですが globalebrowse などがありますが、記憶が確かならetagを使用していたはずです。