现已推出!了解 11 月的新功能和修复。

适用于语言的通用协议

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 采用令人兴奋的原因,Codenvy 已将其添加到下一代 Eclipse IDE Eclipse Che 中,以及 Red Hat,他们正在努力发布一个独立的 Java 语言服务器,任何使用该协议的工具都可以使用它。

开放规范

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

下一步

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

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

祝您编码愉快!

VS Code 团队,@code