Rust

From WikEmacs
Jump to: navigation, search

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,
  • 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),

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


Rust-autocomplete.png

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-.)
  • 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).