rust/docs/user/features.md

219 lines
7.3 KiB
Markdown
Raw Normal View History

2020-02-21 20:53:30 +01:00
This document is an index of features that the rust-analyzer language server
2019-03-20 11:05:03 +01:00
provides. Shortcuts are for the default VS Code layout. If there's no shortcut,
you can use <kbd>Ctrl+Shift+P</kbd> to search for the corresponding action.
2019-03-20 10:17:12 +01:00
2019-03-20 11:05:03 +01:00
### Workspace Symbol <kbd>ctrl+t</kbd>
2019-03-20 10:17:12 +01:00
2020-02-21 20:53:30 +01:00
Uses fuzzy-search to find types, modules and functions by name across your
2019-09-26 03:49:52 +02:00
project and dependencies. This is **the** most useful feature, which improves code
2019-03-20 11:05:03 +01:00
navigation tremendously. It mostly works on top of the built-in LSP
functionality, however `#` and `*` symbols can be used to narrow down the
search. Specifically,
2019-03-20 10:17:12 +01:00
2019-03-20 11:05:03 +01:00
- `Foo` searches for `Foo` type in the current workspace
- `foo#` searches for `foo` function in the current workspace
2019-03-29 14:51:20 +01:00
- `Foo*` searches for `Foo` type among dependencies, including `stdlib`
2020-02-21 20:53:30 +01:00
- `foo#*` searches for `foo` function among dependencies
2019-03-20 10:17:12 +01:00
That is, `#` switches from "types" to all symbols, `*` switches from the current
workspace to dependencies.
2019-03-20 11:05:03 +01:00
### Document Symbol <kbd>ctrl+shift+o</kbd>
2019-03-20 10:17:12 +01:00
2019-03-20 11:05:03 +01:00
Provides a tree of the symbols defined in the file. Can be used to
2019-03-20 10:17:12 +01:00
2019-03-20 11:05:03 +01:00
* fuzzy search symbol in a file (super useful)
* draw breadcrumbs to describe the context around the cursor
* draw outline of the file
2019-03-20 10:17:12 +01:00
2019-03-20 11:05:03 +01:00
### On Typing Assists
2019-03-20 10:17:12 +01:00
2019-03-20 11:05:03 +01:00
Some features trigger on typing certain characters:
2019-03-20 10:17:12 +01:00
2020-02-21 20:53:30 +01:00
- typing `let =` tries to smartly add `;` if `=` is followed by an existing expression
2019-03-20 11:05:03 +01:00
- Enter inside comments automatically inserts `///`
- typing `.` in a chain method call auto-indents
2019-03-20 10:17:12 +01:00
2019-04-21 11:52:54 +02:00
### Extend Selection
2019-03-20 10:17:12 +01:00
2019-03-20 11:05:03 +01:00
Extends the current selection to the encompassing syntactic construct
2019-04-21 11:52:54 +02:00
(expression, statement, item, module, etc). It works with multiple cursors. This
is a relatively new feature of LSP:
https://github.com/Microsoft/language-server-protocol/issues/613, check your
editor's LSP library to see if this feature is supported.
2019-04-23 22:32:30 +02:00
### Go to Definition
Navigates to the definition of an identifier.
### Go to Implementation
Navigates to the impl block of structs, enums or traits. Also implemented as a code lens.
### Go to Type Defintion
Navigates to the type of an identifier.
2019-04-21 11:52:54 +02:00
### Commands <kbd>ctrl+shift+p</kbd>
2019-03-20 10:17:12 +01:00
#### Run
2020-02-21 20:53:30 +01:00
Shows a popup suggesting to run a test/benchmark/binary **at the current cursor
2019-03-20 10:17:12 +01:00
location**. Super useful for repeatedly running just a single test. Do bind this
to a shortcut!
2019-03-20 11:05:03 +01:00
#### Parent Module
2019-03-20 10:17:12 +01:00
2019-03-20 11:05:03 +01:00
Navigates to the parent module of the current module.
2019-03-20 10:17:12 +01:00
2019-03-20 11:05:03 +01:00
#### Matching Brace
2019-03-20 10:17:12 +01:00
2019-03-20 11:05:03 +01:00
If the cursor is on any brace (`<>(){}[]`) which is a part of a brace-pair,
moves cursor to the matching brace. It uses the actual parser to determine
braces, so it won't confuse generics with comparisons.
2019-03-20 10:17:12 +01:00
2019-03-20 11:05:03 +01:00
#### Join Lines
2019-03-20 10:17:12 +01:00
2019-03-20 11:05:03 +01:00
Join selected lines into one, smartly fixing up whitespace and trailing commas.
2019-03-20 10:17:12 +01:00
2019-03-20 11:05:03 +01:00
#### Show Syntax Tree
2019-03-20 10:17:12 +01:00
2019-03-20 11:05:03 +01:00
Shows the parse tree of the current file. It exists mostly for debugging
rust-analyzer itself.
2019-03-20 10:17:12 +01:00
2019-11-19 18:09:15 +01:00
#### Expand Macro Recursively
Shows the full macro expansion of the macro at current cursor.
2019-03-20 11:05:03 +01:00
#### Status
2019-03-20 10:17:12 +01:00
2020-02-21 20:53:30 +01:00
Shows internal statistic about memory usage of rust-analyzer.
2019-03-20 10:17:12 +01:00
2020-02-20 08:25:59 +01:00
#### Show RA Version
2020-02-21 20:53:30 +01:00
Show current rust-analyzer version.
2020-02-20 08:25:59 +01:00
#### Toggle inlay hints
Toggle inlay hints view for the current workspace.
It is recommended to assign a shortcut for this command to quickly turn off
inlay hints when they prevent you from reading/writing the code.
2020-02-21 20:53:30 +01:00
#### Run Garbage Collection
2019-03-20 10:17:12 +01:00
2020-02-21 20:53:30 +01:00
Manually triggers GC.
2019-03-20 10:17:12 +01:00
2019-04-20 10:02:23 +02:00
#### Start Cargo Watch
Start `cargo watch` for live error highlighting. Will prompt to install if it's not already installed.
#### Stop Cargo Watch
2020-02-21 20:53:30 +01:00
Stop `cargo watch`.
2019-04-20 10:02:23 +02:00
#### Structural Seach and Replace
2020-02-22 16:45:04 +01:00
Search and replace with named wildcards that will match any expression.
The syntax for a structural search replace command is `<search_pattern> ==>> <replace_pattern>`. A `$<name>:expr` placeholder in the search pattern will match any expression and `$<name>` will reference it in the replacement. Available via the command `rust-analyzer.ssr`.
2020-02-22 16:45:04 +01:00
```rust
// Using structural search replace command [foo($a:expr, $b:expr) ==>> ($a).foo($b)]
// BEFORE
String::from(foo(y + 5, z))
// AFTER
String::from((y + 5).foo(z))
```
2019-10-25 13:16:46 +02:00
### Assists (Code Actions)
2019-03-20 11:05:03 +01:00
2019-10-27 15:49:39 +01:00
Assists, or code actions, are small local refactorings, available in a particular context.
They are usually triggered by a shortcut or by clicking a light bulb icon in the editor.
2019-03-20 10:17:12 +01:00
2019-10-27 15:49:39 +01:00
See [assists.md](./assists.md) for the list of available assists.
2019-03-20 11:05:03 +01:00
2019-03-20 11:19:46 +01:00
### Magic Completions
In addition to usual reference completion, rust-analyzer provides some ✨magic✨
completions as well:
Keywords like `if`, `else` `while`, `loop` are completed with braces, and cursor
is placed at the appropriate position. Even though `if` is easy to type, you
still want to complete it, to get ` { }` for free! `return` is inserted with a
space or `;` depending on the return type of the function.
2020-02-21 20:53:30 +01:00
When completing a function call, `()` are automatically inserted. If a function
takes arguments, the cursor is positioned inside the parenthesis.
2019-03-20 11:19:46 +01:00
2020-04-29 22:00:52 +02:00
There are postfix completions, which can be triggered by typing something like
`foo().if`. The word after `.` determines postfix completion. Possible variants are:
2019-03-20 11:19:46 +01:00
2020-05-12 09:46:28 +02:00
- `expr.if` -> `if expr {}` or `if let ... {}` for `Option` or `Result`
2019-03-20 11:19:46 +01:00
- `expr.match` -> `match expr {}`
2020-05-12 09:46:28 +02:00
- `expr.while` -> `while expr {}` or `while let ... {}` for `Option` or `Result`
2019-03-20 11:19:46 +01:00
- `expr.ref` -> `&expr`
- `expr.refm` -> `&mut expr`
- `expr.not` -> `!expr`
- `expr.dbg` -> `dbg!(expr)`
There also snippet completions:
#### Inside Expressions
- `pd` -> `println!("{:?}")`
- `ppd` -> `println!("{:#?}")`
#### Inside Modules
- `tfn` -> `#[test] fn f(){}`
2020-05-12 09:46:28 +02:00
- `tmod` ->
```rust
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_fn() {}
}
```
2019-03-20 11:19:46 +01:00
2020-02-21 20:53:30 +01:00
### Code Highlighting
2019-05-27 11:26:15 +02:00
Experimental feature to let rust-analyzer highlight Rust code instead of using the
default highlighter.
2020-02-21 20:53:30 +01:00
#### Rainbow Highlighting
2019-05-27 11:26:15 +02:00
Experimental feature that, given code highlighting using rust-analyzer is
active, will pick unique colors for identifiers.
2020-02-22 08:23:03 +01:00
### Code hints
Rust-analyzer has two types of hints to show the information about the code:
2020-02-22 08:23:03 +01:00
* hover hints, appearing on hover on any element.
These contain extended information on the hovered language item.
2020-02-22 08:23:03 +01:00
* inlay hints, shown near the element hinted directly in the editor.
Two types of inlay hints are displayed currently:
* type hints, displaying the minimal information on the type of the expression (if the information is available)
2020-03-24 01:10:03 +01:00
* method chaining hints, type information for multi-line method chains
2020-02-22 08:23:03 +01:00
* parameter name hints, displaying the names of the parameters in the corresponding methods
#### VS Code
In VS Code, the following settings can be used to configure the inlay hints:
2020-03-12 18:04:11 +01:00
* `rust-analyzer.inlayHints.typeHints` - enable hints for inferred types.
2020-03-24 01:10:03 +01:00
* `rust-analyzer.inlayHints.chainingHints` - enable hints for inferred types on method chains.
2020-03-12 18:04:11 +01:00
* `rust-analyzer.inlayHints.parameterHints` - enable hints for function parameters.
* `rust-analyzer.inlayHints.maxLength` shortens the hints if their length exceeds the value specified. If no value is specified (`null`), no shortening is applied.
2020-02-22 08:23:03 +01:00
**Note:** VS Code does not have native support for inlay hints [yet](https://github.com/microsoft/vscode/issues/16221) and the hints are implemented using decorations.
This approach has limitations, the caret movement and bracket highlighting near the edges of the hint may be weird:
[1](https://github.com/rust-analyzer/rust-analyzer/issues/1623), [2](https://github.com/rust-analyzer/rust-analyzer/issues/3453).