我使用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()。有没有办法使之自动化?

此行为在emacs和vim之间是一致的。

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

编辑:

如果问题尚不清楚,我在问是否有一个插件可以检查该方法(例如,是否是通过Initialize().访问的成员函数),并且是否可以找到对象的类型然后寻找->而不是方法。

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


检查标签是否为方法。
如果它是方法,则它是类的成员。
如果某个类的成员在当前光标之前解析代码并查找声明(ClassA classA)。
如果以上所有条件均正确,则查找Object::Method而不是ClassA::Initialize()


这更清楚吗?

最佳答案

Ctags仅索引您的代码。当您的编辑器完成搜索时,仅使用它生成tags文件。搜索的方式是您编辑的工作,而ctags与它无关。

在方法名称上执行<C-]>时,Vim跳至其找到的第一个匹配项。由于它无法分析您的代码和想法,因此无法确定您真正想要的匹配项。

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

解决此限制的通常方法是使用列出所有匹配项的命令,例如g]g<C-]>

关于c++ - ctags c++查找函数的第一个实例,而与类无关,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15466346/

10-11 15:20