<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Xynorash</title>
    <description>The latest articles on DEV Community by Xynorash (@xynorash).</description>
    <link>https://dev.to/xynorash</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2040740%2Fadee9296-7733-461d-a599-eeb37c18d4e8.jpg</url>
      <title>DEV Community: Xynorash</title>
      <link>https://dev.to/xynorash</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xynorash"/>
    <language>en</language>
    <item>
      <title>A Neovim config for Rust that I test like software</title>
      <dc:creator>Xynorash</dc:creator>
      <pubDate>Fri, 23 Oct 2026 09:17:37 +0000</pubDate>
      <link>https://dev.to/xynorash/a-neovim-config-for-rust-that-i-test-like-software-5221</link>
      <guid>https://dev.to/xynorash/a-neovim-config-for-rust-that-i-test-like-software-5221</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;xynovim&lt;/strong&gt;, 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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc0mqy0rbgdzggcbeojh8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc0mqy0rbgdzggcbeojh8.png" alt="xynovim editing the netwatch demo crate: Island Dark theme, inlay hints, sticky scope and a statusline with git branch, server state and clippy state" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The real config on a small demo crate. Everything in this post was recorded from it, nothing is mocked up.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Two tiers of diagnostics
&lt;/h2&gt;

&lt;p&gt;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): &lt;code&gt;bacon-ls&lt;/code&gt; runs it against a hardlinked shadow of your workspace on every buffer change, so lints show up before you save.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs3si4lyg98l8wlew66rh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs3si4lyg98l8wlew66rh.png" alt="A type error shown inline the moment it is typed" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;rust-analyzer, while typing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Funzlfefncszutlulodx3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Funzlfefncszutlulodx3.png" alt="Diagnostic float with the full clippy message and its help text" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Each message shows its first line inline. The full text, with the suggestion, is one keypress away.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  A debugger with real values
&lt;/h2&gt;

&lt;p&gt;nvim-dap with codelldb, a layout that suits Rust, and lldb's Rust formatters loaded automatically, so a &lt;code&gt;String&lt;/code&gt; or a &lt;code&gt;Vec&lt;/code&gt; shows its contents instead of &lt;code&gt;{...}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkro9xs2c5oy2i518j9ap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkro9xs2c5oy2i518j9ap.png" alt="dap-ui stopped at a breakpoint: locals, stack, console and inline values" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Stopped at a breakpoint: locals, call stack, console and inline values.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  One feature set for both tiers
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;:RustContext&lt;/code&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu18tl2vo1d86e77kohy1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu18tl2vo1d86e77kohy1.png" alt="The csr side greyed out as inactive; the statusline is back to clippy ok" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The inactive side is greyed out and the statusline is back to "clippy ok".&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  A safety net
&lt;/h2&gt;

&lt;p&gt;Every save is snapshotted as a commit under a private git ref (&lt;code&gt;refs/lochist/&lt;/code&gt;). A bad refactor, a bad rename or a bad evening is one picker away from being undone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzsupljt5ik7fvpa5dop5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzsupljt5ik7fvpa5dop5.png" alt="Local history picker listing the snapshots of src/lib.rs" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Local History, backed by plain git.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Macros and dependencies
&lt;/h2&gt;

&lt;p&gt;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 &lt;code&gt;Cargo.toml&lt;/code&gt;. It also ranks ambiguous imports, remembers your pick, and shows macro expansions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffetj86uv2oxswjqa0uni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffetj86uv2oxswjqa0uni.png" alt="The unknown crate uuid in a path, with the error" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The hint on an unknown crate.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5rk9o770knwk0sk48dxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5rk9o770knwk0sk48dxw.png" alt="Macro expansion of derive(Parser) in a read-only split" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Macro expansion in a read-only split.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The AI agent, on a leash
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;
&lt;h2&gt;
  
  
  Nine standalone plugins
&lt;/h2&gt;

&lt;p&gt;The original parts of the config are now standalone MIT plugins, so you can take only what you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;xyno-history.nvim&lt;/code&gt;: Local History on private git refs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xyno-sandbox.nvim&lt;/code&gt;: runs an agent in bubblewrap, refuses without it&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xyno-clipboard.nvim&lt;/code&gt;: OSC 52 clipboard provider for tmux and SSH&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xyno-guard.nvim&lt;/code&gt;: keeps auto-save off dependency sources and changed files&lt;/li&gt;
&lt;li&gt;a Rust toolkit of five that share one base: &lt;code&gt;xyno-rust.nvim&lt;/code&gt;, &lt;code&gt;xyno-new.nvim&lt;/code&gt;, &lt;code&gt;xyno-imports.nvim&lt;/code&gt;, &lt;code&gt;xyno-crates.nvim&lt;/code&gt;, &lt;code&gt;xyno-macros.nvim&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All nine install with lazy.nvim and need Neovim 0.12+. The &lt;a href="https://xynorash.github.io/xynovim/plugins/" rel="noopener noreferrer"&gt;plugins page&lt;/a&gt; has a complete spec for the Rust toolkit and the install order.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tested, and I mean it
&lt;/h2&gt;

&lt;p&gt;"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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0px56m7gc6xhjvi0tqen.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0px56m7gc6xhjvi0tqen.png" alt="The test runner finishing four spec files: 129 passed, 0 failed" width="800" height="468"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The runner on four of the spec files: 129 passed, 0 failed.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What it is not
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It needs &lt;strong&gt;Neovim 0.12&lt;/strong&gt;, and it is &lt;strong&gt;developed on Linux&lt;/strong&gt; (Arch). Windows is exercised in CI, and macOS is not reliably green yet.&lt;/li&gt;
&lt;li&gt;The agent sandbox is a seatbelt, not a jail.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full list, with what I decided and why, is in &lt;code&gt;docs/KNOWN_ISSUES.md&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/xynorash/xynovim ~/.config/nvim
~/.config/nvim/scripts/bootstrap.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The bootstrap script checks the prerequisites and installs the plugins at their locked versions. Then open the demo crate in &lt;code&gt;demo/netwatch&lt;/code&gt; and poke around.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site, with every recording and six guides: &lt;a href="https://xynorash.github.io/xynovim" rel="noopener noreferrer"&gt;https://xynorash.github.io/xynovim&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/xynorash" rel="noopener noreferrer"&gt;
        xynorash
      &lt;/a&gt; / &lt;a href="https://github.com/xynorash/xynovim" rel="noopener noreferrer"&gt;
        xynovim
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      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.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;xynovim&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;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.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/xynorash/xynovim/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/xynorash/xynovim/actions/workflows/ci.yml/badge.svg" alt="ci"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/63d6b7f5a5902caf51a6a891b2f0165726d8fde7f992a50dcced0e030f712107/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e656f76696d2d302e31322d3537613134333f6c6f676f3d6e656f76696d266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/63d6b7f5a5902caf51a6a891b2f0165726d8fde7f992a50dcced0e030f712107/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e656f76696d2d302e31322d3537613134333f6c6f676f3d6e656f76696d266c6f676f436f6c6f723d7768697465" alt="neovim 0.12"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/35b94db23d3ed026343335f74d52ce31e74b77ad7dab4e4b89f49f2026e0937f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4170616368652d2d322e302d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/35b94db23d3ed026343335f74d52ce31e74b77ad7dab4e4b89f49f2026e0937f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4170616368652d2d322e302d626c7565" alt="license"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/563f51280a0b6326c8794fd2cab725ad309db92fcb4a84d119211d055ac8af4b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d39303625323070617373696e672d627269676874677265656e"&gt;&lt;img src="https://camo.githubusercontent.com/563f51280a0b6326c8794fd2cab725ad309db92fcb4a84d119211d055ac8af4b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d39303625323070617373696e672d627269676874677265656e" alt="tests"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Website: &lt;a href="https://xynorash.github.io/xynovim/" rel="nofollow noopener noreferrer"&gt;https://xynorash.github.io/xynovim/&lt;/a&gt; (with &lt;a href="https://xynorash.github.io/xynovim/#guides" rel="nofollow noopener noreferrer"&gt;guides&lt;/a&gt; to the workflows below)&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/xynorash/xynovim/docs/media/01-hero.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fxynorash%2Fxynovim%2FHEAD%2Fdocs%2Fmedia%2F01-hero.png" alt="xynovim editing the netwatch demo crate: Island Dark theme, inlay hints, sticky scope from treesitter-context, statusline with git branch, server state and clippy state"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;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 &lt;a href="https://github.com/LazyVim/LazyVim" rel="noopener noreferrer"&gt;LazyVim&lt;/a&gt; base.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick start&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/xynorash/xynovim &lt;span class="pl-k"&gt;~&lt;/span&gt;/.config/nvim
&lt;span class="pl-k"&gt;~&lt;/span&gt;/.config/nvim/scripts/bootstrap.sh&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then start &lt;code&gt;nvim&lt;/code&gt; in a Cargo project (or in &lt;a href="https://github.com/xynorash/xynovim/demo/netwatch" rel="noopener noreferrer"&gt;&lt;code&gt;demo/netwatch&lt;/code&gt;&lt;/a&gt;) and run &lt;code&gt;:checkhealth xynovim&lt;/code&gt;. This replaces your current Neovim configuration, so move &lt;code&gt;~/.config/nvim&lt;/code&gt; aside first if you have one. Prerequisites and the Windows and macOS status are under &lt;a href="https://github.com/xynorash/xynovim#install" rel="noopener noreferrer"&gt;Install&lt;/a&gt;…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/xynorash/xynovim" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;If you try it, I would like to hear what breaks, what you would change, and which parts are worth extracting next.&lt;/p&gt;

</description>
      <category>neovim</category>
      <category>rust</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
