Project Icon

rustaceanvim

全面增强Neovim的Rust开发环境

rustaceanvim是一个为Neovim设计的Rust开发环境增强插件。它基于rust-tools.nvim进行了大量优化,支持快速配置。该插件集成了调试、运行、测试、宏展开等Rust专属功能,并与rust-analyzer深度整合,显著提升Neovim的Rust开发体验。rustaceanvim还提供分组代码操作、悬停动作等高级特性,为Neovim用户打造全面的Rust开发环境。


rustaceanvim


浏览文档 »

报告错误 · 请求新功能 · 提问

Neovim中提升你的Rust开发体验!
rust-tools.nvim的高度修改版

🦀

Neovim Lua Rust Nix

GPL2 License Issues Build Status LuaRocks

[!注意]

  • 开箱即用。无需调用setup!
  • 不依赖lspconfig
  • 设计上采用延迟初始化。

:link: 快速链接

:grey_question: 我需要rustaceanvim吗

如果你刚开始学习Rust,Neovim的内置LSP客户端API (参见:h lsp)或 nvim-lspconfig.rust_analyzer 可能就足够了。 它提供了最基本的LSP支持。 这个插件是为那些想要额外的非标准功能 特定于rust-analyzer的用户设计的。

:pencil: 前提条件

必需

可选

:inbox_tray: 安装

rocks.nvim

:Rocks install rustaceanvim

lazy.nvim

{
  'mrcjkb/rustaceanvim',
  version = '^5', -- 推荐
  lazy = false, -- 此插件已经是惰性加载的
}

[!提示]

建议固定到标记的发布版本,以避免破坏性变更。

要手动生成文档,使用:helptags ALL

Nix

对于启用了flakes的Nix用户,本项目以包和overlay的形式提供输出。 它也可在nixpkgs中获得。

查看下面的配置信息以开始使用。

:zap: 快速设置

这个插件自动配置rust-analyzer内置LSP客户端,并与其他Rust工具集成。 更多信息请参见使用 / 功能部分。

[!警告]

不要调用nvim-lspconfig.rust_analyzer 的setup或手动设置rust-analyzer的LSP客户端, 因为这样做可能会导致冲突。

这是一个开箱即用的文件类型插件, 所以不需要调用setup函数或配置任何东西就能让这个插件工作。

你很可能想要添加一些键映射。 大多数键映射只在rust文件中有用, 所以我建议你在~/.config/nvim/after/ftplugin/rust.lua1中定义它们

示例:

local bufnr = vim.api.nvim_get_current_buf()
vim.keymap.set(
  "n", 
  "<leader>a", 
  function()
    vim.cmd.RustLsp('codeAction') -- 支持rust-analyzer的分组
    -- 或者如果你不想要分组,可以使用vim.lsp.buf.codeAction()
  end,
  { silent = true, buffer = bufnr }
)

[!TIP]

  • 关于更多与LSP相关的键映射,请参阅nvim-lspconfig的建议
  • 如果你想与nvim-lspconfig共享键映射, 你也可以使用vim.g.rustaceanvim.server.on_attach函数, 或者使用LspAttach自动命令。
  • 查看高级配置部分 或:h rustaceanvim.config以获取更多配置选项。

[!IMPORTANT]

  • 不要after/ftplugin/rust.lua中设置vim.g.rustaceanvim, 因为该文件会在插件初始化后才被加载。

:books: 使用方法 / 功能

调试
  • debuggables打开一个提示框,让你选择可用的目标。

  • debug在当前光标位置搜索目标。

:RustLsp[!] debuggables {args[]}?
:RustLsp[!] debug {args[]}?
vim.cmd.RustLsp('debug')
vim.cmd.RustLsp('debuggables')
-- 或者,运行上一个可调试项:
vim.cmd.RustLsp { 'debuggables', bang = true }
-- 或者,覆盖可执行文件的参数:
vim.cmd.RustLsp {'debuggables', 'arg1', 'arg2' }

使用感叹号!调用命令将重新运行最后一个可调试项。

需要:

默认情况下,当LSP客户端连接时,此插件会静默尝试自动加载nvim-dap 配置。加载后,你可以使用require('dap').continue():DapContinue调用它们。 可以通过设置vim.g.rustaceanvim.dap.autoload_configurations = false来禁用此功能。

  • :RustLsp debuggables只会加载由rust-analyzer创建的调试配置。
  • require('dap').continue()将加载所有Rust调试配置, 包括在.vscode/launch.json中指定的配置 (参见:h dap-launch.json)。
  • 请注意,rustaceanvim可能只能在rust-analyzer完成初始化后 加载DAP配置(在大型项目中可能在客户端连接后)。这意味着 DAP配置可能不会在启动时立即加载。

可运行项
  • runnables打开一个提示框,让你选择可用的目标。
  • run在当前光标位置搜索目标。
:RustLsp[!] runnables {args[]}?
:RustLsp[!] run {args[]}?
vim.cmd.RustLsp('run') 
vim.cmd.RustLsp('runnables')
-- 或者,运行上一个可运行项:
vim.cmd.RustLsp { 'runnables', bang = true }
-- 或者,覆盖可执行文件的参数:
vim.cmd.RustLsp {'runnables', 'arg1', 'arg2' }

使用感叹号!调用命令将重新运行最后一个可运行项。

可测试项和失败测试诊断

如果你使用的是Neovim >= 0.10,你可以将vim.g.rustaceanvim.tools.test_executor 选项设置为'background',这样插件将在后台运行测试, 解析结果,并尽可能将失败的测试显示为诊断信息。

在Neovim 0.9中也可以实现这一点,但测试不会在后台运行, 而是会阻塞UI。

:RustLsp[!] testables {args[]}?
vim.cmd.RustLsp('testables')
-- 或者,运行上一个可测试项:
vim.cmd.RustLsp { 'testables', bang = true }
-- 或者,覆盖可执行文件的参数:
vim.cmd.RustLsp {'testables', 'arg1', 'arg2' }

使用感叹号!调用命令将重新运行最后一个可测试项。

Neotest集成

此插件提供了一个neotest适配器, 你可以按以下方式将其添加到neotest中:

require('neotest').setup {
    -- ...,
    adapters = {
      -- ...,
      require('rustaceanvim.neotest')
    },
}

注意:如果你使用rustaceanvim的neotest适配器, 请不要添加neotest-rust

以下是rustaceanvim的适配器和neotest-rust的比较:

rustaceanvimneotest-rust
测试发现rust-analyzer (LSP)tree-sitter
命令构建rust-analyzer (LSP)tree-sitter
DAP策略自动DAP检测(重用debuggables);可通过vim.g.rustaceanvim.dap覆盖默认为codelldb;需手动配置
测试运行器cargocargo-nextest(如果检测到)cargo-nextest
如果您将rustaceanvim配置为使用neotest,对于测试类型的"testables"和"runnables",tools.test_executor将默认使用neotest。

递归展开宏
:RustLsp expandMacro
vim.cmd.RustLsp('expandMacro')

重建过程宏
:RustLsp rebuildProcMacros
vim.cmd.RustLsp('rebuildProcMacros')
上下移动项目
:RustLsp moveItem {up|down}
vim.cmd.RustLsp { 'moveItem',  'up' }
vim.cmd.RustLsp { 'moveItem',  'down' }
分组代码操作

有时,rust-analyzer会按类别对代码操作进行分组, 这不被Neovim内置的vim.lsp.buf.codeAction支持。 此插件提供了一个带有UI的命令,可以执行:

:RustLsp codeAction
vim.cmd.RustLsp('codeAction')

如果您将选项vim.g.rustaceanvim.tools.code_actions.ui_select_fallback 设置为true(默认为false),当没有分组代码操作时, 它将回退到使用vim.ui.select

悬停操作

注意:要激活悬停操作,需要运行命令两次。 这会将您移动到窗口中,然后按回车键选择您想要的选项。 或者,您可以在配置中将auto_focus设置为true, 这样您将自动进入悬停操作窗口。

:RustLsp hover actions
vim.cmd.RustLsp { 'hover', 'actions' }

默认情况下,此插件用悬停操作替换了Neovim的内置悬停处理程序, 因此您也可以使用vim.lsp.buf.hover()

范围悬停
:RustLsp hover range
vim.cmd.RustLsp { 'hover', 'range' }
解释错误

在错误诊断上显示一个悬停窗口,其中包含来自rust错误代码索引 的解释(如果诊断有错误代码)。

:RustLsp explainError {cycle?|current?}
vim.cmd.RustLsp('explainError') -- 默认为'cycle'
vim.cmd.RustLsp({ 'explainError', 'cycle' })
vim.cmd.RustLsp({ 'explainError', 'current' })
  • 如果使用cycle或无参数调用: 类似于vim.diagnostic.goto_nextexplainError将从光标位置开始循环诊断, 直到找到带有错误代码的诊断。

  • 如果使用current调用: 仅在当前光标行搜索诊断。

渲染诊断

显示一个悬停窗口,其中包含渲染的诊断,如cargo build期间显示的那样。 对于解决借用和泛型相关的bug很有用, 因为它将重要部分(有时跨文件)整合在一起。

:RustLsp renderDiagnostic {cycle?|current?}
vim.cmd.RustLsp('renderDiagnostic') -- 默认为'cycle'
vim.cmd.RustLsp({ 'renderDiagnostic', 'cycle' })
vim.cmd.RustLsp({ 'renderDiagnostic', 'current' })
  • 如果使用cycle或无参数调用: 类似于vim.diagnostic.goto_nextrenderDiagnostic将从光标位置开始循环诊断, 直到找到带有渲染数据的诊断。

  • 如果使用current调用: 仅在当前光标行搜索诊断。

打开Cargo.toml
:RustLsp openCargo
vim.cmd.RustLsp('openCargo')
打开docs.rs文档

打开光标下符号的docs.rs文档。

:RustLsp openDocs
vim.cmd.RustLsp('openDocs')
父模块
:RustLsp parentModule
vim.cmd.RustLsp('parentModule')
过滤工作区符号搜索

rust-analyzer支持过滤工作区符号搜索。

:RustLsp[!] workspaceSymbol {onlyTypes?|allSymbols?} {query?}
vim.cmd.RustLsp('workspaceSymbol')
-- 或
vim.cmd.RustLsp { 
  'workspaceSymbol', 
  '<onlyTypes|allSymbols>' --[[ 可选 ]], 
  '<query>' --[[ 可选 ]], 
  bang = true --[[ 可选 ]]
}
  • 使用感叹号 ! 调用命令将在搜索中包含依赖项。
  • 您还可以通过设置 rust-analyzer 的 workspace.symbol.search 服务器选项来影响 vim.lsp.buf.workspace_symbol() 的行为。
合并行

将选定的行智能地合并成一行,自动修复空白、尾随逗号和括号。 在普通模式下适用于单行,在可视模式下适用于多行。

:RustLsp joinLines
vim.cmd.RustLsp('joinLines')

结构化搜索替换
  • 在普通模式下搜索整个缓冲区。
  • 在可视模式下搜索选定区域。
:RustLsp ssr {query}
vim.cmd.RustLsp { 'ssr', '<query>' --[[ 可选 ]] }

tty

查看 crate 图
:RustLsp crateGraph {backend {output}}
vim.cmd.RustLsp { 'crateGraph', '[backend]', '[output]' }

需要:

查看语法树
:RustLsp syntaxTree
vim.cmd.RustLsp('syntaxTree')

飞行检查

在后台线程中运行 cargo check 或其他兼容命令(如 clippy), 并根据命令输出提供 LSP 诊断信息。

在大型项目中很有用,因为每次保存时运行 cargo check 可能会很耗时。

:RustLsp flyCheck {run?|clear?|cancel?}
vim.cmd.RustLsp('flyCheck') -- 默认为 'run'
vim.cmd.RustLsp { 'flyCheck', 'run' }
vim.cmd.RustLsp { 'flyCheck', 'clear' }
vim.cmd.RustLsp { 'flyCheck', 'cancel' }

[!注意]

这只有在设置选项 ['rust-analzyer'].checkOnSave = false 时才有用。

查看 HIR / MIR

打开一个缓冲区,显示光标所在函数的 HIR 或 MIR 的文本表示。 对调试或处理 rust-analyzer 本身很有用。

:RustLsp view {hir|mir}
vim.cmd.RustLsp { 'view', 'hir' }
vim.cmd.RustLsp { 'view', 'mir' }
Rustc 未美化

打开一个缓冲区,显示光标附近函数的 MIR 或其他内容的文本表示。 实现类似 Rust Playground 的体验。

注意:目前需要 Rust 的 tree-sitter 解析器和 nightly 编译器工具链。

:Rustc unpretty {hir|mir|...}
vim.cmd.Rustc { 'unpretty', 'hir' }
vim.cmd.Rustc { 'unpretty', 'mir' }
-- ...

需要:

  • Rust 的 tree-sitter 解析器(:Rustc unpretty 命令需要)。 可以使用 nvim-treesitter 安装。

:gear: 高级配置

要修改默认配置,设置 vim.g.rustaceanvim

您只需指定想要更改的键, 因为未提供的键会应用默认值。

配置示例:

vim.g.rustaceanvim = {
  -- 插件配置
  tools = {
  },
  -- LSP 配置
  server = {
    on_attach = function(client, bufnr)
      -- 您也可以在这里放置键映射
    end,
    default_settings = {
      -- rust-analyzer 语言服务器配置
      ['rust-analyzer'] = {
      },
    },
  },
  -- DAP 配置
  dap = {
  },
}

[!提示]

vim.g.rustaceanvim 也可以是返回表的函数。

使用 codelldb 进行调试

对于 Rust,CodeLLDB VSCode 扩展中的 codelldb 提供了比 lldb 更好的体验。 如果您使用的发行版允许安装 codelldb 可执行文件, 这个插件会自动检测并配置自己使用它作为调试适配器。

一些例子:

  1. 安装 CodeLLDB VSCode 扩展
  2. 找出它的安装位置。在 Linux 上,通常在 $HOME/.vscode/extensions/ 目录下。
  3. 更新你的配置:
vim.g.rustaceanvim = function()
  -- 更新此路径
  local extension_path = vim.env.HOME .. '/.vscode/extensions/vadimcn.vscode-lldb-1.10.0/'
  local codelldb_path = extension_path .. 'adapter/codelldb'
  local liblldb_path = extension_path .. 'lldb/lib/liblldb'
  local this_os = vim.uv.os_uname().sysname;

  -- Windows 上的路径不同
  if this_os:find "Windows" then
    codelldb_path = extension_path .. "adapter\\codelldb.exe"
    liblldb_path = extension_path .. "lldb\\bin\\liblldb.dll"
  else
    -- Linux 上 liblldb 扩展名为 .so,MacOS 上为 .dylib
    liblldb_path = liblldb_path .. (this_os == "Linux" and ".so" or ".dylib")
  end

  local cfg = require('rustaceanvim.config')
  return {
    dap = {
      adapter = cfg.get_codelldb_adapter(codelldb_path, liblldb_path),
    },
  }
end

如何为每个项目动态加载不同的 rust-analyzer 设置

默认情况下,这个插件会在项目根目录中查找 rust-analyzer.json2 文件,并尝试加载它。如果文件不存在或无法解码,将使用 server.default_settings

你可以通过 server.settings 配置来改变这个行为:

vim.g.rustaceanvim = {
  -- ...
  server = {
    ---@param project_root string 项目根目录的路径
    settings = function(project_root)
      local ra = require('rustaceanvim.config.server')
      return ra.load_rust_analyzer_settings(project_root, {
        settings_file_pattern = 'rust-analyzer.json'
      })
    end,
  },
}

:stethoscope: 故障排除

健康检查

运行 :checkhealth rustaceanvim 进行健康检查。

rust-analyzer 日志文件

运行 :RustLsp logFile 打开 rust-analyzer 日志文件。

最小配置

要在临时目录中使用最小配置对此插件进行故障排除,你可以尝试 minimal.lua

nvim -u minimal.lua

[!注意]

如果你使用 Nix,可以运行 nix run "github:mrcjkb/rustaceanvim#nvim-minimal-stable"nix run "github:mrcjkb/rustaceanvim#nvim-minimal-nightly"

如果你无法使用最小配置复现问题,可能是由其他插件或插件管理器的设置引起的。在这种情况下,向 minimal.lua 添加额外的插件和配置,直到你能复现问题。

rust-analyzer 故障排除

对于与 rust-analyzer 相关的问题(如 LSP 功能不工作),另请参阅 rust-analyzer 故障排除指南

:left_speech_bubble: 常见问题

内嵌提示/类型提示在哪里?

由于 Neovim >= 0.10 原生支持内嵌提示,我已从此插件中移除了相关代码。参见 :h lsp-inlay_hint

如何启用自动补全?

#ff097f2091e7a970e5b12960683b4dade5563040 以来,Neovim 基于语言服务器发送的 triggerCharacters 内置了补全功能。Omni 补全也可用于更传统的 vim 式补全体验。

对于更可扩展和复杂的自动补全设置,你需要使用如 nvim-cmp 这样的插件和像 cmp-nvim-lsp 这样的 LSP 补全源。如果你安装了 cmp-nvim-lsp,这个插件将自动注册必要的客户端功能。

我在(自动)补全方面遇到问题

rustaceanvim 不实现(自动)补全。(自动)补全问题要么来自其他插件,要么来自 rust-analyzer。

mason.nvim 和 nvim-lspconfig

有关 mason.nvim 和 nvim-lspconfig 问题的故障排除详情,或配置 rustaceanvim 使用由 mason.nvim 管理的 rust-analyzer 安装,请参见 :h rustaceanvim.mason

:link: 相关项目

灵感来源

rust-tools.nvim 的灵感来自 akinsho/flutter-tools.nvim

Footnotes

  1. 参见:help base-directories

  2. 参见此示例和 rust-analyzer 的配置手册

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号