Skip to content
Branch: master
Go to file

Latest commit

mookid committed 00177f5 Jun 18, 2020
compile-mode integration: add link to code references. (#391)
This allows to jump to code references such as lines 82 and 132 in the
following snippet error message.

error[E0061]: this function takes 1 parameter but 2 parameters were supplied
82  | fn duration_ms_since(time: &Option<SystemTime>) -> u128 {
    | ------------------------------------------------------- defined here
132 |             self.total_time_ms = duration_ms_since(&self.program_start, 2);
    |                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


Failed to load latest commit information.


Table of Contents


rust-mode makes editing Rust code with Emacs enjoyable. It requires Emacs 25 or later, and is included in both Emacs Prelude and Spacemacs by default.

This mode provides:

  • Syntax highlighting (for Font Lock Mode)
  • Indentation
  • Integration with Cargo, clippy and rustfmt

This mode does not provide autocompletion, or jumping to function / trait definitions. See Auto-completion / code navigation below for tips on how to enable this.



The package is available on MELPA. Add this to your init.el.

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "") t)

Now you can install rust-mode with:

M-x package-install rust-mode

And put this in your config to load rust-mode automatically:

(require 'rust-mode)

Manual installation

Clone this repository locally, and add this to your init.el:

(add-to-list 'load-path "/path/to/rust-mode/")
(autoload 'rust-mode "rust-mode" nil t)

Feature guide


Commands like TAB should indent correctly.

The Rust style guide recommends spaces rather than tabs for indentation; to follow the recommendation add this to your init.el, which forces indentation to always use spaces.

(add-hook 'rust-mode-hook
          (lambda () (setq indent-tabs-mode nil)))

Code formatting

The rust-format-buffer function will format your code with rustfmt if installed. By default, this is bound to C-c C-f.

The variable rust-format-on-save enables automatic formatting on save. For example, add the following in your init.el to enable format on save:

(setq rust-format-on-save t)

Running / testing / compiling code

The rust-run, rust-test and rust-compile functions shell out to Cargo to run, test or build your code. Under the hood, these use the standard Emacs compile function.

These are not bound by default. To bind these to keyboard shortcuts, you can use the following in your init.el:

(define-key rust-mode-map (kbd "C-c C-c") 'rust-run)


rust-run-clippy runs Clippy, a linter.

Easy insertion of !dbg

rust-dbg-wrap-or-unwrap either wraps or unwraps the current region in dbg!. This can be useful for easily adding debug lines to your program.

This is bound to C-c C-d by default.

Other recommended packages

Auto-completion / code navigation

This package does not provide integration with RLS, which provides auto-completion and code navigation. To use this you need an Emacs package that supports LSP.

Two examples are:

A lighter package that uses racer is emacs-racer.


flycheck allows highlighting compile errors and Clippy lints inline.


cargo.el provides a minor mode for integration with Cargo, Rust's package manager.


rustic is a fork of rust-mode, extending it with other features such as integration with LSP and with flycheck.

For package maintainers


The file rust-mode-tests.el contains tests that can be run via ERT. You can use to run them in batch mode, if you set the environment variable EMACS to a program that runs emacs.

You can’t perform that action at this time.