1 背景
尝试使用neovim开发stm32,使用clangd作为LSP提供代码补全等功能。
2 思路
-
使用stm32cubeMX生成一个基于makefile的stm32工程。
-
使用
bear
或compiledb
基于makefile生成compile_commands.json
文件。 -
为clangd配置
--query-driver
选项,使其使用arm-none-eabi-gcc
编译器的相关库文件进行代码补全。
由于
--query-driver
选项是直接传递给clangd可执行文件的参数,无法在当前目录下的clangd配置文件(如.clangd
)中进行配置。
如果你的neovim的LSP基于
coc.nvim
进行配置,则该参数可以在coc-settings.json
中进行配置,比较方便。
如果你的neovim的LSP基于
nvim-lspconfig
进行配置,则该参数需要在nvim-lspconfig
插件初始化clangd时传入。需要修改lua配置文件,比较麻烦。本文针对此情形提出一种解决方案。
3 解决方案
- 启用neovim的
exrc
特性,允许neovim从当前目录下的.nvim.lua
、.nvimrc
或.exrc
文件中读取局部的配置。使得开发者能够针对不同项目灵活配置LSP、DAP等,避免频繁修改全局的neovim配置。 - 在项目目录中创建
.nvim.lua
文件,在该文件中重新配置clangd并传入--query-driver
参数。
4 具体做法
-
在neovim配置中添加
set exrc
(vimscript)或vim.o.exrc = true
(lua)。 -
在项目目录中创建
.nvim.lua
文件。 -
在
.nvim.lua
文件中写入如下内容:
require("lspconfig").clangd.setup({
cmd = {
"clangd",
"--query-driver=*arm-none-eabi*",
-- NOTE:在Windows下使用如下绝对路径时反而无效
-- "--query-driver=${path_to_compiler}\\gcc-arm-none-eabi\\12.2.rel1\\bin\\arm-none-eabi*",
},
filetypes = { "c", "cpp", "objc", "objcpp", "cuda", "proto" },
})