【问题标题】:How to let cscope use absolute path in cscope.out file?如何让 cscope 在 cscope.out 文件中使用绝对路径?
【发布时间】:2011-01-12 09:41:13
【问题描述】:

每次在 Vim 中加载 cscope.out 后,我​​都需要将 Vim 的“pwd”更改为与 cscope.out 文件所在的目录相同的目录,这可能是由于 cscope 在生成标记文件时使用了相对路径。因此,如果有办法强制 cscope 在其标记文件 - cscope.out 中使用绝对路径,那么无论你的 Vim 会话的 pwd 是否与 cscope.out 文件所在的目录相同。

【问题讨论】:

    标签: vim cscope


    【解决方案1】:

    导入 cscope.out 时,可以提供前缀,即

    :cscope add /path/to/cscope.out /path/to/src/code
    

    然后你的搜索会变成这样:

    Cscope Tag: foobar
        #   line  filename / context / line
        1     21 /path/to/src/code/foobar_file.c
    

    【讨论】:

      【解决方案2】:

      @Aaron H. 是对的。

      对于我的配置,我使用了 cscope_maps.vim 插件并修改了以下几行:

        40     " add any cscope database in current directory
        41     if filereadable("/usr/project/cscope.out")
        42         cs add /usr/project/cscope.out /usr/project
        43     " else add the database pointed to by environment variable 
        44     elseif $CSCOPE_DB != ""
        45         cs add $CSCOPE_DB
        46     endif
      

      其中“/usr/project”是 cscope.out 文件的位置和我要使用的绝对路径。

      【讨论】:

        【解决方案3】:

        cscope tutorial 有一个非常简单的解决方法来解决这个问题:

        11.尝试将$CSCOPE_DB 环境变量设置为指向您创建的Cscope 数据库,这样您就不必总是在其中启动Vim 与数据库相同的目录。这对于 代码被分成多个子目录的项目。注:对于 要这样做,您应该使用绝对路径名构建数据库: cd到/,然后做

        find /my/project/dir -name '*.c' -o -name '*.h' > /foo/cscope.files
        

        然后在与 cscope.files 文件相同的目录下运行 Cscope(或使用 'cscope -i /foo/cscope.files'),然后设置并导出 $CSCOPE_DB 变量,将其指向产生的 cscope.out 文件):

        cd /foo
        cscope -b
        CSCOPE_DB=/foo/cscope.out; export CSCOPE_DB   
        

        (上面的最后一个命令是针对 Bourne/Korn/Bash shell:我忘记了 如何在基于 csh 的 shell 中导出变量,因为我避免使用它们 瘟疫)。

        你现在应该可以在你的任何目录中运行 'vim -t foo' 机器并让 Vim 直接跳转到 'foo' 的定义。我倾向于 编写小 shell 脚本(只定义和导出 CSCOPE_DB) 我所有不同的项目,这让我可以在它们之间切换 简单的 'source projectA' 命令。

        【讨论】:

          【解决方案4】:

          您可以使用文件的绝对路径创建您的 cscope.files,这是我生成 cscope 数据库的脚本

          #!/bin/sh
          
          find $PWD -name '*.[ch]' -exec echo \"{}\" \; | sort -u > cscope.files
          cscope -bvq
          

          然后只需 vim cscope.files 和 :cs 添加 cscope.out,尽管我的 cscope 插件会自动执行此操作。然后我搜索我感兴趣的文件并用 gf 跳转到它们。

          【讨论】:

          • 另外,在脚本运行的同一目录上运行 export CSCOPE_DB=$(pwd)/cscope.out
          【解决方案5】:

          您可以通过设置 cscoperelative 选项让 vim 将 cscope.out relative 中的路径解释为 cscope.out 文件的位置。 来自:help csre

          如果设置了'cscoperelative',那么在没有给定前缀的情况下 cscope(前缀是cscope的-P选项的参数),basename 将使用 cscope.out 位置(通常是项目根目录) 作为构造绝对路径的前缀。默认为关闭。 注意:此选项仅在 cscope (cscopeprg) 为 初始化时没有前缀路径 (-P)。

          例子

          : 设置 csre
          : 设置 nocsre

          【讨论】:

          • 这应该是公认的答案,因为从 vim+cscope 的角度来看,这是迄今为止最简单的解决方案。谢谢你的回答!
          【解决方案6】:

          注意:由于我还不够资深,无法添加 cmets: Aaron 和 Neha 的回答对我了解有关整个系统的更多信息很有用,但该问题的最佳和最直接的答案目前排在第三位,并且是 Shayan 的。

          提问者更多的是询问通过 cscope 获取绝对路径名,而不是使用(非常有能力和强大的)vim 解决它。

          注意 2:还有另一种方法可以在 vim 中进行一次更改并完成与 Neha 所做的相同的操作。

          :set cscopeprg=cscope -P path_to_relative_base
          

          我更喜欢 Neha,但如果这是你想要的,这种方式更接近于修改 cscope 而不是 vim 设置。这是允许您将 cscope db 移动到任何地方的唯一方法。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-31
            • 1970-01-01
            • 1970-01-01
            • 2021-12-12
            • 1970-01-01
            • 2021-10-18
            相关资源
            最近更新 更多