If Nix and Neovim have one thing in common, it's that many new users don't know where to get started. Most Nix-based Neovim setups assume deep expertise in both realms, abstracting away Neovim's core functionalities as well as the Nix internals used to build a Neovim config. Frameworks and module-based DSLs are opinionated and difficult to diverge from with one's own modifications.
kickstart-nix.nvim is different:
It's geared for users of all levels,
making the migration of Neovim configurations to Nix straightforward.
This project aims to be as simple as possible, while allowing
for maximum flexibility.
[!NOTE]
Similar to
kickstart.nvim, this repository is meant to be used by you to begin your Nix/Neovim journey; remove the things you don't use and add what you miss.
[^1]: The absence of a Nix module DSL for Neovim configuration is deliberate.
If you were to copy the nvim directory to $XDG_CONFIG_HOME,
and install the plugins, it would work out of the box.
.luarc.json in the devShell's shellHook.
This sets up lua-language-server to recognize all plugins
and the Neovim API.If you have Nix installed (with flakes enabled), you can test drive this by running:
nix run "github:nix-community/kickstart-nix.nvim"
nvim/plugin directory.mkNeovim function byignoreConfigRegexes (e.g. = [ "^ftplugin/.*.lua" ]).[!TIP]
The nix and lua files contain comments explaining what everything does in detail.
nixpkgs.overlays = [
# replace <kickstart-nix-nvim> with the name you chose
<kickstart-nix-nvim>.overlays.default
];
You can then add the overlay's output(s) to the systemPackages:
environment.systemPackages = with pkgs; [
nvim-pkg # The default package added by the overlay
];
[!IMPORTANT]
This flake uses
nixpkgs.wrapNeovimUnstable, which has an unstable signature. If you setnixpkgs.follows = "nixpkgs";when importing this into your flake.nix, it may break. Especially if your nixpkgs input pins a different branch.
With Nix installed (flakes enabled), from the repo root:
nix profile install .#nvim
Directory structure:
── flake.nix
── nvim # Neovim configs (lua), equivalent to ~/.config/nvim
── nix # Nix configs
init.lua.plugin directory.ftplugin directory.lua/user directory.Directory structure:
── nvim
├── ftplugin # Sourced when opening a file type
│ └── <filetype>.lua
├── init.lua # Always sourced
├── lua # Shared library modules
│ └── user
│ └── <lib>.lua
├── plugin # Automatically sourced at startup
│ ├── autocommands.lua
│ ├── commands.lua
│ ├── keymaps.lua
│ ├── plugins.lua # Plugins that require a `setup` call
│ └── <plugin-config>.lua # Plugin configurations
└── after # Empty in this template
├── plugin # Sourced at the very end of startup (rarely needed)
└── ftplugin # Sourced when opening a filetype, after sourcing ftplugin scripts
[!IMPORTANT]
- Configuration variables (e.g.
vim.g.<plugin_config>) should go innvim/init.luaor a module that isrequired ininit.lua.- Configurations for plugins that require explicit initialization (e.g. via a call to a
setup()function) should go innvim/plugin/<plugin>.luaornvim/plugin/plugins.lua.- See Initialization order for details.
You can declare Neovim derivations in nix/neovim-overlay.nix.
There are two ways to add plugins:
nixpkgs as the source.Directory structure:
── flake.nix
── nix
├── mkNeovim.nix # Function for creating the Neovim derivation
└── neovim-overlay.nix # Overlay that adds Neovim derivation
This derivation creates an init.lua as follows:
nvim/lua to the runtimepath.nvim/init.lua.nvim/* to the runtimepath.nvim/after to the runtimepath.This means that modules in nvim/lua can be required in init.lua and nvim/*/*.lua.
Modules in nvim/plugin/ are sourced automatically, as if they were plugins.
Because they are added to the runtime path at the end of the resulting init.lua,
Neovim sources them after loading plugins.
This configuration comes with a few plugins pre-configured.
You can add or remove plugins by
nvim/plugin/<plugin>.lua.If you have used this template and would like to fetch updates that were added later...
Add this template as a remote:
git remote add upstream git@github.com:nix-community/kickstart-nix.nvim.git
Fetch and merge changes:
git fetch upstream
git merge upstream/main --allow-unrelated-histories
When your neovim setup is a nix derivation, editing your config demands a different workflow than you are used to without nix. A quick and easy way to test your changes:
nix run /path/to/neovim/#nvim
or nix run /path/to/neovim/#nvim -- <nvim-args>[^2]: When adding new files, nix flakes won't pick them up unless they have been committed or staged.
This requires a rebuild of the nvim derivation, but has the advantage
that if anything breaks, it's only broken during your test run.
When developing locally you might want to have a faster feedback loop.
Normally the whole Neovim configuration is copied into the store and
the wrapper which nix generates for the derivation calls nvim
with -u /nix/store/path/to/generated-init.lua.
We can deactivate this behavior with wrapRc = false, so that the
config is loaded from $XDG_CONFIG_HOME/$NVIM_APPNAME[^3], where
$NVIM_APPNAME defaults to nvim if the appName attribute is not set
in the mkNeovim function.
The Flake exposes a dev shell with a nvim-dev package. The lua configuration in ./nvim
is automatically symlinked to ~/.config/nvim-dev.
After activating the shell with nix develop or nix-direnv
you can run Neovim with nvim-dev to automatically reload your lua configuration. All Nix changes still require a rebuild.
[^3]: Assuming Linux. Refer to :h initialization for Darwin.
kickstart.nvim:
Single-file Neovim configuration template with a similar philosophy to this project.
Does not use Nix to manage plugins.neovim-flake:
Configured using a Nix module DSL.NixVim:
A module system for Neovim, with a focus on plugin configs.nixCats-nvim:
A project that organises plugins into categories.
It also separates lua and nix configuration.lz.n:
A plugin-manager agnostic Lua library for lazy-loading plugins.
Can be used with Nix.[!NOTE]
When comparing with projects in the "non-Nix world", this repository would be more comparable to
kickstart.nvim(hence the name), while the philosophies ofneovim-flakeandNixVimare more in line with a Neovim distribution likeLunarVimorLazyVim(though they are far more minimal by default).