Windows上带有stdin / out .exe服务器的VS Code

问题描述

我有一个可以与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。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...