VI配置成多语言IDE(带完整附件)

vim是一款支持插件、功能无比强大的编辑器,无论你的系统是linux、unix、mac还是windows,都能够选择他来编辑文件或是进行工程级别 的coding。如果能把vim用好了,编程效率能得到大幅度提高,而且vim的通用和轻量,更能让你做各种语言编程时爱不释手。下面就让我来介绍一下怎样一步一步将vim配置成各开发语言通用的IDE。vim有丰富的插件,大家可以去http://www.vim.org上淘些好的东西使使。

一、下载

下载vim的源码: vim的官方网站是:www.vmunix.com/vim

可以用这个链接下载源码包:ftp://ftp.jp.vim.org/pub/vim/unix/vim-7.3.tar.bz2 我比较喜欢源码安装,可以自己配置很多东西。(Ubuntu的apt-get的最新版本目前只有7.2)

二、安装

$wget ftp://ftp.jp.vim.org/pub/vim/unix/vim-7.3.tar.bz2
$bunzip2 vim-7.3.tar.bz2
$tar -xvf vim-7.3.tar
$cd vim73/
$./configure --with-features=huge --enable-pythoninterp=yes \
--enable-gui=gnome2 --enable-multibyte --enable-cscope \
--enable-fontset --enable-perlinterp --enable-rubyinterp \
--with-python-config-dir=/usr/lib/python2.6/config
$make
$make install

已经安装完毕,现在大家可以输入vim或gvim看一下效果。 

三、基本配置

  如果家目录下没有~/.vimrc,则创建一个600的文件,如果没有~/.vim文件夹,则创建之,如下:

$touch ~/.vimrc
$mkdir -m700 ~/.vim

我的.vimrc的基本配置如下:

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 基本配置
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 设定默认编码,解决菜单乱码
set langmenu=zh_CN.UTF-8
set encoding=UTF-8
set fenc=UTF-8
set fencs=UTF-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
set helplang=cn
set fileencodings=UTF-8
set guifont=Luxi\ Mono\ 10 " 设置字体

" 输入:set list命令是应该显示些啥?
set listchars=tab:\|\ ,trail:.,extends:>,precedes:

下面对文件操作做基本 配置:
filetype on " 侦测文件类型
filetype plugin on " 根据文件类型载入相关插件(动态选择加载插件)
filetype indent on " 为特定文件类型载入相关缩进文件
set viminfo+=! " 保存全局变量
set iskeyword+=_,$,@,%,#,- " 带有如下符号的单词不要被换行分割
syntax on " 语法高亮
syntax enable " 打开语法高亮
set nobackup " 不要备份文件(根据自己需要取舍)
set noswapfile " 不要生成swap文件,当buffer被丢弃的时候隐藏它
set bufhidden=hide
set linespace=0 " 字符间插入的像素行数目
set wildmenu " 增强模式中的命令行自动完成操作
set ruler " 在状态行上显示光标所在位置的行号和列号
set rulerformat=%20(%2*%

下面是搜索和匹配的基本配置:
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 搜索和匹配
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set showmatch " 高亮显示匹配的括号
set matchtime=5 " 匹配括号高亮的时间(单位是十分之一秒)
set ignorecase " 在搜索的时候忽略大小写
set incsearch " 在搜索时,输入的词句的逐字符高亮(类似firefox的搜索)

文本格式和排版:
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 文本格式和排版
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set formatoptions=tcrqn " 自动格式化
set autoindent " 继承前一行的缩进方式,特别适用于多行注释
set nu " 显示行号
set textwidth=79
set smartindent " 为C程序提供自动缩进
set cindent " 使用C样式的缩进
set tabstop=4 " 制表符为4
set softtabstop=4 " 统一缩进为4
set shiftwidth=4
set expandtab " 用空格代替制表符
set smarttab " 自动换行

四、窗口布局类经典插件

我用到的桌面而已插件主要有:WinManager/netrw/TagList/BufExplorer/NeedTree。先看截图:


WinManager插件

 
1)下载地址:http://www.vim.org/scripts/download_script.php?src_id=754
2)安装详解见:http://www.vim.org/scripts/script.php?script_id=953)帮助手册查看:   :help winmanager
4)功能: 管理各个窗口, 或者说整合各个窗口.
5)使用方法:
在.vimrc中加入如下设置:
     let g:winManagerWindowLayout='FileExplorer|BufExplorer'  // 这里可以设置为多个窗口, 如'FileExplorer|BufExplorer|TagList'
let g:persistentBehaviour=0 // 只剩一个窗口时, 退出vim.
let g:winManagerWidth=20
let g:defaultExplorer=1
nmap fir :FirstExplorerWindow
nmap bot :BottomExplorerWindow
nmap wm :WMToggle
6)使用例子
     在终端输入vim启动vim:
     在正常模式下, 敲入 ",wm" 即可看到, vim的左侧新建了两个窗口:FileExplorer和
     BufExplorer, 这样我们即可在FileExplorer窗口很方便地对目录进行查看, 编辑等操作; 在BufExplorer窗口中查看当前vim已经打开那些文件.

TagList插件

 
Taglist依赖与ctags,如果系统没有ctags,记得下载安装ctags.
1)下载地址:http://www.vim.org/scripts/download_script.php?src_id=7701
2)安装详解:http://www.vim.org/scripts/script.php?script_id=2733)帮助手册查看:   :help taglist
4)功能: SI能够把当前文件中的宏、全局变量、函数等tag显示在Symbol窗口,用鼠标点上述tag,就跳到该tag定义的位置;可以按字母序、该tag所属的类或scope,以及该tag在文件中出现的位置进行排序;如果切换到另外一个文件,Symbol窗口更新显示这个文件中的tag。
5)使用方法:
在.vimrc中加入如下设置:
let Tlist_Sort_Type="name" " 按名称默认排序
let Tlist_Use_Right_Window=1 " 在右侧显示窗口
let Tlist_Compart_Format=1 " 压缩方式
let Tlist_Exist_OnlyWindow=1 " 如果只有一个buffer,kill窗口也kill掉buffer
let Tlist_OnlyWindow=1
let Tlist_Max_Submenu_Items=10
let Tlist_Max_Tag_length=20
let Tlist_Use_SingleClick=0
let Tlist_Close_On_Select=0
let Tlist_File_Fold_Auto_Close=1 "不要关闭其他文件的tags,1让当前不被编辑的文件的方法列表自动折叠起来
let Tlist_GainFocus_On_ToggleOpen=1
let Tlist_Process_File_Always=1
let Tlist_Enable_Fold_Column=0 " 不要显示折叠树
let g:Tlist_Show_One_File=1 " only show tags for current window
"let Tlist_Auto_Open=0 " 启动vim 自动打开TagList
let Tlist_Show_Menu=1 " 显示taglist菜单
let Tlist_WinWidth=25 " taglist窗口宽度
let Tlist_WinHeight=10
let Tlist_Use_Horiz_Window=0
nmap tt :TlistToggle
6)使用例子
     在终端输入vim启动vim:
     在正常模式下, 敲入 "tt" 即可看到, vim的右侧新建了一个窗口:taglist,

netrw插件

在vim 7.0以前,文件浏览功能由explorer.vim插件提供,在vim 7.0中,这个插件被netrw.vim插件所代替。本文以vim 7.0为例,主要介绍netrw.vim插件。netrw.vim是vim的标准插件,它已经伴随vim而发行,不需要安装。
我们现在试一下vim文件功能,当你使用vim尝试打开目录时,vim会自动调用netrw.vim插件打开该目录(从操作系统的视角来看,目录其实是一种特殊的文件)。
这个窗口类似于文件管理器,你可以创建、删除、改名文件或目录;在目录上按回车时,会进入该目录;
在文件上按回车时,会使用vim打开该文件;可以更改排序方式、排序风格;隐藏目录或文件(使之不在上述窗口中显示)等等。

BufExplorer插件

1)下载地址:http://www.vim.org/scripts/download_script.php?src_id=14208
2)安装详解:http://www.vim.org/scripts/script.php?script_id=423)查看帮忙手册:  :help bufexplorer.txt
4)功能:缓冲区浏览
5)使用
BufExplorer功能比较简单,这里就不做介绍了。我的vimrc里这样设置BufExplorer插件:
let g:bufExplorerDefaultHelp=0       " Do not show default help.
let g:bufExplorerShowRelativePath=1 " Show relative paths.
let g:bufExplorerSortBy='mru' " Sort by most recently used.
let g:bufExplorerSplitRight=0 " Split left.
let g:bufExplorerSplitVertical=1 " Split vertically.
let g:bufExplorerSplitVertSize = 30 " Split width
let g:bufExplorerUseCurrentWindow=1 " Open in new window.
autocmd BufWinEnter \[Buf\ List\] setl nonumber
BufExplorer已经映射了几个键绑定,例如,使用”,bv“就可以打开一个垂直分割窗口显示当前的缓冲区。

NeedTree插件

NeedTree插件在此不做介绍,有兴趣的朋友可以自己研究一下,看看其与FileExplorer有什么不同。

智能提示类

omni全能补全插件

IDE最炫的功能之一肯定是智能提示了,vim的智能补全肯定少不了omni类插件,如omnicppcomplete/omnijavascriptcomplete/omnipythoncomplete/omnipythonrubycomplete等。
下载语言相关omni插件,根据需要做如下配置:
    autocmd FileType css set omnifunc=csscomplete#CompleteCSS
autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags
autocmd Filetype c setlocal omnifunc=ccomplete#Complete
autocmd Filetype cpp setlocal omnifunc=cppcomplete#Complete
autocmd Filetype python setlocal omnifunc=pythoncomplete#Complete
autocmd Filetype java setlocal omnifunc=javacomplete#Complete
autocmd FileType php set omnifunc=phpcomplete#CompletePHP
autocmd FileType ruby set omnifunc=rubycomplete#Complete
autocmd FileType perl set omnifunc=perlcomplete#Complete
vim支持以下补人方式:
整行补全                        CTRL-X CTRL-L
根据当前文件里关键字补全        CTRL-X CTRL-N
根据字典补全                    CTRL-X CTRL-K
根据同义词字典补全              CTRL-X CTRL-T
根据头文件内关键字补全          CTRL-X CTRL-I
根据标签补全                    CTRL-X CTRL-]
补全文件名                      CTRL-X CTRL-F
补全宏定义                      CTRL-X CTRL-D
补全vim命令                     CTRL-X CTRL-V
用户自定义补全方式              CTRL-X CTRL-U
拼写建议                        CTRL-X CTRL-S 

autocomplpop插件

首 先Vim是内建代码补全功能的,在不需要通过任何设置的情况下就能使用。在您编辑代码的时候,键入 ctrl+x, ctrl+o, ctrl+n, ctrl+p 等快捷键,就会弹出智能提示的菜单。但是这仍然不满足大家的要求。大多数IDE中,只要代码输入到相应的位置,补全提示就会自动的弹出来,而vim的这种 补全还需要自己手动的来触发。那么下面就介绍一种可以自动弹出补全提示的插件 — autocomplpop
1)功能:自动弹出提示
2)下载:http://www.vim.org/scripts/script.php?script_id=1879
3)安装:http://www.vim.org/scripts/script.php?script_id=1879
4)使用:安装后重启一下vim就会发现在编码时会自动弹出提示了。
细心的朋友会发现,光是利用 autocomplpop这个插件还远远达不到要求。比如说:在c++中使用.或是->访问对象或指针中的成员和函数时还无法自动弹出提示,另外, 即便是自动提示也只能提示我们在当前文档中已输入的字符串。针对这种情况,我们就需要和Omni插件家族配合使用。 

XptTemplate插件

1)功能:代码块自动补全,比如for,if,while等结构和一些语言特性的结构
2)下载:http://www.vim.org/scripts/script.php?script_id=2611
3)安装:http://www.vim.org/scripts/script.php?script_id=26114)使用:
在.vimrc在加入如下配置:
set nocompatible
let g:xptemplate_key = '' "xpt uses as trigger key, default:
let g:xpttemplate_key_pum_only = '' " default:

需要注意的是,如果上述配置生效,此插件和supertab插件会存在冲突。

代码追踪

IDE另一项强大的功能就是代码跟踪,比如看调用函数在哪里定义,哪些地方调用此函数,跳转到源代码处等。在这里和大家推荐vim的两大利器Ctags/Cscope.

cscope

按照vim里cscope的参考手册(在vim中执行”:help cscope”命令),把cscope功能加到.vimrc里后(需要你的vim在编译时选择了”–-enable-cscope”选项,否则你需要重新编译vim),配置就算完成了。然后用下面的命令生成代码的符号索引文件:
cscope -Rbkq
这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。
其中cscope.out是基本的符号索引,后两个文件是使用”-q”选项生成的,可以加快cscope的索引速度。
上面所用到的命令参数,含义如下:
  • -R: 在生成索引文件时,搜索子目录树中的代码
  • -b: 只生成索引文件,不进入cscope的界面
  • -k: 在生成索引文件时,不搜索/usr/include目录
  • -q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度

接下来,就可以在vim里读代码了。 不过在使用过程中,发现无法找到C++的类、函数定义、调用关系。仔细阅读了cscope的手册后发现,原来cscope在产生索引文件时,只搜索类型为C, lex和yacc的文件(后缀名为.c, .h, .l, .y),C++的文件根本没有生成索引。不过按照手册上的说明,cscope支持c++和Java语言的文件。 于是按照cscope手册上提供的方法,先产生一个文件列表,然后让cscope为这个列表中的每个文件都生成索引。 为了方便使用,编写了下面的脚本来更新cscope和ctags的索引文件:
#!/bin/sh
find . -name "*.h" -o -name "*.c"-o -name "*.cc" -o -name "*.cpp" > cscope.files
cscope -bkq -i cscope.files
ctags -R
这个脚本,首先使用find命令,查找当前目录及子目录中所有后缀名为”.h”, “.c”和”.cc”的文件,并把查找结果重定向到文件cscope.files中。
然后cscope根据cscope.files中的所有文件,生成符号索引文件。
最后一条命令使用ctags命令,生成一个tags文件,在vim中执行”:help tags”命令查询它的用法。它可以和cscope一起使用。

ctags

Tag文件(标签文件)无疑是开发人员的利器之一,有了tag文件的协助,你可以在vim查看函数调用关系,类、结构、宏等的定义,可以在任意标签中跳转、返回……相信使用过Source Insight的人对这些功能并不陌生,而在vim中,此功能的实现依赖于tag文件。

对于程序来说,Tag文件中保存了诸如函数、类、结构、宏等的名字,它们所处的文件,以及如何通过Ex命令跳转到这些标签。它是一个纯文本文件,因此你可以手工的编辑它,也可以使用脚本对其进行操作。

通常我们使用名为ctags的程序来生成这样的tag文件。vim能直接使用ctags程序所生成的tag文件。在UNIX系统下的ctags功能比较少,所以一般我们使用Exuberant Ctags(在大多数Linux系统上,它是缺省的ctags程序),它能够支持多达33种程序语言,足以满足我们开发的需要了。

Tag文件需要遵循一定的格式,由Exuberant Ctags生成的tag文件,缺省是如下格式:
  1. {tagname} {TAB} {tagfile} {TAB} {tagaddress} {term} {field} ..
  2. {tagname} – 标识符名字,例如函数名、类名、结构名、宏等。不能包含制表符。
  3. {tagfile} – 包含 {tagname} 的文件。它不能包含制表符。
  4. {tagaddress} – 可以定位到 {tagname}光标位置的 Ex 命令。通常只包含行号或搜索命令。出于安全的考虑,vim会限制其中某些命令的执行。
  5. {term} – 设为 ;” ,这是为了兼容Vi编辑器,使Vi忽略后面的{field}字段。
  6. {field} .. – 此字段可选,通常用于表示此{tagname}的类型是函数、类、宏或是其它。
在{tagname}、{tagfile}和{tagaddress}之间,采用制表符(TAB符,即C语言中的”\t”)分隔,也就是说{tagname}、{tagfile}的内容中不能包含制表符。
Tag文件的开头可以包含以”!_TAG_”开头的行,用来在tag文件中加入其它信息。vim能够识别两种这样的标记,经常用到的是”_TAG_FILE_SORTED”标记,例如:
!_TAG_FILE_SORTED1{anything}
上面这个标记说明tag文件是经过排序的,并且排序时区分了大小写,对排序的tag,vim会使用二分法来进行查找,大大加快了查找速度;如果值为0,则表示tag文件未经排序;如果值为2,则表示tag文件是忽略大小写排序的。

要使用ctags可以不在.vimrc中配置,不过在项目中要加入tags的话,需要执行如下命令:
:set tags+=./tags

附件:http://zhoubo-wordpress.stor.sinaapp.com/uploads/2011/12/vim.tar.gz
参考资料: http://easwy.com/blog/archives/advanced-vim-skills-catalog/ http://blog.csdn.net/tge7618291/article/details/4216977
posted @ 2011-12-30 13:35  残夜  阅读(2010)  评论(5编辑  收藏  举报