私はvim用のタグリストプラグインを発見し、 ctagsでそれを使用する方法 について読みました。
しかし、残念なことにctagsは非常に単純なパーサーです。
より完全な代替案はありますか?
具体的には、次のようなものを探しています。
関数宣言のために#define(x, y) x ## y
スタイルのマクロを展開します
プロセス#include
ステートメント
依存関係にインクルードパスを指定できます
Clangがc ASTにアクセスするためのプログラムAPIを提供しているようですが、これは確かにそれほど難しくありませんか?
誰かがすでにそれをしましたか?
-
編集:
これらのものはそれを切りません:
clang_indexer-コンパイルしません。動作する場合(ハッキング後)、動作しない場合(無限エラー)。
clang_complete-ctagsよりも優れているようです。コンテキスト固有の推奨事項、構造体の完了、関数の引数、マクロの展開はありません。シンボルとそれらが由来するファイルのリストだけです。
私自身、これに苦労してかなりの時間を費やしてきました。
私が今までで最も近いものは gccsense と呼ばれるものでした。残念ながら、プロジェクトは放棄されたようであり、さらに英語は著者の第一言語ではなかったため、プロジェクトを設定することは困難でした。
私は別の角度から問題に取り組むことになりました。 intellisense/autocompleteは、vimで利用可能なすべての機能を持つよりもコーディングにとって重要であると決定したので、IDE Eclipseのように選択し、VimをエミュレートするEclipse用のプラグインを見つけました。これまでのところ、私が見つけたプラグインの種類は Viable でした。
以下は、私が試してみて満足できないオプションの完全なリストです。
あなたが満足する解決策を見つけたら、コメントで共有してください。私はそれに興味があります。
私はまだこれを試していませんが、 _clang_indexer
_ は探しているものに非常に近いようです( sources )。それはまだ外部データベースを使用します(つまり、オンザフライでインデックスを作成しません)が、通常はcscope
でのみ見つかる機能を提供しているようです(これはC++をあまりサポートしていません)。
オートコンプリートには clang_complete を使用します。インデックスを生成する必要はなく、ほとんどの場合、非常にうまく機能します。また、vimで自動構文チェックを実行できるので、起こりうる問題について警告されます。あなたが与えたマクロの例はオートコンプリートしません
_#define blah(x) blah__ ## x
void blah_<TAB>
_
_bla__x
_として(ただし、blah(x)
としてのみ)。これをより構成可能にするのはいいことですが、これも壊れているとは思わないでしょう。
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が作成するのを確認するために、サンプルソースコードにいくつかのコード生成マクロを追加して、自分で試してみることができます。
「 global 」システムを使用しています。インストール後、コードを検索するための 'global'コマンドと、索引付けのための 'gtags'があります。
私はLinuxカーネルを使用していますが、それは非常に役立ちます。よりインテリジェントな定義で動作します(ただし、望みどおりには機能しません)。関数のプロトタイプ、関数の実装、およびコードからの関数へのすべての参照について知っています。
「グローバル」とVIMを統合することも可能です。 そのためのプラグイン があります。
幸運を。
1つの可能性は Eclim を使用することです。これは、さまざまな方法で使用できる強力なツールです。あなたの場合、ヘッドレスのEclipseサーバーを起動し、基本的にEclipseのインデクサーなどを使用する必要があります。ただし、プロジェクトをEclipseプロジェクトとして登録する必要があると思います。