0

我使用 ctags (-e) 并且效果很好。但是,当我搜索成员函数时,ctags 返回它找到的第一个定义。例如:

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

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

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

但是,如果当我键入M-.并修改要访问的标签时,ClassA::Initialize()我会转到ClassA::Initialize(). 有没有办法让它自动化?

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

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

编辑:

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

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

  1. 检查标签是否是一种方法。
  2. 如果它是一个方法,它是一个类的成员。
  3. 如果类的成员在当前光标之前解析代码并找到声明(ClassA classA)。
  4. 查找ClassA::Initialize()以上所有内容是否为真,而不是Initialize().

那是不是更清楚了?

4

1 回答 1

1

Ctags 仅索引您的代码。您仅在编辑器完成搜索时使用它来生成tags文件。它如何进行搜索是您的编辑的事情,而 ctags 与它无关。

当你<C-]>对方法名进行处理时,Vim 会跳转到它找到的第一个匹配项。因为它没有办法分析你的代码和你的想法,所以它无法决定你真正想要什么匹配。

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

处理该限制的常用方法是使用列出所有匹配项的命令,例如g]or g<C-]>

于 2013-03-17T22:55:38.877 回答