手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

在CentOS 6.2上搭建Vim开发环境

[日期:2013-07-15] 来源:Linux社区  作者:tao_627 [字体: ]

3.配置.vimrc文件
当vim在启动时,如果没有找到vimrc或gvimrc,它缺省工作VI兼容的模式。这意味着,你只能使用VI所具备的功能,而vim中的大量扩展功能将无法使用。也许这就是你的vim如此难用的原因。


vim中自带了一个vimrc例子,以我所在的CentOS 6.2上的为例,使用下面的命令找到这个文件
locate vimrc_example.vim
发现它的真实目录在
/usr/share/vim/vim72/vimrc_sample.vim
将其拷贝到我的主目录下面
cp -f /usr/share/vim/vim72/vimrc_sample.vim ~/.vimrc
或者你在vim中执行下面的命令,和上面的shell命令完成相同的功能:
:!cp $VIMRUNTIME/vimrc_example.vim ~/.vimrc
现在,你退出vim后再进入,你的vim和刚才已经不一样了。


你可以先读一下你的vimrc,看看它都设定了什么:
:e ~/.vimrc
这是一个注释良好的文件,不需要多解释。
在今后使用vim的日子里,你会频繁的更改你的vimrc。所以我们需要设置一些快捷方式,使我们能快速的访问vimrc。


把下面这段内容拷贝到你的vimrc中:
1 "Set mapleader
2 let mapleader = ";"
3
4 "Fast reloading of the .vimrc
5 map <silent> <leader>ss :source ~/.vimrc<cr>
6 "Fast editing of .vimrc
7 map <silent> <leader>ee :e ~/.vimrc<cr>
8 "When .vimrc is edited, reload it
9 autocmd! bufwritepost .vimrc source ~/.vimrc


为了方便解释,我给每一行都加了一个行号。
在vimrc中,双引号开头的行,将被当作注释忽略。
第2行,用来设置mapleader变量,当mapleader为未设置或为空时,使用缺省的”\”来作为mapleader。mapleader变量是作用是什么呢?看下面的介绍。
第5行定义了一个映射(map),这个映射把<leader>ss,映射为命令:source ~/.vimrc<cr>。当定义一个映射时,可以使用<leader>前缀。而在映射生效时,vim会把<leader>替换成mapleader变量的值。也就是说,我们这里定义的<leader>ss在使用时就变成了”,ss“,当输入这一快捷方式时,就会source一次~/.vimrc文件(也就是重新执行一遍.vimrc文件)。
第7行,定义了<leader>ee快捷键,当输入,ee时,会打开~/.vimrc进行编辑。
第9行,定义了一个自动命令,每次写入.vimrc后,都会执行这个自动命令,source一次~/.vimrc文件。
有了上面的快捷键,我们就能快速的打开vimrc文件编辑,快速重新source vimrc文件,方便多了。


相关的配置文件参见赵攀提供的.vimrc文件的内容。


注意:最后的源码结构类似如下:
~--|--.vimrc
|--.vim --|-plugin--
|-doc--
|-autoload
|-vest


4.实战体验
4.1下载一个trafficserver的源码,并以此为例来阐释使用vim开发的方法
登陆192.168.16.237上,并在当前主目录上新建一个program_dev目录
ssh root@192.168.16.237
cd ~/
mkdir program_dev
wget http://mirror.esocc.com/apache/trafficserver/trafficserver-3.2.4.tar.bz2
下载完成后,解压缩
tar jxvf trafficserver-3.2.4.tar.bz2
ll


注意:使用首先生成3种类型的标签,分别是ctags,cscope和lookupfile插件需要用到的标签。


4.2生成ctags标签(请参照下一种方法来生成tags并设置)
ctags -R trafficserver-3.2.4
将在trafficserver-3.2.4同级目录生成一个名为tags的文件
现在进入vim环境,输入以下命令
:cd ~/program_dev/trafficserver-3.2.4 "切换到当前源码目录
:set tags=~/program_dev/tags "设置tags选项为当前目录下的tags文件
注意这里设置tags需要明确写出绝对路径,否则将会导致很多函数找不到。tags文件是个纯文本文件,你可以使用vim打开它看一下。


另外,根据.vimrc中的配置,使用下面的快捷键来分别生成tags文件和cscope文件
cd trafficserver-3.2.4
find 'pwd' -name "*.cpp" -o -name "*.cc" -o -name "*.c" -o -name "*.h" > cscope.files
cscope -bqk -i cscope.files
ctags和cscope会自动区分和处理各自的索引。
这里注意使用cscope的方法,cscope在生成索引文件时,只搜索c,lex和yacc的文件(后缀名为.c,.h,.l,.y),要生成c++的文件索引,就得使用上面的方法,先产生一个文件列表cscope.files,然后让cscope为这个列表中的每个文件都生成索引。


将上述内容写成一个脚本make_cscope_ctags_index.sh,其内容如下:
#!/bin/bash


find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files
ctags -R
保存在~/.vim/中,现在将其复制到trafficserver-3.2.4下面,并运行下面的命令
/bin/bash make_cscope_ctags_index.sh
命令在trafficserver-3.2.4下面生成如下文件
cscope.files
cscope.in.out
cscope.out
cscope.po.out
tags
经过分析cscope.files,我们看到了很多文件。现在更新tags设置项
:set tags=~/program_dev/trafficserver-3.2.4/tags


至此,我们设置好了tags选项,接下来开始使用它:
在当前命令行输入
vim -t main
这个命令将打开定义“main”(变量或函数或其它)的文件,并把光标定位到这一行。
在浏览源码时,当要查询某个函数的定义时,将光标放在该函数上,按<C-]>键,就会跳转到该函数的定义处,按<C-t>键是返回。


注意:运行vim的时候,必须在“tags”文件所在的目录下运行。否则,运行vim的时候还要用“:settags=”命令设定“tags”文件的路径,这样vim才能找到“tags”文件。
在完成编码时,可以手工删掉tags文件(帚把不到,灰尘不会自己跑掉^_^)。


现在打开编号为43的文件中的main函数
按F9打开winmanager,这时按照设置,将会出现3部分窗口布局。如果打开了多个文件(多缓冲区),将在最上角出现第四个窗口,MiniBufExplorer窗口。现在按住Ctrl,再连续按W,将在各个窗口之间按照逆时针顺序来回切换。当然,按照赵攀的文档,使用F2也一样起到该作用。再按一次F9将关闭winmanager窗口布局。


当选中某个窗口时,都可以使用vim通常的移动鼠标的方式来选择不同的标签等,比如gg,G等快捷键。


将光标定位到main函数所在的文件中,将光标定位到某个函数上,按住Ctrl+]键,将会跳转到该函数的定义位置。


4.3快速浏览和操作Buffer
用vim打开多个文件时,vim最上方会出现一个MiniBufExplorer窗口,其中列出了当前所有已经打开的buffer,当你把光标置于这个窗口时(当你处于winmanager窗口布局中时,使用Ctrl+W来轮流切换), 有下面几个快捷键可以用:
<Tab> 向前循环切换到每个buffer名上
<S-Tab> 向后循环切换到每个buffer名上
<Enter> 在打开光标所在的buffer
d 删除光标所在的buffer
当你只编辑一个buffer的时候MiniBufExplorer派不上用场, 当你打开第二个buffer的时候, MiniBufExplorer窗口就自动弹出来了,


4.4bufexplorer插件用法
打开vim,输入\be在当前窗口浏览缓存,\bs水平打开一个窗口浏览缓存,\bv垂直打开一个窗口浏览缓存。


但是在Filelist和taglist的窗口内,你可以移动上下移动光标,使用ghjk这四个键


附注:
:cw change-word 改变到下一个词的尾部,不含词后面的空格


4.5Taglist窗口的快捷键操作
在taglist窗口中,可以使用下面的快捷键:
<CR> 跳到光标下tag所定义的位置,用鼠标双击此tag功能也一样
o 在一个新打开的窗口中显示光标下tag
<Space> 显示光标下tag的原型定义
u 更新taglist窗口中的tag
s 更改排序方式,在按名字排序和按出现顺序排序间切换
x taglist窗口放大和缩小,方便查看较长的tag
+ 打开一个折叠,同zo
- 将tag折叠起来,同zc
* 打开所有的折叠,同zR
= 将所有tag折叠起来,同zM
[[ 跳到前一个文件
]] 跳到后一个文件
q 关闭taglist窗口
<F1> 显示帮助
可以用”:TlistOpen“打开taglist窗口,用”:TlistClose“关闭taglist窗口。或者使用”:TlistToggle“在打开和关闭间切换。在我的vimrc中定义了下面的映射,使用<F9>键就可以打开/关闭taglist窗口:
map <silent> <F8> :TlistToggle<cr>


按照"typedef", "variable", "function"等进行了分类. 将光标移到VimMain上, 如图中左边红色的方框, 按下回车后, 源程序会自动跳转到VimMain的定义处, 如图中右边的红色方框. 这就是TagList最基本也是最常用的操作。在浏览TagList窗口时, 如果还不想让源码跳转, 但是想看看tag在源码中完整的表达, 可以将光标移到你想要看的tag上, 如图中上边黄色的方框, 然后按下空格键, 在下面的命令栏中, 如图下边黄色的方框, 会显示该tag在源码中完整的写法, 而不会跳转到源码处.


4.6cscope插件用法
在vim中使用cscope非常简单,首先调用”cscope add“命令添加一个cscope数据库,然后就可以调用”cscope find“命令进行查找了。vim支持8种cscope的查询功能,如下:


s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
d: 查找本函数调用的函数
c: 查找调用本函数的函数
t: 查找指定的字符串
e: 查找egrep模式,相当于egrep功能,但查找速度快多了
f: 查找并打开文件,类似vim的find功能
i: 查找包含本文件的文件
例如,我们想在vim 7.0的源代码中查找调用do_cscope()函数的函数,我们可以输入:”:cs find c do_cscope“,回车后发现没有找到匹配的功能,可能并没有函数调用do_cscope()。我们再输入”:cs find s do_cscope“,查找这个C符号出现的位置,现在vim列出了这个符号出现的所有位置。


我们还可以进行字符串查找,它会双引号或单引号括起来的内容中查找。还可以输入一个正则表达式,这类似于egrep程序的功能,但它是在交叉索引数据库中查找,速度要快得多。


cscope的主要功能是通过同的子命令"find"来实现的
"cscope find"的用法:
cs find c|d|e|f|g|i|s|t name
0 或 s查找本 C 符号(可以���过注释)
1 或 g查找本定义
2 或 d查找本函数调用的函数
3 或 c查找调用本函数的函数
4 或 t查找本字符串
6 或 e查找本 egrep 模式
7 或 f查找本文件
8 或 i查找包含本文件的文件


vim提供了一些选项可以调整它的cscope功能:


cscopecscopeprg选项用于设置cscope程序的位置。
cscopecscopequickfix设定是否使用quickfix窗口来显示cscope的结果,详情请”:help cscopequickfix“;
如果你想vim同时搜索tag文件以及cscope数据库,设置cscopecscopetag选项;
cscopecscopetagorder选项决定是先查找tag文件还是先查找cscope数据库。设置为0则先查找cscope数据库,设置为1先查找tag文件。我通常设置为1,因为在tag文件中查找到的结果,会把最佳匹配列在第一位。
vim的手册中给出了使用cscope的建议方法,使用命令”:help cscope-suggestions“查看。


下面是我的vimrc中关于cscope接口的设置:



"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" cscope setting
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if has("cscope")
set csprg=/usr/bin/cscope
set csto=1
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
endif
set csverb
endif


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>


先在~/vimrc中增加一句:
:set cscopequickfix=s-,c-,d-,i-,t-,e- 这个是设定是否使用 quickfix 窗口来显示 cscope 结果, 用法在后面会说到。
我想查找vim_strsave()到底在那些地方被调用过了, 用命令:
:cs find c vim_strsave 按下回车后vim会自动跳转到第一个符合要求的地方, 并且在命令栏显示有多少符合要求的结果, 如图:
如果自动跳转的位置你不满意, 想看其他的结果, 可以用下面的命令打开QuickFix窗口:
:cw 如图:


4.7 quickfix窗口
QuickFix窗口的主要作用就是上面看到的那个功能: 输出一些供选择的结果, 可以被很多命令调用, 更详细的介绍和使用方法请用下面的命令打开QuickFix的手册来学习吧:
:help quickfix
可以用下面的命令来跳转:
:cn // 切换到下一个结果
:cp // 切换到上一个结果 如果你经常使用这两个命令, 你还可以给他们设定快捷键, 比如在~/.vimrc中增加:
nmap <F6> :cn<cr>
nmap <F7> :cp<cr>

5.产生的疑问
5.1 cscope和ctags有啥区别?
两者能并存,前者更强大,特别是查找字符串,前者威力更大。ctags是跳转到标签定义的地方,但如果想查找函数在哪里被调用,或者标签在哪些地方出现过,就需要使用更为强大的cscope。


Cscope是一个交互式的屏幕下使用的工具,它被设计用来回答以下的问题:
* 什么地方用到了这个符号?
* 这是在什么地方定义的?
* 这个变量在哪里被赋值?
* 这个全局符号的定义在哪里?
* 这个函数在源文件中的哪个地方?
* 哪些函数调用了这个函数?
* 这个函数调用了哪些函数?
* 信息 "out of space" 从哪来?
* 这个源文件在整个目录结构中处于什么位置?
* 哪些文件包含这个头文件?

更多CentOS相关信息见CentOS 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=14

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款