代码之家  ›  专栏  ›  技术社区  ›  Robert S. Barnes Antoni

为Boost生成合理的ctags数据库

  •  21
  • Robert S. Barnes Antoni  · 技术社区  · 16 年前

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

    生成标准c++库和STL(LIbSTDC++)的CTAGS数据库,供我的系统使用 OmniCppComplete vim脚本。这给了我一个非常合理的4MB标签文件,似乎工作得相当好。

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

    我最终得到了 一个1.4 GB的标签文件!

    编辑

    刚刚在Boost邮件列表中看到:

    Boost-users Boost and autocompletion

    答案

    感谢NegèEV找出了问题所在,但有比他建议的更好的解决问题的方法:

    (我将库标签保存在~/.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
    

    3 回复  |  直到 15 年前
        1
  •  10
  •   Michael F    12 年前

    我知道这个帖子有点旧,但我也遇到了同样的问题。我进一步研究了一下,似乎是boost中的一个文件夹导致了这个问题: . 我使用的是boost 1.37,我的标签文件是1.5G,typeof是其中的1.4G。所以我只是创建了一个标签文件,没有包含这个目录,结果大小是70M。我甚至能够在不耗尽空间的情况下对其进行排序:)我想象在更新版本的boost中,它们可能是其他太大的项目,但是我发现的一般解决方案是。。。

    1. 分别为每个boost文件夹生成一个标记文件,一个简单的bash for循环应该可以做到这一点。
    2. 看看哪些太大了。

    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
  •  8
  •   Vicky    16 年前

    使用选项

    --sort=foldcase
    

    引用 man page of ctags : “foldcase值指定不区分大小写(或大小写折叠)排序。使用大小写折叠排序的标记文件的快速二进制搜索将需要使用标记文件的工具的特殊支持,例如ctags readtags库或Vim版本6.2或更高版本(使用“set ignorecase”)。此选项必须出现在第一个文件名之前“

        3
  •  0
  •   David Harrison    11 年前

    您应该将此选项添加到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"
    

    这是我在boost1.55的整个/usr/include/boost子目录中使用的内容。我得到一个大约128MB的标签文件。 并帮助过滤虚假的标签生成。

    注意:我在ubuntu14.04上使用ctags5.9。我有一个特殊的I,用于生成C++标准头的CTAGS。我花了一段时间才弄明白为什么有些头文件几乎没有生成标记,而有些头文件却生成了大量的标记。

        4
  •  -1
  •   Leonard Tang    5 年前

    因为生成的方法(例如vector50.hpp vector100.hpp…)太多,所以ctags生成一个大的标记文件

    1. 查找/usr/include(-name) .h“-o-名称” .hpp“)增压/typeof>boost\u files.txt文件
    2. 编辑boost_files.txt并删除vector50.hpp vector100.hpp vector150.hpp vector200.hpp
    3. ctags--c++-kinds=+px--fields=+iaS--extra=+q-f test.tags-L boost\u files.txt