我正在使用 Neovim 和 lsp-zero 插件。以下最小示例模拟了我在大型代码库中遇到的情况。
#include
语句用于在整个代码库中重复的片段,每个应用程序在 main
函数中都有数十个此类文件。
文件
defs.h
:
a = 1;
b = 2;
文件
app.cpp
#include <iostream>
int main (int argc, char *argv[]) {
int a, b;
#include "defs.h"
std::cout << a + b << std::endl;
return 0;
}
LSP 功能在
app.cpp
中有效,但在 defs.h
中无效。有没有办法在包含的文件中获取一些 LSP 功能?理想情况下,我希望它能够正确处理编译错误,就像文件包含在 app.cpp
中一样,并且能够导航到每个变量的声明。
运行,
LspInfo
我注意到默认情况下clangd
以单文件模式运行。我尝试定义 .clangd
和 compile_commands.json
,但到目前为止没有成功,例如使用 bear
我做到了
bear -- g++ a.cpp
但是
defs.h
仍然缺少 LSP 功能。
我想提出一些建议来尝试您的情况:有一些方法可以使用 lsp-zero 在 Neovim 设置中的包含文件(如 defs.h)中实现 LSP 功能:
创建 .clangd 文件:在项目的根目录中,创建包含以下内容的 .clangd 文件:
{
"compile_commands": "${workspaceFolder}/build/compile_commands.json"
}
生成编译数据库:使用可以生成编译数据库的构建系统(例如,带 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON 的 CMake)。 配置 lsp-zero:在 Neovim 配置中,将compile_commands 选项添加到 clangd 设置中:
require('lspconfig').clangd.setup({
...
capabilities = require('lsp-zero').capabilities(),
cmd = { 'clangd', '--background-index' },
compile_commands = "build/compile_commands.json",
})
也许使用替代语言服务器,例如 Bear,可在 (https://github.com/rizsotto/Bear) 获得。他专为多文件项目和标头解析而设计,可能为您的用例提供更好的支持。
另一种方法是使用 Clangd 扩展(例如 clangd-extensions)来潜在地改进标头处理。
我希望它有所帮助,并随时提出与此案例相关的更多问题。