获得omnicppcomplete和ctags在VIM中工作

时间:2011-09-25 20:32:37

标签: c++ vim ctags omnicomplete

这是我的.vimrc

syntax on
set number
set nowrap
set autoindent
" configure tags - add additional tags here or comment out not-used ones
set tags+=~/.vim/tags/cpp_files
set tags+=~/.vim/tags/cpp_src/
set tags+=~/.vim/tags/qt
" build tags of your own project with Ctrl-F12
map C-F12 :!ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q .CR

" OmniCppComplete
let OmniCpp_NamespaceSearch = 1
let OmniCpp_GlobalScopeSearch = 1
let OmniCpp_ShowAccess = 1
let OmniCpp_ShowPrototypeInAbbr = 1 " show function parameters
let OmniCpp_MayCompleteDot = 1 " autocomplete after .
let OmniCpp_MayCompleteArrow = 1 " autocomplete after ->
let OmniCpp_MayCompleteScope = 1 " autocomplete after ::
let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
" automatically open and close the popup menu / preview window
au CursorMovedI,InsertLeave * if pumvisible() == 0|silent! pclose|endif
set completeopt=menuone,menu,longest,preview

autocmd FileType python set omnifunc=pythoncomplete#Complete
autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
autocmd FileType css set omnifunc=csscomplete#CompleteCSS
autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags
autocmd FileType php set omnifunc=phpcomplete#CompletePHP
autocmd FileType c set omnifunc=ccomplete#Complete
au BufNewFile,BufRead,BufEnter *.cpp,*.hpp set omnifunc=omni#cpp#complete#Main
autocmd FileType cpp set omnifunc=cppcomplete#CompleteCPP

我已按照this指南让它发挥作用,但没有真正发生。正如你所看到的,我已经尝试了autocmd和au type命令的变体来实现这一点,但实际上并没有发生任何事情。难道我做错了什么? set tags *行中的路径是正确的......

1 个答案:

答案 0 :(得分:4)

此行应该是导致问题的行:

autocmd FileType cpp set omnifunc=cppcomplete#CompleteCPP

您会看到,您有以下命令:

au BufNewFile,BufRead,BufEnter *.cpp,*.hpp set omnifunc=omni#cpp#complete#Main
autocmd FileType cpp set omnifunc=cppcomplete#CompleteCPP

问题是,当进入扩展名为“cpp”或“hpp”的缓冲区时,会执行第一个自动命令。第二个是在filetype设置为cpp时执行的,打开缓冲区之后总是发生。它甚至不管您如何订购它们,第二个将始终在第一个之后执行,因此omnifunc将始终设置为cppcomplete#completeCPP,而您不希望这样。您应该用这一行替换这两行

autocmd FileType cpp set omnifunc=omni#cpp#complete#Main

以防万一,如果它仍然不起作用,请尝试只改为:

au BufNewFile,BufRead,BufEnter *.cpp,*.hpp set omnifunc=omni#cpp#complete#Main

对于将来的调试问题,一个小提示:您可以通过执行omnifunc来检查set omnifunc的值。这样,您可以检查完成功能是否真的是您想要的功能。