cscope或ctags为什么要选择一个?[关闭]


130

我主要使用vim / gvim作为编辑器,并且正在考虑结合使用lxr(Linux交叉参考)cscopectags来探索内核源代码。但是,我从未使用过cscopectags,并且想听听为什么考虑到我将vim用作主要编辑器时,一个人可能会选择一个而不是另一个。

Answers:


156

ctags具有两个功能:允许您从函数调用跳转到其定义,以及全方位完成。第一种意味着,当您结束对某个方法的调用时,点击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-space。

因此可以得出结论:ctags更易于设置,并且无需做很多其他事情就可以正常工作,这对于全面实现也是至关重要的。如果您必须维护大型且几乎未知的代码库,则cscope提供了更多功能,但是需要更多的工作。


2
有什么方法可以使ctags更准确?我make tags在内核根目录中进行操作,并且一直在跳来跳去,大部分时间都放在错误的位置。我读到ctags在c预处理器上有问题,但是考虑到lxr中使用了ctags,显然必须可以做一些事情。
罗伯特·S·巴恩斯

2
如果存在深层的伏都教徒,那么ctags可能会失败:-(我主要将其用于C ++东西,它对事物的依赖较少(尽管这有其自身的问题...)
richq

12
设置cscopetagcst),使:tagand CTRL-]命令首先通过cscope搜索,然后搜索标签
Hasturkun 2010年

1
而且,ctags在递归搜索中非常慢,使用“ ctags -L cscope.files”将大大加快标记的生成速度。
亚伦·H.2010年

1
@ RobertS.Barnes正在使用某种解决方案g C-],vim将向您显示与名称匹配的标签列表。您仍然需要手动查找正确的定义。
休伯特·卡里奥

15

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

ctags的精度不足是一个麻烦..,我发现cscope对于所有与宏相关的东西都更好(并且Linux内核中有很多宏)。

关于用法,这实际上很简单……您只需在内核根目录下键入cscope -R,然后您就不必担心了。

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

为内核而开发,我并不需要那么多的完成。

无论如何,使用cscope,这更加方便,准确。


4
<<您只需在内核的根目录下键入cscope -R...。最好在内核下键入“ make cscope”,否则最终您将获得Linux内核中存在的所有架构,并因此对同一个C符号进行多个定义。
2014年

4

嗯...您可能应该使用etags而不是ctags ...

如果使用cscope,则可以看到调用链,即谁调用了此函数,以及该函数调用了哪些函数?

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

那只是一个功能...找出包含特定函数定义的文件该怎么办?这只能在cscope中获得。

我用这两个 cscope的和ETag的,他们都是很好的不同的东西,有一个大的代码库工作特别是,如Linux内核。实际上,当我开始使用Linux Kernel / Xen时,我就开始使用cscope和etags。

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


etags是否仅用于emacs?我只使用g / vim。
罗伯特·S·巴恩斯

是的,你是对的。在手册页中:etags程序用于创建标签表文件,其格式为emacs(1)所理解;ctags程序用于以vi(1)理解的格式创建类似的表。
rmk

1
我相信有两种etags和ctags。一种是emacs,另一种是旺盛的ctags。首先是为emacs编写的,但也可以用于vi。第二个是为vi编写的,但也可以用于emacs。我发现第二个(旺盛的ctags)更易于使用,即使我是emacs用户。如果安装了exuberant-ctags软件包,则指向etags / ctags二进制文件的链接将更改,并指向不同的二进制文件。
ustun 2010年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.