我遇到的问题是,vim / gvim中的ctags使我多次进行前向声明,而不是对函数的实际定义。
解决这个问题的任何方法吗?
我认为最简单的方法是使用“ g ctrl-]”而不是“ ctrl-]”。如果只有一场比赛,它将带您前往那里。如果有多个匹配项,它将列出所有匹配项,让您选择所需的匹配项,就像:tselect一样。两全其美的。 :)
2
您应该可以使用tn
和tp
跳转到各种匹配的标签。
^]
带您去第一场比赛。:tn
转到下一个。:tn
的次数过多,则可以键入:tp
返回到前一个。我相信Vim默认会转到标签文件中的第一个标签。如果愿意,您可以选择其他选项:使用:tj
(类似于:tselect,但如果只有一个匹配项,则自动跳转)或Ctrl-]
后接:tn
)。
更改默认值的唯一方法是更改标签文件的顺序,但我不相信ctags提供了执行此操作的命令行选项。
这听起来并不那么困难,因为您基本上需要一个脚本来打开标签文件,并按标签的“种类”对其进行排序,然后再次将其写回。标记中的“种类”是一个字符,描述了它是函数(f),函数原型(p),宏,枚举名称等)。如果您使用的是Linux,则可以,就这么简单:
#!/bin/sh
ctags -R -f - . | tac > tags
由于tac
反转了文件中的行顺序,因此将自动将定义放在第一位。但是,由于头文件需要维护,Vim更喜欢对标签文件进行排序,因此它变得有些复杂,因此最好先遍历该文件,然后对第一个条目(标签名称)进行向前排序,然后再对文件进行排序逆序排序。因此,更复杂的方法可能会更好。我为这个无耻的插件表示歉意,但是我写了一个Vim插件,它(间接地)满足您的需求。它旨在为函数名称,宏,枚举等添加很多额外的突出显示组。但是,这样做的另一件事是对标记文件进行重新排序,以便函数实现在函数声明之前出现,从而实现您想要的(我和您有相同的需求)。如果您不需要任何突出显示功能,则可以很轻松地将其全部剥离:它是一个相当简单的python程序和一个甚至更简单的Vim脚本,可从my site获得。
:tselect my_little_function