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}\t{tagfile}\t{tagaddress}
tagname需要按照升序来排。这个可以作为跳转时匹配光标下函数、变量、头文件名等,也是补齐中会联想的符号。
tagfile表示标签定义的文件路径,要是想在任何地方用,最好定义成
tagaddress就像任何Ex命令(可以认为是非交互式vim,需要在脚本中自动去编辑文件的操作时可能会用到),用于定位到文件中的具体位置。可以是行号,也可以是匹配的pattern。后者的好处是即使tagfile中加了些无关的行,也能快速匹配到。
在满足基本兼容性的前提下,开发新应用的时候,可以在tagaddress中加;"
,可以作为更丰富的提示信息(如函数的原型而不仅仅是函数名)展示在prompt中。
Questions about youcompleteme
youcompleteme以plugin/youcompleteme.vim脚本形式出现在vim中,vimrc中runtimepath加这个plugin所在路径,即可使用YcmCompleter等命令
- vim怎么准备当前的数据给clangd?
- vim以怎么样参数告诉clangd?
vscode中用不好clangd可能是因为clangd的路径设置有问题。
标签:文件,clangd,tags,youcompleteme,vim,ctags,比较 From: https://www.cnblogs.com/zwlwf/p/17398966.htmlset the clangd.path string in settings.json.