【发布时间】:2011-01-12 09:41:13
【问题描述】:
每次在 Vim 中加载 cscope.out 后,我都需要将 Vim 的“pwd”更改为与 cscope.out 文件所在的目录相同的目录,这可能是由于 cscope 在生成标记文件时使用了相对路径。因此,如果有办法强制 cscope 在其标记文件 - cscope.out 中使用绝对路径,那么无论你的 Vim 会话的 pwd 是否与 cscope.out 文件所在的目录相同。
【问题讨论】:
每次在 Vim 中加载 cscope.out 后,我都需要将 Vim 的“pwd”更改为与 cscope.out 文件所在的目录相同的目录,这可能是由于 cscope 在生成标记文件时使用了相对路径。因此,如果有办法强制 cscope 在其标记文件 - cscope.out 中使用绝对路径,那么无论你的 Vim 会话的 pwd 是否与 cscope.out 文件所在的目录相同。
【问题讨论】:
导入 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
【讨论】:
@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 文件的位置和我要使用的绝对路径。
【讨论】:
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' 命令。
【讨论】:
您可以使用文件的绝对路径创建您的 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
您可以通过设置 cscoperelative 选项让 vim 将 cscope.out relative 中的路径解释为 cscope.out 文件的位置。
来自:help csre:
如果设置了'cscoperelative',那么在没有给定前缀的情况下 cscope(前缀是cscope的-P选项的参数),basename 将使用 cscope.out 位置(通常是项目根目录) 作为构造绝对路径的前缀。默认为关闭。 注意:此选项仅在 cscope (cscopeprg) 为 初始化时没有前缀路径 (-P)。
例子
: 设置 csre
: 设置 nocsre
【讨论】:
注意:由于我还不够资深,无法添加 cmets: Aaron 和 Neha 的回答对我了解有关整个系统的更多信息很有用,但该问题的最佳和最直接的答案目前排在第三位,并且是 Shayan 的。
提问者更多的是询问通过 cscope 获取绝对路径名,而不是使用(非常有能力和强大的)vim 解决它。
注意 2:还有另一种方法可以在 vim 中进行一次更改并完成与 Neha 所做的相同的操作。
:set cscopeprg=cscope -P path_to_relative_base
我更喜欢 Neha,但如果这是你想要的,这种方式更接近于修改 cscope 而不是 vim 设置。这是允许您将 cscope db 移动到任何地方的唯一方法。
【讨论】: