Vim

在Linux下编写程序时,拥有一套类似于VS的集成开发环境可以大大提高程序的阅读和编写效率。本文介绍如何安装vim, ctags, cscope, Taglist, SuperTab, OmniCppComplete, Winmanager, NERDTree和MiniBufExplorer等组件。最后的界面类似于如下:
logo

在安装之前将权限提升到root, 以后尽量使用root权限
ubuntu下:sudo su然后输入密码

安装vim

apt-get install vim

安装使用ctags

ctags是利用堆栈实现的能快速定位符号的工具。
安装方法:
1)从http://ctags.sourceforge.net/下载源代码包后,解压缩生成源代码目录
2)然后进入源代码根目录执行./configure
3)然后执行make
4)编译成功后执行make install
5)最后将ctrl-F12组合键映射到生成ctags的命令,需要在~/.vimrc(没有就新建)里面添加

1
map <C-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>

使用ctags的方法:
使用vim打开源代码目录里面的文件,然后同时按下ctrl和F12键生成tags。
简单的使用就是
Ctrl-] 跳转到光标所在符号的定义。
Ctrl-t 回到上次跳转前的位置

更多的功能通过命令man ctags或在vim的命令行模式下(命令行模式就是在正常打开vim后输入:就进入命令行模式)执行help ctags查询。

安装使用cscope

安装cscope的方法:
1)从http://cscope.sourceforge.net/下载源代码包后,解压缩生成源代码目录
2)然后进入源代码根目录执行./configure
3)然后执行make
4)编译成功后执行make install
5)将文件http://cscope.sourceforge.net/cscope_maps.vim下载到~/.vim/plugin目录,如果没有该目录就新建。

使用cscope的方法:
1) 生成cscope数据库文件,进入项目代码根目录运行命令

1
cscope -Rbq -f ./a.out

2)打开源代码的根目录下的文件在vim的命令下输入

1
cs add ./a.out

将数据库加载进来

Cscope常用快捷键
Ctrl-\ s 查找所有当前光标所在符号出现过位置。
Ctrl-\ c 查找所有调用当前光标所在函数的函数。

在命令行下输入cw还可以重选。
为了使cscope展现的更好看,在~/.vimrc里面添加如下行
set cscopequickfix=s-,c-,d-,i-,t-,e-

安装使用Taglist

1)从http://www.vim.org/scripts/script.php?script_id=273下载安装包,也可以从http://vim-taglist.sourceforge.net/index.html下载。
2)进入~/.vim目录,将Taglist安装包解压,解压后会在~/.vim目录中生成几个新子目录,如plugin和doc(安装其它插件时,可能还会新建autoload等其它目录)。
3)进入~/.vim/doc目录,在Vim下运行”helptags .”命令。此步骤是将doc下的帮助文档加入到Vim的帮助主题中,这样我们就可以通过在Vim中运行“help taglist.txt”查看taglist帮助。
4)打开配置文件~/.vimrc,加入以下两行:

1
2
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1

在命令行下输入TlistToggle命令就可以打开Taglist窗口。

安装使用OmniCppComplete

OmniCppComplete主要提供输入时实时提供类或结构体的属性或方法的提示和补全。跟Talist一样,OmniCppComplete也是一个Vim插件,同样依赖与Ctags工具生成的tags文件。安装步骤跟Taglist类似。
http://www.vim.org/scripts/script.php?script_id=1520下载安装包后。
1)进入~/.vim目录,将安装版解压缩
2)进入~/.vim/doc目录,在Vim命令行下运行”helptags .”
3)在~/.vimrc中加入以下几行:

1
2
set nocp
filetype plugin on

安装使用SuperTab

SuperTab使Tab快捷键具有更快捷的上下文提示功能。跟OmniCppComplete一样,SuperTab也是一个Vim插件。
http://www.vim.org/scripts/script.php?script_id=1643下载安装版。这个安装包跟先前的几个Vim插件不同,它是一个vba文件,即Vimball格式的安装包,这种格式安装包提供傻瓜式的安装插件的方法。
1)用Vim打开.vba安装包文件。
2)在Vim命令行下运行命令“UseVimball ~/.vim”。此命令将安装包解压缩到~/.vim目录。VImball安装方式的便利之处在于你可以在任何目录打开.vba包安装,而不用切换到安装目的地目录。而且不用运行helptags命令安装帮助文档。
3)在~/.vimrc文件中加入以下这行:

1
let g:SuperTabDefaultCompletionType="context"

安装使用Winmanager, NERDTree和MiniBufExplorer

前面介绍的几个工具和插件,主要提供快捷的编辑功能,如定义跳转,符号查询,符号提示与补全等。这里的三个插件,主要优化布置VIm的界面。具体来说,NERDTree提供树形浏览文件系统的界面,MiniBufExplorer提供多文件同时编辑功能,而Winmanager将这NERDTree界面和Taglist界面整合起来,使Vim更像VS!
分别从http://www.vim.org/scripts/script.php?script_id=1658
http://www.vim.org/scripts/script.php?script_id=159
http://www.vim.org/scripts/script.php?script_id=95
下载NERDTree,MiniBufExplorer和Winmanager安装包(Winmanager还有个更新的vba版本http://www.vim.org/scripts/script.php?script_id=1440,这里选用旧版本的Winmanger)。
1)像其它插件一样,将NERDTree安装包解压到~/.vim目录。并进入doc目录,在Vim命令行下运行”helptags .”命令。
2)MiniBufExplorer只有一个.vim文件,将其拷贝到~/.vim/plugin目录。
3)在~/.vimrc文件中加入以下几行:

1
2
3
4
5
let g:miniBufExplMapWindowNavVim = 1 
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBufs = 1
let g:miniBufExplModSelTarget = 1
let g:miniBufExplMoreThanOne=0

4)将Winmanager安装包解压到~/.vim目录。
5)在~/.vimrc文件中加入以下几行:

1
2
3
4
5
6
7
8
9
10
11
12
let g:NERDTree_title="[NERDTree]"
let g:winManagerWindowLayout="NERDTree|TagList"

function! NERDTree_Start()
exec 'NERDTree'
endfunction

function! NERDTree_IsValid()
return 1
endfunction

nmap wm :WMToggle<CR>

6)这个版本的Winmanager好像有个小bug,你在打开Winmanager界面时,会同时打开一个空的文件。这会影响后续使用,所以我们要在打开Winmanager时关掉这个空文件。在~/.vim/plugin目录下的winmanager.vim文件中找到以下函数定义并在第5行下添加第6行的内容:

1
2
3
4
5
6
7
8
function! <SID>ToggleWindowsManager()
if IsWinManagerVisible()
call s:CloseWindowsManager()
else
call s:StartWindowsManager()
exe 'q'
end
endfunction

这样同时按下w-m就可以打开集成环境。

其他有用的~/.vimrc配置

在~/.vimrc里面加入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
colo evening
set nu
set autoindent
set tabstop=4
set shiftwidth=4
set mouse=a
set hlsearch

" 执行特定命令并保留光标位置及搜索历史
function! Preserve(command)
let _s=@/
let l = line(".")
let c = col(".")
execute a:command

let @/=_s
call cursor(l, c)
endfunction
" 格式化全文
function! FullFormat()
call Preserve("normal gg=G")
endfunction
nmap <M-F9> :call FullFormat()<CR>