Nano Hash - криптовалюты, майнинг, программирование

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 
11.04.2011

  • Я обдумываю вопрос, а между тем, не будет ли dpkg -L быстрее, чем apt-file list? 04.05.2011
  • @Phil Lello: Не знаю, не думаю, что это актуально, и в любом случае звучит как преждевременная оптимизация ;-) 04.05.2011

Ответы:


1

Вы также можете использовать модифицированную библиотеку 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()
07.05.2011
  • Я посмотрел на это, и дело в том, что я не уверен, что это необходимо. Пока файл тегов, который я создал, похоже, выполняет свою работу. 08.05.2011
  • @ Роберт С. Барнс: Надеюсь, мой ответ стал лучше. 08.05.2011

  • 2

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

    #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
    
    19.11.2012

    3

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

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

    06.05.2011
  • В Linux тоже есть nm. Также objdump. 08.05.2011
  • OS X использует те же утилиты GNU binutils, которые мы используем в Linux, в том числе nm, objdump и т. д. 10.05.2011

  • 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
    

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

    13.04.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..