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

本文介绍了如何在VSCode中利用clangd实现C++代码补全。通过安装clangd,配置Compilation Database,可以获得类似Visual Studio IntelliSense的功能。虽然资源消耗相对较高,但clangd提供了全项目索引、代码跳转、变量重命名等优点,适合对开源可控有需求的开发者。
摘要由CSDN通过智能技术生成

YCM推荐选项

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

793d826ca550e15e3b4fc7c7b18888cd.png
图1 YCM列举的clangd优势

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

9ae45820bec4642cbf09440405462711.png
图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插件。

fe6aa2761895f480301d59856dd7f7d1.png
图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

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

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

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

资源消耗

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

81afcd02a5df362990bdf323d6da5fc3.png
图6 top显示的clangd资源占用情况

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值