为Boost生成合理的ctags数据库

时间:2010-05-13 08:57:06

标签: c++ linux vim boost ctags

我正在运行Ubuntu 8.04并运行命令:

$ 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标签文件,似乎运行得相当好。

但是,当我对安装的Boost标头运行相同的命令时:

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

我最终得到了一个1.4 GB的标签文件!我还没有尝试过,但看起来它似乎太大而无法使用。有没有办法为我安装的Boost标题获得更纤薄,更实用的标签文件?

修改

正如笔记一样,libstdc ++包含TR1,其中包含许多Boost库。因此,libstdc ++必须有一些奇怪的东西可以提供一个4 MB的标签文件和Boost最终得到一个1.4 GB的标签文件。

刚刚在Boost邮件列表中遇到过这个问题:

Boost-users Boost and autocompletion

答案

感谢Neg_EV弄清问题是什么,但是解决问题的方法比他建议的要好得多:

确保apt-file已安装,并运行以下命令

(我将我的库标签保存在〜/ .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版本。

4 个答案:

答案 0 :(得分:9)

我知道这篇文章有点旧,但我遇到了同样的问题。我进一步调查了一下,似乎是boost中的一个文件夹引起了问题: typeof 。我使用的是boost 1.37,我的标签文件是1.5G,typeof是1.4G。所以我刚刚创建了一个没有包含该目录的标签文件,结果大小为70M。我甚至能够在不用空间的情况下对它进行排序:)我想在更新版本的boost中,它们可能是其他太大的项目,但是我找到的一般解决方案就是这个......

  1. 单独为每个boost文件夹生成一个标记文件,一个简单的bash for循环应该能够做到这一点。
  2. 看看哪些太大了。
  3. 创建一个新的单个标签文件,不包括那些大型目录,或者保持标签文件分开,只删除那些太大的文件。
  4. 这是我使用的脚本(取自评论):

    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
    

    希望这有帮助。

答案 1 :(得分:8)

使用选项

--sort=foldcase

这样,标签的搜索就会变得更快。

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

之前

答案 2 :(得分:0)

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

这是我用于Boost 1.55的ENTIRE / usr / include / boost子目录的内容。我得到一个~128MB的标签文件。 -I似乎是这里的关键,有助于过滤伪标签生成。

注意:我在Ubuntu 14.04上使用ctags 5.9。我有一个特殊的-I用于为C ++标准头文件生成ctags。我花了一些时间来弄清楚为什么有些头文件几乎没有生成任何标签,而其他人生成了大量的标签。

答案 3 :(得分:-1)

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

  1. find /usr/include ( -name ".h" -o -name ".hpp" ) boost/typeof > boost_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_files.txt