c++ - 让omnicppcomplete 和ctags 在VIM 中工作

标签 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 类型命令来实现此目的,但实际上什么也没发生。难道我做错了什么?设置标签*行中的路径是正确的...

最佳答案

这一行应该是导致问题的行:

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”的缓冲区时,会执行第一个自动命令。第二个在文件类型设置为 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

对于 future 的调试问题,一个小提示:您可以通过执行setomnifunc来检查omnifunc的值。这样,您就可以检查补全函数是否确实是您想要的函数。

关于c++ - 让omnicppcomplete 和ctags 在VIM 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7548405/

相关文章:

vim - ":ab"映射如何以及何时被触发?

xslt - 是否有类似 Ctags 的工具用于在 Vim 中浏览/导航 XSLT 代码?

c++ - 有什么方法可以在无向/有向图中快速找到属于循环(后边)的所有边?

vim - 在 Vim 中复制和关闭折叠

c++ - 将可变参数模板参数转发给类似 printf 的函数

vim - 是否有可能在操作者未决的映射中确定运动是直线运动, block 运动还是法线运动?

ubuntu - ctags 在命令行中不适用于 vim

linux - vim ctags,两个相同的条目,不会直接跳转到定义

c++ - 在单例类中将成员指针设置为 null 的正确方法是什么

c++ - Glutkeyboard 输入没有注册没有奇数循环帮助