Ubuntu 8.04下的vim改造和cscope的配置
http://www.lupaworld.com/?uid-131820-action-viewspace-itemid-117908
我原来一直使用Source Insight走读代码的,(在Ubuntu下安装vmware,虚拟一台Windows XP的机器,通过samba共享Ubuntu的文件),最近被微软教育了一下,觉得不能再用盗版的了。因此用vim + cscope替代Source Insight。 网上对于vim+cscope有好多的介绍,不过感觉写的不够简单,不太适合初学者,因此在这里详细地介绍一下。
Ubuntu 8.04缺省安装的vim是一个基本(tiny)版本,如果输入“:syntax on”,会提示不支持,如果用它看源代码,当然很不爽。因此可以在Synaptic Package Manager中选择"vim" "vim-common" "vim-doc" "vim-runtime"包,安装之。然后在/etc/vim/vimrc中做一些修改,将原来注释掉的一些配置打开(即删除双引号),添加一些功能的 设置。
下面两个是我觉得看代码比较有用的功能。
打开语法高亮显示
:syntax on
当重新打开文件时,自动跳转当上次结束编辑的位置
if has("autocmd")
au BufReadPost * if line("'/"") > 0 && line("'/"") <= line("$")
/| exe "normal g'/"" | endif
endif
vim的使用网上有"vim-handbook-cn-71.pdf"的中文使用书,翻译地非常好,可以用它来学习vim。vim的功能还是非常强大的。
Ubuntu 8.04的vim是支持cscope的。
首先在Synaptic Package Manager中安装cscope的包。
然后敲入下面的命令:
mkdir ~/.vim
mkdir ~/.vim/plugin
然后从 http://cscope.sourceforge.net/cscope_maps.vim 下载cscope_maps.vim文件,并将其copy到~/.vim/plugin目录下。
然后就ok了。
使用前在代码的目录下敲入 cscope -Rb,然后用vim看代码就可以使用cscope的功能了。
举个例子:看linux 内核的 init/main.c文件的do_basic_setup()函数的定义。
ning@ubuntu:~$ cd kernel/linux-2.6.26/init/
ning@ubuntu:~/kernel/linux-2.6.26/init$ cscope -Rb
ning@ubuntu:~/kernel/linux-2.6.26/init$ vim main.c
在vim中将光标移到 do_basic_setup()语句上 ,敲入<c-/>s (敲入ctrl+/的组合键 然后再敲s),下面提示出两个cscope的tag,敲入1,就跳转到了do_basic_setup()的函数定义处。
如果要返回到刚才的位置,再敲入Ctrl-t就可以了。
刚才演示的只是cscope的一个功能,其他的功能如下:
cscope的用法 :cs find {querytype} {name}
{querytype} 为下面的命令字
0 或 s: 查找该C语言符号
1 或 g: 查找定义
2 或 d: 查找本函数调用的函数
3 或 c: 查找调用指定函数的函数
4 或 t: 查找字符串
6 或 e: 查找 egrep 模式
7 或 f: 查找文件
8 或 i: 查找包含指定文件的文件
这些都是命令行的命令,敲起来太慢,在刚才我们配置的cscope_maps.vim,定义了这些命令的键盘快捷键,刚才演示的<c-/>s (敲入ctrl+/的组合键 然后再敲s)组合,即实现查找C语言符号的命令,就定义在下面的第一行。你也可以自己修改,定制自己的快捷键。
nmap <C-/>s :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-/>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-/>c :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap <C-/>t :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C-/>e :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap <C-/>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-/>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C-/>d :cs find d <C-R>=expand("<cword>")<CR><CR>