ric*_*chq 153
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 <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>
有此cscope_maps.vim插件,设置了一堆类似的绑定.我永远不会记得所有选项的意思,所以往往坚持使用ctrl-space.
因此得出结论:ctags更容易设置,并且大多数工作没有做太多其他事情,它对于omni-complete也是至关重要的.如果您必须维护一个庞大且大部分未知的代码库,但需要更多的腿部工作,cscope提供了更多功能.
LB4*_*B40 15
几个月前我处于同样的境地......
缺乏ctags的精确度是一个痛苦...,我发现cscope更好的所有宏相关的东西(并在Linux内核中有一堆宏)..
关于用法,这实际上是直截了当的...你只需在你内核的根目录输入cscope -R然后就没什么可担心的了.(我的意思是如果你只是想探索那个完美......)
然后,键绑定都基于Ctrl- \(如果你对Ctrl过敏你可以重新映射),你主要使用s和g ....
为内核开发,我不需要那么多完成....
无论如何,去cscope,这样更方便,准确.