VI改造计划

本次准备将Ubuntu自带的VI编辑器打造成适合我们C语言及内核开发时的IDE,先进行基础改造工程,下面是整个改造计划:
0.实践环境 Ubuntu13.10(64位,Kernel为自已编译的3.13.6),涉及工具及插件有:
名称
版本
功能
vimVIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug 12 2013 00:23:19)命令行下文本编辑器
ctagsExuberant Ctags 5.9~svn20110310用于生成源码对应的tag标签文件
cscopecscope: version 15.7actags相似,但搜索功能更强大
vim-addonsvim的插件管理器
taglist结合ctags显示当前文件的TAG列表
code_complete2.9代码补全插件,注意TAB键操作
会用到示例的代码片段:
#include <stdio.h>
void main(void) {
    printf(“Hello World!”);
    exit(0);
}
1.自我改造
由于Ubuntu默认只安装了VI,此时我们先将其升级为增强版VIM,需执行如下命令:
sudo apt-get install vim
升级为VIM后,我们可以自由的配置相应的配置文件和安装插件,强壮每一个VI。
对于VIM工具,默认的配置文件存放在/etc/vim/vimrc和/usr/share/vim/vimrc两文件里,两个都可以修改,没有硬性规定哪个能改哪个不能改,两个都是系统级配置,用于VIM初始化配置用,后一个与工具包配合在一起,一般不关心,我们一般修改全局通用配置则是前一个,这一改会影响到所有的用户,详细说明可使用man vim查阅,我们此处需要一个属于自己的个性配置,接下来是配置时间:
先将上面的vimrc复制到自己的主目录($HOME)下(也可自行创建一个,但无参考,复制过来的文件里有一些标准的配置未打开,有说明,可根据实际需要修改):
cd ~ cp /etc/vim/vimrc .vimrc
复制过来的文件以隐藏文件形式存在,接下来打开复制过来的文件按需配置了:
a.语法高亮
在配置文件里有如下内容:
“ Vim5 and later versions support syntax highlighting. Uncommenting the next
“ line enables syntax highlighting by default. if has(“syntax”) syntax on endif
由于我们的VIM版本是7.4,故而只要保证上面的语句没有使用”进行注释就可以,其中主角是syntax on一句。
b.显示行数
在配置文件里加入如下一句就可以在左边显示行号:
set number 或 set nu
c.设置TAB缩进
在学习C++时老师告诉我们一个TAB占用8个字节,而Linux Kernel里的C风格也是一样,我们在VIM里有如下设置缩进的配置项:
set tabstop=8
set softtabstop=8
set shiftwidth=8
上面的配置中tabstop表示一个TAB占用的字节数,而softtabstop则表示我们输入一个TAB实际占用的字节数。
如果set expandtab被设置时,即.vimrc里包含该句时,那么每输入一个TAB键时会自动将TAB键转换为softtabstop个空格,如果没被设置(相当于set noexpandtab),那么VIM默认会按nsofttabstop / tabstop个TAB键+nsofttabstop%tabstop个空格键的组成形式来缩进,上面tabstop和softtabstop是一样的,即缩进的都是n个TAB键,不会再跟空格键。一般不设置expand,该参数在Android开发倒是有用,在Android里要求将TAB转换为8个空格。 shiftwidth一般与softtabstop一致,表示在Normal模式下使用>>,<<和Insert模式下使用<C-t>,<C-d>进行缩进的空格数。
d.设置自动缩进
开启自动缩进:每行的缩进值与上一行相同,如果使用noautoindent则取消设置,此处我们设置缩进:
set autoindent
开启C/C++语言自动缩进支持:
set cindent
设置C/C++语言的具体缩进方式(仅参考):
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
至此,关于VIM自身的改造造一段落,已满足基本的需求,接下来使用注入外部工具来扩展功能了。
2.插上翅膀,展翅高飞
a.ctags
ctags工具用于为源码生成标签索引,以便于VI等编辑器或Taglist等插件工具使用,其遍历指定工程目录下的源码文件生成相应的符号,为我们检索函数、变量等内容提供指引。
接下来先安装它:
sudo apt-get install ctags
安装完后我们使用该工具为我们的demo工程生成相应的标签文件,我们在~/demo目录下有hello.c文件,文件内容为我们文章开头提及的代码段,接下来开始生成这万物之基的标签:
cd ~/demo
ctags -R *
执行后会在当前目录下生成tags文件,我们可以打开看里面生成的内容:
xinu@slam:~/demo$ cat tags
!_TAG_FILE_FORMAT 2 /extended format; –format=1 will not append ;” to lines/ !_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ !_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/ !_TAG_PROGRAM_NAME Exuberant Ctags // !_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ !_TAG_PROGRAM_VERSION 5.9~svn20110310 // main hello.c /^void main(void) {$/;” f
接下来要如何使用呢?有如下方法:
第一种,使用vim时加-t参数,如下操作:
xinu@slam:~/demo$ vim -t main
这时vim会打开定义main这个标签(变量、函数或其它)所在的文件,并把光标定位到该行。
第二种,在vim的normal模式下使用:ta命令(ta是tag的缩写),如查找main时用到:ta main
第三种,在vim的normal模式下先将光标定位到要查找的变量名或函数名等想查找的字符上,然后按下组合键“ctrl+]”,此时会跳转到相应的文件,再使用“ctrl+o”或“ctrl+t”跳转回查找时所在的位置。 如果有时候不太清楚操作,还可以找我们的万能大师帮助下,在vim的normal模式下使用:help tags命令查看帮助文档,了解ctags的用法。 还有点要注意的是运行vim时要在生成的tags文件所在目录下操作才能生效,如果是在其他目录下,则需要在normal模式下使用:set tags=命令来设定使用的tags文件路径了。
b.cscope
cscope与ctags功能相似,但要更强大些。它并不像ctags简单的标签查找,它可以指定要查找的类型(函数、变量)以及函数的调用关系等。说了有这么好,我们先搭好环境再说,把它安装上:
sudo apt-get install cscope
安装好后,我们仍然在demo下创建cscope需要用到的符号数据库:
cd ~/demo cscope -Rbq
此时会生成如下文件:
cscope.in.out
cscope.out
cscope.po.out
接下来需将这生成的cscope索引库被vim加载使用,使用vim打开hello.c,然后在normal模式下执行cs add cscope.out命令,接下来就可以使用cscope来操作工程了,主要用到cs f,详细的使用说明可以在normal模式下执行:cs help命令查阅。(cs是cscope命令的缩写,f是find的缩写)
c.vim-addons
vim的插件管理器vim-addons,可以帮助我们明明白白管理我们的vim里能支持和已使用的插件,还是老样子,先将其安装上:
sudo apt-get install vim-scripts
此时会将vim-addons和vim-addon-manager等工具安装上,运行这两个命令的任何一个,均可看到插件的开启、支持状况。 由于我们现在要安装的插件只给自己使用,故而先在我们的$HOME目录下创建相应的目录:
cd ~ mkdir -p .vim/plugin .vim/doc
至此安装插件的基础环境搭好了,接下来是安装需要的插件了。
d.taglist
taglist是标签浏览器,用于列出当前文件中的所有标签(相当于windows下的source insight左边的内容,包含宏、变量、函数名等)。
接下来现炒一个插件,别浪费vim-addons的苦心:
xinu@slam:~$ vim-addons install taglist
Info: installing removed addon ‘taglist’ to /home/xinu/.vim Info: Rebuilding tags since documentation has been modified … Processing /home/xinu/.vim/doc/ Info: done.
安装好后我们采用默认配置,直接用vim打开hello.c文件,然后在normal模式下执行:Tlist命令,可以在左边再打开一个列表窗显示当前文件包含的符号,再执行相同命令则关闭左边的列表窗。那如何在列表窗和源码窗之间来回切换呢?只需要按住ctrl键,再双击w键即可切换(即ctrl-w+w)。
e.code_complete
该插件没有在vim-addons列表里,在列表里的是omnicppcomplete,可以使用vim-addons install omnicppcomplete 安装,我们在这里还是使用code_complete先:
从http://www.vim.org/scripts/script.php?script_id=1764下载2.9(当前最新版)版的code_complete.vim文件,然后将其复制到我们的插件目录里:
cp ~/Downloads/code_complete.vim ~/.vim/plugin/
接下来要修改下生成tags的命令:
ctags -R –c-kinds=+p –fields=+S .
然后在输入关键字后按下TAB键就可以进行补全了,如使用vim打开文件后,输入main后再按下TAB键,此时会将整个main函数的框架都生成好,相关的效果可访问http://files.myopera.com/mbbill/files/code_complete.gif查看,效果如下:
VIM插件code_complete操作演示GIF动画文件
3.实例演示
终于搭建好相关环境了,而我们主要还是操作Linux Kernel代码,而在源码下刚好Kbuild有指令可生成ctags和cscope文件,在make help里有如下内容:
tags/TAGS - Generate tags file for editors cscope - Generate cscope index
于是我们分别执行make tags和make cscope命令来生成相应的文件。
下图是在Kernel源码下生成tags和cscope.out文件后打开init/main.c文件并进行操作后的截图:
VIM+CSCOPE+CTAGS+TAGLIST搭建IDE环境,打开Kernel源码init/main.c文件时效果图
此处需要配置的是:cs add cscope.out,还有使用:Tlist打开左边TAG列表,暂不需其他配置。
接下来就可以使用“ctrl+]”和“:cs f g start_kernel”之类的指令来搜索标签了。
这太方便了,在整个Terminal窗口就可以进行代码的定位阅读了,一个“爽”字了得啊!
4.后记 上面搭建好的环境已满足基本的需求,当然,如果还想尝试新的提升效率的技巧,可以再安装其他插件或修改vimrc来配置,在下面“参考网址”里的链接有更详细的内容。
5.参考网址
http://blog.csdn.net/bokee/article/details/6633193
http://smilejay.com/2012/10/vim-for-linux-programmer/ http://www.cnblogs.com/zhangsf/archive/2013/06/13/3134409.html http://easwy.com/blog/archives/advanced-vim-skills-filetype-on/

评论

此博客中的热门博文

I/O映射之I/O端口

通过Netlink检测网线插拔

使用seq_file