News

Nvim :help pages, generated from source using the tree-sitter-vimdoc parser.


Notable changes since Nvim 0.12
For changes in the previous release, see news-0.12.

BREAKING CHANGES IN HEAD OR EXPERIMENTAL news-breaking-dev

====== Remove this section before release. ======
The following changes to UNRELEASED features were made during the development cycle (Nvim HEAD, the "master" branch).

EVENTS

todo

EXPERIMENTS

todo

LSP

todo

LUA

vim.pos, vim.range always require the buf parameter.
range.cursor() and range.to_cursor() are removed. Use range.mark() and range.to_mark() instead.

DIAGNOSTICS

todo

OPTIONS

todo

TREESITTER

todo

UI

todo

VIMSCRIPT

todo

BREAKING CHANGES news-breaking

These changes may require adaptations in your config or plugins.

API

nvim_create_autocmd(), nvim_exec_autocmds() and nvim_clear_autocmds() no longer treat an empty non-nil pattern as nil.
nvim_clear_autocmds() no longer treats an empty array event as nil.
ui-messages msg_show.bufwrite and msg_show.completion messages are now msg_show.progress events.

DIAGNOSTICS

vim.diagnostic.Opts.Status.format no longer accepts the table mapping from severity to text. Use vim.diagnostic.Opts.Signs.text instead.

EDITOR

On Windows, the trust db now stores paths with "/" slashes. This means the trust store will be reset.
stdpath("log") moved to stdpath("state")/logs.

EVENTS

BufModifiedSet has been removed. Use the OptionSet event with pattern "modified" instead.

LSP

client.attached_buffers[buf] now stores languageId string (was boolean).

LUA

"standalone" Lua interpreter mode nvim -ll was removed. Use -l script mode instead.

OPTIONS

todo

PLUGINS

todo

TREESITTER

todo

NEW FEATURES news-features

The following new features were added.

API

nvim_buf_call() and nvim_win_call() now preserve multiple return values.
nvim_set_hl() supports "font" key.
nvim_open_win() zindex controls whether the UI will use a dimmed cursor shape when an unfocused float is on top of the cursor.
nvim_echo() distinguishes zero percent from omitted percent for Progress events.
nvim_create_user_command() accepts desc for Vimscript commands.
Support for tabpage-local options ('cmdheight'):

BUILD

Building using "zig build" requires zig 0.16.x.
zig build: "-Dcross" option was removed. Often cross-compilation is now detected, so e.g. from a linux host
zig build -Dtarget=aarch64-macos
will automatically compile a host Lua for use during build.
The new "-Dhost={target_string}" option can be used to override the used host. use "-Dhost=native" to force cross-compiling or "-Dhost=" (empty string) to assume that target binaries can run on the host during the build process (e.g. if target is x86 on a x86_64 system, or if emulation set up with binfmt or similar)

DEFAULTS

todo

DIAGNOSTICS

vim.diagnostic.status() uses the severity names defined by the signs field of vim.diagnostic.config(), if any.

EDITOR

:command-completion-customlist can return a list of dictionaries with kind/menu/info/abbr for the popup menu.
gf and <cfile> support file://… URIs.
:log opens log files.
ZR restarts Nvim (:restart).
:uptime displays uptime.
:packupdate and :packdel for managing vim.pack.
'scrollback' is now also valid in prompt-buffer buffers to limit the number of history lines kept above the prompt.
v_al and v_il text objects select the whole buffer and the current line without leading or trailing white space.

EVENTS

:delmarks now triggers the MarkSet autocommand with line==col==0, same as nvim_buf_del_mark()
TextPutPre and TextPutPost are triggered before/after putting text.
TabMoved is triggered when tabs are reordered.

HIGHLIGHTS

Dimmed for text that should be de-emphasized.
vim.hl.hl_op() highlights text regions for TextYankPost and TextPutPost events. It replaces the now deprecated vim.hl.on_yank().

LSP

LSP capabilities:
:checkhealth vim.lsp highlights the "current buffer".
Support for nested snippets.

LUA

vim.ui.img can display images. Use :checkhealth img to confirm your terminal supports it.
vim.net.request() can specify custom headers by passing opts.headers.
vim.net.request() can now accept method param overload for multiple HTTP methods.
writefile() treats Lua strings as "blob", so it can be used to write binary data.
vim.filetype.inspect() returns a copy of the internal tables used for filetype detection.
Added __eq metamethod to vim.VersionRange. 2 distinct but representing the same range instances now compare equal.
Documentation for vim.fn now points to preferred Lua alternatives when available.
vim.list.unique() and vim.list.bisect() now support passing a string as a shorthand of a key
vim.isnil() tests if a value is nil or vim.NIL.
vim.nonnil() returns the first argument which is not nil.
vim.npcall() calls the function fn in protected-mode like pcall(), but returns nil on error.
vim.pos can now convert between positions and buffer offsets.
vim.pos and vim.range can now convert between mark positions.
vim.ui.input() now allows setting input scope.
vim.log provides a logging interface.
vim.pack.get() output includes revision of a pending update.
vim.pack.get() can fetch new updates before computing the output.

OPTIONS

'ttyfast' can be disabled during startup by setting $NVIM_NOTTYFAST.
'scrolloffpad' allows vertically centering cursor at the end of file.
'shortmess' flag shm-u silences undo/redo messages.
'statusline' supports stl-%0{ to insert the expression result verbatim.
'winpinned' prevents window from closing unless specifically targeted.

PERFORMANCE

treesitter-highlight performance on large injection-heavy files improves by 50% to 100% by reusing edited child-tree ranges.
Nvim architecture allows pure-Lua implementations of some vim.fn functions, which skips the Vimscript <=> Lua "bridge" (no data conversion/marshalling) entirely, if the vim.fn function is called from Lua.
Internal LSP data is cleared using table.clear, which reduces GC and memory reallocation during each data reset.
RPC client avoids string allocations when parsing Content-Length messages.

PLUGINS

provider: add bun support for Node.js plugins

STARTUP

todo

TERMINAL

todo

TREESITTER

v_]N v_[N expand selection to sibling treesitter node.
treesitter-highlight-conceal can be removed by adding a @noconceal capture.
vim.treesitter.select() starts or adjusts a visual selection at cursor, based on tree nodes.

TUI

The TUI will re-query the terminal's background color when resuming from a suspended state, and Nvim will update 'background' accordingly.
User can override the builtin "terminfo" via $NVIM_TERMDEFS. This is similar to Vim's t_xx options.

UI

:checkhealth shows filewatcher info in the Performance section.
These builtin "picker" menus delegate to vim.ui.select():
:browse oldfiles
z= (spell suggest)

VIMSCRIPT

v:exitreason is set before QuitPre.
v:starttime is the process start time (nanoseconds since UNIX epoch).
v:useractive indicates user activity.
serverlist() with info=true returns details for each server (own + peers).

CHANGED FEATURES news-changed

These existing features changed their behavior.
nvim_exec_autocmds({buf=…}) runs in the context of the target buffer.
OptionSet is no longer triggered during startup by automatic 'background' detection.
:Open with no arguments uses the current file.
The "buffer" key was renamed to "buf" in these functions (but the old name "buffer" is still accepted, for backwards compatibility):
vim.keymap.set() and vim.keymap.del() accept a list of strings for lhs.

REMOVED FEATURES news-removed

These deprecated features were removed.

DEPRECATIONS news-deprecations

Main
Commands index
Quick reference