Notable changes since Nvim 0.12
Rustvim :help pages, generated
from source
using the tree-sitter-vimdoc parser.
For changes in the previous release, see news-0.12.
BREAKING CHANGES IN HEAD OR EXPERIMENTAL
====== 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.
pos.to_cursor() returns a (
row, col) tuple
instead of returning them as separate values.
Renamed current_level param of vim.log.new().
vim.opt.{option}:get() has improved structure for dict-like options.
Some shapes changed:
"key:value" list options (e.g. 'diffopt', 'mousescroll') return a map
{ key = value } instead of an array of "key:value" strings.
The
,, literal-comma convention (e.g. 'isfname') is not reconstructed in
the structured view; the raw string value is unchanged.
Backslashes are not supported in URIs/URLs. E.g. "http:\\host" is treated as
a filepath, not a URL, in buffer names, gf, etc.
vim.uri.to_fname() returns "/" separators (also on Windows), drops the URI
query, and converts a URI host to a UNC path ("file://server/share" =>
"//server/share").
DIAGNOSTICS
todo
OPTIONS
When ui2 is enabled, since the ruler is no longer a left-aligned box of
fixed width, there is no longer an inconsistent special handling of item
groups in 'rulerformat' to configure that fixed width. An old-style left-
aligned fixed-width ruler can now be achieved by using item groups exactly
as they are documented, e.g.
%-20.20(...%).
TREESITTER
todo
UI
Healthchecks for vim.ui.img were moved to
:checkhealth vim.health.
ui2 messages pager no longer uses
<CR> by default; use g< or set
'messagesopt' "pager", e.g. :set messagesopt+=pager:<CR>.
ui2
cfg.pager_char and cfg.msg.msg.timeout were replaced by the
'messagesopt' items "pager" and "timeout".
VIMSCRIPT
todo
BREAKING CHANGES
These changes may require adaptations in your config or plugins.
API
API results containing a Lua function reference (e.g. a "callback" reported
by nvim_get_keymap() or nvim_get_autocmds(), or a "callback" option
value) are serialized over RPC as a human-readable
"<Lua …>" hint string,
instead of nil.
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.
Security: TUI, --remote-ui and --remote reject server-to-client API
calls by default. Only UI events are allowed.
DIAGNOSTICS
vim.diagnostic.Opts.Status.format no longer accepts the table mapping
from severity to text. Use vim.diagnostic.Opts.Signs.text instead.
current_line property of vim.diagnostic.Opts.VirtualLines and
vim.diagnostic.Opts.VirtualText is now applied on CursorHold event.
Make sure your 'updatetime' is reasonable.
EDITOR
Interactive Ex-mode (:exmode,
nvim -e) is a persistent cmdwin. This is much
more flexible and makes "Ex mode" more useful as a kind of "cmdline REPL",
with the tradeoff of dropping some POSIX Ex-mode quirks.
Ex mode is entered with "1q:" or :exmode, not "gQ".
":global/pat/visual" no longer switches to Normal mode per matching line.
Non-interactive Ex-mode (-es, "script mode") executes stdin as Ex commands
directly. It is a "script host", not "POSIX Ex mode".
Output ends with a final newline.
:visual is :edit: it does not switch to reading stdin as Normal-mode
commands, and ":global/pat/visual" does not enter Normal mode per
matching line.
Commands that wait for typed input (input(), getchar(), …) stop Nvim
at end-of-input instead of consuming the next stdin line.
An empty line is a no-op instead of advancing the cursor (or failing
with E501 at end-of-file).
On Windows, the trust db now stores paths with "/" slashes. This means the
trust store will be reset (one time).
stdpath("log") moved to stdpath("state")/logs.
After a motion forced blockwise (o_CTRL-V), '] is on the last column
of the block: "g@<C-v>l" gives 'operatorfunc' the block that "y<C-v>l"
yanks.
":connect!" (with bang "!") was removed.
Only supports one "cmdline level", not "infinite recursion".
ins-repeat replays the full Insert session, including cursor-moves.
Undo and quote. still restart at each cursor-move. Use i_CTRL-O to get
the old behavior:
inoremap <Left> <C-o><Left>
inoremap <Right> <C-o><Right>
visual-repeat is "semantic" instead of "fixed-size". See
visual-fixed-size if you prefer Vim's "fixed-size" Visual-repeat.
Q adds a multicursor instead of replaying the last recorded register.
To get the old behavior:
vim.keymap.set('n', 'Q', function()
local reg = vim.fn.reg_recorded()
return reg == '' and '' or ('@' .. reg)
end, { expr = true })
EVENTS
vim.on_key() callbacks are not invoked for keys consumed by getchar().
BufModifiedSet has been removed. Use the OptionSet event with pattern
"modified" instead.
LSP
vim.lsp.ClientConfig.cmd given as a string array now uses
vim.lsp.ClientConfig.root_dir as its default process working directory.
client.attached_buffers[buf] now stores languageId string (was boolean).
LUA
"standalone" Lua interpreter mode
nvim -ll was removed. Use -l script
mode instead.
vim.opt no longer supports chaining multiple infix operators (e.g.
vim.opt.wildignore + '*.o' + '*.obj'). Instead, use tables:
vim.opt.wildignore + {'*.o', '*.obj'}
OPTIONS
The 'statusline'
%= item is no longer ignored in item groups. It applies
to the containing item group and its minwid.
An %< item inside an item group now only applies to the containing group
and its maxwid. Therefore, multiple %< can now be effective.
The default truncation of item groups is now at the first contained item.
To restore the previous truncation from the left, add a %< to the start.
The same applies to 'rulerformat', 'statuscolumn', 'tabline', 'winbar',
'titlestring', and 'iconstring'.
'rulerformat' can no longer be set empty, the new default expression will be
restored instead.
PLUGINS
todo
TREESITTER
todo
UI
The bottom right cell of the screen is no longer left empty when the ruler
is shown. This was originally intended to prevent unwanted scrolling on
quirky terminals.
VIMSCRIPT
Removed: ctxget(), ctxpop(), ctxpush(), ctxset(), ctxsize(). Use
nvim_get_context() and nvim_load_context() instead.
NEW FEATURES
The following new features were added.
API
nvim_win_resize() resizes a window with a specified anchor edge.
nvim_win_set_height() and nvim_win_set_width() are now deprecated.
api-contract treats
opts and any parameters thereafter, as optional
(equivalent to passing an empty dict). Clients may omit such optional
parameters.
The Lua vim.api bridge is also a "client" and thus may omit
opts and
any following parameters:-- Before:
vim.print(vim.api.nvim_get_mark('A', {}))
-- After:
vim.print(vim.api.nvim_get_mark('A'))
nvim_buf_call() and nvim_win_call() now preserve multiple return values.
nvim_del_keymap(), nvim_buf_del_keymap() and vim.keymap.del() can
match only
{lhs}, not {rhs}, with opts.lhs=true.
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'):
nvim_buf_set_extmark()
virt_lines_overflow accepts "wrap" to enable
wrapping onto extra rows and "auto" which enables horizontal scrolling when
'nowrap' is set and wrapping when 'wrap' is set.
nvim_buf_set_extmark()
virt_lines can extend the last hl in each virt_line
till the end of the line.
nvim_set_option_value() accepts a new
operation field to modify the
existing option value.
nvim_set_option_value() returns the new option value.
nvim_create_autocmd() is now api-fast, so it can be called from a fast
event context (e.g. vim.uv callbacks).
nvim_chan_set() sets channel properties.
detach=false enables Nvim "self-exit on channel-close" behavior.
trust=false rejects API calls from an untrusted peer. Also supported by
sockconnect().
addr stores the address the client uses to reach Nvim (e.g. a tunnel),
which may differ from v:servername. :restart reconnects UIs through it.
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-macoswill automatically compile a host Lua for use during build.
zig 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).
zig build: Nvim can now be built to produce a WebAssembly binary via
"-Dtarget=wasm32-emscripten", which can run inside a web browser. A basic
browser-based demo for running it is also included. Still very
experimental.
DEFAULTS
'rulerformat' default is exposed as a statusline expression (previously it
was implemented as an internal C routine).
Default 'statusline' shows the hostname (hl-StatusLineRemote) if Nvim runs
in an SSH session, e.g. remote-ssh.
'termpastefilter' no longer removes TAB chars ("HT") when pasting into
:terminal.
DIAGNOSTICS
vim.diagnostic.status() uses the severity names defined by the
signs
field of vim.diagnostic.config(), if any.
virtual_lines.overflow in vim.diagnostic.config() controls
how virtual lines wider than the window are displayed.
EDITOR
Multiple cursors (multicursor): edit in many places at once.
zq places cursors at all targets of a motion.
:command-completion-customlist can return a list of dictionaries with
kind/menu/info/abbr for the popup menu.
cmdwin (q:, q/, q?, c_CTRL-F) is implemented as a "normal"
buffer+window instead of a nested-state modal loop:
You can create/navigate windows/tabpages while cmdwin is active. Chaos!
'inccommand' works in cmdwin!
API calls (e.g. nvim_buf_delete()) that previously failed with
"E11: Invalid in command-line window" while cmdwin was open, now work
normally. Async plugins no longer need special CmdwinLeave workarounds.
The cmdwin-char is shown via 'statuscolumn'.
:help files can contain tables, see help-table. Example:
supported-platforms (https://neovim.io/doc/user/support/#supported-platforms).
:help documentation is available as PDF via:
https://neovim.io/doc/user/nvim-help.pdf
:log opens log files.
:marks gained tab-completion.
:restart saves/restores the current session (window layout, buffers, …).
:restart! (with a bang "!") does not save/restore the session.
:connect without arguments shows a menu of known servers and ssh hosts.
:connect stops the current server if no other UI is attached, or fails if
:qall would fail (unsaved changes). ":connect!" (with bang "!") was removed.
:detach with range "%" detaches all UIs except the current one.
:detach! (with bang "!") marks the current UI as detachable: Nvim will
continue running if the UI disconnects unexpectedly (e.g. if you
accidentally close your terminal, ssh connection lost, etc.).
Use :connect to reattach.
:uptime displays uptime.
'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.
'autoread' uses file system watchers to detect external changes in
real-time, instead of only on FocusGained or :checktime.
undo restores the cursor to its original position ("diw", "atest<Esc>",
"d^", …), instead of jumping to the start of the changed text.
undo no longer restores the old (wrong) position of a mark that you moved
(m, :mark) later. The mark shifts with the text it was moved to, the
same as a mark the change never touched.
Multibyte characters, translated by 'langmap', now invoke correct
mappings.
Example:
set langmap=õ]
Typing õõ in Normal-mode now invokes a mapping bound to ]].
New complete-items field "commit_chars": characters that accept the
selected completion item when typed.
EVENTS
The hit-enter prompt processes events (vim.schedule() callbacks, timers,
RPC requests) while waiting, like getchar(), so nvim_get_mode() reports
blocking=false. Redrawing is postponed until the prompt is dismissed.
ChanClose is triggered after a channel is closed, before it is removed.
CmdAtom fires after each atomic user action (motion, mapping, operator,
insert session, visual, Ex command, …).
SessionWritePre event emits just before :mksession.
TextPutPre and TextPutPost are triggered before/after putting text.
TabMoved is triggered when tabs are reordered.
DirReadPost is triggered after each dir listing is rendered, so it can
be sorted or filtered. See dir-render.
CTRL-C sends SIGINT to ":!" and "system()" child processes (before
escalating to SIGTERM/SIGKILL, as usual).
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:
Completion supports
CompletionItem.preselect if 'completeopt' has
"preselect". https://microsoft.github.io/language-server-protocol/specification/#completionClientCapabilities
textDocument/foldingRange vim.lsp.foldtext() highlights collapsed text.
https://microsoft.github.io/language-server-protocol/specification/#textDocument_foldingRange
Completion supports
CompletionList.applyKind: a server can ask for
commitCharacters and data from itemDefaults to be merged with the
item's own values instead of replacing them.
https://microsoft.github.io/language-server-protocol/specification/#completionItemApplyKinds
Completion supports a
completionProvider registered with
client/registerCapability instead of declared at initialize. Nvim does
not advertise completion.dynamicRegistration by default; set it in
vim.lsp.Config capabilities to opt in.
https://microsoft.github.io/language-server-protocol/specification/#client_registerCapability
:checkhealth vim.lsp highlights the "current buffer".
vim.lsp.buf.declaration(), vim.lsp.buf.definition(),
vim.lsp.buf.type_definition(), and vim.lsp.buf.implementation()
now follows 'switchbuf'.
vim.lsp.buf.declaration(), vim.lsp.buf.definition(),
vim.lsp.buf.type_definition(), and vim.lsp.buf.implementation()
now supports passing arbitrary positions.
Support for nested snippets.
lsp-completion supports
commitCharacters: typing a commit character
while a completion item is selected accepts the item as with
complete_CTRL-Y, then inserts the character. Previously
commitCharacters had no effect.
vim.lsp.formatexpr() now falls back to
textDocument/formatting if the whole
buffer is being formatted and the language server doesn't support
textDocument/rangeFormatting.
vim.lsp.buf.format() respects an explicit
timeout_ms with async=true.
The timeout applies per client. Async requests have no timeout when the
option is omitted.
Support for
workspace/foldingRange/refresh:
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#workspace_foldingRange_refresh
vim.lsp.completion.get() accepts a
client_id to request from only the
given clients.
LUA
CTRL-C during SystemObj:wait() fails with "interrupted" (and stops the
process) instead of returning a "timeout" (code 124) result.
lua-async:
vim.async provides structured concurrency primitives for Lua
code, including task handles, await helpers, cooperative cancellation,
completion-order iteration, and semaphores.
vim.inspect_pos() and vim.show_pos() support byte ranges with
end_row
and end_col. :Inspect accepts line ranges, including Visual selections.
vim.ui.img can display images. Use
:checkhealth vim.health 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.
vim.net.request() works with vim.async.await(): closing the task cancels
the request.
vim.rpcrequest() can specify
opts.timeout.
SystemObj:wait() accepts a
cond predicate which allows you to wait for
a condition instead of process termination.
SystemObj:close() stops the process. Closing a vim.async task that
awaits vim.system() stops the process.
When stopping a process, vim.system() SystemObj:wait() sends SIGTERM,
then escalates to SIGKILL after 2s. Once it exits, its output ends, even if
a descendant process keeps the pipes open.
writefile() treats Lua and RPC strings as Blob, so it can be used to
write binary data.
vim.fs.dir() with
opts.err=true, reports errors. An inaccessible root
dir yields a single (name, nil, err) item.
vim.fs.dir() gained a
plain parameter.
vim.fs.find() returns a list of errors as its second return value.
vim.fs.mkdir() creates directories, including parent directories with
opts.parents=true.
vim.fs.slug() generates a filesystem-safe file name from an arbitrary
identity string, with an optional length bound.
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.nonnil() returns the first argument which is not nil.
vim.pos can now convert between positions and buffer offsets.
vim.pos.cursor() without arguments returns the cursor position of the
current window.
vim.ui.input() now allows setting input scope.
vim.uri is a module. The old
uri_xx top-level functions were renamed,
e.g. vim.uri_to_fname() is now vim.uri.to_fname().
Check equality with vim.uri.normalize().
Parse/build querystrings with vim.uri.encode_query() and
vim.uri.decode_query().
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.
vim.pack supports vim.pack-manifest of plugins.
vim.o now accepts table style values for assignment.
vim.keycode() returns structured info as return value 2.
Iter:count() counts items in the iterator.
OPTIONS
Lua functions/closures can be assigned to "func" and "expr" options:
option-value-function (e.g.
vim.o.operatorfunc), expr-option-function
(e.g. vim.wo.foldexpr, vim.bo.indentexpr). Reading such an option:
...from Lua, gets the function itself.
...from Vimscript/RPC, gets a human-readable
"<Lua …>" hint string.
'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.
The
%= item is supported within item groups to separate alignment sections
within the containing group until its minwid is reached. The truncation
of an item group to its maxwid can be controlled with the %< item.
The new %#(...%#) item denotes a highlight scope.
The same applies to 'rulerformat', 'statuscolumn', 'tabline', 'winbar',
'titlestring', and 'iconstring'.
'winpinned' prevents window from closing unless specifically targeted.
'packlockfile' sets the path used for vim.pack-lockfile.
'previewpopup' decides how the preview window is displayed.
'messagesopt' items "pager" and "timeout" configure the ui2 message pager
key and how long a message stays in the message window.
'completeopt' takes the new value "pathopt" to make the file name completion
consult the 'path' option i_CTRL-X_CTRL-F.
'wrap' is now conceal-aware: lines wrap at their extmark-concealed width
(nvim_buf_set_extmark()
conceal, treesitter-highlight-conceal). The
cursor, screenpos(), wincol() and mouse follow the reflowed layout.
PERFORMANCE
If :write or :edit is slow it emits
msg_show.progress events.
LSP shares identical file watcher registrations, reducing startup work in
large workspaces. On macOS and Windows, watchers with different glob
patterns share one native watcher per directory, which reduces cleanup work
on shutdown.
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.
LSP: "overscan" semantic_token range requests to avoid flicker.
vim.hl.range() and vim.hl.hl_op() are faster for large characterwise and
linewise regions.
The display of multibyte text with grapheme clusters has been optimized,
by calculating byte length and cell width of clusters in a single loop.
PLUGINS
provider: add bun support for Node.js plugins
STARTUP
Prompts during exiting without a UI, or after a deadly signal, are
dismissed instead of waiting (indefinitely).
--embed with --listen waits for a UI on the listen address if stdin is
not a pipe (e.g. tty or /dev/null), instead of exiting.
A damaged shada file (e.g. truncated by a crash) is repaired on the next
write and keeps any valid entries. shada-error-handling
TERMINAL
todo
TREESITTER
vim.treesitter.get_captures() returns highlight captures at a given position,
on a whole line, or overlapping a range. It replaces
vim.treesitter.get_captures_at_pos().
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.
The
diff treesitter parser is bundled.
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.
Floating window border highlights (hl-FloatBorder, hl-FloatTitle,
hl-FloatFooter) combine with the window-local hl-Normal background
instead of falling back to the global background.
These builtin "picker" menus delegate to vim.ui.select():
:browse oldfiles
z= (spell suggest)
The ui2 dialog window scrolls with the mouse wheel, by 'mousescroll'
lines.
VIMSCRIPT
fnamemodify(':h') preserves logical roots for more path formats.
v:exitreason is set before QuitPre.
v:startreason indicates whether Nvim started normally or by :restart.
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).
These Vimscript functions may be called from api-fast context (e.g.
vim.uv timer/handle callbacks): getenv(), keytrans(), char2nr(),
nr2char(), str2list(), strpart(), strcharpart(), strgetchar(),
strchars(), strcharlen(), strlen(), strdisplaywidth(), byteidx(),
charidx(), utf16idx(), tr(), trim().
CHANGED FEATURES
These existing features changed their behavior.
Environment variable name (
$NAME) validity is no longer controlled by
'isident'.
nvim_exec_autocmds({buf=…}) runs in the context of the target buffer.
SessionLoadPost is no longer included in views saved by :mkview.
OptionSet is no longer triggered during startup by automatic
'background' detection.
Editing a local directory now shows its contents in a
filetype=directory
buffer. See dir.
: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):
'statuscolumn' click function labels can be different across rows.
v:virtnum and v:lnum are available during the click function callback.
Markdown inline highlighting now conceals the backslash in backslash escapes.
Markdown inline backslash escapes and hard line breaks no longer use the
@string.escape capture.
vim.lsp.util.open_floating_preview() windows (e.g. vim.lsp.buf.hover())
converted to normal windows (e.g. with CTRL-W_H) are no longer closed
automatically.
vim.fs.normalize()
opts.expand_env=false key was renamed to
opts.plain=true and now does not expand leading tildes ("~") in addition
to environment variables ("expand_env" is still accepted, for backwards
compatibility).
vim.fs.abspath() returns URLs (e.g. "fugitive:///a") as-is, so
vim.filetype.add() functions receive URI buffer names unchanged.
vim.uri.from_fname() resolves relative paths to absolute paths, and
converts UNC paths.
:helptags finds help tags with the "vimdoc" treesitter parser (and thus
requires it to be installed).
:helptags ALL reports E152 for "doc" directories it cannot write,
instead of silently skipping them.
The highlighting groups hl-CursorLineFold and hl-CursorLineSign are
always used when 'cursorline' is set.
vim.lsp.util.apply_text_edits() accepts
opts.keep_cursor, to hold the
cursor on the text it is on while edits move around it.
'tagfunc' is now also used for :tag completion.
Some character clusters are restored to occupy two cells like they
did prior to Nvim 0.11. These include Thai syllables like สำ and
half-width Katakana with voicing marks ガ. The TUI renders these in
a safe way which also supports terminals which consider these to be
single-width.
in script mode -l, print() now behaves more similar to standalone
lua. Printing is done to stdout, and empty lines are not stripped.
No translation of special characters is done, so escape sequences
can be used when printing to a terminal.
It is no longer allowed to change the window layout during a DiffUpdated
autocommand.
REMOVED FEATURES
These deprecated features were removed.
Vimscript functions ctxget(), ctxpop(), ctxpush(), ctxset(), ctxsize()
and the "context stack". Use nvim_get_context() and nvim_load_context()
with a script-owned list instead.
vim.lsp.buf.declaration(), vim.lsp.buf.definition(),
vim.lsp.buf.type_definition(), and vim.lsp.buf.implementation()
no longer accept the
reuse_win option.
DEPRECATIONS
See deprecated-0.13.