ctags可以区分具有相同名称的不同符号吗?

时间:2014-07-25 12:02:42

标签: c vim ctags cscope

我正在尝试将vim与ctags和/或cscope一起使用,并且它工作得很好但我有一些问题,其中ctags跳转到错误的符号。例如,在下面的代码中,如果我将光标放在符号" a"在main()中点击 Ctrl + ] 转到定义我将被定向到" char a"在我的"虚拟结构"但我希望被引导到我的" int a"在主要。 ctags或cscope可以处理这个或符号是否需要唯一的名称?

struct dummy
{
   char a;
};

int main ()
{
   int a = 1;
   a = a + 2;
   return a;
}

2 个答案:

答案 0 :(得分:2)

是的,ctags通过将所有替代品放入标签文件来处理这个问题;您可以打开tags文件进行验证。

您的问题是由<C-]>命令的行为引起的;来自:help CTRL-]

  

当{ident}有多个匹配的标签时,跳转     到[count]一个。没有[计数]的时候     第一个跳到了。见| tag-matchlist |对于     跳转到其他匹配的标签。

您可以在命令之前提供[count](在通过<C-t>错误标记跳转后首先跳回原始位置),或者使用:tselect命令代替,所有标签替代品和查询哪一个跳转到。

答案 1 :(得分:0)

当多个符号出现时,它们具有相同的名称(您要搜索的内容!),它将显示您屏幕上的所有可能性,以及选项。请参阅下面的示例(来自我的代码!)

1 mcasttx.c      4 #include <sys/socket.h>
2 mcasttx.c     11 int socket_id,nbytes,newsocket_id;
3 mcasttx.c     22 socket_id=socket(AF_INET, SOCK_STREAM, 0);
4 mcasttx.c     23 if(socket_id == -1){
5 mcasttx.c     24 printf("Failed to Create a socket\n");
6 mcasttx.c     32 if(bind(socket_id,(struct sockaddr *)&sockaddr, sizeof(sockaddr))<0){
7 mcasttx.c     37 if( listen(socket_id, 5) < 0){

它将显示为这样你可以通过按相应的行号去任何一行!