Rust 编辑器配置
在 Fuchsia 上做 Rust 开发并没有特定的编辑器,vim
和 VS Code
是最主流的选择。然而,任何编辑器的设置文档在这里都是受欢迎的。
rust-analyzer
设置 {#rust-analyzer}
rust-analyzer 是一个为 Rust 实现的语言服务器协议 (LSP)。这是推荐的工作流,仅需最小的编辑设置就可以工作。
rust-analyzer
在 out/
目录下使用了一个叫做 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 官方网站上下载。
推荐的用法:
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))
。
{
// 禁止在保存时执行 cargo check
"rust-analyzer.checkOnSave.enable": false,
"rust-analyzer.checkOnSave.allTargets": false,
}
此外,下边的设置可能提供一个更平顺的体验:
{
// 可选的: 只为方法显示摘要文档 (保持工具提示小形化)
"rust-analyzer.callInfo.full": false,
// 可选的: 不自动激活参数提示
"editor.parameterHints.enabled": false,
}
在 rust-analyzer
扩展中使能 rustfmt
rust-analyzer
扩展依赖于 rustup
工具以选择正确的工具链来调用 rustfmt,所以你需要告诉 rustup
你检出的 Fuchsia 和它的工具链:
$ rustup toolchain link fuchsia-tools $FUCHSIA_DIR/prebuilt/third_party/rust_tools/<host os>
例如,在 linux 系统上,你会用到 linux-x64
,或者在 MacOS 系统上你会用到 mac-x64
(在你的 Fuchsia 目录中只会有一个选择,请在你的开发主机系统中正确设置):
$ rustup toolchain link fuchsia-tools $FUCHSIA_DIR/prebuilt/third_party/rust_tools/linux-x64/
完成了上边的步骤,rust-analyzer
扩展将可以配置使用这个工具链和 Fuchsia 的 rustfmt.toml
。就像上边提到的一样打开工作区设置,添加以下内容:
{
// 使用 fuchsia-tools 工具链和 fuchsia 的 rustfmt 规则
"rust-analyzer.rustfmt.extraArgs": [
"+fuchsia-tools",
"--config-path=<path to $FUCHSIA_DIR>/rustfmt.toml"
],
}
一个关于 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
,再看看问题是否已消失:
$ jiri update
$ git rebase
$ 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 包列表
里安装 flycheck
和 flycheck-rust
。输入 i
来顺序安装缺失的包,然后输入 x
来执行。
下一步,确保 flycheck-rust 在启动的时候就运行。把下边的内容添加到你的 .emacs
文件中:
(with-eval-after-load 'rust-mode
(add-hook 'flycheck-mode-hook #'flycheck-rust-setup))
你将想要 cargo 来运行 “check” 而不是 “test”,所以要把 flycheck-rust-check-tests
设置到 nil
。你可以输入 C-h v
flycheck-rust-check-tests<RET>
来达到这个目的,并且可以以常规方式自定义变量。
至此,你将需要确保你使用的默认的 cargo
和 rustc
都是 Fuchsia 上的版本。在你的 fuchsia 根目录下启动命令行,输入:
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 目录中:
cargo check --lib --message-format\=json
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 工程的根目录。有两种方式:
- 为包含
Cargo.toml
文件的目录(比如garnet/foo/path/to/target
)打开一个新的 Sublime 窗口 - 或者,从顶部的菜单栏 -> 工程(Project) -> 添加文件夹到工程(Add Folder to Project)。这样你的所有文件都会在一个 Sublime 窗口里,即使你打开的是更宽泛的
fuchsia
文件夹。
这些设置完成之后你可能需要重启 Sumblime 。
Intellij (自定义代码补全)
查看 Intellij Rust 网站 上的介绍。
最后,按照 这些步骤 生成一个用于 Intellij 的 Cargo.toml
文件。
要注意的是基于 cargo 的工作流比基于 rust-analyzer 的工作流更容易损坏。