我主要使用vim/gvim作为编辑器,并且正在考虑使用lxr(Linux交叉引用)和cscope或ctags的组合来探索内核源代码.但是,我没有使用cscope或ctags,并且想要听到为什么人们可以选择其中一个而不考虑我使用vim作为主编辑器.
ctags启用了两个功能:允许您从函数调用跳转到其定义,以及omni完成.第一个意味着当您通过调用方法时,命中g]
或CTRL-]
将跳转到定义或实现该方法的位置.第二个功能意味着当您键入foo.
或者foo->
foo是一个结构时,将显示一个带字段完成的弹出菜单.
cscope也有第一个功能 - 使用set cscopetag
- 但不是最后一个.但是,cscope还增加了跳转到调用函数的任何地方的能力.
因此,就跳转代码库而言,ctags只会引导您前往实现函数的位置,而cscope也可以向您显示调用函数的位置.
你为什么选择一个而不是另一个?好吧,我用两者.ctags更容易设置,运行速度更快,如果你只关心单向跳跃,它会显示更少的线条.你可以跑:!ctags -R .
,g]
只是工作.它还可以实现全方位的完整.
Cscope非常适合更大,未知的代码库.设置很痛苦,因为cscope需要一个包含要解析的文件名列表的文件.同样在vim中,默认情况下没有设置键绑定 - 您需要:cscope blah blah
手动运行.
为了解决第一个问题,我有一个cscope_gen.sh
看起来像这样的bash脚本:
#!/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:cs find s =expand(" ")
有此cscope_maps.vim插件,设置了一堆类似的绑定.我永远不会记得所有选项的意思,所以往往坚持使用ctrl-space.
因此得出结论:ctags更容易设置,并且大多数工作没有做太多其他事情,它对于omni-complete也是至关重要的.如果您必须维护一个庞大且大部分未知的代码库,但需要更多的腿部工作,cscope提供了更多功能.
几个月前我处于同样的境地......
缺乏ctags的精确度是一个痛苦...,我发现cscope更好的所有宏相关的东西(并在Linux内核中有一堆宏)..
关于用法,这实际上是直截了当的...你只需在你内核的根目录输入cscope -R然后就没什么可担心的了.(我的意思是如果你只是想探索那个完美......)
然后,键绑定都基于Ctrl- \(如果你对Ctrl过敏你可以重新映射),你主要使用s和g ....
为内核开发,我不需要那么多完成....
无论如何,去cscope,这样更方便,准确.