【问题标题】:What is the relation between .ycm_extra_conf.py and Exuberant Ctags.ycm_extra_conf.py 和 Exuberant Ctags 有什么关系
【发布时间】:2016-09-12 01:55:28
【问题描述】:

我目前正在将基于 C++ 的 IDE 从 XCode 切换到 Vim。 我一直在阅读有关 Vim 插件“YCM”的信息,它需要在源目录中存在 .ycm_extra_conf.py。我正在使用 YCM Generator 来生成 .ycm_extra_conf.py 和 Ctags 来生成标签。我的问题是什么使用标签? YCM 是否对 Ctags 有任何用处(它收集了有关代码的所有定义和重要信息)? YCM 是否以任何方式使用 CTags 生成的标签? .ycm_extra_conf.py 的生成是否需要存在标签?

【问题讨论】:

    标签: c++ vim ctags youcompleteme


    【解决方案1】:

    我会说 YCM 不需要标签数据库。如果您将其编译为依赖 clang 解析器,那么您将获得非常智能的完成。没有它,多亏了标签,你会得到比没有好得多的东西。

    否则,大多数其他插件都依赖标签数据库来完成各种事情。例如tagbar 将显示系统中标签的结构化轮廓。在lh-cppvim-refactor 中,我在最后时刻构建了一个标签库,用于推断父母、孩子、成员、跳转/生成函数定义等。

    您必须知道,我们无法像使用基于 clang 的插件所实现的那样智能地使用标签来实现。生成标签实际上要快得多(但 YCM 在后台工作,以及标签生成插件,如 easytags (IIRC)、Gutentag 和 lh-tags v2(我维护))。不幸的是,他们错过了可能的信息。特别是当我们使用不太活跃的 ctags 时——我强烈推荐 universal ctags 来解析 C++ 代码,它甚至可以理解 C++11 结构。

    【讨论】:

    • 感谢您的回答,所以如果 ycm 可以在不为对象生成 ctags 的情况下完美运行,这是否意味着每次我对项目进行更改(例如创建或删除一个类)时,我都会重新生成 .ycm_extra_conf。 py 文件?
    • YCM 不依赖于类,它适用于翻译单元。每个 .ycm_extra_conf.py 文件被读取一次。所以不,当我阅读文档时,您不必编辑它 (github.com/Valloric/YouCompleteMe#c-family-semantic-completion)。但是,如果您使用的是 CMake 生成的 json 编译数据库,则每次添加新文件时都必须使用正确的选项运行 cmake 以重新生成编译数据库。
    【解决方案2】:

    如果您的.ycm_extra_conf.py 设置正确,则不需要 ctags。

    如果您let g:ycm_collect_identifiers_from_tags_files = 1,并使用选项--fields=+l 生成ctags,则YCM 识别ctags 并将所有标签完成为标识符,它作为语义完成不准确。和大 ctags 文件使用大量内存。所以不推荐使用ctags。

    编辑:

    YCM 使用 clang 作为语义后端。并且 .ycm_extra_conf.py 设置所需的标志。可以生成编译数据库,但是当你添加新文件时,你需要重新创建编译数据库。

    注意.ycm_extra_conf.py是一个python文件,所以你也可以动态生成标志。在我的开发中,大多数标志是相同的,但包含标志会发生变化。所以我使用全局.ycm_extra_conf.py 来生成标志,以便在我的项目中包含所有.h 文件。这种方式通常我不需要创建.ycm_extra_conf.py,并且所有的完成和转到功能都可以工作。

    您可以下载我的全局.ycm_extra_conf.py,并根据自己的喜好更改一些固定标志,并将其放入您的项目根目录或设置为全局,然后您的完成应该可以工作。

    【讨论】:

    • 那么您是否建议我应该跳过标签生成过程?你能告诉我 .ycm_extra_conf.py 有什么帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多