前段时间SHE同学说想在Vim中有一个自动补全功能, 因为我以前都是不用这个的, 所以推荐他了一个在IRC上看到的命令: CTRL-N
, 可这个命令使用之后列出的结果太多了, 花在找匹配上的时间还不如直接打呢.
昨天下午花了点时间研究了下, 开始还以为需要使用什么插件才能办到呢, 最后才发现其实Vim已经拥有了这些功能, 只是需要你去发掘.
Vim自带了很多种自动补全的方式, 最终选定了omni completion (全能补全), 如果想要查看其它的补全方式的话, 可以在Vim中输入 :help ins-completion
$ sudo apt-get install exuberant-ctags
2009.12.26更新:
这里有一个针对C语言补全的小技巧, 在安装好Ctags之后, 可以先对系统中已有的头文件进行一次tag, 然后让Vim识别生成的tag文件 (下面的Vim配置文件中已经有相应的配置), 这样就可以实现对于C标准库函数以及system call的补全, Ubuntu下执行如下命令即可:
$ ctags -R -f ~/.vim/systags /usr/include
然后就是修改.vimrc文件, 下面是我已经写好了的, 添加进去就行了. 需要注意的是, 默认情况下omni completion的快捷键是
CTRL-X CTRL-O
, 但每次都这样有点麻烦, 所以我把这个快捷键映射到了<Tab>
键上. 不过如果我只是想用<Tab>
来增加缩进的话, 直接映射就会导致缩进功能消失了. 于是抄了一段Vim帮助中的脚本, 再根据实际情况修改了下, 这样就可以很智能地根据具体情况映射<Tab>
键了. 如果这一行只有空白, 那么按<Tab>
键就是增加缩进, 否则就是使用omni completion.
" ---------------------------------------------------------------------- " OMNI COMPLETION " ---------------------------------------------------------------------- " Enable file type detection. " Use the default filetype settings, so that mail gets 'tw' set to 72, " 'cindent' is on in C files, etc. " Also load indent files, to automatically do language-dependent indenting. filetype plugin indent on " Don't show the preview window. set completeopt=menu set tags+=~/.vim/systags,/tmp/tags " Map <Tab> to either actually insert a <Tab> if " the current line is currently only whitespace, or start a omni " completion operation. function! CleverTab() if strpart(getline('.'), 0, col('.')-1) =~ '^\s*$' return "\<Tab>" else let current_path = bufname("%") " get name of current buffer let current_path = system("dirname " . current_path) execute "cd " . current_path execute "silent !ctags -R -f /tmp/tags ." return "\<C-X>\<C-O>" endif endfunction inoremap <Tab> <C-R>=CleverTab()<CR>
这是效果图:
这时你可以使用CTRL-N
或者CTRL-P
来上下选择, 使用CTRL-Y
来确定, CTRL-E
来取消.
不过虽说这被叫做是全能补全, 但实际使用中还是有不是很顺利的地方的, 比如对于某些局部变量的补全. 这时可以试试CTRL-X CTRL-N
, 将这两种补全结合着用, 应该就能满足日常需求了.
推荐 vimim —— vim 中文输入法
ReplyDeletehttp://maxiangjiang.googlepages.com/vimim.html