在逐字包含的文件中使用 clangd

问题描述 投票:0回答:1

我正在使用 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 功能。

c++ neovim clangd nvim-lspconfig
1个回答
-1
投票

我想提出一些建议来尝试您的情况:有一些方法可以使用 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)来潜在地改进标头处理。

我希望它有所帮助,并随时提出与此案例相关的更多问题。

© www.soinside.com 2019 - 2024. All rights reserved.