From b6006679e791a8487f749c256cec97fcf254fee5 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Sun, 29 Mar 2026 20:53:24 -0400 Subject: [PATCH] docs: news #38583 --- runtime/doc/deprecated.txt | 5 + runtime/doc/lua-plugin.txt | 14 +- runtime/doc/news-0.12.txt | 469 +++++++++++++++++++++++++++++++++++++ runtime/doc/news.txt | 382 +++--------------------------- 4 files changed, 516 insertions(+), 354 deletions(-) create mode 100644 runtime/doc/news-0.12.txt diff --git a/runtime/doc/deprecated.txt b/runtime/doc/deprecated.txt index fec542f9ce..b40ceeea3a 100644 --- a/runtime/doc/deprecated.txt +++ b/runtime/doc/deprecated.txt @@ -12,6 +12,11 @@ They should not be used in new scripts, and old scripts should be updated. ============================================================================== Deprecated features +------------------------------------------------------------------------------ +DEPRECATED IN 0.13 *deprecated-0.13* + +• todo + ------------------------------------------------------------------------------ DEPRECATED IN 0.12 *deprecated-0.12* diff --git a/runtime/doc/lua-plugin.txt b/runtime/doc/lua-plugin.txt index 6e31cb765f..fd511f69d3 100644 --- a/runtime/doc/lua-plugin.txt +++ b/runtime/doc/lua-plugin.txt @@ -156,15 +156,17 @@ configuring which commands and key mappings load the plugin. Your plugin should not depend on every user micro-managing their configuration in such a way. Nvim has a mechanism for every plugin to do its own implicit -lazy-loading (in Vimscript it's called |autoload|), via `autoload/` -(Vimscript) and `lua/` (Lua). Plugin authors can provide "lazy loading" by -providing a `plugin/.lua` file which defines their commands and -keymappings. This file should be small, and should not eagerly `require()` the -rest of your plugin. Commands and mappings should do the `require()`. +lazy-loading, via |autoload| (Vimscript) and `lua/` (Lua). + +Plugin authors can provide "lazy loading" by providing a `plugin/.lua` +file which defines their commands and keymappings. This file should be small, +and should not eagerly `require()` the rest of your plugin. Commands and +mappings should do the `require()`. Guidance: -- Plugins should arrange their "lazy" behavior once, instead of expecting every user to micromanage it. +- Plugins should arrange their "lazy" behavior once, instead of expecting + every user to micromanage it. - Keep `plugin/.lua` small, avoid eagerly calling `require()` on modules until a command or mapping is actually used. diff --git a/runtime/doc/news-0.12.txt b/runtime/doc/news-0.12.txt new file mode 100644 index 0000000000..e8ccb63777 --- /dev/null +++ b/runtime/doc/news-0.12.txt @@ -0,0 +1,469 @@ +*news-0.12.txt* Nvim + + + NVIM REFERENCE MANUAL + + +Notable changes since Nvim 0.11 *news-0.12* + +For changes in the previous release, see |news-0.11|. + + Type |gO| to see the table of contents. + +============================================================================== +BREAKING CHANGES + +These changes may require adaptations in your config or plugins. + +API + +• |nvim_get_commands()| returns `complete` as a Lua function, if it was + defined as such. + +DIAGNOSTICS + +• |diagnostic-signs| can no longer be configured with |:sign-define| or + |sign_define()| (deprecated in Nvim 0.10 |deprecated-0.10|). +• Removed |vim.diagnostic.disable()| and |vim.diagnostic.is_disabled()| + (deprecated in Nvim 0.10 |deprecated-0.10|). +• 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 `=@x`. +• Parsing of URI-like buffer names more closely follows RFC3986, so for example + "svn+ssh:", "ed2k:", and "iris.xpc:" are recognized as URI schemes. +• Security: Nvim on Windows no longer searches the current directory for + external command executables; 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. + +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. +• |package-tohtml| is now an "opt-in" plugin. Use |:packadd| to activate it: > + :packadd nvim.tohtml + +TREESITTER + +• |ft-query-plugin| no longer enables |vim.treesitter.query.lint()| by default. +• |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. +• The "all" option to |Query:iter_matches()|, which was introduced in Nvim + 0.11 to aid in transitioning to the new behavior, has been removed. + +============================================================================== +NEW 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`, thus 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|. +• |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_tabpage()| can open a new |tab-page|. +• |nvim_open_win()| floating windows can show a 'statusline'. Plugins can use + `style='minimal'` or `:setlocal statusline=` to hide the statusline. +• |nvim_win_set_config()| can move |floating-windows| to other tabpages. +• EXPERIMENTAL: |nvim__exec_lua_fast()| allows remote API clients to execute + Lua while Nvim is blocking for input. |api-fast| +• Decoration provider gained an `on_range` callback (deprecates `on_line`). +• |vim.secure.trust()| accepts `path` for the `allow` action. +• |nvim_get_chan_info()| includes `exitcode` field for :terminal buffers. +• |nvim_set_hl()| supports updating specified attributes only. + +BUILD + +• EXPERIMENTAL: Zig-based build is available 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 included 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). +• Default 'statusline' shows: + • |vim.diagnostic.status()| + • |vim.ui.progress_status()| + • :terminal exit code +• 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()| + • |grx| in Normal mode maps to |vim.lsp.codelens.run()| +• '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 status description of current buffer + diagnostics. +• |vim.diagnostic.fromqflist()| accepts `opts.merge_lines` to merge multiline + 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| is available when editing |help| buffers. |ft-help-omni| +• |:help!| has DWIM ("Do What I Mean") behavior: it tries to guess the help + tag at cursor. In help buffers, 'keywordprg' defaults to ":help!". For + example, try "K" anywhere in this code: > + local v = vim.version.parse(vim.system({'foo'}):wait().stdout) +• 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. +• Security: 'exrc' no longer shows "(a)llow". Instead you must "(v)iew", + then run `:trust` (or `:trust [file]`, but that has a TOCTOU risk). +• |gx| in help buffers opens the online documentation for the tag at 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. + (Or use `:{range}lua` to skip the detection.) +• |:wall| with |++p| auto-creates missing parent directories. + +EVENTS + +• In the |ui-protocol|, message kind `empty` is emitted for empty messages + (e.g. `:echo ""`). +• |CmdlineLeave| sets |v:char| to the character that stops the Cmdline mode. +• |CmdlineLeavePre| triggered before preparing to leave the command line. +• New `append`, `id` and `trigger` 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|. +• |TermRequest| event gained a `terminator` parameter. + +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-completion|: + • |vim.lsp.completion.enable()| gained a `cmp` option for custom ordering. + • Supports colored symbol preview for color items. + • Shows a preview ("completionItem/resolve") if 'completeopt' has "popup". + • 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. +• |: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`. +• LSP capabilities: + • `textDocument/codeLens` |lsp-codelens| was reimplemented. + https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#textDocument_codeLens + • `textDocument/colorPresentation` |lsp-document_color| + https://microsoft.github.io/language-server-protocol/specification/#textDocument_colorPresentation + • `textDocument/diagnostic` + • `textDocument/documentColor` |lsp-document_color| + https://microsoft.github.io/language-server-protocol/specification/#textDocument_documentColor + • `textDocument/documentLink`: |gx| opens "documentLink" items at cursor. + • `textDocument/inlineCompletion` + • `textDocument/linkedEditingRange` |lsp-linked_editing_range| + https://microsoft.github.io/language-server-protocol/specification/#textDocument_linkedEditingRange + • `textDocument/onTypeFormatting` |lsp-on_type_formatting| + https://microsoft.github.io/language-server-protocol/specification/#textDocument_onTypeFormatting + • `textDocument/selectionRange` Incremental selection. + |v_an| selects outwards, |v_in| selects inwards. + • `textDocument/semanticTokens/range` + • `workspace/codeLens/refresh` + https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#codeLens_refresh + • `workspace/diagnostic/refresh` + https://microsoft.github.io/language-server-protocol/specification/#diagnostic_refresh + • `workspace/diagnostic` |vim.lsp.buf.workspace_diagnostics()| + https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_dagnostics +• Support for dynamic registration: + • `textDocument/diagnostic` +• 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). +• |vim.lsp.get_configs()| gets all LSP configs matching an optional filter. +• 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 related documents in pull diagnostics: + https://microsoft.github.io/language-server-protocol/specifications/specification-current/#relatedFullDocumentDiagnosticReport +• |vim.lsp.buf.signature_help()| supports "noActiveParameterSupport". +• 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. +• |vim.lsp.buf.rename()| now highlights the symbol being renamed using the + |hl-LspReferenceTarget| highlight group. +• Code lenses now display as virtual lines + +LUA + +• |vim.net.request()| can fetch/download HTTP content. +• |vim.wait()| returns the callback results. +• Lua type annotations for `vim.uv`. +• |vim.hl.range()| now allows multiple timed highlights. +• |vim.tbl_extend()|, |vim.tbl_deep_extend()| `behavior` argument can be a function. +• |vim.fs.root()| can define "equal priority" via nested lists. +• |vim.fs.ext()| returns the last extension of a file. +• |vim.version.range()| can output human-readable string via |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|. +• |vim.list.unique()| and |Iter:unique()| to deduplicate lists and iterators, + respectively. +• |vim.list.bisect()| performs binary search. +• |vim.json.encode()| `indent` option performs pretty-formatting. +• |vim.json.encode()| `sort_keys` option sorts by key. +• |vim.json.decode()| `skip_comments` option allows comments in JSON data. +• EXPERIMENTAL: |vim.pos|, |vim.range| provide Position/Range abstraction. + +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}^". +• '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. +• 'diffopt' with `inline:word` now automatically merges adjacent diff blocks + separated by gaps and punctuation by 5 bytes to improve readability. +• 'fillchars' has new flag "foldinner". +• 'fsync' and 'grepformat' are now |global-local| options. +• 'listchars' has new flag "leadtab". +• '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. +• 'busy' sets a buffer "busy" status. Indicated in the default statusline. +• 'pumborder' adds a border to the popup menu. +• |g:clipboard| accepts a string name to force any builtin clipboard tool. +• |g:clipboard| autodetection selects tmux only when running inside tmux. +• 'statusline' allows "stacking" highlight groups (groups inherit from + previous highlight attributes) +• 'messagesopt' "progress:c" flag controls whether progress messages are shown + in the cmdline message area. +• Improved |:set+=|, |:set^=| and |:set-=| handling of comma-separated "key:value" + pairs (e.g. 'listchars', 'fillchars', 'diffopt'). + +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 + +• Built-in plugin manager: |vim.pack| +• |:DiffTool| compares directories (and files). +• |:Undotree| lets you visually navigate the |undo-tree|. +• 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 + +• |v:argf| provides file arguments given at startup. +• Nvim shows a warning if the log file path is inaccessible. + +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. +• DEC private mode 2026 (synchronized output) is now supported. Applications + running in |:terminal| can batch screen updates to avoid tearing. +• 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. +• On terminal exit, "[Process exited]" is shown as virtual text (instead of + modifying buffer contents), and exit code is shown in statusline. + • You can disable "[Process exited]" entirely, see |terminal-config|. + +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. +• |v_an| |v_in| |v_]n| |v_[n| incremental selection of treesitter nodes. + +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. +• |vim.ui.progress_status()| returns a status description of currently running + |progress-message|s. + +VIMSCRIPT + +• |chdir()| allows optionally specifying a scope argument. +• |cmdcomplete_info()| gets current cmdline completion info. +• |getcompletiontype()| gets command-line completion type for any string. +• |has()| gained two new system dependent feature flags, |android| and |termux|. +• |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|. +• |prompt_appendbuf()| appends text to prompt-buffer. + +============================================================================== +CHANGED FEATURES + +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 similar would break as these special files can be + reopened when backed by pipes but not when backed by socket pairs. + +============================================================================== +REMOVED FEATURES + +These deprecated features were removed. + +• |vim.treesitter.get_parser()| instead of throwing an error + `get_parser()` now always returns nil when it fails to create a parser. + +============================================================================== +DEPRECATIONS + +See |deprecated-0.12|. + + vim:tw=78:ts=8:sw=2:et:ft=help:norl: diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt index 4900883a38..9534df9e56 100644 --- a/runtime/doc/news.txt +++ b/runtime/doc/news.txt @@ -4,9 +4,9 @@ NVIM REFERENCE MANUAL -Notable changes since Nvim 0.11 *news* +Notable changes since Nvim 0.12 *news* -For changes in the previous release, see |news-0.11|. +For changes in the previous release, see |news-0.12|. Type |gO| to see the table of contents. @@ -17,75 +17,39 @@ These changes may require adaptations in your config or plugins. API -• |nvim_get_commands()| returns `complete` as a Lua function, if it was - defined as such. +• todo DIAGNOSTICS -• |diagnostic-signs| can no longer be configured with |:sign-define| or - |sign_define()| (deprecated in Nvim 0.10 |deprecated-0.10|). -• Removed |vim.diagnostic.disable()| and |vim.diagnostic.is_disabled()| - (deprecated in Nvim 0.10 |deprecated-0.10|). -• The legacy signature of |vim.diagnostic.enable()| (deprecated in Nvim 0.10 - |deprecated-0.10|) is no longer supported. +• todo 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 `=@x`. -• Parsing of URI-like buffer names more closely follows RFC3986, so for example - "svn+ssh:", "ed2k:", and "iris.xpc:" are recognized as URI schemes. -• Security: Nvim on Windows no longer searches the current directory for - external command executables; prefix a relative or absolute path if you - want the old behavior |$NoDefaultCurrentDirectoryInExePath|. +• todo 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. +• 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` +• todo LUA -• Renamed `vim.diff` to `vim.text.diff`. +• todo OPTIONS -• 'shelltemp' defaults to "false". +• todo PLUGINS -• Removed "shellmenu" plugin, an old menu-based quasi-snippet plugin for shell scripts. -• |package-tohtml| is now an "opt-in" plugin. Use |:packadd| to activate it: > - :packadd nvim.tohtml +• todo TREESITTER -• |ft-query-plugin| no longer enables |vim.treesitter.query.lint()| by default. -• |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. -• The "all" option to |Query:iter_matches()|, which was introduced in Nvim - 0.11 to aid in transitioning to the new behavior, has been removed. +• todo ============================================================================== NEW FEATURES *news-features* @@ -94,376 +58,98 @@ 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`, thus 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|. -• |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_tabpage()| can open a new |tab-page|. -• |nvim_open_win()| floating windows can show a 'statusline'. Plugins can use - `style='minimal'` or `:setlocal statusline=` to hide the statusline. -• |nvim_win_set_config()| can move |floating-windows| to other tabpages. -• EXPERIMENTAL: |nvim__exec_lua_fast()| allows remote API clients to execute - Lua while Nvim is blocking for input. |api-fast| -• Decoration provider gained an `on_range` callback (deprecates `on_line`). -• |vim.secure.trust()| accepts `path` for the `allow` action. -• |nvim_get_chan_info()| includes `exitcode` field for :terminal buffers. -• |nvim_set_hl()| supports updating specified attributes only. +• todo BUILD -• EXPERIMENTAL: Zig-based build is available 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 included with `nvim.exe` by default so that - commands like :make, :grep work out of the box. +• todo 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). -• Default 'statusline' shows: - • |vim.diagnostic.status()| - • |vim.ui.progress_status()| - • :terminal exit code -• 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()| - • |grx| in Normal mode maps to |vim.lsp.codelens.run()| -• 'shada' default now excludes "/tmp/" and "/private/" paths to reduce clutter in |:oldfiles|. -• Enabled treesitter highlighting for Markdown files. +• todo 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 status description of current buffer - diagnostics. -• |vim.diagnostic.fromqflist()| accepts `opts.merge_lines` to merge multiline - compiler messages. +• todo 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| is available when editing |help| buffers. |ft-help-omni| -• |:help!| has DWIM ("Do What I Mean") behavior: it tries to guess the help - tag at cursor. In help buffers, 'keywordprg' defaults to ":help!". For - example, try "K" anywhere in this code: > - local v = vim.version.parse(vim.system({'foo'}):wait().stdout) -• 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. -• Security: 'exrc' no longer shows "(a)llow". Instead you must "(v)iew", - then run `:trust` (or `:trust [file]`, but that has a TOCTOU risk). -• |gx| in help buffers opens the online documentation for the tag at 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. - (Or use `:{range}lua` to skip the detection.) -• |:wall| with |++p| auto-creates missing parent directories. +• todo EVENTS -• In the |ui-protocol|, message kind `empty` is emitted for empty messages - (e.g. `:echo ""`). -• |CmdlineLeave| sets |v:char| to the character that stops the Cmdline mode. -• |CmdlineLeavePre| triggered before preparing to leave the command line. -• New `append`, `id` and `trigger` 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|. -• |TermRequest| event gained a `terminator` parameter. +• todo 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". +• todo LSP -• |lsp-completion|: - • |vim.lsp.completion.enable()| gained a `cmp` option for custom ordering. - • Supports colored symbol preview for color items. - • Shows a preview ("completionItem/resolve") if 'completeopt' has "popup". - • 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. -• |: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`. • LSP capabilities: - • `textDocument/codeLens` |lsp-codelens| was reimplemented. + • `textDocument/foo` … https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#textDocument_codeLens - • `textDocument/colorPresentation` |lsp-document_color| + • `textDocument/bar` … https://microsoft.github.io/language-server-protocol/specification/#textDocument_colorPresentation - • `textDocument/diagnostic` - • `textDocument/documentColor` |lsp-document_color| - https://microsoft.github.io/language-server-protocol/specification/#textDocument_documentColor - • `textDocument/documentLink`: |gx| opens "documentLink" items at cursor. - • `textDocument/inlineCompletion` - • `textDocument/linkedEditingRange` |lsp-linked_editing_range| - https://microsoft.github.io/language-server-protocol/specification/#textDocument_linkedEditingRange - • `textDocument/onTypeFormatting` |lsp-on_type_formatting| - https://microsoft.github.io/language-server-protocol/specification/#textDocument_onTypeFormatting - • `textDocument/selectionRange` Incremental selection. - |v_an| selects outwards, |v_in| selects inwards. - • `textDocument/semanticTokens/range` - • `workspace/codeLens/refresh` - https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#codeLens_refresh - • `workspace/diagnostic/refresh` - https://microsoft.github.io/language-server-protocol/specification/#diagnostic_refresh - • `workspace/diagnostic` |vim.lsp.buf.workspace_diagnostics()| - https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_dagnostics -• Support for dynamic registration: - • `textDocument/diagnostic` -• 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). -• |vim.lsp.get_configs()| gets all LSP configs matching an optional filter. -• 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 related documents in pull diagnostics: - https://microsoft.github.io/language-server-protocol/specifications/specification-current/#relatedFullDocumentDiagnosticReport -• |vim.lsp.buf.signature_help()| supports "noActiveParameterSupport". -• 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. -• |vim.lsp.buf.rename()| now highlights the symbol being renamed using the - |hl-LspReferenceTarget| highlight group. -• Code lenses now display as virtual lines +• todo LUA -• |vim.net.request()| can fetch/download HTTP content. -• |vim.wait()| returns the callback results. -• Lua type annotations for `vim.uv`. -• |vim.hl.range()| now allows multiple timed highlights. -• |vim.tbl_extend()|, |vim.tbl_deep_extend()| `behavior` argument can be a function. -• |vim.fs.root()| can define "equal priority" via nested lists. -• |vim.fs.ext()| returns the last extension of a file. -• |vim.version.range()| can output human-readable string via |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|. -• |vim.list.unique()| and |Iter:unique()| to deduplicate lists and iterators, - respectively. -• |vim.list.bisect()| performs binary search. -• |vim.json.encode()| `indent` option performs pretty-formatting. -• |vim.json.encode()| `sort_keys` option sorts by key. -• |vim.json.decode()| `skip_comments` option allows comments in JSON data. -• EXPERIMENTAL: |vim.pos|, |vim.range| provide Position/Range abstraction. +• todo 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}^". -• '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. -• 'diffopt' with `inline:word` now automatically merges adjacent diff blocks - separated by gaps and punctuation by 5 bytes to improve readability. -• 'fillchars' has new flag "foldinner". -• 'fsync' and 'grepformat' are now |global-local| options. -• 'listchars' has new flag "leadtab". -• '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. -• 'busy' sets a buffer "busy" status. Indicated in the default statusline. -• 'pumborder' adds a border to the popup menu. -• |g:clipboard| accepts a string name to force any builtin clipboard tool. -• |g:clipboard| autodetection selects tmux only when running inside tmux. -• 'statusline' allows "stacking" highlight groups (groups inherit from - previous highlight attributes) -• 'messagesopt' "progress:c" flag controls whether progress messages are shown - in the cmdline message area. -• Improved |:set+=|, |:set^=| and |:set-=| handling of comma-separated "key:value" - pairs (e.g. 'listchars', 'fillchars', 'diffopt'). +• todo 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. +• todo PLUGINS -• Built-in plugin manager: |vim.pack| -• |:DiffTool| compares directories (and files). -• |:Undotree| lets you visually navigate the |undo-tree|. -• 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. +• todo STARTUP -• |v:argf| provides file arguments given at startup. -• Nvim shows a warning if the log file path is inaccessible. +• 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. -• DEC private mode 2026 (synchronized output) is now supported. Applications - running in |:terminal| can batch screen updates to avoid tearing. -• 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. -• On terminal exit, "[Process exited]" is shown as virtual text (instead of - modifying buffer contents), and exit code is shown in statusline. - • You can disable "[Process exited]" entirely, see |terminal-config|. +• todo 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. -• |v_an| |v_in| |v_]n| |v_[n| incremental selection of treesitter nodes. +• todo 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. +• todo 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. -• |vim.ui.progress_status()| returns a status description of currently running - |progress-message|s. +• todo VIMSCRIPT -• |chdir()| allows optionally specifying a scope argument. -• |cmdcomplete_info()| gets current cmdline completion info. -• |getcompletiontype()| gets command-line completion type for any string. -• |has()| gained two new system dependent feature flags, |android| and |termux|. -• |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|. -• |prompt_appendbuf()| appends text to prompt-buffer. +• todo ============================================================================== 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 similar would break as these special files can be - reopened when backed by pipes but not when backed by socket pairs. +• todo ============================================================================== REMOVED FEATURES *news-removed* These deprecated features were removed. -• |vim.treesitter.get_parser()| instead of throwing an error - `get_parser()` now always returns nil when it fails to create a parser. +• todo ============================================================================== DEPRECATIONS *news-deprecations* -See |deprecated-0.12|. +See |deprecated-0.13|. vim:tw=78:ts=8:sw=2:et:ft=help:norl: