YCM推荐选项

由于C++语言的复杂性,根据语义对C++进行代码补全并非易事。最近浏览YouCompleteMe项目,发现它已经开始向用户推荐使用clangd作为C++ Completer。与libclang相比,YCM列举了不少clangd的优势(如下图所示)。简单讲,clangd的好处有:全项目索引、代码跳转、变量重命名、更快的代码补全、提示信息、格式化代码等。

图1 YCM列举的clangd优势

YCM的建议也呼应了2018年XCode团队将目光从libclang转向clangd的动作。尽管YCM的install.py脚本依旧将clang completer列为测试功能。但看过clangd的优点,让人不禁期待尝试一番。

图2 YCM依旧讲clangd-completer标注为测试功能

谈到clangd,就不得不提及LSP(Language Server Protocol)。为了减少插件作者在不同编辑器上的重复工作,LSP协议定义了补全器前端和补全器后端的接口。这就使得插件作者只需要针对某款编辑器开发LSP前端插件,保证其能够跟类似clangd的补全器后端进程通信接口。一般情况下,当编辑器打开后,补全器后端进程便会被创建。当编辑器关闭后,补全器后端进程也会随着终止。clangd就是LLVM团队开发的C系语言补全器,可以为C、C++、Objective-C等语言提供代码补全、跳转等服务。

作为知名C++ completer,可以与clangd配合工作的编辑器插件不在少数。在Vim编辑器上就有YCM、vim-lsp等插件,在VSCode上也有LLVM团队提供的clangd同名插件。下面,我将介绍在VSCode上使用clangd完成C++代码补全的过程。

安装clangd

由于clangd的工作原理与代码编译过程联系紧密,所以我建议大家在可以对项目进行编译的环境安装clangd程序。根据LLVM的官方说明,大部分Linux开发版都提供了clangd二进制包。在Ubuntu 19.10和Ubuntu 20.04上,只需要执行如下指令便可以安装clangd。

sudo apt install clangd

在安装好clangd后,还需要安装与clangd交互的LSP前端。我这里选择以VSCode Remote-SSH方式安装clangd插件。

图3 VSCode插件clangd

远程安装成功后,我们可以在~/.vscode-server/extensions/目录下看到插件llvm-vs-code-extensions

配置Compilation Database

接下来,就需要为目标项目配置Compilation Database。由于clangd依赖编译器前端提供索引和AST信息,这也注定了clangd在提供高准确跳转/补全的同时,也要用户配置好项目的“编译说明”,这个“编译说明”便被称为Compilation Database。

在clangd看来,Compilation Database是一个名为compile_commands.json的JSON文件,它会记录每个.c/.cpp文件的编译依赖和编译选项(如图4所示)。如果一个项目源码文件较多,可以借助bear等工具在项目编译过程中记录相关编译选项。

# 为使用GNU make的项目创建Compilation Database
sudo apt install bear
bear make

图4 Compilation Database中某.c文件的编译信息

在Compilation Database创建成功后,便可以通过VSCode Remote-SSH打开某C/C++项目代码。启动后端clangd进程会主动寻找项目根目录下的compile_commands.json文件,并根据文件中记录的编译信息,在项目根目录下的.clangd文件夹中生成相关索引文件。下面是clangd前后端配合,为用户提供的类似Visual Studio IntelliSense功能。

图5 clangd提供帮助信息、代码补全、引用查看等功能

资源消耗

目前看来,在配置好Compilation Database后,clangd的各项功能运转正常、反应灵敏,其能够实现跨Translation Unit(TU)的补全/跳转。但其资源占用也同样可观。对于一个32MB源码量的C语言项目,compile_commands.json文件达到了526KB(当然这个跟项目中源代码文件数有关),而后台clangd进程则占用了127MB物理内存。

图6 top显示的clangd资源占用情况

综合来看,通过clangd实现C++代码补全的方案还是值得尝试的。与VSCode提供的C/C++ Extension相比,clangd的优势应该是在开源可控,满足大家DIY的需求。

html没有代码补全 vscode_借助clangd实现VSCode C++代码补全相关推荐

  1. c语言 vscode代码自动补全_借助C/C++ Extension实现VSCode C++代码补全

    在VSCode C/C++ IntelliSense领域,目前有两位实力相当的选手,它们分别是基于微软闭源技术的C/C++ Extension和开源方案clangd.根据我目前体验,它俩的特性可以总结 ...

  2. Windows11 WSL2 ubuntu中vscode调试代码

    Windows11 WSL2 ubuntu中vscode调试代码 Windows11 WSL2 ubuntu开发环境使用分享 第一章 Windows11 WSL2 安装ubuntu18.04并运行RO ...

  3. 代码补全_AI加持,Kite增加智能代码补全功能:减少一半操作,实时补全

    代码补全工具 Kite 近日更新了最新的版本,增加了名为「Intelligent Snippets」的新功能.这一功能可以帮助开发者更为智能和高效的补全 Python 代码中的函数命令了. 机器之心报 ...

  4. html插入flash代码_初学者必备Web开发APP,支持代码补全,一键插入代码,厉害了!...

    新手学前端神器,HTML代码补全功能太牛了! 讲过学习后端的许多优秀APP,这次来推荐一下前端用的软件. 前端,包含了HTML+CSS+JavaScript这一整套的流程,缺一不可. 其实,市面上用来 ...

  5. eclipse代码自动提示设置、如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)?

    eclipse代码自动提示设置.如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)? 参考文章: (1)eclipse代码自动提示设置.如何配置eclipse的代码自动提示功能( ...

  6. 吴恩达斯坦福CS230第一名:图像超级补全,效果惊艳(附代码)

    [新智元导读]图像修复(Image inpainting)是一个已经被广泛研究的计算机视觉问题,即恢复图像中缺失的部分.斯坦福大学CS230课程的Mark Sabini等人提出"Image ...

  7. idea自动补全代码,一秒生成new List,写代码更便捷,快捷方法!

    自动补全List<lo> xx = new Arraylist<>(); 点击设置 点击编译器选中后缀补全,点击+号 选中java 上面的list是快捷方式 下面需要补全的就是 ...

  8. 【vscode基于clangd实现Android/Linux代码跳转】

    背景: 在开发大型工程例如Android或Linux时若我们使用vscode搭配官方的C/C++插件使用发现,经常很多代码都无法跳转,代码补全功能几乎是废的,通过网友以及同事身边了解之后发现vscod ...

  9. vscode css智能补全_强大的 VS Code入门

    简介 在 Build 2015 大会上,微软除了发布了 Microsoft Edge 浏览器和新的 Windows 10 系统外,最大的惊喜莫过于宣布推出免费跨平台的 Visual Studio Co ...

最新文章

  1. 32位linux运行64位jdk,linux64位操作系统装32位jdk解决方法
  2. Chrome浏览器扩展程序的本地备份
  3. 什么变量在堆内存里存放,什么变量在栈内存里存放
  4. 淘宝一淘网收录部分垂直B2C网站信息
  5. 人工智能秘史(四):憧憬人机共生的“DARPA梦想家”
  6. 编程语言对比 导入模块
  7. netbeans php 断点调试,windows7 + iis7 + fastcgi + php5 + netbeans + xdebug 调试 php
  8. Lcs客户端配置和测试
  9. 支付宝mysql集群_支付宝支撑2135亿成交额的数据库架构原理
  10. 4. HTTP Status Code
  11. Iphone 5s 8.0.2越狱
  12. 蓝桥杯 杨辉三角形 python组省赛真题
  13. linux sed替换行,shell - 使用Sed替换包含字符串的整行
  14. 海康web插件视频播放异常
  15. html手机端富文本,移动端富文本踩坑
  16. 醉袖迎风受落花——好代码的10条认知
  17. 【入门】Markdown的高级应用、计算机硬件、linux基本命令
  18. 使用Apriori算法寻找频繁样式(Frequent Patterns)
  19. 用Python解决一个简单的数论问题——x分解为a^2+b^2
  20. 安全生产施工单位材料准备清单

热门文章

  1. 带你读Paper丨分析ViT尚存问题和相对应的解决方案
  2. 一个15年的架构师谈“如何成为一名优秀的解决方案架构师”
  3. 【华为云分享】应用系统迁移华为云评估
  4. Vue+ElementUI项目使用webpack输出MPA
  5. 带着canvas去流浪系列之四 绘制散点图
  6. 设置python的中文字体显示
  7. Python输出帮助文档的方法及命令详解
  8. 用PaddlePaddle(飞浆)实现车牌识别
  9. 特征工程系列学习(零)引言
  10. Java 计算两个日期相差的天数