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}\t{tagfile}\t{tagaddress}

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

Questions about youcompleteme

安装的时候,对于不同的语言补齐需要去配置不同的server,对于C/C++来说,主要过程就是去下载clangd的包并解压(详细走读thirdparty/ycmd/build.py),脚本中的下载地址好像用不了。

download_url = ( 'https://github.com/ycm-core/llvm/releases/download/'
                   f'{ CLANGD_VERSION }/{ file_name }' )

可以直接手动下,然后指定clangd的地址,也可以顺利将vim用起来。

  1. vim怎么准备当前的数据给clangd?
    vimrc中runtimepath加这个youcompleteme的plugin所在路径,路径下有plugin/autoload子目录。
    vim启动后,youcompleteme以plugin/youcompleteme.vim脚本形式被vim加载, autoload/youcompleteme.vim怎进一步将函数封装和设置自动执行的时间间隔等内容。在.vim脚本中提供调用python脚本的函数(所以ycm的vim版本必须支持python builtin执行),而youcompleteme的主要功能(作为client的)入口就在YouCompleteMe/python/ycm/youcompleteme.py中实现。

vim是怎么准备数据的主要可以走读YouCompleteMe/python/ycm/youcompleteme.py中python代码进行理解。可以从YouCompleteMe/python/ycm/client/base_request.py文件的BuildRequestData函数返回值瞄一眼vim发给clangd的数据大致长什么样子。

  return {
    'filepath': current_filepath,
    'line_num': line + 1,
    'column_num': column + 1,
    'working_dir': working_dir,
    'file_data': vimsupport.GetUnsavedAndSpecifiedBufferData( current_buffer,
                                                              current_filepath )
  }
  1. vscode中clangd没起作用的原因?
    可能是因为clangd的路径设置有问题,估计国内下载默认clangd包有时候会被阻拦,可手动去在再指定。

set the clangd.path string in settings.json.

posted @ 2023-05-14 11:47  zwlwf  阅读(269)  评论(0)    收藏  举报