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 .editorconfig files 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.
  • termguicolors auto-enabled - True color support turned on by default when the terminal supports it.
  • Default diagnostic keymaps - [d / ]d for navigating diagnostics, <C-W>d for diagnostic float.
  • K maps to hover - In LSP-attached buffers, K shows 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 (replaced vim.fn.jobstart for most use cases).
  • vim.lpeg / vim.re - Bundled PEG parsing library.
  • TOhtml rewrite - :TOhtml rewritten 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>.lua files 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 - rename
  • gra - code action
  • grr - references
  • gri - implementation
  • grt - type definition
  • grx - codelens run
  • gO - 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_lines diagnostic 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_text diagnostic 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_completion for Copilot-style ghost text suggestions.
  • :lsp command - 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.
  • exrc from 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 onBiggest wins from upgrading
0.8 or olderEverything. Lua-first config, tree-sitter, LSP, modern defaults.
0.9Declarative LSP config (no nvim-lspconfig needed), smart default keymaps, better diagnostics.
0.10vim.lsp.config/vim.lsp.enable, OSC 52 clipboard, virtual lines diagnostics.
0.11Built-in package manager, inline completion, HTTP client.