When I code, I typically want the following from my editor:
- Syntax highlight and indentation
- Auto completion
- Error checking
- Jump to definition
- Inline documentation
When coding in rust, I want these same features. Thankfully there are a several great packages to help us achieve those desires. Before we do any futher I wanna make sure to give credit and a huge thanks to Bassam and his blog post. This is just to update based on what changes I found I needed.
Installing Packages
You’ll need to start by updating your package list contents by:
M-x package-refresh-contents
Next, we will install the follow packages in Emacs by M-x package-install
company- An autocompletion framework - Websitecompany-racer- A backend that enables company autocompletion with racer - Websiteracer- A rust autocompletion engine - Websiteflycheck- on the fly syntax checking - Websiteflycheck-rust- A rust backend for flycheck - Websiterust-mode- An Emacs mode for editing rust files - Website
Configuring Emacs
Now we need to configure these packages inside of our emacs configuration. Here is a snippet of my .emacs.d/init.el:
;; Reduce the time after which the company auto completion popup opens
(setq company-idle-delay 0.2)
;; Reduce the number of characters before company kicks in
(setq company-minimum-prefix-length 1)
;; Set path to racer binary
(setq racer-cmd "/usr/local/bin/racer")
;; Set path to rust src directory
(setq racer-rust-src-path "/Users/jasomyer/.rust/src/")
;; Load rust-mode when you open `.rs` files
(add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-mode))
;; Setting up configurations when you load rust-mode
(add-hook 'racer-mode-hook #'company-mode)
(add-hook 'rust-mode-hook #'racer-mode)
(add-hook 'racer-mode-hook #'eldoc-mode)
(add-hook 'racer-mode-hook #'company-mode)
(global-set-key (kbd "TAB") #'company-indent-or-complete-common) ;
(setq company-tooltip-align-annotations t)Installing Rust
In case you don’t have Rust installed on your system you can install it either by:
- Downloading the installation binary from Rust’s website.
- or using Homebrew:
brew install rust.
Building and Installing Racer
To generate the Racer binary that company-racer uses for it’s magical powers, you will need to clone the _racer _repository from Github to your home directory and run cargo build --release.
git clone https://github.com/phildawes/racer.git /tmp/racercd /tmp/racercargo build --releasemv /tmp/racer/target/release/racer /usr/local/binrm -rf /tmp/racer
After running these commands and restarting your terminal you should be able to run the racer command which should complain about a missing $RUST_SRC_PATH.
Setting $RUST_SRC_PATH
If you go back to the elisp function you added to our init.el earlier you will be able to see that you defined racer-rust-src-path which points to .rust/src in your home directory. You will need to add the Rust source code there so Racer can use that to load methods for completion.
git clone https://github.com/rust-lang/rust.git ~/.rust- Add
export RUST_SRC_PATH=/Users/YOURUSERNAME/.rust/srcto your .bashrc or shell init file. - Restart your shell and emacs then open a Rust file.
You should now have all the features we desired earlier. You can test this by:
- Open a rust file and try typing
use std::io::Band press<tab>. You should see some completion options. - Place your cursor over a symbol and hit
M-.to jump to the definition.
If that does not work, make sure that racer works from the command line by doing the following:
racer complete std::io::B
You should see some autocompletion options show up.