a, vim打开某个文件, 执行命令,打开某个文件/目录: :e . :e ../../
b, 浏览下一个文件, :bn
c, 浏览上一个文件, :bN
在vim中执行命令” :e ~/src/vim70/src/ “
d, 打开和关闭行号: :set number
自动缩进: :set autoindent :set shiftwidth=4
在搜索时不区分大小写: :set ignorecase :set noignorecase 恢复区分大小写。还可以使用简写(:set ic 和 :set noic)
复合搜索: /echo 要想寻找包含字符串 echo、后面有零个或更多字符、之后是字符串 file 的第一行,应该使用 /echo.*file n 重复前一个命令
切换大小写: 可以切换游标下的字母字符的大小写,方法是按 Escape,然后按波浪号键(~)。这会在小写和大写之间来回切换。
保存部分内容: 可以保存当前编辑的文件的部分内容,方法是按 Escape,然后输入 :start,endw file,其中的 start 是当前文件中要保存的第一行,end 是要保存的最后一行,w 表示希望写到另一个文件中(或者覆盖现有的文件),file 是指定的部分要保存到的文件。对于最后一行,可以使用 $ 表示文件的末尾。可以在 w 后面使用两个大于号(>>)表示希望把内容附加到文件中而不是覆盖文件
vim fast key:
"for gvim map-
set ic smartcase
"let Tlist_File_Fold_Auto_Close=1
:map <F2> :set mouse=a<CR>
:map <F3> :Tlist<CR>
:map <F4> :A<CR>
:map <C-c> "+y<CR>
:map <C-v> "+gP<CR>
:map <C-x> "+x<CR>
:map <C-s> :w!<CR>
:map <C-z> u<CR>
:map <F5> :cs find d <C-R>=expand("<cword>")<CR><CR>
:map <F6> :cs find c <C-R>=expand("<cword>")<CR><CR>
:map <F7> :cs find g <C-R>=expand("<cword>")<CR><CR>
"F8 high light show-
:map <F8> \hl<CR>
"show space and tab
set list
set listchars=tab:>-,trail:-
nmap <silent> <leader>hl <Plug>MarkSet
这样,当我输入”\hl“时 相当于输入 MarkSet 命令;
leader 是 \ ; silent 没有实际意义;
<silent>是指执行键绑定时不在命令行上回显,比如::map <silent> ,w /abcd<CR>
你在输入,w查找abcd时,命令行上不会显示/abcd,如果没有<silent>参数就会显示出来
<special>一般用于定义特殊键怕有副作用的场合。比如:
:map <special> <F12> /Header<CR>
<Leader> mapleader
mapleader变量对所有map映射命令起效,它的作用是将参数<leader>替换成mapleader变量的值,比如:
:map <Leader>A oanother line<Esc>
如果mapleader变量没有设置,则用默认的反斜杠代替,因此这个映射等效于:
:map \A oanother line<Esc>
意思时输入\A键时,在下一行输入another line并返回到普通模式。
如果设置了mapleader变量,比如:
let mapleader = ","
那么就等效于:
:map ,A oanother line<Esc>
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文件。
etrw.vim
[文件浏览]
etrw.vim是vim的标准插件,它已经伴随vim而发行,不需要安装。
我们现在试一下vim文件功能,当你使用vim尝试打开目录时,vim会自动调用netrw.vim插件打开该目录(从操作系统的视角来看,目录其实是一种特殊的文件)。例如,我们在vim中执行命令” :e ~/src/vim70/src/ “,会显示下面的窗口:
Netrw插件中常用键绑定有:
<F1> 显示帮助<cr> 如果光标下为目录,则进入该目录;如果光标下是文件,则用vim打开该文件
- 返回上级目录
c 切换vim的当前工作目录为正在浏览的目录
d 创建目录
D 删除文件或目录
i 切换显示方式
R 改名文件或目录
s 选择排序方式
x 定制浏览方式,使用你指定的程序打开该文件
add the follow into /etc/vimrc :
""""""""""""""""""""""""""""""
" netrw setting
" """"""""""""""""""""""""""""""
let g:netrw_winsize = 30
nmap <silent> <leader>fe :Sexplore!<cr>-
[缓冲区浏览]
在开发过程中,经常会打开很多缓冲区,尤其是使用tag文件在不同函数间跳转时,会不知不觉打开很多文件。要知道自己当前打开了哪些缓冲区,可以使用vim的”:ls“Ex命令查看。
a.vim
在头文件/cpp文件直接切换 :A
add the follow into /etc/vimrc :
:map <F4> :A<CR>
taglist.vim
Tlist打开或者关闭
add the follow into /etc/vimrc :
:map <F3> :Tlist<CR>
use help :help taglist
lookupfile.vim
默认F5 快捷键, 自己定义了快捷键 \ef ; 然后 ctrl+n 查找下一个,然后回车选中。
:help lookupfile
[项目文件查找]
因此我们会专门为它生成一个包含项目中所有文件名的tag文件。我编写了下面的shell脚本,为vim70的源代码,生成一个文件名tag文件。
#!/bin/sh
# generate tag file for lookupfile plugin
echo -e "!_TAG_FILE_SORTED\t2\t/2=foldcase/" > filenametags
find . -not -regex '.*\.\(png\|gif\|o\|so\|d\|linkmap\|dd\)' ! -path "*svn*" -type f -printf "%f\t%p\t1\n" | sort -f>> filenametags
add the follow into /etc/vimrc :
""""""""""""""""""""""""""""""
" lookupfile setting
" """"""""""""""""""""""""""""""
let g:LookupFile_MinPatLength = 2 "最少输入2个字符才开始查找
let g:LookupFile_PreserveLastPattern = 0 "不保存上次查找的字符串
let g:LookupFile_PreservePatternHistory = 1 "保存查找历史
let g:LookupFile_AlwaysAcceptFirst = 1 "回车打开第一个匹配项目
let g:LookupFile_AllowNewFiles = 0 "不允许创建不存在的文件
if filereadable("./filenametags") "设置tag文件的名字
let g:LookupFile_TagExpr = '"./filenametags"'
endif
"映射LookupFile为,lk
nmap <silent> <leader>lk :LUTags<cr>
" "映射LUBufs为,ll
nmap <silent> <leader>ll :LUBufs<cr>
" "映射LUWalk为,lw
nmap <silent> <leader>lw :LUWalk<cr>
现在我们就可以使用lookupfile来打开文件了,按”<F5>“或输入”:LookupFile“在当前窗口上方打开一个lookupfile小窗口,开始输入文件名(至少2个字符),随着你的输入,符合条件的文件就列在下拉列表中了。文件名可以使用vim的正则表达式,这大大方便了文件的查找。你可以用”CTRL-N“和”CTRL-P“(或者用上、下光标键)来在下拉列表中选择你所需的文件。选中文件后,按回车,就可以在之前的窗口中打开此文件。
bufexplorer.vim
so ~/.vim/plugin/bufexplorer.vim来使插件起作用,一试之下果然管用。
再运行:helptags ~/.vim/doc重新生成帮助
使用bufexplorer时觉得最简单常用的功能总结一下。
1. 使用一个vim打开多个文件,bufexplorer才起作用。如果只打开了一个文件file1,就运行:vim file2再打开一个文件,注意不是:!vim file2;
2. 输入\be,\bv或\bs都可以激活bufexplorer;
3. j,k可以上下移动光标;
4. 按回车打开光标所在的文件;
5. 如果窗口被分割为两个子窗口,分别打开file1和file2,此时光标在file1中,如果想切换到file2中,可以先\be激活bufexplorer,然后移动光标到file2,按t即可跳转到file2;
add the follow into /etc/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“就可以打开一个垂直分割窗口显示当前的缓冲区。
minibufexpl.vim的插件 ,
也可以把缓冲区列表显示出来,这个插件在此处下载:http://vim.sourceforge.net/scripts/script.php?script_id=159
add the follow into /etc/vimrc :
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBufs = 1
let g:miniBufExplModSelTarget = 1
minibufexpl用在同时打开多个文件
安装后,当打开多个文件后,在窗口上方就出现一个小的区域,列出你打开的所有文件,在选择mouse支持后,就可以点击某个文件用于打开文件。
打开方法:用tabedit打开多个文件之后,就可以用“tab+方向键“,在各个框里面选择,当进入到MiniBufExplorer之后,按Tab键盘,就可以进入相应的文件
Cscope
Cscope的主页在http://cscope.sourceforge.net/,如果你的计算机上没有cscope,你可以在此处下载它,在写本文时,它的最新版本是15.6。
安装它非常简单,你只需要在cscope的源代码目录中执行下面三条命令:
./configure
make
make install
cscope的用法很简单,
cscope生成的tag:
首先需要为你的代码生成一个cscope数据库。在你的项目根目录运行下面的命令:
cscope -Rbq
这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。其中cscope.out是基本的符号索引,后两个文件是使用”-q“选项生成的,可以加快cscope的索引速度。
在缺省情况下,cscope在生成数据库后就会进入它自己的查询界面,我们一般不用这个界面,所以使用了” -b “选项。如果你已经进入了这个界面,按 CTRL-D 退出。
自己生成精简的tag:
cd ~/src/vim70
find . -not -regex '.*\.\(png\|gif\|o\|so\|d\|linkmap\|dd\|svn-base\|out\|s3db\)' -type f | sort -f >> cscope.files
cscope -bq
cscope -bq这条命令把~src/vim70目录下的所有普通文件都加入了cscope.files,这样,cscope会解析该目录下的每一个文件。上面的cscope命令并没有使用”-R“参数递归查找子目录,因为在cscope.files中已经包含了子目录中的文件。命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。
find . -name '*.cpp' -or -name "*.c" -or -name '*.h' | sort -f > cscope.files
下表中列出了cscope的常用选项:
* -R: 在生成索引文件时,搜索子目录树中的代码
* -b: 只生成索引文件,不进入cscope的界面
* -q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
* -k: 在生成索引文件时,不搜索/usr/include目录
* -i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪儿去找源文件列表。可以使用”-“,表示由标准输入获得文件列表。
* -Idir: 在-I选项指出的目录中查找头文件
* -u: 扫描所有文件,重新生成交叉索引文件
* -C: 在搜索时忽略大小写
* -Ppath: 在以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了。
在vim中使用cscope非常简单,首先调用”cscope add“命令添加一个cscope数据库,然后就可以调用”cscope find“命令进行查找了。vim支持8种cscope的查询功能,如下:
* s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
* g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
* d: 查找本函数调用的函数
* c: 查找调用本函数的函数
* t: 查找指定的字符串
* e: 查找egrep模式,相当于egrep功能,但查找速度快多了
* f: 查找并打开文件,类似vim的find功能
* i: 查找包含本文件的文件
例如:
查找文件: cs find f TContentDirectoryService.cpp 可以直接打开文件(如果仅仅有一个文件)
cs find f TContent 回车后,会列出一列文件列表,然后输入某个文件的数字索引,然后回车可以打开文件,
查找函数: cs find s RegisterEventReceiver 回车后,会列出一列文件列表,然后输入某个文件的数字索引,然后回车可以打开文件,并将光标至于函数处
add the follow into /etc/vimrc :
if has("cscope") && filereadable("/usr/bin/cscope")
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
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>
:map <F5> :cs find d <C-R>=expand("<cword>")<CR><CR>
:map <F6> :cs find c <C-R>=expand("<cword>")<CR><CR>
:map <F7> :cs find g <C-R>=expand("<cword>")<CR><CR>
说明:
a, nmap 表示在vim的普通模式下,
b, <C-\>表示:Ctrl+@
c, s表示输入(即按:s)s
d, : 表示输入':'
e, “cs find s"表示输入"cs find s"也即是要输入的命令
f, <C-R>=expand("cword")总体是为了得到:光标下的变量或函数。cword 表示:cursor word, 类似的还有:cfile表示光标所在处的文件名
h, 当光标停在某个你要查找的词上时, 按下<C-_>g, 就是查找该对象的定义, 其他的同理.按这种组合键有一点技巧,按了<C-_>后要马上按下一个键,否则屏幕一闪就回到nomal状态了<C-_>g的按法是先按"Ctrl+Shift+-", 然后很快再按"g
Ctrl+] 或者 ctrl+鼠标左键 可以跳转到下一个 tag 处
quickfix
本节所用命令的帮助入口:
:help quickfix
:help :make
vim由一个程序员开发,而且为更多的程序员所使用,所以在vim中加强了对软件开发的支持,quickfix模式的引入就是一个例子。所谓quickfix模式,它和Normal模式、Insert模式没什么关系,它只是一种加快你开发速度的工作方式。
[编译]
利用vim的quickfix模式,可以大大加快这一过程,你可以在vim启动编译,然后vim会根据编译器输出的错误信息,自动跳到第一个出错的地方,让你进行修改;修改完后,使用一个快捷键,跳到下一个错误处,再进行修改,方便的很。
为了做到这一点,你首先要定义编译时所使用的程序,对大多数使用Makefile的项目来说,vim的缺省设置”make“已经可以满足要求了。如果你的项目需要用一个特殊的程序进行编译,就需要修改’makeprg‘选项的值。
例程:
”hello world”程序,我们就以这个简单的例子为例,讲一下quickfix模式的用法。
该程序的内容如下,里面包含了三个小小的错误:
/* hello world demo */
#include <stdio.h"
int main(int argc, char **argv)
{
int i;
print("hello world\n");
return 0;
}
我们可以为这个程序写个小小的Makefile文件,不过为了演示’makeprg‘的设置方法,我们并不用Makefile,而直接设置’makeprg‘选项,如下:
:set makeprg=gcc\ -Wall\ -ohello\ hello.c
上面的命令会把hello.c编译为名hello的可执行文件,并打开了所有的Warnning。如果编译命令中有空格,需要使用’\‘对空格进行转义,上面的例子就使用了’\‘转义空格。
我们设置好’makeprg‘选项后,输入下面的命令就可以编译了:
:make
在使用”:make“时,vim会自动调用’makeprg‘选项定义的命令进行编译,并把编译输出重定向到一个临时文件中,当编译出现错误时,vim会从上述临时文件中读出错误信息,根据这些信息形成quickfix列表,并跳转到第一个错误出现的地方。
对于我们上面的程序来说,光标会停在第三行,也就是第一个出错的位置,vim同时会提示出错信息。如果你没看清出错信息,可以输入”:cc“命令,vim会更次显示此信息,或者干脆使用”:cw“命令,打开一个quickfix窗口,把所有的出错信息显示出来,
现在我们知道错在哪儿了,修正一下,然后使用”:cn“命令(或者在Quickfix List对应行上输入回车)跳到下一个出错的地方,以此类推,直到修正全部错误。
好了,千辛万苦,我们的hello world终于工作了。乍一看这个例子,似乎Quickfix并没有提高什么效率,但如果你的错误出现在多个不同目录的不同文件里,它可以帮你省很多时间,使你可以集中精力在修正bug上。
vim可以同时记住最新的10个错误列表,也就是说你最近10次使用”:make“命令编译所遇到的错误都保存着,可以使用”:colder“和”:cnewer“命令,回到旧的错误列表,或者到更新的错误列表。
在quickfix模式里经常用到的命令有:
:cc 显示详细错误信息 ( :help :cc )
:cp 跳到上一个错误 ( :help :cp )
:cn 跳到下一个错误 ( :help :cn )
:cl 列出所有错误 ( :help :cl )
:cw 如果有错误列表,则打开quickfix窗口 ( :help :cw )
:col 到前一个旧的错误列表 ( :help :col )
:cnew 到后一个较新的错误列表 ( :help :cnew )
更多的命令,以及这些命令更详细的解释,请参见手册。
对于经常用到的命令,最好提供更方便的使用方法,在我的vimrc中的定义:
""""""""""""""""""""""""""""""
" quickfix模式 vim本身支持
" :cp跳到上一个错误 ( :help :cp )
" :cn 跳到下一个错误 ( :help :cn )
" :cw 如果有错误列表,则打开quickfix窗口 ( :help :cw )
""""""""""""""""""""""""""""""
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>
nmap <leader>cn :cn<cr>
nmap <leader>cp :cp<cr>
nmap <leader>cw :cw 10<cr>-
现在使用”,<space>“(先按,再按空格)就可以编译,使用”,cp“和”,cn“跳到上一个和下一个错误,使用”,cw“来打开一个quickfix窗口。这下顺手多了!
例程2:
[leo@leo dlnamediacontroller]$ pwd
/mnt/sda5/mot_develop/BRASSICA/platform/dlnamediacontroller
[leo@leo dlnamediacontroller]$ genfiletags 这个为lookupfile生成filenametags文件, F5
[leo@leo dlnamediacontroller]$ find . -name '*.cpp' -or -name "*.c" -or -name '*.h' | sort -f > cscope.files
[leo@leo dlnamediacontroller]$ cscope -Rbq
[leo@leo dlnamediacontroller]$ gvim
在vim中,:make local_all :cw :cn下一个error :cp 上一个error
Exuberant Ctags
Tag文件(标签文件)无疑是开发人员的利器之一,有了tag文件的协助,你可以在vim查看函数调用关系,类、结构、宏等的定义,可以在任意标签中跳转、返回……相信使用过Source Insight的人对这些功能并不陌生,而在vim中,此功能的实现依赖于tag文件。
对于程序来说,Tag文件中保存了诸如函数、类、结构、宏等的名字,它们所处的文件,以及如何通过Ex命令跳转到这些标签。它是一个纯文本文件,因此你可以手工的编辑它,也可以使用脚本对其进行操作。
add the follow into /etc/vimrc :
""""""""""""""""""""""""""""""
" ctags setting
" " """"""""""""""""""""""""""""""
if filereadable("./tags") "设置tag文件的名字
set tags=tags
endif
我们经常用到的tag跳转命令见下(一般只需要知道CTRL-]和CTRL-T就可以了):
:tag {ident} "跳转到指定的标签
:tags "显示标签栈
CTRL-] "跳转到当前光标下的标签
CTRL-T "跳到标签栈中较早的标签 T大小写都可以;
例子1:
虽然ctags有为数众多的选项,但通常我们所使用的非常简单。还是以vim 7.0的代码为例,我们执行:
cd ~/src/vim70
ctags –R src
上面这条命令会在~/src/vim70/目录下生成一个名为tags的文件,这个文件中包含~/src/vim70/src/目录下所有.c、.h文件中的标签。它一个文本文件,你可以用vim打开它看一下。此文件缺省按区分字母大小写排序,所以直接可以被vim使用。
现在我们进入vim,执行下面的命令:
:cd ~/src/vim70 "切换当前目录为~/src/vim70
:set tags=tags "设置tags选项为当前目录下的tags文件
现在,我们设置好了tags选项,接下来我们使用它:
:tag main
你会看到vim打开了main.c文件,并把光标定位到main上。
例子2:
或者你可以用”:grep“或”:vimgrep“来查找main(这篇文章讲解grep及vimgrep的用法):
:cd ~/src/vim70
: vimgrep /\<main\>/ src/*.c
:cw
这时下面的quickfix窗口将显示出来,在quickfix窗口中找到我们想跳转的位置(本例中是src/main.c),按回车,就可以跳到对应的位置了。
OMNI补全
OMNI 针对c的补全,OmniCppComplete 是针对c++的补全
vim的OMNI补全(以下称”全能补全”)可以支持多种程序语言,包括C,C++, XML/HTML,CSS,JAVASCRIPT,PHP,RUBY等,详细列表请参阅”:help compl-omni-filetypes“。在本文中,主要介绍C及C++的全能补全。
vim在对不同类型的文件进行补全时,会根据文件类型,为其设置不同的补全函数。也就是说,要实现全能补全功能,需要打开文件类型检测。把下面的命令加到你的 vimrc中 :
filetype plugin indent on
使用” ctags -R“更新一下标签文件 ,现在再进入vim就可以在C程序中全能补全了。我们依旧以vim 7.0的源代码为例。
cd ~/src/vim70
ctags -R .
在当前路径下,对当前路径递归生成tags文件,
例如,我们在VimMain()函数中,输入”gui“三个字符,然后按下” CTRL-X CTRL-O “,在vim的状态行会显示”Omni Completeion“,表明现在进行的是全能补全,同时会弹出一个下拉菜单,显示所有匹配的标签。你可以使用来” CTRL-P“和”CTRL-N“上下选择 ,在选择的同时,所选中的项就被放在光标位置,不需要再按回车来把它放在光标位置(像Source Insight那样)。
如果更习惯于使用Source Insight这种方式,你可以使用上、下光标键来选择项目,然后按回车把选中的项目放到光标位置。不过这样一来,你的手指就会离开主编辑区,并且需要多输入一个回车键。
本文结尾处提供了一个键绑定,允许在使” CTRL-P“和”CTRL-N “时,输入回车表示补全结束,而不是插入回车。
如果补全处于激活状态,可以用” CTRL-E“停止补全 并回到原来录入的文字。用 ”CTRL-Y“可 以停止补全,并接受当前所选的项目。
缺省的,vim会使用下拉菜单和一个 preview窗口( 预览窗口)来显示匹配项目,下拉菜单列出所有匹配的项目,预览窗口则显示选中项目的详细信息。打开预览窗口会导致下拉菜单抖动,因此我一般都去掉预览窗口的显示,这需要改变’completeopt‘的值,我的设置如下:
set completeopt=longest,menu
上面的设置表明,只在下拉菜单中显示匹配项目,并且会自动插入所有匹配项目的相同文本。
下表是我的vimrc中设置的键绑定,使用pumvisible()来判断下拉菜单是否显示,如果下拉菜单显示了,键映射为了一个值,如果未显示,又会映射为另一个值。
" mapping
inoremap <expr> <CR> pumvisible()?"\<C-Y>":"\<CR>"
inoremap <expr> <C-J> pumvisible()?"\<PageDown>\<C-N>\<C-P>":"\<C-X><C-O>"
inoremap <expr> <C-K> pumvisible()?"\<PageUp>\<C-P>\<C-N>":"\<C-K>"
inoremap <expr> <C-U> pumvisible()?"\<C-E>":"\<C-U>"
上面的映射都是在插入模式下的映射,解释如下:
* 如果下拉菜单弹出,回车映射为接受当前所选项目,否则,仍映射为回车;
* 如果下拉菜单弹出,CTRL-J映射为在下拉菜单中向下翻页。否则映射为CTRL-X CTRL-O;
* 如果下拉菜单弹出,CTRL-K映射为在下拉菜单中向上翻页,否则仍映射为CTRL-K;
* 如果下拉菜单弹出,CTRL-U映射为CTRL-E,即停止补全,否则,仍映射为CTRL-U;
OmniCppComplete插件
如果要支持C++的全能补全,需要到vim主页下载OmniCppComplete插件,链接如下:
http://www.vim.org/scripts/script.php?script_id=1520
确保你已关闭了vi兼容模式,并允许进行文件类型检测:
set nocp
filetype plugin on
接下来,使用下面的命令,为C++文件生成标签文件,假定你的文件在src目录树下:
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q src
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
在对C++文件进行补全时,OmniCppComplete插件需要tag文件中包含C++的额外信息,因此上面的ctags命令不同于以前我们所使用的,它专门为C++语言生成一些额外的信息,上述选项的含义如下:
--c++-kinds=+p : 为C++文件增加函数原型的标_签
--fields=+iaS : 在标_签文件中加入继承信息(i)、类成员的访问 控_制_信_息(a)、以及函数的信息(S)
+q . : 为标_签增加_类_修饰符; 注意,如果没有此选项,将不能对类_成员_补全
现在,进入vim,设置好tag选项(我在前面的文章中介绍过)。好极了,vim能够对C++自动补全了!
我 写了一个简单的例子,来演示C++的自动补全功能,如下图所示,在输入”t.“后,OmniCppComplete插件会自动弹出struct test1的成员供选择,而在输入”b->“后,又会自动弹出class base的成员供选择,非常方便,连”CTRL-X CTRL-O“都不必输入。OmniCppComplete插件的缺省设置比较符合我的习惯,因此不须对其设置进行调整,如果你需要调整,参阅 OmniCppComplete的帮助页。
开启文件类型检测
本节所用命令的帮助入口:
:help filetype
打开文件类型检测功能很简单,在你的vimrc中加入下面一句话就可以了:
filetype plugin indent on
如果你用的是vim自带的示例vimrc,那么你已经打开了文件类型检测功能。或者,你也可以输入”:filetype“命令查看你的文件类型检测功能有没有打开。
这条命令究竟做了什么呢?我们在下面详细介绍。其实,上面这一条命令,可以分为三条命令:
filetype on
filetype plugin on
filetype indent on
“filetype on“命令打开文件类型检测功能,它相当于文件类型检测功能的开关。在执行”filetype on“ 命令时,vim实际上执行的是$vimRUNTIME/filetype.vim脚本。这个脚本使用了自动命令(autocmd)来根据文件名来判断文件的类型,如果无法根据文件名来判断出文件类型,它又会调用$vimRUNTIME/scripts.vim来根据文件的内容设置文件类型。
”filetype plugin on“,允许vim加载文件类型插件。当这个选项打开时,vim会根据检测到的文件类型,在runtimepath中搜索该类型的所有插件,并执行它们。
“filetype plugin on“命令,实际上是执行$vimRUNTIME/ftplugin.vim脚本,有兴趣可以读一下这个脚本。
“filetype indent on“允许vim为不同类型的文件定义不同的缩进格式。这条命令也是通过一个脚本来完成加载:$vimRUNTIME/indent.vim。
语法高亮
首先,把下面的Ex命令加入你的vimrc,打开vim的语法高亮功能:
syntax enable
这条命令,实际上是执行$vimRUNTIME/syntax/syntax.vim脚本。
现在,你的世界已经亮起来了:注释、关键字、常数、字符串等等都以不同的颜色显示出来,读程序轻松多了。
可是你不太喜欢default配色方案的设置,可不可以换用其它的配色方案呢?
当然没可以!如果你使用的是gvim,在”编辑”菜单中选择”配色方案”,你就可以在多个配色方案中切换了。也可以使用colorscheme命令来改变你的配色方案。
例如,我喜欢的GUI配色方案是darkblue,因此我在vimrc中加入这样一句话:
colorscheme darkblue
这样,进入vim之后,我所用的就是darkblue方案了。
配色方案(colorscheme)
安装colorscheme时,只需要把它们拷贝到.vim/color目录下就行了。
在vimrc中加入一条colorscheme命令,以后vim就会使用你选定的配色方案了。
SHIFT+F8可以把光标下的词高亮出来
记得Source Insight中有一个功能,按SHIFT+F8可以把光标下的词高亮出来,在看代码时非常有用。vim下也有一个插件可以完成此功能,而且比Source Insight的这个功能强大多了。
这个插件由Yuheng Xie所写,对这个插件有什么疑问,可以水木社区的vim版找到他(http://www.newsmth.net/bbsdoc.php?board=vim)。
在vimrc中这样设置:
""""""""""""""""""""""""""""""
" mark setting
""""""""""""""""""""""""""""""
nmap <silent> <leader>hl<Plug>MarkSet
vmap <silent> <leader>hl <Plug>MarkSet
nmap <silent> <leader>hh <Plug>MarkClear
vmap <silent> <leader>hh <Plug>MarkClear
nmap <silent> <leader>hr <Plug>MarkRegex
vmap <silent> <leader>hr <Plug>MarkRegex
这样,当我输入” \hl “时,就会把光标下的单词高亮,在此单词上按”\hh“会清除该单词的高亮。如果在高亮单词外输入” \hh “,会清除所有的高亮。
你也可以使用virsual模式选中一段文本,然后按”\hl“,会高亮你所选中的文本;或者你可以用”\hr“来输入一个正则表达式,这会高亮所有符合这个正则表达式的文本。
你可以在高亮文本上使用”,#“或”,*“来上下搜索高亮文本。在使用了”,#“或”,*“后,就可以直接输入”#“或”*“来继续查找该高亮文本,直到你又用”#“或”*“查找了其它文本。
如果你在启动vim后重新执行了colorscheme命令,或者载入了会话文件,那么mark插件的颜色就会被清掉,解决的办法是重新source一下mark插件
echofunc
官方描述: When you type ‘(‘ after a function name in insert mode, the function declaration will be displayed in the command line automatically. Then use Alt+-, Alt+= to cycle between function declarations (if exists).
滇狐评价: 一个非常好用的插件, 虽然很小巧, 功能也很简单, 但非常实用, 强烈推荐。 除此之外, 安装了这个插件后, 当鼠标移到一个标志符之上时, 还会出现一个气球显示该标志符的定义.
安装注意事项: 该插件需要安装 EXUBERANT CTAGS, 不支持古老版本的标准 ctags。 建议创建一个这样的脚本:
#!/bin/sh
# Filename: omnictags
ctags --c++-kinds=+p --fields=+iaS --extra=+q "$@"
然后使用 omnictags 来运行 ctags 生成 tags 文件, 保证 tags 文件中含有所需的信息。