Version History
What changed in NeoVim 0.9 through 0.12. Focused on features that matter for daily use, not exhaustive changelogs.
0.9 - Foundation for Modern NeoVim
Released mid-2023. This version laid the groundwork for many features that became standard.
Headline features:
vim.loader- Bytecode-caching module loader, enabled by default. Makes startup measurably faster by caching compiled Lua.vim.iter- Iterator combinators (filter, map, fold, totable). Functional programming patterns for Lua tables and iterators.vim.snippet- Built-in snippet expansion engine. No plugin needed for basic snippet support.- Semantic token highlighting - LSP servers can provide token-level highlighting that supplements tree-sitter.
- EditorConfig support - Reads
.editorconfigfiles natively. No plugin needed. exrc/vim.secure- Secure project-local config files. NeoVim prompts before sourcing untrusted local configs.- Lua-based filetype detection -
vim.filetype.match()replaces the old Vimscript filetype detection. Faster and extensible. statuscolumn- Fully customizable status column (line numbers, signs, folds) via a format string.:Inspect- Shows highlight groups, tree-sitter captures, and semantic tokens under cursor.
0.10 - Visual Polish and LSP Maturity
Released mid-2024. Focused on defaults, visual improvements, and LSP features.
Defaults:
- New default colorscheme - Replaced the old blue colorscheme with a modern one that works in both light and dark modes.
termguicolorsauto-enabled - True color support turned on by default when the terminal supports it.- Default diagnostic keymaps -
[d/]dfor navigating diagnostics,<C-W>dfor diagnostic float. Kmaps to hover - In LSP-attached buffers,Kshows hover documentation.
LSP:
- Inlay hints -
vim.lsp.inlay_hint.enable()shows inline type annotations. - Pull diagnostics - Servers can request diagnostic refresh instead of push-only.
- Type hierarchy - Navigate type inheritance.
- Dynamic registration - Servers can add/remove capabilities after initialization.
Editor:
- Inline virtual text - Virtual text can appear within a line, not just at the end.
- Multi-line extmark ranges - Decorations can span multiple lines.
vim.system()- Clean async process execution (replacedvim.fn.jobstartfor most use cases).vim.lpeg/vim.re- Bundled PEG parsing library.- TOhtml rewrite -
:TOhtmlrewritten in Lua, much faster.
0.11 - Declarative LSP and Smart Defaults
Released early 2025. The biggest LSP overhaul since the client was introduced.
LSP (game-changing):
vim.lsp.config()/vim.lsp.enable()- Declarative LSP configuration. Define server configs, enable them, done. Replaces nvim-lspconfig for most setups.- Config files on runtimepath -
lsp/<name>.luafiles are auto-discovered. No plugin needed for basic LSP. - LSP folding - Servers can provide fold ranges via
textDocument/foldingRange. - Fuzzy completion matching - Built-in completion uses fuzzy matching.
Default keymaps (all LSP-attached):
grn- renamegra- code actiongrr- referencesgri- implementationgrt- type definitiongrx- codelens rungO- document symbols<C-S>- signature help (insert mode)
Vim-unimpaired style defaults:
[q/]q- quickfix navigation[l/]l- location list[t/]t- tag stack[a/]a- argument list[b/]b- buffer list
Other:
virtual_linesdiagnostic handler - Show diagnostics as virtual lines below the code (not just virtual text).- Tab/S-Tab for snippets - Built-in snippet jumping with Tab.
vim.fs.rm()/vim.fs.abspath()/vim.fs.relpath()- New filesystem utilities.- OSC 52 clipboard - Default clipboard integration over SSH using terminal escape codes.
Gotcha: 0.11 disabled the
virtual_textdiagnostic handler by default. If you relied on inline diagnostic text, re-enable it:vim.diagnostic.config({ virtual_text = true }).
0.12 - Package Manager and Inline Completion (Dev)
Currently in development. The most significant additions.
Built-in package manager:
vim.pack- Git-based package manager.vim.pack.add("user/repo")installs plugins. Lockfile support. No external plugin manager needed for basic setups.
LSP additions:
- Inline completion -
vim.lsp.inline_completionfor Copilot-style ghost text suggestions. :lspcommand - CLI interface for LSP operations (:lsp start,:lsp stop,:lsp restart).- Document color - Automatic color value highlighting in buffers.
- Linked editing range - Edit matching HTML tags or variable names simultaneously.
- On-type formatting - Auto-format as you type (e.g., adding semicolons, fixing indentation).
- Code lenses as virtual lines - Lenses render inline instead of above the line.
Editor:
vim.net.request()- Built-in HTTP client. No curl shelling needed.vim.pos/vim.range- Position and range utilities.'autocomplete'option - New option to control completion behavior.- Zig build option - Build NeoVim with Zig as an alternative to CMake.
- Markdown tree-sitter highlighting default - Markdown uses tree-sitter by default.
- Statusline shows diagnostics/progress - Default statusline includes LSP information.
exrcfrom parent directories - Project-local config files are found in parent directories too.:iput- Insert mode put command.:uniq- Remove duplicate lines.- Prompt-buffer multiline - Command line supports multiline editing.
Upgrade Impact Summary
| If you’re on | Biggest wins from upgrading |
|---|---|
| 0.8 or older | Everything. Lua-first config, tree-sitter, LSP, modern defaults. |
| 0.9 | Declarative LSP config (no nvim-lspconfig needed), smart default keymaps, better diagnostics. |
| 0.10 | vim.lsp.config/vim.lsp.enable, OSC 52 clipboard, virtual lines diagnostics. |
| 0.11 | Built-in package manager, inline completion, HTTP client. |