web-dev-qa-db-ja.com

よりよく機能するctagsの代替はありますか?

私はvim用のタグリストプラグインを発見し、 ctagsでそれを使用する方法 について読みました。

しかし、残念なことにctagsは非常に単純なパーサーです。

より完全な代替案はありますか?

具体的には、次のようなものを探しています。

  • 関数宣言のために#define(x, y) x ## yスタイルのマクロを展開します

  • プロセス#includeステートメント

  • 依存関係にインクルードパスを指定できます

Clangがc ASTにアクセスするためのプログラムAPIを提供しているようですが、これは確かにそれほど難しくありませんか?

誰かがすでにそれをしましたか?

-

編集:

これらのものはそれを切りません:

  • clang_indexer-コンパイルしません。動作する場合(ハッキング後)、動作しない場合(無限エラー)。

  • clang_complete-ctagsよりも優れているようです。コンテキスト固有の推奨事項、構造体の完了、関数の引数、マクロの展開はありません。シンボルとそれらが由来するファイルのリストだけです。

38
Doug

私自身、これに苦労してかなりの時間を費やしてきました。

私が今までで最も近いものは gccsense と呼ばれるものでした。残念ながら、プロジェクトは放棄されたようであり、さらに英語は著者の第一言語ではなかったため、プロジェクトを設定することは困難でした。

私は別の角度から問題に取り組むことになりました。 intellisense/autocompleteは、vimで利用可能なすべての機能を持つよりもコーディングにとって重要であると決定したので、IDE Eclipseのように選択し、VimをエミュレートするEclipse用のプラグインを見つけました。これまでのところ、私が見つけたプラグインの種類は Viable でした。

以下は、私が試してみて満足できないオプションの完全なリストです。

  • clang-gccから別の「より良い」コンパイラーに切り替える必要があります。問題はgccがはるかに成熟していることです(editコンパイラを切り替える必要はないようです。以下のコメントを参照してください。将来、もう一度試す可能性があります。 。]
  • gccsense-素晴らしいアイデア(コード補完を提供するためにgccを使用)ただし、プロジェクトでの作業は中止されました:(そして、アップしているバージョンはベータ品質です
  • xref in vim-xrefは優れたスタンドアロンツールであり、Cの解析に最適です。 vxref を使用してvimで動作させることができますが、私の経験から、xrefは解析に欠けています現在のC++コードとその開発は停止しています(vxrefでの開発も同様です)。
  • eclim-Javaのサポートで非常に機能し、C++またはCコードの解析時に非常に遅く、完全に信頼できない。通常、すべてが長時間機能するが、突然パーサーが動作する作成した新しいコードの解析を停止し、Eclipse自体をロードしてEclipseにプロジェクトの再解析を強制することに他ならないと思われます。また、重要な事実は少なくなりますが、eclimがエラーの処理を引き継いでいるため、これは、vimがgccからのエラーを通常解析する方法を台無しにします。つまり、面倒なquickfixリストにアクセスできません。
  • netbeans + jvi-これで多くの人が誓いますが、私はjviにあらゆる種類の問題を抱えていました。私が抱えていた主な問題の1つは、jviが通常モードであると言うでしょうが、実際には挿入モードでした。再起動以外に役立つことはありません。
  • Eclipse + viplugin/vrapper-これは最良のオプションのように見え始めていました。それぞれに独自のバグのセットがあり、機能が不足していますが、最も安定していて機能が最も多いと思われる実行可能なものが見つかるまで、依然として最も魅力的でした。

あなたが満足する解決策を見つけたら、コメントで共有してください。私はそれに興味があります。

24
ldog

私はまだこれを試していませんが、 _clang_indexer_ は探しているものに非常に近いようです( sources )。それはまだ外部データベースを使用します(つまり、オンザフライでインデックスを作成しません)が、通常はcscopeでのみ見つかる機能を提供しているようです(これはC++をあまりサポートしていません)。

オートコンプリートには clang_complete を使用します。インデックスを生成する必要はなく、ほとんどの場合、非常にうまく機能します。また、vimで自動構文チェックを実行できるので、起こりうる問題について警告されます。あなたが与えたマクロの例はオートコンプリートしません

_#define blah(x) blah__ ## x
void blah_<TAB>
_

_bla__x_として(ただし、blah(x)としてのみ)。これをより構成可能にするのはいいことですが、これも壊れているとは思わないでしょう。

7

CScout バージョン2.8には、処理するCソースコード用のvim互換タグファイルを作成するコマンドラインオプション(-C)が用意されています。 CScoutは、Cプログラムのコレクション用のソースコードアナライザーおよびリファクタリングブラウザーです。複数のプロジェクトのワークスペースを処理して、Cプリプロセッサによって導入された複雑さを元のCソースコードファイルにマッピングして戻すことができます。したがって、生成されたタグファイルには、関数、変数、構造体など、プリプロセッサマクロを介して作成されたエンティティの正しい情報が含まれています。 CScoutは、コードのプロジェクト構成ファイル(Makefileに相当)で指定されたインクルードファイルパスを使用して、インクルードファイルを処理します。試してみるには、セットアップに一致するパッケージをダウンロードし、awkソースコードを含むサンプルディレクトリに移動して実行します。

../bin/cscout -Cc awk.cs

CScoutこのページ で処理できるいくつかのタイプのプリプロセッサ構成を見ることができます。たとえば、次のコードを処理する場合

#define typefun(name, type, op) \
type type ## _ ## name(type a, type b) { return a op b; }

typefun(add, int, +)
typefun(sub, int, -)
typefun(mul, int, *)
typefun(div, int, /)
typefun(add, double, +)
typefun(sub, double, -)
typefun(mul, double, *)
typefun(div, double, /)

main()
{
        printf("%d\n", int_add(5, 4));
        printf("%g\n", double_mul(3.14, 2.0));
}

CScoutは、次のエントリを含むタグファイルを生成します。

double_add  test.c  8       ;"  f
double_div  test.c  11      ;"  f
double_mul  test.c  10      ;"  f
double_sub  test.c  9       ;"  f
int_add test.c  4       ;"  f
int_div test.c  7       ;"  f
int_mul test.c  6       ;"  f
int_sub test.c  5       ;"  f
main    test.c  13      ;"  f
typefun test.c  1       ;"  d

タグCScoutが作成するのを確認するために、サンプルソースコードにいくつかのコード生成マクロを追加して、自分で試してみることができます。

4

global 」システムを使用しています。インストール後、コードを検索するための 'global'コマンドと、索引付けのための 'gtags'があります。

私はLinuxカーネルを使用していますが、それは非常に役立ちます。よりインテリジェントな定義で動作します(ただし、望みどおりには機能しません)。関数のプロトタイプ、関数の実装、およびコードからの関数へのすべての参照について知っています。

「グローバル」とVIMを統合することも可能です。 そのためのプラグイン があります。

幸運を。

1つの可能性は Eclim を使用することです。これは、さまざまな方法で使用できる強力なツールです。あなたの場合、ヘッドレスのEclipseサーバーを起動し、基本的にEclipseのインデクサーなどを使用する必要があります。ただし、プロジェクトをEclipseプロジェクトとして登録する必要があると思います。

1
UncleZeiv