为什么selectcscope或ctags?
我主要使用vim / gvim作为编辑器,并且正在考虑使用lxr(Linux交叉引用)和cscope或ctags的组合来探索内核源代码。 但是,我从来没有使用cscope或ctags,并想知道为什么可以select一个,考虑到我使用vim作为主要编辑器。
ctags启用了两个function:允许您从函数调用跳转到它们的定义,以及omni完成。 第一种意思是当你调用某个方法时,按[ g]
或者CTRL-]
将跳转到定义或实现该方法的地方。 第二个function意味着当你键入foo.
或foo->
,如果foo是一个结构,那么会显示一个字段完成的popup式菜单。
cscope也有第一个function – 使用set cscopetag
– 但不是最后一个。 但是,cscope还增加了跳转到任何函数调用的地方的能力。
所以就跳转代码库而言,ctags只会引导你去实现函数的地方,而cscope可以告诉你函数被调用的地方。
为什么你会select一个呢? 那么,我用两个。 ctags设置起来更容易,运行速度更快,如果你只关心一个方向的跳跃,它会显示出更less的线条。 你可以运行:!ctags -R .
和g]
只是工作。 它也使这个完整的东西。
Cscope适合更大,未知的代码库。 设置是一个痛苦,因为cscope需要一个包含文件名称列表parsing的文件。 另外在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
这将search我感兴趣的代码,创buildcscope.files列表并创build数据库。 这样我可以运行“:!cscope_gen.sh”,而不必记住所有的设置步骤。
我用这个片段将cscopesearch映射到ctrl-space x 2,这减轻了cscope的另一个问题:
nmap <C-@><C-@> :cs find s <CR>=expand("<cword>")<CR><CR>
有这个cscope_maps.vim插件 ,设置了一堆类似的绑定。 我永远不会记得所有的选项是什么意思,所以往往坚持ctrl空间。
所以得出结论:ctags设置起来比较容易,大部分工作都没有做太多的工作,这对于omni-complete也是至关重要的。 cscope提供了更多的function,如果你必须保持一个大型的,基本上未知的代码库,但需要更多的腿部工作。
几个月前我也是这样
缺lessctags的精度是一个痛苦的..,我发现cscope更好的所有macros相关的东西(并在Linux内核中有一堆macros)..
关于使用,这实际上很简单…你只需在你的内核的根目录下键入cscope -R,然后你就不必担心了。(我的意思是,如果你只是想探索这是完美的…)
然后,键绑定全部基于Ctrl- \(如果您对Ctrl过敏,则可以重新映射),主要使用s和g ….,
开发内核,我不需要太多的完成….
无论如何,去cscope,这是更方便,准确。
嗯…你应该使用etags而不是ctags …
如果你使用cscope,那么你可以看到调用链,即谁调用这个函数和这个函数调用哪些函数?
我不知道这是否可以使用etags / ctags来完成…
这只是一个function…如何find包含特定函数定义的文件? 这你只能在cscope中获得。
我同时使用cscope和etags,它们对于不同的事情都是有好处的,特别是在处理大型的代码库时,比如Linux内核。 实际上,当我开始使用Linux Kernel / Xen时,我开始使用cscope和etags。
LXR不是很好,因为你必须点击,通过networking等,而你可以在你的内核代码上构buildcscope和tags数据库,而不必通过networking (与lxr不同)。