Quick links: help overview · quick reference · user manual toc · reference manual toc
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.™

• 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.

• help treesitter parser was renamed to vimdoc. The only user-visible
  change is that language-specific highlight groups need to be renamed from
  @foo.help to @foo.vimdoc.

• The default value of 'commentstring' is now empty instead of "/*%s*/".

• libiconv and intl are now required build dependencies.

NEW FEATURES                                                    news-features

The following new APIs or features were added.

• Treesitter syntax highlighting for help files now supports highlighted
  code examples. To enable, create a .config/nvim/ftplugin/help.lua with
  the contents 

  Note: Highlighted code examples are only available in the Nvim manual, not
  in help files taken from Vim. The treesitter vimdoc parser is also work in
  progress and not guaranteed to correctly highlight every help file in the

• 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.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,
  LSP semantic tokens, syntax groups and extmarks.

• vim.treesitter.inspect_tree() and :InspectTree opens a split window
  showing a text representation of the nodes in a language tree for the current

• '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.

• vim.secure.trust(), :trust allows the user to manage files in trust database.
  vim.secure.read() reads a file and prompts the user if it should be
  trusted and, if so, returns the file's contents.  Used by 'exrc'

• 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.

• A new environment variable named NVIM_APPNAME enables configuring the
  directories where Neovim should find its configuration and state files. See
  `:help $NVIM_APPNAME` .

• 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 an omnifunc implementation for lua, vim.lua_omnifunc()

• 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: 

• Added lua-version for parsing and comparing version strings conforming to
  the semver specification.

• 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.

• '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.

• --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.

• Added a vim.lsp.codelens.clear() function to clear codelenses.

• 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.

• 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.

• vim.diagnostic now supports LSP DiagnosticsTag.
  See: https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#diagnosticTagvim.diagnostic.is_disabled() checks if diagnostics are disabled in a given
  buffer or namespace.

• 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.

• 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.

• 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.

• Added nvim_get_hl() for getting highlight group definitions in a format
  compatible with nvim_set_hl().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.

• require'bit' is now always available lua-bit

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.

• 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()msgsep is now always enabled even if 'display' doesn't contain the "msgsep"
  flag. It is no longer possible to scroll the whole screen when showing
  messages longer than 'cmdheight'.

• 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 consistently.

• 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.

• Unsaved changes are now preserved rather than discarded when channel-stdio
  is closed.

• 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`

• nvim_eval_statusline() supports evaluating the 'statuscolumn' through a
  new opts field: use_statuscol_lnum.

• nvim_buf_get_extmarks() now accepts a -1 ns_id to request extmarks from
  all namespaces and adds the namespace id to the details array.
  Other missing properties have been added to the details array and marks can
  be filtered by type.

• 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().:highlight now supports an additional attribute "altfont".:Man manpage viewer supports manpage names containing spaces.

• nvim_select_popupmenu_item() now supports cmdline-completion popup menu.

• nvim_list_uis() reports all ui-option fields.

• nvim_get_option_value() now has a filetype option so it can return the
  default option for a specific filetype.

• build: 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.

REMOVED FEATURES                                                 news-removed

The following deprecated functions or APIs were removed.

• 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

• vim.treesitter.language.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.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()nvim_exec() is now deprecated in favor of nvim_exec2().

• Renamed vim.pretty_print() to vim.print().


Quick links: help overview · quick reference · user manual toc · reference manual toc