49d1eaed50
- Introduced a new command cargo-process-outdated - Certain commands are known to change Cargo.toml and needs to reload workspace, wrapper functions that automatically reload workspace are added. - spacemacs/cargo-process-add - spacemacs/cargo-process-rm - spacemacs/cargo-process-outdated - Added a layer variable for rust layer, cargo-process-reload-on-modify, which toggle the aforementioned behaviour. - Added a new utility function in LSP layer, which returns server ID associated with current project. - spacemacs//lsp-client-server-id - Rearranged keybindings for rust layers (see table below for details) Commands wrapped with auto-reload functionality: |Command |Binding | |-------------------------|-------------| |`cargo-process-repeat` |`SPC m c .` | |`cargo-process-add` |`SPC m c a` | |`cargo-process-rm` |`SPC m c r` | |`cargo-process-upgrade` |`SPC m c U` | Commands with new bindings: |Command |Old Binding |New Binding | |-----------------------------------|------------|------------| |`cargo-process-search` |`SPC m c s` |`SPC m c /` | |`cargo-process-fmt` |`SPC m c f` |`SPC m c =` | |`cargo-process-current-file-tests` |`SPC m c o` |`SPC m t b` | |`cargo-process-current-test` |`SPC m c t` |`SPC m t t` | |`cargo-process-test` |`SPC m t` |`SPC m t a` |
190 lines
8.6 KiB
Org Mode
190 lines
8.6 KiB
Org Mode
#+TITLE: Rust layer
|
|
|
|
#+TAGS: general|layer|multi-paradigm|programming
|
|
|
|
[[file:img/rust.png]]
|
|
|
|
* Table of Contents :TOC_5_gh:noexport:
|
|
- [[#description][Description]]
|
|
- [[#features][Features:]]
|
|
- [[#install][Install]]
|
|
- [[#layer][Layer]]
|
|
- [[#choosing-a-backend][Choosing a backend]]
|
|
- [[#racer][Racer]]
|
|
- [[#lsp][LSP]]
|
|
- [[#switch-to-another-lsp-server][Switch to another LSP server]]
|
|
- [[#autocompletion][Autocompletion]]
|
|
- [[#debugger-dap-integration][Debugger (dap integration)]]
|
|
- [[#automatically-reload-workspace][Automatically Reload Workspace]]
|
|
- [[#cargo][Cargo]]
|
|
- [[#cargo-edit][cargo-edit]]
|
|
- [[#cargo-audit][cargo-audit]]
|
|
- [[#cargo-outdated][cargo-outdated]]
|
|
- [[#rustfmt][Rustfmt]]
|
|
- [[#clippy][Clippy]]
|
|
- [[#key-bindings][Key bindings]]
|
|
- [[#debugger][Debugger]]
|
|
|
|
* Description
|
|
This layer supports [[https://www.rust-lang.org][Rust]] development in Spacemacs.
|
|
|
|
** Features:
|
|
- Auto-completion and navigation support through [[https://github.com/emacs-lsp/lsp-mode][lsp-mode]] or [[https://github.com/phildawes/racer][Racer]]
|
|
- Interactive debugger using [[https://github.com/emacs-lsp/dap-mode][dap-mode]]
|
|
- Support for the Rust package manager [[http://doc.crates.io/index.html][Cargo]]
|
|
- Support for [[https://github.com/nabero/ron-mode][Rusty Object Notation (RON)]]
|
|
|
|
* Install
|
|
** Layer
|
|
To use this configuration layer, add it to your =~/.spacemacs=. You will need to
|
|
add =rust= to the existing =dotspacemacs-configuration-layers= list in this
|
|
file.
|
|
|
|
** Choosing a backend
|
|
To choose a default backend set the layer variable =rust-backend=:
|
|
|
|
#+BEGIN_SRC elisp
|
|
(rust :variables rust-backend 'racer)
|
|
#+END_SRC
|
|
|
|
Alternatively the =lsp= backend will be automatically chosen if the layer =lsp=
|
|
is used and you did not specify any value for =rust-backend=.
|
|
|
|
Backend can be chosen on a per project basis using directory local variables
|
|
(files named =.dir-locals.el= at the root of a project), an example to use the
|
|
=lsp= backend:
|
|
|
|
#+BEGIN_SRC elisp
|
|
;;; Directory Local Variables
|
|
;;; For more information see (info "(emacs) Directory Variables")
|
|
|
|
((rust-mode (rust-backend . lsp)))
|
|
#+END_SRC
|
|
|
|
*Note:* you can easily add a directory local variable with ~SPC f v d~.
|
|
|
|
*** Racer
|
|
You must install [[https://github.com/phildawes/racer][Racer]] to use this backend. Make sure the =racer= binary is available in
|
|
your =PATH= and to set the environment variable =RUST_SRC_PATH=, as described in
|
|
the [[https://github.com/phildawes/racer#installation][installation instructions]].
|
|
|
|
To enable auto-completion, ensure that the =auto-completion= layer is enabled.
|
|
|
|
*** LSP
|
|
You must add =lsp= to the existing =dotspacemacs-configuration-layers= in your =~/.spacemacs=.
|
|
|
|
Consult the installation command for the desired language server found at [[https://github.com/emacs-lsp/lsp-mode][lsp-mode]] for instructions.
|
|
|
|
The default LSP server for Rust is [[https://github.com/rust-lang/rls][rls]], i.e. rust language server.
|
|
To choose the experimental [[https://github.com/rust-analyzer/rust-analyzer][rust-analyzer]], you need to set the layer variable =lsp-rust-server= of =lsp= layer:
|
|
|
|
#+BEGIN_SRC elisp
|
|
(setq-default dotspacemacs-configuration-layers
|
|
'(lsp :variables lsp-rust-server 'rust-analyzer))
|
|
#+END_SRC
|
|
|
|
**** Switch to another LSP server
|
|
If both =rls= and =rust-analyzer= server are installed, you can press ~SPC m s s~ to switch to another LSP server backend.
|
|
|
|
**** Autocompletion
|
|
To enable auto-completion, ensure that the =auto-completion= layer is enabled.
|
|
|
|
By default, currently [[https://github.com/phildawes/racer][Racer]] is the only code completion backend of [[https://github.com/rust-lang/rls][rls]], so you also need to install it.
|
|
|
|
**** Debugger (dap integration)
|
|
To install the debug adapter you may run =M-x dap-gdb-lldb-setup= when you are on Linux or download it manually from [[https://marketplace.visualstudio.com/items?itemName=webfreak.debug][Native Debug]] and adjust =dap-gdb-lldb-path=.
|
|
|
|
**** Automatically Reload Workspace
|
|
When the LSP server is =rust-analyzer=, it may needs to reload the workspace to pickup changes made in =Cargo.toml=.
|
|
You can call =spacemacs/lsp-rust-analyzer-reload-workspace=, which would be faster than restarting the LSP backend.
|
|
|
|
You can also set =cargo-process-reload-on-modify= to =t=, then it will automatically reload the workspace after
|
|
one of the following is run:
|
|
- =cargo-process-add=
|
|
- =cargo-process-rm=
|
|
- =cargo-process-upgrade=
|
|
|
|
#+BEGIN_SRC elisp
|
|
(setq-default dotspacemacs-configuration-layers
|
|
'(lsp :variables lsp-rust-server 'rust-analyzer
|
|
cargo-process-reload-on-modify t))
|
|
#+END_SRC
|
|
|
|
** Cargo
|
|
[[http://doc.crates.io/index.html][Cargo]] is a project management command line tool for Rust. Installation
|
|
instructions can be found on the main page of [[http://doc.crates.io/index.html][Cargo]].
|
|
|
|
*** cargo-edit
|
|
[[https://github.com/killercup/cargo-edit][cargo-edit]] allows you to add, remove, and upgrade dependencies by modifying your =Cargo.toml= file.
|
|
|
|
#+BEGIN_SRC sh
|
|
cargo install cargo-edit
|
|
#+END_SRC
|
|
|
|
*** cargo-audit
|
|
[[https://github.com/RustSec/cargo-audit][cargo-audit]] audits =Cargo.lock= files for crates with security vulnerabilities.
|
|
|
|
#+BEGIN_SRC sh
|
|
cargo install cargo-audit
|
|
#+END_SRC
|
|
|
|
*** cargo-outdated
|
|
[[https://github.com/kbknapp/cargo-outdated][cargo-outdated]] displays dependencies that have new version available.
|
|
|
|
#+BEGIN_SRC sh
|
|
cargo install cargo-outdated
|
|
#+END_SRC
|
|
|
|
** Rustfmt
|
|
Format Rust code according to style guidelines using [[https://github.com/rust-lang-nursery/rustfmt][rustfmt]].
|
|
|
|
#+BEGIN_SRC sh
|
|
rustup component add rustfmt
|
|
#+END_SRC
|
|
|
|
To enable automatic buffer formatting on save, set the variable =rust-format-on-save= to =t=.
|
|
|
|
** Clippy
|
|
[[https://github.com/rust-lang/rust-clippy][Clippy]] provides a collection of lints to to catch common mistakes and improve your code.
|
|
|
|
#+BEGIN_SRC sh
|
|
rustup component add clippy
|
|
#+END_SRC
|
|
|
|
* Key bindings
|
|
|
|
| Key binding | Description |
|
|
|-------------+-------------------------------------------------------------|
|
|
| ~SPC m = =~ | reformat the buffer |
|
|
| ~SPC m b R~ | reload Rust-Analyzer workspace |
|
|
| ~SPC m c .~ | repeat the last Cargo command |
|
|
| ~SPC m c /~ | search for packages on crates.io with Cargo |
|
|
| ~SPC m c =~ | format all project files with rustfmt |
|
|
| ~SPC m c a~ | add a new dependency with cargo-edit |
|
|
| ~SPC m c A~ | audit dependencies for known vulnerability with cargo-audit |
|
|
| ~SPC m c c~ | compile project |
|
|
| ~SPC m c C~ | remove build artifacts |
|
|
| ~SPC m c d~ | generate documentation |
|
|
| ~SPC m c D~ | generate documentation and open it in default browser |
|
|
| ~SPC m c e~ | run benchmarks |
|
|
| ~SPC m c E~ | run a project example |
|
|
| ~SPC m c i~ | initialise a new project with Cargo (init) |
|
|
| ~SPC m c l~ | run linter ([[https://github.com/arcnmx/cargo-clippy][cargo-clippy]]) |
|
|
| ~SPC m c n~ | create a new project with Cargo (new) |
|
|
| ~SPC m c o~ | display outdated dependencies ([[https://github.com/kbknapp/cargo-outdated][cargo-outdated]]) |
|
|
| ~SPC m c r~ | remove a dependency with cargo-edit |
|
|
| ~SPC m c u~ | update dependencies with Cargo |
|
|
| ~SPC m c U~ | upgrade dependencies to LATEST version with cargo-edit |
|
|
| ~SPC m c v~ | check (verify) a project with Cargo |
|
|
| ~SPC m c x~ | execute the default binary |
|
|
| ~SPC m c X~ | execute a specific binary |
|
|
| ~SPC m g g~ | jump to definition |
|
|
| ~SPC m h h~ | describe symbol at point |
|
|
| ~SPC m s s~ | switch to other LSP server backend |
|
|
| ~SPC m t a~ | test current project |
|
|
| ~SPC m t t~ | run the current test |
|
|
| ~SPC m t b~ | run all tests in current buffe |
|
|
|
|
** Debugger
|
|
Using the =dap= layer you'll get access to all the DAP key bindings, see the
|
|
complete list of key bindings on the [[https://github.com/syl20bnr/spacemacs/tree/develop/layers/%2Btools/dap#key-bindings][dap layer description]].
|