Rust Editor Configuration

Intellij

See instructions on the Intellij Rust site. Run fx gen-cargo //garnet/foo/path/to/target:label for the GN target that you want to work on and open the corresponding directory.

VIM

See instructions on rust-lang/rust.vim.

Visual Studio Code

The VS Code plugin uses the RLS (Rust language server) so you‘ll need to first install rustup. Next, install this VSCode plugin. You’ll also have to tell rustup to use the Fuchsia Rust toolchain:

rustup toolchain link fuchsia /<your Fuchsia root>/buildtools/<platform>/rust
rustup default fuchsia

Next open File -> Preferences -> Settings (or type Ctrl+Comma). Add the following settings:

{
  "rust.target": "x86_64-fuchsia",
  "rust.target_dir": "/<your Fuchsia root>/out/cargo_target",
  "rust.unstable_features": true,
  "rust-client.rlsPath": "/<your Fuchsia root>/buildtools/<platform>/rust/bin/rls",
  "rust-client.disableRustup": true,

  // Some optional settings that may help:
  "rust.goto_def_racer_fallback": true,
  "rust-client.logToFile": true,
}

Finally, run fx gen-cargo //garnet/foo/path/to/target:label for the GN target that you want to work on and open the corresponding directory in VSCode.

emacs

Synopsis

You will be using flycheck to compile your Rust files when you save them. flycheck will parse those outputs and highlight errors. You'll also use flycheck-rust so that it will compile with cargo and not with rustc. Both are available from melpa.

Instructions

If you don't yet have melpa, follow the instructions here.

Install flycheck and flycheck-rust in M-x list-packages. Type i to queue for installation what you are missing and then x to execute.

Next, make sure that flycheck-rust is run at startup. Put this in your .emacs files:

(with-eval-after-load 'rust-mode
  (add-hook 'flycheck-mode-hook #'flycheck-rust-setup))

You'll want cargo to run “check” and not “test” so set flycheck-rust-check-tests to nil. You can do this by typing C-h v flycheck-rust-check-tests<RET> and then customizing the variable in the normal way.

Now, you'll want to make sure that the default cargo and rustc that you are using are Fuchsia versions of those. From your fuchsia root, type:

rustup toolchain link fuchsia $PWD/buildtools/linux-x64/rust && rustup default fuchsia

Run fx gen-cargo //garnet/foo/path/to/target:label for the GN target that you want to work on.

You can read about adjusting flycheck to display your errors as you like. Type C-h v flycheck-highlighting-mode<RET> and customize it. Also customize C-h v flycheck-indiation-mode<RET>.

Now restart emacs and try it out.

Test and debug

To test that it works, you can run M-x flycheck-compile and see the command-line that flycheck is using to check syntax. It ought to look like one of these depending on whether you are in a lib or bin:

cargo check --lib --message-format\=json
cargo check --bin recovery_netstack --message-format\=json

If it runs rustc instead of cargo, that‘s because you didn’t fx gen-cargo.

Note that it might report errors on the first line of the current file. Those are actually errors from a different file. The error's comment will name the problematic file.