News

Nvim :help pages, generated from source using the tree-sitter-vimdoc parser.


Notable changes in Nvim 0.9 from 0.8

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.
: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.
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
nvim_exec() is now deprecated in favor of nvim_exec2().

NEW FEATURES news-features

The following new APIs or features were added.
Added a new experimental lua-loader that byte-compiles and caches lua files. To enable the new loader, add the following at the top of your init.lua:
vim.loader.enable()
Added lua-version for parsing and comparing version strings conforming to the semver specification.
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
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
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.gsplit() supports all features of vim.split().
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.
'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()
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.query.add_directive().
vim.treesitter.language.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.
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.
nvim_get_option_value() now has a filetype option so it can return the default option for a specific filetype.
vim.filetype.get_option() to get the default option value for a specific filetype. This is a wrapper around nvim_get_option_value() with caching.
Added nvim_get_hl() for getting highlight group definitions in a format compatible with nvim_set_hl().

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.
The := {expr} syntax can be used to evaluate a lua expression, as a shorter form of :lua ={expr}. := and :[range]= without argument are unchanged. However :=# and similar variants using ex-flags are no longer supported.

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.language.add() replaces vim.treesitter.language.require_language()
vim.api.nvim_get_hl_by_name(), vim.api.nvim_get_hl_by_id() were deprecated, use nvim_get_hl() instead.
The following top level Treesitter functions have been moved: vim.treesitter.inspect_language() -> vim.treesitter.language.inspect() vim.treesitter.get_query_files() -> vim.treesitter.query.get_files() vim.treesitter.set_query() -> vim.treesitter.query.set() vim.treesitter.query.set_query() -> vim.treesitter.query.set() vim.treesitter.get_query() -> vim.treesitter.query.get() vim.treesitter.query.get_query() -> vim.treesitter.query.get() vim.treesitter.parse_query() -> vim.treesitter.query.parse() vim.treesitter.query.parse_query() -> vim.treesitter.query.parse() vim.treesitter.add_predicate() -> vim.treesitter.query.add_predicate() vim.treesitter.add_directive() -> vim.treesitter.query.add_directive() vim.treesitter.list_predicates() -> vim.treesitter.query.list_predicates() vim.treesitter.list_directives() -> vim.treesitter.query.list_directives() vim.treesitter.query.get_range() -> vim.treesitter.get_range() vim.treesitter.query.get_node_text() -> vim.treesitter.get_node_text()
Main
Commands index
Quick reference