【发布时间】:2010-05-13 08:57:06
【问题描述】:
我正在运行 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 版本。
【问题讨论】:
-
可以在不使用 apt-file 的情况下完成类似的操作(以使其更广泛地有用吗?)例如只是在 ctags 命令行上使用 --exclude ?
-
就像你一样,我开始时超过 1.4 G。删除了 typeof 但我仍然在 391 M。我想将它缩小到可能的十分之一。在提升 1.52... 有什么建议吗?
-
@drfrogsplat 不确定这是否仍然与您相关,但我在不使用 zsh 的包管理器实用程序的情况下实现了相同的效果:
ctags -R /usr/include/boost/*~*typeof(/)(省略了其他 cmdargs 到 ctags)。您需要启用扩展 globbing 才能使其正常工作。 -
@zanegray 可以通过
/usr/include/boost/<libname>下的目录路径计数找到其他违规者。像这样的东西对我有用:grep -o '/usr/include/boost/[^/]*/' /path/to/boost-tags-file | sort | uniq --count(这需要一段时间)。phoenix和spirit除了typeof之外也相当大,但您可以排除更多,具体取决于您不关心的库(或不需要 ctags)。 -
使用 Boost 1.55,
fusion也很重(typeof为 1.4GB,phoenix为 193MB,fusion为 122MB)。其余的小于 6MB。