ctags能否区分相同名称的不同符号?

5

我正在尝试将vim与ctags和/或cscope一起使用,效果还不错,但是在ctags跳转到错误的符号时遇到了一些问题。例如,在下面的代码中,如果我将光标放在main()中的符号"a"上,然后按下Ctrl+]以转到定义,我将被引导到“dummy struct”中的“char a”,但我希望被引导到main中的“int a”。ctags或cscope能够处理这个问题吗?还是这些符号需要具有唯一的名称?

struct dummy
{
   char a;
};

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

5

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

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

当{ident}有多个匹配标记时,跳转到[count]个标记。当没有给出[count]时,跳转到第一个标记。有关跳转到其他匹配标记的信息,请参见|tag-matchlist|。

您可以在命令之前提供一个[count](在错误的标记跳转后首先跳回原始位置,然后使用<C-t>),或者改用:tselect命令,该命令列出所有标记备选项并查询要跳转到哪个标记。


好的,那么 ctag 不知道我的变量是局部变量还是结构体成员变量?我总是需要自己查看列表吗? - Olppah
是的,没错。Vim只是作为一个文本编辑器获取匹配标签列表,它并不知道语法,并让你选择适当的标签。 - Ingo Karkat
好的,我认为那就是我要找的答案。你知道是否有任何工具可以处理这个问题吗?我正在尝试从Eclipse转移到Vim,在Vim中工作时我想念的就是这一点。 - Olppah
Vim是一个强大的文本编辑器,而不是IDE。您可以同时使用两者,并轻松地在它们之间切换文件;我也这样做,使用IntelliJ IDEA。 - Ingo Karkat
3
注意:除了使用 :tselect 命令外,也可以使用 g<C-]> 快捷键。 - pingul

1
当存在多个具有相同名称的符号(即您要搜索的内容!)时,它将在屏幕上显示所有可能性,并提供前往该处的选项。请参见下面的示例(来自我的代码!)。
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){

它将显示为这样,您可以通过按相应的行号前往任何行!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接