ctags игнорирует списки для libc6, libstdc ++ и boost - PullRequest
25 голосов
/ 11 апреля 2011

Я использую 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 ]

2 голосов
/ 07 мая 2011

Вы также можете использовать измененную библиотеку 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()
1 голос
/ 19 ноября 2012

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

#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

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

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

Обновление supt 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
0 голосов
/ 14 апреля 2015

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

Вот этот обновленный список игнорирования для 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, но я думаю, что я буду воздерживаться от публикации, пока кто-то не будет нуждаться.

0 голосов
/ 06 мая 2011

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

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

...