Rust 编辑器配置

在 Fuchsia 上做 Rust 开发并没有特定的编辑器,vimVS Code 是最主流的选择。然而,任何编辑器的设置文档在这里都是受欢迎的。

rust-analyzer 设置 {#rust-analyzer}

rust-analyzer 是一个为 Rust 实现的语言服务器协议 (LSP)。这是推荐的工作流,仅需最小的编辑设置就可以工作。

rust-analyzerout/ 目录下使用了一个叫做 rust-project.json 的文件,这个文件在 gn gen 时基于构建图生成。指向 rust-project.json 的符号链接位于 Fuchsia 树的根目录下。

rust-project.json 文件格式目前尚未稳定。由此有时会导致一个版本差异的意外发生,在 GN 产生的 rust-project.json 并非 rust-analyzer 所期望的文件时,会导致 rust-analyzer 工作异常。

当前支持的版本

{#supported-rust-analyzer-version}

当前,请使用 最新版本rust-analyzer

Visual Studio Code {#visual-studio-code}

要在 VSCode 中使用 rust-analyzer,请使用最新稳定版本的 VSCode,因为 rust-analyzer 频繁依赖于新近的语言服务器功能。 VSCode 可以从 VSCode 官方网站上下载。 推荐的用法:

  • 保持开启自动升级功能(不适用于 Linux 平台,请查看升级介绍)。
  • 如果你的编码工作涉密,要提前注意禁止遥测报告

rust-analyzer VSCode 扩展(支持工作流)

注意:这是 rust-analyzer 扩展,而不是 VSCode 可能推荐的针对 Rust 文件的 rust 扩展。

你可以从 VSCode 市场直接安装rust-analyzer 扩展。一旦你安装了 rust-analyzer 扩展,把下边的配置添加到你工作空间的 settings.json 文件中:

注意:要访问 VS Code 的工作空间设置,点击 查看(View) 菜单,然后选择 命令面板(Command Palette),再选择 首选项:打开工作区设置(Preferences: Open Workspace Settings (JSON))

  1. {
  2. // 禁止在保存时执行 cargo check
  3. "rust-analyzer.checkOnSave.enable": false,
  4. "rust-analyzer.checkOnSave.allTargets": false,
  5. }

此外,下边的设置可能提供一个更平顺的体验:

  1. {
  2. // 可选的: 只为方法显示摘要文档 (保持工具提示小形化)
  3. "rust-analyzer.callInfo.full": false,
  4. // 可选的: 不自动激活参数提示
  5. "editor.parameterHints.enabled": false,
  6. }

rust-analyzer 扩展中使能 rustfmt

rust-analyzer 扩展依赖于 rustup 工具以选择正确的工具链来调用 rustfmt,所以你需要告诉 rustup 你检出的 Fuchsia 和它的工具链:

  1. $ rustup toolchain link fuchsia-tools $FUCHSIA_DIR/prebuilt/third_party/rust_tools/<host os>

例如,在 linux 系统上,你会用到 linux-x64,或者在 MacOS 系统上你会用到 mac-x64 (在你的 Fuchsia 目录中只会有一个选择,请在你的开发主机系统中正确设置):

  1. $ rustup toolchain link fuchsia-tools $FUCHSIA_DIR/prebuilt/third_party/rust_tools/linux-x64/

完成了上边的步骤,rust-analyzer 扩展将可以配置使用这个工具链和 Fuchsia 的 rustfmt.toml。就像上边提到的一样打开工作区设置,添加以下内容:

  1. {
  2. // 使用 fuchsia-tools 工具链和 fuchsia 的 rustfmt 规则
  3. "rust-analyzer.rustfmt.extraArgs": [
  4. "+fuchsia-tools",
  5. "--config-path=<path to $FUCHSIA_DIR>/rustfmt.toml"
  6. ],
  7. }

一个关于 rust-analyzer 和 Fuchsia 目录符号链接的注意事项

如果你的 Fuchsia 工作区是由别处通过符号链接而来(比如其它挂载点),rust-analyzer 扩展可能无法正确定位在VSCode中已打开的文件以进行分析。

rust-analyzer,以及 rust-project.json 文件,包含了你的源码文件的 绝对 路径。 因此,如果你是通过符号链接定位来打开 Fuchsia 目录,将与那些绝对路径不符,VSCode 的 rust-analyzer 扩展将不能让已在 VSCode 中打开的文件与 rust-analyzer LSP 正在解析和分析中的文件进行对齐。

相反的,在 VSCode 中打开实际路径的 Fuchsia 源码,这样 LSP 和编辑器就能看到相同路径的所有源文件。

rust-analyzer 问题排故

如果你注意到 rust-analyzer 不能正确的工作,原因可能是 rust-project.json 发生了变化。对于这个问题,可以首先尝试的是 jiri update,rebase,然后重新运行 fx-gen,再看看问题是否已消失:

  1. $ jiri update
  2. $ git rebase
  3. $ fx gen

降级 {#downgrading-rust-analyzer}

如果不行,你可能需要手动降级 rust-analyzer当前支持的版本,如果它不是最新的,或者是降级到你之前使用的,被列为“最新”的当前支持版本的前一个版本。

Vim

基础的支持,在 rust-lang/rust.vim 上有介绍。

IDE 支持,请查看 rust-analyzer 手册 中的 vim 段落。

如果你使用标签栏,请查看这个帖子中关于更好的使用Rust的介绍。

emacs

完整介绍

查看 rust-analyzer 手册 获取相关介绍。

存档检查

当你保存你的 Rust 文件时,你将使用 flycheck 来编译它们。flycheck 将解析编译输出并把错误高亮显示。你也可以使用 flycheck-rust,这样就可以用 cargo 编译取代 rustc。两者都可从 melpa 上获取。

要注意这个工作流是基于 cargo,比基于 rust-analyzer 的工作流更容易损坏。

如果你还没有 melpa ,按照 这里 的说明。

M-x 包列表 里安装 flycheckflycheck-rust 。输入 i 来顺序安装缺失的包,然后输入 x 来执行。

下一步,确保 flycheck-rust 在启动的时候就运行。把下边的内容添加到你的 .emacs 文件中:

  1. (with-eval-after-load 'rust-mode
  2. (add-hook 'flycheck-mode-hook #'flycheck-rust-setup))

你将想要 cargo 来运行 “check” 而不是 “test”,所以要把 flycheck-rust-check-tests 设置到 nil。你可以输入 C-h v flycheck-rust-check-tests<RET> 来达到这个目的,并且可以以常规方式自定义变量。 至此,你将需要确保你使用的默认的 cargorustc 都是 Fuchsia 上的版本。在你的 fuchsia 根目录下启动命令行,输入:

  1. rustup toolchain link fuchsia $PWD/prebuilt/third_party/rust/linux-x64 && rustup default fuchsia

最后,跟从本文开始提到的步骤为你的 GN 目标生成一个 Cargo.toml

你可以 参阅 调整 flycheck 以你喜欢的方式来显示你的错误。输入 C-h v flycheck-highlighting-mode<RET> 并定制它。当然也可以定制 C-h v flycheck-indiation-mode<RET>

现在可以重启 emacs 并试试看。

测试和调试

要测试它正常工作,你可以运行 M-x flycheck-compile 然后查看命令行可以看到 flycheck 正在检查语法。它起来应该像是那些依赖于你是否处于 lib 或 bin 目录中:

  1. cargo check --lib --message-format\=json
  2. cargo check --bin recovery_netstack --message-format\=json

如果它运行的是 rustc 而不是 cargo ,那是因为你没有设置 fx gen-cargo

要注意的是它可以在当前文件的第一行报错。那些实际上的错误来自不同的文件。这些错误的注释里会提到这些有问题的文件。

Sublime Text {#sublime-text}

使用 Rust-Enhanced 进行语法检查

依照上边的步骤来 生成一个 Cargo.toml 文件,还有就是 生成一个 cargo/config 文件的步骤,将会设置 cargo 使用 Fuchsia Rust 工具链。

然后,安装 Rust Enhanced 插件。 现在,你的 Sublime Text 应该可以在保存时进行语法检查了并且可以从上下文菜单 / 命令面板 (context menu / command palette) 运行 cargo check 。感谢 fargo ,一些测试看起来运行正常,但是没有进行过彻底的测试。

为 智能感知 / 悬浮工具提示 / 转到定义 使用语言服务器

设置

首先,为 Sublime 安装 LSP 包。然后,按照 rust-analyzer 设置说明 设置 Sublime 。

使用

为了让语言服务器工作,你需要打开包含 Cargo.toml 文件的目录来作为你的 Sublime 工程的根目录。有两种方式:

  1. 为包含 Cargo.toml 文件的目录(比如 garnet/foo/path/to/target)打开一个新的 Sublime 窗口
  2. 或者,从顶部的菜单栏 -> 工程(Project) -> 添加文件夹到工程(Add Folder to Project)。这样你的所有文件都会在一个 Sublime 窗口里,即使你打开的是更宽泛的 fuchsia 文件夹。

这些设置完成之后你可能需要重启 Sumblime 。

Intellij (自定义代码补全)

查看 Intellij Rust 网站 上的介绍。 最后,按照 这些步骤 生成一个用于 Intellij 的 Cargo.toml 文件。 要注意的是基于 cargo 的工作流比基于 rust-analyzer 的工作流更容易损坏。