=== Expand Macro Recursively **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/expand_macro.rs#L15[expand_macro.rs] Shows the full macro expansion of the macro at current cursor. |=== | Editor | Action Name | VS Code | **Rust Analyzer: Expand macro recursively** |=== === Extend Selection **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/extend_selection.rs#L15[extend_selection.rs] Extends the current selection to the encompassing syntactic construct (expression, statement, item, module, etc). It works with multiple cursors. |=== | Editor | Shortcut | VS Code | kbd:[Ctrl+Shift+→] |=== === File Structure **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/display/structure.rs#L17[structure.rs] Provides a tree of the symbols defined in the file. Can be used to * fuzzy search symbol in a file (super useful) * draw breadcrumbs to describe the context around the cursor * draw outline of the file |=== | Editor | Shortcut | VS Code | kbd:[Ctrl+Shift+O] |=== === Go to Definition **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/goto_definition.rs#L18[goto_definition.rs] Navigates to the definition of an identifier. |=== | Editor | Shortcut | VS Code | kbd:[F12] |=== === Go to Implementation **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/goto_implementation.rs#L7[goto_implementation.rs] Navigates to the impl block of structs, enums or traits. Also implemented as a code lens. |=== | Editor | Shortcut | VS Code | kbd:[Ctrl+F12] |=== === Go to Type Definition **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/goto_type_definition.rs#L6[goto_type_definition.rs] Navigates to the type of an identifier. |=== | Editor | Action Name | VS Code | **Go to Type Definition* |=== === Hover **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/hover.rs#L63[hover.rs] Shows additional information, like type of an expression or documentation for definition when "focusing" code. Focusing is usually hovering with a mouse, but can also be triggered with a shortcut. === Inlay Hints **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/inlay_hints.rs#L40[inlay_hints.rs] rust-analyzer shows additional information inline with the source code. Editors usually render this using read-only virtual text snippets interspersed with code. rust-analyzer shows hits for * types of local variables * names of function arguments * types of chained expressions **Note:** VS Code does not have native support for inlay hints https://github.com/microsoft/vscode/issues/16221[yet] 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: https://github.com/rust-analyzer/rust-analyzer/issues/1623[1], https://github.com/rust-analyzer/rust-analyzer/issues/3453[2]. |=== | Editor | Action Name | VS Code | **Rust Analyzer: Toggle inlay hints* |=== === Join Lines **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/join_lines.rs#L12[join_lines.rs] Join selected lines into one, smartly fixing up whitespace, trailing commas, and braces. |=== | Editor | Action Name | VS Code | **Rust Analyzer: Join lines** |=== === Magic Completions **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/completion.rs#L39[completion.rs] 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. When completing a function call, `()` are automatically inserted. If a function takes arguments, the cursor is positioned inside the parenthesis. There are postfix completions, which can be triggered by typing something like `foo().if`. The word after `.` determines postfix completion. Possible variants are: - `expr.if` -> `if expr {}` or `if let ... {}` for `Option` or `Result` - `expr.match` -> `match expr {}` - `expr.while` -> `while expr {}` or `while let ... {}` for `Option` or `Result` - `expr.ref` -> `&expr` - `expr.refm` -> `&mut expr` - `expr.not` -> `!expr` - `expr.dbg` -> `dbg!(expr)` There also snippet completions: .Expressions - `pd` -> `println!("{:?}")` - `ppd` -> `println!("{:#?}")` .Items - `tfn` -> `#[test] fn f(){}` - `tmod` -> ```rust #[cfg(test)] mod tests { use super::*; #[test] fn test_fn() {} } ``` === Matching Brace **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/matching_brace.rs#L3[matching_brace.rs] 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. |=== | Editor | Action Name | VS Code | **Rust Analyzer: Find matching brace** |=== === On Typing Assists **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/typing.rs#L35[typing.rs] Some features trigger on typing certain characters: - typing `let =` tries to smartly add `;` if `=` is followed by an existing expression - Enter inside comments automatically inserts `///` - typing `.` in a chain method call auto-indents === Parent Module **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/parent_module.rs#L12[parent_module.rs] Navigates to the parent module of the current module. |=== | Editor | Action Name | VS Code | **Rust Analyzer: Locate parent module** |=== === Run **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/runnables.rs#L45[runnables.rs] Shows a popup suggesting to run a test/benchmark/binary **at the current cursor location**. Super useful for repeatedly running just a single test. Do bind this to a shortcut! |=== | Editor | Action Name | VS Code | **Rust Analyzer: Run** |=== === Semantic Syntax Highlighting **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/syntax_highlighting.rs#L33[syntax_highlighting.rs] rust-analyzer highlights the code semantically. For example, `bar` in `foo::Bar` might be colored differently depending on whether `Bar` is an enum or a trait. rust-analyzer does not specify colors directly, instead it assigns tag (like `struct`) and a set of modifiers (like `declaration`) to each token. It's up to the client to map those to specific colors. The general rule is that a reference to an entity gets colored the same way as the entity itself. We also give special modifier for `mut` and `&mut` local variables. === Show Syntax Tree **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/syntax_tree.rs#L9[syntax_tree.rs] Shows the parse tree of the current file. It exists mostly for debugging rust-analyzer itself. |=== | Editor | Action Name | VS Code | **Rust Analyzer: Show Syntax Tree** |=== === Status **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/status.rs#L27[status.rs] Shows internal statistic about memory usage of rust-analyzer. |=== | Editor | Action Name | VS Code | **Rust Analyzer: Status** |=== === Structural Seach and Replace **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide/src/ssr.rs#L26[ssr.rs] Search and replace with named wildcards that will match any expression. The syntax for a structural search replace command is ` ==>> `. A `$:expr` placeholder in the search pattern will match any expression and `$` will reference it in the replacement. Available via the command `rust-analyzer.ssr`. ```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)) ``` |=== | Editor | Action Name | VS Code | **Rust Analyzer: Structural Search Replace** |=== === Workspace Symbol **Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/ra_ide_db/src/symbol_index.rs#L113[symbol_index.rs] Uses fuzzy-search to find types, modules and functions by name across your project and dependencies. This is **the** most useful feature, which improves code 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, - `Foo` searches for `Foo` type in the current workspace - `foo#` searches for `foo` function in the current workspace - `Foo*` searches for `Foo` type among dependencies, including `stdlib` - `foo#*` searches for `foo` function among dependencies That is, `#` switches from "types" to all symbols, `*` switches from the current workspace to dependencies. |=== | Editor | Shortcut | VS Code | kbd:[Ctrl+T] |===