Подтвердить что ты не робот

Создание разумной базы данных ctags для Boost

Я запускаю Ubuntu 8.04, и я выполнил команду:

$ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/stdlibcpp /usr/include/c++/4.2.4/

для создания базы данных ctags для стандартной библиотеки С++ и STL (libstdС++) в моей системе для использования с OmniCppComplete vim script. Это дало мне очень разумный файл тегов 4 МБ, который, кажется, работает достаточно хорошо.

Однако, когда я запускал ту же команду против установленных заголовков Boost:

$ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/boost /usr/include/boost/

Я закончил с файлом тегов размером 1,4 ГБ! Я еще не пробовал, но похоже, что он будет слишком большим, чтобы быть полезным. Есть ли способ получить более тонкий, более удобный файл тегов для моих установленных заголовков Boost?

Edit

Как примечание, libstdС++ включает TR1, который имеет в нем Boost libs. Поэтому для libstdС++ должно возникнуть что-то странное, чтобы выйти с файлом тегов размером 4 МБ и Boost, чтобы в итоге появился файл тегов размером 1,4 ГБ.

Просто просмотрел это в списке рассылки Boost:

Boost-users Boost и автозаполнение

ОТВЕТ

Благодаря Neg_EV для выяснения, в чем проблема, но там гораздо лучший способ решить проблему, чем то, что он предложил:

Убедитесь, что apt файл установлен и выполните следующие команды

(Я храню теги библиотеки в ~/.vim/tags/):

$ sudo apt-file update
$ 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

Я обновил до Ubuntu 10.04 и Boost 1.40 и то, на что я тестировал это решение, но он должен работать с любой версией Boost, насколько я могу судить.

4b9b3361

Ответ 1

Я знаю, что этот пост немного стар, но я столкнулся с той же проблемой. Я посмотрел на него немного дальше, и кажется, что это одна папка в boost, которая вызывает проблему: typeof. Я использую boost 1.37, а файл моих тегов - 1.5G, typeof - 1.4G. Поэтому я просто создал файл тегов без этой директории, и полученный размер был 70M. Я даже смог отсортировать его, не исчерпывая пространства:) Я предполагаю, что в более новых версиях boost они могут быть другими слишком большими проектами, однако общее решение, которое я нашел, это...

  • Создайте файл тега для каждой папки ускорения отдельно, простой цикл bash for должен быть в состоянии сделать это.
  • Посмотрите, какие из них слишком большие.
  • Либо создайте новый отдельный файл тегов, за исключением этих больших каталогов, либо сохраните файлы тегов, просто удалив те, которые слишком велики.

Это script я использовал (взятый из комментариев):

for i in $(find -maxdepth 1 -type d | grep -v '^\.$' | sed 's/\.\///' ); do
    echo $i;
    ctags -f ~/tmp_tags/$i.tags -R --c++-kinds=+p --fields=+iaS --extra=+q --languages=c++ --sort=foldcase $i;
done

Надеюсь, что это поможет.

Ответ 2

используйте параметр

--sort=foldcase

При этом поиск тегов становится быстрее.

Цитата из man-страницы ctags: "Сложное значение задает сортировку, не учитывающую регистр (или сложенную в случайном порядке). Быстрые двоичные запросы файлов тегов, отсортированные с фальцовкой, потребуют специальной поддержки от инструментов с использованием файлов тегов, например, найденных в библиотеке ctags readtags или Vim версии 6.2 или выше (с использованием" set ignorecase "). Эта опция должна появиться перед первым именем файла"

Ответ 3

ДОЛЖНО добавить эту опцию к вызову ctags:

    -I "BOOST_SYMBOL_VISIBLE BOOST_SYMBOL_IMPORT BOOST_SYMBOL_EXPORT BOOST_FORCEINLINE BOOST_CONSTEXPR=constexpr BOOST_CONSTEXPR_OR_CONST=constexpr BOOST_STATIC_CONSTEXPR=static\ constexpr BOOST_STD_EXTENSION_NAMESPACE=std BOOST_MOVABLE_BUT_NOT_COPYABLE+ BOOST_COPYABLE_AND_MOVABLE+ BOOST_COPYABLE_AND_MOVABLE_ALT+ BOOST_NOEXCEPT=noexcept BOOST_NOEXCEPT_OR_NOTHROW=noexcept BOOST_NOEXCEPT_IF+ BOOST_NOEXCEPT_EXPR+ BOOST_STATIC_CONSTANT BOOST_DELETED_FUNCTION BOOST_DEFAULTED_FUNCTION BOOST_NESTED_TEMPLATE BOOST_UNREACHABLE_RETURN+ BOOST_DEDUCED_TYPENAME=typename BOOST_CTOR_TYPENAME=typename BOOST_LIKELY+ BOOST_UNLIKELY+ BOOST_ALIGNMENT+ BOOST_FALLTHROUGH"

Это то, что я использую для подкаталога ENTIRE/usr/include/boost для Boost 1.55. Я получаю файл тегов, который составляет ~ 128 МБ. Я, кажется, ключевой здесь и помогает отфильтровать генерации ложных тегов.

ПРИМЕЧАНИЕ. Я использую ctags 5.9 в Ubuntu 14.04. У меня есть специальный -I для генерации ctags для стандартных заголовков С++. Мне потребовалось некоторое время, чтобы понять, почему некоторые файлы заголовков генерируют почти никаких тегов, в то время как другие генерируют огромное количество тегов.