Let's setup Emacs for Rust development, shall we ?

Also note that Spacemacs has a ready to use Rust layer. If you wish other sanier defaults and configs, see Starter_Kits.

rust-mode

rust-mode (in MELPA) offers:

syntax highlighting,

code formatting , optionally automatic,

, optionally automatic, Imenu support,

navigation by semantics (go to the beginning or end of the current defun), (see also helm-swoop, helm-ag, tags,…)

playpen helpers (send the selected code to play.rust-lang.org),

helpers (send the selected code to play.rust-lang.org), …

In Debian testing and unstable you can also install it with apt install elpa-rust-mode (but the MELPA way is prefered).





Code formatting with rustfmt

Formatting is also provided by this mode. If you want auto formatting everytime you save a buffer, put this in your Init File:

(setq rust-format-on-save t)

On-the-fly syntax checking: Flycheck-rust

See flycheck-rust (on MELPA). See Flycheck.

Emacs-racer

See emacs-racer (also in MELPA) for documentation and screencasts. It provides:

code completion of variables, functions and modules (not macros yet due to a racer limitation) (see also company-mode)

jump to definition (bound to M-. )

(bound to ) describe functions and types,

Run Cargo tasks

cargo.el ("cargo" in MELPA) gives us a set of key combinations to perform Cargo tasks within our Rust projects.

See also Compilation.

Debugging

Use the built-in gdb and use rust-gdb to launch gdb with the Rust-specific pretty-printers enabled.

Note: set breakpoints with "break file:line" instead of "rbreak" which can give an "unmatched quote" error.

Users snippets

Function to toggle a variable mutability

Given a line:

let foo = bar;

Calling this function with the cursor anywhere on that line will change it to

let mut foo = bar;

(defun toggle-mut () "Toggles the mutability of the variable defined on the current line" (interactive) (save-excursion (back-to-indentation) (forward-word) (if (string= " mut" (buffer-substring (point) (+ (point) 4))) (delete-region (point) (+ (point) 4)) (insert " mut"))))

To bind it to a key in rust-mode only:

(add-hook 'rust-mode-hook (lambda () (local-set-key (kbd "C-M-m") #'toggle-mut)))

(source: reddit).