一个比较简陋的lsp客户端。之所以做这个东西,一是lsp mode在我电脑上用着卡,eglot代码看不懂,也没感觉比lsp mode明显快;更重要的是想学习下rust,至少写个真实可用的东西出来。
设计目标:
- 只计划实现我自己必需的一些功能(跳转、补全、诊断、code action等)
- 尽量利用Emacs本身的功能(capf, flymake)
- 尽量把数据处理放在rust代码中,只有那些必要的数据才放在elisp代码里处理(过期的响应,不关心的通知都在rust里干掉了)
- 代码写得容易看懂,不要到处都是宏啊啥的(没学习过elisp的宏,eglot里那些宏看得够够的)
已经实现的功能:
- 跳转(作为xref的后端)
- 补全(capf,使用company测试) 不过目前实现的不完整,只会看label/insertText,而且不支持snippet。下面有个图展示存在的问题。
- 诊断(作为flymake的后端)
- hover
就这些。我目前已经在用lspce写lspce了,基本还是可用的。另外还测试过pyright。
rs代码里应该还有些错误没有处理,所以可能会出现panic。代码写得也比较丑(尤其是rs),还需要整理。
计划还要做的:
- 完善补全(包括snippet)
- 支持code action
- 支持signatureHelp
- java支持(我自己工作中主要用的语言)
- 其它待定
配置
(use-package lspce
:load-path "/path/to/lspce/lisp"
:init (progn
(add-to-list 'load-path "/path/to/lspce/rs/target/debug")
(require 'lspce-module)
)
:config (progn
;; (add-hook 'rust-mode-hook 'lspce-mode)
)
)
来几张图
补全:
上面这张图展示了目前的问题:rust-analyzer返回的补全项的label就是clone (as Clone)
,补全后还需要删除一部分。
诊断:
跳转定义/引用等
写在最后
- 欢迎大家试用,但谨!慎!试用
- 时间精力有限,进度/改bug都比较慢
- 感谢前辈eglot/lsp mode,“借鉴”了eglot不少代码,靠lsp mode的日志解决了一些协议理解上的问题
- 代码在 GitHub - zbelial/lspce: LSP Client for Emacs implemented as a module using rust. (因为众所周知的原因,我这儿经常连不上github,代码经常不能及时push)
- 我在linux开发,日志文件写死了/tmp/lspce.log,windows上测试的话需要改改。
- 协议处理不是完全异步的,所以还是可能会出现卡手的情况