On March 29, 2026, the release text editor Neovim version 0.12 was released, and on April 6, a bugfix release 0.12.1 came out.This is one of the largest releases in recent times: over 340 tasks were closed, a built-in plugin manager, an HTTP client, a restart command were added, the built-in LSP client was significantly expanded, and the messaging subsystem was experimentally redesigned.
Incompatible changes:
- will be removed deprecated vim.diagnostic API;
- Ctrl-R in insert mode now works similarly to paste;
- support for Python 3.7 and 3.8 in providers has been discontinued;
- the shellmenu plugin from the FreeBSD source tree. The GCC build along with the base system for all architectures was disabled by default at the end of December, and now the GCC code has been removed from the SVN repository. It is noted that at the time of removal, all platforms that do not support Clang have switched to using external build tools installed from ports. The base system included an outdated release of GCC 4.2.1 (integration of newer versions was not possible due to the transition of 4.2.2 to the GPLv3 license, which was deemed unacceptable for FreeBSD core components)., tohtml has been moved to pack/dist/opt/;
- Treesitter: the offset! directive applies to all captures, get_parser returns nil on error, the option "all" has been removed in Query:iter_matches;
- LSP: textDocument/codeLens has been rewritten as a decoration provider;
- UI: ext_messages has been decoupled from the messaging grid;
- Support for RFC 3986 in path_with_url.
The built-in plugin manager (vim.pack):
Added is an experimental built-in plugin manager vim.pack. It supports lockfile for version pinning, offline updates, specifying target versions, confirmation buffer with navigation through [[[\/]] and code actions. VCS information is available through vim.pack.get. Operation progress displayed is shown through nvim_echo with kind=progress. Integrated with checkhealth.
LSP:
The built-in LSP client has received a substantial update:
- a new command :lsp for interactive client management;
- vim.lsp.enable and vim.lsp.is_enabled for managing LSP servers as needed;
- built-in autocomplete in insert mode with support for completionItem/resolve (when completeopt=popup), preview snippets and of colors, support for CompletionItem.labelDetails;
- incremental selection through textDocument/selectionRange, including in operator-pending mode;
- textDocument/documentColor is enabled by default, support for has been added colorPresentation;
- disabling the tracker blocking textDocument/documentLink, textDocument/inlineCompletion, textDocument/onTypeFormatting;
- codeLens is displayed as virtual lines through the decoration provider;
- enhancements for semantic tokens: multiline tokens, requests range and full;
- disabling the tracker blocking workspace diagnostics, dynamic registration, the request diagnostic/refresh;
- highlighting of renamed symbols, support for annotated text edits and linked editing ranges;
- new default mappings: grt — go to type definition, grx — run codeLens;
- LSP clients automatically disconnect when the filetype changes;
- have been deprecated vim.lsp.stop_client and vim.lsp.util.stylize_markdown.
The command :restart and :detach:
New command :restart restarts Nvim and reconnects the current UI. Support for :detach and :restart on Windows. Both work across all platforms.
Network (vim.net):
Added built-in HTTP client vim.net.request and :edit url. Variant vim.net.request with outbuf argument writes the server response directly to the specified buffer.
UI and messages:
- ui2 — experimental redesign of the message and command line subsystems, ext_cmdline/messages for TUI;
- new highlight groups hl-StderrMsg and hl-StdoutMsg;
- nvim_echo supports progress events with kind=progress;
- default status line shows diagnostic counters, progress, and LSP status, busy state of buffers;
- popup menu frame pumborder with scrollbar.
Lua API:
- new types vim.Pos and vim.Range for handling positions and ranges, conversion between position formats of cursor, extmark, Vim, and LSP;
- vim.list.bisect, vim.list.unique;
- Iter:unique, Iter:peek and Iter:skip for non-list iterators;
- vim.wait returns callback results;
- vim.json.encode supports pretty-print and sort_keys;
- parameter behavior as a function for tbl_extend and tbl_deep_extend;
- new module vim._async.
Diagnostics:
- diagnostic.status with custom formatting and highlighting;
- filter enabled, format option for setloclist/setqflist;
- Callback on_jump;
- jumping to related information from open_float;
- overlapping highlights DiagnosticUnnecessary and DiagnosticDeprecated.
Treesitter:
- Markdown highlighting enabled by default;
- incremental highlighting based on Treesitter.
Other changes:
- :wall ++p creates parent directories for each buffer;
- exrc searches for configuration files in parent directories with mandatory confirmation via :trust;
- :source can execute Lua blocks and Treesitter injections;
- nvim_open_tabpage — API for programmatically creating tabs;
- nvim_set_hl with update parameter updates individual highlight attributes without overwriting others;
- style bold and custom symbols in winborder;
- disabling the tracker blocking statusline in floating windows;
- renaming .nvimlog to nvim.log;
- highlighting active tabstop in snippets;
- Built-in runtime for undotree;
- shelltemp=false by default;
- Spellfile stored in stdpath data;
- maximum search results increased to 999;
- SSH configuration parser;
- synchronized output in terminal (mode 2026);
- terminal shows exit code via virtual text.
Neovim 0.12.1:
Correction release from April 6, 2026, with 26 bug fixes and one new feature — :restart reconnects all UIs. Among important fixes:
- :restart: inheritance of stderr on Unix, correct handling —headless;
- LSP: re-request codeLens refresh, preview snippets, reset document color version;
- ui2: flickering on entering pager, incorrect buffer links, spill indicator update;
- Treesitter: highlighting with unicode characters at the end of the node;
- vim.net: handling archived URLs via tar/zip;
- vim.pack: using uv.available_parallelism to calculate the number of threads;
- Vim security patches: bypassing security model via modeline, path bypass in zip.vim;
- Optimization of vim.pos: using nvim_buf_line_count instead of loading all lines.
Source: linux.org.ru
