Claude-skill-registry growing-nvim-config
How to incrementally add Neovim configuration in this NixOS/home-manager setup. Use this when adding keybindings, settings, or plugins to nvim.
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/growing-nvim-config" ~/.claude/skills/majiayu000-claude-skill-registry-growing-nvim-config && rm -rf "$T"
skills/data/growing-nvim-config/SKILL.mdGrowing Neovim Config
This repo uses a "migrate only when needed" approach to Neovim configuration. Config lives in real
.lua files, deployed by home-manager.
Platform note: This skill describes the devbox setup where home-manager fully owns nvim. On Darwin, dotfiles still manages nvim and we only overlay
ccremote.lua. See gradual-dotfiles-migration for Darwin migration patterns.
Architecture
assets/nvim/lua/user/*.lua → ~/.config/nvim/lua/user/*.lua ↑ extraLuaConfig does require("user.*")
Home-manager's
programs.neovim owns ~/.config/nvim/init.vim. We avoid collisions by only managing files under lua/user/.
Current Setup
users/dev/home.nix:
programs.neovim = { enable = true; defaultEditor = true; viAlias = true; vimAlias = true; extraLuaConfig = '' require("user.settings") require("user.mappings") ''; }; xdg.configFile."nvim/lua/user" = { source = "${assetsPath}/nvim/lua/user"; recursive = true; };
assets/nvim/lua/user/settings.lua:
vim.g.clipboard = "osc52" -- OSC 52 clipboard provider vim.opt.clipboard = "unnamedplus" -- Sync unnamed register with +
assets/nvim/lua/user/mappings.lua:
vim.keymap.set("t", "<C-w>a", [[<C-\><C-n>]], { noremap = true, silent = true })
Adding New Config
-
Create a Lua file in
:assets/nvim/lua/user/-- assets/nvim/lua/user/options.lua vim.opt.number = true vim.opt.relativenumber = true -
Add the require in
:home.nixextraLuaConfig = '' require("user.settings") require("user.options") require("user.mappings") ''; -
Apply:
home-manager switch --flake .#dev
Plugin Strategy
Current approach: lazy.nvim (not Nix-managed)
When you need plugins, bootstrap lazy.nvim in your Lua config. It writes to
~/.local/share/nvim/, which works fine on NixOS.
-- assets/nvim/lua/user/plugins.lua (future) local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not vim.loop.fs_stat(lazypath) then vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath }) end vim.opt.rtp:prepend(lazypath) require("lazy").setup({ -- plugin specs here })
Alternative approaches (for later):
- Nix-managed plugins via
— more reproducible, but bigger migrationprograms.neovim.plugins - Hybrid with
— lazy.nvim loads Nix store pathslazy-nix-helper.nvim
Stick with lazy.nvim until you feel pain (offline builds, reproducibility needs).
Key Files
| File | Purpose |
|---|---|
| with requires |
| Actual Lua config files |
Gotchas
- Don't create
— home-manager owns that path viaassets/nvim/init.luaprograms.neovim - The
directory is deployed recursively — add files freely, they'll appear afterlua/user/home-manager switch