This is my second attempt at creating a Neovim configuration intended for NixOS. The first was configured using Nixvim. This mostly worked, except you often had to escape into raw Lua strings to get precise customization.
Enter nixCats. It provides the tools needed to mix Nix and Lua in your configurations. For advanced users, configuring Neovim with Nix expressions doesn't really make sense, since the whole point of Neovim is to be extremely hackable ("hyperextensible") and it provides ergonomic Lua bindings for that purpose.
This setup provides not just a usable but a "great" Neovim configuration for
NixOS. That is, it has features that make it better on all distros, not
just on NixOS. Why? Instead of using ad-hoc package managers written for Neovim
like lazy.nvim, Mason, etc, all external dependencies are fetched and built
by Nix. Mason and lazy are good for what they are meant for, but Nix can make
strong guarantees that practically no other package management tool can,
period. Namely, it can ensure the presence of runtime dependencies (like rg,
fd, LSPs, formatters, etc), and guarantee builds are successful. If your
editor works today, it'll work tomorrow. It won't break from system upgrades or
files randomly getting broken. Nix is purpose built to handle pretty much
everything that a text editor's plugins shouldn't, and it's a perfect match.
You can test drive the configuration (even if you aren't on NixOS) if you have the Nix package manager available (with flakes).
nix run 'github:youwen5/viminal2'This flake exposes a package at packages.${system}.nvim-no-rc that doesn't
bundle the Lua configuration with the files. (It still includes all of the
plugins managed by Nix and the nixCats Lua helper). This means you can quickly
hack on the configuration just like a regular Neovim config without constantly
re-running nix build. Here's how:
Clone this repository to ~/.config/nvim. Enter the repository and run nix build .#nvim-no-rc. Then, you can run Neovim from within the symlink,
result/bin/nvim-no-rc, which will use the Neovim configuration in
~/.config/nvim. You can then quickly hack on any Lua files without constant
rebuilds.
As this is my second configuration from scratch (if you count Nixvim as "from scratch"), I wanted to do it right (so I could stop wasting my time configuring my editor). I've been using this configuration daily for various purposes for over a year, with no desire to declare Neovim bankruptcy yet, so presumably it was a success.
For completion, I use blink.cmp. This
plugin is much, much faster than nvim-cmp thanks to optimized SIMD
instructions (and Rust), has a better fuzzy search, and comes with more out of
the box.
lz.n is used to load plugins after they have been downloaded by Nix. lz.n
is a lazy loading plugin by the authors of Rocks.nvim, a plugin manager based
on Luarocks. As they are designed to be decoupled, Rocks.nvim can simply be
replaced by Nix. Most plugins are lazy loaded, but generally performance is
good enough that it is not even strictly necessary.
The keybinds have gotten a lot more idiosyncratic. Instead of focusing on mnemonic keys that can be easily committed to memory, highly efficient ones were chosen instead.
- Try rewriting config in Fennel.
Feel free to copy any code from here or use it as an example. It's public domain.