LSPService

👩🏻‍🚀 本项目仍然处于实验阶段。欢迎贡献者和先行者!

是什么?

LSPService 是一个本地 Web 服务,允许编辑器通过 WebSocket 与任何本地 LSP 语言服务器通信。

LSPService 本身是用 Swift 编写的,并且主要使用 Swift 语言服务器 (sourcekit-lsp) 进行测试。但原则上,LSPService 可以连接到所有语言服务器,并且将来可以轻松添加 Linux 支持

LSPService 包本身包含的代码非常少,因为它 a) 大量利用了 Vapor,并且 b) 我将其中的大部分功能提取到了 SwiftLSPFoundationToolz 中。

为什么?

语言服务器协议是软件开发工具的现在和未来。但将其用于工具项目 оказалось 很困难。

例如,我通过 Mac App Store 分发 一个开发者工具,所以它必须是沙盒化的,这使得它无法直接处理语言服务器或技术世界的任何其他“工具”。

所以我想:如果语言服务器只是一个本地 Web 服务会怎么样? 可能的好处:

如何?

首先:如何配置 LSPService

如果 LSPServiceConfig.json 文件尚不存在,LSPService 将在启动时创建一个。 如果文件存在,它会从文件中加载服务器配置。

用户或管理员应该通过编辑 LSPServiceConfig.json 来配置 LSPService。 将来,LSPService 创建的配置文件包含所选已安装语言服务器的条目。 目前,自动检测仅适用于 Swift。

作为编辑器的用户

  1. 下载并打开 LSPService。 它将在终端中运行,只要它在那里运行,该服务就可用。 检查:https://:8080
  2. 要添加语言服务器,请将相应的条目添加到 LSPServiceConfig.json 并重新启动 LSPServiceLSPService 创建的 LSPServiceConfig.json 文件至少包含一个条目,并且 JSON 结构非常不言自明。

作为编辑器的开发人员

  1. 让你的编辑器使用 LSPService
  1. 为你的用户提供 LSPService 二进制文件的下载(适用于 Apple + Intel 芯片)
  1. 让你的编辑器鼓励用户下载并运行 LSPService

开发编辑器

编辑器 vs. LSPService – 谁负责?

LSPService 的唯一目的是通过 WebSockets 使本地 LSP 语言服务器可访问。

LSPService 将来自某个编辑器(通过 WebSockets 传入)的 LSP 消息转发到某个语言服务器(传出到 stdin),反之亦然。 它对 LSP 标准本身一无所知(除了如何检测语言服务器输出中的 LSP 数据包)。 编码和解码 LSP 消息以及通常使用正确的类型表示 LSP 仍然是编辑器关心的问题。

另一方面,编辑器对如何与语言服务器通信、定位和启动一无所知。 这些仍然是 LSPService 关心的问题。

WebSocket

架构

以下是 LSPService 的内部架构(组成和基本依赖关系)

上面的图像是用 Codeface 生成的。

开发状态

从版本/标签 0.1.0 开始,LSPService 遵循 语义版本控制。 因此,在达到 1.0.0 之前,REST API 或设置机制可能仍然会频繁中断,但这将在版本升级中得到体现。

LSPService 已经在生产中使用,但 Codeface 仍然是其主要客户端。 LSPService 将在以下情况立即升级到 1.0.0 版本

  1. 基本实用性和概念合理性已通过为多个实际客户端提供服务得到验证。
  2. LSPService 具有版本控制机制(参见路线图)。

待办事项/路线图

相当可选的东西 (积压)