ctags игнорирует списки для libc6, libstdC++ и boost
Я использую ctags с vim и плагином OmniCppComplete. В настоящее время при создании моих тегов я делаю это индивидуально для каждой библиотеки. Для libc6 я использую следующий список токенов / макросов в файле с именем libc6-ignore, чтобы игнорировать во время обработки:
__attribute__
__attribute_deprecated__
__attribute_format_arg__
__attribute_format_strfmon__
__attribute_malloc__
__attribute_noinline__
__attribute_pure__
__attribute_used__
__attribute_warn_unused_result__
__wur
__THROW
__nonnull+
Я пропускаю какие-либо другие токены, которые я должен игнорировать, и должен ли я использовать этот же или другой список при создании тегов для libstdC++ и boost?
Для тех, кто заинтересован, я использую следующие файлы для создания моих тегов:
# First make sure apt-file is install and then do:
$ sudo apt-file update
# set up tags for libc, the standard C library
$ apt-file list libc6-dev | grep -o '/usr/include/.*\.h'> ~/.vim/tags/libc6-filelist
$ ctags --sort=foldcase --c++-kinds=+p --fields=+iaS --extra=+q -I./libc6-ignore -f ~/.vim/tags/libc6 -L ~/.vim/tags/libc6-filelist
# create tags for stdlibc++ and STL
$ apt-file list libstdc++6-4.4-dev | grep -E -o '/usr/include/.*\.(h|hpp)' > ~/.vim/tags/stdlibcpp-filelist
$ ctags --sort=foldcase -R --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/stdlibcpp -L ~/.vim/tags/stdlibcpp-filelist
# For Boost
$ apt-file list boost | grep -E -o '/usr/include/.*\.(h|hpp)' | grep -v '/usr/include/boost/typeof/' > ~/.vim/tags/boost-filelist
$ ctags --sort=foldcase --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/boost -L ~/.vim/tags/boost-filelist
4 ответа
Вы также можете использовать модифицированную библиотеку libstdC++:
http://www.vim.org/scripts/script.php?script_id=2358
Он содержит сокращенную версию заголовочных файлов C++, которая работает для ctags.
Я сделал скрипт Python, который извлекает все теги, начинающиеся с подчеркивания, из файла тегов. С помощью этого скрипта вы можете выбрать, какие теги исключить. Не стесняйтесь адаптировать сценарий к вашим потребностям или предложить что-нибудь еще:
import re
tags=open('tags','r')
output=open('exclude','w')
regex=re.compile('^_[a-zA-Z0-9_]*')
results=set()
for line in tags:
result=regex.match(line)
if(result!=None):
results.add(result.group(0))
tags.close()
for element in sorted(results):
output.write('{0}\n'.format(element))
output.close()
Я следовал этим инструкциям, и я в состоянии заставить все ссылки повышения наддува работать, т.е.
#include <iostream>
Я могу прыгнуть прямо к iostream
Однако то, что мне все еще не хватает, это пойти к примеру
#include <stdio.h>
Хотя в моем скрипте генерации я включил, как вы упомянули, т.е.
$ apt-file list libc6-dev | grep -o '/usr/include/.*\.h'> ~/.vim/tags/libc6-filelist
$ ctags --sort=foldcase --c++-kinds=+p --fields=+iaS --extra=+q -I./libc6-ignore -f ~/.vim/tags/libc6 -L ~/.vim/tags/libc6-filelist
После того, как я генерирую файл тега "libc6" всякий раз, когда я пытаюсь перейти в stdio.h, он говорит "E426: тег не найден: stdlib".
Вот что я включил в дополнение к моему.vimrc, чтобы сделать все эти 3 файла тегов видимыми.
set tags+=~/.vim/tags/boost
set tags+=~/.vim/tags/libc6
set tags+=~/.vim/tags/stdlibcpp
Я не эксперт, однако могу сказать, что это работало как-то для boost, но не для libc6-dev. Может кто-нибудь помочь мне с решением
здесь тот же код, что и выше
обновление sudo apt-файла
# set up tags for libc, the standard C library
apt-file list libc6-dev | grep -o '/usr/include/.*\.h'> ~/.vim/tags/libc6-filelist
ctags --sort=foldcase --c++-kinds=+p --fields=+iaS --extra=+q -I./libc6-ignore -f ~/.vim/tags/libc6 -L ~/.vim/tags/libc6-filelist
apt-file list libstdc++6-4.6-dev | grep -E -o '/usr/include/.*\.(h|hpp)' >> ~/.vim/tags/stdlibcpp-filelist
ctags --sort=foldcase -R --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/stdlibcpp -L ~/.vim/tags/stdlibcpp-filelist
# For Boost
apt-file list boost | grep -E -o '/usr/include/.*\.(h|hpp)' | grep -v '/usr/include/boost/typeof/' > ~/.vim/tags/boost-filelist
ctags --sort=foldcase --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/boost -L ~/.vim/tags/boost-filelist
У меня был свой собственный список, и я никогда не думал о добавлении того, что вы уже перечислили!
Вот этот обновленный список игнорирования для libc6, который я придумал (Ubuntu 14.04 и GCC 4.8.4) для использования в качестве входных данных для опции -I ctags:
__attribute__
__attribute_deprecated__
__attribute_format_arg__+
__attribute_format_strfmon__+
__attribute_malloc__
__attribute_noinline__
__attribute_pure__
__attribute_used__
__attribute_warn_unused_result__
__attribute_alloc_size__+
__attribute_const__
__attribute_artificial__
__wur
__THROW
__THROWNL
__BEGIN_DECLS
__END_DECLS
__BEGIN_NAMESPACE_STD
__END_NAMESPACE_STD
__USING_NAMESPACE_STD+
__BEGIN_NAMESPACE_C99
__END_NAMESPACE_C99
__USING_NAMESPACE_C99+
__warndecl+
__warnattr+
__errordecl+
__flexarr=[]
__fortify_function
__REDICRECT+
__REDIRECT_NTH+
__REDIRECT_NTHNL+
__ASMNAME+
__ASMNAME2+
__nonnull+
__always_inline
__extern_inline=extern
__extern_always_inline=extern
__extension__
__restrict
__restrict_arr
Я также создал следующий список игнорирования для создания файла тегов для libstdC++ (GCC 4.8.2 в Ubuntu 14.04) (опять же, это ввод для опции -I):
_GLIBCXX_BEGIN_NAMESPACE_VERSION
_GLIBCXX_END_NAMESPACE_VERSION
_GLIBCXX_BEGIN_NAMESPACE_ALGO
_GLIBCXX_END_NAMESPACE_ALGO
_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_GLIBCXX_END_NAMESPACE_CONTAINER
_GLIBCXX_BEGIN_EXTERN_C
_GLIBCXX_END_EXTERN_C
_GLIBCXX_VISIBILITY+
_GLIBCXX_PURE
_GLIBCXX_CONST
_GLIBCXX_NORETURN
_GLIBCXX_CONSTEXPR=constexpr
_GLIBCXX_USE_CONSTEXPR=constexpr
_GLIBCXX_THROW_OR_ABORT+
_GLIBCXX_NOEXCEPT
_GLIBCXX_USE_NOEXCEPT
_GLIBCXX_THROW+
_GLIBCXX_NOTHROW
Я изменился __attribute__
быть: __attribute__+
чтобы указать, что это похоже на функцию и должно быть проигнорировано.
Конечно, я также создал один для Boost, но я думаю, что воздержусь от публикации, пока у кого-то не возникнет необходимость.
Извините - я никогда раньше не использовал ctags - но я постараюсь ответить на этот вопрос.
Если я правильно понимаю, вы можете использовать список ключевых слов из самого GCC. Я нашел этот https://gist.github.com/959484 внутри gcc/gcc/c-family/c-common.c
, Похоже, что он включает в себя зарезервированные слова для всех C (c/ C++/obj-c варианты). Я думаю, что некоторые из них действительны для всех компиляторов, конечно, для gcc.
Что касается выяснения других символов, которые нужно игнорировать, в OS X я использовал бы nm, чтобы вывести символы рассматриваемой библиотеки, и добавить все символы, помеченные как приватные ('s' вместо 'S', например), в мой список символов игнорировать. В Linux есть похожий инструмент для выгрузки библиотек?
Надеюсь, это полезно.