Files
neovim/test
Justin M. Keyes a99c469e54 NVIM v0.11.0
For notable changes, see runtime/doc/news.txt (or `:help news` in Nvim).

Following is a list of fixes/features commits.

BREAKING
--------------------------------------------------------------------------------
- 0f4f7d32ce remove `nvim` and `provider` module for checkhealth
- 7dbbaaec3f rename 'jumpoptions' flag "unload" to "clean" (#30418)
- 35c5e23107 store artifact shasums in a single shasum.txt file
- 188ec19894 turn off translations by default
- 328ea02eb7 use utf8proc full casefolding
- 737f58e232 api: rename Dictionary => Dict
- a389dc2f95 clipboard: use OSC 52 as fallback clipboard provider (#31730)
- ad70c9892d column: rework 'statuscolumn' %r/l items
- eb60cd74fb deps: bump tree-sitter to HEAD, wasmtime to v29.0.1 (#32200)
- a119aae4d3 diagnostic: filter diagnostics by severity before passing to handlers (#30070)
- 51ccd12b3d diagnostic: make virtual text handler opt-in (#32079)
- a9e725b26e diagnostics: sort underline severity_sort (#30898)
- e8b5dd1e89 lsp: `symbol_to_item` requires `offset_encoding`
- 8260e4860b lsp: multiple client support for vim.lsp.buf.hover()
- debabaf884 lsp: pass buffer number to root_dir function
- 9b357e30fd lsp: remove client-server handlers from vim.lsp.handlers
- 3e3775961f lsp: rename lsp.completion.trigger() to get() (#32911)
- 0083e03d6f lsp: support multiple clients in goto methods (#30877)
- dff684fdb3 lsp: support multiple clients in lsp.buf.references
- 970a27927e lua: do not use typed table for empty dict
- de48fbbd5f messages: vim.ui_attach message callbacks are unsafe
- a27419f3fc options: disallow setting hidden options #28400
- b922b7d6d7 options: use OptVal for option defaults #26691
- 4d9a1b9852 provider/python: add python 3.13, drop 3.7 and 3.8 (EOL) #33022
- 318676ad13 release: remove backwards compatible releases
- ad191be65e signs: place higher-priority signs from the left #27781
- 0dd933265f terminal: cursor shape and blink (#31562)
- 35e5307af2 terminal: include cursor position in TermRequest event data (#31609)
- 3cf602486c terminal: make 'belloff' and 'visualbell' apply to terminal bell (#30859)
- 041d98fe8d treesitter: add default fallback to `ft_to_lang` lookups
- 6913c5e1d9 treesitter: default to correct behavior for quantified captures (#30193)
- bd4ca22d03 treesitter: don't parse tree in get_parser() or start()
- a0b52e7cb3 treesitter: enforce buffer is loaded when creating parser
- 99e0facf3a treesitter: use return values in `language.add()`
- bda63d5b97 typval: remove distinction of binary and nonbinary strings
- 48e2a73610 ui: emit prompt "messages" as cmdline events #31525
- ca5fca2912 windows: drop cat and tee executables from windows
- be89d520d7 windows: only support UCRT, even for mingw

FEATURES
--------------------------------------------------------------------------------
- efa45832ea add "jump" options to vim.diagnostic.config() (#29067)
- 0631492f9c add vim.fs.relpath
- f864b68c5b allow gx to function for markdown links
- f3632e14e3 get/set namespace properties #28728
- a664246171 remove deprecated features
- ead5683ff9 api: add err field to nvim_echo() opts
- aec4938a21 api: broadcast events to ALL channels #28487
- 34d808b73c api: combined highlights in nvim_eval_statusline()
- 19b25f3fea api: deprecate nvim_buf_add_highlight()
- 5c92b40b4b api: deprecate nvim_out/err_write(ln)
- d84a95da7e api: nvim_get_autocmds filter by id#31549
- 25d8c3a5ad api: nvim_open_win() relative to tabline and laststatus #32006
- e00d67ef31 checkhealth: group parsers by name and path in output
- 563051a53e clipboard: support g:clipboard="osc52" #33021
- 60ea046741 clipboard: try cygutils, clip on Windows #30215
- 2c629ad13f column: apply appropriate numhl highlight to virt_lines (#32400)
- 65c7033cbe comment: allow commentstring to be determined from node metadata
- 268a3de0a7 complete: CompleteDone reason "cancel", "discard" #32600
- a616272f56 complete: specify reason for CompleteDone
- f1748b78e3 default: bind `vim.lsp.buf.signature_help` in select mode (#31223)
- ac207c3ac2 defaults: "Show Diagnostics" in mouse popupmenu #32122
- 2c6b635872 defaults: add LSP default mappings (again) (#28650)
- bb7604edda defaults: add default unimpaired style mappings (#28525)
- 4662ad5643 defaults: completeopt=popup #32909
- e8e3b443f8 defaults: disable 'foldcolumn' in terminal buffers (#31480)
- cc6992f1ca defaults: dot-repeat [<Space> #31186
- 6db830e40e defaults: enable diffopt "linematch" #32346
- b31132f1c1 defaults: jump between :terminal shell prompts with ]]/[[ #32736
- 0b7cc014fc defaults: map gO to LSP document_symbol #30781
- 26e765f905 defaults: map gri to vim.lsp.buf.implementation() (#30764)
- 76aa3e52be defaults: popupmenu "Open in browser", "Go to definition" #30261
- 09d76afe84 defaults: pretty :help headings #30544
- 079e5f4f9b defaults: unimpaired empty line below/above cursor #30984
- 1c6d920052 defaults: use vim.diagnostic.jump() for default mappings (#29066)
- c9c17fda80 deprecations: vim._defer_deprecated_module()
- 38a52caec0 diagnostic: add `current_line` option for `virtual_text` handler
- 8ba73f0e4c diagnostic: add vim.diagnostic.jump() (#26745)
- 445ecca398 diagnostic: format() can filter diagnostics by returning nil #32302
- 99e7323aa3 diagnostic: inherit parent 'path' option in open_float (#31273)
- 21961967ff diagnostic: update quickfix list by title #31486
- 7579af3c51 diagnostic: vim.diagnostic.setqflist improvements #30868
- 1759b7844a diagnostic: virtual_lines #31959
- fd65422b99 diff: do not try external when out of memory
- 0c296ab224 docs: "yxx" runs Lua/Vimscript code examples #31904
- 6628741ada docs: improve `@see` meta docstrings #30693
- 23290e7676 editor: handle new multibyte sequences in normal mode replacement
- cb6c0fda71 editorconfig: add support for spelling_language (#28638)
- 4817547ec4 ex_cmds: :sleep! hides the cursor while sleeping (#31493)
- 4f9260d06a ext_messages: add hl_id to ext_messages chunks
- 4cced601c8 extmark: stack multiple highlight groups in `hl_group`
- 931ee5591f extmarks: virtual text can be right-aligned, truncated #31921
- 62d9fab9af float: add winborder option (#31074)
- 9b8907d905 float: allow enabling mouse for non-focusable window (#30844)
- 511b991e66 fs.lua: add vim.fs.rm()
- 054a287dbe ftplugin: change 'commentstring' to `// %s` for C/C++ (#29085)
- f398e3a61a ftplugin: set Lua 'omnifunc' to vim.lua_omnifunc #32491
- b61051ccb4 func: allow manual cache invalidation for _memoize
- 548f19ccc3 health: close checkhealth buffers with q #31870
- f2fa4ca97e health: highlight headings #30525
- b12b91c274 health: show :checkhealth in floating window #31086
- 6592873f77 help: use treesitter for table of contents
- 3e09fbdf82 highlight: add StatusLineTerm and StatusLineTermNC groups
- 295920845e highlight: make `PmenuMatch` and `PmenuMatchSel` bold
- 5b1136a99c inccommand: preview 'nomodifiable' buffers #32034
- 61025c9e7a install: mention standard paths, XDG vars in Windows installer #29101
- 8ef41f5902 jobs: jobstart(…,{term=true}), deprecate termopen() #31343
- e7020306a1 jumplist: allow opting out of removing unloaded buffers (#29347)
- 8d55cc218c keysets: teach Union and LuaRefOf
- 5931f780e0 log: use "ui" as default name for TUI client #30345
- e4c6e732fd lsp: add select kind in showMessageRequest #32387
- f20335a54c lsp: add support for completionItem.command resolving
- 3f1d09bc94 lsp: add vim.lsp.config and vim.lsp.enable
- 6072153796 lsp: announce codeLens resolveSupport (#29956)
- 1f5bcc7c4e lsp: completion opts support custom item conversion (#30060)
- ff097f2091 lsp: completion side effects
- 7a7747f1e4 lsp: deprecate execute_command with client:exec_cmd
- 454ae672aa lsp: deprecate non-method client functions
- 54249d051c lsp: deprecate vim.lsp.buf.completion
- e56437cd48 lsp: deprecate vim.lsp.start_client #31341
- 55e4301036 lsp: drop fswatch, use inotifywait (#29374)
- dad55f5e76 lsp: export diagnostic conversion functions (#30064)
- 44229bb85b lsp: highlight hover target/range #31110
- 27f3750817 lsp: improve LSP doc hover rendering #30695
- 6722149776 lsp: include `end_col` and `end_lnum` in `vim.lsp.buf.symbols_to_items`
- 20f22f75ee lsp: include end_col, end_lnum in vim.lsp.buf.locations_to_items #29164
- 4e90bc3023 lsp: lsp.completion support set deprecated (#29882)
- 6e68fed374 lsp: multi-client support for signature_help
- 629483e24e lsp: require `offset_encoding` param #31249
- e00cd1ab40 lsp: return resolved config for vim.lsp.config[name]
- 130b5fd85f lsp: return table from lsp/ files on runtimepath (#31663)
- ce678043e3 lsp: show server name in code actions #30830
- 07d5dc8938 lsp: show server version in `:checkhealth` #31611
- a1e313ded6 lsp: support `textDocument/foldingRange` (#31311)
- 3b0fe2659e lsp: support completion context #32793
- 41b07b128c lsp: support for resolving code action command (#32704)
- 35247b00a4 lsp: support function for client root_dir (#31630)
- 45e76acaa0 lsp: support hostname in rpc.connect #30238
- b2bad0ac91 lsp: support postfix snippets in completion
- d3e4ffafff lsp: support utf-8 and utf-32 position encodings
- 5d26934c7c lsp: update LSP healthcheck format (#28980)
- ae2fd91b41 lsp: update LSP types
- 0df2c6b5d0 lsp: use fuzzy match on filterText instead of prefix match
- e4c1f6667b lsp: use the meta model to generate server capability map
- 5581a95534 lsp: vim.lsp.buf.format() supports textDocument/rangesFormatting #27323
- 92e4e3fb76 lsp.util: fix type errors
- ff1d7d4299 lsp.util: get_bufs_with_prefix -> get_writeable_bufs
- cbc82011ce lsp.util: improve offset_encoding type annotations
- a18fa2f11c lsp.util: minor codestyle
- 1944c0d610 lsp.util: refactor get_border_size()
- f0973d4227 lsp.util: refactor symbols_to_items()
- 0e8568d72c lsp.util: remove lsp spec extract
- 0621718e3b lsp.util: remove metatable in locations_to_items
- 3f87e222f7 lsp.util: remove some aliases
- e954a16063 lsp.util: remove some variables
- 5bec7288a5 lsp.util: remove uneeded do-end
- 8ad000ef7c lsp.util: remove unneeded table
- d44d36b8ff lsp.util: simplify some bounds checking
- 0066dd0f65 lsp.util: use faster version of vim.validate
- 1edfe5c09e lsp.util: use vim.api alias
- 97119a2369 lsp.util: use vim.w/b
- cd53db2157 lua: add `context.env` (environment variables) to `vim._with()`
- 9afa1fd355 lua: add `vim._with`
- 5180707310 lua: add `vim.fs.abspath`
- b34e137e43 lua: allow vim.on_key() callback to consume the key (#30939)
- d5ae5c84e9 lua: completion for vim.fn, vim.v, vim.o #30472
- 0a5a0efda6 lua: don't complete private (_) fields after dot (.) #32690
- 07cc559cdf lua: update `vim._with` to allow more granular option contexts
- af0ef2ac9d lua: vim.hl.range() "timeout" #32012
- be1fbe38b3 lua: vim.text.indent()
- fdeb01cd77 main: expand file ~\ or ~/ prefix on Windows (#28515)
- ea5b748f24 man.vim: "q" always closes window #30819
- f58e7d5fac marks: add conceal_lines to nvim_buf_set_extmark()
- 51cf84daf9 marks: virtual lines support horizontal scrolling (#32497)
- cfdf68a7ac mbyte: support extended grapheme clusters including more emoji
- 124c655f56 messages: "g<" mapping for ext_messages
- cb7b4e2962 messages: "verbose" message kind #31991
- 5bae80899d messages: add :!cmd shell message kinds
- e16bec41b6 messages: confirm kind for z=, :tselect, inputlist() #32521
- 21151144c6 meta: add type for quickfix entries
- 82a215cb2d options: add 'eventignorewin' (#32152)
- d831392b15 paste: unify cancel and error behavior (#30476)
- 08c328b8b0 runtime: Lua ftplugin 'includeexpr' #32719
- f5714994bc runtime: Lua ftplugin sets 'omnifunc', 'foldexpr' #32697
- e6cfcaed18 snippet: add default keymaps during snippet session
- 123f8d229e snippet: set snippet keymaps permanent instead of dynamic (#31887)
- 96128a5076 startup: validate --listen address
- 230b0c7f02 stdlib: overload vim.str_byteindex, vim.str_utfindex #30735
- 517ecb85f5 stdlib: vim.json.encode(...,{escape_slash:boolean}) #30561
- 8df6736ca1 term: enable reflow by default (#21124)
- 4199671047 term: support OSC 8 hyperlinks in :terminal (#30050)
- 93480f7fba term: trigger TermRequest for APC (#32407)
- 3ad977f01d terminal: add support for copying with OSC 52 in embedded terminal (#29117)
- 6f0bde11cc terminal: add support for kitty keyboard protocol
- 06a1f82f1c terminal: forward X1 and X2 mouse events
- e3bfcf2fd4 terminal: support grapheme clusters, including emoji
- f1c45fc7a4 terminal: support theme update notifications (DEC mode 2031) (#31999)
- 56d11b494b terminal: disable 'number', 'relativenumber', and 'signcolumn' in terminal buffers (#31443)
- 34cd94812d test: support and document lua test case debugging
- b8c75a31e6 treesitter: #trim! can trim all whitespace
- ec8922978e treesitter: add more metadata to `language.inspect()` (#32657)
- bd3b6ec836 treesitter: add node_for_range function
- 688b961d13 treesitter: add support for wasm parsers
- 8543aa406c treesitter: allow LanguageTree:is_valid() to accept a range
- 44ccd9ca24 treesitter: allow `iter_captures` to accept `opts`
- 8b5a0a00c8 treesitter: allow disabling captures and patterns on TSQuery (#32790)
- 1af55bfcf2 treesitter: allow get_node to return anonymous nodes
- a94a2927d0 treesitter: allow passing lang to InspectTree
- 45e606b1fd treesitter: async parsing
- 3dfb9e6f60 treesitter: include capture id in return value of `get_captures_at_pos()` #30559
- 267c7525f7 treesitter: introduce child_with_descendant()
- 09f9f0a946 treesitter: show which nodes are missing in InspectTree
- b9b408a56c treesitter: start moving get_parser to return nil #30313
- da0ae95349 treesitter: support modelines in `query.set()` (#30257)
- 2e5b560482 treesitter: table of contents for checkhealth, markdown (#32282)
- 8ba047e33f treesitter: vertical conceal support for highlighter
- ff85e54939 tui: builtin UI (TUI) sets client info #30397
- 4fb3b57a19 tui: handle kitty key events in libtermkey (#31727)
- f93ecd2760 tui: parse CSI subparams in termkey (#29805)
- 44dbfcfba4 tui: recognize X1 and X2 mouse events
- e41368f3bc tui: support in-band resize events (#29791)
- d460928263 tui: update 'background' on theme change events (#31350)
- 45e319ade6 tutor: give hints to satisfy the line checker #30952
- 4b0e2605ea ui: UI :detach command
- 394f69a25d ui: additional arguments for cmdline_show/hide events
- a0e3fe5741 ui: cascading style inheritance for Pmenu* highlights #29980
- f85bc41c80 ui: don't show unfocusable windows in :tabs, 'tabline' #27984
- 9762c5e340 ui: gx: use url extmark attribute and tree-sitter directive (#30192)
- 43d552c566 ui: more intuitive :substitute confirm prompt #31787
- 433b342baa ui: sign/statuscolumn can combine highlight attrs #31575
- a10636fbe7 ui: specify whether msg_show event is added to history
- e049c6e4c0 ui: statusline text inherits highlights #29976
- 611ef35491 vim.fs: find(), dir() can "follow" symlinks #31551
- 3f15e57b26 vim.ui: configurable "gx" / vim.ui.open() tool
- f4b620c4e6 vim.ui.open: support lemonade #30845
- 3572319b4c vim.validate: improve fast form and deprecate spec form
- cb84cd5d9f win32: embed executable icon

FIXES
--------------------------------------------------------------------------------
- 200e7ad157 apply the change on more files
- 6720bd440f assert failure in VimL expression parser
- d123202ae6 change deprecation presentation
- ded15ca8c2 completion.enable(false,...) deletes invalid augroup #32121
- 7737f89206 deps build for ARM64 MSVC
- 50749f8df8 extend the life of vim.tbl_flatten to 0.13
- 25abcd243e fix broken wasmtime build
- b6ab294838 fix incorrect search code
- 46b69aaf14 include nvim/ascii_defs.h
- 01b4da65c2 merge all provider healthchecks into a single health.lua
- 5c245ec3e9 remove vim.lsp._with_extend
- 98ba65b8be replace NVIM with Nvim in default titlestring (#30348)
- 6aa42e8f92 resolve all remaining LuaLS diagnostics
- e71713ba2b show swapfile warning as a warning (#28971)
- 0418107074 update osc52 termfeatures flag on UIEnter/UILeave (#32756)
- 0829e7575d warn when :InspectTree on buffer with no parser #32783
- 47f2769b46 Man: completion on Mac
- 89f9f168a5 api: alloc and draw cursor window in nvim__redraw
- 743c5808b6 api: allow `scope = 'local'` with `buf` when using `nvim_get_option_value`
- 487c48ec86 api: clamp range lines in `nvim__redraw()` (#31710)
- 141114c170 api: crash on invalid buffer to nvim_buf_del_user_command (#31908)
- 716adbcc45 api: deprecate nvim_subscribe, nvim_unsubscribe #30456
- 1e47aa677a api: deprecated API nvim_get_option does not validate option name #31919
- 095c0876c2 api: don't override Vimscript SID (#32610)
- bff07f6dd0 api: don't try to get/set option for invalid option name (#31302)
- 0e59f6f4c7 api: don't use 'winborder' when reconfiguring float (#32984)
- cce1eb0806 api: error properly with invalid field in nvim_open_win (#30078)
- 63bbb7c109 api: fix 'winborder' preventing splits with nvim_open_win (#32981)
- f55213ce0e api: fix crash/leak with float title/footer on error (#30543)
- 022449b522 api: generic error messages, not using TRY_WRAP #31596
- 8de1dc6923 api: make `nvim_set_hl()` respect all `cterm` attributes (#31390)
- ad60b3fb48 api: memory leaks in vim.api.nvim_*get_option #32390
- 167a2383b9 api: not using TRY_WRAP, generic error messages #31595
- bf48dfadec api: nvim__complete_set requires completeopt=popup #31177
- d1d7d54680 api: nvim_buf_get_text() crashes with large negative column #28740
- 6ea45031d5 api: nvim_echo free text memory with invalid highlight (#31243)
- e2ad251c8d api: nvim_get_option_value does not clean up on FileType error #31219
- 5b9518b436 api: nvim_set_decoration_provider callback return type #31912
- 01a97d2ad7 api: nvim_win_set_buf(0, 0) fails if 'winfixbuf' is set #31576
- 40347f6e27 api: only flush nvim__redraw when necessary #31250
- 36f44b3121 api: remove invalid assertions
- 235cb5bc5f api: update "range" windows in nvim__redraw #31042
- 9c718bc2bc api: validation, documentation of hl_group #31195
- 289c9d21cb autocmds: once=true Lua event-handler may call itself #29544
- ffaab09e99 build: <termios.h> is system-dependent #31705
- 486076a0e1 build: remove USE_FNAME_CASE, redundant with CASE_INSENSITIVE_FILENAME
- 217e26cb64 build: surpress spurious warnings from gcc in -E preprocessor mode
- 34a2bfdcc5 build: vimdoc tags are not validated #32801
- 8070988247 channel: handle writing to file instead of pipe (#30519)
- c49162be59 channel: log after (not before) channel-close
- 965dc81f81 checkhealth: disable 'listchars' #31245
- 4c9f3689a1 checkhealth: failed if 'lua' in plugin name
- f5dd30948e checkhealth: handle nested lua/ directory #32918
- c48cf18752 checkhealth: module not found when `&rtp` has nested paths #32988
- 2495e7e22a clipboard: tmux clipboard depends on $TMUX #31268
- 847c28f6f6 cmdline: always show cmdline when it is a prompt #31866
- af4231d407 cmdline: cmdline completion of _defer_require() modules #33007
- a70ad5cdb6 cmdline: ext_cmdline block events for conditionals
- bbf36ef8ef cmdline: prevent cmdline_show events after exiting cmdline #32033
- 092042b43d cmdline: simplify and correct grapheme cluster adjustment
- 86ae59c612 colorscheme: distinguish CursorLine/Folded/StatusLineNC highlights #32256
- 9b9f54e2c1 colorscheme: underline StatusLineNC with 'notermguicolors' #28810
- 8bc28978b6 column: apply custom highlight to last 'statuscolumn' segment (#32182)
- 3cb1e825e6 column: check if signcolumn changed in all windows #31439
- 1dcda86559 column: clamp line number for legacy signs
- f2083bd55c column: crash with 'signcolumn' set to "number" (#29003)
- f9a49fab0c column: modifying a sign should update placed signs (#29750)
- d5f6f61879 column: set signcolumn width after splitting window (#30556)
- 063b69bab4 column: unnecessary redraws with resized 'statuscolumn' (#32944)
- 0a2218f965 comment: fall back to using trimmed comment markers (#28938)
- e788d1a3a9 completion: avoid deleting text when completion leader changes #31448
- bfa365a872 completion: don't include <Lua function> in -complete= (#30209)
- 55dc482e75 completion: fix inconsistent Enter behavior (#30196)
- 83a7d97d64 coverity: CID 509571 Uninitialized variables #30395
- e1c2179dd9 coverity: INTEGER_OVERFLOW #31657
- f9eb68f340 coverity: error handling CHECKED_RETURN #31618
- 069451bb21 coverity: size_t overflow #30497
- ff7832ad3f coverity/497355: shada_read_when_writing out of bounds read #30665
- c49030b75a coverity/497375: f_strpart cast overflow (#30773)
- 0fe4362e21 coverity/509227/509228: tui driver_ti underflow #30341
- 60e1862ccb coverity/510275: linematch out of bounds access (#30687)
- a2008118a0 coverity/510436: shada_read_when_writing index out of bounds (#30686)
- 71507281fb coverity/530826: validate_opt_idx unchecked negative idx (#32081)
- 5af9c065ad decor: don't draw invalidated virtual lines (#29858)
- a8fbe1d409 decor: don't use separate DecorSignHighlight for url (#30096)
- 34ded4d97b decor: exclude invalid marks from meta total
- 87610d82db decor: set invalid flag for end of invalidated paired marks
- 33ff546b50 decoration: fix crash when on_lines decor provider modifies marktree
- 0e299ebf75 decorator: noisy errors from decoration provider #31418
- f2173b1aa2 defaults: cannot remove "How-to disable mouse" menu item #30375
- 61aabe0730 defaults: default @/Q broken when 'ignorecase' is set (#29343)
- 8323398bc6 defaults: don't replace keycodes in Visual search mappings (#31460)
- f6f2334ac2 defaults: error messages UX for unimpaired mappings #30884
- 59a171fd99 defaults: improve visual search mappings #32378
- 01739d4673 defaults: missing ]Q/[Q unimpaired mappings #30943
- c644228e1d defaults: omit empty line from unimpaired mapping messages (#31347)
- ff93cccbc1 defaults: omit extraneous info from unimpaired mapping errors (#30983)
- 4075e613b2 defaults: properly pass count to quickfix commands (#30632)
- 289380bc40 defaults: use "range" instead of "count" for some mappings (#30642)
- 573fcb8b66 deps: revert accidental test commits (#30864)
- de794f2d24 diagnostic: broken variable reference #31557
- c78728a384 diagnostic: clear autocmd only for valid buf (#32861)
- f1fcf653cb diagnostic: clear virtual_lines autocmd only for valid buf #32979
- 921dc22fc0 diagnostic: correct `severity` type on `setqflist`, `setloclist` (#30506)
- 0e8e4a07f5 diagnostic: don't include diagnostic code when using custom formatter #32464
- d918ebe3b8 diagnostic: fix backwards compatibility for goto_next and goto_prev (#29593)
- f69937fdbd diagnostic: fix float scope filtering (#29134)
- 5bc948c050 diagnostic: improve current_line refresh logic #32275
- 4b3be56a03 diagnostic: make docs agree with code (#29561)
- fd902b1cb2 diagnostic: only store quickfix id when creating a new one #31466
- 3b1d0e7f70 diagnostic: remove deprecated `severity_limit` option
- 5eda7aafe9 diagnostic: setqflist() is stuck after vim.lsp.buf.document_symbol #31553
- 9a43ec13e6 diagnostic: show backtrace for deprecation warnings
- 4cbeb6fa3c diagnostic: silence :chistory #31701
- 6c975515c5 diagnostic: vim.diagnostic.setqflist() opens loclist on first call #31585
- 17c25a66fc diagnostic: virtual lines should scroll horizontally
- fb842dfc22 diagnostic: virtual_lines diagnostic columns (#32703)
- e5e81262af diagnostics: don't apply extmarks to invalid lines #29321
- c65646c247 diff: use mmfile_t in linematch
- 81ea44fa6a display: adjust winline info for concealed lines below last line (#32708)
- f25dd7a8d5 display: correctly store winline info for concealed lines (#32656)
- a901fb875f docs: add missing properties to hl_info #30032
- cc26cf0400 docs: do not treat indexes as `short_link`
- 056009f741 docs: markdown instead of vimdoc in meta docstrings #30680
- 8801b77ed0 docs: missing `@returns` desc in _meta/api.lua #30673
- 09bcb31068 docs: replace `yxx` mappings with `g==` #31947
- efe92f9dff docs: update context type in `vim.lsp.LocationOpts.OnList`
- b8135a76b7 docs: wrong return value annotation for `nvim_buf_get_extmarks`
- 376de1483e drawline: correct highlight priority with Visual selection (#30706)
- 9a0239fdc8 drawline: don't draw beyond end of window (#29035)
- b1c439cef6 drawline: don't draw beyond end of window with 'rnu' (#29406)
- 34344b939c editor: avoid scrolling :substitute confirm message #32149
- 9e7b0bcf51 editorconfig: fix indent style for `local.mk` (#31342)
- b0a1d35f69 eval: don't shorten $HOME in v:stacktrace (#32634)
- 2a3561819e eval: handle wrong v:lua in expr option properly (#29953)
- 4317d36669 event-loop: process input before events in getchar() (#32322)
- f05a6666cf events: always allow some events to be nested (#32706)
- e9f4ceeb74 events: don't expand `args.file` for Lua callback (#31473)
- 1f49a59b8b events: fix incorrect capitalization of Cmdwin* events (#32813)
- 8c2d45be77 exit: close memfiles after processing events (#30872)
- c7ec010ade extmark: builtin completion can still affect nearby extmarks #31387
- 93278e7720 extmark: clearer error message for invalid ephemeral mark usage
- 43a2019f09 extmarks: issues with revalidating marks #28961
- 84ad95fdc9 fileio: copy to correct buffer position when reading
- 93347a67bf filetype: fix :filetype detect error with -u NONE (#29991)
- aa9f21ee95 filetype: fix typos in filetype detection
- 032e024f8a filetype: handle .in files with no filename (#30487)
- 1077843b9b filetype: make filetype detection work with :doautocmd (#31470)
- 21cbd90007 filetype: normalize full path before matching #32227
- 5a8a34dafa filetype: source ftdetect/* after creating scripts.vim autocmds (#29445)
- cff5fa49fc float: "Not enough room" error for 1-line float #25192
- 07c5f41da3 float: can set title/footer without setting border #32594
- be01b361d8 float: cannot set title/footer independently #31993
- ff1791c9e5 float: close preview float window when no selected #29745
- d2cca606a1 float: ensure floating window width can fit title
- 8ddcf9d939 float: handle error in win_float_create() (#29742)
- 8b2b1fba2a float: missing default highlight for title
- df915f3afc float: properly find last window of tabpage (#30571)
- 17383870dd float: re-sort layers when grid zindex changed #30259
- 206f8f24a2 fs: make vim.fs.root work for relative paths and unnamed buffers (#28964)
- 2c160f39d3 ftplugin/man.vim: hide signcolumn (auto)
- 214ce8d33c gen_help_html: first tag in h2 is broken #30720
- ceea6898a8 gen_help_html: handle delimiter, heading #29415
- 6c3f7e7e27 gen_vimdoc: correctly generate function fields
- 913e81c35f getchar: do not simplify keycodes in terminal mode
- b109b1abce glob: avoid `subcapture nesting too deep` error (#29520)
- 4bd86120d4 glob: handle overlapping `{}` condition elements #29236
- b47b0b3f75 grid: double grid_line_start() with ext_messages #31292
- fe87656f29 grid: grid_line_start NULL access with 'redrawdebug'
- a9c89bcbf6 gx: allow `@` in url
- 570a8da01b health: "q" should not close last window #31876
- 2e3f1069f4 health: better layout of vim.treesitter health check
- 10f9173519 health: broken ruby detect #28804
- 84e85aeb10 health: check more "old" files #30421
- 5b778a64ec health: fix fetching url with python in provider health (#29594)
- b4b4cf46a7 health: fix pyenv root and python exepath detect issue
- 237d2aef4d health: return correct name from 'path2name()'
- 5e90406487 health: set nomodifiable in checkhealth buffers
- 9177371014 help: remove runnable code virtual text
- ff75f345ab highlight: 'winhl' shouldn't take priority over API (#31288)
- 458473acb8 highlight: add `StatusLineTerm`/`StatusLineTermNC` to `:color vim` (#29313)
- 6bcefad5a6 highlight: fix the seg fault caused by the invalid linked hl ids
- 8e81212e15 highlight: floating windows inherit NormalFloat from global-ns
- 6719276040 highlight: make TablineSel more noticeable with 'notermguicolors' #31905
- b67fcd0488 highlight: make `TablineSel` more noticeable #31896
- 862679c70f highlight: update `PmenuSel` for colored completion items #30183
- 59e130b6ca inccommand: ensure cursor is where it belongs
- 16f63b964f input: handle vim.on_key() properly with ALT and K_SPECIAL (#29677)
- b52ffd0a59 inspect: always show priority
- 9c278af7cc inspect: show priority for treesitter highlights
- 22fd52325b inspector: update semantic token namespace (#32157)
- efe1732c6f jobs: do not block UI when jobwait() doesn't block (#31803)
- 574ea6a191 keycodes: recognize <Find>, <Select> #28431
- 67bb0cfa79 loader: follow the style of the error message for built-in loaders
- 44740e561f log: RPC log format #32337
- 851137f679 log: log unset $TMPDIR at "debug" level #32137
- c908c2560d log: unify error messages for vim.ui_attach/decor providers #33005
- a6f219b06b log: unintuitive message for undefined $TMPDIR
- 2e6d295f79 lsp: account for changedtick version gap on modified reset (#29170)
- fac96b72a5 lsp: add foldingrange method support check #31463
- 8263ed4670 lsp: add textDocument/documentLink to capability map (#28838)
- a41b6fd173 lsp: autocmds to close lsp preview windows not cleared
- b42dc232c5 lsp: autotrigger should only trigger on client's triggerCharacters (#32266)
- 7031949be0 lsp: avoid reusing diagnostics from different servers in actions (#30002)
- fc9b70826e lsp: avoid vim.keymap.del error when stopping a client (#29478)
- 39d79efa1e lsp: better multi-client support for callHierarchy
- bdfba8598b lsp: cancel pending requests before refreshing
- f9bf64d746 lsp: check buffer is loaded and valid #30330
- c2bf09ddff lsp: check for configuration workspace folders when reusing clients
- 81b372fecd lsp: check for nil response from server (#29196)
- a9cdf76e3a lsp: check for valid buf before processing semantic tokens response
- 230bc34ca5 lsp: check if buffer is valid before LspDetach autocmd (#29162)
- af200c10cf lsp: check if buffer was detached in on_init callback (#28914)
- 02097e43c8 lsp: check if sig_help window is focusable when configuring cycle keymap
- 025c874415 lsp: clear lsp client diagnostics (#29050)
- c374f26430 lsp: clear word when expand multi-lines word (#32393)
- adf7c98d60 lsp: compare URI instead of workspace folder name (#30962)
- b4599acbf8 lsp: correct hover result handling (#30995)
- f8d5811c71 lsp: correctly check for "codeAction/resolve" support
- 7d8db54441 lsp: delete b:lsp_floating_preview buf var after win close
- 2a1f604c77 lsp: delete bufvar inside WinClosed event
- 879d17ea8d lsp: detach all clients on_reload to force buf_state reload (#28875)
- 292365fa1b lsp: do not detach from buffer if there are uninitialized clients (#29029)
- 37bf4c572a lsp: do not reset buf version when detaching client (#29242)
- d56ba71af1 lsp: document_symbol uses loclist by default #32070
- 720b309c78 lsp: don't send foreign diagnostics to servers in buf.code_action (#29501)
- 1f2f460b4a lsp: don't show codelens for buffers that don't support it (#29690)
- 5f527f24f0 lsp: don't use completion filterText if prefix is empty
- 305012ea07 lsp: enable `additionalPropertiesSupport`
- 9d9ee3476e lsp: ensure watcher cancel
- aec7f1979a lsp: fallback to `label` for completion items if all others are missing (#29522)
- 33d10db5b7 lsp: filter completion candidates based on completeopt (#30945)
- b3109084c2 lsp: fix cursor position after snippet expansion (#30659)
- 4b001f297a lsp: fix infinite loop
- 983953858e lsp: fix isIncomplete condition in completion trigger (#30130)
- 2ce4a4d91e lsp: fix reverse sorting of same position text edits (#29212)
- 8654a97006 lsp: handle empty call hierarchy items #30349
- f279d1ae33 lsp: handle encoding bounds in str_utfindex_enc
- 882a450a29 lsp: handle locations exceeding line length #30253
- 008782208d lsp: handle mixed encoding in tagfunc params
- e0a5c3bb58 lsp: handle multiline signature help labels #30460
- 8512f669f0 lsp: handle nil bytes in strings
- f03b1622ad lsp: handle nil root_dir in health check (#29007)
- ed07167261 lsp: handle non-existent configs in lsp.config/enable
- 003b8a251d lsp: handle out-of-bounds character positions #30288
- 5187be81c2 lsp: handle using array as open_floating_preview title (#33016)
- d9a2acdab3 lsp: hide layout in codelenses in virtual text (#28794) (#28807)
- f54266dbed lsp: hover border type can be string (#31013)
- 9a681ad09e lsp: hover keymap (#31208)
- a14fca432b lsp: improve LSP floating preview window cleanup #31353
- e29f245a10 lsp: inlay hints are rendered in the correct order (#29707)
- 0086ee90dd lsp: list all workspace folders in healthcheck #30966
- 0e394f136f lsp: log when receiving markup messages (#30065)
- 203e7a43d1 lsp: mention function name in warning #31301
- a4f575abd8 lsp: minimum height for floating popup #31990
- 4fd2694f20 lsp: missing method parameter when canceling requests
- be8d87014c lsp: on detach, cancel pending foldingRange requests #31509
- 7d5866d471 lsp: open_floating_preview() ignores max_height (#32716)
- 86770108e2 lsp: open_floating_preview() zindex relative to current window #31886
- 724d1110b1 lsp: pre-filter matches on label if filterText is missing (#29491)
- a450fda4ed lsp: prefer `on_list` over `loclist` in default handler
- 6bb40f3dbf lsp: prevent desync due to empty buffer (#29904)
- eb629cce91 lsp: redundant spaces in lsp log (#29970)
- 43581011e4 lsp: remove superfluous on_detach callback from semantic tokens module (#29174)
- d76f7fef13 lsp: reset active request when reporting an error
- 6bc7979044 lsp: reset the applied hints on `refresh` request #32446
- 47aaddfa0d lsp: resize hover window for concealed lines
- 081beb3659 lsp: restore get_language_id behaviour
- 29c72cdf4a lsp: retrigger diagnostics request on server cancellation (#31345)
- d9ccd828b0 lsp: return call hierarchy item, not the index (#30145)
- 9c20342297 lsp: reuse client if configs match and no root dir
- 6e45cd7f00 lsp: revert buf_versions deprecation/replacement (#29217)
- bdff50dee5 lsp: revert text edit application order change (#29877)
- e8a6c1b021 lsp: schedule call to vim.lsp.start for async root_dir (#31998)
- a108852b00 lsp: semantic token functions allow "0" bufnr #28849
- c3cb702ac7 lsp: set 'smoothscroll' in docs hover #30748
- 8a236c242a lsp: set floating window filetype after setup #32112
- 3c51058d76 lsp: set tagstack on jump via goto methods
- 24d7debdfb lsp: signature_help highlights wrong parameter #32382
- 80e37aa533 lsp: str_byteindex_enc bounds checking #30747
- 629a5b71b5 lsp: support multiple clients in typehierarchy
- e48179f31e lsp: suppress completion request if completion is active (#30028)
- 50f006b617 lsp: tagfunc fails in unusual buffer #30700
- 5ac8db10f0 lsp: trigger LspDetach on buffer delete (#28795)
- 19be3d2683 lsp: trim trailing whitespace from completion words (#29122)
- aa47af7e69 lsp: tune completion word extraction for decorated labels (#29331)
- 38838fb00a lsp: type-errors, other nits in vim.lsp.log #31235
- 8d7eb03040 lsp: unify get_completion_word for textEdits/insertText
- fe5ae88b20 lsp: update request name to capability map #30098
- 5aa9906676 lsp: use client.id instead of pairs index (#29143)
- c8d7d65679 lsp: use correct method for prepareTypehierarchy
- b9e6fa7ec8 lsp: use filterText as word if textEdit/label doesn't match
- 5d08b65ac2 lsp: use unresolved code action when `codeAction/resolve` fails
- 0a7e4e9e5f lsp: vim.lsp.enable(...,false) does not disable  #32002
- 888a803755 lsp: vim.lsp.start fails if existing client has no workspace_folders #31608
- 42ed0ffad9 lsp: when prefix is non word add all result into matches (#30044)
- 55bdb077b7 lsp: wrapped ctx in opts before passed to vim.lsp.completion.trigger #32837
- 2dcbfe78fc lsp.buf: use correct offset_encoding for all requests
- 3275ae830d lsp.protocal: improve typing of constants
- acbc6a7f91 lsp.util: inconsistent handling of offset_encoding
- 564173e556 lsp.util: wrong arguments to 'validate' function
- 614c9322d5 lua: SIGSEGV in luv callback with error(nil) #32595
- b283736388 lua: `@private` => `@nodoc` #32587
- b6e350a6b4 lua: allows tables with integer keys to be merged in tbl_deep_extend
- c8b64b7a43 lua: always use vim.inspect() for :lua= (#32715)
- 0e42c81c7f lua: avoid recursive vim.on_key() callback (#30753)
- fe1e2eff06 lua: avoid vim._with() double-free with cmdmod (#31505)
- 487f44a6c1 lua: change some vim.fn.expand() to vim.fs.normalize() (#29583)
- 43bd9c9c1c lua: don't clamp -1 or v:maxcol in vim.highlight.range() (#29203)
- bdc6e38781 lua: don't include text after cursor in completion pattern (#29587)
- e2aca58bcc lua: don't override script ID from :source (#32626)
- d40481322a lua: ensure inspect_pos() only shows visible highlight extmarks
- 948f2beed4 lua: find length of completion prefix earlier (#29384)
- ebb963a4a0 lua: format errors from luv callbacks using __tostring
- 65a703e060 lua: ignore stdout and stderr for xdg-open
- 6b00c9acfd lua: no omni/cmdline completion for vim.env (#33044)
- c6d2cbf8f5 lua: pop retval for fast context LuaRef
- a5b1b83a26 lua: prevent SIGSEGV when lua error is NULL in libuv_worker
- 3d707e6f14 lua: remove vim.loader.disable() #31344
- 3a88113246 lua: revert vim.tbl_extend behavior change and document it
- 3688a33354 lua: show stacktrace for error in vim.on_key() callback (#31021)
- 40a149e7f9 lua: types for vim.api.keyset.win_config #32700
- 7f33c1967b lua: use rawget() to get __call in vim.is_callable() (#29536)
- 960fdc775a lua: vim.deprecate does not support major>0
- d832518ec6 lua: vim.hl.on_yank highlights wrong region with yi' (#32850)
- cd3855fb2b lua: vim.tbl_get({}, nil, 1) should return nil #32218
- 89d6d6f25c lua: wrong script context for option set by func from nvim_exec2 (#32659)
- 9eb0426002 luacats: allow all types inside tuples
- ee5aaba215 man: avoid setting v:errmsg (#30052)
- 7588ff2d89 man: check if buffer is valid before restoring 'tagfunc' (#30180)
- da6f68ee69 man: filter OSC 8 hyperlink markup #29171
- 7940ec6913 man.lua: `:Man <tab>` does not complete #31569
- e08e3d15f6 man.lua: skip `Attrs.None` highlights #32262
- d6653e1cc9 marks: ensure decor is removed with proper range (#32973)
- 906ad04ddd marks: handle composing in inline virt_text with 'nowrap' (#32477)
- 8452032554 marks: handle double-with inline virt_text with 'nowrap' (#32476)
- 86046c5a31 marks: ineffective conceal_line callback optimization (#32662)
- 72f630f92d marks: issues with invalid marks and marks beyond eob (#32862)
- 8da59060c6 marks: mark winline as invalid if change is in a concealed line (#32766)
- 012db2b0f5 marks: revalidate marks whose position did not change
- 5cc93ef472 marks: revise metadata for start mark of revalidated pair #32017
- c4f76299f0 marks: skip right_gravity marks when deleting text
- cdedfc3743 marks: truncate double-width inline virt_text consistently (#32560)
- 7371abf755 marks: wrong winline info for concealed line with below virt line (#32747)
- a9287dd882 mbyte: check for utf8proc_map() failure (#30531)
- 50a576ba57 mbyte: mark any 0xFE0F sequence as a TUI ambiguous width char
- 15bc930fca memline: don't check line count for closed memline #32403
- aa976f0d93 messages: add a trailing space to inputlist() etc. prompts (#32328)
- 37c77ab46b messages: attaching/detaching ext_messages causes asserts #31952
- d98827b634 messages: avoid empty msg_showmode with 'noshowmode'
- 31d6885deb messages: better formatting for :highlight with ext_messages #31627
- 21718c67dd messages: better formatting for ext_messages #31839
- 92556be33d messages: compute msg_col after last newline in ext_messages
- ad853d1df0 messages: improve deadly signal messages #32364
- 51853b82bc messages: incorrect error message splitting and kind #32990
- 08f7c22377 messages: list_cmd kind for :registers, :au[g] #32531
- 7ce27381fb messages: lsp window/showMessage is not an error
- 1b6442034f messages: more ext_messages kinds #31279
- 9c6a3703bb messages: no message kind for :undo messages #31590
- ca760e645b messages: no message kind for :write messages #31519
- 909b18d05a messages: no message kind for completion menu messages #31646
- f111c32ff9 messages: no message kind for search pattern #31272
- 282f73f067 messages: no trailing newline for inputlist, tselect, z= with ext_messages
- 9fa3a0964e messages: pass previous highlight id to ext chunks
- e025f5a5b3 messages: proper multiline Lua print() messages #31205
- d1e00a5f6d messages: typo and unwanted truncation in msg_outtrans_long #31669
- d55b17e2b4 messages: verbose kind for nvim_echo()
- c8e47f6480 meta: do not use hyphens in param names
- 2cd72258f6 mouse: 'statuscolumn' fold and popopmenu handling
- 81d4e96bc8 mouse: don't treat click on hsep as click on statusline (#29565)
- 102971a396 mouse: early return when clicking in padded 'statuscolumn' (#29394)
- 86c5c8724b mouse: indicate X1 and X2 button clicks on statusline (#30655)
- f86864f22f move: 'scrolloff' cursor correction no longer handles folds properly (#32642)
- 5947f249f8 move: half-page scrolling with resized grid at eob (#28821)
- ac7e0ff32f move: redraw for 'concealcursor' after changing w_wcol (#31276)
- af0a2157ad move: wrong cursor row on concealed line (#32629)
- 83479b95ab mpack: remove invalid bool definition
- d32780de4d mswin: UI may hang on exit
- fa99afe35e multibyte: handle backspace of wide clusters in replace mode
- de83cc5842 netrw: re-add missing comment marker in syntax file
- d9585bdcfb nvim__set_complete: pum preview info truncated during completion #32555
- 34e2185022 options: better handling of empty values
- 190d0241e2 options: fix 'winborder' accepting multiple string values (#32978)
- 8c532a9ea8 options: fix 'winhl' still accepting invalid value (#30896)
- 1b9dafa67b options: fix :setglobal not working for 'spelloptions' (#30894)
- 395f420fc6 options: fix some 'belloff' flags not working properly (#30856)
- 50e63c8171 options: missing error check for global 'scl' and 'winhl' (#30919)
- e697c1b43d paste: improve repeating of pasted text (#30438)
- 052875b9dc paste: only record a paste when it's from RPC (#30491)
- 9516997eb0 paste: wrong '[ mark after pasting a big string (streamed chunks) #33025
- 42aa69b076 path: avoid chdir() when resolving path (#28799)
- 42db8b1759 path: crash with nvim_get_runtime_file during wildcard expansion (#32992)
- 0dfcf3fe12 plines: don't count invalidated virt text in char size (#29863)
- afc3c43f12 popup: new preview_bufnr created when menu item is selected #32819
- ac1c5ccb2c popup: reuse pum preview float win, set 'winfixbuf' #32636
- d288f7003d popup: wrong extmark data sync when lines changed in popup preview #30246
- d24fb72c33 pum: don't select item when clicking to the left/right (#30967)
- 73ae7d44a2 quickfix: make shortmess+=O work with cmdheight=0 (#29609)
- 3bcd5624be regexp: fix typo in E888 error message (#30161)
- cb924764a4 runtime: "E121 Undefined variable s:termguicolors" #32209
- 29a47b39cc runtime: E15: Invalid expression in lua file when `gf`
- b6c1ce8a95 runtime: add commentstring for glsl ftplugin
- 9ddfcb64bf runtime: add remaining missing commentstrings (#30252)
- e641155b02 runtime: avoid E31 in ftplugin (#32578)
- 82b02ae2f2 runtime: clean up one-off scripts
- 9788b81d7e runtime: fully port emoji_list to Lua
- 74fcc9452c runtime: gO always says "Help TOC" #32971
- 69aa33d890 runtime: let matchit and matchparen skips fallback on treesitter captures
- 8369590eb2 runtime: remove obsolete ftplugin/calender.lua
- 41b70a0dea runtime: set 'keywordprg' only once in vim ftplugin
- 7b16c1fa84 runtime: source c ftplugin properly for cpp on Windows (#29053)
- 12c9791e0f runtime: stop treesitter highlight in b:undo_ftplugin (#29533)
- 862338255d runtime: sync bundled treesitter queries
- 9e80738f30 runtime: sync bundled treesitter queries
- 5057753431 runtime: treat b:undo_ftplugin consistently in Lua ftplugins (#30473)
- 8f5e908110 runtime: update b:undo_ftplugin in Lua runtime files (#29529)
- a5bd6665b0 scripts: update bundled dependencies in bump_deps
- 573a71469d scrollbind: properly take filler/virtual lines into account
- a8b6fa07c4 search: avoid quadratic time complexity when computing fuzzy score (#32153)
- 648d6426c8 server: CID 509282: DEADCODE #30316
- f4921e2b7d shada: ":wshada/:rshada [filename]" with shadafile=NONE #32538
- cd48b72b60 shada: restore search pattern length properly (#28929)
- 608543f8a9 snippet: cancel snippet session when leaving the buffer (#29031)
- 7994fdba6a snippet: don't override unnamed register on tabstop select (#28998)
- 5fe4ce6678 snippet: modify base indentation when there's actually whitespace (#29670)
- 424f4cc038 snippet: wrong indentation when snippet contains "^" #32970
- d46ebd2a74 startup: avoid crash with completion from -l script (#32160)
- 08153ddd1c startup: ignore broken $XDG_RUNTIME_DIR #30285
- 17e00d0cc6 startup: report --startuptime error to stderr (#31131)
- 8a2aec9974 startup: server fails if $NVIM_APPNAME is relative dir #30310
- 19fc65acbc statuscolumn: misleading v:lnum for virtual lines #32912
- 87e806186c statusline: overwriting stl_items with nvim_eval_statusline() {-item #32265
- 1c30d86c33 tabline: restore behavior of click after last tabpage (#30602)
- a49f95d887 terminal: avoid mismatched `busy_start` without `busy_stop` (#32458)
- f3ce67549c terminal: avoid more `busy_start` lacking `busy_stop` (#32509)
- 3d49c55d3c terminal: avoid rescheduling events onto the same queue (#32755)
- 69a19295f8 terminal: delay when finishing terminal process #32846
- f8c8a245aa terminal: don't crash on unprintable chars
- 6d997f8068 terminal: handle C0 characters in OSC terminator (#30090)
- fa46441264 terminal: improve cursor refresh handling (#32596)
- 1d11808bfd terminal: interrupt/got_int hangs terminal (#30056)
- 3db3947b0e terminal: restore cursor from 'guicursor' on TermLeave (#31620)
- c51bf5a6b2 terminal: set cursor cell percentage (#31703)
- 5def8714ad terminal: set local values of window options (#29326)
- e9c077d197 termkey: fix null pointer dereference (#31792)
- c8e3618e0e test: "tempdir not a directory" in CI logs
- f7e32fb6e6 test: better management of tmpfiles
- db2c3d1143 tests: filter out lines with __typeof__ keyword (#32524)
- e61228a214 tests: needing two calls to setup a screen is cringe
- 639734bed4 tests: remove the __extension__ keyword  in filter_complex_blocks (#32483)
- 59baa5e8a1 tohtml: apply sp color if present #30110
- 67c39f5eca tohtml: disable modeline #32822
- e37404f7fe tohtml: enclose font-family names in quotation marks
- 25db0a1385 tohtml: extmark text may be out of bounds
- 8cd9feb501 tohtml: ignore lsp inlay hints
- eb37241d38 tohtml: properly handle multiple hl groups #29012
- 2ed6423c7e tohtml: replace ipairs with pairs
- 88c7997503 tohtml: show how many warnings are hidden
- 118ae7e5ed tohtml: support ranges again
- c63e49cce2 treesitter: #trim! range for nodes ending at col 0 #31488
- b63cd8cbae treesitter: EditQuery shows swapfile ATTENTION #30536
- 55b165ac15 treesitter: `TSNode:field()` returns all children with the given field
- 86b737649b treesitter: add 'QuitPre' event to autocommands in inspect_tree
- bc1018a8d3 treesitter: avoid computing fold levels for empty buffer
- a119dab40f treesitter: avoid computing foldlevels for reloaded buffer #32233
- 6696ea7f10 treesitter: clean up parsing queue
- 99acc9de55 treesitter: close InspectTree/EditQuery window on BufUnload (#31036)
- f50f86b9ff treesitter: compute folds on_changedtree only if not nil
- 7a20f93a92 treesitter: correct condition in `__has_ancestor`
- 9b25c68db2 treesitter: correctly parse queries with combined injections
- 3abfaafad2 treesitter: detect trees with outdated regions in `is_valid()`
- 9217e0d671 treesitter: display fields for anonymous nodes in :InspectTree
- da4e8dc5b0 treesitter: do not modify highlight state for _on_spell_nav
- 0e3e1e6b6d treesitter: don't open fold when o/O adds a line below #28709
- aa2b44fbb0 treesitter: don't return error message on success #31955
- b0bbe25c48 treesitter: don't spam query errors in the highlighter
- b88874d33c treesitter: empty queries can disable injections (#31748)
- d413038b4f treesitter: ensure syntaxset augroup exists (#29542)
- f8e1ebd6f6 treesitter: escape things like `"` in omnifunc results
- c4eb0b64bd treesitter: find buffer in multiple windows #28922
- 94d42a3e72 treesitter: highlight anonymous nodes in inspect_tree
- 5331f87f61 treesitter: indent size for inspect_tree #28727
- 6ef80eb42c treesitter: keep treeview open if source window is still open #31198
- 052e048db6 treesitter: lint top-level anonymous nodes
- 4b90952851 treesitter: mark supertype nodes as named
- 096ae3bfd7 treesitter: nil access when running string parser async
- c3337e357a treesitter: nil check query for has_conceal_line
- 6711fa27ca treesitter: recalculate folds on VimEnter #32240
- 05dcda8f9b treesitter: recognize aliased parsers in omnifunc, query linter
- d3193afc25 treesitter: remove duplicate symbol names in language.inspect()
- cdc9baeaf8 treesitter: remove redundant on_bytes callback #31041
- 1827ab7a1f treesitter: separately track the number of valid regions
- 36990f324d treesitter: show proper node name error messages
- 4349bdbd0b treesitter: specify success status in edit_query return value
- e7ebc5c13d treesitter: stop async parsing if buffer is invalid
- 0f067cd34d treesitter: suppress get_parser warnings via opts.error
- ae917dbd06 treesitter: sync queries from upstream
- c4e9ff30a6 treesitter: sync queries with upstream
- d8eec81560 treesitter: update lua, markdown queries
- 6e44a6a289 treesitter: update queries
- 5a54681025 treesitter: uv_dlclose after uv_dlerror
- e4bc8b5967 treesitter.foldexpr: only refresh valid buffers
- 48acbc4d64 treesitter.foldexpr: refresh in the buffers affected by OptionSet
- 8474f52978 treesitter.foldexpr: robustness against ctrl-c
- f81131cca2 tui: also reset cursor color if it was invisible (#31348)
- 4846bf05dc tui: avoid flushing buffer halfway an OSC 2 sequence (#30793)
- 720ec5cec2 tui: cursor color in suckless terminal #32310
- b5cb69f8a4 tui: handle key events for arrow and function keys (#31804)
- d7651b27d5 tui: move $COLORTERM check to _defaults.lua (#29197)
- a811d4babd tui: only reset cursor color if it was changed (#31337)
- 0c0352783f tui: remove DCS escaping in tmux (#32723)
- 47c741e30c tui: remove duplicate disabling of synchronized output (#28884)
- f32557ca67 tui: reset active attr ID when OSC 8 sequence is terminated (#29960)
- bc63ffcf39 tui: reset clear_region attributes during startup #28713
- b02c839414 tui: set id parameter in OSC 8 sequences (#29840)
- 0231265c8c tui: skip TUI in ui_rgb_attached (#29096)
- 8b8096500d tutor: incorrect lines marked as correct #29833
- 31745b17e6 types: add narrower vim.validate types
- 44410d063a types: add some vim.fn type annotations
- b813075b8a types: do not mark unstable API as private
- e947f226be types: use vararg return type annotation
- a1906c23dd ui: Windows :detach is opt-in
- 594c7f3d77 ui: avoid ambiguity about last chunk when flushing halfway (#29718)
- 216ec73972 ui: avoid redundant ext_cmdline events (#32237)
- 6cdcac4492 ui: clamp 'cmdheight' for other tabpages on screen resize (#31419)
- 318c0415d5 ui: correctly pass metadata to get_node_text #30222
- 7eba016c86 ui: ensure screen update before waiting for input #30576
- 5b6477be45 ui: flush ext_cmdline events before doing cmdpreview #27950
- 6e4df18b45 ui: no fast context for prompt message kinds #31224
- 6b8c56c7f6 ui: schedule UI detach (#32827)
- b66106a46c ui: superfluous showmode / excessive grid_cursor_goto #29089
- d1fd674df3 ui: update title in more cases (#31508)
- 442d338cb5 uri: uri_encode encodes brackets incorrectly for RFC2732 #31284
- d049752e45 version: fix vim.version().prerelease
- 8bdfc2ab2b version: return nil with empty string
- 6401b433f7 vim.fs: default to follow=false #32859
- 47e6b2233f vim.fs: dirname() returns "." on mingw/msys2 #30480
- 0bef3b911c vim.fs: joinpath() does not normalize slashes on Windows #31782
- 6dc0eb9f41 vim.fs.abspath: correctly handle UNC paths
- a8ace2c58a vim.fs.normalize: normalize case for windows drive letter
- 4c0d18c197 vim.iter: enable optimizations for arrays (lists with holes) (#28781)
- 734dba04d1 vim.system: close pipe handles after process handle
- 4e130c1ee4 vim.system: invalid MAX_TIMEOUT for 32-bit systems #31638
- ad3472e291 vim.system: resolve executable paths on windows
- 33464189bc vim.text: handle very long strings (#30075)
- 4cff418564 vim.text: remove assert from vim.text.hexdecode
- d338ec9cb2 vim.ui.open: prefer xdg-open on WSL #30302
- 8bf79bd13c vim.wo: never allow non-zero bufnr
- 453f2c52d2 vim_snprintf: special-case handling of binary format
- 32e128f209 watch: exclude .git when using inotifywait (#29914)
- 9e23b4e185 watch: ignore nonexistent paths (ENOENT)
- a18652ed61 win-msi: add bin to PATH per-machine after installation (#29099)
- 88f07d6ca4 win-msi: set installer scope to machine #29895
- 4f9311b759 window: making float with title/footer non-float leaks memory (#30551)
- 7b71fdbc1e window: respect hide flag of float windows when switching (#30507)
- 59da82abd9 wininfo: when freeing windows, free the lowest priority wininfo

PERFORMANCE
--------------------------------------------------------------------------------
- 48251134ee add fast path to vim.validate (#28977)
- 3abd7ed4a4 consider only active decorations when drawing lines
- 8d2ee542a8 decor: join predicates and matches cache
- 48e3ac60c6 diagnostics: cache line diagnostics when `current_line` is set #32288
- b8ddd3b6bb events: remove unnecessary loop in event_nr2name() (#32777)
- 15f2da55a8 events: use hashy for event name lookup (#32802)
- abf4b65a51 filetype: cache (more) pattern data during "add" time
- f61efe3fe7 filetype: implement parent pattern pre-matching (#29660)
- ff575b3886 filetype: optimize internal data structures
- dc04ef2a20 filetype: skip contents check in `match()` if there is no contents (#29596)
- 12d4caa9d3 keycodes: use hashy for string lookup
- f8fc6cb157 loader: reduce calls to Loader.cache_file
- 138a93a057 lsp: avoid repeated table lookup in completion.enable
- 7342e6b00d lsp: do not apply semantic tokens to folded lines
- c85d15e0d5 lsp: don't construct potentially expensive strings
- cc1f2d2ca6 lsp: don't copy completion items in filter pass
- 3e855d533f lsp: use faster version of str_byteindex
- 000129201c mouse: only generate <MouseMove> for a new cell positon (#31103)
- 3fdc430241 treesitter: cache queries strongly
- b192d58284 treesitter: calculate folds asynchronously
- c6abc97006 treesitter: do not use tree cursors with a small lifetime
- cbad2c6628 treesitter: don't block when finding injection ranges
- d9ee0d2984 treesitter: don't fetch parser for each fold line
- 562056c875 treesitter: only search for injections within the parse range
- c57a85e0ed treesitter: remove unnecessary foldexpr loop
- 64847fbdc9 treesitter: use `child_containing_descendant()` in `is_ancestor()`
- 4b02916334 treesitter: use child_containing_descendant() in has-ancestor? (#28512)
- 3f3e4837d5 validate: use lighter version
- 99b5ffd688 vim.text: use lookup table implementation for hex encoding (#30080)

BUILD
--------------------------------------------------------------------------------
- 104800ce2e "popcount" name conflict on NetBSD #28983
- 198a952c13 add luals check
- ef8067a19d add quotes around `CMAKE_GENERATOR` variable
- 32e16cb0b6 add utf8proc as dependency
- b213f5169c allow comment after #include for required header (#29722)
- 382eb878bc bump lua dev dependencies
- 1d815acd78 bump minimum cmake version to 3.16
- 5284a2a793 bump unibilium to v2.1.2
- ac5a6d9ff5 fix RelWithDebInfo optimization flags #31802
- 7c65224257 fix lint error on macos
- 046e0956ee fix or silence new clang-tidy warnings
- 5719f2b91a fix uncrustify install in nix devShell (#33020)
- 4a0ee22e77 make makefile work on msys
- 4ee65484b1 make makefile work on windows
- 1b90f4a9c4 mark CMake variables advanced #31412
- 0f24b0826a move all generator scripts to `src/gen/`
- e5ff302033 remove -O2 from gen_cflags
- d74c74aae3 remove `lintcommit` from `lint` target
- 573bcb2aaf remove enforcement of cmake build type
- 0e9c92a900 remove nix flakes (#28863)
- f09f5c45fa reuse code for deps.txt for both deps and main build
- e1dc824b7e set luals checklevel to Hint #32392
- cac86e9b4c silence "po" noise #30469
- 07b14c8e2e specify POST_BUILD when using add_custom_command
- e83ce331da use treesitter's CMakeLists.txt
- e268fcbdaa work around bug in make when PATH includes cmake as dir
- b288fa8d62 bump_deps: abort if archive doesn't exist
- 7ead328a48 cjson: sync with upstream (#32114)
- 0e2f92ed79 clint: make NOLINT work with header checks (#31281)
- 327110ff8c cmake: remove unnecessary policy code
- 535c2f8658 contrib: add zsh completion (#32617)
- 51d85f7ea5 deps: drop unused bundled bash, python parsers and queries
- 9216bc927c deps: fix formatc target on MSVC
- b3641b8008 deps: remove libtermkey dependency
- 1247684ae1 deps: remove msgpack-c dependency
- fa79a8ad6d deps: vendor libvterm at v0.3.3
- c614969570 docs: update CSS #28896
- 0a087f2073 generator: add dependencies on hashy (#32796)
- e178331488 lpeg: search for lpeg.so on MacOS
- 7e099cf3eb macos: disable deduplication in link step
- f4d9a2983a release.sh: fix hang when generating docs (#33026)
- b923fcbaf0 vim-patch.sh: don't ignore changes to version*.txt (#29425)
- 7aaa4a51b7 vim-patch.sh: include commit subject #28767
- 3146433190 vim-patch.sh: use 7 hex digits for runtime patch file name (#29940)
2025-03-26 14:48:09 +01:00
..
2025-03-02 11:57:41 +01:00
2025-03-26 14:48:09 +01:00
2025-03-09 13:38:32 -07:00
2024-08-11 15:14:14 +01:00
2025-03-02 11:57:41 +01:00

Tests

Tests are broadly divided into unit tests (test/unit), functional tests (test/functional), and old tests (test/old/testdir/).

  • Unit testing is achieved by compiling the tests as a shared library which is loaded and called by LuaJit FFI.
  • Functional tests are driven by RPC, so they do not require LuaJit (as opposed to Lua).

You can learn the key concepts of Lua in 15 minutes. Use any existing test as a template to start writing new tests.

Tests are run by /cmake/RunTests.cmake file, using busted (a Lua test-runner). For some failures, .nvimlog (or $NVIM_LOG_FILE) may provide insight.

Depending on the presence of binaries (e.g., xclip) some tests will be ignored. You must compile with libintl to prevent E319: The command is not available in this version errors.



Layout

  • /test/benchmark : benchmarks
  • /test/functional : functional tests
  • /test/unit : unit tests
  • /test/old/testdir : old tests (from Vim)
  • /test/config : contains *.in files which are transformed into *.lua files using configure_file CMake command: this is for accessing CMake variables in lua tests.
  • /test/includes : include-files for use by luajit ffi.cdef C definitions parser: normally used to make macros not accessible via this mechanism accessible the other way.
  • /test/*/preload.lua : modules preloaded by busted --helper option
  • /test/**/testutil.lua : common utility functions in the context of the test runner
  • /test/**/testnvim.lua : common utility functions in the context of the test session (RPC channel to the Nvim child process created by clear() for each test)
  • /test/*/**/*_spec.lua : actual tests. Files that do not end with _spec.lua are libraries like /test/**/testutil.lua, except that they have some common topic.

Running tests

Executing Tests

To run all tests (except "old" tests):

make test

To run only unit tests:

make unittest

To run only functional tests:

make functionaltest

Legacy tests

To run all legacy Vim tests:

make oldtest

To run a single legacy test file you can use either:

make oldtest TEST_FILE=test_syntax.vim

or:

make test/old/testdir/test_syntax.vim
  • Specify only the test file name, not the full path.

Debugging tests

  • Each test gets a test id which looks like "T123". This also appears in the log file. Child processes spawned from a test appear in the logs with the parent name followed by "/c". Example:

      DBG 2022-06-15T18:37:45.226 T57.58016.0   UI: flush
      DBG 2022-06-15T18:37:45.226 T57.58016.0   inbuf_poll:442: blocking... events_enabled=0 events_pending=0
      DBG 2022-06-15T18:37:45.227 T57.58016.0/c UI: stop
      INF 2022-06-15T18:37:45.227 T57.58016.0/c os_exit:595: Nvim exit: 0
      DBG 2022-06-15T18:37:45.229 T57.58016.0   read_cb:118: closing Stream (0x7fd5d700ea18): EOF (end of file)
      INF 2022-06-15T18:37:45.229 T57.58016.0   on_proc_exit:400: exited: pid=58017 status=0 stoptime=0
    
  • You can set $GDB to run functional tests under gdbserver:

    GDB=1 TEST_FILE=test/functional/api/buffer_spec.lua TEST_FILTER='nvim_buf_set_text works$' make functionaltest
    

    Read more about filtering tests.

    Then, in another terminal:

    gdb -ex 'target remote localhost:7777' build/bin/nvim
    

    If $VALGRIND is also set it will pass --vgdb=yes to valgrind instead of starting gdbserver directly.

    See nvim_argv in https://github.com/neovim/neovim/blob/master/test/functional/testnvim.lua.

  • Hanging tests can happen due to unexpected "press-enter" prompts. The default screen width is 50 columns. Commands that try to print lines longer than 50 columns in the command-line, e.g. :edit very...long...path, will trigger the prompt. Try using a shorter path, or :silent edit.

  • If you can't figure out what is going on, try to visualize the screen. Put this at the beginning of your test:

    local Screen = require('test.functional.ui.screen')
    local screen = Screen.new()
    screen:attach()
    

    Then put screen:snapshot_util() anywhere in your test. See the comments in test/functional/ui/screen.lua for more info.

Debugging Lua test code

Debugging Lua test code is a bit involved. Get your shopping list ready, you'll need to install and configure:

  1. nvim-dap
  2. local-lua-debugger-vscode
  3. nlua
  4. one-small-step-for-vimkind (called osv)
  5. A nbusted command in $PATH. This command can be a copy of busted with exec '/usr/bin/lua5.1'" replaced with "exec '/usr/bin/nlua'" (or the path to your nlua)

The setup roughly looks like this:

 ┌─────────────────────────┐
 │ nvim used for debugging │◄────┐
 └─────────────────────────┘     │
            │                    │
            ▼                    │
   ┌─────────────────┐           │
   │ local-lua-debug │           │
   └─────────────────┘           │
           │                     │
           ▼                     │
      ┌─────────┐                │
      │ nbusted │                │
      └─────────┘                │
           │                     │
           ▼                     │
      ┌───────────┐              │
      │ test-case │              │
      └───────────┘              │
           │                     │
           ▼                     │
   ┌────────────────────┐        │
   │ nvim test-instance │        │
   └────────────────────┘        │
     │   ┌─────┐                 │
     └──►│ osv │─────────────────┘
         └─────┘

With these installed you can use a configuration like this:

local dap = require("dap")


local function free_port()
  local tcp = vim.loop.new_tcp()
  assert(tcp)
  tcp:bind('127.0.0.1', 0)
  local port = tcp:getsockname().port
  tcp:shutdown()
  tcp:close()
  return port
end


local name = "nvim-test-case" -- arbitrary name
local config = {
  name = name,

  -- value of type must match the key used in `dap.adapters["local-lua"] = ...` from step 2)
  type = "local-lua",

  request = "launch",
  cwd = "${workspaceFolder}",
  program = {
    command = "nbusted",
  },
  args = {
    "--ignore-lua",
    "--lazy",
    "--helper=test/functional/preload.lua",
    "--lpath=build/?.lua",
    "--lpath=?.lua",

    -- path to file to debug, could be replaced with a hardcoded string
    function()
      return vim.api.nvim_buf_get_name(0)
    end,

    -- You can filter to specific test-case by adding:
    -- '--filter="' .. test_case_name .. '"',
  },
  env = {
    OSV_PORT = free_port
  }
}

-- Whenever the config is used it needs to launch a second debug session that attaches to `osv`
-- This makes it possible to step into `exec_lua` code blocks
setmetatable(config, {

  __call = function(c)
    ---@param session dap.Session
    dap.listeners.after.event_initialized["nvim_debug"] = function(session)
      if session.config.name ~= name then
        return
      end
      dap.listeners.after.event_initialized["nvim_debug"] = nil
      vim.defer_fn(function()
        dap.run({
          name = "attach-osv",
          type = "nlua", -- value must match the `dap.adapters` definition key for osv
          request = "attach",
          port = session.config.env.OSV_PORT,
        })
      end, 500)
    end

    return c
  end,
})

You can either add this configuration to your dap.configurations.lua list as described in :help dap-configuration or create it dynamically in a user-command or function and call it directly via dap.run(config). The latter is useful if you use tree-sitter to find the test case around a cursor location with a query like the following and set the --filter property to it.

(function_call
  name: (identifier) @name (#any-of? @name "describe" "it")
  arguments: (arguments
    (string) @str
  )
)

Limitations:

  • You need to add the following boilerplate to each spec file where you want to be able to stop at breakpoints within the test-case code:
if os.getenv("LOCAL_LUA_DEBUGGER_VSCODE") == "1" then
  require("lldebugger").start()
end

This is a local-lua-debugger limitation

  • You cannot step into code of files which get baked into the nvim binary like the shared.lua.

Filtering Tests

Filter by name

Tests can be filtered by setting a pattern of test name to TEST_FILTER or TEST_FILTER_OUT.

it('foo api',function()
  ...
end)
it('bar api',function()
  ...
end)

To run only test with filter name:

TEST_FILTER='foo.*api' make functionaltest

To run all tests except ones matching a filter:

TEST_FILTER_OUT='foo.*api' make functionaltest

Filter by file

To run a specific unit test:

TEST_FILE=test/unit/foo.lua make unittest

or

cmake -E env "TEST_FILE=test/unit/foo.lua" cmake --build build --target unittest

To run a specific functional test:

TEST_FILE=test/functional/foo.lua make functionaltest

or

cmake -E env "TEST_FILE=test/functional/foo.lua" cmake --build build --target functionaltest

To repeat a test:

BUSTED_ARGS="--repeat=100 --no-keep-going" TEST_FILE=test/functional/foo_spec.lua make functionaltest

or

cmake -E env "TEST_FILE=test/functional/foo_spec.lua" cmake -E env BUSTED_ARGS="--repeat=100 --no-keep-going" cmake --build build --target functionaltest

Filter by tag

Tests can be "tagged" by adding # before a token in the test description.

it('#foo bar baz', function()
  ...
end)
it('#foo another test', function()
  ...
end)

To run only the tagged tests:

TEST_TAG=foo make functionaltest

NOTE:

  • TEST_FILE is not a pattern string like TEST_TAG or TEST_FILTER. The given value to TEST_FILE must be a path to an existing file.
  • Both TEST_TAG and TEST_FILTER filter tests by the string descriptions found in it() and describe().

Writing tests

Guidelines

  • Luajit needs to know about type and constant declarations used in function prototypes. The testutil.lua file automatically parses types.h, so types used in the tested functions could be moved to it to avoid having to rewrite the declarations in the test files.
    • #define constants must be rewritten const or enum so they can be "visible" to the tests.
  • Use pending() to skip tests (example). Do not silently skip the test with if-else. If a functional test depends on some external factor (e.g. the existence of md5sum on $PATH), and you can't mock or fake the dependency, then skip the test via pending() if the external factor is missing. This ensures that the total test-count (success + fail + error + pending) is the same in all environments.
    • Note: pending() is ignored if it is missing an argument, unless it is contained in an it() block. Provide empty function argument if the pending() call is outside it() (example).
  • Really long source([=[...]=]) blocks may break Vim's Lua syntax highlighting. Try :syntax sync fromstart to fix it.

Where tests go

Tests in /test/unit and /test/functional are divided into groups by the semantic component they are testing.

  • Unit tests (test/unit) should match 1-to-1 with the structure of src/nvim/, because they are testing functions directly. E.g. unit-tests for src/nvim/undo.c should live in test/unit/undo_spec.lua.
  • Functional tests (test/functional) are higher-level (plugins and user input) than unit tests; they are organized by concept.
    • Try to find an existing test/functional/*/*_spec.lua group that makes sense, before creating a new one.

Lint

make lint (and make lintlua) runs luacheck on the test code.

If a luacheck warning must be ignored, specify the warning code. Example:

-- luacheck: ignore 621

http://luacheck.readthedocs.io/en/stable/warnings.html

Ignore the smallest applicable scope (e.g. inside a function, not at the top of the file).

Configuration

Test behaviour is affected by environment variables. Currently supported (Functional, Unit, Benchmarks) (when Defined; when set to 1; when defined, treated as Integer; when defined, treated as String; when defined, treated as Number; !must be defined to function properly):

  • BUSTED_ARGS (F) (U): arguments forwarded to busted.

  • CC (U) (S): specifies which C compiler to use to preprocess files. Currently only compilers with gcc-compatible arguments are supported.

  • GDB (F) (D): makes nvim instances to be run under gdbserver. It will be accessible on localhost:7777: use gdb build/bin/nvim, type target remote :7777 inside.

  • GDBSERVER_PORT (F) (I): overrides port used for GDB.

  • LOG_DIR (FU) (S!): specifies where to seek for valgrind and ASAN log files.

  • VALGRIND (F) (D): makes nvim instances to be run under valgrind. Log files are named valgrind-%p.log in this case. Note that non-empty valgrind log may fail tests. Valgrind arguments may be seen in /test/functional/testnvim.lua. May be used in conjunction with GDB.

  • VALGRIND_LOG (F) (S): overrides valgrind log file name used for VALGRIND.

  • TEST_COLORS (F) (U) (D): enable pretty colors in test runner. Set to true by default.

  • TEST_SKIP_FRAGILE (F) (D): makes test suite skip some fragile tests.

  • TEST_TIMEOUT (FU) (I): specifies maximum time, in seconds, before the test suite run is killed

  • NVIM_LUA_NOTRACK (F) (D): disable reference counting of Lua objects

  • NVIM_PRG (F) (S): path to Nvim executable (default: build/bin/nvim).

  • NVIM_TEST_MAIN_CDEFS (U) (1): makes ffi.cdef run in main process. This raises a possibility of bugs due to conflicts in header definitions, despite the counters, but greatly speeds up unit tests by not requiring ffi.cdef to do parsing of big strings with C definitions.

  • NVIM_TEST_PRINT_I (U) (1): makes cimport print preprocessed, but not yet filtered through formatc headers. Used to debug formatc. Printing is done with the line numbers.

  • NVIM_TEST_PRINT_CDEF (U) (1): makes cimport print final lines which will be then passed to ffi.cdef. Used to debug errors ffi.cdef happens to throw sometimes.

  • NVIM_TEST_PRINT_SYSCALLS (U) (1): makes it print to stderr when syscall wrappers are called and what they returned. Used to debug code which makes unit tests be executed in separate processes.

  • NVIM_TEST_RUN_FAILING_TESTS (U) (1): makes itp run tests which are known to fail (marked by setting third argument to true).

  • NVIM_TEST_CORE_* (FU) (S): a set of environment variables which specify where to search for core files. Are supposed to be defined all at once.

  • NVIM_TEST_CORE_GLOB_DIRECTORY (FU) (S): directory where core files are located. May be .. This directory is then recursively searched for core files. Note: this variable must be defined for any of the following to have any effect.

  • NVIM_TEST_CORE_GLOB_RE (FU) (S): regular expression which must be matched by core files. E.g. /core[^/]*$. May be absent, in which case any file is considered to be matched.

  • NVIM_TEST_CORE_EXC_RE (FU) (S): regular expression which excludes certain directories from searching for core files inside. E.g. use ^/%.deps$ to not search inside /.deps. If absent, nothing is excluded.

  • NVIM_TEST_CORE_DB_CMD (FU) (S): command to get backtrace out of the debugger. E.g. gdb -n -batch -ex "thread apply all bt full" "$_NVIM_TEST_APP" -c "$_NVIM_TEST_CORE". Defaults to the example command. This debug command may use environment variables _NVIM_TEST_APP (path to application which is being debugged: normally either nvim or luajit) and _NVIM_TEST_CORE (core file to get backtrace from).

  • NVIM_TEST_CORE_RANDOM_SKIP (FU) (D): makes check_cores not check cores after approximately 90% of the tests. Should be used when finding cores is too hard for some reason. Normally (on OS X or when NVIM_TEST_CORE_GLOB_DIRECTORY is defined and this variable is not) cores are checked for after each test.

  • NVIM_TEST_RUN_TESTTEST (U) (1): allows running test/unit/testtest_spec.lua used to check how testing infrastructure works.

  • NVIM_TEST_TRACE_LEVEL (U) (N): specifies unit tests tracing level:

    • 0 disables tracing (the fastest, but you get no data if tests crash and there no core dump was generated),
    • 1 leaves only C function calls and returns in the trace (faster than recording everything),
    • 2 records all function calls, returns and executed Lua source lines.
  • NVIM_TEST_TRACE_ON_ERROR (U) (1): makes unit tests yield trace on error in addition to regular error message.

  • NVIM_TEST_MAXTRACE (U) (N): specifies maximum number of trace lines to keep. Default is 1024.

  • OSV_PORT: (F): launches osv listening on the given port within nvim test instances.