ctags和youcompleteme的比较

Posted zwlwf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ctags和youcompleteme的比较相关的知识,希望对你有一定的参考价值。

ctags和youcompleteme是vim常用的两个代码提示工具。前者更古老简便,后者更先进。他们都是很优秀的软件工具,这里对他们进行对比梳理,以达到灵活使用他们的目的。

基本使用介绍。

ctags是vim内在就支持的,ctags -R产生tags文件,vim中通过set tags=/path/to/tags文件,即可达到使用tags文件中的符号进行补齐、查看定义点等目的。注意为了能全局使用最后使用ctags -R $PWD,产生的tagfile的路径为绝对路径。

youcompleteme是C-S模式的(主要讨论C/C++语言),client端为vim,vim将当前编译的文件、编辑点、编译选项等发送个clangd这个服务器,clangd返回补齐的提示信息、符号跳转的目的地址等信息。ycm更多是单个translation-unit的视角。
clangd的版本最好高一点。我用13.0版本有点问题。15.0 is ok。

使用场景介绍

ctags更多的是项目视角的。ctags适合在一个新的workspace上开始,又希望依赖某个成熟项目进行提示。实践下来,可以先写个函数,跳一下定义激活一下(原因可能是同时装了youcompleteme, vim没从ycm的模式中跳出来)。

而youcompleteme是translation-unit的视角,需要当前编辑的文件有一点基础代码。对于写一个空的C/C++程序时,我们记忆碎片可能就某些函数名片段、变量片段,而记不清头文件是什么。。。

可视化的友好程度的比较

总体上,youcompleteme的跳转更准确一点,clangd,tags的跳转精度取决于你的tags文件的生成质量,ctags程序生成的tags标签太多太杂。
代码补齐的提示信息方面,youcompleteme更丰富一些,如函数的原型、用户的注释提示信息都可以看到。

透明程度

作为用户,ctags的tags文件是明文的,很直接很透明。ycm vim和clangd的交互信息用户不可见。

vim的tags文件可以自己生成。只要了解了他的格式。
为了兼容性,tags文件每行的格式前三项都是(更多信息参考https://docs.ctags.io/en/latest/man/tags.5.html#tags-5

tagname\\ttagfile\\ttagaddress

tagname需要按照升序来排。这个可以作为跳转时匹配光标下函数、变量、头文件名等,也是补齐中会联想的符号。
tagfile表示标签定义的文件路径,要是想在任何地方用,最好定义成
tagaddress就像任何Ex命令(可以认为是非交互式vim,需要在脚本中自动去编辑文件的操作时可能会用到),用于定位到文件中的具体位置。可以是行号,也可以是匹配的pattern。后者的好处是即使tagfile中加了些无关的行,也能快速匹配到。
在满足基本兼容性的前提下,开发新应用的时候,可以在tagaddress中加;",可以作为更丰富的提示信息(如函数的原型而不仅仅是函数名)展示在prompt中。

Questions about youcompleteme

youcompleteme以plugin/youcompleteme.vim脚本形式出现在vim中,vimrc中runtimepath加这个plugin所在路径,即可使用YcmCompleter等命令

  1. vim怎么准备当前的数据给clangd?
  2. vim以怎么样参数告诉clangd?

vscode中用不好clangd可能是因为clangd的路径设置有问题。

set the clangd.path string in settings.json.

Fedora 27安装vim插件YouCompleteMe

1. YouCompleteMe是一款强大的Vim插件,它可以实现代码的自动补全,跳转到定义等功能,并且支持java, python, go, c家族等多种语言。 网址: https://github.com/Valloric/YouCompleteMe 2. 其github的网站上详细地给出了安装该插件的步骤,但是由于该插件所依赖的软件和库比较多,稍有出入就会出错,所以该插件也被称为史上最难安装VIM插件。经过了一天在CentOS6.8系统上痛苦的折磨之后,我终于放弃了CentOS6.8,转投到fedora27上重新折腾(其实是因为我把CentOS搞崩了)。这次的安装还算比较顺利。下面记录一下安装过程。 3. 首先要检查VIM的版本,目前需要大于7.4.1578,fedora27的vim版本是8.0,通过。如果你的系统是低于要求版本的,需要升级vim. 4. 跟随官网推荐,使用Vundle这个vim插件管理器来安装YouCompleteMe,需要先安装Vundle. 按照这里的方法基本上就没有问题:https://github.com/VundleVim/Vundle.vim#about 需要注意的是Vundle官网给出的.vimrc的例子中包含了很多额外的插件,我们需要装的只有两个就是:Plugin ‘VundleVim/Vundle.vim‘,和Plugin ‘Valloric/YouCompleteMe‘, 我们要确保这两行被添加在.vimrc文件中,其他是都是可选的。如果是小白,最好先把其他的都删掉以免不必要的麻烦。其他可选的步骤都可以先略去。 5. 等待漫长的时间后------也许很快,我的就很快,不到一分钟,是因为一开始就出错了。 报错:YouCompleteMe unavailable: no module named xxx, 具体模块名忘记了。 这时参考网站:https://www.jianshu.com/p/d908ce81017a?nomobile=yes 中‘通过git安装YCM‘的步骤,同时也参考YCM官网的‘Full Installation Guide‘中的说明: If you don‘t install YCM with Vundle, make sure you have run git submodule update --init --recursive after checking out the YCM repository (Vundle will do this for you) to fetch YCM‘s dependencies. 这里指出如果没有通过Vundle来YCM安装的话,需要先git clone YCM, 再执行git submodule update --init --recursive 这条命令来获取YCM依赖包。 我虽然用了Vundle安装YCM, 但是貌似没有安装成功,那就算是满足 ‘没有通过Vundle来安装’ 这个条件吧。照着执行了git submodule update命令,大约十几分钟后,执行完成,没有报错。打开vim,也没有先前的错误,说明已经安装YCM插件。 还要说明的是我并没有按照简书上面的步骤安装libclang, 也没有编译ycm_core库,我仅仅是git submodule update,然后就执行第6步了。 6. 到此,可以按照YCM官网后续步骤操作了,依次为安装开发工具和cmake, 安装python headers, 编译YCM. 我用的是没有c-family语义支持的。都比较顺利,没有出现过在CentOS中出现的升级glibc,升级gcc等问题。 7. 打开vim编辑一个python文件,发现已经可以代码补全。Great job !

以上是关于ctags和youcompleteme的比较的主要内容,如果未能解决你的问题,请参考以下文章

anaconda+youcompleteme

Fedora 27安装vim插件YouCompleteMe

YouCompleteMe入坑指南

Fedora 29安装vim插件YouCompleteMe

Fedora 29安装vim插件YouCompleteMe

linux ctags