Vscode语言客户端扩展-如何从服务器向客户端发送消息?

时间:2018-06-26 11:03:55

标签: javascript node.js visual-studio-code vscode-extensions language-server-protocol

我一直在开发一个vscode扩展,它使用语言服务器协议来构成客户端和服务器。

此刻,我正在尝试执行以下操作:当服务器检测到某种情况时,他请求客户端将一定数量的文件加载到工作区中。

我在执行此操作时遇到严重问题。由于语言服务器协议没有执行此操作的特定请求,因此我考虑过从服务器向客户端发送消息,一旦客户端检测到此消息,他将继续执行此命令。

问题是,我也不知道该怎么做。谁能帮我吗?

1 个答案:

答案 0 :(得分:6)

只要您确定名称不与现有的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());

(在documents.onDidChangeContent的{​​{1}}侦听器中)

server/src/server.ts

每当您更改var files = ["path/to/file/a.txt", "path/to/file/b.txt"]; connection.sendNotification("custom/loadFiles", [files]); 文件的内容时(由于示例使用.txt作为其文档选择器,这都会将以下内容输出到开发控制台):

  

加载文件path / to / file / a.txt,path / to / file / b.txt

在谈到自定义方法的名称,它们的参数或调用它们时,您几乎完全具有灵活性。对于语言服务器,出于各种目的(高级功能,内部调试/开发功能等),不属于协议的一部分的自定义方法通常很常见。