cscope 或 ctags 为啥选择一个而不是另一个? [关闭]

Posted

技术标签:

【中文标题】cscope 或 ctags 为啥选择一个而不是另一个? [关闭]【英文标题】:cscope or ctags why choose one over the other? [closed]cscope 或 ctags 为什么选择一个而不是另一个? [关闭] 【发布时间】:2010-10-30 08:56:36 【问题描述】:

我主要使用 vim / gvim 作为编辑器,并且正在考虑使用 lxr (the Linux Cross Reference) 和 cscope 或 ctags 的组合来探索内核源代码。但是,我从未使用过cscope 或ctags,我想听听考虑到我将vim 用作主要编辑器,为什么会选择其中一个。

【问题讨论】:

【参考方案1】:

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" 而不必记住所有的设置步骤。

我用这个 sn-p 将 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 更容易设置,并且大部分工作无需做太多其他事情,它对于全功能也很重要。如果您必须维护大型且大部分未知的代码库,cscope 会提供更多功能,但需要更多的工作。

【讨论】:

有什么方法可以让 ctags 更准确吗?我在内核根目录中做了make tags,并且一直在玩跳来跳去,大部分时间都在错误的地方结束。我读到 ctags 与 c 预处理器有问题,但考虑到 ctags 在 lxr 中使用,显然必须做一些事情。 如果存在深层宏巫毒,那么 ctags 可能会失败 :-( 我主要将它用于 C++ 的东西,它对这方面的依赖较少(尽管它有其自身的问题......) 设置cscopetag (cst) 使:tagCTRL-] 命令先搜索cscope,再搜索标签 此外,ctags 在递归搜索方面非常慢,使用“ctags -L cscope.files”会显着加快标签生成速度。 @RobertS.Barnes 某种解决方案是使用g C-],vim 会显示与名称匹配的标签列表。您仍然需要手动查找所需的正确定义。【参考方案2】:

几个月前我也遇到过同样的情况……

ctags 缺乏精度是一个痛苦。我发现 cscope 对于所有与宏相关的东西都要好得多(并且在 linux 内核中有一堆宏)..

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

那么,按键绑定都是基于Ctrl-\(对Ctrl过敏的可以重新映射),主要用s和g....,

为内核开发,我不需要那么多的补全……

不管怎样,选择cscope,这样更方便、更准确。

【讨论】:

cscope 是否比exuberant-ctags 更精确?听说后来是改进的ctags...【参考方案3】:

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

如果您使用 cscope,那么您可以看到调用链,即谁调用了这个函数以及这个函数调用了哪些函数?

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

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

同时使用 cscope 和 etags,它们都适用于不同的事物,尤其是在处理大型代码库时,例如 Linux 内核。事实上,当我开始使用 Linux Kernel / Xen 时,我就开始使用 cscope 和 etags。

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

【讨论】:

etags 不只是 emacs 的吗?我只使用 g/vim。 是的,你是对的。来自手册页: etags 程序用于创建标签表文件,格式为 emacs(1) 可以理解; ctags 程序用于以 vi(1) 可以理解的格式创建类似的表格。 我相信有两种类型的 etags 和 ctags。一个是emacs一个,另一个是旺盛的ctags一个。第一个最初是为 emacs 编写的,但也可以用于 vi;第二个最初是为 vi 编写的,但也可以用于 emacs。我发现第二个 (exuberant ctags) 更易于使用,即使我是 emacs 用户。如果安装 exuberant-ctags 包,指向 etags/ctags 二进制文件的链接会改变,并指向不同的二进制文件。【参考方案4】:

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

【讨论】:

以上是关于cscope 或 ctags 为啥选择一个而不是另一个? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

cscope+ctags of vimrc

ctags+cscope替换sourceinsight

ruby Ruby脚本为ctags和cscope创建文件。保存文件以调用文件夹。

linux内核源码级调试

将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete(有图有真相)(转)

如何确定某个函数在Linux内核代码中的位置