我主要使用vim / gvim的作为一个编辑,我期待在使用的组合LXR(在Linux交叉参考) ,要么的cscope或ctags的探索内核源代码。 但是,我还没有使用过任何的cscope或ctags的 ,并想听听为什么一个可能选择了另一种考虑到我的,用vim作为主编辑器。
Answer 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”,而不必记住所有的设置步骤。
我映射cscope的搜索到CTRL-空间×2与该片段中,这减轻的cscope的其他唐纳:
nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>
有此cscope_maps.vim插件 ,设置了一堆类似的绑定。 我永远记得所有选项的意思,所以倾向于坚持CTRL空间。
因此得出结论:ctags的是更容易建立,大多没有做其他很多工作,它是全方位完整的生命了。 cscope将提供更多的功能,如果你要保持一个大的,大多未知的代码基础,但需要更多的腿部工作。
Answer 2:
我是在同样的情况在几个月前...
缺乏的ctags的精度是在一个..痛,我的cscope找到很多对所有相关的东西宏更好的(也有在Linux内核一堆宏)..
有关使用情况,这其实简单的......你只是在你的内核的源类型的cscope -R,然后你有什么好担心的。(我的意思是,如果你只是想探索这是完美的......)
然后,按键绑定都是基于按Ctrl - \(如果你为Ctrl过敏,你可以重新映射),你主要使用s和g ...,
为内核开发,我并不需要那么多的完成....
总之,去cscope的,这是更方便,准确。
Answer 3:
嗯......你或许应该使用ETag,而不是CTAGS ...
如果您使用cscope,那么你就可以看到调用链,即谁调用这个函数和其功能,这种功能调用?
我不知道这是否可以使用的ETag / CTAGS做...
这只是其中一个功能......有关找出包含特定函数定义的文件是什么? 这个你只能在cscope的。
我同时使用cscope的和ETag的,他们是不同的东西都不错,有一个大的代码库工作特别是,如Linux内核。 其实,我开始使用cscope的,当我开始使用Linux内核/ Xen的工作的ETag。
LXR不是很大,因为你必须点击,去通过网络等,而你可以在你的内核代码构建cscope的和标签数据库,并没有去通过网络 (不像LXR)。
Answer 4:
建议使用全局gtags。 可以使用vim插件gen_tags到gtags用vim整合。