问题描述
我有一个可以与VS 2019 IDE一起正常工作的LSP服务器。我现在正在尝试使其与VSCode一起使用。我为VSCode编写了一个简单的扩展,该扩展曾经与服务器一起使用,但是VSCode现在根本不起作用。因此,我决定编写一个简单的C程序,该程序简单地读取stdin并将字符回显到stderr,不希望它能工作,而是要验证VSCode至少正在尝试与服务器通信。与我的原始服务器一样,该程序绝对不会接收任何内容:VSCode不会向服务器发送任何数据包,我也不知道为什么。
这是简单的“ echo”服务器代码。它所做的全部工作是无限期地读取stdin一个字符,然后或多或少地将char反射到stderr,每次都刷新()。
#include <iostream>
#include <stdio.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <io.h>
int main()
{
for (;;)
{
char buf[10];
int readc = _read(0,buf,1);
fprintf(stderr,"%d\n",buf[0]);
fflush(stderr);
}
return 0;
}
这里是从doc派生而来的简化的VSCode客户端扩展,它恰好在生成服务器作为进程时提供了 zero 信息。这会使用窗口调用服务器的spawn()
。
export function activate(context: vscode.ExtensionContext) {
const server: vscodelc.Executable = {
command: `C:/Users/kenne/source/repos/ConsoleApplication1/Debug/ConsoleApplication1.exe`,args: [],options: {shell: true,detached: true }
};
const serverOptions: vscodelc.ServerOptions = server;
let clientOptions: vscodelc.LanguageClientOptions = {
// Register the server for plain text documents
documentSelector: [{ scheme: 'file',language: 'plaintext' }]
};
const client = new vscodelc.LanguageClient('Antlr Language Server',serverOptions,clientOptions);
console.log('Antlr Language Server is Now active!');
client.start();
}
(通过调试,我发现我需要在ServerOptions结构中使用options: {shell: true,detached: true }
来使spawn()
为该进程创建一个独立的窗口。)运行客户端,服务器随即产生了一个窗口,但是即使对于简单的C“ echo”程序,实际上也没有字符写入服务器。在调试器中,我什至看到write()
是called in the client code,进入json写代码,然后进入Node写代码。对于VS2019 IDE,这一切都很好。
有人对如何获得使用stdin / stdout与VSCode一起使用的可执行服务器有任何想法吗?
解决方法
答案是package.json文件的表被弄乱了。它包含服务器所需的表:“ activationEvents”描述了所有支持的语言。 “语言”将文件扩展名与一种语言相关联。此外,语言表在activate()
函数的LanguageClientOptions中重复。没有这些表,VSCode可能无法将打开文件请求发送到LSP服务器,甚至无法启动LSP服务器。此外,libuv中存在一个错误,该错误会阻止Windows无法正确处理“ windowHidden”。因此,在修复之前,无法使用窗口创建服务器进程。而是将服务器调试输出发送到文件。该服务器现在可以与VSCode一起很好地用于Antlr2、3、4,Bison和W3C EBNF。