I write Rust in RustRover at work, and I still use JetBrains tools every day. They are the reason I wanted a certain kind of editing experience in my own terminal: errors on screen while I type, a debugger that shows real values, a test tree, an undo history that survives my own mistakes.
So I built xynovim, a Neovim config for Rust on top of LazyVim. It is a personal, independent project, not affiliated with JetBrains, and this post is the short tour.

The real config on a small demo crate. Everything in this post was recorded from it, nothing is mocked up.
Two tiers of diagnostics
rust-analyzer answers while you type, with type errors in about 0.01 to 0.15 seconds. Clippy follows about half a second later (0.56 s median): bacon-ls runs it against a hardlinked shadow of your workspace on every buffer change, so lints show up before you save.

Each message shows its first line inline. The full text, with the suggestion, is one keypress away.
A debugger with real values
nvim-dap with codelldb, a layout that suits Rust, and lldb's Rust formatters loaded automatically, so a String or a Vec shows its contents instead of {...}.

Stopped at a breakpoint: locals, call stack, console and inline values.
One feature set for both tiers
:RustContext lets you pick Cargo features and a build target once, and applies them to both rust-analyzer and bacon-ls, saved per workspace. No more one tool seeing code the other does not.

The inactive side is greyed out and the statusline is back to "clippy ok".
A safety net
Every save is snapshotted as a commit under a private git ref (refs/lochist/). A bad refactor, a bad rename or a bad evening is one picker away from being undone.

Local History, backed by plain git.
Macros and dependencies
Type a path into a crate that is not a dependency yet and xynovim hints at it, offers a code action, searches crates.io, lets you pick features and writes the dependency into Cargo.toml. It also ranks ambiguous imports, remembers your pick, and shows macro expansions.

Macro expansion in a read-only split.
The AI agent, on a leash
I am not a vibe-coder. I want an AI tool inside a setup I understand, so the 99 agent (Claude Code as the provider) runs inside bubblewrap with a restricted filesystem and hidden credentials, and a Local History snapshot is taken before every request. It fails closed: no working sandbox, no request.
It is a seatbelt, not a jail. The network stays open, and no real agent request is driven in the test suite. I would rather tell you that than let you assume otherwise.
Nine standalone plugins
The original parts of the config are now standalone MIT plugins, so you can take only what you want:
-
xyno-history.nvim: Local History on private git refs -
xyno-sandbox.nvim: runs an agent in bubblewrap, refuses without it -
xyno-clipboard.nvim: OSC 52 clipboard provider for tmux and SSH -
xyno-guard.nvim: keeps auto-save off dependency sources and changed files - a Rust toolkit of five that share one base:
xyno-rust.nvim,xyno-new.nvim,xyno-imports.nvim,xyno-crates.nvim,xyno-macros.nvim
All nine install with lazy.nvim and need Neovim 0.12+. The plugins page has a complete spec for the Rust toolkit and the install order.
Tested, and I mean it
"It feels fast" is an opinion, so the config ships with a suite you can run yourself: 906 passing checks across 32 spec files, one per feature area, in about six minutes on my machine. Each spec runs in its own headless Neovim with a hard timeout and an isolated state directory.

The runner on four of the spec files: 129 passed, 0 failed.
What it is not
- It needs Neovim 0.12, and it is developed on Linux (Arch). Windows is exercised in CI, and macOS is not reliably green yet.
- The agent sandbox is a seatbelt, not a jail.
- The macros and dependencies work is tested headless, not driven by hand in a real terminal. The unknown-crate hint is deliberately conservative: a miss is better than a false hint.
The full list, with what I decided and why, is in docs/KNOWN_ISSUES.md.
Try it
git clone https://github.com/xynorash/xynovim ~/.config/nvim
~/.config/nvim/scripts/bootstrap.sh
The bootstrap script checks the prerequisites and installs the plugins at their locked versions. Then open the demo crate in demo/netwatch and poke around.
- Site, with every recording and six guides: https://xynorash.github.io/xynovim
xynorash
/
xynovim
xynovim: a personal Neovim 0.12 configuration for Rust on LazyVim: instant rust-analyzer and clippy diagnostics, nvim-dap debugger, test UI with coverage, git safety net. Inspired by JetBrains tools. Developed on Linux; Windows passes the portable parts in CI, macOS is not reliably green.
xynovim
A personal Neovim configuration for Rust, built on LazyVim and inspired by JetBrains' tools. Instant diagnostics, a debugger and test UI, a git safety net, and a test suite you can run yourself.
Website: https://xynorash.github.io/xynovim/ (with guides to the workflows below)
xynovim is a Neovim 0.12 configuration for Rust development. It adds instant diagnostics (rust-analyzer while you type, clippy through bacon-ls half a second later), a debugger (nvim-dap with codelldb), a test UI with cargo-nextest and coverage in the gutter, Cargo workspace, feature and crate helpers, and a git safety net (Local History, lazygit, diffview) to a LazyVim base.
Quick start
git clone https://github.com/xynorash/xynovim ~/.config/nvim
~/.config/nvim/scripts/bootstrap.sh
Then start nvim in a Cargo project (or in demo/netwatch) and run :checkhealth xynovim. This replaces your current Neovim configuration, so move ~/.config/nvim aside first if you have one. Prerequisites and the Windows and macOS status are under Install…
If you try it, I would like to hear what breaks, what you would change, and which parts are worth extracting next.



Top comments (1)
A bit of backstory: I started this because I missed RustRover's instant feedback in the terminal. The part I'm still unsure about is clippy while typing. It runs on every buffer change against a shadow copy of the workspace, and I'm curious how others get lint feedback before saving. Do you wait for save, run bacon in a split, or something else?