vim - cscope 或 ctags 为什么选择其中之一?

标签 vim kernel ctags cscope

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

最佳答案

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

cscope 还具有第一个功能 - 使用 set cscopetag - 但不是最后一个。然而,cscope 还添加了跳转到调用函数的任何位置的功能。

因此,就跳转代码库而言,ctags 只会引导您到达函数实现的位置,而 cscope 也可以显示函数被调用的位置。

为什么你会选择其中一个而不是另一个?嗯,我两者都用。 ctags 更容易设置,运行速度更快,如果您只关心以一种方式跳转,它会显示更少的行。您只需运行 :!ctags -R 即可。g] 就可以了。它还可以实现全方位的完整功能。

Cscope 非常适合更大的、未知的代码库。设置很痛苦,因为 cscope 需要一个包含要解析的文件名列表的文件。同样在 vim 中,默认情况下没有设置键绑定(bind) - 您需要手动运行 :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设置了一堆类似的绑定(bind)。我永远记不起所有选项的含义,所以倾向于坚持使用 ctrl-space。

所以得出结论:ctags 更容易设置,并且大多数情况下无需执行太多其他操作即可工作,这对于全能完成也至关重要。如果您必须维护一个大型且大多数未知的代码库,cscope 可以提供更多功能,但需要更多的跑腿工作。

关于vim - cscope 或 ctags 为什么选择其中之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/934233/

相关文章:

Linux 内核空闲循环

c - 如何在C中获取文件中所有函数的范围(即行号)?

vim - 如何为 Groovy 类生成 TAGS 文件以便在 VIM/Emacs 中使用

vim - 如何在 Vim 中快速选择(内部)行

vim - 如何在 VIM 中取消 TAB 映射并且不使 Ctrl-I 无效

Linux 内核设备驱动程序需要访问用户空间中的共享对象

linux - 访问未通过 EXPORT_SYMBOL* 导出的 Linux 内核符号

javascript - 如何让 vim 的 taglist 插件显示对 javascript 有用的信息?

python - PEP128 连续行缩进不足,以便 Vim 的视觉缩进?

python - 修复 native Cygwin Vim Python 支持