Neovim 0.12+ configuration using the built-in package manager (vim.pack),
no lazy.nvim.
init.lua entry point; requires everything below in order
lua/config/options.lua editor options
lua/config/keymaps.lua global keymaps
lua/config/autocmds.lua global autocommands / filetype additions
lua/config/pack.lua plugin list + PackChanged build hooks (only vim.pack.add call)
lua/plugins/*.lua per-plugin setup
nvim-pack-lock.json vim.pack lockfile (generated; commit it, don't edit it)
- Neovim >= 0.12
git,curl,tartree-sitterCLI >= 0.26 and a C compiler (nvim-treesittermaincompiles parsers locally)- Windows:
winget install tree-sitter.tree-sitter(or scoop/cargo) and e.g.zig/clang/MSVC onPATH
- Windows:
dotnetSDK (roslyn, netcoredbg),go(gopls, delve, go.nvim tools),node(prettier, ts_ls, html)- A Nerd Font
- Start
nvim.vim.packasks once to confirm installing the plugins (y, orafor all). - Restart (
:restart). Mason installs the LSP servers and tools, treesitter installs parsers. :checkhealth vim.pack,:checkhealth nvim-treesitter,:checkhealth vim.lsp.
Plugins that tag releases are locked to their current major in lua/config/pack.lua
(version = vim.version.range("N.x")): updates stay within N.y.z, a major bump is a
deliberate edit. Plugins with stale or no tags follow their default branch and are gated
by the lockfile + the update review buffer. nvim-treesitter (main) is updated together
with Neovim upgrades, not in the regular batch. Stay on Neovim stable patch releases.
| action | how |
|---|---|
| update everything | <leader>pu or :lua vim.pack.update() → review tab → :write to apply, :quit to discard |
| see what is installed | <leader>pl or :lua vim.pack.update(nil, { offline = true }) |
| add a plugin | add it to lua/config/pack.lua, restart |
| remove a plugin | delete it from pack.lua, restart, :lua vim.pack.del({ "name" }) |
| pin / unpin | set `version = "<tag |
| revert an update | git checkout -- nvim-pack-lock.json, restart, :lua vim.pack.update(nil, { target = "lockfile" }) |
| new machine | clone, start nvim: everything installs at the lockfile revisions |
:DirtytalkBuildrebuilds the "programming" spell dictionary from vim-dirtytalk's word lists (its own:DirtytalkUpdateis broken on 0.12). It runs automatically when the plugin is installed or updated.- C#: the
roslynmason package (Crashdummyy registry) providesroslyn-language-server, which roslyn.nvim picks up automatically. Razor/cshtml is handled by the same server; rzls is no longer needed (:MasonUninstall rzls). - Treesitter parsers are compiled locally;
:checkhealth nvim-treesittershows what's missing on the machine.
Leader is <space>. <leader>sk searches all keymaps, <leader>? shows buffer-local ones.
Highlights: <leader>sf/sg/sw/s. find files / grep / grep word / recent (snacks picker),
<leader><leader> buffers, \ Oil, <leader>a/<C-e> harpoon, <leader>f format,
<leader>xx Trouble, <leader>z zen, <F5>/<F1>/<F2>/<F3>/<leader>b debugging.
LSP uses Neovim's default gr* mappings (grn rename, gra code action, grr
references, gri implementation, grd definition, grt type definition, gO
symbols) with the picker for list results, plus <leader>th for inlay hints.