在vim中获取ctags进入定义,而不是声明

问题描述 投票:48回答:10

我遇到的问题是,vim / gvim中的ctags使我多次进行前向声明,而不是对函数的实际定义。

解决这个问题的任何方法吗?

vim ctags
10个回答
75
投票

我认为最简单的方法是使用“ g ctrl-]”而不是“ ctrl-]”。如果只有一场比赛,它将带您前往那里。如果有多个匹配项,它将列出所有匹配项,让您选择所需的匹配项,就像:tselect一样。两全其美的。 :)


-1
投票
您可以按

2


8
投票

您应该可以使用tntp跳转到各种匹配的标签。

  • ^]带您去第一场比赛。
  • 如果不是您想要的匹配项,请键入:tn转到下一个。
  • 如果键入:tn的次数过多,则可以键入:tp返回到前一个。

8
投票

我相信Vim默认会转到标签文件中的第一个标签。如果愿意,您可以选择其他选项:使用:tj(类似于:tselect,但如果只有一个匹配项,则自动跳转)或Ctrl-]后接:tn)。

更改默认值的唯一方法是更改​​标签文件的顺序,但我不相信ctags提供了执行此操作的命令行选项。

这听起来并不那么困难,因为您基本上需要一个脚本来打开标签文件,并按标签的“种类”对其进行排序,然后再次将其写回。标记中的“种类”是一个字符,描述了它是函数(f),函数原型(p),宏,枚举名称等)。如果您使用的是Linux,则可以,就这么简单:

#!/bin/sh ctags -R -f - . | tac > tags
由于tac反转了文件中的行顺序,因此将自动将定义放在第一位。但是,由于头文件需要维护,Vim更喜欢对标签文件进行排序,因此它变得有些复杂,因此最好先遍历该文件,然后对第一个条目(标签名称)进行向前排序,然后再对文件进行排序逆序排序。因此,更复杂的方法可能会更好。

我为这个无耻的插件表示歉意,但是我写了一个Vim插件,它(间接地)满足您的需求。它旨在为函数名称,宏,枚举等添加很多额外的突出显示组。但是,这样做的另一件事是对标记文件进行重新排序,以便函数实现在函数声明之前出现,从而实现您想要的(我和您有相同的需求)。如果您不需要任何突出显示功能,则可以很轻松地将其全部剥离:它是一个相当简单的python程序和一个甚至更简单的Vim脚本,可从my site获得。


2
投票
晚聚会,但对于传入vim标签的googlers:

1
投票
此选项对我更​​有效

0
投票
:tselect my_little_function

0
投票
将以下内容添加到您的.vimrc文件:

0
投票
如果只有一个标签匹配项,有几种方法可以使Vim直接跳转到一个标签,否则提供一个标签匹配项列表。

0
投票
之所以会这样,是因为存储在标记文件中的模式匹配在定义之前找到了声明。
© www.soinside.com 2019 - 2024. All rights reserved.