Ctags игнорирует списки для libc6, libstdС++ и 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+

Мне не хватает других токенов, которые я должен игнорировать, и должен ли я использовать этот же список или другой при создании тегов для libstdС++ и 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 

Ответ 1

Вы также можете использовать модифицированную библиотеку libstdС++:

http://www.vim.org/scripts/script.php?script_id=2358

Здесь содержится разделенная версия файлов заголовков С++, которая работает для ctags.

Я создал Python script, который извлекает все теги, начинающиеся с подчеркивания из файла тегов. Вы можете выбрать с этим script те теги для исключения. Не стесняйтесь адаптировать script для удовлетворения ваших потребностей или предложить что-нибудь еще:

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()

Ответ 2

Я следил за этими инструкциями, и я могу получить все ссылки на boost boost, т.е.

#include <iostream>

Я могу перейти непосредственно к iostream

Однако то, чего я все еще не вижу, - это, например,

#include <stdio.h>

Хотя в моем генерации script я включил, как вы упомянули, i.e.

$ 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

Я не эксперт, но могу сказать, что это работало как-то для повышения, но не для libc6-dev. Может ли кто-нибудь помочь мне с решением

здесь тот же код, что и выше

Обновление sudo apt-file

# 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

Ответ 3

Извините - я никогда раньше не использовал ctags, но я возьму удар по этому вопросу.

Если я правильно понимаю, вы можете использовать список ключевых слов из самого GCC. Я нашел https://gist.github.com/959484 внутри gcc/gcc/c-family/c-common.c. Похоже, что он включает зарезервированные слова для всех вариантов C (c/С++/obj-c). Я думаю, некоторые из них действительны для всех компиляторов, это, конечно, для gcc.

Что касается вычисления других символов, которые нужно игнорировать, то в OS X я бы использовал nm, чтобы сбрасывать символы рассматриваемой библиотеки, добавлять все символы, помеченные как private ('s' вместо 'S', например) для моего список игнорируемых символов. У Linux есть аналогичный инструмент для сброса библиотек?

Надеюсь, что это полезно.

Ответ 4

У меня был свой собственный список, и я никогда не думал о том, чтобы добавить то, что вы уже указали!

Здесь обновленный список игнорирования для 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

Я также создал следующий список игнорирования для создания файла тегов для libstdС++ (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, но я думаю, что я воздержусь от его публикации до тех пор, пока кому-то не понадобится.