如何使用 rust 读取 neovim 的标准输入?

问题描述 投票:0回答:1

我对 Rust 还很陌生,我想我可以在这里得到一些帮助。

我正在尝试遵循 TJ DeVries 的关于制作 LSP 的指南,他正在用 Go 进行编码,但我正在尝试遵循 Rust。我被困在他从 neovim 的标准输出读取输入的部分。 Neovim 应该将 JSON-RPC 消息发送到我程序的标准输入。现在我想做的就是阅读我从 neovim 获得的内容并将其打印到文件中。

我已经设置了一个记录器,它所做的只是将文本添加到日志文件中,并且程序在打开 neovim 文件时运行。

根据我的理解,我应该读取 neovim 在 stdin 中抛出的任何内容,直到程序关闭,但我似乎无法读取 neovim 的所有 JSON RPC 消息(我只获取内容长度部分)。

这是main.rs中的代码:

fn main() {
    let stdin_lock = io::stdin().lock();
    let mut lines = stdin_lock.lines();
    
    loop {
        let next_line = match lines.next() {
            Some(val) => val,
            None => {
                continue;
            }
        }
        .unwrap();
    
        logger::print_logs(String::from("printing line..."), None).unwrap();
        logger::print_logs(next_line, None).unwrap();
    }
}

记录器.rs:

pub fn print_logs(message: String, file_name: Option<&str>) -> std::io::Result<()> {
    fs::create_dir_all(LOGS_FOLDER)?;

    let file_name = file_name.unwrap_or(DEFAULT_LOGS_FILE);
    let file_location = format!("{}/{}", LOGS_FOLDER, file_name);

    let file_contents = read_to_string(file_location.clone()).unwrap();

    let mut file = File::create(file_location)?;

    let full_message = format!("{}\n{}", file_contents, message);

    file.write_all(&full_message.into_bytes())?;

    Ok(())
}

这是我的日志文件中的输出:

printing line...
Content-Length: 3085
printing line...

我希望这个文件在最后一个打印行之后也有一个 JSON....

rust stdout stdin neovim language-server-protocol
1个回答
0
投票

首先,根据规范,标题部分和内容部分之间有一个空行。因此,最后一个“打印行...”之后的空行是预期的(尝试将

logger::print_logs(next_line, None).unwrap();
更改为
print_logs2(format!("line: {}", next_line), None).unwrap();

没有打印json的原因是内容没有以换行符结尾。您需要读取,直到读取到指定的字节数(根据

Content-Length
标头)。

© www.soinside.com 2019 - 2024. All rights reserved.