2024年VSCode Language Client扩展:客户端如何接收LSP服务器消息?
2024年VSCode LSP扩展接收服务器自定义消息实现方案
客户端(VSCode扩展侧)实现
当前vscode-language-client包已简化就绪状态监听逻辑,无需寻找旧版的onReady()方法,直接通过client.ready这个Promise等待客户端初始化完成,即可注册自定义消息处理器。
1. 就绪后注册自定义消息处理
import { LanguageClient } from 'vscode-languageclient/node'; import * as vscode from 'vscode'; // 假设已完成LanguageClient实例初始化 async function setupCustomMessageHandler(client: LanguageClient) { // 等待客户端就绪 await client.ready; // 处理服务器发来的自定义请求(需客户端返回响应) client.onRequest('custom/serverToClientRequest', async (params: any) => { console.log('收到服务器请求:', params); // 编写业务逻辑并返回响应 return { status: 'processed', result: '客户端已处理请求' }; }); // 处理服务器发来的自定义通知(无需返回响应) client.onNotification('custom/serverToClientNotification', (params: any) => { console.log('收到服务器通知:', params); // 可在此触发VSCode交互,比如弹窗提示 vscode.window.showInformationMessage(`服务器通知:${params.content}`); }); } // 扩展激活时执行初始化逻辑 export async function activate(context: vscode.ExtensionContext) { // ... 此处省略LanguageClient实例创建代码 ... setupCustomMessageHandler(client); await client.start(); }
服务器(LSP后端)实现
使用vscode-languageserver包时,通过创建的Connection实例直接向客户端发送自定义请求或通知。
1. 发送自定义请求(等待客户端响应)
import { createConnection, ProposedFeatures } from 'vscode-languageserver/node'; const connection = createConnection(ProposedFeatures.all); // 在业务逻辑触发点调用 async function sendCustomRequest() { try { const response = await connection.sendRequest('custom/serverToClientRequest', { content: '来自服务器的请求数据' }); console.log('客户端响应结果:', response); } catch (error) { console.error('请求发送失败:', error); } }
2. 发送自定义通知(无需响应)
// 在业务逻辑触发点调用 function sendCustomNotification() { connection.sendNotification('custom/serverToClientNotification', { content: '来自服务器的通知内容' }); }
注意事项
- 自定义方法名建议使用反向域名格式(如
com.yourteam.customMethod),避免与LSP内置方法冲突。 - 客户端与服务器的方法名必须完全一致,否则消息无法被正确捕获处理。
- 传递的数据需支持JSON序列化,因为LSP基于JSON-RPC协议通信。
内容的提问来源于stack exchange,提问作者盛安安
相关产品推荐
相关产品推荐

