VI改造计划

15 篇文章 0 订阅

本次准备将 Ubuntu 自带的 VI 编辑器打造成适合我们 C 语言及内核开发时的 IDE,先进行基础改造工程,下面是整个改造计划:

0.实践环境
Ubuntu13.10(64 位,Kernel 为自已编译的 3.13.6),涉及工具及插件有:

涉及工具及插件

会用到示例的代码片段:

#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 默认会按 n*softtabstop / tabstop 个 TAB 键+n*softtabstop%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_AUTHORDarren 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 查看。

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 文件并进行操作后的截图:

生成 tags 和 cscope.out 文件后打开 init/main.c 文件并进行操作

此处需要配置的是:cs add cscope.out,还有使用:Tlist 打开左边 TAG 列表,暂不需其他配置。接下来就可以使用“ctrl+]”和“:cs f g start_kernel”之类的指令来搜索标签了。这太方便了,在整个Terminal 窗口就可以进行代码的定位阅读了,一个“爽”字了得啊!

4.后记

上面搭建好的环境已满足基本的需求,当然,如果还想尝试新的提升效率的技巧,可以再安装其他插件或修改 vimrc 来配置。

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stxinu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值