22

我正在运行 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 和自动补全

答案

感谢 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

4 回答 4

10

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

  1. 为每个 boost 文件夹分别生成一个标签文件,一个简单的 bash for 循环应该可以做到这一点。
  2. 看看哪些太大了。
  3. 要么创建一个新的单个标签文件,不包括那些大目录,要么保持标签文件分开,简单地删除那些太大的标签文件。

这是我使用的脚本(取自评论):

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

希望这可以帮助。

于 2010-10-07T15:03:41.960 回答
8

使用选项

--sort=foldcase

有了这个,标签的搜索变得更快。

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

于 2010-05-13T13:04:23.363 回答
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 的整个 /usr/include/boost 子目录的内容。我得到一个大约 128MB 的标签文件。 -I 似乎是这里的关键,有助于过滤掉虚假标签的生成。

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

于 2015-04-13T15:23:03.613 回答
-1

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

  1. 查找 /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
于 2021-03-15T08:28:07.893 回答