rust-analyzer/editors
DJMcNab c54a7da6e0 Run npm update and add private and preview flags
Private stops npm publish working, which would be nonsensical anyway

In case it gets added to the vscode extension repository, preview marks it as such

Private may also prevent publishing to the vscode extension repository
2018-12-08 20:56:31 +00:00
..
code Run npm update and add private and preview flags 2018-12-08 20:56:31 +00:00
emacs workspace-symbols function for Emacs 2018-11-08 18:43:02 +03:00
README.md Add on-enter handler 2018-10-09 19:52:06 +03:00

To install experimental VS Code plugin:

$ cargo install-code

This will run cargo install --packge ra_lsp_server to install the server binary into ~/.cargo/bin, and then will build and install plugin from editors/code. See this for details

It's better to remove existing Rust plugins to avoid interference.

Features:

  • syntax highlighting (LSP does not have API for it, so impl is hacky and sometimes fall-backs to the horrible built-in highlighting)

  • Go to symbol in workspace (ctrl+t)

    • #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, excluding stdlib
    • Sorry for a weired UI, neither LSP, not VSCode have any sane API for filtering! :)
  • Go to symbol in file (alt+shift+o)

  • Go to definition ("correct" for mod foo; decls, approximate for other things).

  • commands (ctrl+shift+p or keybindings)

    • Show Rust Syntax Tree (use it to verify that plugin works)
    • Rust Extend Selection. Extends the current selection to the encompassing syntactic construct (expression, statement, item, module, etc). It works with multiple cursors. Do bind this command to a key, its super-useful!
    • Rust Matching Brace. If the cursor is on any brace (<>(){}[]) which is a part of a brace-pair, moves cursor to the matching brace.
    • Rust Parent Module. Navigate to the parent module of the current module
    • Rust Join Lines. Join selected lines into one, smartly fixing up whitespace and trailing commas.
    • Run test at caret. When cursor is inside a function marked #[test], this action runs this specific test. If the cursor is outside of the test function, this re-runs the last test. Do bind this to a shortcut!
  • Typing assists

    • typing let = tries to smartly add ; if = is followed by an existing expression.
    • Enter inside comments continues comment (<|> signifies cursor position):
/// Docs<|>
fn foo() {}
/// Docs
/// <|>
fn foo() {}
  • code actions (use ctrl+. to activate).
  • Flip ,
// before:
fn foo(x: usize,<|> dim: (usize, usize))
// after:
fn foo(dim: (usize, usize), x: usize)
  • Add #[derive]
// before:
struct Foo {
    <|>x: i32
}
// after:
#[derive(<|>)]
struct Foo {
    x: i32
}
  • Add impl
// before:
struct Foo<'a, T: Debug> {
    <|>t: T
}
// after:
struct Foo<'a, T: Debug> {
    t: T
}

impl<'a, T: Debug> Foo<'a, T> {
    <|>
}