*news.txt*    Nvim


                            NVIM REFERENCE MANUAL


Notable changes since Nvim 0.11                                 *news*

For changes in the previous release, see |news-0.11|.

                                       Type |gO| to see the table of contents.

==============================================================================
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

• Renamed "nvim.find_exrc" |default-autocmds| group to "nvim.exrc".

EXPERIMENTS

• todo

LSP

• |vim.lsp.buf.selection_range()| now accepts an integer which specifies its
  direction, rather than a string `'outer'` or `'inner'`.

OPTIONS

• `'completefuzzycollect'` and `'isexpand'` have been removed.

TREESITTER

• todo

UI

• `progress` attribute removed from |ui-messages| msg_show event

VIMSCRIPT

• `complete_match()` has been removed.

==============================================================================
BREAKING CHANGES                                                *news-breaking*

These changes may require adaptations in your config or plugins.

API

• Decoration provider has `on_range()` callback.
• |nvim_get_commands()| returns `complete` as a Lua function, if it was
  defined as such.

BUILD

• todo

DIAGNOSTICS

• |diagnostic-signs| can no longer be configured with |:sign-define| or
  |sign_define()| (deprecated in Nvim 0.10 |deprecated-0.10|).
• |vim.diagnostic.disable()| and |vim.diagnostic.is_disabled()| (deprecated in
  Nvim 0.10 |deprecated-0.10|) are removed.
• The legacy signature of |vim.diagnostic.enable()| (deprecated in Nvim 0.10
  |deprecated-0.10|) is no longer supported.

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`.
• Buffer name URI scheme parsing more closely follows RFC3986, so for example
  "svn+ssh:", "ed2k:", and "iris.xpc:" are recognized as URI schemes.
• On Windows, Nvim no longer searches the current directory for executables
  for running external commands; prefix a relative or absolute path if you
  want the old behavior |$NoDefaultCurrentDirectoryInExePath|.

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

• todo

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`.
• The function set with |vim.lsp.log.set_format_func()| is now given all
  arguments corresponding to a log entry instead of the individual arguments.
• Renamed `vim.lsp.semantic_tokens` `start()/stop()` to `enable()`.
• |vim.lsp.util.convert_signature_help_to_markdown_lines()| activeParameter
  handling updated:
    • 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

• 'shelltemp' defaults to "false".

PLUGINS

• Removed "shellmenu" plugin, an old menu-based quasi-snippet plugin for shell scripts.

TREESITTER

• The |vim.treesitter.query.lint()| is no longer enabled by default in the
  |ft-query-plugin|.
• |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

• todo

VIMSCRIPT

• todo

==============================================================================
NEW FEATURES                                                    *news-features*

The following new features were added.

API

• |api-contract| allows existing functions to change return-type from `void => 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.
• Added |vim.lsp.is_enabled()| to check if a given LSP config has been enabled
  by |vim.lsp.enable()|.
• |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|.
• |nvim_echo()| can set the |ui-messages| kind with which to emit the message.
• |nvim_echo()| can create |Progress| messages
• |nvim_get_commands()| returns `preview` and `callback` as Lua functions if
  they were so specified in `nvim_create_user_command()`.
• |nvim_open_win()| floating windows can show a 'statusline'. Plugins can use
  `style='minimal'` or `:setlocal statusline=` to hide the statusline.
• Added experimental |nvim__exec_lua_fast()| to allow remote API clients to
  execute code while nvim is blocking for input.
• |vim.secure.trust()| accepts `path` for the `allow` action.

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" DEPS_CMAKE_FLAGS"-DUSE_BUNDLED_UNIBILIUM=0"
<
• On Windows, `tee.exe` is installed with `nvim.exe` by default so that
  commands like :make, :grep work out of the box.

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).
• 'statusline' includes |vim.diagnostic.status()|
• Project-local configuration ('exrc') is also loaded from parent directories.
  Unset 'exrc' to stop further search.
• Mappings:
  • |grt| in Normal mode maps to |vim.lsp.buf.type_definition()|
• 'shada' default now excludes "/tmp/" and "/private/" paths to reduce clutter in |:oldfiles|.
• Enabled treesitter highlighting for Markdown files

DIAGNOSTICS

• |vim.diagnostic.setloclist()| and |vim.diagnostic.setqflist()| now support a
  `format` function to modify (or filter) diagnostics before being set in the
  location/quickfix list.
• |vim.diagnostic.get()| now accepts an `enabled` filter to only return
  enabled or disabled diagnostics.
• |vim.diagnostic.status()| returns a formatted string with current buffer
  diagnostics
• |vim.diagnostic.fromqflist()| now accepts an `opts` table with
  `merge_lines` to merge multi-line compiler messages.

EDITOR

• |:iput| works like |:put| but adjusts indent.
• |:retab| accepts new optional parameter -indentonly to only change leading
  whitespace in indented lines.
• |:uniq| deduplicates text in the current buffer.
• |omnicompletion| in `help` buffer. |ft-help-omni|
• 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.
• 'wildchar' now enables completion in search contexts using |/|, |?|, |:g|, |:v|
   and |:vimgrep| 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.
• |:source| with a range in non-Lua files (e.g., vimdoc) now detects Lua
  codeblocks via treesitter and executes them as Lua instead of Vimscript.
• |:Undotree| for visually navigating the |undo-tree|
• |: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.
• |CmdlineLeave| sets |v:char| to the character that stops the Cmdline mode.
• |CmdlineLeavePre| triggered before preparing to leave the command line.
• New `append` parameter for |ui-messages| `msg_show` event.
• New `msg_id` parameter for |ui-messages| `msg_show` event.
• 'rulerformat' is emitted as `msg_ruler` when not part of the statusline.
• Creating or updating a progress message with |nvim_echo()| triggers a |Progress| event.
• |MarkSet| is triggered after a |mark| is set by the user (currently doesn't
  support implicit marks like |'[| or |'<|, …).
• |SessionLoadPre| is triggered before loading a |Session| file.
• |TabClosedPre| is triggered before closing a |tabpage|.
• New `terminator` parameter for |TermRequest| event.

HIGHLIGHTS

• |hl-DiffTextAdd| highlights added text within a changed line.
• |hl-OkMsg| |hl-StderrMsg| |hl-StdoutMsg|
• |hl-SnippetTabstopActive| highlights the currently active tabstop.
• |hl-PmenuBorder| |hl-PmenuShadow| |hl-PmenuShadowThrough| see 'pumborder'.
• |nvim_set_hl()| and |nvim_get_hl()| support the SGR attributes "dim",
  "blink", "conceal", and "overline".

LSP

• |:lsp| can be used to interactively manage LSP clients.
• |vim.lsp.ClientConfig| gained `workspace_required`.
• You can control the priority of |vim.lsp.Config| `root_markers`.
• Support for `textDocument/documentColor`: |lsp-document_color|
  https://microsoft.github.io/language-server-protocol/specification/#textDocument_documentColor
• Support for `textDocument/colorPresentation |lsp-document_color|
  https://microsoft.github.io/language-server-protocol/specification/#textDocument_colorPresentation
• 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.
• |vim.lsp.is_enabled()| checks if a LSP config is enabled (without
  "resolving" it).
• Support for `workspace/diagnostic`: |vim.lsp.buf.workspace_diagnostics()|
  https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_dagnostics
• 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.
• Support for `textDocument/linkedEditingRange`: |lsp-linked_editing_range|
  https://microsoft.github.io/language-server-protocol/specification/#textDocument_linkedEditingRange
• Support for related documents in pull diagnostics:
  https://microsoft.github.io/language-server-protocol/specifications/specification-current/#relatedFullDocumentDiagnosticReport
• |vim.lsp.buf.signature_help()| supports "noActiveParameterSupport".
• Support for `textDocument/inlineCompletion` |lsp-inline_completion|
  https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#textDocument_inlineCompletion
  See |lsp-inline_completion| for quickstart instructions.
• Support for `textDocument/onTypeFormatting`: |lsp-on_type_formatting|
  https://microsoft.github.io/language-server-protocol/specification/#textDocument_onTypeFormatting
• The filter option of |vim.lsp.buf.code_action()| now receives the client ID as an argument.
• |vim.lsp.ClientConfig| `exit_timeout` decides the time waited before "stop"
  escalates to "force-stop" for |vim.lsp.enable()|, |Client:stop()|, and
  during Nvim shutdown.
  • `exit_timeout` graduated from "experimental" `flags.exit_timeout`
    to a top-level field. Defaults to `false`.
• |Client:stop()| accepts `force` as an integer, which is treated as the time
  to wait before before stop escalates to force-stop.
• Add cmp field to opts of |vim.lsp.completion.enable()| for custom completion ordering.
• Support for `workspace/diagnostic/refresh`:
  https://microsoft.github.io/language-server-protocol/specification/#diagnostic_refresh
• Support for dynamic registration for `textDocument/diagnostic`
• |vim.lsp.buf.rename()| now highlights the symbol being renamed using the
  |hl-LspReferenceTarget| highlight group.
• Support for `textDocument/semanticTokens/range`.
• Support for `textDocument/codeLens` |lsp-codelens| has been reimplemented:
  https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#textDocument_codeLens
• Code lenses now display as virtual lines
• Support for `workspace/codeLens/refresh`:
  https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#codeLens_refresh
• `gx` will use `textDocument/documentLink` if available.
• |vim.lsp.completion.enable()| adds colored symbol preview for color items.

LUA

• |vim.net.request()| can fetch files via HTTP GET requests.
• |vim.wait()| returns the callback results.
• Lua type annotations for `vim.uv`.
• |vim.hl.range()| now allows multiple timed highlights.
• |vim.tbl_extend()| and |vim.tbl_deep_extend()| now accept a function behavior argument.
• |vim.fs.root()| can define "equal priority" via nested lists.
• |vim.version.range()| output can be converted to a human-readable string with |tostring()|.
• |vim.version.intersect()| computes intersection of two version ranges.
• |Iter:take()| and |Iter:skip()| now optionally accept predicates.
• |Iter:peek()| now works for all iterator types, not just |list-iterator|.
• Built-in plugin manager |vim.pack|
• |vim.list.unique()| and |Iter:unique()| to deduplicate lists and iterators,
  respectively.
• |vim.list.bisect()| for binary search.
• Experimental `vim.pos` and `vim.range` for Position/Range abstraction.
• |vim.json.encode()| has an `indent` option for pretty-formatting.
• |vim.json.encode()| has an `sort_keys` option.
• |Range:is_empty()| to check if a |vim.Range| is empty.
• |vim.json.decode()| has an `skip_comments` option.

OPTIONS

• 'autocomplete' enables |ins-autocompletion|.
• 'autowriteall' writes all buffers upon receiving `SIGHUP`, `SIGQUIT` or `SIGTSTP`.
• 'chistory' and 'lhistory' set size of the |quickfix-stack|.
• 'complete' new flags:
  • "F{func}"   complete using given function
  • "F"         complete using 'completefunc'
  • "o"         complete using 'omnifunc'
• 'complete' allows limiting matches for sources using "{flag}^<limit>".
• 'completeopt' flag "nearest" sorts completion results by distance to cursor.
• 'diffanchors' specifies addresses to anchor a diff.
• 'diffopt' `inline:` configures diff highlighting for changes within a line.
• 'fillchars' has new flag "foldinner".
• 'fsync' and 'grepformat' are now |global-local| options.
• 'jumpoptions' flag "view" now applies when popping the |tagstack|.
• 'maxsearchcount' sets maximum value for |searchcount()| and defaults to 999.
• 'pummaxwidth' sets maximum width for the completion popup menu.
• 'winborder' "bold" style, custom border style.
• |g:clipboard| accepts a string name to force any builtin clipboard tool.
• 'busy' sets a buffer "busy" status. Indicated in the default statusline.
• 'pumborder' adds a border to the popup menu.
• |g:clipboard| autodetection only selects tmux when running inside tmux
• 'statusline' allows "stacking" highlight groups (groups inherit from
  previous highlight attributes)

PERFORMANCE

• |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.
• LSP `textDocument/semanticTokens/range` is supported, which requests tokens
  for the viewport (visible screen) only.
• |:packadd| doesn't invalidate the cached Lua package path. Instead the cache
  gets updated in place. This might make a big startuptime difference for
  certain |init.lua| patterns where multiple |:packadd| or |vim.pack.add()|
  calls are interspersed with other code.

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|
• |:checkhealth| now checks for an available |vim.ui.open()| handler.

STARTUP

• todo

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.
• CSI 3 J (the sequence to clear terminal scrollback) is now supported.
• A suspended PTY process is now indicated by "[Process suspended]" at the
  bottom-left of the buffer and can be resumed by pressing a key.

TREESITTER

• |Query:iter_captures()| supports specifying starting and ending columns.
• |:EditQuery| command gained tab-completion, works with injected languages.
• |LanguageTree:parse()| now accepts a list of ranges.

TUI

• |TermResponse| now supports DA1 and APC query responses.
• Native progress bars are displayed for |Progress| events using the OSC 9;4
  sequence.
• The TUI now renders the SGR dim (faint), blink, conceal, and overline
  attributes.

UI

• |ui2| is a redesign of the core messages and commandline UI, which will
  replace the legacy message grid in the TUI.
  • Avoids "Press ENTER" interruptions.
  • Avoids delays from |W10| "Changing a readonly file" and other warnings.
  • Highlights the cmdline as you type.
  • Provides the |pager| as a buffer + window.
  • Currently experimental. To enable it: `require('vim._core.ui2').enable()`
• |: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.
• 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 ◐
• Cursor shape indicates when it is behind an unfocused floating window.
• 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.
• |cmdcomplete_info()| gets current cmdline completion info.
• |getcompletiontype()| gets command-line completion type for any string.
• |prompt_getinput()| gets current user-input in prompt-buffer.
• |wildtrigger()| triggers command-line expansion.
• |v:vim_did_init| is set after sourcing |init.vim| but before |load-plugins|.

==============================================================================
CHANGED FEATURES                                                 *news-changed*

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.
• 'smartcase' applies to completion filtering.
• 'spellfile' location defaults to `stdpath("data").."/site/spell/"` instead of
  the first writable directory in 'runtimepath'.
• |vim.version.range()| doesn't exclude `to` if it is equal to `from`.
• |$VIM| and |$VIMRUNTIME| no longer check for Vim version-specific runtime
  directory `vim{number}` (e.g. `vim82`).
• 'scrollback' maximum value increased from 100000 to 1000000
• |matchfuzzy()| and |matchfuzzypos()| use an improved fuzzy matching algorithm
  (same as fzy).
• Windows: Paths like "\Windows" and "/Windows" are now considered to be
  absolute paths (to the current drive) and no longer relative.
• When 'shelltemp' is off, shell commands now use `pipe()` and not `socketpair()`
  for input and output. This matters mostly for Linux where some command lines
  using "/dev/stdin" and similiar would break as these special files can be
  reopened when backed by pipes but not when backed by socket pairs.

==============================================================================
REMOVED FEATURES                                                 *news-removed*

These deprecated features were removed.

• todo

==============================================================================
DEPRECATIONS                                                *news-deprecations*

See |deprecated-0.12|.

 vim:tw=78:ts=8:sw=2:et:ft=help:norl:
