我正在尝试将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)
我在这里错过了什么?
这是因为直接在终端输入r
n
四个文字字符时,没有转换成两个特殊字符r
和n
。
为了在终端中手工试验,您应该转换行尾。
$ 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 ...