*news.txt* Nvim NVIM REFERENCE MANUAL Notable changes in Nvim 0.9 from 0.8 *news* Type |gO| to see the table of contents. ============================================================================== BREAKING CHANGES *news-breaking* The following changes may require adaptations in user config or plugins. • Cscope support is now removed (see |cscope| and |nvim-removed|): - Commands removed: - `:cscope` - `:lcscope` - `:scscope` - `:cstag` - Options removed: - `cscopepathcomp` - `cscopeprg` - `cscopequickfix` - `cscoperelative` - `cscopetag` - `cscopetagorder` - `cscopeverbose` - Eval functions removed: - `cscope_connection()` Note: support for |ctags| remains with no plans to remove. See https://github.com/neovim/neovim/pull/20545 for more information. • `:hardcopy` is now removed (see |hardcopy| and |nvim-removed|): - Commands removed: - `:hardcopy` - Options removed: - `printdevice` - `printencoding` - `printexpr` - `printfont` - `printheader` - `printmbcharset` • 'paste' option is now deprecated and 'pastetoggle' is removed. |paste| works automatically in GUI and terminal (TUI) Nvim. Just Paste It.™ • libiconv and intl are now required build dependencies. • Unsaved changes are now preserved rather than discarded when |channel-stdio| is closed. • Changes to |vim.treesitter.get_node_text()|: - It now returns `string`, as opposed to `string|string[]|nil`. - The `concat` option has been removed as it was not consistently applied. - Invalid ranges now cause an error instead of returning `nil`. • Renamed vim.pretty_print to vim.print. |deprecated| ============================================================================== NEW FEATURES *news-features* The following new APIs or features were added. • Added |vim.version| for parsing and comparing version strings conforming to the semver specification, see |lua-version|. • A new environment variable named NVIM_APPNAME enables configuring the directories where Neovim should find its configuration and state files. See `:help $NVIM_APPNAME` . • |nvim_open_win()| now accepts a relative `mouse` option to open a floating win relative to the mouse. Note that the mouse doesn't update frequently without setting `vim.o.mousemoveevent = true` • EditorConfig support is now builtin. This is enabled by default and happens automatically. To disable it, users should add >lua vim.g.editorconfig = false < (or the Vimscript equivalent) to their |config| file. • Added support for running Lua scripts from shell using |-l|. > nvim -l foo.lua --arg1 --arg2 < Also works with stdin: > echo "print(42)" | nvim -l - • Added a |vim.lsp.codelens.clear()| function to clear codelenses. • |vim.inspect_pos()|, |vim.show_pos()| and |:Inspect| allow a user to get or show items at a given buffer position. Currently this includes treesitter captures, semantic tokens, syntax groups and extmarks. • Added support for semantic token highlighting to the LSP client. This functionality is enabled by default when a client that supports this feature is attached to a buffer. Opt-out can be performed by deleting the `semanticTokensProvider` from the LSP client's {server_capabilities} in the `LspAttach` callback. See |lsp-semantic-highlight| for more information. • |vim.treesitter.inspect_tree()| and |:InspectTree| opens a split window showing a text representation of the nodes in a language tree for the current buffer. • Added support for the `willSave` and `willSaveWaitUntil` capabilities to the LSP client. `willSaveWaitUntil` allows a server to modify a document before it gets saved. Example use-cases by language servers include removing unused imports, or formatting the file. • Treesitter syntax highlighting for `help` files now supports highlighted code examples. To enable, create a `.config/nvim/ftplugin/help.lua` with the contents >lua vim.treesitter.start() < Note: Highlighted code examples are only available in the Nvim manual, not in help files taken from Vim. The treesitter `help` parser is also work in progress and not guaranteed to correctly highlight every help file in the wild. • |vim.secure.trust()|, |:trust| allows the user to manage files in trust database. • |vim.diagnostic.open_float()| (and therefore |vim.diagnostic.config()|) now accepts a `suffix` option which, by default, renders LSP error codes. Similarly, the `virtual_text` configuration in |vim.diagnostic.config()| now has a `suffix` option which does nothing by default. • |vim.fs.dir()| now has a `opts` argument with a depth field to allow recursively searching a directory tree. • |vim.secure.read()| reads a file and prompts the user if it should be trusted and, if so, returns the file's contents. • When using Nvim inside tmux 3.2 or later, the default clipboard provider will now copy to the system clipboard. |provider-clipboard| • |'showcmdloc'| option to display the 'showcmd' information in the status line or tab line. A new %S statusline item is available to place the 'showcmd' text in a custom 'statusline'. Useful for when |'cmdheight'| is set to 0. • |'splitkeep'| option to control the scroll behavior of horizontal splits. • |'statuscolumn'| option to customize the area to the side of a window, normally containing the fold, sign and number columns. This new option follows the 'statusline' syntax and can be used to transform the line numbers, create mouse click callbacks for |signs|, introduce a custom margin or separator etc. • |nvim_select_popupmenu_item()| now supports |cmdline-completion| popup menu. • |'diffopt'| now includes a `linematch` option to enable a second-stage diff on individual hunks to provide much more accurate diffs. This option is also available to |vim.diff()| See https://github.com/neovim/neovim/pull/14537. • |vim.diagnostic.is_disabled()| checks if diagnostics are disabled in a given buffer or namespace. • |--remote-ui| option was added to connect to a remote instance and display in it in a |TUI| in the local terminal. This can be used run a headless nvim instance in the background and display its UI on demand, which previously only was possible using an external UI implementation. • Several improvements were made to make the code generation scripts more deterministic, and a `LUA_GEN_PRG` build parameter has been introduced to allow for a workaround for some remaining reproducibility problems. • |:highlight| now supports an additional attribute "altfont". • |:Man| manpage viewer supports manpage names containing spaces. • Treesitter captures can now be transformed by directives. This will allow more complicated dynamic language injections. • |vim.treesitter.get_node_text()| now accepts a `metadata` option for writing custom directives using |vim.treesitter.add_directive()|. • |vim.treesitter.add()| replaces `vim.treesitter.language.require_language`. • `require'bit'` is now always available |lua-bit| • |vim.treesitter.foldexpr()| can be used for 'foldexpr' to use treesitter for folding. • Expanded the TSNode API with: - |TSNode:tree()| - |TSNode:has_changes()| - |TSNode:extra()| - |TSNode:equal()| Additionally |TSNode:range()| now takes an optional {include_bytes} argument. • |nvim_list_uis()| reports all |ui-option| fields. • Vim's `has('gui_running')` is now supported as a way for plugins to check if a GUI (not the |TUI|) is attached to Nvim. |has()| • Added preliminary support for the `workspace/didChangeWatchedFiles` capability to the LSP client to notify servers of file changes on disk. The feature is disabled by default and can be enabled by setting the `workspace.didChangeWatchedFiles.dynamicRegistration=true` capability. • Added an omnifunc implementation for lua, |vim.lua_omnifunc()| • Treesitter injection queries now use the format described at https://tree-sitter.github.io/tree-sitter/syntax-highlighting#language-injection . Support for the previous format will be removed in a future release. ============================================================================== CHANGED FEATURES *news-changes* The following changes to existing APIs or features add new behavior. • 'exrc' now supports `.nvim.lua` file. • 'exrc' is no longer marked deprecated. • The |TUI| is changed to run in a separate process (previously, a separate thread was used). This is not supposed to be a visible change to the user, but might be the cause of subtle changes of behavior and bugs. Previously, the TUI could be disabled as a build time feature (+tui/-tui), resulting in a nvim binary which only could be run headless or embedded in an external process. As of this version, TUI is always available. • API calls now show more information about where an exception happened. • The `win_viewport` UI event now contains information about virtual lines, meaning that smooth scrolling can now be implemented more consistenlty. ============================================================================== REMOVED FEATURES *news-removed* The following deprecated functions or APIs were removed. • It is no longer possible to scroll the whole screen when showing messages longer than 'cmdheight'. |msgsep| is now always enabled even if 'display' doesn't contain the "msgsep" flag. • `filetype.vim` is removed in favor of |lua-filetype| (Note that filetype logic and tests still align with Vim, so additions or changes need to be contributed there first.) See https://github.com/neovim/neovim/pull/20674. • 'hkmap', 'hkmapp' and 'aleph' options were removed. Use 'keymap' option instead. • |LanguageTree:parse()| no longer returns changed regions. Please use the `on_changedtree` callbacks instead. • `vim.highlight.create()`, `vim.highlight.link()` were removed, use |nvim_set_hl()| instead. • `require'health'` was removed. Use |vim.health| instead. ============================================================================== DEPRECATIONS *news-deprecations* The following functions are now deprecated and will be removed in the next release. • |vim.treesitter.add()| replaces `vim.treesitter.language.require_language()` • |vim.treesitter.get_node_at_pos()| and |vim.treesitter.get_node_at_cursor()| are both deprecated in favor of |vim.treesitter.get_node()|. vim:tw=78:ts=8:sw=2:et:ft=help:norl: