有什么方法提高Rust在Emacs上的编程体验?

最近几个月都用Emacs来做Rust的开发,总体来说,按照Rustic Mode上Github的配置,配合lsp-mode能满足需求。

但是有一点一直让我有点在意:

Rust是需要编译的,所以经常修改后需要编译一下,而Rust的编译是比较花时间的,这样会大大影响编程的体验。

所以我用cargo watch来缓解这个问题。有啥方法能更好的将cargo watch融入Emacs,然后减少编译的时间和次数,到真正想cargo run的时候才运行,做到解放双手?

另外,大家有啥好用的rust的elisp配置可以分享一下吗?

狗哥录过一个视频:https://b23.tv/K0yGSM 这是 Clojure 的。

1 个赞

快进到念动力编程

使用 Emacs 开发 Rust 两年多了,一点体验供你参考(主要使用 lsp-mode + rust-analyzer + rust-mode):

  1. 把 lsp 的补全关掉,太卡了。这是我目前 Rust 相关配置
(setq lsp-log-io nil
        lsp-eldoc-render-all nil
        lsp-completion-provider t
        ;; lsp-completion-enable nil
        lsp-signature-render-documentation nil
        lsp-rust-server 'rust-analyzer
        lsp-rust-analyzer-cargo-watch-enable nil
        lsp-gopls-hover-kind "NoDocumentation"
        lsp-gopls-use-placeholders t
        lsp-diagnostics-provider :none)

(use-package rust-mode
  :hook ((rust-mode . my/rust-lsp))
  :config
  (setq rust-format-on-save t)
  (defun my/rust-lsp ()
    (setq-local lsp-completion-enable nil
                compile-command "cargo build")
    ))

我是把 lsp-rust-analyzer-cargo-watch-enable 设为 nil 了,否则写代码时会有卡顿。程序写完后,再运行 M-X compile 一次性编译,尽量不让编译干涉写代码的体验。

  1. 为 rust-analyzer 定义 lsp-clients-extract-signature-on-hover , 原因可参考这里。这是我目前使用的:
  (cl-defmethod lsp-clients-extract-signature-on-hover (contents (_server-id (eql rust-analyzer)))
    (-let* (((&hash "value") contents)
            (groups (--partition-by (s-blank? it) (s-lines (s-trim value))))
            (sig_group (if (s-equals? "```rust" (car (-third-item groups)))
                           (-third-item groups)
                         (car groups)))
            (sig (--> sig_group
                      (--drop-while (s-equals? "```rust" it) it)
                      (--take-while (not (s-equals? "```" it)) it)
                      (s-join "" it))))
      (lsp--render-element (concat "```rust\n" sig "\n```"))))
  1. 轻易不要升级 lsp-mode/rust-analyzer,比较容易出问题。目前我使用的版本
  • rust-analyzer 678a29e
  • lsp-mode 7.0.1-265-g0349a1cc
6 个赞

人家问的是 rust…

:sweat_smile: ,, 最近接触的都是这两门语言,已经傻傻分不清了。。

一个是 Lisp,一个是命令式语言,能搞混也是不容易。不过这个 gist 应该适合你。

Rust在LSP 启动的时候,实在是太慢了。一个很简单的示例,也等半天。 好像是在运行cargo metadata. 能帮我解决一下吗?

图片 图片

而且每次都有 这个错误,我手动执行 cargo metadata 也没问题啊

手动执行下 metadata 呢?看看是不是有什么错误

只有个warning啊。 这个问题都不是最烦的。 最麻烦的是 前面两个图片, 刚打开工程的时候,这个 loading 太久了,还显示 %

https://emacstalk.github.io/post/016/

eglot 对写 rust 会好不少,即使打开自动补全,也不怎么卡

1 个赞

感谢分享。 eglot 确实 比 lsp-mode 顺滑。我也弃用 LSP 了。

我还是遇到个问题, 在刚打开工程的时候,虽然不会卡,但补全,跳转还是不能用的,要等会才能使用。 你有没有遇到这个情况?

正常,ra 刚启动要分析整个项目,分析完就好了

我看你的配置 用的是 rust-mode,而不是 rustic-mode。 这是有什么原因吗?

我写 rust 主要是 eglot 与 cargo-mode,没注意过这两个的区别

新增了一个配置

(add-to-list 'eglot-server-programs `(rust-mode . ("rust-analyzer"
                                                   :initializationOptions (:cargo (:features "all")))))

修改 rust-analyzer 启动参数,开启所有 features,这样可以分析那些只在特定 feature 下开启的文件。

PS:之前用 ra 的时候,时不时发现某些文件不能被分析,后来找到是 feature gate 的锅。

PPS:这个功能需要用 05-10 后的 eglot 版本,

1 个赞