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



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

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

$ rust-analyzer
> Content-Length:207rnrn{"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)

我在这里错过了什么?

这是因为直接在终端输入rn四个文字字符时,没有转换成两个特殊字符rn

为了在终端中手工试验,您应该转换行尾。

$ sed -u -re 's/^(.*)$/1r/' | 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内容将以rn结束(两个字节,作为分隔符忽略)。这样,下一个请求就可以在下一行输入。如果你保留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 ...

最新更新