cscope或ctags为什么选择一个而不是另一个?

时间:2009-06-01 10:14:34

标签: vim kernel ctags cscope

我主要使用vim / gvim作为编辑器,我正在考虑使用lxr (the Linux Cross Reference)cscopectags的组合来探索内核源代码。但是,我还没有使用cscopectags,并且想听听为什么考虑到我使用vim作为主要编辑器,可以选择其中一个而不是另一个。

4 个答案:

答案 0 :(得分:150)

ctags启用了两个功能:允许您从函数调用跳转到其定义,以及omni完成。第一个意味着当您通过调用方法时,点击g]CTRL-]将跳转到定义或实现该方法的位置。第二个功能意味着当您键入foo.foo->时,如果foo是结构,则会显示带字段完成的弹出菜单。

cscope也有第一个功能 - 使用set cscopetag - 但不是最后一个。但是,cscope还增加了跳转到调用函数的任何地方的能力。

因此,就代码库而言,ctags只会引导您前往实现函数的位置,而cscope也可以向您显示调用函数的位置。

为什么选择一个而不是另一个?好吧,我用两者。 ctags更容易设置,运行速度更快,如果你只关心单向跳跃,它会显示更少的线条。您只需运行:!ctags -R .g]即可。它还可以实现全方位的完整。

Cscope非常适合更大,未知的代码库。设置很痛苦,因为cscope需要一个包含要解析的文件名列表的文件。同样在vim中,默认情况下没有设置密钥绑定 - 您需要手动运行:cscope blah blah

要解决第一个问题,我有一个bash脚本cscope_gen.sh,如下所示:

#!/bin/sh
find . -name '*.py' \
-o -name '*.java' \
-o -iname '*.[CH]' \
-o -name '*.cpp' \
-o -name '*.cc' \
-o -name '*.hpp'  \
> cscope.files

# -b: just build
# -q: create inverted index
cscope -b -q

这会搜索我感兴趣的代码,创建cscope.files列表并创建数据库。这样我就可以运行“:!cscope_gen.sh”,而不必记住所有设置步骤。

我用这个片段将cscope搜索映射到ctrl-space x 2,这减轻了cscope的另一个问题:

nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>

this cscope_maps.vim plugin设置了一堆类似的绑定。我永远不会记得所有选项的意思,所以往往坚持使用ctrl-space。

总而言之:ctags更容易设置,并且大多数工作没有做太多其他事情,它对于omni-complete也是至关重要的。如果您必须维护一个庞大且大部分未知的代码库,但需要更多的腿部工作,cscope提供了更多功能。

答案 1 :(得分:15)

几个月前,我处于同样的境地......

缺乏ctags的精确度是一个痛苦...,我发现cscope更好地适用于所有与宏相关的东西(并且linux内核中有一堆宏)..

关于用法,这实际上是直截了当的......你只需在内核的根目录键入cscope -R然后就没什么可担心的了。(我的意思是如果你只想探索那个完美的...... 。)

然后,键绑定都基于Ctrl- \(如果你对Ctrl过敏,可以重新映射),你主要使用s和g ....,

为内核开发,我不需要那么多完成....

无论如何,去cscope,这样更方便,更准确。

答案 2 :(得分:4)

嗯......你应该使用etags而不是ctags ...

如果您使用cscope,那么您可以看到呼叫链,即谁调用此功能&amp;这个函数调用哪些函数?

我不确定是否可以使用etags / ctags来完成...

这只是一个功能......如何查找包含特定功能定义的文件?这只能在cscope中获得。

我使用两者 cscope和etags,它们都适用于不同的东西,特别是在使用大型代码库时,例如Linux内核。事实上,当我开始使用Linux Kernel / Xen时,我开始使用cscope和etags。

LXR不是很好,因为你必须点击,浏览网络等,而你可以在内核代码上构建cscope和标签数据库,不必通过网络 (与lxr不同)。

答案 3 :(得分:1)

建议使用全局gtag。可以使用vim插件gen_tags将gtags与vim集成。