如何直接从终端 运行 Rust Analyzer?

How to run Rust Analyzer directly from terminal?

我正在尝试将 Rust Analyzer 与基于浏览器的编辑器集成。

我的第一步是直接从终端 运行 Rust Analyzer 并通过 stdio 发送请求。

$ rust-analyzer
> Content-Length:207\r\n\r\n{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":null,"rootPath":"/mnt/78b33d24-344b-43da-a40c-8b81a6fd0b34/projects/rustexplorer/quick_test","initializationOptions":{},"capabilities":{}}}

但是我得到了这个错误:

[ERROR rust_analyzer] Unexpected error: expected initialize request, got Err(RecvError)
expected initialize request, got Err(RecvError)

我在这里错过了什么?

只是因为\r\n这四个文字字符没有转化为\r和[=17=这两个特殊字符] 当您直接在终端中输入它们时。

为了在终端中手动进行实验,您应该转换行尾。

$ sed -u -re 's/^(.*)$/\r/' | rust-analyzer 
Content-Length: 207

{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":null,"rootPath":"/mnt/78b33d24-344b-43da-a40c-8b81a6fd0b34/projects/rustexplorer/quick_test","initializationOptions":{},"capabilities":{}}}

... then the response is displayed here ...

注意我们这里按的是Enter键;我们不尝试输入 \n 特殊字符。

再三考虑,我认为在这种情况下(交互式终端)您应该提供 Content-Length: 209 因为 json 内容将以 \r\n 结尾(多两个字节, 作为分隔符被忽略)。 这样,可以在下一行输入下一个请求。 如果您保留 207,那么您的下一个请求应该与 json 内容在同一行开始(就在最后一个 } 之后)。

另一个解决方案是更改终端的设置。 stty -icrnl 使 Enter 键产生 \r (control-M) 字符;然后您必须输入 control-J 以生成 \n 字符。

$ stty -icrnl
$ rust-analyser
Content-Length: 208^M <-- Enter + control-J
^M <-- Enter + control-J
{"jsonrpc":"2.0", ... ,"capabilities":{}}} <-- control-J
... the response is displayed here ...