Configuring Emacs for Rust Development January 7, 2025
Emacs is great for editing Rust
source files. In addition to your normal Emacs configuration (such as completion modes) it requires 3 packages. First you will want lsp-mode
, a very full featured LSP client for Emacs. Additionally you will want lsp-ui
, which I only use for the lsp-ui-imenu
feature.
Finally you will want to use rustic
as primary editing mode for Rust
files.
elisp code snippet start
;; For all setttings see: https://emacs-lsp.github.io/lsp-mode/tutorials/how-to-turn-off/
( use-package lsp-mode
:ensure t
:init
;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l")
( setq lsp-keymap-prefix "C-c C-l"
lsp-inlay-hint-enable t )
:custom
( lsp-lens-enable nil )
( lsp-headerline-breadcrumb-enable nil )
( lsp-rust-analyzer-cargo-watch-command "clippy" )
;; enable / disable the hints as you prefer:
( lsp-inlay-hint-enable t )
;; These are optional configurations. See https://emacs-lsp.github.io/lsp-mode/page/lsp-rust-analyzer/#lsp-rust-analyzer-display-chaining-hints for a full list
( lsp-rust-analyzer-display-lifetime-elision-hints-enable "skip_trivial" )
( lsp-rust-analyzer-display-chaining-hints t )
( lsp-rust-analyzer-display-lifetime-elision-hints-use-parameter-names nil )
( lsp-rust-analyzer-display-closure-return-type-hints t )
( lsp-rust-analyzer-display-parameter-hints nil )
( lsp-rust-analyzer-display-reborrow-hints nil )
( lsp-signature-auto-activate t )
:hook ( ;; replace XXX-mode with concrete major-mode(e. g. python-mode)
( rustic-mode . lsp )
;; if you want which-key integration
( lsp-mode . lsp-ui-mode )
( lsp-mode . lsp-enable-which-key-integration ))
:commands lsp )
( use-package lsp-ui
:ensure t
:commands lsp-ui-mode
:after lsp-mode
:custom
( lsp-ui-peek-always-show nil )
( lsp-ui-sideline-show-hover nil )
( lsp-ui-doc-enable t )
)
( use-package rustic
:ensure
:bind ( :map rustic-mode-map
( "M-j" . lsp-ui-imenu )
( "M-?" . lsp-find-references )
( "C-c C-c l" . flycheck-list-errors )
( "C-c C-c a" . lsp-execute-code-action )
( "C-c C-c r" . lsp-rename )
( "C-c C-c q" . lsp-workspace-restart )
( "C-c C-c Q" . lsp-workspace-shutdown )
( "C-c C-c s" . lsp-rust-analyzer-status ))
:config
;; uncomment for less flashiness
;; (setq lsp-eldoc-hook nil)
;; (setq lsp-enable-symbol-highlighting nil)
;; (setq lsp-signature-auto-activate nil)
;; comment to disable rustfmt on save
( setq rustic-format-on-save t )
)
elisp code snippet end
Many of these settings I have taken from Robert Krahn’s configuration.