news-0.11.txt (24079B)
1 *news-0.11.txt* Nvim 2 3 4 NVIM REFERENCE MANUAL 5 6 7 Notable changes since Nvim 0.10 *news-0.11* 8 9 For changes in the previous release, see |news-0.10|. 10 11 Type |gO| to see the table of contents. 12 13 ============================================================================== 14 BREAKING CHANGES 15 16 These changes may require adaptations in your config or plugins. 17 18 API 19 20 • `vim.rpcnotify(0)` and `rpcnotify(0)` broadcast to ALL channels. Previously 21 they would "multicast" only to subscribed channels (controlled by 22 `nvim_subscribe()`). Plugins and clients that want "multicast" behavior must 23 now maintain their own list of channels. 24 • In the future, |vim.rpcnotify()| may accept a list of channels, if there 25 is demand for this use-case. 26 • "Dictionary" was renamed to "Dict" internally and in the RPC |api-metadata|. 27 This is not expected to break clients because there are no known clients 28 that actually use the `return_type` field or the parameter type names 29 reported by |--api-info| or |nvim_get_api_info()|. 30 • Renamed `nvim__id_dictionary` (unsupported/experimental API) to 31 `nvim__id_dict`. 32 33 BUILD 34 35 • On Windows, only building with the UCRT runtime is supported. 36 • Translations are turned off by default. Enable by building Nvim with the 37 CMake flag `ENABLE_TRANSLATIONS=ON`. 38 39 DIAGNOSTICS 40 41 • The "underline" diagnostics handler sorts diagnostics by severity when using 42 the "severity_sort" option. 43 • Diagnostics are filtered by severity before being passed to a diagnostic 44 handler |diagnostic-handlers|. 45 • The "virtual_text" handler is disabled by default. Enable with >lua 46 vim.diagnostic.config({ virtual_text = true }) 47 < 48 EDITOR 49 50 • The order in which signs are placed was changed. Higher priority signs will 51 now appear left of lower priority signs. 52 • |hl-CurSearch| now behaves the same as Vim and no longer updates on every 53 cursor movement. 54 • Moving in the buffer list using |:bnext| and similar commands behaves as 55 documented and skips help buffers if run from a non-help buffer, otherwise 56 it moves to another help buffer. 57 • Bells from a |terminal| buffer are now silent by default, unless 'belloff' 58 option doesn't contain "term" or "all". 59 • Renamed autocmd group `nvim_swapfile` to `nvim.swapfile`. |default-autocmds| 60 If you always want the swapfile dialog, delete the `nvim.swapfile` group: 61 `autocmd! nvim.swapfile`. 62 63 EVENTS 64 65 • |vim.ui_attach()| callbacks for |ui-messages| `msg_show` events are executed in 66 |api-fast| context. 67 • New/enhanced arguments in these existing UI events: 68 • `cmdline_hide`: Includes `level` and `abort` arguments, `abort` argument indicating if the cmdline was aborted. 69 • `cmdline_show`: 70 • Prompts that were previously emitted as `msg_show` events, are now routed 71 through `cmdline_show`. 72 • `hl_id` argument to highlight the prompt text. 73 • `msg_show`: 74 • `history` argument indicating if the message was added to the history. 75 • new message kinds: "bufwrite", "completion", "list_cmd", "lua_print", 76 "search_cmd", "shell_out/err/ret", "undo", "verbose", wildlist". 77 • |TermRequest| and |TermResponse| |event-data| is now a table. The "sequence" 78 field contains the received sequence. |TermRequest| also contains a "cursor" 79 field indicating the cursor's position when the sequence was received. 80 81 HIGHLIGHTS 82 83 • |TermCursorNC| is removed and no longer supported. Unfocused terminals no 84 longer have a cursor. 85 86 LSP 87 88 • |vim.lsp.buf.references()|, |vim.lsp.buf.declaration()|, |vim.lsp.buf.definition()|, 89 |vim.lsp.buf.type_definition()|, |vim.lsp.buf.implementation()| and 90 |vim.lsp.buf.hover()| now support merging the results of multiple clients 91 but no longer trigger the global handlers from `vim.lsp.handlers` 92 • |vim.lsp.buf.typehierarchy()| now passes the correct params for each 93 client request. 94 • |vim.lsp.handlers.signature_help()| is no longer used. 95 • |vim.lsp.diagnostic.on_publish_diagnostics()| and 96 |vim.lsp.diagnostic.on_diagnostic()| no longer accept a config parameter and 97 can no longer be configured with |vim.lsp.with()|. 98 Instead use: >lua 99 vim.diagnostic.config(config, vim.lsp.diagnostic.get_namespace(client_id)) 100 < 101 • |vim.lsp.util.make_position_params()|, |vim.lsp.util.make_range_params()| 102 and |vim.lsp.util.make_given_range_params()| now require the `position_encoding` 103 parameter. 104 • |vim.lsp.util.symbols_to_items()| now requires the `position_encoding` parameter. 105 106 LUA 107 108 • API functions now consistently return an empty dictionary as 109 |vim.empty_dict()|. Earlier, a |lua-special-tbl| was sometimes used. 110 • |vim.json.encode()| no longer escapes forward slashes "/" by default 111 112 OPTIONS 113 114 • The 'statuscolumn' `%l` item can now be used as a number column segment that 115 changes according to related options. It takes care of alignment, 'number', 116 'relativenumber' and 'signcolumn' set to "number". The now redundant `%r` item 117 is no longer treated specially for 'statuscolumn'. 118 • `:set {option}<` removes the local value for all |global-local| options instead 119 of just string |global-local| options. 120 • `:setlocal {option}<` copies the global value to the local value for number 121 and boolean |global-local| options instead of removing the local value. 122 • Setting |hidden-options| now gives an error. In particular, setting 123 'noshellslash' is now only allowed on Windows. 124 125 TREESITTER 126 127 • |Query:iter_matches()| correctly returns all matching nodes in a match 128 instead of only the last node. This means that the returned table maps 129 capture IDs to a list of nodes that need to be iterated over. For 130 backwards compatibility, an option `all=false` (only return the last 131 matching node) is provided that will be removed in a future release. 132 • |vim.treesitter.language.get_filetypes()| always includes the {language} 133 argument in addition to explicitly registered filetypes. 134 • |vim.treesitter.language.get_lang()| falls back to the {filetype} argument 135 if no languages are explicitly registered. 136 • |vim.treesitter.language.add()| returns `true` if a parser was loaded 137 successfully and `nil,errmsg` otherwise instead of throwing an error. 138 • |vim.treesitter.get_parser()| and |vim.treesitter.start()| no longer parse the 139 tree before returning. Scripts must call |LanguageTree:parse()| explicitly. >lua 140 local p = vim.treesitter.get_parser(0, 'c') 141 p:parse() 142 • |vim.treesitter.get_parser()| expects its buffer to be loaded. 143 144 TUI 145 146 • OSC 52 is used as a fallback clipboard provider when no other 147 |clipboard-tool| is found, even when not using SSH |clipboard-osc52|. To 148 disable OSC 52 queries, set the "osc52" key of |g:termfeatures| to false. 149 150 VIMSCRIPT 151 152 • |v:msgpack_types| has the type "binary" removed. |msgpackparse()| no longer 153 treats BIN, STR and FIXSTR as separate types. Any of these is returned as a 154 string if possible, or a |blob| if the value contained embedded NUL:s. 155 156 ============================================================================== 157 NEW FEATURES 158 159 The following new features were added. 160 161 API 162 163 • Improved API "meta" docstrings and :help documentation. 164 • |nvim__ns_set()| can set properties for a namespace 165 • |nvim_echo()| `err` field to print error messages and `chunks` accepts 166 highlight group IDs. 167 • |nvim_open_win()| supports a `mouse` field that allows configuring mouse 168 interaction with the window separately from `focusable` field. 169 • |nvim_open_win()| `relative` field can be set to "laststatus" and "tabline". 170 • Additions to |nvim_buf_set_extmark()|: 171 • `conceal_lines` field to conceal an entire line. 172 • `hl_group` field can be an array of layered groups. 173 • `virt_text_pos` field accepts value `eol_right_align` to allow for right 174 aligned text that truncates before covering up buffer text. 175 • `virt_lines_overflow` field accepts value `scroll` to enable horizontal 176 scrolling for virtual lines with 'nowrap'. 177 178 DEFAULTS 179 180 • Highlighting: 181 • Improved styling of :checkhealth and :help buffers. 182 183 • Mappings: 184 • |grn| in Normal mode maps to |vim.lsp.buf.rename()| 185 • |grr| in Normal mode maps to |vim.lsp.buf.references()| 186 • |gri| in Normal mode maps to |vim.lsp.buf.implementation()| 187 • |gO| in Normal mode maps to |vim.lsp.buf.document_symbol()| 188 • |gra| in Normal and Visual mode maps to |vim.lsp.buf.code_action()| 189 • CTRL-S in Insert and Select mode maps to |vim.lsp.buf.signature_help()| 190 • Mouse |popup-menu| includes an "Open in web browser" item when you right-click 191 on a URL. 192 • Mouse |popup-menu| includes a "Go to definition" item when LSP is active 193 in the buffer. 194 • Mouse |popup-menu| includes "Show Diagnostics", "Show All Diagnostics" and 195 "Configure Diagnostics" items when there are diagnostics in the buffer. 196 • |]d-default| and |[d-default| accept a count. 197 • |[D-default| and |]D-default| jump to the first and last diagnostic in the 198 current buffer, respectively. 199 • Mappings inspired by Tim Pope's vim-unimpaired: 200 • |[q|, |]q|, |[Q|, |]Q|, |[_CTRL-Q|, |]_CTRL-Q| navigate through the |quickfix| list 201 • |[l|, |]l|, |[L|, |]L|, |[_CTRL-L|, |]_CTRL-L| navigate through the |location-list| 202 • |[t|, |]t|, |[T|, |]T|, |[_CTRL-T|, |]_CTRL-T| navigate through the |tag-matchlist| 203 • |[a|, |]a|, |[A|, |]A| navigate through the |argument-list| 204 • |[b|, |]b|, |[B|, |]B| navigate through the |buffer-list| 205 • |[<Space>|, |]<Space>| add an empty line above and below the cursor 206 • |[[| and |]]| in Normal mode jump between shell prompts for shells which emit 207 OSC 133 sequences ("shell integration" or "semantic prompts"). 208 209 • Options: 210 • 'diffopt' default includes "linematch:40". 211 • 'number', 'relativenumber', 'signcolumn', and 'foldcolumn' are disabled in 212 |terminal| buffers. |terminal-config| shows how to change these defaults. 213 • Lua |ftplugin| sets 'omnifunc' to "v:lua.vim.lua_omnifunc". 214 • Lua |ftplugin| sets 'foldexpr' to "v:lua.vim.treesitter.foldexpr()". 215 216 • Snippet: 217 • `<Tab>` in Insert and Select mode maps to `vim.snippet.jump({ direction = 1 })` 218 when a snippet is active and jumpable forwards. 219 • `<S-Tab>` in Insert and Select mode maps to `vim.snippet.jump({ direction = -1 })` 220 when a snippet is active and jumpable backwards. 221 222 DIAGNOSTICS 223 224 • |vim.diagnostic.config()| accepts a "jump" table to specify defaults for 225 |vim.diagnostic.jump()|. 226 • A "virtual_lines" diagnostic handler was added to render diagnostics using 227 virtual lines below the respective code. 228 • The "virtual_text" diagnostic handler accepts a `current_line` option to 229 only show virtual text at the cursor's line. 230 231 EDITOR 232 233 • Improved |paste| handling for redo (dot-repeat) and macros (|recording|): 234 • Redoing a large paste is significantly faster and ignores 'autoindent'. 235 • Replaying a macro with |@| also replays pasted text. 236 • On Windows, filename arguments on the command-line prefixed with "~\" or 237 "~/" are now expanded to the user's profile directory, not a relative path 238 to a literal "~" directory. 239 • |hl-ComplMatchIns| shows matched text of the currently inserted completion. 240 • |hl-PmenuMatch| and |hl-PmenuMatchSel| show matched text in completion popup. 241 • |gO| now works in `help`, `checkhealth`, and `markdown` buffers. 242 • Jump between sections in `help` and `checkhealth` buffers with `[[` and `]]`. 243 244 EVENTS 245 246 • |CompleteDone| now sets the `reason` key in `v:event` which specifies the reason 247 for completion being done. 248 • |vim.on_key()| callbacks can consume the key by returning an empty string. 249 250 LSP 251 252 • Improved rendering of LSP hover docs. |K-lsp-default| 253 • |vim.lsp.completion.enable()| gained the `convert` callback which enables 254 customizing the transformation of an LSP CompletionItem to |complete-items|. 255 • |vim.lsp.diagnostic.from()| can be used to convert a list of 256 |vim.Diagnostic| objects into their LSP diagnostic representation. 257 • `:checkhealth vim.lsp` displays the server version (if available). 258 • Completion side effects (including snippet expansion, execution of commands 259 and application of additional text edits) is now built-in. 260 • |vim.lsp.util.locations_to_items()| and |vim.lsp.util.symbols_to_items()| now 261 sets `end_col` and `end_lnum` fields. 262 • |vim.lsp.buf.format()| now supports passing a list of ranges 263 via the `range` parameter (this requires support for the 264 `textDocument/rangesFormatting` request). 265 • |vim.lsp.buf.code_action()| actions show client name when there are multiple 266 clients. 267 • |vim.lsp.buf.signature_help()| can now cycle through different signatures 268 using `<C-s>` and also support multiple clients. 269 • The client now supports `'utf-8'` and `'utf-32'` position encodings. 270 • |vim.lsp.buf.hover()| now highlights hover ranges using the 271 |hl-LspReferenceTarget| highlight group. 272 • Functions in |vim.lsp.Client| can now be called as methods. 273 • Implemented LSP folding: |vim.lsp.foldexpr()| 274 https://microsoft.github.io/language-server-protocol/specification/#textDocument_foldingRange 275 • |vim.lsp.config()| has been added to define default configurations for 276 servers. In addition, configurations can be specified in `lsp/<name>.lua`. 277 • |vim.lsp.enable()| has been added to enable servers. 278 • |vim.lsp.buf.code_action()| resolves the `command` property during the 279 `codeAction/resolve` request. 280 • The `textDocument/completion` request now includes the completion context in 281 its parameters. 282 283 LUA 284 285 • Command-line completions for: `vim.g`, `vim.t`, `vim.w`, `vim.b`, `vim.v`, 286 `vim.o`, `vim.wo`, `vim.bo`, `vim.opt`, `vim.opt_local`, `vim.opt_global`, 287 `vim.env` and `vim.fn`. 288 • Documentation for |lua-bit|. 289 • |gf| in Lua buffers can go to module in same repo, |runtime-search-path| and 290 |package.path|. 291 • |vim.fs.rm()| can delete files and directories. 292 • |vim.validate()| now has a new signature which uses less tables, 293 is more performant and easier to read. 294 • |vim.str_byteindex()| and |vim.str_utfindex()| gained overload signatures 295 supporting two new parameters, `encoding` and `strict_indexing`. 296 • |vim.json.encode()| has an option to enable forward slash escaping 297 • |vim.fs.abspath()| converts paths to absolute paths. 298 • |vim.fs.relpath()| gets relative path compared to base path. 299 • |vim.fs.dir()| and |vim.fs.find()| can now follow symbolic links, 300 the behavior can be turn on using the new `follow` option. 301 • |vim.hl.range()| now has a optional `timeout` field which allows for a timed 302 highlight. 303 • |vim.text.indent()| indents/dedents text. 304 305 OPTIONS 306 307 • 'completeopt' flag "fuzzy" enables |fuzzy-matching| during |ins-completion|. 308 • 'completeopt' flag "preinsert" highlights text to be inserted. 309 • 'wildmode' flag "noselect" shows 'wildmenu' without selecting an entry. 310 • 'messagesopt' configures |:messages| and |hit-enter| prompt. 311 • 'tabclose' controls which tab page to focus when closing a tab page. 312 • 'eventignorewin' to persistently ignore events in a window. 313 • 'winborder' sets the default border for |floating-windows|. 314 315 PERFORMANCE 316 317 • Significantly reduced redraw time for long lines with treesitter 318 highlighting. 319 • LSP diagnostics and inlay hints are de-duplicated (new requests cancel 320 inflight requests). This greatly improves performance with slow LSP servers. 321 • 10x speedup for |vim.treesitter.foldexpr()| (when no parser exists for the 322 buffer). 323 • Strong |treesitter-query| caching makes repeat |vim.treesitter.query.get()| 324 and |vim.treesitter.query.parse()| calls significantly faster for large 325 queries. 326 • Treesitter highlighting is now asynchronous. To force synchronous parsing, 327 use `vim.g._ts_force_sync_parsing = true`. 328 • Treesitter folding is now calculated asynchronously. 329 • |LanguageTree:parse()| now only runs the injection query on the provided 330 range (as long as the language does not have a combined injection), 331 significantly improving |treesitter-highlight| performance. 332 • Treesitter injection query iteration is now asynchronous, making edits in 333 large buffers with combined injections much quicker. 334 • 10x reduction in blocking time when attaching an LSP to a large buffer. 335 336 PLUGINS 337 338 • EditorConfig 339 • spelling_language property is now supported. 340 • 'inccommand' incremental preview can run on 'nomodifiable' buffers and 341 restores their 'modifiable' state 342 • Commenting 343 • 'commentstring' values can now be specified in a Treesitter capture's 344 `bo.commentstring` metadata field, providing finer grained support for 345 languages like `JSX`. 346 347 STARTUP 348 349 • |-es| ("script mode") disables shada by default. 350 • Nvim will fail if the |--listen| or |$NVIM_LISTEN_ADDRESS| address is 351 invalid, instead of silently skipping an invalid address. 352 353 TERMINAL 354 355 • The |terminal| now understands the OSC 52 escape sequence to write to the 356 system clipboard (copy). Querying with OSC 52 (paste) is not supported. 357 • |hl-StatusLineTerm| and |hl-StatusLineTermNC| define highlights for the 358 status line in |terminal| windows. 359 • The terminal buffer now supports reflow (wrapped lines adapt when the buffer 360 is resized horizontally). Note: Lines that are not visible and kept in 361 'scrollback' are not reflown. 362 • The |terminal| now supports OSC 8 escape sequences and will display 363 hyperlinks in supporting host terminals. 364 • The |terminal| now uses the actual cursor, rather than a "virtual" cursor. 365 This means that escape codes sent by applications running in a terminal 366 buffer can change the cursor shape and visibility. However, it also 367 means that the |TermCursorNC| highlight group is no longer supported: an 368 unfocused terminal window will have no cursor at all (so there is nothing to 369 highlight). 370 • |jobstart()| gained the "term" flag. 371 • The |terminal| will send theme update notifications when 'background' is 372 changed and DEC mode 2031 is enabled. 373 • The |terminal| has experimental support for the Kitty keyboard protocol 374 (sometimes called "CSI u" key encoding). Only the "Disambiguate escape 375 codes" mode is currently supported. 376 • The |terminal| emits a |TermRequest| autocommand event when the child process 377 emits an APC control sequence. 378 • |TermRequest| has a "cursor" field in its |event-data| indicating the 379 cursor position when the sequence was received. 380 381 TREESITTER 382 383 • |LanguageTree:node_for_range()| gets anonymous and named nodes for a range 384 • |vim.treesitter.get_node()| now takes an option `include_anonymous`, default 385 false, which allows it to return anonymous nodes as well as named nodes. 386 • |treesitter-directive-trim!| can trim all whitespace (not just empty lines) 387 from both sides of a node. 388 • |vim.treesitter.get_captures_at_pos()| now returns the `id` of each capture 389 • New |TSNode:child_with_descendant()|, which efficiently gets the node's 390 child that contains a given node as descendant. 391 • |LanguageTree:parse()| optionally supports asynchronous invocation, which is 392 activated by passing the `on_parse` callback parameter. 393 • |vim.treesitter.query.set()| can now inherit and/or extend runtime file 394 queries in addition to overriding. 395 • |LanguageTree:is_valid()| now accepts a range parameter to narrow the scope 396 of the validity check. 397 • |:InspectTree| now shows which nodes are missing. 398 • Bundled markdown highlight queries use `conceal_lines` metadata to conceal 399 code block fence lines vertically. 400 • |vim.treesitter.language.inspect()| shows additional information, including 401 parser version for ABI 15 parsers. 402 • |TSQuery:disable_pattern()| and |TSQuery:disable_capture()| to turn off 403 a specific pattern or capture in a query. 404 • |vim.treesitter.get_captures_at_pos()| returns the `pattern_id` of the 405 pattern used to match each capture. 406 • |Query:iter_captures()| now accepts an `opts` parameter, similar to 407 |Query:iter_matches()|. 408 409 TUI 410 411 • The builtin UI declares info |nvim_set_client_info()| on its channel. See 412 |startup-tui|. To see the current UI info, try this: > 413 :lua =vim.api.nvim_get_chan_info(vim.api.nvim_list_uis()[1].chan) 414 • |log| messages written by the builtin UI client (TUI, |--remote-ui|) are 415 now prefixed with "ui" instead of "?". 416 • The TUI will re-query the terminal's background color when a theme update 417 notification is received and Nvim will update 'background' accordingly. 418 419 UI 420 421 • |:detach| the current UI, let the Nvim server continue running as a background 422 process. Works with the builtin TUI, and all GUIs. 423 • |vim.ui.open()| (by default bound to |gx|) accepts an `opt.cmd` parameter 424 which controls the tool used to open the given path or URL. If you want to 425 globally set this, you can override vim.ui.open using the same approach 426 described at |vim.paste()|. 427 • `vim.ui.open()` now supports 428 [lemonade](https://github.com/lemonade-command/lemonade) as an option for 429 opening urls/files. This is handy if you are in an ssh connection and use 430 `lemonade`. 431 • The |ins-completion-menu| now supports cascading highlight styles. 432 |hl-PmenuSel| and |hl-PmenuMatch| both inherit from |hl-Pmenu|, and 433 |hl-PmenuMatchSel| inherits highlights from both |hl-PmenuSel| and 434 |hl-PmenuMatch|. 435 • |vim.diagnostic.setqflist()| updates an existing quickfix list with the 436 given title if found 437 • |ui-messages| content chunks now also contain the highlight group ID. 438 • |:checkhealth| can display in a floating window, controlled by the 439 |g:health| variable. 440 441 VIMSCRIPT 442 443 • |getchar()| and |getcharstr()| have optional {opts} |Dict| argument to control: 444 cursor behavior, return type, and whether to simplify the returned key. 445 446 ============================================================================== 447 CHANGED FEATURES 448 449 These existing features changed their behavior. 450 451 • 'scrollbind' now works properly with buffers that contain virtual lines. 452 453 Scrollbind works by aligning to a target top line of each window in a tab 454 page. Previously this was done by calculating the difference between the old 455 top line and the target top line, and scrolling by that amount. Now the 456 top lines are calculated using screen line numbers which take virtual lines 457 into account. 458 459 • The implementation of grapheme clusters (or combining chars |mbyte-combining|) 460 was upgraded to closely follow extended grapheme clusters as defined by UAX#29 461 in the unicode standard. Noteworthily, this enables proper display of many 462 more emoji characters than before, including those encoded with multiple 463 emoji codepoints combined with ZWJ (zero width joiner) codepoints. 464 465 This also applies to :terminal output, where width of cells will be calculated 466 using the upgraded implementation. 467 468 • Custom highlights in 'rulerformat', 'statuscolumn', 'statusline', 'tabline', 469 'winbar', and the sign/number column are stacked with their respective 470 highlight groups, as opposed to |hl-Normal|. 471 This is also reflected in the `highlights` from |nvim_eval_statusline()|, 472 with a new `groups` field containing an array of stacked highlight groups. 473 474 • |vim.on_key()| callbacks won't be invoked recursively when a callback itself 475 consumes input. 476 477 • "q" in man pages now uses |CTRL-W_q| instead of |CTRL-W_c| to close the 478 current window, and it no longer throws |E444| when there is only one window 479 on the screen. Global variable `vim.g.pager` is removed. 480 481 • Default 'titlestring' is now implemented with 'statusline' "%" format items. 482 This means the default, empty value is essentially an alias to: 483 `%t%(\ %M%)%(\ \(%{expand(\"%:~:h\")}\)%)%a\ -\ Nvim`. This is only an 484 implementation simplification, not a behavior change. 485 486 ============================================================================== 487 REMOVED FEATURES 488 489 These deprecated features were removed. 490 491 • option `severity_limit` for `vim.lsp.diagnostic` (use `min=severity` 492 instead |vim.diagnostic.severity|). 493 494 ============================================================================== 495 DEPRECATIONS 496 497 See |deprecated-0.11|. 498 499 vim:tw=78:ts=8:sw=2:et:ft=help:norl: