Protobuf 已支持 LSP。不客气
摘要
Buf 宣布推出首个功能齐全、生产级的 Protobuf LSP 服务器,提供现代 IDE 支持,例如跳转到定义和代码补全,由 Buf CLI 驱动。
暂无内容
查看缓存全文
缓存时间: 2026/08/16 21:45
# Protobuf终于支持LSP了。不客气。· Buf
来源:https://buf.build/blog/protobuf-lsp
Buf荣幸地宣布,首个功能完备、生产级的Protobuf LSP服务器正式发布。
语言服务器协议(Language Server Protocol)是将语言支持集成到您喜爱的IDE或文本编辑器(如VSCode、IntelliJ或Neovim)中的标准API。LSP服务器提供智能功能,支持跳转到定义、代码补全、查找引用和语义感知的语法高亮。
此前,Protobuf缺乏其他主流编程语言享有的同等LSP支持。我们不想夸大自己的工作,但**这对Protobuf开发来说是个颠覆性变革**:Protobuf首次获得了现代IDE支持,全部由Buf CLI驱动。
在Buf,我们相信Protobuf是最优的模式语言,这得益于其成熟的库和工具生态系统。Protobuf不应仅仅是明智的选择,更应是便捷的选择。因此我们发布Buf LSP服务器,作为完善Protobuf生态系统工具家族的一部分,该家族还包括:
- Protobuf-ES(已在Chromium中使用!)
- Protovalidate
- ConnectRPC
- Buf Schema Registry
无论您的项目或用例如何,使用Protobuf开发都应是简单且*显而易见*的选择。
以下是试用指南!
## 安装Buf LSP
### VSCode
VSCode是最受欢迎的图形化编辑器之一,拥有出色的LSP支持(LSP最初源于VSCode)。只需安装Buf扩展,即可使用Buf LSP。该扩展会自动调用您已安装的Buf CLI(内置LSP服务器),若未安装则会自动配置。
### Neovim
Neovim是Buf工程师最喜爱的编辑器,Buf LSP与其完美兼容。只需安装Buf CLI,并将Neovim配置为使用该LSP服务器即可。
1. 确保已安装`nvim-lspconfig`仓库,该仓库提供默认LSP配置选项。安装说明见此处。
2. 在`.nvimrc`中添加`lspconfig.buf_ls.setup {}`。
或在`init.lua`(或其他配置文件)中添加以下内容:
```lua
vim.lsp.config('buf-lsp', {
cmd = { 'buf', 'lsp', 'serve' },
filetypes = { 'proto' },
root_markers = { 'buf.yaml', '.git' },
})
```
随后在`.nvimrc`中使用`vim.lsp.enable('buf-lsp')`启用即可。
了解更多关于LSP与Neovim的信息请参阅此处。
### 其他编辑器
若使用其他编辑器,请先了解其LSP集成方式,确保能够运行`buf lsp serve`命令启动服务器。
## 技术实现
Buf已长期维护Protobuf编译器前端(负责解析文件并调用插件的组件,如`protoc`),我们称之为`protocompile`。该实现不仅完全兼容标准,且比`protoc`更快速、更灵活。我们的编译器表现如此出色,以至于谷歌在其部分庞大代码库中已与`protoc`并行使用。
为构建Buf LSP,我们将`protocompile`提升至新高度。开发了全新的查询驱动前端,支持增量编译与更精准的诊断信息。例如,与`protoc`不同,我们能正确诊断重复的`repeated`修饰符错误:
```
error: encountered more than one type modifier
--> testdata/parser/type/repeated.proto:23:14
|
23 | repeated repeated M x4 = 4;
| -------- ^^^^^^^^ help: consider removing this
| |
| first one is here
```
我们设计了新的AST与中间表示结构以精准诊断这类错误,取代原先基于`FileDescriptorProto`的方式。其灵活性使我们能轻松支持Protobuf新增的语言特性(例如即将推出的2024版编辑特性)。同时该结构内存高效,可处理包含超大Buf模块的工作区。
## 未来规划
Buf LSP的开发永不止步。我们持续优化诊断功能,并计划为LSP服务器增添更多特性:
- 将`import`语句作为自动修复项添加
- 与`buf.yaml`更深度集成(例如自动导入模块)
- 为自定义选项实现代码补全与引用查找
- 自动建议字段/枚举编号
- 专项支持Protovalidate,包括CEL代码段的语法高亮
在Buf,我们始终致力于拓展Protobuf的能力边界,让所有人享受模式驱动开发的便利!
如需帮助规范组织数据标准,请联系我们了解Buf的解决方案。若热衷于构建卓越的开发者工具,请访问我们的招聘页面。
相似文章
Protobuf-py:专为Python打造的Protocol Buffers库,毫不妥协
Buf 宣布推出 protobuf-py,一个从头编写的全新 Python Protocol Buffers 库,通过了完整的兼容性测试套件,生成可读的类型化 Python 代码,并提供可选的 Rust 加速以提高性能。
protocolbuffers/protobuf
Protocol Buffers 是 Google 推出的语言无关、平台无关的数据交换格式。本 README 提供了协议编译器和运行时的安装说明与使用指南。
Go 语言服务器可以实现令人印象深刻的代码导航
Go 语言服务器 (gopls) 为 Go 开发者提供了令人印象深刻的代码导航功能,增强了 IDE 的能力。
宣布 BABLR
宣布 BABLR,一个全新的通用解析器框架和基于API的软件开发平台,旨在将IDE范式从文本文件编辑转变为代码文档编辑。它包含一个与 Tree-sitter 竞争的解析器框架、一个与 ESTree 竞争的解析树格式 agAST,以及一种新的数据语言 CSTML。
Gobee:用Go编写eBPF程序,通过clang转译
Gobee是一个将Go的子集转译为BPF C的工具,允许开发者用Go而非C编写eBPF程序。它为用户空间生成类型化的Go绑定,并利用clang的后端进行编译。