Rust
Zed 原生支持 Rust。
- Tree-sitter: tree-sitter/tree-sitter-rust
- 语言服务器: rust-lang/rust-analyzer
- 调试适配器: CodeLLDB (主要), GDB (次要, 不适用于 Apple 芯片)
内联提示
以下配置可用于更改 Rust 中 rust-analyzer 的嵌入提示设置
{
"lsp": {
"rust-analyzer": {
"initialization_options": {
"inlayHints": {
"maxLength": null,
"lifetimeElisionHints": {
"enable": "skip_trivial",
"useParameterNames": true
},
"closureReturnTypeHints": {
"enable": "always"
}
}
}
}
}
}
有关更多信息,请参阅 Rust Analyzer 手册中的嵌入提示。
目标目录
rust-analyzer 目标目录可以在 initialization_options 中设置
{
"lsp": {
"rust-analyzer": {
"initialization_options": {
"rust": {
"analyzerTargetDir": true
}
}
}
}
}
设置为 true 将目标目录设置为 target/rust-analyzer。您可以使用字符串(例如 "target/analyzer")而不是 true 来设置自定义目录。
二进制文件
您可以配置 Zed 应该使用哪个 rust-analyzer 二进制文件。
默认情况下,Zed 会尝试在您的 $PATH 中查找 rust-analyzer 并尝试使用它。如果该二进制文件成功执行 rust-analyzer --help,则使用它。否则,Zed 将回退到安装其自己的稳定版 rust-analyzer 并使用它。
如果您想安装预发布版 rust-analyzer,您可以通过在 settings.json 中将 pre_release 设置为 true 来指示 Zed 执行此操作
{
"lsp": {
"rust-analyzer": {
"fetch": {
"pre_release": true
}
}
}
}
如果您想禁用 Zed 查找 rust-analyzer 二进制文件,您可以在 settings.json 中将 ignore_system_version 设置为 true
{
"lsp": {
"rust-analyzer": {
"binary": {
"ignore_system_version": true
}
}
}
}
如果您想使用自定义位置的二进制文件,您可以指定一个 path 和可选的 arguments
{
"lsp": {
"rust-analyzer": {
"binary": {
"path": "/Users/example/bin/rust-analyzer",
"arguments": []
}
}
}
}
此 "path" 必须是绝对路径。
备用目标
如果您希望 rust-analyzer 为您当前平台以外的目标(例如,在 macOS 上运行时为 Windows)提供诊断信息,您可以使用以下 Zed lsp 设置
{
"lsp": {
"rust-analyzer": {
"initialization_options": {
"cargo": {
"target": "x86_64-pc-windows-msvc"
}
}
}
}
}
如果您正在使用 rustup,您可以通过运行以下命令找到可用目标三元组(aarch64-apple-darwin、x86_64-unknown-linux-gnu 等)的列表
rustup target list --installed
LSP 任务
Zed 使用 tree-sitter 提供任务,但 rust-analyzer 有一个 LSP 扩展方法,用于通过 LSP 查询文件相关任务。此功能默认启用,可以配置如下
"lsp": {
"rust-analyzer": {
"enable_lsp_tasks": true,
}
}
手动 Cargo 诊断获取
默认情况下,rust-analyzer 启用 checkOnSave: true,这会导致每次保存缓冲区时触发 cargo check --workspace --all-targets 命令。如果使用 checkOnSave: false 禁用(请参阅上面服务器配置 json 的示例),仍然可以手动获取诊断信息,在 Rust 文件中使用 editor: run/clear/cancel flycheck 命令刷新 cargo 诊断;当设置启用时,项目诊断编辑器也会使用 editor: run flycheck 命令刷新 cargo 诊断。
更多服务器配置
Rust-analyzer 手册描述了 rust-analyzer 语言服务器的各种功能和配置选项。Zed 中的 Rust-analyzer 使用默认参数运行。
大型项目和性能
可能导致大型项目占用大量资源的主要问题之一是以下功能的组合
rust-analyzer.checkOnSave (default: true)
Run the check command for diagnostics on save.
rust-analyzer.check.workspace (default: true)
Whether --workspace should be passed to cargo check. If false, -p <package> will be passed instead.
rust-analyzer.cargo.allTargets (default: true)
Pass --all-targets to cargo invocation
这意味着每次 Zed 保存时,都会运行 cargo check --workspace --all-targets 命令,检查整个项目(工作区)、lib、doc、test、bin、bench 和其他目标。
虽然这在小型项目上运行良好,但扩展性不佳。
替代方法是使用任务,因为 Zed 已经提供了一个 cargo check --workspace --all-targets 任务,并且能够通过 cmd/ctrl-click 终端输出导航到错误,并限制或完全关闭保存时检查功能。
保存时检查功能负责根据 cargo check 输出返回部分诊断信息,因此关闭它将限制 rust-analyzer 使用其自己的诊断信息。
有关更细粒度的配置,请参阅手册中更多 rust-analyzer.cargo. 和 rust-analyzer.check. 以及 rust-analyzer.diagnostics. 设置。以下是 Zed settings.json 的一个片段(编辑并保存 lsp.rust-analyzer 部分后,语言服务器将自动重新启动)
{
"lsp": {
"rust-analyzer": {
"initialization_options": {
// get more cargo-less diagnostics from rust-analyzer,
// which might include false-positives (those can be turned off by their names)
"diagnostics": {
"experimental": {
"enable": true
}
},
// To disable the checking entirely
// (ignores all cargo and check settings below)
"checkOnSave": false,
// To check the `lib` target only.
"cargo": {
"allTargets": false
},
// Use `-p` instead of `--workspace` for cargo check
"check": {
"workspace": false
}
}
}
}
}
多项目工作区
如果您希望 rust-analyzer 分析同一文件夹中未在 Cargo 工作区的 [members] 中列出的多个 Rust 项目,您可以在本地项目设置的 linkedProjects 中列出它们
{
"lsp": {
"rust-analyzer": {
"initialization_options": {
"linkedProjects": ["./path/to/a/Cargo.toml", "./path/to/b/Cargo.toml"]
}
}
}
}
代码片段
有一种方法可以从 rust-analyzer 获取自定义完成项,它将根据代码片段主体转换代码
{
"lsp": {
"rust-analyzer": {
"initialization_options": {
"completion": {
"snippets": {
"custom": {
"Arc::new": {
"postfix": "arc",
"body": ["Arc::new(${receiver})"],
"requires": "std::sync::Arc",
"scope": "expr"
},
"Some": {
"postfix": "some",
"body": ["Some(${receiver})"],
"scope": "expr"
},
"Ok": {
"postfix": "ok",
"body": ["Ok(${receiver})"],
"scope": "expr"
},
"Rc::new": {
"postfix": "rc",
"body": ["Rc::new(${receiver})"],
"requires": "std::rc::Rc",
"scope": "expr"
},
"Box::pin": {
"postfix": "boxpin",
"body": ["Box::pin(${receiver})"],
"requires": "std::boxed::Box",
"scope": "expr"
},
"vec!": {
"postfix": "vec",
"body": ["vec![${receiver}]"],
"description": "vec![]",
"scope": "expr"
}
}
}
}
}
}
}
}
调试
Zed 通过 CodeLLDB 和 GDB 开箱即用地支持调试 Rust 二进制文件和测试。运行 debugger: start (f4|f4) 启动这些预配置的调试任务之一。
要获得更多控制,您可以将调试配置添加到 .zed/debug.json。请参阅下面的示例。
构建二进制文件然后调试
[
{
"label": "Build & Debug native binary",
"build": {
"command": "cargo",
"args": ["build"]
},
"program": "$ZED_WORKTREE_ROOT/target/debug/binary",
// sourceLanguages is required for CodeLLDB (not GDB) when using Rust
"sourceLanguages": ["rust"],
"request": "launch",
"adapter": "CodeLLDB"
}
]
根据构建命令自动定位调试目标
当您使用 cargo build 或 cargo test 作为构建命令时,Zed 可以推断输出二进制文件的路径。
[
{
"label": "Build & Debug native binary",
"adapter": "CodeLLDB",
"build": {
"command": "cargo",
"args": ["build"]
},
// sourceLanguages is required for CodeLLDB (not GDB) when using Rust
"sourceLanguages": ["rust"]
}
]