【问题标题】:Can ctags differentiate between different symbols with same name?ctags 可以区分同名的不同符号吗?
【发布时间】:2014-07-25 12:02:42
【问题描述】:

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

struct dummy
{
   char a;
};

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

【问题讨论】:

    标签: c vim ctags cscope


    【解决方案1】:

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

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

    当{ident}有多个匹配标签时,跳转 到 [count] 一。当没有给出 [count] 时 第一个被跳转到。见 |标签匹配列表|为了 跳转到其他匹配的标签。

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

    【讨论】:

    • 好的,所以 ctag 不知道我的变量是局部变量还是我的结构的成员?我总是要自己看清单吗?
    • 是的,没错。 Vim 只是得到一个匹配标签的列表,作为一个文本编辑器,它不知道语法,让你选择合适的。
    • 好的,我想这就是我当时正在寻找的答案。你知道是否有任何工具可以解决这个问题?我正在尝试从 Eclipse 迁移到 vim,这是我在 vim 中工作时想念的一件事。
    • Vim 是一个强大的文本编辑器,而不是一个 IDE。您可以同时使用它们,并轻松地在它们之间切换文件;我也使用 IntelliJ IDEA 这样做。
    • 注意:除了:tselect,也可以使用g<C-]>
    【解决方案2】:

    当存在多个同名符号时(您正在搜索的内容!),它将在您的屏幕上显示所有可能性,并选择去那里。请参阅下面的示例(来自我的代码!)

    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){
    

    它会像这样显示,您可以通过按相应的行号转到任何行!

    【讨论】:

      猜你喜欢
      • 2013-11-12
      • 2017-04-16
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      相关资源
      最近更新 更多