News
Nvim :help pages, generated
from source
using the tree-sitter-vimdoc parser.
Notable changes since Nvim 0.11
For changes in the previous release, see
news-0.11.
====== Remove this section before release. ======
The following changes to UNRELEASED features were made during the development
cycle (Nvim HEAD, the "master" branch).
EVENTS
EXPERIMENTS
LSP
OPTIONS
TREESITTER
UI
progress attribute removed form
ui-messages msg_show event
These changes may require adaptations in your config or plugins.
API
Decoration provider has on_range() callback.
BUILD
DIAGNOSTICS
EDITOR
i_CTRL-R inserts named/clipboard registers (A-Z,a-z,0-9+) literally, like
pasting instead of like user input. Improves performance, avoids broken
formatting. To get the old behavior you can use
<C-R>=@x.
EVENTS
ui-messages no longer emits the
msg_show.return_prompt, and
msg_history_clear events. The
msg_clear event was repurposed and is now
emitted after the screen is cleared. These events arbitrarily assumed a
message UI that mimics the legacy message grid. Benefit: reduced UI event
traffic and more flexibility for UIs.
The
msg_history_show event has an additional "prev_cmd" argument.
HIGHLIGHTS
LSP
JSON "null" values in LSP messages are represented as
vim.NIL instead of
nil.
Missing fields (as opposed to JSON "null") are still represented as
nil.
Renamed vim.lsp.semantic_tokens start()/stop() to enable().
Values < 0 are now treated as nil instead of 0.
Values outside the range of signatures[activeSignature].parameters
are now treated as nil instead of #signatures[activeSignature].parameters
LUA
Renamed vim.diff to vim.text.diff.
OPTIONS
PLUGINS
Removed "shellmenu" plugin, an old menu-based quasi-snippet plugin for shell scripts.
TREESITTER
treesitter-directive-offset! can now be applied to quantified captures. It
no longer sets
metadata[capture_id].range; it instead sets
metadata[capture_id].offset. The offset will be applied in
vim.treesitter.get_range(), which should be preferred over reading
metadata directly for retrieving node ranges.
TUI
VIMSCRIPT
The following new features were added.
API
api-contract allows existing functions to change return-type fromvoid =>
non-void`.
nvim_win_text_height() can limit the lines checked when a certain
max_height is reached, and returns the
end_row and
end_vcol for which
max_height or the calculated height is reached.
vim.secure.read() now returns
true for trusted directories. Previously
it would return
nil, which made it impossible to tell if the directory was
actually trusted.
nvim_ui_send() writes arbitrary data to a UI's stdout. Use this to write
escape sequences to the terminal when Nvim is running in the
TUI.
BUILD
A Zig-based build system has been added as an alternative to CMake. It is
currently limited in functionality, and CMake remains the recommended option
for the time being.
Nvim can be built without Unibilium (terminfo implementation), in which case
the user's terminfo database won't be loaded and only internal definitions
for the most common terminals are used.
make distclean && make CMAKE_EXTRA_FLAGS="-DENABLE_UNIBILIUM=0" BUNDLED_CMAKE_FLAG="-DUSE_BUNDLED_UNIBILIUM=0"
DEFAULTS
'diffopt' default value now includes "indent-heuristic" and "inline:char".
'statusline' default is exposed as a statusline expression (previously it
was implemented as an internal C routine).
Project-local configuration (
'exrc') is also loaded from parent directories.
Unset
'exrc' to stop further search.
Mappings:
DIAGNOSTICS
EDITOR
:retab accepts new optional parameter -indentonly to only change leading
whitespace in indented lines.
:uniq deduplicates text in the current buffer.
Setting "'0" in
'shada' prevents storing the jumplist in the shada file.
'shada' now correctly respects "/0" and "f0".
prompt-buffer supports multiline input/paste, undo/redo, and o/O normal
commands.
For security,
'exrc' no longer shows an "(a)llow" choice. Instead you must
"(v)iew" then run
:trust.
gx in help buffers opens the online documentation for the tag under the
cursor.
:wall permits a
++p option for creating parent directories when writing
changed buffers.
The
:DiffTool command compares directories (and files).
EVENTS
A new empty message kind is emitted for an empty (e.g. :echo "") message.
'rulerformat' is emitted as
msg_ruler when not part of the statusline.
HIGHLIGHTS
LSP
The textDocument/diagnostic request now includes the previous id in its
parameters.
vim.lsp.enable() start/stops clients as necessary. And detaches
non-applicable LSP clients.
Incremental selection is now supported via textDocument/selectionRange.
an selects outwards and in selects inwards.
Support for multiline semantic tokens.
Support for the disabled field on code actions.
The function form of cmd in a vim.lsp.Config or vim.lsp.ClientConfig
receives the resolved config as the second arg: cmd(dispatchers, config).
Support for annotated text edits.
:checkhealth vim.lsp is now available to check which buffers the active LSP features are attached to.
LSP
DiagnosticRelatedInformation is now shown in
vim.diagnostic.open_float(). It is read from the LSP diagnostic object
stored in the
user_data field.
When inside the float created by
vim.diagnostic.open_float() and the
cursor is on a line with
DiagnosticRelatedInformation,
gf can be used to
jump to the problematic location.
Client:stop() now accepts a numerical
force argument to be interpreted as the time to wait
before forcing the shutdown.
LUA
Lua type annotations for vim.uv.
Experimental vim.pos and vim.range for Position/Range abstraction.
OPTIONS
'autowriteall' writes all buffers upon receiving
SIGHUP,
SIGQUIT or
SIGTSTP.
"F{func}" complete using given function
'complete' allows limiting matches for sources using "{flag}^<limit>".
'completeopt' flag "nearest" sorts completion results by distance to cursor.
'diffopt' inline: configures diff highlighting for changes within a line.
g:clipboard accepts a string name to force any builtin clipboard tool.
'busy' sets a buffer "busy" status. Indicated in the default statusline.
vim.glob.to_lpeg() uses a new LPeg-based implementation (Peglob) that
provides ~50% speedup for complex patterns. The implementation restores
support for nested braces and follows LSP 3.17 specification with
additional constraints for improved correctness and resistance to
backtracking edge cases.
i_CTRL-R inserts named/clipboard registers literally, 10x speedup.
PLUGINS
Customize :checkhealth by handling a
FileType checkhealth event.
health-usage
Simplify Python provider setup to a single step:
uv tool install pynvim
Nvim will detect the plugin's location without user configuration, even if
unrelated Python virtual environments are activated.
provider-python
STARTUP
TERMINAL
nvim_open_term() can be called with a non-empty buffer. The buffer
contents are piped to the PTY and displayed as terminal output.
TREESITTER
:EditQuery command gained tab-completion, works with injected languages.
TUI
Native progress bars are displayed for
Progress events using the OSC 9;4
sequence.
UI
:restart restarts Nvim and reattaches the current UI.
:connect dynamically connects the current UI to the server at the given
address.
:checkhealth shows a summary in the header for every healthcheck.
ui-multigrid provides composition information and absolute coordinates.
vim._extui provides an experimental commandline and message UI intended to
replace the message grid in the TUI.
Error messages are more concise:
"Error detected while processing:" changed to "Error in:".
"Error executing Lua:" changed to "Lua:".
'busy' status is shown in default statusline with symbol ◐
Improved LSP signature help rendering.
Multigrid UIs can call nvim_input_mouse with grid 0 to let Nvim decide the grid.
VIMSCRIPT
chdir() allows optionally specifying a scope argument.
These existing features changed their behavior.
'pumblend' does not apply special attributes (bold, underline) from the
background layer to the foreground layer.
gv works in operator pending mode and does not abort.
'spellfile' location defaults to
stdpath("data").."/site/spell/" instead of
the first writable directory in
'runtimepath'.
$VIM and
$VIMRUNTIME no longer check for Vim version-specific runtime
directory
vim{number} (e.g.
vim82).
These deprecated features were removed.