0

我正在尝试让omnicomplete 为C++ 工作,虽然一切似乎都井井有条,但当我将omnifunc 重置为时omnifunc=omni#cpp#complete#Main,插件无法识别omnifunc,并且出现pattern not found错误。我已经安装了 Ctags 并将其放入.vim/<name_of_dir>,同时添加cpp_src.vim/tags运行了必要的命令。(有关更多信息,请参见此处)

问题是,无论我尝试什么,我仍然会收到此错误。我该怎么做才能让它工作?我以前试过这个,第一次只是头疼,导致我无法让它工作。不过,这一次,我下定了决心。

VimRc

  1 syntax on
  2 set number
  3 set autoindent
  4 set ft=nasm
  5 set ts=4
  6 set nowrap
  7 set nocp
  8 filetype plugin on
  9 map <C-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
 10 
 11 autocmd FileType cpp set omnifunc=omni#cpp#complete#Main
 12 
 13 " configure tags - add additional tags here or comment out not-used ones
 14 set tags+=~/.vim/tags/cpp
 15 set tags+=~/.vim/tags/gl
 16 set tags+=~/.vim/tags/sdl
 17 " set tags+=~/.vim/tags/qt4
 18 " " build tags of your own project with Ctrl-F12
 19 map <C-F12> :!ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
 20 "
 21 " " OmniCppComplete
 22 let OmniCpp_NamespaceSearch = 1
 23 let OmniCpp_GlobalScopeSearch = 1
 24 let OmniCpp_ShowAccess = 1
 25 let OmniCpp_ShowPrototypeInAbbr = 1 " show function parameters
 26 let OmniCpp_MayCompleteDot = 1 " autocomplete after .
 27 let OmniCpp_MayCompleteArrow = 1 " autocomplete after ->
 28 let OmniCpp_MayCompleteScope = 1 " autocomplete after ::
 29 let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
 30 " " automatically open and close the popup menu / preview window
 31 au CursorMovedI,InsertLeave * if pumvisible() == 0|silent! pclose|endif
 32 set completeopt=menuone,menu,longest,preview

与往常一样,非常感谢任何帮助。

更新

发布我的 Ctags 文件供其他人检查,以防出现问题:

ctags -R --c++-kinds=+p --fields-+iaS --extra=+q .

map <C-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
4

1 回答 1

1

显然,Vim 找不到你的标签文件。您的命令ctags -R --c++-kinds=+p --fields-+iaS --extra=+q .将在当前目录中创建tags文件。确保这是您想要的。

请执行以下命令:

:set tags?

并确保您的标签文件出现在结果列表中。您也可以将光标放在任何符号(例如,某个类名)上,然后按Ctrl-]。如果你没问题,Vim 会跳转到这个符号定义tags。如果不是,那么当然是omnicppcomplete行不通的。(我使用omnicppcomplete了一年多,它有效。复杂的类/结构并不完美,但有效。)

最后,请在此处查看我的答案,因为我的建议完全一样:要获得完美的 C/C++/Objective-C 代码完成,您应该使用Clang Completectags这种完成不需要)。

如果您希望标签存在(例如,轻松跳转到符号定义),请使用Indexer插件。

于 2011-12-29T05:06:22.210 回答