vim常用插件安装与使用

vim可以使用插件管理器vundle来进行管理,vundle把git操作整合进去,用户需要做的只是去Github上找到自己想要的插件的名字,安装,更新和卸载都可用vundle来完成了。下面先介绍下安装vundle的方法。

插件管理器vundle

vundle安装

在安装vundle之前,要保证系统中已经安装有git和curl,如果没有,在Ubuntu系统中使用apt-get install进行安装,vim要使用7.3版本以上的,Ubuntu系统中vim版本较高,能达到安装要求,推荐在Ubuntu系统中使用和安装vim。

  • 1.在用户的家目录下,新建.vim/bundle目录
  • 2.进入bundle目录,然后执行git clone https://github.com/gmarik/Vundle.vim.git
    1. 在用户家目录(~)下,创建一个.vimrc配置文件,将下面的代码拷贝到该文件内。

.vimr文件内容(”后面的注释,文件里也包含下面要介绍的插件所需配置,可以直接拷贝使用)

set nocompatible              " be iMproved, required
filetype off                  " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'gmarik/Vundle.vim'

" The following are examples of different formats supported.
" Keep Plugin commands between vundle#begin/end.
" plugin on GitHub repo
Plugin 'jiangmiao/auto-pairs'
Plugin 'vim-scripts/taglist.vim'
Plugin 'vim-scripts/a.vim'
Plugin 'vim-scripts/OmniCppComplete'
Plugin 'ervandew/supertab'
Plugin 'fholgado/minibufexpl.vim'
Plugin 'scrooloose/nerdtree'
Plugin 'vim-scripts/winmanager'
Plugin 'scrooloose/nerdcommenter'
Plugin 'bling/vim-airline'
Plugin 'kien/ctrlp.vim'
Plugin 'vim-scripts/EasyGrep'
Plugin 'godlygeek/tabular'
Plugin 'plasticboy/vim-markdown'
Plugin 'scrooloose/syntastic'
Plugin 'tpope/vim-surround'

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList       - lists configured plugins
" :PluginInstall    - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line

set nu
set tabstop=4
set softtabstop=4
set shiftwidth=4
set autoindent
set cindent
set smartindent
set encoding=utf-8
syntax enable
syntax on

" Ctags
nmap <C-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
set tags+=~/.vim/systags

" Taglist
let Tlist_Ctags_Cmd = '/usr/bin/ctags'  "设定linux系统中ctags程序的位置
let Tlist_Show_One_File=1 "不同时显示多个文件的tag,只显示当前文件的
let Tlist_Exit_OnlyWindow=1 "如果taglist窗口是最后一个窗口,则退出vim
let Tlist_Use_Right_Window=1 "在右侧窗口中显示taglist窗口
nmap <F8> :TlistToggle<CR> "使用F8快捷键调出Taglist

" cscope
set cscopequickfix=s-,c-,d-,i-,t-,e-

" SuperTab
let g:SuperTabDefaultCompletionType="context"

" MiniBufExplorer
let g:miniBufExplMapWindowNavVim=1
let g:miniBufExplMapWindowNavArrows=1
let g:miniBufExplMapCTabSwitchBufs=1
let g:miniBufExplModSelTarget=1
let g:miniBufExplMoreThanOne=0

" WinManager
let g:NERDTree_title="[NERDTree]"
let g:winManagerWindowLayout="NERDTree|TagList"

function! NERDTree_Start()
    exec 'NERDTree'
endfunction

function! NERDTree_IsValid()
    return 1
endfunction

nmap <C-m> :WMToggle<CR>

" NerdCommenter
let mapleader = ","

" vim-airline
set laststatus=2

" vim-markdown
let g:vim_markdown_math=1
let g:vim_markdown_frontmatter=1

" syntastic
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0

vundle使用

  • 1.添加新的插件记录

安装插件前,首先要将插件对应的名称,添加到.vimrc配置文件中,根据插件来源不同,可以有下面三种情况。

(1)如果你的插件来自github,写在下方,只要作者名/项目名就行了,现在很多插件都放在github中管理,而且下载安装很快,所以最推荐使用这种方式。

Plugin 'tpope/vim-fugitive'  

(2)如果插件来自 vim-scripts,直接写插件名就行了。

Plugin 'L9'  

(3)如使用自己的git库的插件,像下面这样做:

Plugin 'git://git.wincent.com/command-t.git'
  • 2.安装插件

.vimrc中添加要安装的插件之后,然后运行vim在命令模式执行:PluginInstall(按tab可以命令补全),它会逐个安装插件(之前已经安装过的插件不会重新安装)
这时候打开了一个窗口显示安装的进度,安装完之后,输入:bdelete删除缓冲区,并且会关闭安装窗口。

  • 3.卸载插件

先在.vimrc中删除该插件的对应的记录 即 Plugin '...',然后在vim中执行:PluginClean,然后会列出要删除的插件,并询问是否继续,输入y继续,即可删除。

  • 4.更新插件

输入:PluginUpdate,然后会逐个查找更新进行安装,或者输入:PluginInstall!,其中!表示的意思是重新安装所有的插件,这样也可以重新获得最新的插件。安装完之后,可以在vundle插件安装窗口,输入u查看哪些插件被更新了。

  • 5.列出被vundle管理的插件

在vim命令模式下输入:PluginSearch!,其中!表示要从vim script站点更新插件列表。这样会列出vundle管理的所有插件,也可以搜索某个特定的插件:PluginSearch! markdown。如果最近更新过本地数据库,!可以不加。找到插件之后,可以通过移动光标到要安装的插件上,然后按i会进行安装,但是这里安装后,并不会自动更新.vimrc中的信息。所以不推荐这种方式安装,最好还是先在.vimrc中添加相应条目之后,然后输入:PluginInstall

插件介绍

auto-pairs

该插件可以实现括号和引号的自动补全,非常方便。

ctags

系统内置的 ctags 功能太弱,推荐大家安装 exuberant ctags
,在Ubuntu下用下面命令安装:

apt-get install -y ctags

使用Ctags的也很简单。 进入我们的项目代码根目录,执行以下命令:

ctags -R --c++-kinds=+p --fields=+iaS --extra=+q 

参数解释
-R:ctags循环生成子目录的tags
--c++-kinds=+px:ctags记录c++文件中的函数声明和各种外部和前向的声明
--fields=+iaS:ctags要求描述的信息,其中i表示如果有继承,则标识出父类;a表示如果元素是类成员的话,要表明其调用的权限(即是public还是private);S表示如果是函数,则标识函数的signature。
--extra=+q:强制要求ctags做如下操作—如果某个语法元素是类的一个成员,ctags默认会给其记录一行,可以要求ctags对同一个语法元素再记一行,这样可以保证在VIM中多个同名函数可以通过路径不同来区分。

由于上面我们已经在Vim中配置了Ctrl-F12组合快捷键,所以我们也可以进入代码根目录后,打开Vim,按下Ctrl-F12快捷键自动生成tags文件(注意要在vim中使用该快捷键,而不是在shell中使用)。

注意:在终端SecureCRT中,按Ctrl+F12,可能没反应,此时可以将Ctrl+F12改成F12即可,下次在终端中按F12即可调用ctags产生tags文件。

命令执行完后,会在源代码目录生成tags文件。Vim默认会自动读取当前目录下的tags文件,所以不需要修改~/.vimrc文件。

为系统头文件目录生成tags文件的方法,在shell中执行下面的命令:

ctags -I __THROW -I __attribute_pure__ -I __nonnull -I __attribute__ --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p --c++-kinds=+p --fields=+iaS --extra=+q -R -f ~/.vim/systags /usr/include /usr/local/include

(注意:上面这条是一个命令,中间不要分行)
执行这个命令的时候,可能会提示某几个文件不存在,这是因为这些文件是一个软连接文件导致的,除去这几个文件,能打开的文件,都会生成tags文件,所以有几个打不开,也不影响使用。
-I的意思是忽略后面的符号。
详细说明可以参考这里

然后在.vimrc中添加

set tags+=~/.vim/systags

这样使用代码补全插件的时候,系统函数也可以补全了,也可以用ctrl+]来调转到文件的声明处。

Cscope

提供交互式查询语言符号功能,如查询哪些地方使用某个变量或调用某个函数。
在Ubuntu下安装

apt-get install -y cscope

(1)使用Cscope需要生成cscope数据库文件。进入项目代码根目录运行命令:

cscope -Rbq -f path/xxx.out 

命令运行后会生成xxx.out文件,即cscope数据库文件。
(2)进入项目代码根目录,在Vim下运行命令(即在vim命令模式下输入):cs add path/xxx.out
此命令将cscope数据库载入Vim。

(3)Cscope常用的快捷键
ctrl+\ 然后再按s,查找所有当前光标所在符号出现过位置
ctrl+\ 然后再按c,查找所有调用当前光标所在函数的函数

按下快捷键查找结束后会在编辑区下方出现查找结果的列表,输入结果编号并回车,就能跳转到该查找结果在源代码中的相应位置。

为了界面更好看,可以把Cscope的查找结果输出到quickfix窗口,需要在~/.vimrc中加入下面这行:

set cscopequickfix=s-,c-,d-,i-,t-,e-

这样,通过快捷键查找某个符号后,会立即跳转到第一个找到的该符号出现的位置。如果你对这次默认跳转的位置不满意,在Vim命令行下运行cw命令,就能在编辑区下面quickfix窗口看到所有查找结果的列表,点击相应列表项就能跳转到相应位置。

更多功能可通过命令man cscope或在Vim命令行下运行:help cscope查询。

Taglist

taglist是一个用于显示定位程序中各种符号的插件,例如宏定义、变量名、结构名、函数名这些东西 我们将其称之为符号(symbols),而在taglist中将其称之为tag。显然,要想将程序文件中的tag显示出来,需要事先了解全部tag的信 息,并将其保存在一个文件中,然后去解析对应的tag文件。taglist做的仅仅是将tag文件中的内容解析完后显示在Vim上而已。tag扫描以及数 据文件的生成则是由ctags(Exuberant Ctags)这一工具完成的,所以在使用taglist之前,你的电脑需要装有ctags。

安装完之后,在.vimrc,加入以下几行:

let Tlist_Show_One_File=1 
let Tlist_Exit_OnlyWindow=1
let Tlist_SHow_Menu=1
let Tlist_File_Fold_Auto_Close=1
nmap <F8> :TlistToggle<CR>

这样下次使用F8键,即可打开Taglist

插件使用

  • 在vim中执行的命令

:Tlist(之前老版本使用的命令,现在新版推荐使用:TlistToggle)打开Taglist窗口,再次运行:Tlist则关闭。
ctrl+ww可以切换Taglist窗口和vim窗口。

  • 在Taglist窗口中执行的命令

回车:会调到光标下tag所定义的位置,与用鼠标双击是一样的。
o:在一个新打开的窗口中显示光标下的tag。
s:更改排序方式,在按名字排序和按出现顺序排序间切换
x:taglist窗口放大和缩小,方便查看较长的tag
+:打开一个折叠
-:将tag折叠起来
*:打开所有折叠
=:将所有tag折叠
[[:跳到前一个文件
]]:跳到后一个文件
q:关闭Taglist窗口
F1:显示帮助。

当然大部分操作都可以被鼠标取代,如果鼠标在vim中点击无效。可以在.vimrc中添加

set mouse=a " always use mouse

我们可以通过Ctrl-w快捷键或鼠标点击在Taglist窗口和编辑区之间切换焦点,在Taglist窗口用鼠标或键盘选择某个符号,然后点击或回车,就可以跳转到该符号定义的位置。

A

实现源程序和头文件之间的切换

插件使用

:A头文件和原文件之间切换,它是指将同名的源程序和.h文件之间进行切换,如果源程序没有.h文件,则它会创建一个,并切换。比如你正在编辑foo.c然后你需要编辑foo.h,此时仅需要:A即可切换到foo.h进行编辑,如果想再回到foo.c,则再次执行:A即可
:AS将窗口分成上下两部分,并切换
:AV将窗口分成左右两部分,并切换(V表示竖直分割)
:AT新建标签窗口后,并切换
:AN在多个匹配的文件循环切换

以下几个是将光标所在处的单词作为文件名打开

:IH切换至光标所在的文件
:IHS分割窗口后切换至光标所在的文件(指将光标所在处单词作为文件名打开)
:IHV垂直分割窗口后切换
:IHT新建标签式窗口后切换
:IHN在多个匹配文件之间循环切换

快捷键操作:

<leader>ih切换到光标所在的文件
<leader>is切换至光标所在处(单词所指)文件的配对文件(如光标所在处为foo.h,则切换至foo.c/foo.cpp…),即在.h上会切换到对应的.c,在.c上会切换到对应的.h文件
<leader>ihn在多个匹配文件间循环切换

OmniCppComplete

跟Talist一样,OmniCppComplete也同样依赖与Ctags工具生成的tags文件,实现代码的自动补全。 OmniCppComplete的使用几乎跟VS下的VA一样。

安装完之后在~/.vimrc中加入以下两行

set nocp
filetype plugin on

插件使用

因为它要使用ctags生成的文件,所以当在vim输入文件时候,先保存文件,然后在普通模式下,然后按ctrl+f12,创建或者更新tags文件,这样后面再次输入类似的变量名或者成员函数的时候,会有提示信息,而不用每次按tab键,要注意先保存,然后再生成tags文件,因为如果不保存,新输入的内容还在缓冲区,没有写到磁盘文件中,此时如果允许ctags程序,它实际上还是根据原来的源程序生成的tags文件,所以就相当于没有更新tags文件,所以写完的程序一定要保存后再进行其他的操作。

类似的插件

  • YouCompleteMe:代码补全功能,集成了多个插件(比如syntastic),和ide一样自动补全,不用再去生成tags文件,使用vundle安装后,需要先编译才能使用,参考这篇文章

  • Neocomplete:该插件维护了当前buffer的一个关键词列表,从而提供强大的关键词补全功能。
    作者给出了相应的配置,直接复制即可。
    但是要求vim要7.3以上,在Ubuntu系统中要用apt-get 安装vim-nox,vim-gtk,vim-gnome,vim-athena等软件包

SuperTab

使Tab快捷键具有更快捷的上下文提示功能。因为上面的代码补全虽然支持tab补全,但是不支持shift-tab进行回退选择,supertab就是为了增强tab功能,可以做到这点。

~/.vimrc文件中加入:

let g:SuperTabDefaultCompletionType="context"

SuperTab使用很简单,只要在输入变量名或路径名等符号中途按Tab键,就能得到以前输入过的符号列表,并通过Tab键循环选择。

MiniBufExplorer

提供多文件同时编辑功能,当打开多个文件时,会在上方显示,类似于选项卡。
~/.vimrc文件中加入以下几行:

let g:miniBufExplMapWindowNavVim = 1   
let g:miniBufExplMapWindowNavArrows = 1   
let g:miniBufExplMapCTabSwitchBufs = 1   
let g:miniBufExplModSelTarget = 1  
let g:miniBufExplMoreThanOne=0  

插件使用

:bn切换到当前buffer的下一个
:bp切换到当前buffer的前一个
:b num 打开指定的buffer,num是buffer开始的那个数字,比如:b8,b和数字可以加空格也可以不加。

NERDTree

可以在Vim中浏览文件系统并且打开文件或目录。

WinManager

上面介绍了用于文件浏览的nerdtree以及浏览程序符号的taglist,这两个插件都会以窗口的形式出现在Vim的窗口中,那么如何合理的安排它们,这就是winmanager的作用。

我们利用winmanager将nerdtree和taglist放到同一个”侧边栏”中,nerdtree在上方,taglist在下方。

~/.vimrc文件中加入以下几行:

let g:NERDTree_title="[NERDTree]"  
let g:winManagerWindowLayout="NERDTree|TagList"  

function! NERDTree_Start()  
    exec 'NERDTree'  
endfunction  

function! NERDTree_IsValid()  
    return 1  
endfunction  

nmap <C-m> :WMToggle<CR>

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

function! <SID>ToggleWindowsManager()  
   if IsWinManagerVisible()  
      call s:CloseWindowsManager()  
   else  
      call s:StartWindowsManager()  
      exe 'q'  
   end  
endfunction  

现在进入我们的项目目录,打开Vim,按下组合快捷键Ctrl+m键就可以我们的崭新的Vim了!再次按下Ctrl+m就可关闭界面。

NerdCommenter

与NERDTree同属于一个作者。在Vim中可以快速的注释/取消注释多行代码,同时在行尾追加注释并自动进入Insert模式可以方便的进行行内注释。

插件使用

默认<leader>\,也可以改成英文逗号(在上面的.vimrc中我已经把<leader>改成,),命令可以在normal模式和visual模式使用,visual使用时是对选定的区块进行注释或反注释。
通常很多命令是可以指定行数的,即将当前行即下面几行一起注释掉。如果不输入行数,即默认是1,即只注释当前行。

[count]<leader>cc:(第一个c含义是comment,第二个c是current)注释当前行,在可视模式下,是注释选中的部分,如果选择的是行,则将行注释掉,如果是多行,则每行都被分别注释掉。如果选择的的一行中某一部分,则只是将选中部分注释掉。
[count]<leader>cn:(n的含义是nesting嵌套,即将当前行注释掉),和cc类似,只是强制嵌套注释。
[count]<leader>cm:(m的含义是minimal),即对选中的多行,使用一个注释符号,比如在c中,可以将多行放到/* */,即使当前使用的注释符是//,则如果用cm,也是会调用/* */来注释的,即使进注释一行,它也会用/**/
[count]<leader>ci:(i可以认为是individually)选中的每一行单独注释
[count]<leader>cs:以性感的方式注释(s的含义是sexily),比较美观,适合于在函数前面的段注释说明。
[count]<leader>cu:取消注释(u的含义是uncomment),cu也很智能,如果某一行只剩下半个*/没被去掉,则再次运行<leader>cu那半个*/也会被去掉的。

上面这些count,可以在普通模式下输入数字,也可以在可视模式下,通过选取的方式得到。

<leader>c$:在当前行,从光标处注释到行尾,该命令不能指定对下面几行都执行这种操作。
<leader>cA:在当前行末尾插入注释符(A即append),并进入插入模式,很常用。
<leader>ca:切换注释的风格(a即alternative切换之意),比如c++中有/* *///两种方式,如果接下来想使用//,在按一次 <leader>ca即切换,但是它相当于将接下来使用的注释符号切换,而不会将前用/* */已经注释的切换成//,按完之后,在下方状态栏会提示现在用那种注释符号。

如果想在空白行插入注释,则<leader>cc,cn,ci都失效,只有<leader>cm<leader>cA,<leader>cs可以使用,如果当前注释符使用//,则cm插入的是/**/<leader>cA插入的是//,而<leader>cs插入的是

/*
 *
 */

如果是对函数加上说明信息,使用<leader>cs最好看。使用<leader>cm注释一个空白行之后,如果在中间换行,显示的效果与<leader>cs显示的效果是一样的,新的换行前面也会有 *
:h nerdcommenter:查看帮助用

vim-airline

增强vim下方状态栏显示

安装后在.vimrc中添加

set laststatus=2

Ctrlp

主要的功能是对文件进行模糊的查找,如果你的project目录结构复杂,或者你正在阅读一个较大的项目的话,那么ctrlp可以帮你快速的定位到你想要文件而不必在终端不断的cd、ls。按ctrl+p进行模糊查找。

插件使用

ctrl+p调用该插件,如果想关闭按Esc键。
ctrl+fctrl+b:在各个模式下切换
ctrl+d:使用文件名搜索代替全路径搜索(按完之后,提示符会有个d标识)再按一次ctrl+d又切换回原来模式
ctrl+r:使用正则模式,前面会有个r标识,再按一次退出该模式
ctrl+jctrl+k上下选择文件
ctrl+tctrl+vctrl+x在新的tab或新的分割窗口中打开选择的文件
ctrl+nctrl+p:找到之前或者之后查找的字符串
ctrl+y:创建一个新文件

EasyGrep

Vim是内置支持Grep的,Vim7.3更是更新了Grep的引擎,在Vim内Grep的速度更快了。但是Vim中的Grep一样不容易掌握,还好有很多简化Grep的插件可以用,包括grep的变种ack,这其中使用起来最方便的,最人性化的要数EasyGrep了。

vim-markdown

书写markdown文件时,支持语法高亮。

如果使用vundle安装,要在.vimrc中加上下面两句:

Plugin 'godlygeek/tabular'
Plugin 'plasticboy/vim-markdown'

因为安装vim-markdown,要先安装tabular,它是一个用于文本对齐的插件。

.vimrc中设置:

let g:vim_markdown_math=1
let g:vim_markdown_frontmatter=1

syntastic

可以使用编译器进行语法检测,在vim中输入:w进行保存,此时,它会调用外部语法检测,对文件中出现的语法错误,给出提示。

推荐配置:

set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0

let g:molokai_original = 1
let g:rehash256 = 1

vim-surround

可以方便的为选中的文本加上分隔符。

插件使用

在可视模式下,选择相应的文本,然后按S加上相应的符号比如’,”,),}就会用相应符号对这个文本加上相应的分隔符,用)]}会将里面的文本仅仅包围,而用([{会与文本之间留有空格。
例子:”hello world!”,将光标移动到”内(包括移动到”),然后按cs"',这样就将其改成’hello world!’,即将光标移动到分隔符内,然后用cs加原来的分隔符再加想更改的分隔符,就可以将分隔符进行更改。
然后再次按cs’就可以将上面变成Hello world!,想要删除引号,用ds”,则Hello world两边引号就去掉了。