Wednesday, January 28, 2009

使用Vim的自动补全功能

前段时间SHE同学说想在Vim中有一个自动补全功能, 因为我以前都是不用这个的, 所以推荐他了一个在IRC上看到的命令: CTRL-N, 可这个命令使用之后列出的结果太多了, 花在找匹配上的时间还不如直接打呢.

昨天下午花了点时间研究了下, 开始还以为需要使用什么插件才能办到呢, 最后才发现其实Vim已经拥有了这些功能, 只是需要你去发掘.

Vim自带了很多种自动补全的方式, 最终选定了omni completion (全能补全), 如果想要查看其它的补全方式的话, 可以在Vim中输入 :help ins-completion

由于omni是借助tags文件来达到补全的, 所以需要安装有Ctags才行, Ubuntu可以用下面的命令安装:
$ 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>

这是效果图:

omni completion

这时你可以使用CTRL-N或者CTRL-P来上下选择, 使用CTRL-Y来确定, CTRL-E来取消.

不过虽说这被叫做是全能补全, 但实际使用中还是有不是很顺利的地方的, 比如对于某些局部变量的补全. 这时可以试试CTRL-X CTRL-N, 将这两种补全结合着用, 应该就能满足日常需求了.

1 comment:

  1. 推荐 vimim —— vim 中文输入法
    http://maxiangjiang.googlepages.com/vimim.html

    ReplyDelete