为libstdc ++生成CTAGS(来自当前的GCC)

Pet*_*ter 6 c++ vim ctags c++11

我知道基于LLVM的YoucompleteMe,但我想使用OmniCppComplete.如果我使用C++ 的修改标头,这很好用.此修改后的标头已过时,并且不包含C++ 11中的任何内容.

如果注意到我可以自己修改我的标题,例如:

$ find . -name '*.h' | xargs sed -i 's/__STL_BEGIN_NAMESPACE/namespace std {/'
$ find . -name '*.h' | xargs sed -i 's/__STL_END_NAMESPACE/}/'
Run Code Online (Sandbox Code Playgroud)

或使用此设置:

let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
Run Code Online (Sandbox Code Playgroud)

两者都不起作用,当然大多数标头没有和任何文件扩展名.我已经尝试使用文件列表解决此问题.如何在我当前的GCC(例如/ usr/include/c ++/...)的基础上创建工作CTAGS?常见的方法是什么?

谢谢

这是我得到的,如果我尝试从LIBSTD ++完成一些事情:

std::fs
Omni completion (^O^N^P) Back at original
Ctrl+x, Ctrl+o
Omni completion (^O^N^P) Pattern not found
Run Code Online (Sandbox Code Playgroud)

Pet*_*ter 5

最后,我绝望地给LIBSTDC++ (GCC)的修改头文件的作者写了一封电子邮件。他及时回答了我(谢谢!):

要求:
安装 vim 和 vim-omnicppcomplete 和 ctags(依赖 vim-omnicppcomplete)。

解决方案:

$ cp -R /usr/include/c++/$GCC_VERSION ~/.vim/cpp_src
# it is not necessary to rename headers without an extension
# replace the "namespace std _GLIBCXX_VISIBILITY(default)" with "namespace std"
$ find . -type f | xargs sed -i 's/namespace std _GLIBCXX_VISIBILITY(default)/namespace std/'
$ ctags -f cpp_tags -R --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ -I _GLIBCXX_NOEXCEPT cpp_src
Run Code Online (Sandbox Code Playgroud)

编辑你的 ~/.vimrc:

" configure tags - add additional tags here or comment out not-used ones
set tags+=~/.vim/cpp_tags
" build tags of your own project with Ctrl-F12
map <C-F12> :!ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q -I _GLIBCXX_NOEXCEPT .<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 ::
" also necessary for fixing LIBSTDC++ releated stuff
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
Run Code Online (Sandbox Code Playgroud)

LIBSTDC++ 的自动完成现在应该可以在 vim 中工作了!
使用Ctrl+ x-> Ctrl+手动自动完成o

如果您仍然无法使用自动完成功能,您可能会在文档中找到解决方案(请参阅常见问题解答 7)。

再见