mirror of
https://github.com/neovim/neovim.git
synced 2026-02-21 01:40:19 +10:00
This was added before there was a dedicated language server for tree-sitter queries. Now that https://github.com/ribru17/ts_query_ls exists, this is a better option in every regard (and up to now required manually disabling the builtin linter to avoid duplicate diagnostics and performance issues).
471 lines
21 KiB
Plaintext
471 lines
21 KiB
Plaintext
*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.
|
|
|
|
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 |'<|, …).
|
|
• |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'.
|
|
|
|
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.
|
|
|
|
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.
|
|
|
|
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.
|
|
|
|
UI
|
|
|
|
• |:restart| restarts Nvim and reattaches the current UI.
|
|
• |:connect| dynamically connects the current UI to the server at the given
|
|
address.
|
|
• |:checkhealth| shows a summary in the header for every healthcheck.
|
|
• |ui-multigrid| provides composition information and absolute coordinates.
|
|
• `vim._core.ui2` provides an experimental commandline and message UI intended to
|
|
replace the message grid in the TUI.
|
|
• Error messages are more concise:
|
|
• "Error detected while processing:" changed to "Error in:".
|
|
• "Error executing Lua:" changed to "Lua:".
|
|
• 'busy' status is shown in default statusline with symbol ◐
|
|
• 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:
|