simrat39
rust-tools.nvim
Lua

Tools for better development in rust using neovim's builtin lsp

Last updated Jul 1, 2026
2.1k
Stars
148
Forks
119
Issues
+1
Stars/day
Attention Score
56
Language breakdown
Lua 95.9%
Dart 2.9%
Vim Script 1.2%
โ–ธ Files click to expand
README
[!NOTE]
Due to lack of time, this plugin has been archived. Please switch to mrcjkb/rustaceanvim.

rust-tools.nvim

A plugin to improve your rust experience in neovim.

Quick Links

- CodeLLDB Debugging - Standalone File

Prerequisites

  • neovim 0.7
  • nvim-lspconfig
  • rust-analyzer
  • dot from graphviz (only for crate graph)

Installation

using packer.nvim

use 'neovim/nvim-lspconfig'
use 'simrat39/rust-tools.nvim'

-- Debugging use 'nvim-lua/plenary.nvim' use 'mfussenegger/nvim-dap'

Look at the configuration information below to get started.

Setup

This plugin automatically sets up nvim-lspconfig for rust_analyzer for you, so don't do that manually, as it causes conflicts.

Put this in your init.lua or any lua file that is sourced.

For most people, the defaults are fine, but for advanced configuration, see Configuration.

Example config:

local rt = require("rust-tools")

rt.setup({ server = { onattach = function(, bufnr) -- Hover actions vim.keymap.set("n", "<C-space>", rt.hoveractions.hoveractions, { buffer = bufnr }) -- Code action groups vim.keymap.set("n", "<Leader>a", rt.codeactiongroup.codeactiongroup, { buffer = bufnr }) end, }, })

Usage

Debugging debugging

Inlay Hints inlay hints
-- Commands:   -- RustEnableInlayHints   -- RustDisableInlayHints   -- RustSetInlayHints   -- RustUnsetInlayHints

-- Set inlay hints for the current buffer require('rust-tools').inlay_hints.set() -- Unset inlay hints for the current buffer require('rust-tools').inlay_hints.unset()

-- Enable inlay hints auto update and set them for all the buffers require('rust-tools').inlay_hints.enable() -- Disable inlay hints auto update and unset them for all buffers require('rust-tools').inlay_hints.disable()

Runnables runnables
-- Command:   -- RustRunnables   require('rust-tools').runnables.runnables()

Expand Macros Recursively expand macros
-- Command:   -- RustExpandMacro     require'rust-tools'.expandmacro.expandmacro()

Move Item Up/Down move items
-- Command:   -- RustMoveItemUp       -- RustMoveItemDown       local up = true -- true = move up, false = move down   require'rust-tools'.moveitem.moveitem(up)

Hover Actions hover actions Note: To activate hover actions, run the command twice (or your hover keymap if you have
set to true AND are using
.lsp.buf.hover()
). This will move you into the window, then press enter on the selection you want. Alternatively, you can set
to true in your config and you will automatically enter the hover actions window.
-- Command:  -- RustHoverActions   require'rust-tools'.hoveractions.hoveractions()

Hover Range Note: Requires rust-analyzer version after 2021-08-02. Shows the type in visual mode when hovering.
-- Command:   -- RustHoverRange    require'rust-tools'.hoverrange.hoverrange()

Open Cargo.toml open cargo
-- Command:   -- RustOpenCargo   require'rust-tools'.opencargotoml.opencargotoml()

Parent Module parent module
-- Command:   -- RustParentModule    require'rust-tools'.parentmodule.parentmodule()

Join Lines join lines
-- Command:   -- RustJoinLines     require'rust-tools'.joinlines.joinlines()

Structural Search Replace
-- Command:   -- RustSSR [query]   require'rust-tools'.ssr.ssr(query)

View Crate Graph
-- Command:   -- RustViewCrateGraph [backend [output]]   require'rust-tools'.crategraph.viewcrate_graph(backend, output)

Configuration

The options shown below are the defaults. You only need to pass the keys to the setup function that you want to be changed, because the defaults are applied for keys that are not provided.
local opts = {
  tools = { -- rust-tools options

-- how to execute terminal commands -- options right now: termopen / quickfix / toggleterm / vimux executor = require("rust-tools.executors").termopen,

-- callback to execute once rust-analyzer is done initializing the workspace -- The callback receives one parameter indicating the health of the server: "ok" | "warning" | "error" on_initialized = nil,

-- automatically call RustReloadWorkspace when writing to a Cargo.toml file. reloadworkspacefromcargotoml = true,

-- These apply to the default RustSetInlayHints command inlay_hints = { -- automatically set inlay hints (type hints) -- default: true auto = true,

-- Only show inlay hints for the current line onlycurrentline = false,

-- whether to show parameter hints with the inlay hints or not -- default: true showparameterhints = true,

-- prefix for parameter hints -- default: "<-" parameterhintsprefix = "<- ",

-- prefix for all the other hints (type, chaining) -- default: "=>" otherhintsprefix = "=> ",

-- whether to align to the length of the longest line in the file maxlenalign = false,

-- padding from the left if maxlenalign is true maxlenalign_padding = 1,

-- whether to align to the extreme right or not right_align = false,

-- padding from the right if right_align is true rightalignpadding = 7,

-- The color of the hints highlight = "Comment", },

-- options same as lsp hover / vim.lsp.util.openfloatingpreview() hover_actions = {

-- the border that is used for the hover window -- see vim.api.nvimopenwin() border = { { "โ•ญ", "FloatBorder" }, { "โ”€", "FloatBorder" }, { "โ•ฎ", "FloatBorder" }, { "โ”‚", "FloatBorder" }, { "โ•ฏ", "FloatBorder" }, { "โ”€", "FloatBorder" }, { "โ•ฐ", "FloatBorder" }, { "โ”‚", "FloatBorder" }, },

-- Maximal width of the hover window. Nil means no max. max_width = nil,

-- Maximal height of the hover window. Nil means no max. max_height = nil,

-- whether the hover action window gets automatically focused -- default: false auto_focus = false, },

-- settings for showing the crate graph based on graphviz and the dot -- command crate_graph = { -- Backend used for displaying the graph -- see: https://graphviz.org/docs/outputs/ -- default: x11 backend = "x11", -- where to store the output, nil for no output stored (relative -- path from pwd) -- default: nil output = nil, -- true for all crates.io and external crates, false only the local -- crates -- default: true full = true,

-- List of backends found on: https://graphviz.org/docs/outputs/ -- Is used for input validation and autocompletion -- Last updated: 2021-08-26 enabledgraphvizbackends = { "bmp", "cgimage", "canon", "dot", "gv", "xdot", "xdot1.2", "xdot1.4", "eps", "exr", "fig", "gd", "gd2", "gif", "gtk", "ico", "cmap", "ismap", "imap", "cmapx", "imap_np", "cmapx_np", "jpg", "jpeg", "jpe", "jp2", "json", "json0", "dot_json", "xdot_json", "pdf", "pic", "pct", "pict", "plain", "plain-ext", "png", "pov", "ps", "ps2", "psd", "sgi", "svg", "svgz", "tga", "tiff", "tif", "tk", "vml", "vmlz", "wbmp", "webp", "xlib", "x11", }, }, },

-- all the opts to send to nvim-lspconfig -- these override the defaults set by rust-tools.nvim -- see https://github.com/neovim/nvim-lspconfig/blob/master/doc/serverconfigurations.md#rustanalyzer server = { -- standalone file support -- setting it to false may improve startup time standalone = true, }, -- rust-analyzer options

-- debugging stuff dap = { adapter = { type = "executable", command = "lldb-vscode", name = "rt_lldb", }, }, }

require('rust-tools').setup(opts)

Related Projects

Inspiration

This plugin draws inspiration from akinsho/flutter-tools.nvim
๐Ÿ”— More in this category

ยฉ 2026 GitRepoTrend ยท simrat39/rust-tools.nvim ยท Updated daily from GitHub