0

私はctags(-e)を使用していますが、非常にうまく機能します。ただし、メンバー関数を検索すると、ctagsは最初に見つかった定義を返します。例えば:

ClassA classA;
classA.Initialize();
classA.DoSomething();

ClassB classB;
classB.Initialize();
classB.PerformAction();

Initialize()でタグ(M-.またはg^])を検索すると、classA.Initialize()に移動する予定ClassA::Initialize()です。同じメソッドを持つ別のクラスがあり、そのタグがclassAタグファイルののタグの前に表示されている場合(たとえば、ClassB::Initialize())、に乗車しClassB::Initialize()ます。

ただし、入力M-.してアクセスしたいタグを修正するとClassA::Initialize()、に移動しClassA::Initialize()ます。これを自動化する方法はありますか?

この動作はemacsとvimで一貫しています。

さらに、GNUグローバル(gtags)では。も見つかりませんClassA::Initialize()Initialize()メソッドを持つすべてのクラスを出力するだけです。

編集:

質問がまだ明確でない場合は、メソッドを調べるプラグインがあるかどうかを尋ねています(たとえば、.またはを介してアクセスされるメンバー関数ですか->)、ある場合は、オブジェクトのタイプを見つけて、Object::Method代わりに検索しますメソッドの場合。

これは単純な機能です。例えば:

  1. タグがメソッドかどうかを確認してください。
  2. それがメソッドである場合、それはクラスのメンバーです。
  3. クラスのメンバーが現在のカーソルの前にコードを解析し、宣言を見つけた場合(ClassAclassA)。
  4. ClassA::Initialize()の代わりに、上記のすべてが当てはまるかどうかを探しInitialize()ます。

それはもっと明確ですか?

4

1 に答える 1

1

Ctagsはコードのインデックスのみを作成します。これを使用してファイルを生成するのtagsは、エディターが検索を実行している間だけです。検索の方法は編集者の仕事であり、ctagsはそれとは何の関係もありません。

メソッド名を変更する<C-]>と、Vimは最初に見つかった一致にジャンプします。コードや考えを分析する手段がないため、実際にどの一致が必要かを判断することはできません。

最も近いのは「優先順位」の概念です。を参照してください:h tag-priority。ただし、実際には役に立ちません。

そして、その制限に対処する通常の方法は、g]またはのようなすべての一致をリストするコマンドを使用することg<C-]>です。

于 2013-03-17T22:55:38.877 に答える