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 есть похожий инструмент для выгрузки библиотек?

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

Другие вопросы по тегам