rust/docs/user/readme.adoc

258 lines
10 KiB
Plaintext
Raw Normal View History

2020-02-14 11:30:52 -06:00
= User Manual
:toc: preamble
:sectanchors:
:page-layout: post
2020-03-08 12:01:31 -05:00
// https://gist.github.com/dcode/0cfbf2699a1fe9b46ff04c41721dda74#admonitions
:tip-caption: :bulb:
:note-caption: :information_source:
:important-caption: :heavy_exclamation_mark:
:caution-caption: :fire:
:warning-caption: :warning:
2020-02-14 11:30:52 -06:00
// Master copy of this document lives in the https://github.com/rust-analyzer/rust-analyzer repository
2020-02-21 13:53:30 -06:00
At its core, rust-analyzer is a *library* for semantic analysis of Rust code as it changes over time.
This manual focuses on a specific usage of the library -- running it as part of a server that implements the
https://microsoft.github.io/language-server-protocol/[Language Server Protocol] (LSP).
The LSP allows various code editors, like VS Code, Emacs or Vim, to implement semantic features like completion or goto definition by talking to an external language server process.
2020-02-14 11:30:52 -06:00
To improve this document, send a pull request against
https://github.com/rust-analyzer/rust-analyzer/blob/master/docs/user/readme.adoc[this file].
2020-02-14 11:30:52 -06:00
== Installation
2020-04-26 08:44:05 -05:00
In theory, one should be able to just install the <<rust-analyzer-language-server-binary,`rust-analyzer` binary>> and have it automatically work with any editor.
2020-02-14 11:30:52 -06:00
We are not there yet, so some editor specific setup is required.
Additionally, rust-analyzer needs the sources of the standard library.
If the source code is not present, rust-analyzer will attempt to install it automatically.
2020-02-17 15:33:48 -06:00
To add the sources manually, run the following command:
2020-02-17 03:55:08 -06:00
```bash
$ rustup component add rust-src
```
2020-02-14 11:30:52 -06:00
=== VS Code
This is the best supported editor at the moment.
The rust-analyzer plugin for VS Code is maintained
2020-02-14 11:30:52 -06:00
https://github.com/rust-analyzer/rust-analyzer/tree/master/editors/code[in tree].
You can install the latest release of the plugin from
https://marketplace.visualstudio.com/items?itemName=matklad.rust-analyzer[the marketplace].
2020-02-21 13:53:30 -06:00
By default, the plugin will prompt you to download the matching version of the server as well:
2020-02-14 11:30:52 -06:00
2020-02-21 13:55:15 -06:00
image::https://user-images.githubusercontent.com/9021944/75067008-17502500-54ba-11ea-835a-f92aac50e866.png[]
2020-02-14 11:30:52 -06:00
2020-03-08 12:01:31 -05:00
[NOTE]
====
To disable this notification put the following to `settings.json`
[source,json]
----
{ "rust-analyzer.updates.askBeforeDownload": false }
2020-03-08 12:01:31 -05:00
----
====
2020-03-28 08:00:41 -05:00
The server binary is stored in `~/.config/Code/User/globalStorage/matklad.rust-analyzer` (Linux) or in `~/.Library/Application Support/Code/User/globalStorage/matklad.rust-analyzer` (macOS) or in `%APPDATA%\Code\User\globalStorage` (Windows).
2020-02-14 11:30:52 -06:00
Note that we only support the latest version of VS Code.
==== Updates
The extension will be updated automatically as new versions become available. It will ask your permission to download the matching language server version binary if needed.
2020-02-14 11:30:52 -06:00
===== Nightly
We ship nightly releases for VS Code. To help us out with testing the newest code and follow the bleeding edge of our `master`, please use the following config:
[source,json]
----
{ "rust-analyzer.updates.channel": "nightly" }
----
You will be prompted to install the `nightly` extension version. Just click `Download now` and from that moment you will get automatic updates every 24 hours.
If you don't want to be asked for `Download now` every day when the new nightly version is released add the following to your `settings.json`:
[source,json]
----
{ "rust-analyzer.updates.askBeforeDownload": false }
----
NOTE: Nightly extension should **only** be installed via the `Download now` action from VS Code.
2020-02-14 11:30:52 -06:00
==== Building From Source
Alternatively, both the server and the plugin can be installed from source:
[source]
----
2020-02-14 14:02:08 -06:00
$ git clone https://github.com/rust-analyzer/rust-analyzer.git && cd rust-analyzer
2020-02-14 11:30:52 -06:00
$ cargo xtask install
----
You'll need Cargo, nodejs and npm for this.
2020-02-14 11:30:52 -06:00
Note that installing via `xtask install` does not work for VS Code Remote, instead you'll need to install the `.vsix` manually.
2020-03-24 04:31:52 -05:00
==== Troubleshooting
Here are some useful self-diagnostic commands:
* **Rust Analyzer: Show RA Version** shows the version of `rust-analyzer` binary
* **Rust Analyzer: Status** prints some statistics about the server, like the few latest LSP requests
* To enable server-side logging, run with `env RUST_LOG=info` and see `Output > Rust Analyzer Language Server` in VS Code's panel.
* To log all LSP requests, add `"rust-analyzer.trace.server": "verbose"` to the settings and look for `Server Trace` in the panel.
* To enable client-side logging, add `"rust-analyzer.trace.extension": true` to the settings and open the `Console` tab of VS Code developer tools.
2020-04-26 08:44:05 -05:00
=== rust-analyzer Language Server Binary
2020-02-14 11:30:52 -06:00
Other editors generally require the `rust-analyzer` binary to be in `$PATH`.
You can download the pre-built binary from the https://github.com/rust-analyzer/rust-analyzer/releases[releases] page. Typically, you then need to rename the binary for your platform, e.g. `rust-analyzer-mac` if you're on Mac OS, to `rust-analyzer` and make it executable in addition to moving it into a directory in your `$PATH`.
On Linux to install the `rust-analyzer` binary into `~/.local/bin`, this commands could be used
2020-04-26 08:44:05 -05:00
[source,bash]
----
$ curl -L https://github.com/rust-analyzer/rust-analyzer/releases/latest/download/rust-analyzer-linux -o ~/.local/bin/rust-analyzer
$ chmod +x ~/.local/bin/rust-analyzer
2020-04-26 08:44:05 -05:00
----
2020-04-26 12:40:13 -05:00
Ensure `~/.local/bin` is listed in the `$PATH` variable.
Alternatively, you can install it from source using the following command:
2020-02-14 11:30:52 -06:00
[source,bash]
----
2020-04-26 08:44:05 -05:00
$ git clone https://github.com/rust-analyzer/rust-analyzer.git && cd rust-analyzer
2020-02-14 11:30:52 -06:00
$ cargo xtask install --server
----
If your editor can't find the binary even though the binary is on your `$PATH`, the likely explanation is that it doesn't see the same `$PATH` as the shell, see https://github.com/rust-analyzer/rust-analyzer/issues/1811[this issue]. On Unix, running the editor from a shell or changing the `.desktop` file to set the environment should help.
==== Arch Linux
The `rust-analyzer` binary can be installed from AUR (Arch User Repository):
- https://aur.archlinux.org/packages/rust-analyzer-bin[`rust-analyzer-bin`] (binary from GitHub releases)
- https://aur.archlinux.org/packages/rust-analyzer[`rust-analyzer`] (built from latest tagged source)
2020-03-16 11:01:02 -05:00
- https://aur.archlinux.org/packages/rust-analyzer-git[`rust-analyzer-git`] (latest git version)
Install it with AUR helper of your choice, for example:
[source,bash]
----
$ yay -S rust-analyzer-bin
----
2020-02-14 11:30:52 -06:00
=== Emacs
2020-04-26 08:44:05 -05:00
Prerequisites: You have installed the <<rust-analyzer-language-server-binary,`rust-analyzer` binary>>.
2020-02-14 11:30:52 -06:00
2020-04-26 08:44:05 -05:00
Emacs support is maintained as part of the https://github.com/emacs-lsp/lsp-mode[Emacs-LSP] package in https://github.com/emacs-lsp/lsp-mode/blob/master/lsp-rust.el[lsp-rust.el].
1. Install the most recent version of `emacs-lsp` package by following the https://github.com/emacs-lsp/lsp-mode[Emacs-LSP instructions].
2020-02-14 11:30:52 -06:00
2. Set `lsp-rust-server` to `'rust-analyzer`.
3. Run `lsp` in a Rust buffer.
4. (Optionally) bind commands like `lsp-rust-analyzer-join-lines`, `lsp-extend-selection` and `lsp-rust-analyzer-expand-macro` to keys.
=== Vim
2020-04-26 08:44:05 -05:00
Prerequisites: You have installed the <<rust-analyzer-language-server-binary,`rust-analyzer` binary>>.
2020-02-14 11:30:52 -06:00
The are several LSP client implementations for vim:
==== coc-rust-analyzer
1. Install coc.nvim by following the instructions at
https://github.com/neoclide/coc.nvim[coc.nvim]
(Node.js required)
2020-02-14 11:30:52 -06:00
2. Run `:CocInstall coc-rust-analyzer` to install
https://github.com/fannheyward/coc-rust-analyzer[coc-rust-analyzer],
this extension implements _most_ of the features supported in the VSCode extension:
* automatically install and upgrade stable/nightly releases
* same configurations as VSCode extension, `rust-analyzer.serverPath`, `rust-analyzer.cargo.features` etc.
* same commands too, `rust-analyzer.analyzerStatus`, `rust-analyzer.ssr` etc.
* inlay hints for method chaining support, _Neovim Only_
* semantic highlighting is not implemented yet
2020-02-14 11:30:52 -06:00
==== LanguageClient-neovim
1. Install LanguageClient-neovim by following the instructions
https://github.com/autozimu/LanguageClient-neovim[here]
* The github project wiki has extra tips on configuration
2020-02-21 13:53:30 -06:00
2. Configure by adding this to your vim/neovim config file (replacing the existing Rust-specific line if it exists):
2020-02-14 11:30:52 -06:00
+
[source,vim]
----
let g:LanguageClient_serverCommands = {
2020-02-18 05:33:16 -06:00
\ 'rust': ['rust-analyzer'],
2020-02-14 11:30:52 -06:00
\ }
----
==== YouCompleteMe
1. Install YouCompleteMe by following the instructions
2020-04-29 05:50:54 -05:00
https://github.com/ycm-core/lsp-examples#rust-rust-analyzer[here]
2. Configure by adding this to your vim/neovim config file (replacing the existing Rust-specific line if it exists):
+
[source,vim]
----
let g:ycm_language_server =
\ [
\ {
\ 'name': 'rust',
\ 'cmdline': ['rust-analyzer'],
\ 'filetypes': ['rust'],
\ 'project_root_files': ['Cargo.toml']
\ }
\ ]
----
==== ALE
To add the LSP server to https://github.com/dense-analysis/ale[ale]:
[source,vim]
----
call ale#linter#Define('rust', {
\ 'name': 'rust-analyzer',
\ 'lsp': 'stdio',
\ 'executable': 'rust-analyzer',
\ 'command': '%e',
\ 'project_root': '.',
\})
----
2020-02-14 11:30:52 -06:00
==== nvim-lsp
2020-02-21 13:53:30 -06:00
NeoVim 0.5 (not yet released) has built-in language server support.
2020-02-14 11:30:52 -06:00
For a quick start configuration of rust-analyzer, use https://github.com/neovim/nvim-lsp#rust_analyzer[neovim/nvim-lsp].
2020-03-09 06:31:23 -05:00
Once `neovim/nvim-lsp` is installed, use `+lua require'nvim_lsp'.rust_analyzer.setup({})+` in your `init.vim`.
2020-02-14 11:30:52 -06:00
=== Sublime Text 3
2020-04-26 08:44:05 -05:00
Prerequisites: You have installed the <<rust-analyzer-language-server-binary,`rust-analyzer` binary>>.
You also need the `LSP` package. To install it:
1. If you've never installed a Sublime Text package, install Package Control:
* Open the command palette (Win/Linux: `ctrl+shift+p`, Mac: `cmd+shift+p`)
* Type `Install Package Control`, press enter
2. In the command palette, run `Package control: Install package`, and in the list that pops up, type `LSP` and press enter.
2020-04-30 13:29:21 -05:00
Finally, with your Rust project open, in the command palette, run `LSP: Enable Language Server In Project` or `LSP: Enable Language Server Globally`, then select `rust-analyzer` in the list that pops up to enable the rust-analyzer LSP. The latter means that rust-analyzer is enabled by default in Rust projects.
2020-02-14 11:30:52 -06:00
2020-04-30 13:29:21 -05:00
If it worked, you should see "rust-analyzer, Line X, Column Y" on the left side of the bottom bar, and after waiting a bit, functionality like tooltips on hovering over variables should become available.
2020-02-14 11:30:52 -06:00
2020-04-26 08:44:05 -05:00
If you get an error saying `No such file or directory: 'rust-analyzer'`, see the <<rust-analyzer-language-server-binary,`rust-analyzer` binary>> section on installing the language server binary.
2020-02-14 11:30:52 -06:00
== Usage
See https://github.com/rust-analyzer/rust-analyzer/blob/master/docs/user/features.md[features.md].