cscope或ctags为什么选择一个呢?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

我主要使用vim / gvim作为编辑器,并且正在研究使用lxr(Linux交叉引用)cscopectags的组合来探索内核源代码。然而,我从未使用cscopectags,并且想知道为什么我们可以选择一种,考虑到我使用vim作为主要编辑器。

提问于
用户回答回答于

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>

这个cscope_maps.vim插件设置了一堆类似的绑定。我永远不会记得所有的选项是什么意思,所以倾向于坚持ctrl空间。

所以得出结论:ctags设置起来更容易,大部分工作不需要做太多的工作,这对于omni-complete也很重要。如果你必须维护一个大型且基本未知的代码库,cscope提供了更多功能,但需要更多的脚本工作。

用户回答回答于

几个月前我处于同样的状况......

缺少ctags的精确性是..中的一个痛处,我发现cscope对于所有宏相关的东西(并且在linux内核中有一堆宏)更好。

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

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

为内核开发,我不需要太多的完成....

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

扫码关注云+社区