Генерация CTAGS для libstdc ++ (из текущего GCC)

я знаю Ты дополняешь меня на базе LLVM, но я хочу использовать 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/}/'

Или используйте эту настройку:

let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]

И то, и другое не работает, и, конечно, большинство заголовков не имеют и никаких расширений файлов. Я уже пытался обойти это, используя список файлов. Как я могу создать рабочие CTAGS на основе моего текущего GCC (например, / usr / include / c ++ / …)? Каков общий путь?

Спасибо

Вот что я получил, если попытался завершить что-то из LIBSTD ++:

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

4

Решение

Наконец, я с отчаянием написал письмо автору модифицированные заголовки для 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

Отредактируйте ваш ~ / .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

Автозаполнение для LIBSTDC ++ теперь должно работать в vim!
Автозаполнение вручную Ctrl+Икс -> Ctrl+о.

Если у вас все еще есть проблемы с автозаполнением, вы можете найти решение в документация (см. FAQ 7).

до свидания

4

Другие решения

Я на самом деле тоже использую OmniCppComplete и с удовольствием использую файл тегов только для C ++ (среди прочего. Я разбиваю свои файлы тегов на более мелкие фрагменты, такие как C ++, boost, X11 и т. Д.) Довольно долгое время. Вот решение, которое я использую для создания этого файла тегов в Ubuntu 14.04:

ctags -f cpp_tags --c-kinds=cdefgmstuv --c++-kinds=cdefgmstuv --fields=+iaSmKz --extra=+q --langmap=c++:+.tcc. --languages=c,c++ -I "_GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION _GLIBCXX_VISIBILITY+" -n $INC_DIR/* /usr/include/$CPP_TARGET/c++/$CPP_VERSION/bits/* /usr/include/$CPP_TARGET/c++/$CPP_VERSION/ext/* $INC_DIR/bits/* $INC_DIR/ext $SYSTEM/* $SYSTEM2/*

Куда:

CPP_VERSION=4.8
INC_DIR=/usr/include/c++/$CPP_VERSION
CPP_TARGET=x86_64-linux-gnu
SYSTEM=/usr/lib/gcc/x86_64-linux-gnu/4.8/include
SYSTEM2=/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed

Обратите внимание, что реальная хитрость в получении большинства сгенерированных тегов — опция -I! Это может нужно подправить. Конечно, параметры —c-types / c ++ — types и fields также могут быть изменены.

Последний кусок добавляет:

tags+=cpp_tags

в ваш файл .vimrc, чтобы теги были видны.

Все это не требует никаких модификаций для заголовков. Если вы используете другую библиотеку C ++, скорее всего, вам придется поиграть с опцией -I, чтобы теги отображались правильно (или даже вообще).

Теперь, когда я думаю об этом, я, вероятно, должен опубликовать эту информацию также в Vim Wiki.

Ваша вторая часть о let OmniCpp_DefaultNamespaces может выдержать некоторое улучшение. Пытаться let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD", "_GLIBCXX_STD_A", "_GLIBCXX_STD_C"], Это то, что я использую и должно позволить найти больше предметов.

Наконец, не забудьте использовать CTRL-p Vim для завершения std :: fs. Это довольно мощный … и файл тегов не требуется!

2

После того, как я постарался найти способ создания файла специфичных для c ++ тегов с помощью ctags, я наконец добился желаемого прогресса. Надо сказать, ctags действительно немного сложен в использовании, хотя мощный.

Прежде всего, чтобы подчеркнуть, не игнорируйте -I вариант (см. Вот для дополнительной информации), предоставленной ctags. Для вас очень важно видеть больше символов в файле тегов. Проще говоря, ctags не может обрабатывать некоторые нерегулярные синтаксические операторы, например, с префиксом или суффиксом макросов C / C ++. Если многие функции имеют префикс или суффикс с какими-то макросами, ctags может быть очень вероятно, что бросить его. В конце концов, вы не можете видеть их при кодировании.

Вот способ, которым я использую, чтобы найти такие макросы как можно больше из стандартного пути заголовка C ++, /usr/include/c++/4.9.3 например, и добавить их в -I вариант.

найти / usr / include / c ++ / -type f -exec grep ‘_GLIBCXX_’ {} \; | grep -v -E ‘^ [# if | #end]’ | sort -u> glibcxx.log

После команды вы найдете несколько макросов, используемых в исходных файлах C ++ 4.9.3, а затем выберите некоторые из них, которые будут игнорироваться ctags.

Моя последняя команда для создания файла тегов c ++:

ctags -R —languages ​​= c ++ —langmap = c ++: +. tcc. -С ++ — виды = + р + —fields = УИ —extra = + QF -I «_GLIBCXX_NOEXCEPT _GLIBCXX_USE_NOEXCEPT _GLIBCXX_NOTHROW _GLIBCXX_USE_CONSTEXPR _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _GLIBCXX_END_NAMESPACE_CONTAINER _GLIBCXX_CONSTEXPR _GLIBCXX_NAMESPACE_LDBL _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION _GLIBCXX_VISIBILITY +» -f GCC-4.9.3.tags / USR / включать / C ++ /4.9.3/

Предостережение

  1. Не забудьте написать . подписать следующее слово tcc, это означает, что сопоставить эти файлы без явного расширения имени, такого как vector,set
  2. Не забудьте написать + подписать следующее слово VISIBILITYэто значит совпадение std _GLIBCXX_VISIBILITY(**)
  3. Не забудьте написать + знак с последующим .tcc, это означает добавить обозначенное расширение к текущей карте языков, в противном случае заменить карту
2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector