简体中文
服务器的工作区状态限定在单条连接内,并通过 ServerContext 提供。本指南介绍服务端实现中与状态相关的部分。
Workspace 与 Documents 的所有权
每个处理器都会收到 ServerContext。它的视图暴露由协议引擎持续更新的状态:
rust
let documents = ctx.documents();
let workspace = ctx.workspace();
let client = ctx.client();这些对象属于单条连接。文档视图是不可变快照;打开、变更和关闭通知会原子更新框架状态。工作区文件夹、初始化选项、设置和跟踪级别会随协议事件更新。处理器不应把视图长期保存到连接之外,也不应另建一份可能漂移的打开文档表。
位置换算必须使用协商后的编码和文档视图辅助方法。变更版本或资源预算校验失败时,旧快照保持不变,变更后的钩子不会运行。
笔记本同步
注册笔记本同步后,lspf 会维护笔记本元数据及其单元格文档。单元格计入 max_documents 和 max_document_bytes,笔记本本身计入 max_notebooks。笔记本打开、结构变化、单元格文本变化和关闭都有独立钩子;单元格事件不会冒充普通文本文档钩子。
过滤器决定服务器接纳哪些笔记本。应用应在钩子中维护语言层索引,但把协议快照交给框架管理。
命令
命令按名称注册,并在 workspace/executeCommand 下分派。名称会按注册顺序自动加入能力声明。处理器负责验证 JSON 参数、检查取消令牌并返回可序列化结果;未知命令和无效参数会成为协议错误。
FileProvider 配置
请求要读取编辑器尚未打开的文件时,可以配置 FileProvider。打开文档始终优先使用内存快照,以免磁盘内容覆盖未保存编辑。提供器负责 URI 到存储的映射、I/O、大小限制和访问策略;失败应转换成适合用户的 LspError,不要把宿主内部路径或凭据写入响应。
处理器通过 ctx.client() 取得的 ClientHandle 可以发送诊断、消息、配置请求、动态注册、工作区编辑、进度和刷新请求。所有调用共享连接的有界出站资源,并能感知连接关闭;需要完整调用方式时参见向客户端发送请求。
ClientHandle 为诊断、消息、配置、动态注册、编辑、进度和刷新请求提供类型化辅助方法。所有调用共享连接的有界出站资源,并能感知连接关闭。