Vim/Cscope Tutorial[译]
原文:http://cscope.sourceforge.net/cscope_vim_tutorial.html
Cscope是一个很方便的工具,但是如果使用它不需要离开你喜欢的编辑器(比如Vim)会更好。幸运的是,对Cscope的支持已经被加入到Vim中。
这份指南将向你介绍Vim内建的Cscope支持,以及一套可以是搜索更加方便的映射。
假定你知道使用vi风格编辑器的基础知识,但是你不必了解任何关于Vim的特殊知识(如果要用到Vim特有的特性——比如多窗口,我会简单介绍一些关于该特性的有用的知识)。你也不需要知道任何关于Cscope的东西:这些基础知识会随着我们的进行介绍给大家。
简单的说,Vim的Cscope支持跟Vim的ctags功能很像,如果你用过那些功能。但是由于Cscope比ctags有更多的搜索类型,所以会有一些区别。
这是一份需要动手实践的指南,所以打开一个shell,按照下面步骤进行:
1. 获得并安装Cscope,如果你的机器上还没有的话。理想情况下,你还应该有Vim 6.x,但是Vim 5以后的版本中就可以的到大部分功能(垂直分割不能用,不过如果你按照文件注释中的描述修改映射,还可以水平分割)。
注意:如果你的Vim版本不是带着‘--enable-cscope’参数编译的,就需要加上该参数重新配置和编译Vim。大多数随着Linux发行版发布的Vim二进制版本都已经启用了Cscope插件。
2. 下载cscope_maps.vim文件,让Vim在启动时读取它。如果你使用Vim 6.x,把这个文件粘贴到$HOME/.vim/plugin目录里(或者是其他在你的runtimepath中的插件子目录)。如果你使用Vim 5.x,你可以把整个cscope_maps文件的内容剪切粘贴到你的$HOME/.vimrc文件,或者粘贴一行“source cscope_maps.vim”到你的.vimrc文件。
3. 进入一个有一些C代码的目录,输入cscope -R(-R让Cscope分析所有子目录,而不是只有当前目录)。因为我们没有使用-b参数(它告诉Cscope只建立数据库,然后退出),你会发现自己进入到Cscope基于curses的GUI中。尝试一些搜索(提示:使用方向键在搜索类型之间移动,tab建在搜索类型和搜索结果之间切换)。键入搜索结果最左边的数字,Cscope会打开Vim到那个位置。(除非你将自己的EDITOR环境变量设置为Vim之外的东西)。退出Vim,.会回到离开时的 Cscope GUI。Nifty。
哎呀,Cscope界面有一个大问题:每次要进行新的搜索时都要推出Vim。这就是为什么会有Vim插件的原因。输入CTRL-D推出Cscope。
4. 启动Vim。如果你想的话,可以带着一个C符号启动它(例如:vim -t main),你会直接跳到代码中该符号的定义。
5. 把光标放到一个在你程序中多处用到的符号上,连续输入CTRL-\ s(Control加反斜线,然后s),你会在Vim窗口底部看到一个显示出程序中所有引用了该符号的地方的菜单。选择其中一个按Enter,就会跳到那个引用的地方。在ctags里,你可以输入“CTRL-t”跳回到搜索之前的位置(还可以嵌套搜索,CTRL-t会一次回退一层)。
助记:\键是]键的下一个,]键在ctags里用于搜索。
6. 尝试相同的搜索,但是这一次使用CTRL-空格 s。这一次Vim窗口会分成两个水平窗口,Cscope搜索结果会放在新窗口中。[如果你从来没有用过多Vim窗口:用CTRL-W w在窗口之间移动(或者CTRL-W 方向键,或者CTRL-W h/j/k/l向各个方向移动),用CTRL-W c关闭窗口(或者经典的:q),只显示当前窗口用CTRL-W o,分割当前窗口用CTRL-W s(或者用CTRL-W v垂直分割),在新窗口中打开文件用:spl[it] 文件名]
助记:在你的屏幕中间有一个很大的,像空格键一样的线隔开你的Vim窗口。
7. 用CTRL-空格 CTRL-空格 s试试同样的搜索(按住CTRL键敲两次空格)。如果你按键速度不能快到让它生效,打开cscope_maps.vim脚本按照注释里的描述改变Vim的 timeout设置[事实上,我通常建议关掉Vim的timeout]。这一次你的窗口会垂直分割(注意:这在Vim 5.x里无效,因为垂直分割是Vim 6.0的新功能)。
8. 到目前为止我们仅仅是使用了cscope_maps.vim里的按键映射,它们仅仅只搜索Vim中在光标之下的关键词。要用经典方式进行Cscope搜索(使用Vim内建的Cscope支持),输入:cscope find symbol foo(或者,更简洁的,cs f s foo)。要进行水平分割,用:scscope(或者只用:scs)代替(只支持Vim 6.x)。当关键字在光标之下是使用映射更方便,但是命令行接口让你可以搜索输入的任意符号,所以一定会有需要它的时候。
9. 当目前位置我们仅仅进行了一种搜索:s,搜索符号X的所有引用。用不同的字母试试Cscope的其他搜索:g 查找一个符号的全局定义,c 查找一个函数的所有调用,f 打开光标处的文件(注意:由于Cscope默认情况下解析在/usr/include下找到的所有的C头文件,你可以用这个命令打开大部分标准包含文件)。这些是我最常用的,但还有其他一些(在cscope_maps.vim文件里查看所有命令,并且/或者阅读Cscope的man page)。
10. 尽管Cscope原来只是用于C代码的,它实际上是一种很灵活的可以很好的用在C++、Java等其他语言上的工具。你可以把它当作一个可以识别某些结构,比如函数调用和变量声明的通用的grep数据库。默认情况下Cscope仅仅解析当前目录下(还有子目录下,如果你加上-R参数)的C,lex和 yacc文件(.c,.h,.l,.y),目前还没有办法改变文件扩展名的列表(是的,我们打算改变这一点)。因此,你必须建立一个你要解析的文件列表,并命名为cscope.files(你可以给它起任何名字,如果你这样调用:cscope -i foofile)。建立列表的一个简单(而且很灵活)的方法是用可靠的Unix find命令:
find -name '*.java' > cscope.files
现在,运行cscope -b来重建数据库(-b参数仅仅重建数据库而不运行Cscope的GUI),然后你就可以浏览Java文件里的所有符号了。当然有人用Cscope来浏览和编辑大量的文档文件,这显示了Cscope的解析器有多么灵活。
对于大一些的工程,你也许还需要使用-q参数,并且/或者使用一种更复杂的find命令。请看我们的《大项目中的Cscope使用指南》。
11. 试试设置$CSCOPE_DB环境变量来指向你创建的Cscope数据库,你就不需要总是在数据库所在的相同目录下启动Vim了。这在一些代码被分别存放在多个子目录下的大工程中很有用。注意:要让这一功能生效,你在建立数据库是必须使用绝对路径:cd /,然后执行:
find /my/projects/dir -name '*.c' -o -name '*.h' > /foo/cscope.files
然后在cscope.files的相同目录下运行Cscope,set和export $CSCOPE_DB变量,把它指向cscope.out文件:
cd foo
cscope -b
CSCOPE_DB=/foo/cscope.out; export CSCOPE_DB
(上面最后一条命令用于Bourne/Korn/Bash shell:我忘了在基于csh的shell中如何导出变量了,因为我对它们避之不及)。
你现在应该可以在你机器的任意目录下运行vim -t foo让Vim跳到定义foo的地方。我倾向于为我的不同项目写不同的shell脚本(仅仅定义和导出CSCOPE_DB),这让我可以使用一条source projectA命令在它们之间切换。
BUG:在15.4之前版本的Cscope里有一个很愚蠢的bug,在使用上面的方法时会导致Vim冻结,除非你不把自己的数据库命名为cscope.out:在调用Cscope时使用-f foo将你的数据库命名为foo.out,就没有问题了。
12. 到此为止! 如果有问题,使用:help cscope(在Vim里)并且/或者man cscope(在你的shell里)来学习更多东西。
- seth 的blog
- 要发表评论,请先登录 或 注册
