本次准备将 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 /[email protected]/
!_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 来配置。
标签:文件,插件,tags,VI,vim,计划,TAB,改造,cscope From: https://blog.csdn.net/guochongxin/article/details/141650676