C++ ctags c++;查找函数的第一个实例,而不考虑类

C++ ctags c++;查找函数的第一个实例,而不考虑类,c++,c,linux,vim,emacs,C++,C,Linux,Vim,Emacs,我使用CTAG(-e),它工作得非常好。但是,当我搜索成员函数时,ctags返回它找到的第一个定义。例如: ClassA classA; classA.Initialize(); classA.DoSomething(); ClassB classB; classB.Initialize(); classB.PerformAction(); 如果我在classA.Initialize()上搜索标记Initialize()(M-.或g^]),我希望转到classA::Initialize()。

我使用CTAG(-e),它工作得非常好。但是,当我搜索成员函数时,ctags返回它找到的第一个定义。例如:

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

ClassB classB;
classB.Initialize();
classB.PerformAction();
如果我在
classA.Initialize()
上搜索标记
Initialize()
M-.
g^]
),我希望转到
classA::Initialize()
。如果碰巧有另一个类使用相同的方法,并且它的标记出现在标记文件中
classA
的标记之前,那么(假设这是
ClassB::Initialize()
),我会被带到
ClassB::Initialize()

但是,如果当我键入
M-。
并将我要访问的标记添加到
ClassA::Initialize()
时,我会转到
ClassA::Initialize()
。有没有办法让它自动化

这种行为在emacs和vim中是一致的

此外,使用GNU global(gtags)甚至找不到
ClassA::Initialize()
。它将只打印出具有
Initialize()
方法的所有类

编辑:

如果问题还不清楚,我会问是否有一个插件可以检查方法(例如,它是通过
->
访问的成员函数),如果是,它会找到对象的类型,然后查找
对象::方法
,而不是方法

这是一个简单的功能。例如:

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

ClassB classB;
classB.Initialize();
classB.PerformAction();
  • 检查标记是否是方法
  • 如果它是一个方法,那么它就是一个类的成员
  • 如果类的成员在当前游标之前解析代码并查找声明(ClassA ClassA)
  • 如果以上所有内容均为真,则查找
    ClassA::Initialize()
    ,而不是
    Initialize()

  • 这更清楚了吗?

    Ctags只为代码编制索引。当编辑器完成搜索时,您只能使用它生成一个
    标记
    文件。如何进行搜索是编辑的事,ctags与此无关

    当您对方法名执行
    操作时,Vim跳转到它找到的第一个匹配项。因为它无法分析您的代码和想法,所以它无法决定您真正想要的匹配项

    它最接近于“优先级”的概念,请参见
    :h tag priority
    ,但它并不能真正帮助您


    处理该限制的通常方法是使用一个列出所有匹配项的命令,如
    g]
    g

    是的,CTAG和gtags都无法消除ClassA::Initialize()和ClassB::Initialize()之间的歧义,这意味着您必须为它们提供更多信息(例如,通过在列表中选择gtags输出)。您能更清楚地说明您的问题是什么吗?可能重复或使用
    :tn
    ,直到找到您想要的。事实上,这是以破坏标记堆栈为代价的。