Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为Boost生成合理的ctags数据库_C++_Linux_Vim_Boost_Ctags - Fatal编程技术网

C++ 为Boost生成合理的ctags数据库

C++ 为Boost生成合理的ctags数据库,c++,linux,vim,boost,ctags,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/ < >为STL上的标准C++库和LIGBSTDC++提供一个CTAGS数据库,用于VIM脚本。这给了我一个非常合理的4MB标签文件,它似乎工作得相当好 但是,当我对已安装的Boost标头运行相同的命令时: $ ctags -R --c++-ki

我运行的是Ubuntu 8.04,我运行了以下命令:

$ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/stdlibcpp /usr/include/c++/4.2.4/
< >为STL上的标准C++库和LIGBSTDC++提供一个CTAGS数据库,用于VIM脚本。这给了我一个非常合理的4MB标签文件,它似乎工作得相当好

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

$ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q -f ~/.vim/tags/boost /usr/include/boost/
我最终得到了一个1.4GB的标签文件我还没有试过,但它看起来太大了,没用了。有没有一种方法可以为我安装的Boost头文件获取更精简、更可用的标记文件

编辑

需要注意的是,libstdc++包括TR1,其中包含boostlibs的分配。所以libstdc++产生了一个4mb的标签文件,Boost最终得到了一个1.4gb的标签文件,这肯定是有点奇怪

刚刚在Boost邮件列表中遇到以下内容:

答案

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

确保安装了apt文件,并运行以下命令

(我将我的库标签保存在~/.vim/tags/)中:

我已经升级到Ubuntu10.04和Boost1.40,这就是我测试这个解决方案的地方,但据我所知,它应该可以与任何Boost版本一起使用

使用该选项

--sort=foldcase
这样,标签的搜索速度就更快了

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

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

  • 分别为每个boost文件夹生成一个标记文件,一个简单的bashfor循环应该能够做到这一点
  • 看看哪些太大了
  • 创建一个新的标签文件,不包括那些大目录,或者只需删除那些太大的标签文件,就可以将标签文件分开
  • 这是我使用的脚本(摘自评论):


    希望这有帮助。

    您应该将此选项添加到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的标签文件在这里,-I似乎是关键,有助于过滤虚假标记生成


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

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

  • 查找/usr/include(-name.h“-o-name.hpp”)boost/typeof>boost_files.txt
  • 编辑boost_files.txt并删除vector50.hpp vector100.hpp vector150.hpp vector200.hpp
  • ctags--c++-kinds=+px--fields=+iaS--extra=+q-f test.tags-L boost_files.txt

  • 这会将标记文件的大小减少到合理的尺寸吗?我的意思是,stdlibc++包含了STL和TR1,它们实际上有一定的Boost,而且只有4MB!我不确定大小,但我在VIM中的标签搜索速度至少提高了5倍..没有。在Ubuntu 10.04中,包含排序选项并没有给我带来任何好处。仍在获取1.4G文件size@ancechu:如果您有兴趣查看OP,有一个经过测试的解决方案可以运行。使用此选项,即使是相同大小的CTAG,但E341错误已消失。谢谢我不认为您可以发布脚本?这应该生成单独的标记文件来查找罪魁祸首:for I in$(find-maxdepth 1-type d | grep-v'^\.$'| sed's/\.\/');不要重复$i;ctags-f~/tmp_tags/$i.tags-R--c++-gends=+p--fields=+iaS--extra=+q--languages=c++--sort=foldcase$i;然后,为了生成一个标记文件,您只需执行类似的操作:ctags-f~/tmp\u tags/all.tags-R--c++-gends=+p--fields=+iaS--extra=+q--languages=c++--sort=foldcase$(ls-d*|grep-v typeof);grep-v部分是我排除诸如typeof之类的东西的地方。这两个命令都假设您在boostinclude目录中。终于有时间尝试您的答案了。你的想法非常有效,但我有一个更容易实现的方法。有关详细信息,请参阅对我的OP的编辑。是否可以在不使用apt文件的情况下执行类似的操作(使其更广泛地使用?)例如,仅在ctags命令行上使用--exclude?就像你一样,我从1.4 g以上开始使用。删除了typeof,但我仍然是391 m。我想将其缩小到可能的十分之一。在boost 1.52上。。。有什么建议吗?@drfrogsplat不确定这是否仍然与您相关,但我没有使用zsh:
    ctags-R/usr/include/boost/*~*typeof(/)
    (其他cmdarg到ctags已被指定)求助于package manager实用程序,就达到了同样的效果。您需要启用扩展的globbing才能工作。@zanegray其他违规者可以在
    /usr/include/boost/
    下找到目录路径的计数。类似的东西对我很有用:
    grep-o'/usr/include/boost/[^/]*/'/path/to/boost标记文件| sort | uniq--count
    (这需要一些时间)
    phoenix
    spirit
    也相当大
    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
    
        -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"