lspce - rust实现的LSP客户端

什么时候可以开发出一套国版IDEA 就好了

更新: 没有实现新lsp特性,但是重写了请求响应处理,rs侧接口改为异步+pull的模式,很大程度缓解了卡手的问题。

另外github上提交了一个我在manjaro上编译出来的.so文件,方便没有rust环境的朋友试用。

Edit: 补全时支持insertText/textEdit了,所以首帖里补全rs时会多(as Clone)的问题没有了。

1 个赞

慢慢来,至少现在有巨人的肩膀可以站,可以有越來越好的开发环境了。

感觉 跟eglot 体验差不多,丝滑度 还比 lsp-bridge 差一些, 昨晚 在家里的电脑上使用 感觉 内存占用 要多一些。 还是很期待的。

不跟lsp-bridge比丝滑度,比不过比不过。

目前还是以功能开发为主,计划好的功能实现之后再来优化。

再多说两句关于丝滑度的,我的目标是要比eglot好,争取不要比lsp-bridge差很多,但是因为要支持xref/capf这些现有生态,所以有些时候不以性能作为最优先考虑的。

4 个赞

哈哈哈,支持,试用一下

更新:支持在echo area显示signature help信息(作为eldoc )。来两张图展示一下。

5 个赞

更新一波,庆祝论坛终于又回来了

  1. 支持code action
  2. 支持rename
  3. 补全支持auto import
  4. 缓解了一下补全窗口闪烁的问题
  5. 修复了用corfu补全的一个问题。修复前,如果用corfu前端,snippet不工作,而且只支持插入label,现在应该好了。 感谢 @Shadow-e190 反馈。

我自己需要的lsp特性基本都已经支持了,后续会以修复bug为重点,性能提高也会继续。新特性添加会比较谨慎,一是时间有限,更主要的是我自己用不到的特性就不容易发现bug。

10 个赞

想问下目前性能瓶颈主要是在什么地方呢?

没有做过性能测试,拍脑袋说两句。

从架构上来说,目前没有想到可继续提升的地方了,主要还是实现细节上,譬如减少序列化反序列化,或者在rs代码里对返回数据做一些预处理(目前rs只是中转,所有处理都在elisp里)。

以我自己的体验来看,性能还是可以的。后面在使用过程中继续体验和改进。

2 个赞

期待!把耗资源操作尽量都放到rs里性能会提高很多。

今天想试用一下,按照 readme 配置好后,打开任意一个 rust project 都会报下面的错:

user-error: lspce--connect: Do not support current buffer.
No project for file:///home/weiss/weiss/rust_test rustic-mode
eldoc error: (wrong-type-argument hash-table-p nil)

是我哪里配置的有问题吗?

另外 readme#installing-from-the-git-repository 里的第一行是不是应该是

git clone https://github.com/zbelial/lspce.git ~/.emacs.d/site-lisp/lspce

是我偷懒了,readme不完整。

需要配置这个(对于rust,默认配置了rust-mode)

(setq lspce-server-programs `(("rustic-mode"  "rust-analyzer" "" lspce-ra-initializationOptions)
                                          ("python-mode" "pyright-langserver" "--stdio" lspce-pyright-initializationOptions)
                                          ))

其中每一项是一个列表,对应一个lsp server。以("rustic-mode" "rust-analyzer" "" lspce-ra-initializationOptions)为例,第一项是lsp type,由一个函数确定,对于大部分文件类型来说,就是major-mode的字符串;第二项是lsp sever程序,可以配置成字符串,也可以是返回字符串的函数;第三项是server启动参数,同样既可以是字符串,也可以是函数;第四项可选,配置sever的启动选项。

lsp type由lspce-lsp-type-function确定,默认的函数是

(defun lspce--lsp-type-default ()
  "The return value is also used as language-id."
  (let ((suffix ""))
    (when buffer-file-name
      (setq suffix (file-name-extension buffer-file-name)))
    (cond
     ((member suffix '("c" "c++" "cpp" "h" "hpp" "cxx"))
      "C")
     (t
      ;; (string-remove-suffix "-mode" (symbol-name major-mode))
      (symbol-name major-mode)
      ))))

是的,多谢指正。

我找时间整理一波readme。

好的谢谢,可以跑起来了,简单用了下还不错 :+1: ,想问下是计划只支持 flymake 吗?另外有类似 lsp-ui-flycheck-list 的函数吗,也即列出 project 中所有的错误。

目前只打算支持flymake,主要是我自己不用flycheck。欢迎提pr支持flycheck :slight_smile:

列出所有错误我是用counsel-flymake,你如果用consult之类的,可以研究下看有没有类似命令。

好吧,谢谢了。

在rs中做事可以做更多的事情,emacs实现展示和编辑,这样应该会更好一点。

能支持多后端吗?比如前端需要在一个文件中有两个后端:一个 TypeScript 的支持,另外一个是 TailwindCSS 的支持。

是的,至少能提高性能,不过我自己现在用得挺满意了,没啥动力啊

目前是不支持的,稍微想了下,好像不太容易支持。最重要的问题是怎么跟server同步文档、怎么知道请求要发送到哪个server。vscode支持吗?