Rust

Zed 中原生支持 Rust。

内联提示

以下配置可用于为 Rust 启用内联提示

"inlayHints": {
  "maxLength": null,
  "lifetimeElisionHints": {
  "useParameterNames": true,
    "enable": "skip_trivial"
  },
  "closureReturnTypeHints": {
    "enable": "always"
  }
}

以便在 Zed 在设置中启用内联提示时,语言服务器发送回内联提示。

使用

"lsp": {
  "$LANGUAGE_SERVER_NAME": {
    "initialization_options": {
      ....
    }
  }
}

覆盖这些设置。

请参阅 https://rust-analyzer.github.io/manual.html#inlay-hints 了解更多信息。

目标目录

rust-analyzer 目标目录可以在 initialization_options 中设置

{
  "lsp": {
    "rust-analyzer": {
      "initialization_options": {
        "rust": {
          "analyzerTargetDir": true
        }
      }
    }
  }
}

true 设置将目标目录设置为 target/rust-analyzer。你可以使用字符串(如 "target/analyzer")而不是 true 设置自定义目录。

更多服务器配置

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 键单击以导航到错误的功能,并限制或完全关闭保存时检查功能。

保存时检查功能负责根据 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 获取自定义完成项,它将根据代码段主体转换代码

"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"
                        }
                    }
                }
            }
        }
    }
}