私はC++プロジェクトに取り組んでおり、Alex Ottの CEDETのガイド およびStackOverflowのタグに関する他のスレッドを試しましたが、Emacsがこれらの異なるタグシステムとどのようにインターフェースしてオートコンプリートを促進するかについてまだ混乱しています定義のアップ、ソースコードベースのナビゲーション、またはドキュメント文字列のプレビュー。
etags
、ebrowse
、 exuberant ctags
、 cscope
、 GNU Global
および GTags
? Emacsでそれらを使用するには何をする必要がありますか?
タグを使用してシンボルをナビゲート/オートコンプリートする場合、セマンティック/セネター(CEDET)が必要ですか?
これらの異なるタグユーティリティの上にあるセマンティックは、テーブルに何をもたらしますか?これらのツールとどのように連携しますか?
これは最近ここで読んだのと同じくらい良い質問なので、違いをもっと詳しく説明してみましょう。
ポイント1:
etags
とctags
はどちらも、ソースファイルにある言語オブジェクトのインデックス(別名タグ/タグ)ファイルを生成します。これにより、テキストエディターまたは他のユーティリティでこれらのアイテムをすばやく簡単に見つけることができます。タグは、インデックスエントリが使用可能な言語オブジェクト(または、そのオブジェクト用に作成されたインデックスエントリ)を示します。 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の間のギャップを埋めます。 etags
やcscope
などのツールとは実際にはインターフェースしませんが、それらを一緒に使用できないわけではありません。
うまくいけば、私の説明が理にかなっていて、あなたにとって役立つことを願っています。
追伸私はglobal
とebrowse
にあまり精通していませんが、メモリが私に役立つなら、彼らはetagsを利用しました。
1に説明を追加してみます。
それは何ですか?
比較
組み合わせ
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を使用できます。
がんばろう!
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ファイルを使用します 。
ctags
(以前は「universal ctags」または「exuberant ctags」として知られていました)は、TAGSファイルを生成でき、幅広い言語をサポートしています。 githubで積極的に管理されています。
Emacsには、etags
およびctags
と呼ばれるTAGSファイルを生成する2つのプログラムが付属しています。 Emacsのctags
は、ユニバーサルctagsと同じCLIインターフェースを備えた単なるetags
です。混乱を避けるために、多くのディストリビューションはこれらのプログラムの名前を変更します(例:ctags.emacs24
Debianで)。
jsctags
や hasktags
など、TAGSファイルを生成するための言語固有のツールもあります。
ebrowse
はEmacsに同梱されているCプログラムです。 C/C++コードのインデックスを作成し、BROWSE
ファイルを生成します。 ebrowse.elは、通常の検索定義と補完を提供します。 BROWSE
ファイルをEmacsで直接開いて、コードベースで定義されたクラス/関数の概要を取得することもできます。
GNU Global には、GTAGS
、GRTAGS
、および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ファイルのサブセットが提供されます。
Semanticは、C/C++のパーサーを含む組み込みのEmacsパッケージであるため、定義も見つけることができます。 TAGSファイル、csopeデータベース、その他のソースからデータをインポートすることもできます。 CEDETには、このデータを使用するIDEスタイル機能、たとえばクラス階層のUML図の生成も含まれます。
[ shigio 'sから更新された回答]
質問のパート1に説明を追加してみます。
それは何ですか?
TAGS
ファイルを生成します。 Emacsの一部であるetags.el
でEtagsファイルを使用できます。Ctags
は、Viのネイティブタグファイル形式であるtags
ファイルを生成できるものの総称です。 niversal Ctags (別名UCtags
、以前のExuberant Ctags)は、-e
オプションを使用してEtagsを生成することもできます。cscope.in.out
、cscope.out
、cscope.po.out
)および [〜 #〜] tui [〜#〜] 。 CscopeサポートはVimに組み込まれています。 xcscope.elパッケージ を使用して、EmacsからCscopeを使用できます。 CscopeベースのGUI もあります。Gtags
)は、タグファイルも生成するという点で、別のソースコードタグ付けシステムです(重要な違いがあります。次のセクションを参照)。比較
grep
のような検索エンジンがあります。less
(ページャー)、 Doxygen から使用できます、および任意のWebブラウザー。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
。
がんばろう!
私は実際にはチェックしていませんが、CEDETマニュアルによると( http://www.randomsample.de/cedetdocs/common/cedet/CScope.html ):
セマンティックは、データベース検索のバックエンドとしてCScopeを使用できます。有効にするには、次を使用します。
(semanticdb-enable-cscope-databases)
これにより、すべてのCおよびC++バッファーでcscopeを使用できるようになります。
CScopeは、既存のセマンティックデータベース検索ですべてのファイルが解析されなかった場合のバックアップとして、プロジェクト全体の検索に使用されます。