Cscope 或 ctag 为什么要选择其中一个?

我主要使用 vim/gvim 作为编辑器,并考虑使用 Lxr (Linux 交叉引用)显微镜标签的组合来探索内核源代码。然而,我从来没有使用过 显微镜或者 标签,我想知道为什么一个人可以选择一个而不是另一个,考虑到我使用 vim 作为主编辑器。

75794 次浏览

Ctag 支持两个特性: 允许从函数调用跳转到它们的定义,以及 omni 完成。第一种方法意味着当您调用一个方法时,按下 g]CTRL-]将跳转到定义或实现该方法的位置。第二个特性意味着当您键入 foo.foo->时,如果 foo 是一个结构,那么将显示一个具有字段完成功能的弹出菜单。

Cscope 也有第一个特性——使用 set cscopetag——但不是最后一个。但是 cscope 还增加了跳转到调用函数的任何位置的能力。

因此,就代码基而言,ctag 只会引导您到达函数实现的位置,而 cscope 也可以向您显示函数的调用位置。

你为什么要选择其中一个?我两个都用。Ctag 设置起来更容易,运行起来更快,如果你只关心一种跳跃方式,它会显示更少的线条。你只要运行 :!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.而不是必须记住所有的设置步骤。

我使用这个代码片段将 cscope search 映射到 ctrl-space x 2,这减轻了 cscope 的另一个负面影响:

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

This cscope _ map. vim plugin 这个 cscope _ map. vim 插件建立了一系列类似的绑定。我总是记不住所有选项的意思,所以我倾向于使用 ctrl 空间。

因此得出结论: ctag 更容易设置,而且大多数情况下不需要做太多其他事情就可以工作,这对于 omni-complete 也是至关重要的。如果您必须维护一个大型且几乎不为人所知的代码库,那么 cscope 提供了更多的特性,但是需要更多的腿工作。

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

缺乏精确的标签是一个痛苦的..。,而且我发现 cscope 对于所有宏相关的东西都要好得多(Linux 内核中有很多宏)。.

关于用法,这实际上很简单... 你只要在内核的根目录中输入 cscope-R 就没什么可担心的了。.(我的意思是,如果你只是想探索,这是完美的...)

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

为内核开发,我不需要这么多的完成... 。

不管怎样,用显微镜吧,这样更方便,更准确。

你应该用标签代替标签。

如果您使用 cscope,那么您可以看到调用链,也就是说,谁调用这个函数 & 这个函数调用哪些函数?

我不知道这是否可以做到这一点,使用标签/标签..。

这只是一个特性... 那么找出包含特定函数定义的文件怎么样呢?这只有在显微镜下才能看到。

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

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

建议使用全局 gtag。可以使用 vim 插件 Gen _ tag集成 gtag 和 vim。