我使用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/