blob: 2b0748bf3b56192f31de99d80ac525346f1e4de6 [file] [view]
# Rust Editor Configuration
[TOC]
## Generating Cargo.toml files for use by editors {#generating-cargo-toml}
Many editors require Cargo.toml files in order to understand how your Rust
project is structured. These files can be generated using the following
commands, where `//garnet/foo/path/to/target:label` is the GN target that
you want to work on:
```sh
you@computer:/path/to/fuchsia $ fx build garnet/foo/path/to/target:some_label
you@computer:/path/to/fuchsia $ fx gen-cargo garnet/foo/path/to/target:some_label
```
Note that this label must point to a `rustc_...` GN template, not a Fuchsia package or other GN
target. For example:
```
rustc_binary("some_label") {
...
}
```
## Intellij
See instructions on [the Intellij Rust site](https://intellij-rust.github.io/).
Finally, follow the steps above to generate a Cargo.toml file for use by Intellij.
## VIM
See instructions on [`rust-lang/rust.vim`](https://github.com/rust-lang/rust.vim).
If you use Tagbar, see [this post](https://users.rust-lang.org/t/taglist-like-vim-plugin-for-rust/21924/13)
for instructions on making it work better with Rust.
## Visual Studio Code {#visual-studio-code}
The VS Code plugin uses the RLS (Rust language server) so you'll need to first
[install rustup](https://rustup.rs/). Next, install [this VSCode plugin].
You need to configure `rustup` to use the Fuchsia Rust toolchain.
Run this command from your Fuchsia source code root directory.
```sh
rustup toolchain link fuchsia $(scripts/youcompleteme/paths.py VSCODE_RUST_TOOLCHAIN)
rustup default fuchsia
```
Follow [the steps above](#generating-cargo-toml) to generate a `Cargo.toml` file
for use by VSCode.
Open VS Code and ensure that the directory where the generated `Cargo.toml` file
resides is added as a directory in your workspace (even though you probably have
its ancestor `fuchsia` directory already in your workspace). For example:
```sh
you@computer:/path/to/fuchsia $ fx build src/rusty/component:bin
you@computer:/path/to/fuchsia $ fx gen-cargo src/rusty/component:bin
```
In a new VS Code workspace, in this example, add both `/path/to/fuchsia` and
`/path/to/fuchsia/src/rusty/component` to the workspace. Saving the
workspace would yield something like:
`fuchsia_rusty_component.code-workspace`
```javascript
{
"folders": [
{
"path": "/path/to/fuchsia"
},
{
"path": "/path/to/fuchsia/src/rusty/component"
}
]
}
```
Next, take note of the paths output by the following:
```sh
you@computer:/path/to/fuchsia $ ./scripts/youcompleteme/paths.py FUCHSIA_ROOT
you@computer:/path/to/fuchsia $ ./scripts/youcompleteme/paths.py VSCODE_RUST_TOOLCHAIN
```
Open VS Code settings
* MacOS X: Code>Preferences>Settings
* Linux: File>Preferences>Settings
Note there are different settings defined for each environment (for example, user vs remote development server).
In the upper right corner, click an icon whose mouse-over balloon tip says "Open Settings (JSON)".
Add the following settings:
```javascript
{
// General rust and RLS configuration.
"rust.target": "x86_64-fuchsia",
"rust.target_dir": "<FUCHSIA_ROOT>/out/cargo_target",
"rust.unstable_features": true,
"rust-client.rlsPath": "<VS_CODE_TOOLCHAIN>/bin/rls",
"rust-client.disableRustup": true,
"rust.mode": "rls",
// Read `Cargo.toml` from innermost root workspace directory.
"rust-client.nestedMultiRootConfigInOutermost": false,
// Optional extras:
// Log RLS info/warning/error messages to a VSCode Output Panel.
"rust-client.revealOutputChannelOn": "info",
// Create `rls[numeric-id].log` in your project directory. Errors from RLS
// will be logged there.
"rust-client.logToFile": true,
}
```
[this VSCode plugin]: https://marketplace.visualstudio.com/items?itemName=rust-lang.rust
## emacs
### Synopsis
You will be using [flycheck](https://www.flycheck.org/en/latest/) to compile
your Rust files when you save them. flycheck will parse those outputs and
highlight errors. You'll also use
[flycheck-rust](https://github.com/flycheck/flycheck-rust) so that it will
compile with cargo and not with rustc. Both are available from
[melpa](https://melpa.org/#/).
### Instructions
If you don't yet have melpa, follow the instructions
[here](https://melpa.org/#/getting-started).
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:
```elisp
(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:
```elisp
rustup toolchain link fuchsia $PWD/prebuilt/third_party/rust/linux-x64 && rustup default fuchsia
```
Finally, follow the steps at the top of this page to generate a Cargo.toml for the GN target
that you want to work on.
You can [read about](http://www.flycheck.org/en/latest/user/error-reports.html)
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:
```sh
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.