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. python yield 和 return 对比分析
  2. 2014-5-14 我的战斗效果
  3. c 语言程序设计阚道宏,C语言用宏实现静态多态
  4. Grails 1.2参考文档速读(19):插件
  5. 浏览器插件 - 通用注入模版JS
  6. jsonpickle数据序列化
  7. War-Driving(战争驾驶***)
  8. c++邮递员投递经过特定点_厉害了斑马鱼,动物实验体天团C位
  9. PHP超全局变量$_SERVER
  10. Remoting疑惑续集之再续
  11. C#实现动态桌面背景图片切换(续)
  12. weblogic下载、安装、配置
  13. 计算机专业术语linklist,常见的计算机专业词汇 .
  14. developer.biao.daily.20140628
  15. 微信卡券怎么制作以及卡券封号推送消息技术分享
  16. Packet Tracer - 排除 HSRP 故障
  17. 阿里P8面试官总结的《2021最新java面试题》,搞定90%以上的技术面
  18. vivox27计算机功能,vivo x27 怎么连接电脑?
  19. Yocto系列讲解[实战篇]42 - bb文件中的几个关键词require DEPENDS inherit
  20. “希希敬敬对”Alpha版本发布说明

热门文章

  1. 想了解Xtrabackup备份原理和常见问题分析,看这篇就够了
  2. LiteOS内核源码分析:静态内存Static Memory
  3. 自定义TBE算子入门,不妨从单算子开发开始
  4. Python精确指南——第三章 Selenium和爬虫
  5. 【Angular专题】 (3)装饰器decorator,一块语法糖
  6. mysql 数据目录更换_更改Mysql数据目录,这个坑你可能也趟过~
  7. 自动门程序c语言,自动门控制程序共享
  8. tensorflow2.1GPU版本(Windows+conda)的安装过程小结
  9. python中str函数_python字符串str的常用函数
  10. 【gRPC基础知识】快速部署