最近几个月都用Emacs来做Rust的开发,总体来说,按照Rustic Mode上Github的配置,配合lsp-mode能满足需求。
但是有一点一直让我有点在意:
Rust是需要编译的,所以经常修改后需要编译一下,而Rust的编译是比较花时间的,这样会大大影响编程的体验。
所以我用cargo watch来缓解这个问题。有啥方法能更好的将cargo watch融入Emacs,然后减少编译的时间和次数,到真正想cargo run的时候才运行,做到解放双手?
另外,大家有啥好用的rust的elisp配置可以分享一下吗?
Kinney
2
~~狗哥录过一个视频:https://b23.tv/K0yGSM~~ 这是 Clojure 的。
1 个赞
使用 Emacs 开发 Rust 两年多了,一点体验供你参考(主要使用 lsp-mode + rust-analyzer + rust-mode):
- 把 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
一次性编译,尽量不让编译干涉写代码的体验。
- 为 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```"))))
- 轻易不要升级 lsp-mode/rust-analyzer,比较容易出问题。目前我使用的版本
- rust-analyzer 678a29e
- lsp-mode 7.0.1-265-g0349a1cc
7 个赞
Kinney
6
,, 最近接触的都是这两门语言,已经傻傻分不清了。。
一个是 Lisp,一个是命令式语言,能搞混也是不容易。不过这个 gist 应该适合你。
Rust在LSP 启动的时候,实在是太慢了。一个很简单的示例,也等半天。
好像是在运行cargo metadata.
能帮我解决一下吗?
而且每次都有 这个错误,我手动执行 cargo metadata 也没问题啊
手动执行下 metadata 呢?看看是不是有什么错误
只有个warning啊。
这个问题都不是最烦的。
最麻烦的是 前面两个图片, 刚打开工程的时候,这个 loading 太久了,还显示 %
感谢分享。 eglot 确实 比 lsp-mode 顺滑。我也弃用 LSP 了。
我还是遇到个问题, 在刚打开工程的时候,虽然不会卡,但补全,跳转还是不能用的,要等会才能使用。
你有没有遇到这个情况?
我看你的配置 用的是 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 个赞
歪个楼
最近在接触rust,老哥,你们是用rust开发啥的,
你觉得rust的前景怎么样