Vscode 语言客户端扩展 - 如何从服务器向客户端发送消息?
Vscode Language Client extension - how to send a message from the server to the client?
我一直在开发一个 vscode 扩展,它由使用语言服务器协议的客户端和服务器组成。
目前,我正在尝试做以下事情:当服务器检测到某种情况时,他请求客户端将一定数量的文件加载到工作区中。
我在执行此操作时遇到了严重问题。由于语言服务器协议没有执行此操作的特定请求,我考虑从服务器向客户端发送一条消息,一旦客户端检测到此消息,他将继续执行此命令。
问题是,我也不知道该怎么做。谁能帮帮我?
只要您确定该名称不会与现有的 LSP 方法冲突,您就可以定义自己的任意方法。例如,在 official lsp-sample 中,您可以这样做:
(在client/src/extension.ts
结尾)
let client = new LanguageClient('lspSample', 'Language Server Example', serverOptions, clientOptions);
client.onReady().then(() => {
client.onNotification("custom/loadFiles", (files: Array<String>) => {
console.log("loading files " + files);
});
});
context.subscriptions.push(client.start());
(在 server/src/server.ts
的 documents.onDidChangeContent
侦听器中)
var files = ["path/to/file/a.txt", "path/to/file/b.txt"];
connection.sendNotification("custom/loadFiles", [files]);
每当您更改 .txt
文件的内容(因为示例使用 plaintext
作为其文档选择器)时,这将向开发控制台输出以下内容:
loading files path/to/file/a.txt,path/to/file/b.txt
当涉及到自定义方法的名称、它们的参数或调用它们时,您在这里几乎拥有完全的灵活性。对于语言服务器来说,出于各种目的(高级功能、内部 debugging/development 特性等)使用像这样不属于协议一部分的自定义方法是很常见的。
我一直在开发一个 vscode 扩展,它由使用语言服务器协议的客户端和服务器组成。
目前,我正在尝试做以下事情:当服务器检测到某种情况时,他请求客户端将一定数量的文件加载到工作区中。
我在执行此操作时遇到了严重问题。由于语言服务器协议没有执行此操作的特定请求,我考虑从服务器向客户端发送一条消息,一旦客户端检测到此消息,他将继续执行此命令。
问题是,我也不知道该怎么做。谁能帮帮我?
只要您确定该名称不会与现有的 LSP 方法冲突,您就可以定义自己的任意方法。例如,在 official lsp-sample 中,您可以这样做:
(在client/src/extension.ts
结尾)
let client = new LanguageClient('lspSample', 'Language Server Example', serverOptions, clientOptions);
client.onReady().then(() => {
client.onNotification("custom/loadFiles", (files: Array<String>) => {
console.log("loading files " + files);
});
});
context.subscriptions.push(client.start());
(在 server/src/server.ts
的 documents.onDidChangeContent
侦听器中)
var files = ["path/to/file/a.txt", "path/to/file/b.txt"];
connection.sendNotification("custom/loadFiles", [files]);
每当您更改 .txt
文件的内容(因为示例使用 plaintext
作为其文档选择器)时,这将向开发控制台输出以下内容:
loading files path/to/file/a.txt,path/to/file/b.txt
当涉及到自定义方法的名称、它们的参数或调用它们时,您在这里几乎拥有完全的灵活性。对于语言服务器来说,出于各种目的(高级功能、内部 debugging/development 特性等)使用像这样不属于协议一部分的自定义方法是很常见的。