NeoVim 0.12 setup

Minimal & Powerful: The Perfect NeoVim Setup for 2026

🎬 The Rad Lectures πŸ“… Feb 22, 2026 ⏱ 1:02:11
NeoVim 0.12 vim.pack Treesitter LSP blink.cmp

🎯 Why 2026 Is the Year of NeoVim

"There has never been a better time to get into NeoVim." The imminent 0.12 release β€” "the year of NeoVim out of the box" β€” adds a built-in plugin manager (vim.pack) and a :restart command, among other improvements. 0:00

The thesis β€” in the age of AI slop: "This flies in the face of agentic code editors and AI-generated code. But we can generate code faster than ever β€” what NeoVim improves is your efficiency around motions, macros, editing, and moving around the codebase. That's never been more important than in 2026." 0:44

The constraint that shapes everything: just 10 plugins. "Ultra minimal, ultra maintainable, and ultra powerful." 0:31

πŸ“¦ Install 0.12 + Entry Point

Current stable is 0.11, but 0.12 is imminent and "very mature." On Arch (the creator runs CachyOS), install the git build: 1:20

StepCommand
Install (Arch)sudo pacman -S neovim-git
Create entry pointmkdir -p ~/.config/nvim
Create init filetouch ~/.config/nvim/init.lua
Verify versionnvim β†’ should report 0.12

"The entry point is just where NeoVim looks for its configuration when it starts." 3:23

βš™οΈ Options & Colorscheme

Before touching any plugin, NeoVim has built-in colorschemes β€” his favorites are zellij-adjacent habamax and zenwritten. He picks habamax plus termguicolors. 5:00

CategoryOptions set
Line numbersnumber, relativenumber, cursorline
Wrapping & scrollnowrap, scrolloff=10, sidescrolloff=10
Tabstabstop=2, shiftwidth=2, softtabstop=2, expandtab, smartindent
Searchignorecase, smartcase, hlsearch, incsearch
Visualsigncolumn, colorcolumn=100, showmatch, termguicolors
Undoundofile, custom undodir (create it via vim.fn.mkdir)
Behaviorhidden, noerrorbells, backspace, autoread, mouse, UTF-8, iskeyword+=-
Foldsfoldmethod=expr (using Treesitter later)

He stresses using the built-in :help β€” e.g. :help tabstop β€” whenever a setting is unclear. After saving, the new :restart command applies everything without quitting. 14:29

πŸ“Š Custom Statusline

Rather than a plugin, he builds his own statusline (which is why he disabled the default mode display earlier). It's composed of four functions: 15:03

ComponentWhat it shows
git_branch()The current Git branch + icon
filetype_icon()A hardcoded icon table (lua, Python, JS/TS, CSS, Markdown, Vim, Bash, Rust, Go…)
file_size()Size with KB/MB formatting
mode_icon()Custom mode icon (insert/normal/visual)

All wired via a setup_dynamic_statusline() function triggered on WinEnter and BufEnter autocommands. "We just built it ourselves β€” still haven't introduced any dependencies, and it's already super usable." 17:38

⌨️ Keymaps

Space is the leader (and local leader). Key mappings worth noting: 18:11

MappingAction
gj/gkBetter movement in wrapped text
<leader>cClear search highlight
n/N β†’ centerKeep cursor in the middle (zz)
<leader>pPaste without yanking (replaces visual selection, leaves register intact)
<leader>bn/bpNext / previous buffer
<leader>sv/shSplit vertical / horizontal
<leader>tdToggle diagnostics
<leader>paCopy full file path
Alt+j/k (visual)Move selected lines up/down (the one VS Code nicety he admits to)

πŸ”„ Autocommands

"Autocommands are triggered on an event and run an action β€” formatting code, applying options, whatever." The three he sets: 23:21

EventEffect
TextYankPostBriefly flash the yanked region (visual feedback without a plugin)
BufReadPostRestore last cursor position (with a diff-mode exception)
FileType md/text/gitcommitEnable wrap + line break + spellcheck for writing

πŸ“¦ vim.pack β€” Built-in Package Manager

The headline of 0.12: vim.pack replaces external managers like Lazy. Two commands do the work: 26:13

The pattern: vim.pack.add("github-url") installs the plugin; vim.pack.load("name") loads it (used for optional plugins). Plugins install to ~/.local/share/nvim/site/pack/core/opt/. A nvim-pack.lock file pins versions β€” "if you're familiar with Lazy, this is keeping the version for you." 27:06

🧩 The 10 Plugins

The full roster, in install order: 28:41

#PluginRole
1nvim-treeFile explorer (<leader>e)
2fzf-luaFuzzy finder (<leader>ff/fg/fb/fh/fx)
3mini.nvim40+ mini modules: ai, comment, move, surround, indentscope, pairs, notify, icons
4gitsigns.nvimGit hunks + navigation
5nvim-treesitterSyntax understanding, folds, navigation
6nvim-lspconfigLSP configurations
7mason.nvimInstalls LSPs, DAPs, linters, formatters
8efmls-configs-nvimGeneral-purpose lint/format language server
9blink.cmpCompletion engine
10luasnipSnippet engine
mini.nvim is "a cheat code": "it's a library of 40+ independent lua modules. Even though we only have 10 plugins, there's all these mini plugins inside." It even has its own statusline and completion engine β€” but he uses his own statusline and blink.cmp. 31:15

Treesitter note: he uses the new main branch API (the incompatible rewrite), which removed the old ensure_installed option β€” so he wrote a function to emulate it, listing which parsers to auto-install. 35:58

πŸ”Œ LSP, Lint & Format

The LSP layer uses nvim-lspconfig (sensible defaults) + mason.nvim (package manager for LSPs, linters, formatters). The on_attach function maps shortcuts based on the attached client: 38:58

MappingAction
<leader>gdGo to definition
<leader>gsGo to definition (split)
<leader>caCode action
<leader>rnRename
<leader>dlLine diagnostics
<leader>fr / fdReferences / definitions (via fzf-lua)
<leader>oiOrganize imports
<leader>qOpen diagnostics list

Language servers set up: lua_ls, pyright, bashls, ts_ls, gopls, clangd β€” installed via Mason. 43:48

For linting + formatting, he uses efm-langserver (a general-purpose language server that plugs in individual linters/formatters) paired with efmls-configs-nvim. The mapping: 45:35

LanguageLinterFormatter
Lualuacheckstylua
Pythonflake8black
JS/TS/React/Vueeslint_dprettier
Bashshellcheckshfmt
C/C++cpplintclang-format
Gogorevivegofumpt
JSONβ€”fixjson

Format-on-save is an autocommand on BufWritePre that checks for an attached efm client and formats the buffer. 52:29

πŸ’‘ Completion (blink.cmp)

blink.cmp is "a performant, batteries-included completion plugin" β€” the VS Code-like completion. Sources: LSP, path, buffer, and snippets (via luasnip). Keymaps: ctrl+space show/hide, enter accept, ctrl+j/k navigate, tab/shift-tab next/prev snippet. 53:07

Getting fuzzy matching to work: set download = true on the pre-built binaries. Then attach the completion capabilities to every language server in the lspconfig list β€” "so even without a language server, you still get buffer and path completion." 55:43

The demo: a Python file, typing sys. surfaces version_info; the LSP flags a non-callable; flake8 flags the missing blank line; write triggers auto-format. 56:27

πŸ–₯️ Floating Terminal & Transparency

A hand-rolled floating terminal β€” an autocommand creates a terminal buffer with numbers/relativenumber/signcolumn off, and a function sizes it to 80% height Γ— 80% width. <leader>t toggles it, escape closes it, and it persists between toggles. "This is totally up to you β€” you can use plugins, but we've hit our maximum of 10." 57:22

Transparency: a set_transparency() function clears highlight groups, plus nvim-tree options β€” but it only shows if the terminal emulator itself is transparent (he uses Kitty, setting background opacity to 0.8). 58:41

Honorable mentions beyond the 10-plugin limit: Kodium (Windsurf) for AI completion, lsp-saga, lualine, nvim-dap-ui, rustacean, trouble.nvim, vim-fugitive, which-key, and zen-mode. 59:32

βœ… Key Takeaways

  1. NeoVim 0.12 ships its own plugin manager. vim.pack.add / vim.pack.load replace Lazy, with a nvim-pack.lock for version pinning. No external manager needed.
  2. 10 plugins is the discipline, not the ceiling. Minimalism forces you to use built-ins (colorscheme, statusline, terminal) before reaching for a dependency.
  3. mini.nvim is the multiplier. One plugin entry unlocks 40+ independent modules β€” ai, comment, surround, pairs, indentscope, icons.
  4. Treesitter migrated to a new API. The ensure_installed option is gone; you emulate it with a function that auto-installs missing parsers.
  5. The LSP triad is lspconfig + mason + efm. lspconfig for configs, mason for installing servers, efm-langserver for pluggable linters/formatters.
  6. Format-on-save via autocommand, not a plugin. BufWritePre + efm client check does it.
  7. The philosophical point: in the AI era, editing efficiency (motions, macros, navigation) matters more than ever β€” even as code generation gets free.

πŸ”— Resources & Links

πŸ“ Timestamp Index

0:00 Intro β€” why 2026 is the year of NeoVim
1:20 Installing 0.12
5:00 Colorscheme + options
15:03 Custom statusline
18:11 Keymaps
23:21 Autocommands
26:13 vim.pack β€” built-in package manager
28:41 The 10 plugins
38:58 LSP: lspconfig + mason
45:35 Lint & format with efm-langserver
53:07 Completion: blink.cmp + luasnip
57:22 Floating terminal
59:32 Honorable mentions
☰ View all