aboutsummaryrefslogtreecommitdiff
path: root/docs/user/manual.adoc
diff options
context:
space:
mode:
Diffstat (limited to 'docs/user/manual.adoc')
-rw-r--r--docs/user/manual.adoc120
1 files changed, 99 insertions, 21 deletions
diff --git a/docs/user/manual.adoc b/docs/user/manual.adoc
index b763958fe..cfc0ad81c 100644
--- a/docs/user/manual.adoc
+++ b/docs/user/manual.adoc
@@ -13,8 +13,12 @@ This manual focuses on a specific usage of the library -- running it as part of
13https://microsoft.github.io/language-server-protocol/[Language Server Protocol] (LSP). 13https://microsoft.github.io/language-server-protocol/[Language Server Protocol] (LSP).
14The 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. 14The 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.
15 15
16To improve this document, send a pull request against 16[TIP]
17https://github.com/rust-analyzer/rust-analyzer/blob/master/docs/user/manual.adoc[this file]. 17====
18[.lead]
19To improve this document, send a pull request: +
20https://github.com/rust-analyzer/rust-analyzer/blob/master/docs/user/manual.adoc[https://github.com/rust-analyzer/.../manual.adoc]
21====
18 22
19If you have questions about using rust-analyzer, please ask them in the https://users.rust-lang.org/c/ide/14["`IDEs and Editors`"] topic of Rust users forum. 23If you have questions about using rust-analyzer, please ask them in the https://users.rust-lang.org/c/ide/14["`IDEs and Editors`"] topic of Rust users forum.
20 24
@@ -106,20 +110,8 @@ Here are some useful self-diagnostic commands:
106* **Rust Analyzer: Show RA Version** shows the version of `rust-analyzer` binary 110* **Rust Analyzer: Show RA Version** shows the version of `rust-analyzer` binary
107* **Rust Analyzer: Status** prints some statistics about the server, like the few latest LSP requests 111* **Rust Analyzer: Status** prints some statistics about the server, like the few latest LSP requests
108* To enable server-side logging, run with `env RA_LOG=info` and see `Output > Rust Analyzer Language Server` in VS Code's panel. 112* To enable server-side logging, run with `env RA_LOG=info` and see `Output > Rust Analyzer Language Server` in VS Code's panel.
109* To log all LSP requests, add `"rust-analyzer.trace.server": "verbose"` to the settings and look for `Server Trace` in the panel. 113* To log all LSP requests, add `"rust-analyzer.trace.server": "verbose"` to the settings and look for `Rust Analyzer Language Server Trace` in the panel.
110* To enable client-side logging, add `"rust-analyzer.trace.extension": true` to the settings and open the `Console` tab of VS Code developer tools. 114* To enable client-side logging, add `"rust-analyzer.trace.extension": true` to the settings and open `Output > Rust Analyzer Client` in the panel.
111
112==== Special `when` clause context for keybindings.
113You may use `inRustProject` context to configure keybindings for rust projects only. For example:
114[source,json]
115----
116{
117 "key": "ctrl+i",
118 "command": "rust-analyzer.toggleInlayHints",
119 "when": "inRustProject"
120}
121----
122More about `when` clause contexts https://code.visualstudio.com/docs/getstarted/keybindings#_when-clause-contexts[here].
123 115
124=== rust-analyzer Language Server Binary 116=== rust-analyzer Language Server Binary
125 117
@@ -281,9 +273,6 @@ However, if you use some other build system, you'll have to describe the structu
281[source,TypeScript] 273[source,TypeScript]
282---- 274----
283interface JsonProject { 275interface JsonProject {
284 /// The set of paths containing the crates for this project.
285 /// Any `Crate` must be nested inside some `root`.
286 roots: string[];
287 /// The set of crates comprising the current project. 276 /// The set of crates comprising the current project.
288 /// Must include all transitive dependencies as well as sysroot crate (libstd, libcore and such). 277 /// Must include all transitive dependencies as well as sysroot crate (libstd, libcore and such).
289 crates: Crate[]; 278 crates: Crate[];
@@ -296,11 +285,37 @@ interface Crate {
296 edition: "2015" | "2018"; 285 edition: "2015" | "2018";
297 /// Dependencies 286 /// Dependencies
298 deps: Dep[]; 287 deps: Dep[];
288 /// Should this crate be treated as a member of current "workspace".
289 ///
290 /// By default, inferred from the `root_module` (members are the crates which reside
291 /// inside the directory opened in the editor).
292 ///
293 /// Set this to `false` for things like standard library and 3rd party crates to
294 /// enable performance optimizations (rust-analyzer assumes that non-member crates
295 /// don't change).
296 is_workspace_member?: boolean;
297 /// Optionally specify the (super)set of `.rs` files comprising this crate.
298 ///
299 /// By default, rust-analyzer assumes that only files under `root_module.parent` can belong to a crate.
300 /// `include_dirs` are included recursively, unless a subdirectory is in `exclude_dirs`.
301 ///
302 /// Different crates can share the same `source`.
303 ///
304 /// If two crates share an `.rs` file in common, they *must* have the same `source`.
305 /// rust-analyzer assumes that files from one source can't refer to files in another source.
306 source?: {
307 include_dirs: string[],
308 exclude_dirs: string[],
309 },
299 /// The set of cfgs activated for a given crate, like `["unix", "feature=foo", "feature=bar"]`. 310 /// The set of cfgs activated for a given crate, like `["unix", "feature=foo", "feature=bar"]`.
300 cfg: string[]; 311 cfg: string[];
312 /// Target triple for this Crate.
313 ///
314 /// Used when running `rustc --print cfg` to get target-specific cfgs.
315 target?: string;
316 /// Environment variables, used for the `env!` macro
317 env: : { [key: string]: string; },
301 318
302 /// value of the OUT_DIR env variable.
303 out_dir?: string;
304 /// For proc-macro crates, path to compiles proc-macro (.so file). 319 /// For proc-macro crates, path to compiles proc-macro (.so file).
305 proc_macro_dylib_path?: string; 320 proc_macro_dylib_path?: string;
306} 321}
@@ -337,3 +352,66 @@ They are usually triggered by a shortcut or by clicking a light bulb icon in the
337Cursor position or selection is signified by `┃` character. 352Cursor position or selection is signified by `┃` character.
338 353
339include::./generated_assists.adoc[] 354include::./generated_assists.adoc[]
355
356== Editor Features
357=== VS Code
358==== Special `when` clause context for keybindings.
359You may use `inRustProject` context to configure keybindings for rust projects only. For example:
360[source,json]
361----
362{
363 "key": "ctrl+i",
364 "command": "rust-analyzer.toggleInlayHints",
365 "when": "inRustProject"
366}
367----
368More about `when` clause contexts https://code.visualstudio.com/docs/getstarted/keybindings#_when-clause-contexts[here].
369
370==== Setting runnable environment variables
371You can use "rust-analyzer.runnableEnv" setting to define runnable environment-specific substitution variables.
372The simplest way for all runnables in a bunch:
373```jsonc
374"rust-analyzer.runnableEnv": {
375 "RUN_SLOW_TESTS": "1"
376}
377```
378
379Or it is possible to specify vars more granularly:
380```jsonc
381"rust-analyzer.runnableEnv": [
382 {
383 // "mask": null, // null mask means that this rule will be applied for all runnables
384 env: {
385 "APP_ID": "1",
386 "APP_DATA": "asdf"
387 }
388 },
389 {
390 "mask": "test_name",
391 "env": {
392 "APP_ID": "2", // overwrites only APP_ID
393 }
394 }
395]
396```
397
398You can use any valid RegExp as a mask. Also note that a full runnable name is something like *run bin_or_example_name*, *test some::mod::test_name* or *test-mod some::mod*, so it is possible to distinguish binaries, single tests, and test modules with this masks: `"^run"`, `"^test "` (the trailing space matters!), and `"^test-mod"` respectively.
399
400==== Compiler feedback from external commands
401
402Instead of relying on the built-in `cargo check`, you can configure Code to run a command in the background and use the `$rustc-watch` problem matcher to generate inline error markers from its output.
403
404To do this you need to create a new https://code.visualstudio.com/docs/editor/tasks[VS Code Task] and set `rust-analyzer.checkOnSave.enable: false` in preferences.
405
406For example, if you want to run https://crates.io/crates/cargo-watch[`cargo watch`] instead, you might add the following to `.vscode/tasks.json`:
407
408```json
409{
410 "label": "Watch",
411 "group": "build",
412 "type": "shell",
413 "command": "cargo watch",
414 "problemMatcher": "$rustc-watch",
415 "isBackground": true
416}
417```