
lsp.vim 自定义扩展教程接管 LSP 请求与通知的完整指南【免费下载链接】lspLanguage Server Protocol (LSP) plugin for Vim9项目地址: https://gitcode.com/gh_mirrors/lsp/lsplsp.vim 是一个使用 Vim9 script 编写的语言服务器协议LSP插件它让你在 Vim 9.0 及以上版本中轻松获得代码补全、跳转定义、诊断提示等智能编辑能力。而本篇 lsp.vim 自定义扩展教程将聚焦一个进阶主题如何通过customNotificationHandlers和customRequestHandlers两个配置项接管语言服务器发来的 LSP 请求与通知实现完全自定义的插件行为全程无需改动插件源码。什么是 LSP 请求与通知先搞懂消息机制Language Server Protocol 本质上是一套基于 JSON-RPC 的消息协议客户端Vim与语言服务器之间会持续交换三类消息请求、通知与响应。通知Notification单向消息通知是单向的发送方发出后不需要等待回应。例如 Vim 向服务器发送的textDocument/didChange文件内容变化以及服务器向 Vim 发送的日志、进度更新等。这类消息在源码中由sendNotification函数构建见 lspserver.vim。请求Request必须回应的双向消息请求则必须携带id接收方需要返回对应的响应。比如常见的textDocument/hover悬停文档、textDocument/completion补全。服务器也可能主动向客户端发请求如workspace/applyEdit请求应用编辑。理解这些区别后你就知道接管意味着拦截服务器发来的消息用自己的逻辑处理而不是走插件默认路径。为什么需要自定义扩展三大典型场景在开始写代码前先看看自定义扩展能解决哪些实际问题静音噪音通知一些语言服务器会发送插件不认识的通知如$/typescriptVersion导致每次都有提示干扰。处理服务器私有协议部分服务器有非标准的自定义方法需要客户端配合响应。接入自己的工作流比如收到某条通知后自动刷新状态栏、写入日志、触发外部命令。快速开始lsp.vim 自定义通知处理customNotificationHandlers在注册语言服务器时为LspAddServer()的配置字典添加customNotificationHandlers即可。它的键是通知方法名值是一个接收(lspserver, reply)两个参数的函数其中reply.params存放通知数据。示例接管 TypeScript 版本通知vim9script call LspAddServer([{ name: typescriptlang, filetype: [javascript, typescript], path: /usr/local/bin/typescript-language-server, args: [--stdio], customNotificationHandlers: { $/typescriptVersion: (lspserver, reply) { echom printf(TypeScript Version %s, reply.params.version) } } }])这样服务器上报的 TS 版本信息就会被你的处理器接管你可以显示它、记录它或干脆忽略它。官方文档对这两个配置项有更详细的说明参见 doc/lsp.txt。静音不需要的通知如果某个通知你完全不关心只需给一个空函数通知就会被吞掉customNotificationHandlers: { $/typescriptVersion: (lspserver, reply) {} }消息分发逻辑位于 handlers.vim插件会先查找内置处理器找不到再查找你的customNotificationHandlers仍找不到才会走默认的未支持通知提示流程。进阶实战自定义请求处理器customRequestHandlers与通知不同请求必须回应。customRequestHandlers的值是接收(lspserver, request)的函数request中包含method、params和id。示例响应服务器发来的自定义请求customRequestHandlers: { myServer/checkLicense: (lspserver, request) { echom 收到自定义请求: .. request.method 处理后必须回执 lspserver.sendResponse(request, {valid: v:true}, {}) } }关键点是调用lspserver.sendResponse(request, result, error)返回结果第一个参数传原请求、第二个传结果、第三个传错误没有错误就传空字典。忘记回应的后果如果你未注册处理器插件会向服务器返回Method not found-32601错误如果你注册了处理器但抛出了异常插件会捕获并返回Internal error-32603同时通过traceLog记录日志。相关实现见 handlers.vim开发者可以借鉴其中参数校验、错误回执的写法。自定义处理器中的 lspserver 对象 API 速查lspserver对象是处理器的万能遥控器常用成员包括sendResponse(request, result, error)回执请求响应sendNotification(method, params)主动向服务器发通知rpc(method, params)/rpc_a(method, params)同步/异步发送请求并获取结果traceLog(msg)/errorLog(msg)写入日志便于调试getTextDocPosition()获取当前光标对应的文档位置对象这些方法定义在 lspserver.vim 中注册服务器后即自动挂载到lspserver字典上。调试技巧与常见问题接手自定义处理器时几个实用技巧能帮你少走弯路开启日志在处理器里调用lspserver.traceLog()再用:LspServer命令查看服务器消息记录观察请求与响应是否按预期流转。先打印后处理新接手的通知方法先用echom打印reply.params确认数据结构再写业务逻辑。注意 Vim9 语法整个插件基于 Vim9 script 编写配置文件开头要写vim9script字典用{}与匿名函数风格与旧版 Vim script 不同。安装与加载如果你的插件目录还没就绪可先克隆代码仓库https://gitcode.com/gh_mirrors/lsp/lsp再在.vimrc中加入packadd lsp启用注册服务器与配置选项则统一通过autocmd User LspSetup初始化。小结通过customNotificationHandlers与customRequestHandlers你可以在不改动 lsp.vim 源码的前提下灵活接管语言服务器的 LSP 请求与通知静音噪音消息、适配私有协议、集成自定义工作流。掌握这套 lsp.vim 自定义扩展方法后你的 Vim 就能真正听懂每个语言服务器的专属语言。结合 handlers.vim、lspserver.vim 与 doc/lsp.txt 三份关键资料动手写一个属于自己的处理器吧【免费下载链接】lspLanguage Server Protocol (LSP) plugin for Vim9项目地址: https://gitcode.com/gh_mirrors/lsp/lsp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考