🚀 在 VS Code 中

通用语言协议

2016 年 6 月 27 日,VS Code 团队,@code

Visual Studio Code 是一款面向任何开发者的编辑器,无论你使用何种编程语言。在工具捆绑的语言或市场中的扩展之间,我们支持超过150 种语言。我们还致力于以开放方式开发 VS Code,并使驱动 VS Code 的组件可用和开源。我们最著名的组件之一是 Monaco 编辑器,但驱动 VS Code 的另一项技术是开放的、基于 JSON 的协议,任何人都可以通过实现“语言服务器”来使用该协议为 VS Code 添加对新编程语言的支持。

any developer any language any tool

任何语言,任何工具

今天在旧金山举行的 DevNation 会议上,我们与 Red Hat 和 Codenvy 一起宣布,该语言服务器协议现在正被整个行业的工具创建者和语言提供商采用。对于语言创建者而言,这意味着他们的语言在各种开发工具和操作系统上都具有增强的工具体验,类似于 TypeScript 开发者或 C# 开发者(通过 OmniSharp)今天获得的体验。这也意味着任何开发者都可以在任何工具上获得一致的编辑体验,即使该工具不是 VS Code。

工作原理

Visual Studio Code 为许多编程语言提供了丰富的语言支持。对特定编程语言的支持由语言服务器提供,该服务器对该语言有深入的理解。VS Code 与这些服务器通信,以启用丰富的编辑功能,如“错误和警告”、“重构”和“转到定义”。

language server protocol

以下示例说明了在例行编辑会话期间,工具和语言服务器如何通信语义信息

  • 用户在工具中打开一个文件(称为文档):该工具通知语言服务器文档已打开 (didOpen),并且该文档的信息由工具在内存中维护。

  • 用户进行编辑:该工具将文档更改 (didChange) 通知服务器,程序语义信息由语言服务器更新。在此过程中,语言服务器分析此信息,并将发现的错误和警告 (diagnostics) 通知工具。

  • 用户对符号执行“转到定义”:该工具向服务器发送 definition 请求。服务器使用包含定义的文档的 uri 和文档内的 range 进行响应。基于此信息,工具可以在定义位置打开相应的文档。

  • 用户关闭文档(文件):工具发送 didClose 通知,告知语言服务器文档现在不再位于内存中,而是由文件系统维护(即存储在文件系统中)。

这种通过 JSON-RPC 进行的通信在典型的会话过程中会发生多次。

language server sequence

这种架构允许 VS Code 与多个语言服务器交互,每个服务器都可以用任何语言实现(独立于工具实现的语言),并支持各种功能,只要它使用通用的基于 JSON 的协议。

它还使给定的语言服务器可以实现一次,并让不同的工具利用它。这就是为什么该协议已被 Codenvy 采用,他们已将其添加到下一代 Eclipse IDE Eclipse Che 中,以及 Red Hat,他们正在努力发布一个独立的 Java 语言服务器,任何使用该协议的工具都可以使用它,这令人兴奋。

开放规范

该协议的完整规范可在 公共 GitHub 存储库中找到,协议到目前为止的演变历史也是如此。随着越来越多的语言和工具采用它,我们打算与 Red Hat、Codenvy 和开源社区中的其他合作伙伴一起支持和发展该协议。任何人都可以像其他开源项目一样在 repo 上提问、提交问题或提交拉取请求。

下一步是什么

这仅仅是一个开始——OmniSharp (C#)、JSON、C++、xText、JavaFX 和 R 等编程语言的社区已承诺在未来发布其语言的语言服务器。完整的协议实现列表,包括语言服务器、编辑器和 SDK,可在 GitHub repo 上找到。

如果你想了解更多信息,请观看分组会议,查看 Red HatEclipse Che 团队的博客文章,并访问 GitHub 上的语言服务器协议 repo。甚至还有一个语言服务器演练,你可以在其中逐步了解用 TypeScript 和 Node.js 实现的工作语言服务器的源代码。当然,你可以用任何语言实现语言服务器!

编码愉快!

VS Code 团队,@code