我目前正在将基于 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 的生成是否需要存在 Tags ?
2 回答
我会说 YCM 不需要标签数据库。如果您将它编译为依赖 clang 解析器,那么您将获得非常智能的完成。没有它,多亏了标签,你会得到比没有好得多的东西。
否则,大多数其他插件都依赖标签数据库来完成各种事情。例如,标签栏将显示系统中标签的结构化轮廓。在lh-cpp和vim-refactor中,我在最后时刻构建了一个标签库,以推断父母、孩子、成员、跳转/生成函数定义等。
您必须知道,我们无法使用标签实现与使用基于 clang 的插件实现的智能一样的智能。生成标签实际上要快得多(但 YCM 在后台工作,以及标签生成插件,如 easytags (IIRC)、Gutentag 和lh-tags v2(我维护))。不幸的是,他们错过了可能的信息。特别是当我们使用不太活跃的 ctags 时——我强烈建议使用通用 ctags来解析 C++ 代码,它甚至可以理解 C++11 结构。
如果您的.ycm_extra_conf.py
设置正确,则不需要 ctags。
如果您let g:ycm_collect_identifiers_from_tags_files = 1
, 并使用 option 生成 ctags --fields=+l
,则 YCM 识别 ctags 并将所有标签完成为标识符,它作为语义完成不准确。和大 ctags 文件使用大量内存。所以不推荐使用ctags。
编辑:
YCM 使用 clang 作为语义后端。并.ycm_extra_conf.py
设置所需的标志。您可以生成编译数据库,但是当您添加新文件时,您需要重新创建编译数据库。
注意.ycm_extra_conf.py
是一个python文件,所以你也可以动态生成标志。在我的开发中,大多数标志是相同的,但包含标志会发生变化。所以我使用一个全局.ycm_extra_conf.py
来生成包含.h
我项目中所有文件的标志。这种方式通常我不需要 create .ycm_extra_conf.py
,并且所有的完成和 goto 功能都可以工作。
您可以下载我的全局.ycm_extra_conf.py,并根据自己的喜好更改一些固定标志,并将其放入您的项目根目录或将其设置为全局,然后您的完成应该可以工作。