我正在使用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功能。
2条答案
按热度按时间w8ntj3qf1#
Clangd目前不支持非自包含的文件。
在clangd问题跟踪器中有一个开放的bug:https://github.com/clangd/clangd/issues/45
rbl8hiat2#
我想提出一些建议,以尝试在您的情况下:有一些方法可以在Neovim设置中使用lsp-zero在包含的文件(如defs. h)中实现LSP功能:
创建一个.clangd文件:在项目的根目录中,创建一个包含以下内容的.clangd文件:
字符串
生成编译数据库:使用一个可以生成编译数据库的构建系统(例如,CMake中的-DCMAKE_EXPORT_COMPILE_COMMANDS=ON)。配置lsp-zero:在Neovim配置中,将compile_commands选项添加到clangd设置中:
型
也许使用替代语言服务器,如Bear,可在(https://github.com/rizsotto/Bear)获得。他是为多文件项目和头解析而设计的,可能为您的用例提供更好的支持。
另一种方法是使用Clangd扩展,如clangd-extensions,以潜在地改进头处理。
我希望这对你有帮助,并随时提出更多与此案有关的问题。