参考
http://blog.youkuaiyun.com/wooin/article/details/1858917
http://blog.chinaunix.net/uid-8902505-id-3506303.html
本文所用环境 vim7.4 , ubuntu操作系统
1、安装vim的基本插件
sudo apt-get install vim-scripts vim-doc
2、vim基本配置
vim系统配置文件(如果以 apt-get install vim方式安装的)在/etc/vim/.vimrc,系统安装目录在/usr/share/vim/vim74,在该目录下有插件文件夹plugin和插件说明文档doc。我们增加插件和对vim配置的时候最好不要修改系统的配置文件和系统安装目录下的文件夹,可以在用户主目录下新建.vimrc配置文件和.vim插件目录。
cd %进入用户主目录
mkdir .vim
cd .vim
mkdir plugin
mkdir doc
后面新添加插件及其说明文档则放在plugin和doc里,尽管放心按照上面的目录vim会识别到的。
(下面的插件如无特殊说明,则安装时均可通过官网下载该插件的*.vim文件放到plugin目录下,*.doc文件放在doc目录下)
在~/.vimrc配置文件中先添加一些基本的配置,包括语法高亮、设置行数、状态显示等
" Uncomment the next line to make Vim more Vi-compatible
" NOTE: debian.vim sets 'nocompatible'. Setting 'compatible' changes numerous
" options, so any other options should be set AFTER setting 'compatible'.
set nocompatible
" Vim5 and later versions support syntax highlighting. Uncommenting the
" following enables syntax highlighting by default.
if has("syntax")
syntax on " 语法高亮
endif
colorscheme desert " elflord ron peachpuff default 设置配色方案,vim自带的配色方案保存在/usr/share/vim/vim72/colors目录下
" detect file type
filetype on
filetype plugin on
" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
set background=dark
" Uncomment the following to have Vim jump to the last position when
" reopening a file
if has("autocmd")
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
"have Vim load indentation rules and plugins according to the detected filetype
filetype plugin indent on
endif
" The following are commented out as they cause vim to behave a lot
" differently from regular Vi. They are highly recommended though.
set ignorecase " 搜索模式里忽略大小写
set smartcase " 如果搜索模式包含大写字符,不使用 'ignorecase' 选项。只有在输入搜索模式并且打开 'ignorecase' 选项时才会使用。
set autowrite " 自动把内容写回文件: 如果文件被修改过,在每个 :next、:rewind、:last、:first、:previous、:stop、:suspend、:tag、:!、:make、CTRL-] 和 CTRL-^命令时进行;用 :buffer、CTRL-O、CTRL-I、'{A-Z0-9} 或 `{A-Z0-9} 命令转到别的文件时亦然。
set autoindent " 设置自动对齐(缩进):即每行的缩进值与上一行相等;使用 noautoindent 取消设置
"set smartindent " 智能对齐方式
set tabstop=4 " 设置制表符(tab键)的宽度
set softtabstop=4 " 设置软制表符的宽度
set shiftwidth=4 " (自动) 缩进使用的4个空格
set cindent " 使用 C/C++ 语言的自动缩进方式
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s "设置C/C++语言的具体缩进方式
"set backspace=2 " 设置退格键可用
set showmatch " 设置匹配模式,显示匹配的括号
set linebreak " 整词换行
set whichwrap=b,s,<,>,[,] " 光标从行首和行末时可以跳到另一行去
"set hidden " Hide buffers when they are abandoned
set mouse=a " Enable mouse usage (all modes) "使用鼠标
set number " Enable line number "显示行号
"set previewwindow " 标识预览窗口
set history=50 " set command history to 50 "历史记录50条
"--状态行设置--
set laststatus=2 " 总显示最后一个窗口的状态行;设为1则窗口数多于一个的时候显示最后一个窗口的状态行;0不显示最后一个窗口的状态行
set ruler " 标尺,用于显示光标位置的行号和列号,逗号分隔。每个窗口都有自己的标尺。如果窗口有状态行,标尺在那里显示。否则,它显示在屏幕的最后一行上。
"--命令行设置--
set showcmd " 命令行显示输入的命令
set showmode " 命令行显示vim当前模式
"--find setting--
set incsearch " 输入字符串就显示匹配点
set hlsearch
2、添加C/C++函数高亮
vim安装目录下的syntax里面已经有了c.vim和cpp.vim,使得关键字啥的可以高亮了。
参照上面吴垠老大的配置,添加了一个函数高亮的配置
为了不在安装目录下进行修改,在上面建立的~/.vim目录下新建syntax目录,同时新建c.vim和cpp.vim,分别在这两个文件里添加
"hlight Functions
syn match cFunctions "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2
syn match cFunctions "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1
hi cFunctions gui=NONE cterm=bold ctermfg=green
3、添加ctags插件,在代码间反复跳动
安装:
1、sudo apt-get isntall ctags
2、到http://ctags.sourceforge.net/下载源码压缩包 ctags-5.8.tar.gz,解压到想安装的目录里,运行./make
ctags是通过对需要进行查看索引的程序源码目录建立标签目录结构,再根据生成的标签目录进行各种跳转
生成标签目录结构的基本命令使
ctags -R *
-R 表示对其子目录递归索引
* 表示针对当前目录下所有文件和目录
这时会在当前目录下生成一个tags文件,在vim里通过增加该tags文件即可应用跳转的一些快捷键了。
ctags设置,在.vimrc文件里添加下面内容
"--ctags setting--
"按下F5重新生成当前目录下的tag文件,并更新taglist,每次添加了新的函数、类、宏定义等数据后按F5更新
map<F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
imap<F5><ESC> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
set tags=tags
set tags+=./tags "将当前目录下的tags添加进来
set tags+=/usr/include/tags "将标准库目录下的tags添加进来,这一步是为了使标准库里的函数、类也能索引到,必须事先到/usr/include/目录下调用
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q 该命令生成所需的tags文件
接着即可在vim里运用ctags的命令
tag命令用法:
Ctrl+] 跳到当前光标下单词的标签
Ctrl+O 返回上一个标签
Ctrl+T 返回上一个标签
:tag TagName 跳到TagName标签
以上命令是在当前窗口显示标签,当前窗口的文件替代为包标签的文件,当前窗口光标跳到标签位置。如果不希望在当前窗口显示标签,可以使用以下命令:
:stag TagName 新窗口显示TagName标签,光标跳到标签处
Ctrl+W + ] 新窗口显示当前光标下单词的标签,光标跳到标签处
当一个标签有多个匹配项时(函数 (或类中的方法) 被多次定义),":tags" 命令会跳转到第一处。如果在当前文件中存在匹配,那它将会被首先使用。
可以用这些命令在各匹配的标签间移动:
:tfirst 到第一个匹配
:[count]tprevious 向前 [count] 个匹配
:[count]tnext 向后 [count] 个匹配
:tlast 到最后一个匹配
或者使用以下命令选择要跳转到哪一个
:tselect TagName
输入以上命令后,vim会为你展示一个选择列表。然后你可以输入要跳转到的匹配代号 (在第一列)。其它列的信息可以让你知道标签在何处被定义过。
以下命令将在预览窗口显示标签
:ptag TagName 预览窗口显示TagName标签,光标跳到标签处
Ctrl+W + } 预览窗口显示当前光标下单词的标签,光标跳到标签处
:pclose 关闭预览窗口
:pedit file.h 在预览窗口中编辑文件file.h(在编辑头文件时很有用)
:psearch atoi 查找当前文件和任何包含文件中的单词并在预览窗口中显示匹配,在使用没有标签文件的库函数时十分有用。
4、添加omnicppcomplete插件,自动补全C++代码
安装,
ominicppcomplete插件依赖于上面ctags生成的tags标签文件,因此,必须首先安装ctags,而且生成tags文件。
注意调用命令格式必须为
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q
这样才能使C++文件里的类名,函数标签等很好的补全
配置omnicppcomplete,在~/.vimrc中添加
" ====================================
" --configuration for omnicppcomplete--
" ====================================
set nocp
filetype plugin on
"<F4> to represent <C-X><C-O>,按F4自动补全,
imap <F4> <C-X><C-O>
"set namespaces in the current buffer and in include files
let OmniCpp_NamespaceSearch = 2
"set display mode to show all members of one class when omnicppcomplete
let OmniCpp_DisplayMode = 1
"set default search namespace std
let OmniCpp_DefaultNamespaces = ["std"]
"set :: automatically complete,按::能够自动显示出类或命名空间里的内容,默认不显示的。而.,->则是默认自动显示的
let OmniCpp_MayCompleteScope = 1
"setlect the first popup item but not insert it to the text
let OmniCpp_SelectFirstItem = 2
autocmd InsertLeave * if pumvisible() == 0|pclose|endif "当退出insert模式后自动退出预览窗口
omnicppcomplete常用命令
当自动补全下拉窗口弹出后(弹出下拉窗口可通过类对象+.,或者类指针+->,或者类名和命名空间+::,或者根据omnicppcomplete配置中的F4),一些可用的快捷键:(也可以直接运用前两个命令组合,不过这时弹出的补全菜单里仅显示出当前文件可补全的选项)Ctrl+P 向前切换成员
Ctrl+N 向后切换成员
Ctrl+E 表示退出下拉窗口, 并退回到原来录入的文字
Ctrl+Y 表示退出下拉窗口, 并接受当前选项
其他补全方式(很少用到)
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 补全宏定义
Ctrl+X Ctrl+V 补全vim命令
Ctrl+X Ctrl+U 用户自定义补全方式
Ctrl+X Ctrl+S 拼写建议
帮助文档
:help omnicppcomplete
5、cscope插件,ctags插件的功能加强版。
cscope可以进一步找到函数内部调用了哪些函数,以及哪些函数调用了该函数等
cscope配置,在~/.vimrc中添加如下脚本
"--scope setting --
if has("cscope")
set csprg=/usr/bin/cscope " 指定用来执行cscope的命令
set csto=0 " 设置cstag命令查找次序:0先找cscope数据库再找标签文件;1先找标签文件再找cscope数据库
set cst " 同时搜索cscope数据库和标签文件
set cscopequickfix=s-,c-,d-,i-,t-,e- " 使用QuickFix窗口来显示cscope查找结果
set nocsverb
if filereadable("cscope.out") " 若当前目录下存在cscope数据库,添加该数据库到vim
cs add cscope.out
elseif $CSCOPE_DB != "" " 否则只要环境变量CSCOPE_DB不为空,则添加其指定的数据库到vim
cs add $CSCOPE_DB
endif
set csverb
endif
"按下F6重新生成cscope数据库,并更新数据库
map <F6> :!cscope -Rbq <CR><CR> :cs add ./cscope.out <CR><CR><CR> :cs reset<CR>
imap <F6> <ESC> :!csope -Rbq <CR><CR> :cs add ./cscope.out <CR><CR><CR> :cs reset<CR>
"将:cs find c等Cscope查找命令映射为<C-_>c等快捷键(按法是先按Ctrl+Shift+-, 然后很快再按下c)
nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> :copen<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> :copen<CR><CR>
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 查找包含这个文件的文件
帮助文档
:help if_cscope.txt
6、TagList插件
Taglist用于列出了当前文件中的所有标签(宏, 全局变量, 函数名等)
配置taglist,在~/.vimrc中添加如下代码
"====================================
"--configure for Taglist--
"===================================
nmap <silent> tl :TlistToggle<CR>
let Tlist_Show_One_File=0 "让taglist可以同时展示多个文件的函数列表
let Tlist_Exit_OnlyWindow=1 "当taglist是最后一个分割窗口时,自动推出vim
"是否一直处理tags.1:处理;0:不处理
let Tlist_Process_File_Always=1 "实时更新tags
进入vim后按tl 即可打开/关闭taglist窗口
帮助文档
:help taglist.txt
7、minibuf插件
MiniBuf插件用于管理当前打开的vim文档
配置MiniBuf,在~/.vimrc中添加如下代码
"========================================
"---------configure for minibufexplorer--
"=======================================
let g:miniBufExplMapWindowNavVim = 1 "按下Ctrl + hjkl,切换窗口
let g:miniBufExplMapWindowNavArrows = 1 "按下ctrl + 方向箭头键切换窗口
let g:miniBufExplModSelTarget = 1 " 不要在不可编辑内容的窗口(如Taglist)中打开选中的buffer
当打开的vim文件超过1个时,MiniBuf管理窗口则会自动打开,当光标切换到MiniBuf窗口后,可通过下面命令进行操作
[Tab]:光标正向切换到不同的打开文件的buf上
[Shift + Tab]:光标反向切换到不同的打开文件的buf上
[Enter]:打开光标所在的buf的文件
d: 删除光标所在buf的文件
8、WinManager插件
WinManager用于统一管理FileExplorer窗口,TagList窗口和MiniBuf窗口。
FileExplorer窗口插件使由vim自带的netrw插件提供的,是一个文件管理的窗口,功能很强大。
可通过:help netrw.txt查看
配置WinManager插件,在~/.vimrc中添加如下代码
" ===================================
" --configure for winmannager--
" =================================
let g:winManagerWindowLayout='FileExplorer'
let g:persistentBehaviour=0
let g:winManagerWidth=40
let g:defaultExplorer=1
nmap <silent> wm :WMToggle<cr>
Normal模式下输入wm即可弹出WinManager窗口
9、a.vim插件
该插件比较小,无需特别配置
使用命令
:A 在同一个窗口内头文件/源文件间切换
:AS 当前窗口横向分裂打开头文件/源文件
:AV 当前窗口纵向分裂打开头文件/源文件
:AT 新建一个标签页打开头文件/源文件
10、Grep插件
该插件用于在当前目录下进行搜素。
其命令格式有
:Grep 按照指定的规则在指定的文件中查找
:Rgrep 同上, 但是是递归的grep
:GrepBuffer 在所有打开的缓冲区中查找
:Bgrep 同上
:GrepArgs 在vim的argument filenames (:args)中查找
:Fgrep 运行fgrep
:Rfgrep 运行递归的fgrep
:Egrep 运行egrep
:Regrep 运行递归的egrep
:Agrep 运行agrep
:Ragrep 运行递归的agrep
上面的命令是类似这样调用的:
:Grep [<grep_options>] [<search_pattern> [<file_name(s)>]]
:Rgrep [<grep_options>] [<search_pattern> [<file_name(s)>]]
:Fgrep [<grep_options>] [<search_pattern> [<file_name(s)>]]
:Rfgrep [<grep_options>] [<search_pattern> [<file_name(s)>]]
:Egrep [<grep_options>] [<search_pattern> [<file_name(s)>]]
:Regrep [<grep_options>] [<search_pattern> [<file_name(s)>]]
:Agrep [<grep_options>] [<search_pattern> [<file_name(s)>]]
:Ragrep [<grep_options>] [<search_pattern> [<file_name(s)>]]
:GrepBuffer [<grep_options>] [<search_pattern>]
:Bgrep [<grep_options>] [<search_pattern>]
:GrepArgs [<grep_options>] [<search_pattern>]
上述命令只有第一个常用,为了免去敲入命令的麻烦,用F3来代替命令输入,在~/.vimrc文件中添加如下配置
"==================================
"-----configure for Grep----------
"==================================
nmap <silent><F3> :Grep<CR>
当要搜素某个函数名、变量或者类时,将光标放在上面,然后按F3,
在最下面的命令行会显示
Search for pattern: ××××
此时你还可以编辑该行, grep支持正则表达式, 你想全词匹配的话可以改成:
Search for pattern: /<×××××/>
然后按下回车:
在最下面的命令行会显示:
Search in files: *
问你搜索范围, 默认是该目录下的所有文件, 此时你还可以编辑该行, 比如你只想搜索源码文件:
Search in files: *.c *.h
然后在按下回车, 会在弹出的QuickFix窗口中列出所有符合条件的搜索结果, 你可以在其中查找你想要的结果。
11、quickfix插件
quickfix可用于进行一些编译,但要会写好makefile文件,在编译时若出错会弹出quickfix窗口
quickfix帮助文档可查看
:help usr_30
:help quickfix
下面的命令运行 "make" (包括你所给出的参数) 程序并捕捉其运行结果: >
:make {arguments}
如果编译时出现错误,按 <Enter>,回到vim界面,看不到出错信息了!这时,可以运行以下命令
:cw[indow]
打开quickfix窗口来查看出错信息,它会自动跳到第一处出错的地方。然后,你可以双击出错某一条出错信息,vim就会自动跳转到相应的出错位置
:cn[ext] 光标移到下一个错误所在的行
:cp[revious] 光标移到上一个错误所在的行
:cfirst 到第一处错误
:clast 到最后一处错误
:cc 空间不够时,Vim 会缩短出错信息。如果你想查看详细信息,可以使用此命令
:cl[ist] 列出所有出错信息的概览(只有那些含有文件名或行数的错误信息会被显示,需要查看那些并不含文件名或行数的信息可用“:cl[ist]!”命令)
对于前面其他插件操作,如grep,cscope等弹出的quickfix窗口,都可通过上面命令操作,另外还有
:copen 打开quickfix窗口
:cclose 关闭quickfix窗口