3140: Start manual r=matklad a=matklad



Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2020-02-14 18:04:32 +00:00 committed by GitHub
commit 53cee86666
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 214 additions and 299 deletions

View File

@ -1,280 +0,0 @@
[github-releases]: https://github.com/rust-analyzer/rust-analyzer/releases
The main interface to rust-analyzer is the
[LSP](https://microsoft.github.io/language-server-protocol/) implementation. To
install lsp server, you have three options:
* **Preferred and default:** install the plugin/extension for your IDE and it will ask your permission to automatically download the latest lsp server for you from [GitHub releases][github-releases]. (See docs to find out whether this is implemented for your editor below).
* Manually download prebuilt binaries from [GitHub releases][github-releases]
* `ra_lsp_server-linux` for Linux
* `ra_lsp_server-mac` for Mac
* `ra_lsp_server-windows.exe` for Windows
* Clone the repository and build from sources
```bash
$ git clone git@github.com:rust-analyzer/rust-analyzer && cd rust-analyzer
$ cargo xtask install --server # or cargo install --path ./crates/ra_lsp_server
```
This way you will get a binary named `ra_lsp_server` (with os suffix for prebuilt binaries)
which you should be able to use with any LSP-compatible editor.
We make use of custom extensions to LSP, so special client-side support is required to take full
advantage of rust-analyzer. This repository contains support code for VS Code.
Rust Analyzer needs sources of rust standard library to work, so
you might also need to execute
```
$ rustup component add rust-src
```
See [./features.md](./features.md) document for a list of features that are available.
## VS Code
### Prerequisites
You will need the most recent version of VS Code: we don't try to
maintain compatibility with older versions yet.
### Installation from prebuilt binaries
We ship prebuilt binaries for Linux, Mac and Windows via
[GitHub releases][github-releases].
In order to use them you need to install the client VSCode extension.
Publishing to VS Code marketplace is currently WIP. Thus, you need to manually download
`rust-analyzer-0.1.0.vsix` file from latest [GitHub release][github-releases].
After you downloaded the `.vsix` file you can install it from the terminal
```
$ code --install-extension rust-analyzer-0.1.0.vsix
```
Or open VS Code, press <kbd>Ctrl+Shift+P</kbd>, and search for the following command:
<img width="500px" alt="Install from VSIX command" src="https://user-images.githubusercontent.com/36276403/74108225-c0c11d80-4b80-11ea-9b2a-0a43f09e29af.png">
Press <kbd>Enter</kbd> and go to `rust-analyzer-0.1.0.vsix` file through the file explorer.
Then open some Rust project and you should
see an info message pop-up.
<img height="140px" src="https://user-images.githubusercontent.com/36276403/74103174-a40df100-4b52-11ea-81f4-372c70797924.png" alt="Download now message"/>
Click `Download now`, wait until the progress is 100% and you are ready to go.
For updates you need to remove installed binary
```
rm -rf ${HOME}/.config/Code/User/globalStorage/matklad.rust-analyzer
```
`"Download latest language server"` command for VSCode and automatic updates detection is currently WIP.
### Installation from sources
In order to build the VS Code plugin from sources, you need to have node.js and npm with
a minimum version of 12 installed. Please refer to
[node.js and npm documentation](https://nodejs.org) for installation instructions.
The experimental VS Code plugin can be built and installed by executing the
following commands:
```
$ git clone https://github.com/rust-analyzer/rust-analyzer.git --depth 1
$ cd rust-analyzer
$ cargo xtask install
```
After that you need to amend your `settings.json` file to explicitly specify the
path to `ra_lsp_server` that you've just built.
```json
{
"rust-analyzer.raLspServerPath": "ra_lsp_server"
}
```
This should work on all platforms, otherwise if installed `ra_lsp_server` is not available through your `$PATH` then see how to configure it [here](#setting-up-the-PATH-variable).
The automatic installation is expected to *just work* for common cases, if it
doesn't, report bugs!
**Note** [#1831](https://github.com/rust-analyzer/rust-analyzer/issues/1831): If you are using the popular
[Vim emulation plugin](https://github.com/VSCodeVim/Vim), you will likely
need to turn off the `rust-analyzer.enableEnhancedTyping` setting.
(// TODO: This configuration is no longer available, enhanced typing shoud be disabled via removing Enter key binding, [see this issue](https://github.com/rust-analyzer/rust-analyzer/issues/3051))
If you have an unusual setup (for example, `code` is not in the `PATH`), you
should adapt these manual installation instructions:
```
$ git clone https://github.com/rust-analyzer/rust-analyzer.git --depth 1
$ cd rust-analyzer
$ cargo install --path ./crates/ra_lsp_server/ --force --locked
$ cd ./editors/code
$ npm install
$ npm run package
$ code --install-extension ./rust-analyzer-0.1.0.vsix
```
It's better to remove existing Rust plugins to avoid interference.
Beyond basic LSP features, there are some extension commands which you can
invoke via <kbd>Ctrl+Shift+P</kbd> or bind to a shortcut. See [./features.md](./features.md)
for details.
For updates, pull the latest changes from the master branch, run `cargo xtask install` again, and **restart** VS Code instance.
See [microsoft/vscode#72308](https://github.com/microsoft/vscode/issues/72308) for why a full restart is needed.
### VS Code Remote
You can also use `rust-analyzer` with the Visual Studio Code Remote extensions
(Remote SSH, Remote WSL, Remote Containers). In this case, however, you have to
manually install the `.vsix` package:
1. Build the extension on the remote host using the instructions above (ignore the
error if `code` cannot be found in your PATH: VSCode doesn't need to be installed
on the remote host).
2. In Visual Studio Code open a connection to the remote host.
3. Open the Extensions View (`View > Extensions`, keyboard shortcut: `Ctrl+Shift+X`).
4. From the top-right kebab menu (`···`) select `Install from VSIX...`
5. Inside the `rust-analyzer` directory find the `editors/code` subdirectory and choose
the `rust-analyzer-0.1.0.vsix` file.
6. Restart Visual Studio Code and re-establish the connection to the remote host.
In case of errors please make sure that `~/.cargo/bin` is in your `PATH` on the remote
host.
### Settings
* `rust-analyzer.highlightingOn`: enables experimental syntax highlighting.
Colors can be configured via `editor.tokenColorCustomizations`.
As an example, [Pale Fire](https://github.com/matklad/pale-fire/) color scheme tweaks rust colors.
* `rust-analyzer.enableEnhancedTyping`: by default, rust-analyzer intercepts the
`Enter` key to make it easier to continue comments. Note that it may conflict with VIM emulation plugin.
* `rust-analyzer.raLspServerPath`: path to `ra_lsp_server` executable, when absent or `null` defaults to prebuilt binary path
* `rust-analyzer.enableCargoWatchOnStartup`: prompt to install & enable `cargo
watch` for live error highlighting (note, this **does not** use rust-analyzer)
* `rust-analyzer.excludeGlobs`: a list of glob-patterns for exclusion (see globset [docs](https://docs.rs/globset) for syntax).
Note: glob patterns are applied to all Cargo packages and a rooted at a package root.
This is not very intuitive and a limitation of a current implementation.
* `rust-analyzer.useClientWatching`: use client provided file watching instead
of notify watching.
* `rust-analyzer.cargo-watch.command`: `cargo-watch` command. (e.g: `clippy` will run as `cargo watch -x clippy` )
* `rust-analyzer.cargo-watch.arguments`: cargo-watch check arguments.
(e.g: `--features="shumway,pdf"` will run as `cargo watch -x "check --features="shumway,pdf""` )
* `rust-analyzer.cargo-watch.ignore`: list of patterns for cargo-watch to ignore (will be passed as `--ignore`)
* `rust-analyzer.trace.server`: enables internal logging
* `rust-analyzer.trace.cargo-watch`: enables cargo-watch logging
* `RUST_SRC_PATH`: environment variable that overwrites the sysroot
* `rust-analyzer.featureFlags` -- a JSON object to tweak fine-grained behavior:
```jsonc
{
// Show diagnostics produced by rust-analyzer itself.
"lsp.diagnostics": true,
// Automatically insert `()` and `<>` when completing functions and types.
"completion.insertion.add-call-parenthesis": true,
// Enable completions like `.if`, `.match`, etc.
"completion.enable-postfix": true,
// Show notification when workspace is fully loaded
"notifications.workspace-loaded": true,
// Show error when no Cargo.toml was found
"notifications.cargo-toml-not-found": true,
}
```
## Emacs
* install recent version of `emacs-lsp` package by following the instructions [here][emacs-lsp]
* set `lsp-rust-server` to `'rust-analyzer`
* run `lsp` in a Rust buffer
* (Optionally) bind commands like `lsp-rust-analyzer-join-lines`, `lsp-extend-selection` and `lsp-rust-analyzer-expand-macro` to keys
[emacs-lsp]: https://github.com/emacs-lsp/lsp-mode
## Vim and NeoVim (coc-rust-analyzer)
* Install coc.nvim by following the instructions at [coc.nvim][] (nodejs required)
* Run `:CocInstall coc-rust-analyzer` to install [coc-rust-analyzer], this extension implements _most_ of the features supported in the VSCode extension:
- same configurations as VSCode extension, `rust-analyzer.raLspServerPath`, `rust-analyzer.enableCargoWatchOnStartup` etc.
- same commands too, `rust-analyzer.analyzerStatus`, `rust-analyzer.startCargoWatch` etc.
- highlighting and inlay_hints are not implemented yet
[coc.nvim]: https://github.com/neoclide/coc.nvim
[coc-rust-analyzer]: https://github.com/fannheyward/coc-rust-analyzer
## Vim and NeoVim (LanguageClient-neovim)
* Install LanguageClient-neovim by following the instructions [here][lang-client-neovim]
- The github project wiki has extra tips on configuration
* Configure by adding this to your vim/neovim config file (replacing the existing rust specific line if it exists):
```vim
let g:LanguageClient_serverCommands = {
\ 'rust': ['ra_lsp_server'],
\ }
```
[lang-client-neovim]: https://github.com/autozimu/LanguageClient-neovim
## NeoVim (nvim-lsp)
NeoVim 0.5 (not yet released) has built in language server support. For a quick start configuration
of rust-analyzer, use [neovim/nvim-lsp](https://github.com/neovim/nvim-lsp#rust_analyzer).
Once `neovim/nvim-lsp` is installed, use `lua require'nvim_lsp'.rust_analyzer.setup({})` in your `init.vim`.
## Sublime Text 3
Prequisites:
`LSP` package.
Installation:
* Invoke the command palette with <kbd>Ctrl+Shift+P</kbd>
* Type `LSP Settings` to open the LSP preferences editor
* Add the following LSP client definition to your settings:
```json
"rust-analyzer": {
"command": ["ra_lsp_server"],
"languageId": "rust",
"scopes": ["source.rust"],
"syntaxes": [
"Packages/Rust/Rust.sublime-syntax",
"Packages/Rust Enhanced/RustEnhanced.sublime-syntax"
],
"initializationOptions": {
"featureFlags": {
}
},
}
```
* You can now invoke the command palette and type LSP enable to locally/globally enable the rust-analyzer LSP (type LSP enable, then choose either locally or globally, then select rust-analyzer)
<!-- Update links to this header when changing it! -->
### Setting up the `PATH` variable
On Unix systems, `rustup` adds `~/.cargo/bin` to `PATH` by modifying the shell's
startup file. Depending on your configuration, your Desktop Environment might not
actually load it. If you find that `rust-analyzer` only runs when starting the
editor from the terminal, you will have to set up your `PATH` variable manually.
There are a couple of ways to do that:
- for Code, set `rust-analyzer.raLspServerPath` to `~/.cargo/bin` (the `~` is
automatically resolved by the extension)
- copy the binary to a location that is already in `PATH`, e.g. `/usr/local/bin`
- on Linux, use PAM to configure the `PATH` variable, by e.g. putting
`PATH DEFAULT=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:@{HOME}/.cargo/bin:@{HOME}/.local/bin`
in your `~/.pam_environment` file; note that this might interfere with other
defaults set by the system administrator via `/etc/environment`.

152
docs/user/readme.adoc Normal file
View File

@ -0,0 +1,152 @@
= User Manual
:toc: preamble
:sectanchors:
:page-layout: post
// Master copy of this document lives in the https://github.com/rust-analyzer/rust-analyzer repository
At it's core, rust-analyzer is a *library* for semantic analysis of the Rust code as it changes over time.
This manual focuses on a specific usage of the library -- the implementation of
https://microsoft.github.io/language-server-protocol/[Language Server Protocol].
LSP allows various code editors, like VS Code, Emacs or Vim, to implement semantic feature like completion or goto definition by talking to an external language server process.
== Installation
In theory, one should be able to just install the server binary and have it automatically work with any editor.
We are not there yet, so some editor specific setup is required.
=== VS Code
This the best supported editor at the moment.
rust-analyzer plugin for VS Code is maintained
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].
By default, the plugin will download the latest version of the server as well.
image::https://user-images.githubusercontent.com/36276403/74103174-a40df100-4b52-11ea-81f4-372c70797924.png[]
The server binary is stored in `~/.config/Code/User/globalStorage/matklad.rust-analyzer`.
Note that we only support the latest version of VS Code.
==== Updates
The extension will be updated automatically as new versions become available.
The server update functionality is in progress.
For the time being, the workaround is to remove the binary from `globalStorage` and to restart the extension.
==== Building From Source
Alternatively, both the server and the plugin can be installed from source:
[source]
----
$ git clone https://github.com/rust-analyzer/rust-analyzer.git && cs rust-analyzer
$ cargo xtask install
----
You'll need Cargo, nodejs and npm for this.
To make VS Code use the freshly build server, add this to the settings:
[source,json]
----
{ "rust-analyzer.raLspServerPath": "ra_lsp_server" }
----
Note that installing via `xtask install` does not work for VS Code Remote, instead you'll need to install the `.vsix` manually.
=== Language Server Binary
Other editors generally require `ra_lsp_server` binary to be in `$PATH`.
You can download pre-build binary from
https://github.com/rust-analyzer/rust-analyzer/releases[relases]
page, or you can install it from source using the following command:
[source,bash]
----
$ cargo xtask install --server
----
=== Emacs
Emacs support is maintained https://github.com/emacs-lsp/lsp-mode/blob/master/lsp-rust.el[upstream].
1. Install recent version of `emacs-lsp` package by following the instructions https://github.com/emacs-lsp/lsp-mode[here].
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
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]
(nodejs required)
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:
* same configurations as VSCode extension, `rust-analyzer.raLspServerPath`, `rust-analyzer.enableCargoWatchOnStartup` etc.
* same commands too, `rust-analyzer.analyzerStatus`, `rust-analyzer.startCargoWatch` etc.
* highlighting and inlay_hints are not implemented yet
==== 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
2. Configure by adding this to your vim/neovim config file (replacing the existing rust specific line if it exists):
+
[source,vim]
----
let g:LanguageClient_serverCommands = {
\ 'rust': ['ra_lsp_server'],
\ }
----
==== nvim-lsp
NeoVim 0.5 (not yet released) has built in language server support.
For a quick start configuration of rust-analyzer, use https://github.com/neovim/nvim-lsp#rust_analyzer[neovim/nvim-lsp].
Once `neovim/nvim-lsp` is installed, use `lua require'nvim_lsp'.rust_analyzer.setup({})` in your `init.vim`.
=== Sublime Text 3
Prerequisites:
`LSP` package.
Installation:
1. Invoke the command palette with <kbd>Ctrl+Shift+P</kbd>
2. Type `LSP Settings` to open the LSP preferences editor
3. Add the following LSP client definition to your settings:
+
[source,json]
----
"rust-analyzer": {
"command": ["ra_lsp_server"],
"languageId": "rust",
"scopes": ["source.rust"],
"syntaxes": [
"Packages/Rust/Rust.sublime-syntax",
"Packages/Rust Enhanced/RustEnhanced.sublime-syntax"
],
"initializationOptions": {
"featureFlags": {
}
},
}
----
4. You can now invoke the command palette and type LSP enable to locally/globally enable the rust-analyzer LSP (type LSP enable, then choose either locally or globally, then select rust-analyzer)
== Usage
See https://github.com/rust-analyzer/rust-analyzer/blob/master/docs/user/features.md[features.md].

View File

@ -9,7 +9,7 @@
use anyhow::Context; use anyhow::Context;
use std::{ use std::{
env, fs, env,
io::Write, io::Write,
path::{Path, PathBuf}, path::{Path, PathBuf},
process::{Command, Stdio}, process::{Command, Stdio},
@ -17,7 +17,7 @@
use crate::{ use crate::{
codegen::Mode, codegen::Mode,
not_bash::{pushd, run}, not_bash::{fs2, pushd, rm_rf, run},
}; };
pub use anyhow::Result; pub use anyhow::Result;
@ -139,7 +139,7 @@ pub fn run_pre_cache() -> Result<()> {
} }
} }
fs::remove_file("./target/.rustc_info.json")?; fs2::remove_file("./target/.rustc_info.json")?;
let to_delete = ["ra_", "heavy_test"]; let to_delete = ["ra_", "heavy_test"];
for &dir in ["./target/debug/deps", "target/debug/.fingerprint"].iter() { for &dir in ["./target/debug/deps", "target/debug/.fingerprint"].iter() {
for entry in Path::new(dir).read_dir()? { for entry in Path::new(dir).read_dir()? {
@ -153,22 +153,20 @@ pub fn run_pre_cache() -> Result<()> {
Ok(()) Ok(())
} }
fn rm_rf(path: &Path) -> Result<()> { pub fn run_release(dry_run: bool) -> Result<()> {
if path.is_file() { fs::remove_file(path) } else { fs::remove_dir_all(path) } if !dry_run {
.with_context(|| format!("failed to remove {:?}", path)) run!("git switch release")?;
} run!("git fetch upstream")?;
run!("git reset --hard upstream/master")?;
run!("git push")?;
}
pub fn run_release() -> Result<()> { let website_root = project_root().join("../rust-analyzer.github.io");
run!("git switch release")?; let changelog_dir = website_root.join("./thisweek/_posts");
run!("git fetch upstream")?;
run!("git reset --hard upstream/master")?;
run!("git push")?;
let changelog_dir = project_root().join("../rust-analyzer.github.io/thisweek/_posts");
let today = run!("date --iso")?; let today = run!("date --iso")?;
let commit = run!("git rev-parse HEAD")?; let commit = run!("git rev-parse HEAD")?;
let changelog_n = fs::read_dir(changelog_dir.as_path())?.count(); let changelog_n = fs2::read_dir(changelog_dir.as_path())?.count();
let contents = format!( let contents = format!(
"\ "\
@ -191,7 +189,9 @@ pub fn run_release() -> Result<()> {
); );
let path = changelog_dir.join(format!("{}-changelog-{}.adoc", today, changelog_n)); let path = changelog_dir.join(format!("{}-changelog-{}.adoc", today, changelog_n));
fs::write(&path, &contents)?; fs2::write(&path, &contents)?;
fs2::copy(project_root().join("./docs/user/readme.adoc"), website_root.join("manual.adoc"))?;
Ok(()) Ok(())
} }

View File

@ -93,8 +93,9 @@ fn main() -> Result<()> {
run_pre_cache() run_pre_cache()
} }
"release" => { "release" => {
let dry_run = args.contains("--dry-run");
args.finish()?; args.finish()?;
run_release() run_release(dry_run)
} }
_ => { _ => {
eprintln!( eprintln!(

View File

@ -4,12 +4,45 @@
env, env,
ffi::OsStr, ffi::OsStr,
fs, fs,
path::PathBuf, path::{Path, PathBuf},
process::{Command, Stdio}, process::{Command, Stdio},
}; };
use anyhow::{bail, Context, Result}; use anyhow::{bail, Context, Result};
pub mod fs2 {
use std::{fs, path::Path};
use anyhow::{Context, Result};
pub fn read_dir<P: AsRef<Path>>(path: P) -> Result<fs::ReadDir> {
let path = path.as_ref();
fs::read_dir(path).with_context(|| format!("Failed to read {}", path.display()))
}
pub fn write<P: AsRef<Path>, C: AsRef<[u8]>>(path: P, contents: C) -> Result<()> {
let path = path.as_ref();
fs::write(path, contents).with_context(|| format!("Failed to write {}", path.display()))
}
pub fn copy<P: AsRef<Path>, Q: AsRef<Path>>(from: P, to: Q) -> Result<u64> {
let from = from.as_ref();
let to = to.as_ref();
fs::copy(from, to)
.with_context(|| format!("Failed to copy {} to {}", from.display(), to.display()))
}
pub fn remove_file<P: AsRef<Path>>(path: P) -> Result<()> {
let path = path.as_ref();
fs::remove_file(path).with_context(|| format!("Failed to remove file {}", path.display()))
}
pub fn remove_dir_all<P: AsRef<Path>>(path: P) -> Result<()> {
let path = path.as_ref();
fs::remove_dir_all(path).with_context(|| format!("Failed to remove dir {}", path.display()))
}
}
macro_rules! _run { macro_rules! _run {
($($expr:expr),*) => { ($($expr:expr),*) => {
run!($($expr),*; echo = true) run!($($expr),*; echo = true)
@ -41,6 +74,15 @@ pub fn rm(glob: &str) -> Result<()> {
Ok(()) Ok(())
} }
pub fn rm_rf(path: impl AsRef<Path>) -> Result<()> {
let path = path.as_ref();
if path.is_file() {
fs2::remove_file(path)
} else {
fs2::remove_dir_all(path)
}
}
pub fn ls(glob: &str) -> Result<Vec<PathBuf>> { pub fn ls(glob: &str) -> Result<Vec<PathBuf>> {
let cwd = Env::with(|env| env.cwd()); let cwd = Env::with(|env| env.cwd());
let mut res = Vec::new(); let mut res = Vec::new();
@ -90,7 +132,7 @@ fn run_process_inner(cmd: &str, echo: bool) -> Result<String> {
bail!("{}", output.status) bail!("{}", output.status)
} }
Ok(stdout) Ok(stdout.trim().to_string())
} }
// FIXME: some real shell lexing here // FIXME: some real shell lexing here