For notable changes, see runtime/doc/news.txt (or `:help news` in Nvim). Following is a list of fixes/features commits. BREAKING -------------------------------------------------------------------------------- -0f4f7d32ceremove `nvim` and `provider` module for checkhealth -7dbbaaec3frename 'jumpoptions' flag "unload" to "clean" (#30418) -35c5e23107store artifact shasums in a single shasum.txt file -188ec19894turn off translations by default -328ea02eb7use utf8proc full casefolding -737f58e232api: rename Dictionary => Dict -a389dc2f95clipboard: use OSC 52 as fallback clipboard provider (#31730) -ad70c9892dcolumn: rework 'statuscolumn' %r/l items -eb60cd74fbdeps: bump tree-sitter to HEAD, wasmtime to v29.0.1 (#32200) -a119aae4d3diagnostic: filter diagnostics by severity before passing to handlers (#30070) -51ccd12b3ddiagnostic: make virtual text handler opt-in (#32079) -a9e725b26ediagnostics: sort underline severity_sort (#30898) -e8b5dd1e89lsp: `symbol_to_item` requires `offset_encoding` -8260e4860blsp: multiple client support for vim.lsp.buf.hover() -debabaf884lsp: pass buffer number to root_dir function -9b357e30fdlsp: remove client-server handlers from vim.lsp.handlers -3e3775961flsp: rename lsp.completion.trigger() to get() (#32911) -0083e03d6flsp: support multiple clients in goto methods (#30877) -dff684fdb3lsp: support multiple clients in lsp.buf.references -970a27927elua: do not use typed table for empty dict -de48fbbd5fmessages: vim.ui_attach message callbacks are unsafe -a27419f3fcoptions: disallow setting hidden options #28400 -b922b7d6d7options: use OptVal for option defaults #26691 -4d9a1b9852provider/python: add python 3.13, drop 3.7 and 3.8 (EOL) #33022 -318676ad13release: remove backwards compatible releases -ad191be65esigns: place higher-priority signs from the left #27781 -0dd933265fterminal: cursor shape and blink (#31562) -35e5307af2terminal: include cursor position in TermRequest event data (#31609) -3cf602486cterminal: make 'belloff' and 'visualbell' apply to terminal bell (#30859) -041d98fe8dtreesitter: add default fallback to `ft_to_lang` lookups -6913c5e1d9treesitter: default to correct behavior for quantified captures (#30193) -bd4ca22d03treesitter: don't parse tree in get_parser() or start() -a0b52e7cb3treesitter: enforce buffer is loaded when creating parser -99e0facf3atreesitter: use return values in `language.add()` -bda63d5b97typval: remove distinction of binary and nonbinary strings -48e2a73610ui: emit prompt "messages" as cmdline events #31525 -ca5fca2912windows: drop cat and tee executables from windows -be89d520d7windows: only support UCRT, even for mingw FEATURES -------------------------------------------------------------------------------- -efa45832eaadd "jump" options to vim.diagnostic.config() (#29067) -0631492f9cadd vim.fs.relpath -f864b68c5ballow gx to function for markdown links -f3632e14e3get/set namespace properties #28728 -a664246171remove deprecated features -ead5683ff9api: add err field to nvim_echo() opts -aec4938a21api: broadcast events to ALL channels #28487 -34d808b73capi: combined highlights in nvim_eval_statusline() -19b25f3feaapi: deprecate nvim_buf_add_highlight() -5c92b40b4bapi: deprecate nvim_out/err_write(ln) -d84a95da7eapi: nvim_get_autocmds filter by id#31549 -25d8c3a5adapi: nvim_open_win() relative to tabline and laststatus #32006 -e00d67ef31checkhealth: group parsers by name and path in output -563051a53eclipboard: support g:clipboard="osc52" #33021 -60ea046741clipboard: try cygutils, clip on Windows #30215 -2c629ad13fcolumn: apply appropriate numhl highlight to virt_lines (#32400) -65c7033cbecomment: allow commentstring to be determined from node metadata -268a3de0a7complete: CompleteDone reason "cancel", "discard" #32600 -a616272f56complete: specify reason for CompleteDone -f1748b78e3default: bind `vim.lsp.buf.signature_help` in select mode (#31223) -ac207c3ac2defaults: "Show Diagnostics" in mouse popupmenu #32122 -2c6b635872defaults: add LSP default mappings (again) (#28650) -bb7604eddadefaults: add default unimpaired style mappings (#28525) -4662ad5643defaults: completeopt=popup #32909 -e8e3b443f8defaults: disable 'foldcolumn' in terminal buffers (#31480) -cc6992f1cadefaults: dot-repeat [<Space> #31186 -6db830e40edefaults: enable diffopt "linematch" #32346 -b31132f1c1defaults: jump between :terminal shell prompts with ]]/[[ #32736 -0b7cc014fcdefaults: map gO to LSP document_symbol #30781 -26e765f905defaults: map gri to vim.lsp.buf.implementation() (#30764) -76aa3e52bedefaults: popupmenu "Open in browser", "Go to definition" #30261 -09d76afe84defaults: pretty :help headings #30544 -079e5f4f9bdefaults: unimpaired empty line below/above cursor #30984 -1c6d920052defaults: use vim.diagnostic.jump() for default mappings (#29066) -c9c17fda80deprecations: vim._defer_deprecated_module() -38a52caec0diagnostic: add `current_line` option for `virtual_text` handler -8ba73f0e4cdiagnostic: add vim.diagnostic.jump() (#26745) -445ecca398diagnostic: format() can filter diagnostics by returning nil #32302 -99e7323aa3diagnostic: inherit parent 'path' option in open_float (#31273) -21961967ffdiagnostic: update quickfix list by title #31486 -7579af3c51diagnostic: vim.diagnostic.setqflist improvements #30868 -1759b7844adiagnostic: virtual_lines #31959 -fd65422b99diff: do not try external when out of memory -0c296ab224docs: "yxx" runs Lua/Vimscript code examples #31904 -6628741adadocs: improve `@see` meta docstrings #30693 -23290e7676editor: handle new multibyte sequences in normal mode replacement -cb6c0fda71editorconfig: add support for spelling_language (#28638) -4817547ec4ex_cmds: :sleep! hides the cursor while sleeping (#31493) -4f9260d06aext_messages: add hl_id to ext_messages chunks -4cced601c8extmark: stack multiple highlight groups in `hl_group` -931ee5591fextmarks: virtual text can be right-aligned, truncated #31921 -62d9fab9affloat: add winborder option (#31074) -9b8907d905float: allow enabling mouse for non-focusable window (#30844) -511b991e66fs.lua: add vim.fs.rm() -054a287dbeftplugin: change 'commentstring' to `// %s` for C/C++ (#29085) -f398e3a61aftplugin: set Lua 'omnifunc' to vim.lua_omnifunc #32491 -b61051ccb4func: allow manual cache invalidation for _memoize -548f19ccc3health: close checkhealth buffers with q #31870 -f2fa4ca97ehealth: highlight headings #30525 -b12b91c274health: show :checkhealth in floating window #31086 -6592873f77help: use treesitter for table of contents -3e09fbdf82highlight: add StatusLineTerm and StatusLineTermNC groups -295920845ehighlight: make `PmenuMatch` and `PmenuMatchSel` bold -5b1136a99cinccommand: preview 'nomodifiable' buffers #32034 -61025c9e7ainstall: mention standard paths, XDG vars in Windows installer #29101 -8ef41f5902jobs: jobstart(…,{term=true}), deprecate termopen() #31343 -e7020306a1jumplist: allow opting out of removing unloaded buffers (#29347) -8d55cc218ckeysets: teach Union and LuaRefOf -5931f780e0log: use "ui" as default name for TUI client #30345 -e4c6e732fdlsp: add select kind in showMessageRequest #32387 -f20335a54clsp: add support for completionItem.command resolving -3f1d09bc94lsp: add vim.lsp.config and vim.lsp.enable -6072153796lsp: announce codeLens resolveSupport (#29956) -1f5bcc7c4elsp: completion opts support custom item conversion (#30060) -ff097f2091lsp: completion side effects -7a7747f1e4lsp: deprecate execute_command with client:exec_cmd -454ae672aalsp: deprecate non-method client functions -54249d051clsp: deprecate vim.lsp.buf.completion -e56437cd48lsp: deprecate vim.lsp.start_client #31341 -55e4301036lsp: drop fswatch, use inotifywait (#29374) -dad55f5e76lsp: export diagnostic conversion functions (#30064) -44229bb85blsp: highlight hover target/range #31110 -27f3750817lsp: improve LSP doc hover rendering #30695 -6722149776lsp: include `end_col` and `end_lnum` in `vim.lsp.buf.symbols_to_items` -20f22f75eelsp: include end_col, end_lnum in vim.lsp.buf.locations_to_items #29164 -4e90bc3023lsp: lsp.completion support set deprecated (#29882) -6e68fed374lsp: multi-client support for signature_help -629483e24elsp: require `offset_encoding` param #31249 -e00cd1ab40lsp: return resolved config for vim.lsp.config[name] -130b5fd85flsp: return table from lsp/ files on runtimepath (#31663) -ce678043e3lsp: show server name in code actions #30830 -07d5dc8938lsp: show server version in `:checkhealth` #31611 -a1e313ded6lsp: support `textDocument/foldingRange` (#31311) -3b0fe2659elsp: support completion context #32793 -41b07b128clsp: support for resolving code action command (#32704) -35247b00a4lsp: support function for client root_dir (#31630) -45e76acaa0lsp: support hostname in rpc.connect #30238 -b2bad0ac91lsp: support postfix snippets in completion -d3e4ffaffflsp: support utf-8 and utf-32 position encodings -5d26934c7clsp: update LSP healthcheck format (#28980) -ae2fd91b41lsp: update LSP types -0df2c6b5d0lsp: use fuzzy match on filterText instead of prefix match -e4c1f6667blsp: use the meta model to generate server capability map -5581a95534lsp: vim.lsp.buf.format() supports textDocument/rangesFormatting #27323 -92e4e3fb76lsp.util: fix type errors -ff1d7d4299lsp.util: get_bufs_with_prefix -> get_writeable_bufs -cbc82011celsp.util: improve offset_encoding type annotations -a18fa2f11clsp.util: minor codestyle -1944c0d610lsp.util: refactor get_border_size() -f0973d4227lsp.util: refactor symbols_to_items() -0e8568d72clsp.util: remove lsp spec extract -0621718e3blsp.util: remove metatable in locations_to_items -3f87e222f7lsp.util: remove some aliases -e954a16063lsp.util: remove some variables -5bec7288a5lsp.util: remove uneeded do-end -8ad000ef7clsp.util: remove unneeded table -d44d36b8fflsp.util: simplify some bounds checking -0066dd0f65lsp.util: use faster version of vim.validate -1edfe5c09elsp.util: use vim.api alias -97119a2369lsp.util: use vim.w/b -cd53db2157lua: add `context.env` (environment variables) to `vim._with()` -9afa1fd355lua: add `vim._with` -5180707310lua: add `vim.fs.abspath` -b34e137e43lua: allow vim.on_key() callback to consume the key (#30939) -d5ae5c84e9lua: completion for vim.fn, vim.v, vim.o #30472 -0a5a0efda6lua: don't complete private (_) fields after dot (.) #32690 -07cc559cdflua: update `vim._with` to allow more granular option contexts -af0ef2ac9dlua: vim.hl.range() "timeout" #32012 -be1fbe38b3lua: vim.text.indent() -fdeb01cd77main: expand file ~\ or ~/ prefix on Windows (#28515) -ea5b748f24man.vim: "q" always closes window #30819 -f58e7d5facmarks: add conceal_lines to nvim_buf_set_extmark() -51cf84daf9marks: virtual lines support horizontal scrolling (#32497) -cfdf68a7acmbyte: support extended grapheme clusters including more emoji -124c655f56messages: "g<" mapping for ext_messages -cb7b4e2962messages: "verbose" message kind #31991 -5bae80899dmessages: add :!cmd shell message kinds -e16bec41b6messages: confirm kind for z=, :tselect, inputlist() #32521 -21151144c6meta: add type for quickfix entries -82a215cb2doptions: add 'eventignorewin' (#32152) -d831392b15paste: unify cancel and error behavior (#30476) -08c328b8b0runtime: Lua ftplugin 'includeexpr' #32719 -f5714994bcruntime: Lua ftplugin sets 'omnifunc', 'foldexpr' #32697 -e6cfcaed18snippet: add default keymaps during snippet session -123f8d229esnippet: set snippet keymaps permanent instead of dynamic (#31887) -96128a5076startup: validate --listen address -230b0c7f02stdlib: overload vim.str_byteindex, vim.str_utfindex #30735 -517ecb85f5stdlib: vim.json.encode(...,{escape_slash:boolean}) #30561 -8df6736ca1term: enable reflow by default (#21124) -4199671047term: support OSC 8 hyperlinks in :terminal (#30050) -93480f7fbaterm: trigger TermRequest for APC (#32407) -3ad977f01dterminal: add support for copying with OSC 52 in embedded terminal (#29117) -6f0bde11ccterminal: add support for kitty keyboard protocol -06a1f82f1cterminal: forward X1 and X2 mouse events -e3bfcf2fd4terminal: support grapheme clusters, including emoji -f1c45fc7a4terminal: support theme update notifications (DEC mode 2031) (#31999) -56d11b494bterminal: disable 'number', 'relativenumber', and 'signcolumn' in terminal buffers (#31443) -34cd94812dtest: support and document lua test case debugging -b8c75a31e6treesitter: #trim! can trim all whitespace -ec8922978etreesitter: add more metadata to `language.inspect()` (#32657) -bd3b6ec836treesitter: add node_for_range function -688b961d13treesitter: add support for wasm parsers -8543aa406ctreesitter: allow LanguageTree:is_valid() to accept a range -44ccd9ca24treesitter: allow `iter_captures` to accept `opts` -8b5a0a00c8treesitter: allow disabling captures and patterns on TSQuery (#32790) -1af55bfcf2treesitter: allow get_node to return anonymous nodes -a94a2927d0treesitter: allow passing lang to InspectTree -45e606b1fdtreesitter: async parsing -3dfb9e6f60treesitter: include capture id in return value of `get_captures_at_pos()` #30559 -267c7525f7treesitter: introduce child_with_descendant() -09f9f0a946treesitter: show which nodes are missing in InspectTree -b9b408a56ctreesitter: start moving get_parser to return nil #30313 -da0ae95349treesitter: support modelines in `query.set()` (#30257) -2e5b560482treesitter: table of contents for checkhealth, markdown (#32282) -8ba047e33ftreesitter: vertical conceal support for highlighter -ff85e54939tui: builtin UI (TUI) sets client info #30397 -4fb3b57a19tui: handle kitty key events in libtermkey (#31727) -f93ecd2760tui: parse CSI subparams in termkey (#29805) -44dbfcfba4tui: recognize X1 and X2 mouse events -e41368f3bctui: support in-band resize events (#29791) -d460928263tui: update 'background' on theme change events (#31350) -45e319ade6tutor: give hints to satisfy the line checker #30952 -4b0e2605eaui: UI :detach command -394f69a25dui: additional arguments for cmdline_show/hide events -a0e3fe5741ui: cascading style inheritance for Pmenu* highlights #29980 -f85bc41c80ui: don't show unfocusable windows in :tabs, 'tabline' #27984 -9762c5e340ui: gx: use url extmark attribute and tree-sitter directive (#30192) -43d552c566ui: more intuitive :substitute confirm prompt #31787 -433b342baaui: sign/statuscolumn can combine highlight attrs #31575 -a10636fbe7ui: specify whether msg_show event is added to history -e049c6e4c0ui: statusline text inherits highlights #29976 -611ef35491vim.fs: find(), dir() can "follow" symlinks #31551 -3f15e57b26vim.ui: configurable "gx" / vim.ui.open() tool -f4b620c4e6vim.ui.open: support lemonade #30845 -3572319b4cvim.validate: improve fast form and deprecate spec form -cb84cd5d9fwin32: embed executable icon FIXES -------------------------------------------------------------------------------- -200e7ad157apply the change on more files -6720bd440fassert failure in VimL expression parser -d123202ae6change deprecation presentation -ded15ca8c2completion.enable(false,...) deletes invalid augroup #32121 -7737f89206deps build for ARM64 MSVC -50749f8df8extend the life of vim.tbl_flatten to 0.13 -25abcd243efix broken wasmtime build -b6ab294838fix incorrect search code -46b69aaf14include nvim/ascii_defs.h -01b4da65c2merge all provider healthchecks into a single health.lua -5c245ec3e9remove vim.lsp._with_extend -98ba65b8bereplace NVIM with Nvim in default titlestring (#30348) -6aa42e8f92resolve all remaining LuaLS diagnostics -e71713ba2bshow swapfile warning as a warning (#28971) -0418107074update osc52 termfeatures flag on UIEnter/UILeave (#32756) -0829e7575dwarn when :InspectTree on buffer with no parser #32783 -47f2769b46Man: completion on Mac -89f9f168a5api: alloc and draw cursor window in nvim__redraw -743c5808b6api: allow `scope = 'local'` with `buf` when using `nvim_get_option_value` -487c48ec86api: clamp range lines in `nvim__redraw()` (#31710) -141114c170api: crash on invalid buffer to nvim_buf_del_user_command (#31908) -716adbcc45api: deprecate nvim_subscribe, nvim_unsubscribe #30456 -1e47aa677aapi: deprecated API nvim_get_option does not validate option name #31919 -095c0876c2api: don't override Vimscript SID (#32610) -bff07f6dd0api: don't try to get/set option for invalid option name (#31302) -0e59f6f4c7api: don't use 'winborder' when reconfiguring float (#32984) -cce1eb0806api: error properly with invalid field in nvim_open_win (#30078) -63bbb7c109api: fix 'winborder' preventing splits with nvim_open_win (#32981) -f55213ce0eapi: fix crash/leak with float title/footer on error (#30543) -022449b522api: generic error messages, not using TRY_WRAP #31596 -8de1dc6923api: make `nvim_set_hl()` respect all `cterm` attributes (#31390) -ad60b3fb48api: memory leaks in vim.api.nvim_*get_option #32390 -167a2383b9api: not using TRY_WRAP, generic error messages #31595 -bf48dfadecapi: nvim__complete_set requires completeopt=popup #31177 -d1d7d54680api: nvim_buf_get_text() crashes with large negative column #28740 -6ea45031d5api: nvim_echo free text memory with invalid highlight (#31243) -e2ad251c8dapi: nvim_get_option_value does not clean up on FileType error #31219 -5b9518b436api: nvim_set_decoration_provider callback return type #31912 -01a97d2ad7api: nvim_win_set_buf(0, 0) fails if 'winfixbuf' is set #31576 -40347f6e27api: only flush nvim__redraw when necessary #31250 -36f44b3121api: remove invalid assertions -235cb5bc5fapi: update "range" windows in nvim__redraw #31042 -9c718bc2bcapi: validation, documentation of hl_group #31195 -289c9d21cbautocmds: once=true Lua event-handler may call itself #29544 -ffaab09e99build: <termios.h> is system-dependent #31705 -486076a0e1build: remove USE_FNAME_CASE, redundant with CASE_INSENSITIVE_FILENAME -217e26cb64build: surpress spurious warnings from gcc in -E preprocessor mode -34a2bfdcc5build: vimdoc tags are not validated #32801 -8070988247channel: handle writing to file instead of pipe (#30519) -c49162be59channel: log after (not before) channel-close -965dc81f81checkhealth: disable 'listchars' #31245 -4c9f3689a1checkhealth: failed if 'lua' in plugin name -f5dd30948echeckhealth: handle nested lua/ directory #32918 -c48cf18752checkhealth: module not found when `&rtp` has nested paths #32988 -2495e7e22aclipboard: tmux clipboard depends on $TMUX #31268 -847c28f6f6cmdline: always show cmdline when it is a prompt #31866 -af4231d407cmdline: cmdline completion of _defer_require() modules #33007 -a70ad5cdb6cmdline: ext_cmdline block events for conditionals -bbf36ef8efcmdline: prevent cmdline_show events after exiting cmdline #32033 -092042b43dcmdline: simplify and correct grapheme cluster adjustment -86ae59c612colorscheme: distinguish CursorLine/Folded/StatusLineNC highlights #32256 -9b9f54e2c1colorscheme: underline StatusLineNC with 'notermguicolors' #28810 -8bc28978b6column: apply custom highlight to last 'statuscolumn' segment (#32182) -3cb1e825e6column: check if signcolumn changed in all windows #31439 -1dcda86559column: clamp line number for legacy signs -f2083bd55ccolumn: crash with 'signcolumn' set to "number" (#29003) -f9a49fab0ccolumn: modifying a sign should update placed signs (#29750) -d5f6f61879column: set signcolumn width after splitting window (#30556) -063b69bab4column: unnecessary redraws with resized 'statuscolumn' (#32944) -0a2218f965comment: fall back to using trimmed comment markers (#28938) -e788d1a3a9completion: avoid deleting text when completion leader changes #31448 -bfa365a872completion: don't include <Lua function> in -complete= (#30209) -55dc482e75completion: fix inconsistent Enter behavior (#30196) -83a7d97d64coverity: CID 509571 Uninitialized variables #30395 -e1c2179dd9coverity: INTEGER_OVERFLOW #31657 -f9eb68f340coverity: error handling CHECKED_RETURN #31618 -069451bb21coverity: size_t overflow #30497 -ff7832ad3fcoverity/497355: shada_read_when_writing out of bounds read #30665 -c49030b75acoverity/497375: f_strpart cast overflow (#30773) -0fe4362e21coverity/509227/509228: tui driver_ti underflow #30341 -60e1862ccbcoverity/510275: linematch out of bounds access (#30687) -a2008118a0coverity/510436: shada_read_when_writing index out of bounds (#30686) -71507281fbcoverity/530826: validate_opt_idx unchecked negative idx (#32081) -5af9c065addecor: don't draw invalidated virtual lines (#29858) -a8fbe1d409decor: don't use separate DecorSignHighlight for url (#30096) -34ded4d97bdecor: exclude invalid marks from meta total -87610d82dbdecor: set invalid flag for end of invalidated paired marks -33ff546b50decoration: fix crash when on_lines decor provider modifies marktree -0e299ebf75decorator: noisy errors from decoration provider #31418 -f2173b1aa2defaults: cannot remove "How-to disable mouse" menu item #30375 -61aabe0730defaults: default @/Q broken when 'ignorecase' is set (#29343) -8323398bc6defaults: don't replace keycodes in Visual search mappings (#31460) -f6f2334ac2defaults: error messages UX for unimpaired mappings #30884 -59a171fd99defaults: improve visual search mappings #32378 -01739d4673defaults: missing ]Q/[Q unimpaired mappings #30943 -c644228e1ddefaults: omit empty line from unimpaired mapping messages (#31347) -ff93cccbc1defaults: omit extraneous info from unimpaired mapping errors (#30983) -4075e613b2defaults: properly pass count to quickfix commands (#30632) -289380bc40defaults: use "range" instead of "count" for some mappings (#30642) -573fcb8b66deps: revert accidental test commits (#30864) -de794f2d24diagnostic: broken variable reference #31557 -c78728a384diagnostic: clear autocmd only for valid buf (#32861) -f1fcf653cbdiagnostic: clear virtual_lines autocmd only for valid buf #32979 -921dc22fc0diagnostic: correct `severity` type on `setqflist`, `setloclist` (#30506) -0e8e4a07f5diagnostic: don't include diagnostic code when using custom formatter #32464 -d918ebe3b8diagnostic: fix backwards compatibility for goto_next and goto_prev (#29593) -f69937fdbddiagnostic: fix float scope filtering (#29134) -5bc948c050diagnostic: improve current_line refresh logic #32275 -4b3be56a03diagnostic: make docs agree with code (#29561) -fd902b1cb2diagnostic: only store quickfix id when creating a new one #31466 -3b1d0e7f70diagnostic: remove deprecated `severity_limit` option -5eda7aafe9diagnostic: setqflist() is stuck after vim.lsp.buf.document_symbol #31553 -9a43ec13e6diagnostic: show backtrace for deprecation warnings -4cbeb6fa3cdiagnostic: silence :chistory #31701 -6c975515c5diagnostic: vim.diagnostic.setqflist() opens loclist on first call #31585 -17c25a66fcdiagnostic: virtual lines should scroll horizontally -fb842dfc22diagnostic: virtual_lines diagnostic columns (#32703) -e5e81262afdiagnostics: don't apply extmarks to invalid lines #29321 -c65646c247diff: use mmfile_t in linematch -81ea44fa6adisplay: adjust winline info for concealed lines below last line (#32708) -f25dd7a8d5display: correctly store winline info for concealed lines (#32656) -a901fb875fdocs: add missing properties to hl_info #30032 -cc26cf0400docs: do not treat indexes as `short_link` -056009f741docs: markdown instead of vimdoc in meta docstrings #30680 -8801b77ed0docs: missing `@returns` desc in _meta/api.lua #30673 -09bcb31068docs: replace `yxx` mappings with `g==` #31947 -efe92f9dffdocs: update context type in `vim.lsp.LocationOpts.OnList` -b8135a76b7docs: wrong return value annotation for `nvim_buf_get_extmarks` -376de1483edrawline: correct highlight priority with Visual selection (#30706) -9a0239fdc8drawline: don't draw beyond end of window (#29035) -b1c439cef6drawline: don't draw beyond end of window with 'rnu' (#29406) -34344b939ceditor: avoid scrolling :substitute confirm message #32149 -9e7b0bcf51editorconfig: fix indent style for `local.mk` (#31342) -b0a1d35f69eval: don't shorten $HOME in v:stacktrace (#32634) -2a3561819eeval: handle wrong v:lua in expr option properly (#29953) -4317d36669event-loop: process input before events in getchar() (#32322) -f05a6666cfevents: always allow some events to be nested (#32706) -e9f4ceeb74events: don't expand `args.file` for Lua callback (#31473) -1f49a59b8bevents: fix incorrect capitalization of Cmdwin* events (#32813) -8c2d45be77exit: close memfiles after processing events (#30872) -c7ec010adeextmark: builtin completion can still affect nearby extmarks #31387 -93278e7720extmark: clearer error message for invalid ephemeral mark usage -43a2019f09extmarks: issues with revalidating marks #28961 -84ad95fdc9fileio: copy to correct buffer position when reading -93347a67bffiletype: fix :filetype detect error with -u NONE (#29991) -aa9f21ee95filetype: fix typos in filetype detection -032e024f8afiletype: handle .in files with no filename (#30487) -1077843b9bfiletype: make filetype detection work with :doautocmd (#31470) -21cbd90007filetype: normalize full path before matching #32227 -5a8a34dafafiletype: source ftdetect/* after creating scripts.vim autocmds (#29445) -cff5fa49fcfloat: "Not enough room" error for 1-line float #25192 -07c5f41da3float: can set title/footer without setting border #32594 -be01b361d8float: cannot set title/footer independently #31993 -ff1791c9e5float: close preview float window when no selected #29745 -d2cca606a1float: ensure floating window width can fit title -8ddcf9d939float: handle error in win_float_create() (#29742) -8b2b1fba2afloat: missing default highlight for title -df915f3afcfloat: properly find last window of tabpage (#30571) -17383870ddfloat: re-sort layers when grid zindex changed #30259 -206f8f24a2fs: make vim.fs.root work for relative paths and unnamed buffers (#28964) -2c160f39d3ftplugin/man.vim: hide signcolumn (auto) -214ce8d33cgen_help_html: first tag in h2 is broken #30720 -ceea6898a8gen_help_html: handle delimiter, heading #29415 -6c3f7e7e27gen_vimdoc: correctly generate function fields -913e81c35fgetchar: do not simplify keycodes in terminal mode -b109b1abceglob: avoid `subcapture nesting too deep` error (#29520) -4bd86120d4glob: handle overlapping `{}` condition elements #29236 -b47b0b3f75grid: double grid_line_start() with ext_messages #31292 -fe87656f29grid: grid_line_start NULL access with 'redrawdebug' -a9c89bcbf6gx: allow `@` in url -570a8da01bhealth: "q" should not close last window #31876 -2e3f1069f4health: better layout of vim.treesitter health check -10f9173519health: broken ruby detect #28804 -84e85aeb10health: check more "old" files #30421 -5b778a64echealth: fix fetching url with python in provider health (#29594) -b4b4cf46a7health: fix pyenv root and python exepath detect issue -237d2aef4dhealth: return correct name from 'path2name()' -5e90406487health: set nomodifiable in checkhealth buffers -9177371014help: remove runnable code virtual text -ff75f345abhighlight: 'winhl' shouldn't take priority over API (#31288) -458473acb8highlight: add `StatusLineTerm`/`StatusLineTermNC` to `:color vim` (#29313) -6bcefad5a6highlight: fix the seg fault caused by the invalid linked hl ids -8e81212e15highlight: floating windows inherit NormalFloat from global-ns -6719276040highlight: make TablineSel more noticeable with 'notermguicolors' #31905 -b67fcd0488highlight: make `TablineSel` more noticeable #31896 -862679c70fhighlight: update `PmenuSel` for colored completion items #30183 -59e130b6cainccommand: ensure cursor is where it belongs -16f63b964finput: handle vim.on_key() properly with ALT and K_SPECIAL (#29677) -b52ffd0a59inspect: always show priority -9c278af7ccinspect: show priority for treesitter highlights -22fd52325binspector: update semantic token namespace (#32157) -efe1732c6fjobs: do not block UI when jobwait() doesn't block (#31803) -574ea6a191keycodes: recognize <Find>, <Select> #28431 -67bb0cfa79loader: follow the style of the error message for built-in loaders -44740e561flog: RPC log format #32337 -851137f679log: log unset $TMPDIR at "debug" level #32137 -c908c2560dlog: unify error messages for vim.ui_attach/decor providers #33005 -a6f219b06blog: unintuitive message for undefined $TMPDIR -2e6d295f79lsp: account for changedtick version gap on modified reset (#29170) -fac96b72a5lsp: add foldingrange method support check #31463 -8263ed4670lsp: add textDocument/documentLink to capability map (#28838) -a41b6fd173lsp: autocmds to close lsp preview windows not cleared -b42dc232c5lsp: autotrigger should only trigger on client's triggerCharacters (#32266) -7031949be0lsp: avoid reusing diagnostics from different servers in actions (#30002) -fc9b70826elsp: avoid vim.keymap.del error when stopping a client (#29478) -39d79efa1elsp: better multi-client support for callHierarchy -bdfba8598blsp: cancel pending requests before refreshing -f9bf64d746lsp: check buffer is loaded and valid #30330 -c2bf09ddfflsp: check for configuration workspace folders when reusing clients -81b372fecdlsp: check for nil response from server (#29196) -a9cdf76e3alsp: check for valid buf before processing semantic tokens response -230bc34ca5lsp: check if buffer is valid before LspDetach autocmd (#29162) -af200c10cflsp: check if buffer was detached in on_init callback (#28914) -02097e43c8lsp: check if sig_help window is focusable when configuring cycle keymap -025c874415lsp: clear lsp client diagnostics (#29050) -c374f26430lsp: clear word when expand multi-lines word (#32393) -adf7c98d60lsp: compare URI instead of workspace folder name (#30962) -b4599acbf8lsp: correct hover result handling (#30995) -f8d5811c71lsp: correctly check for "codeAction/resolve" support -7d8db54441lsp: delete b:lsp_floating_preview buf var after win close -2a1f604c77lsp: delete bufvar inside WinClosed event -879d17ea8dlsp: detach all clients on_reload to force buf_state reload (#28875) -292365fa1blsp: do not detach from buffer if there are uninitialized clients (#29029) -37bf4c572alsp: do not reset buf version when detaching client (#29242) -d56ba71af1lsp: document_symbol uses loclist by default #32070 -720b309c78lsp: don't send foreign diagnostics to servers in buf.code_action (#29501) -1f2f460b4alsp: don't show codelens for buffers that don't support it (#29690) -5f527f24f0lsp: don't use completion filterText if prefix is empty -305012ea07lsp: enable `additionalPropertiesSupport` -9d9ee3476elsp: ensure watcher cancel -aec7f1979alsp: fallback to `label` for completion items if all others are missing (#29522) -33d10db5b7lsp: filter completion candidates based on completeopt (#30945) -b3109084c2lsp: fix cursor position after snippet expansion (#30659) -4b001f297alsp: fix infinite loop -983953858elsp: fix isIncomplete condition in completion trigger (#30130) -2ce4a4d91elsp: fix reverse sorting of same position text edits (#29212) -8654a97006lsp: handle empty call hierarchy items #30349 -f279d1ae33lsp: handle encoding bounds in str_utfindex_enc -882a450a29lsp: handle locations exceeding line length #30253 -008782208dlsp: handle mixed encoding in tagfunc params -e0a5c3bb58lsp: handle multiline signature help labels #30460 -8512f669f0lsp: handle nil bytes in strings -f03b1622adlsp: handle nil root_dir in health check (#29007) -ed07167261lsp: handle non-existent configs in lsp.config/enable -003b8a251dlsp: handle out-of-bounds character positions #30288 -5187be81c2lsp: handle using array as open_floating_preview title (#33016) -d9a2acdab3lsp: hide layout in codelenses in virtual text (#28794) (#28807) -f54266dbedlsp: hover border type can be string (#31013) -9a681ad09elsp: hover keymap (#31208) -a14fca432blsp: improve LSP floating preview window cleanup #31353 -e29f245a10lsp: inlay hints are rendered in the correct order (#29707) -0086ee90ddlsp: list all workspace folders in healthcheck #30966 -0e394f136flsp: log when receiving markup messages (#30065) -203e7a43d1lsp: mention function name in warning #31301 -a4f575abd8lsp: minimum height for floating popup #31990 -4fd2694f20lsp: missing method parameter when canceling requests -be8d87014clsp: on detach, cancel pending foldingRange requests #31509 -7d5866d471lsp: open_floating_preview() ignores max_height (#32716) -86770108e2lsp: open_floating_preview() zindex relative to current window #31886 -724d1110b1lsp: pre-filter matches on label if filterText is missing (#29491) -a450fda4edlsp: prefer `on_list` over `loclist` in default handler -6bb40f3dbflsp: prevent desync due to empty buffer (#29904) -eb629cce91lsp: redundant spaces in lsp log (#29970) -43581011e4lsp: remove superfluous on_detach callback from semantic tokens module (#29174) -d76f7fef13lsp: reset active request when reporting an error -6bc7979044lsp: reset the applied hints on `refresh` request #32446 -47aaddfa0dlsp: resize hover window for concealed lines -081beb3659lsp: restore get_language_id behaviour -29c72cdf4alsp: retrigger diagnostics request on server cancellation (#31345) -d9ccd828b0lsp: return call hierarchy item, not the index (#30145) -9c20342297lsp: reuse client if configs match and no root dir -6e45cd7f00lsp: revert buf_versions deprecation/replacement (#29217) -bdff50dee5lsp: revert text edit application order change (#29877) -e8a6c1b021lsp: schedule call to vim.lsp.start for async root_dir (#31998) -a108852b00lsp: semantic token functions allow "0" bufnr #28849 -c3cb702ac7lsp: set 'smoothscroll' in docs hover #30748 -8a236c242alsp: set floating window filetype after setup #32112 -3c51058d76lsp: set tagstack on jump via goto methods -24d7debdfblsp: signature_help highlights wrong parameter #32382 -80e37aa533lsp: str_byteindex_enc bounds checking #30747 -629a5b71b5lsp: support multiple clients in typehierarchy -e48179f31elsp: suppress completion request if completion is active (#30028) -50f006b617lsp: tagfunc fails in unusual buffer #30700 -5ac8db10f0lsp: trigger LspDetach on buffer delete (#28795) -19be3d2683lsp: trim trailing whitespace from completion words (#29122) -aa47af7e69lsp: tune completion word extraction for decorated labels (#29331) -38838fb00alsp: type-errors, other nits in vim.lsp.log #31235 -8d7eb03040lsp: unify get_completion_word for textEdits/insertText -fe5ae88b20lsp: update request name to capability map #30098 -5aa9906676lsp: use client.id instead of pairs index (#29143) -c8d7d65679lsp: use correct method for prepareTypehierarchy -b9e6fa7ec8lsp: use filterText as word if textEdit/label doesn't match -5d08b65ac2lsp: use unresolved code action when `codeAction/resolve` fails -0a7e4e9e5flsp: vim.lsp.enable(...,false) does not disable #32002 -888a803755lsp: vim.lsp.start fails if existing client has no workspace_folders #31608 -42ed0ffad9lsp: when prefix is non word add all result into matches (#30044) -55bdb077b7lsp: wrapped ctx in opts before passed to vim.lsp.completion.trigger #32837 -2dcbfe78fclsp.buf: use correct offset_encoding for all requests -3275ae830dlsp.protocal: improve typing of constants -acbc6a7f91lsp.util: inconsistent handling of offset_encoding -564173e556lsp.util: wrong arguments to 'validate' function -614c9322d5lua: SIGSEGV in luv callback with error(nil) #32595 -b283736388lua: `@private` => `@nodoc` #32587 -b6e350a6b4lua: allows tables with integer keys to be merged in tbl_deep_extend -c8b64b7a43lua: always use vim.inspect() for :lua= (#32715) -0e42c81c7flua: avoid recursive vim.on_key() callback (#30753) -fe1e2eff06lua: avoid vim._with() double-free with cmdmod (#31505) -487f44a6c1lua: change some vim.fn.expand() to vim.fs.normalize() (#29583) -43bd9c9c1clua: don't clamp -1 or v:maxcol in vim.highlight.range() (#29203) -bdc6e38781lua: don't include text after cursor in completion pattern (#29587) -e2aca58bcclua: don't override script ID from :source (#32626) -d40481322alua: ensure inspect_pos() only shows visible highlight extmarks -948f2beed4lua: find length of completion prefix earlier (#29384) -ebb963a4a0lua: format errors from luv callbacks using __tostring -65a703e060lua: ignore stdout and stderr for xdg-open -6b00c9acfdlua: no omni/cmdline completion for vim.env (#33044) -c6d2cbf8f5lua: pop retval for fast context LuaRef -a5b1b83a26lua: prevent SIGSEGV when lua error is NULL in libuv_worker -3d707e6f14lua: remove vim.loader.disable() #31344 -3a88113246lua: revert vim.tbl_extend behavior change and document it -3688a33354lua: show stacktrace for error in vim.on_key() callback (#31021) -40a149e7f9lua: types for vim.api.keyset.win_config #32700 -7f33c1967blua: use rawget() to get __call in vim.is_callable() (#29536) -960fdc775alua: vim.deprecate does not support major>0 -d832518ec6lua: vim.hl.on_yank highlights wrong region with yi' (#32850) -cd3855fb2blua: vim.tbl_get({}, nil, 1) should return nil #32218 -89d6d6f25clua: wrong script context for option set by func from nvim_exec2 (#32659) -9eb0426002luacats: allow all types inside tuples -ee5aaba215man: avoid setting v:errmsg (#30052) -7588ff2d89man: check if buffer is valid before restoring 'tagfunc' (#30180) -da6f68ee69man: filter OSC 8 hyperlink markup #29171 -7940ec6913man.lua: `:Man <tab>` does not complete #31569 -e08e3d15f6man.lua: skip `Attrs.None` highlights #32262 -d6653e1cc9marks: ensure decor is removed with proper range (#32973) -906ad04dddmarks: handle composing in inline virt_text with 'nowrap' (#32477) -8452032554marks: handle double-with inline virt_text with 'nowrap' (#32476) -86046c5a31marks: ineffective conceal_line callback optimization (#32662) -72f630f92dmarks: issues with invalid marks and marks beyond eob (#32862) -8da59060c6marks: mark winline as invalid if change is in a concealed line (#32766) -012db2b0f5marks: revalidate marks whose position did not change -5cc93ef472marks: revise metadata for start mark of revalidated pair #32017 -c4f76299f0marks: skip right_gravity marks when deleting text -cdedfc3743marks: truncate double-width inline virt_text consistently (#32560) -7371abf755marks: wrong winline info for concealed line with below virt line (#32747) -a9287dd882mbyte: check for utf8proc_map() failure (#30531) -50a576ba57mbyte: mark any 0xFE0F sequence as a TUI ambiguous width char -15bc930fcamemline: don't check line count for closed memline #32403 -aa976f0d93messages: add a trailing space to inputlist() etc. prompts (#32328) -37c77ab46bmessages: attaching/detaching ext_messages causes asserts #31952 -d98827b634messages: avoid empty msg_showmode with 'noshowmode' -31d6885debmessages: better formatting for :highlight with ext_messages #31627 -21718c67ddmessages: better formatting for ext_messages #31839 -92556be33dmessages: compute msg_col after last newline in ext_messages -ad853d1df0messages: improve deadly signal messages #32364 -51853b82bcmessages: incorrect error message splitting and kind #32990 -08f7c22377messages: list_cmd kind for :registers, :au[g] #32531 -7ce27381fbmessages: lsp window/showMessage is not an error -1b6442034fmessages: more ext_messages kinds #31279 -9c6a3703bbmessages: no message kind for :undo messages #31590 -ca760e645bmessages: no message kind for :write messages #31519 -909b18d05amessages: no message kind for completion menu messages #31646 -f111c32ff9messages: no message kind for search pattern #31272 -282f73f067messages: no trailing newline for inputlist, tselect, z= with ext_messages -9fa3a0964emessages: pass previous highlight id to ext chunks -e025f5a5b3messages: proper multiline Lua print() messages #31205 -d1e00a5f6dmessages: typo and unwanted truncation in msg_outtrans_long #31669 -d55b17e2b4messages: verbose kind for nvim_echo() -c8e47f6480meta: do not use hyphens in param names -2cd72258f6mouse: 'statuscolumn' fold and popopmenu handling -81d4e96bc8mouse: don't treat click on hsep as click on statusline (#29565) -102971a396mouse: early return when clicking in padded 'statuscolumn' (#29394) -86c5c8724bmouse: indicate X1 and X2 button clicks on statusline (#30655) -f86864f22fmove: 'scrolloff' cursor correction no longer handles folds properly (#32642) -5947f249f8move: half-page scrolling with resized grid at eob (#28821) -ac7e0ff32fmove: redraw for 'concealcursor' after changing w_wcol (#31276) -af0a2157admove: wrong cursor row on concealed line (#32629) -83479b95abmpack: remove invalid bool definition -d32780de4dmswin: UI may hang on exit -fa99afe35emultibyte: handle backspace of wide clusters in replace mode -de83cc5842netrw: re-add missing comment marker in syntax file -d9585bdcfbnvim__set_complete: pum preview info truncated during completion #32555 -34e2185022options: better handling of empty values -190d0241e2options: fix 'winborder' accepting multiple string values (#32978) -8c532a9ea8options: fix 'winhl' still accepting invalid value (#30896) -1b9dafa67boptions: fix :setglobal not working for 'spelloptions' (#30894) -395f420fc6options: fix some 'belloff' flags not working properly (#30856) -50e63c8171options: missing error check for global 'scl' and 'winhl' (#30919) -e697c1b43dpaste: improve repeating of pasted text (#30438) -052875b9dcpaste: only record a paste when it's from RPC (#30491) -9516997eb0paste: wrong '[ mark after pasting a big string (streamed chunks) #33025 -42aa69b076path: avoid chdir() when resolving path (#28799) -42db8b1759path: crash with nvim_get_runtime_file during wildcard expansion (#32992) -0dfcf3fe12plines: don't count invalidated virt text in char size (#29863) -afc3c43f12popup: new preview_bufnr created when menu item is selected #32819 -ac1c5ccb2cpopup: reuse pum preview float win, set 'winfixbuf' #32636 -d288f7003dpopup: wrong extmark data sync when lines changed in popup preview #30246 -d24fb72c33pum: don't select item when clicking to the left/right (#30967) -73ae7d44a2quickfix: make shortmess+=O work with cmdheight=0 (#29609) -3bcd5624beregexp: fix typo in E888 error message (#30161) -cb924764a4runtime: "E121 Undefined variable s:termguicolors" #32209 -29a47b39ccruntime: E15: Invalid expression in lua file when `gf` -b6c1ce8a95runtime: add commentstring for glsl ftplugin -9ddfcb64bfruntime: add remaining missing commentstrings (#30252) -e641155b02runtime: avoid E31 in ftplugin (#32578) -82b02ae2f2runtime: clean up one-off scripts -9788b81d7eruntime: fully port emoji_list to Lua -74fcc9452cruntime: gO always says "Help TOC" #32971 -69aa33d890runtime: let matchit and matchparen skips fallback on treesitter captures -8369590eb2runtime: remove obsolete ftplugin/calender.lua -41b70a0dearuntime: set 'keywordprg' only once in vim ftplugin -7b16c1fa84runtime: source c ftplugin properly for cpp on Windows (#29053) -12c9791e0fruntime: stop treesitter highlight in b:undo_ftplugin (#29533) -862338255druntime: sync bundled treesitter queries -9e80738f30runtime: sync bundled treesitter queries -5057753431runtime: treat b:undo_ftplugin consistently in Lua ftplugins (#30473) -8f5e908110runtime: update b:undo_ftplugin in Lua runtime files (#29529) -a5bd6665b0scripts: update bundled dependencies in bump_deps -573a71469dscrollbind: properly take filler/virtual lines into account -a8b6fa07c4search: avoid quadratic time complexity when computing fuzzy score (#32153) -648d6426c8server: CID 509282: DEADCODE #30316 -f4921e2b7dshada: ":wshada/:rshada [filename]" with shadafile=NONE #32538 -cd48b72b60shada: restore search pattern length properly (#28929) -608543f8a9snippet: cancel snippet session when leaving the buffer (#29031) -7994fdba6asnippet: don't override unnamed register on tabstop select (#28998) -5fe4ce6678snippet: modify base indentation when there's actually whitespace (#29670) -424f4cc038snippet: wrong indentation when snippet contains "^" #32970 -d46ebd2a74startup: avoid crash with completion from -l script (#32160) -08153ddd1cstartup: ignore broken $XDG_RUNTIME_DIR #30285 -17e00d0cc6startup: report --startuptime error to stderr (#31131) -8a2aec9974startup: server fails if $NVIM_APPNAME is relative dir #30310 -19fc65acbcstatuscolumn: misleading v:lnum for virtual lines #32912 -87e806186cstatusline: overwriting stl_items with nvim_eval_statusline() {-item #32265 -1c30d86c33tabline: restore behavior of click after last tabpage (#30602) -a49f95d887terminal: avoid mismatched `busy_start` without `busy_stop` (#32458) -f3ce67549cterminal: avoid more `busy_start` lacking `busy_stop` (#32509) -3d49c55d3cterminal: avoid rescheduling events onto the same queue (#32755) -69a19295f8terminal: delay when finishing terminal process #32846 -f8c8a245aaterminal: don't crash on unprintable chars -6d997f8068terminal: handle C0 characters in OSC terminator (#30090) -fa46441264terminal: improve cursor refresh handling (#32596) -1d11808bfdterminal: interrupt/got_int hangs terminal (#30056) -3db3947b0eterminal: restore cursor from 'guicursor' on TermLeave (#31620) -c51bf5a6b2terminal: set cursor cell percentage (#31703) -5def8714adterminal: set local values of window options (#29326) -e9c077d197termkey: fix null pointer dereference (#31792) -c8e3618e0etest: "tempdir not a directory" in CI logs -f7e32fb6e6test: better management of tmpfiles -db2c3d1143tests: filter out lines with __typeof__ keyword (#32524) -e61228a214tests: needing two calls to setup a screen is cringe -639734bed4tests: remove the __extension__ keyword in filter_complex_blocks (#32483) -59baa5e8a1tohtml: apply sp color if present #30110 -67c39f5ecatohtml: disable modeline #32822 -e37404f7fetohtml: enclose font-family names in quotation marks -25db0a1385tohtml: extmark text may be out of bounds -8cd9feb501tohtml: ignore lsp inlay hints -eb37241d38tohtml: properly handle multiple hl groups #29012 -2ed6423c7etohtml: replace ipairs with pairs -88c7997503tohtml: show how many warnings are hidden -118ae7e5edtohtml: support ranges again -c63e49cce2treesitter: #trim! range for nodes ending at col 0 #31488 -b63cd8cbaetreesitter: EditQuery shows swapfile ATTENTION #30536 -55b165ac15treesitter: `TSNode:field()` returns all children with the given field -86b737649btreesitter: add 'QuitPre' event to autocommands in inspect_tree -bc1018a8d3treesitter: avoid computing fold levels for empty buffer -a119dab40ftreesitter: avoid computing foldlevels for reloaded buffer #32233 -6696ea7f10treesitter: clean up parsing queue -99acc9de55treesitter: close InspectTree/EditQuery window on BufUnload (#31036) -f50f86b9fftreesitter: compute folds on_changedtree only if not nil -7a20f93a92treesitter: correct condition in `__has_ancestor` -9b25c68db2treesitter: correctly parse queries with combined injections -3abfaafad2treesitter: detect trees with outdated regions in `is_valid()` -9217e0d671treesitter: display fields for anonymous nodes in :InspectTree -da4e8dc5b0treesitter: do not modify highlight state for _on_spell_nav -0e3e1e6b6dtreesitter: don't open fold when o/O adds a line below #28709 -aa2b44fbb0treesitter: don't return error message on success #31955 -b0bbe25c48treesitter: don't spam query errors in the highlighter -b88874d33ctreesitter: empty queries can disable injections (#31748) -d413038b4ftreesitter: ensure syntaxset augroup exists (#29542) -f8e1ebd6f6treesitter: escape things like `"` in omnifunc results -c4eb0b64bdtreesitter: find buffer in multiple windows #28922 -94d42a3e72treesitter: highlight anonymous nodes in inspect_tree -5331f87f61treesitter: indent size for inspect_tree #28727 -6ef80eb42ctreesitter: keep treeview open if source window is still open #31198 -052e048db6treesitter: lint top-level anonymous nodes -4b90952851treesitter: mark supertype nodes as named -096ae3bfd7treesitter: nil access when running string parser async -c3337e357atreesitter: nil check query for has_conceal_line -6711fa27catreesitter: recalculate folds on VimEnter #32240 -05dcda8f9btreesitter: recognize aliased parsers in omnifunc, query linter -d3193afc25treesitter: remove duplicate symbol names in language.inspect() -cdc9baeaf8treesitter: remove redundant on_bytes callback #31041 -1827ab7a1ftreesitter: separately track the number of valid regions -36990f324dtreesitter: show proper node name error messages -4349bdbd0btreesitter: specify success status in edit_query return value -e7ebc5c13dtreesitter: stop async parsing if buffer is invalid -0f067cd34dtreesitter: suppress get_parser warnings via opts.error -ae917dbd06treesitter: sync queries from upstream -c4e9ff30a6treesitter: sync queries with upstream -d8eec81560treesitter: update lua, markdown queries -6e44a6a289treesitter: update queries -5a54681025treesitter: uv_dlclose after uv_dlerror -e4bc8b5967treesitter.foldexpr: only refresh valid buffers -48acbc4d64treesitter.foldexpr: refresh in the buffers affected by OptionSet -8474f52978treesitter.foldexpr: robustness against ctrl-c -f81131cca2tui: also reset cursor color if it was invisible (#31348) -4846bf05dctui: avoid flushing buffer halfway an OSC 2 sequence (#30793) -720ec5cec2tui: cursor color in suckless terminal #32310 -b5cb69f8a4tui: handle key events for arrow and function keys (#31804) -d7651b27d5tui: move $COLORTERM check to _defaults.lua (#29197) -a811d4babdtui: only reset cursor color if it was changed (#31337) -0c0352783ftui: remove DCS escaping in tmux (#32723) -47c741e30ctui: remove duplicate disabling of synchronized output (#28884) -f32557ca67tui: reset active attr ID when OSC 8 sequence is terminated (#29960) -bc63ffcf39tui: reset clear_region attributes during startup #28713 -b02c839414tui: set id parameter in OSC 8 sequences (#29840) -0231265c8ctui: skip TUI in ui_rgb_attached (#29096) -8b8096500dtutor: incorrect lines marked as correct #29833 -31745b17e6types: add narrower vim.validate types -44410d063atypes: add some vim.fn type annotations -b813075b8atypes: do not mark unstable API as private -e947f226betypes: use vararg return type annotation -a1906c23ddui: Windows :detach is opt-in -594c7f3d77ui: avoid ambiguity about last chunk when flushing halfway (#29718) -216ec73972ui: avoid redundant ext_cmdline events (#32237) -6cdcac4492ui: clamp 'cmdheight' for other tabpages on screen resize (#31419) -318c0415d5ui: correctly pass metadata to get_node_text #30222 -7eba016c86ui: ensure screen update before waiting for input #30576 -5b6477be45ui: flush ext_cmdline events before doing cmdpreview #27950 -6e4df18b45ui: no fast context for prompt message kinds #31224 -6b8c56c7f6ui: schedule UI detach (#32827) -b66106a46cui: superfluous showmode / excessive grid_cursor_goto #29089 -d1fd674df3ui: update title in more cases (#31508) -442d338cb5uri: uri_encode encodes brackets incorrectly for RFC2732 #31284 -d049752e45version: fix vim.version().prerelease -8bdfc2ab2bversion: return nil with empty string -6401b433f7vim.fs: default to follow=false #32859 -47e6b2233fvim.fs: dirname() returns "." on mingw/msys2 #30480 -0bef3b911cvim.fs: joinpath() does not normalize slashes on Windows #31782 -6dc0eb9f41vim.fs.abspath: correctly handle UNC paths -a8ace2c58avim.fs.normalize: normalize case for windows drive letter -4c0d18c197vim.iter: enable optimizations for arrays (lists with holes) (#28781) -734dba04d1vim.system: close pipe handles after process handle -4e130c1ee4vim.system: invalid MAX_TIMEOUT for 32-bit systems #31638 -ad3472e291vim.system: resolve executable paths on windows -33464189bcvim.text: handle very long strings (#30075) -4cff418564vim.text: remove assert from vim.text.hexdecode -d338ec9cb2vim.ui.open: prefer xdg-open on WSL #30302 -8bf79bd13cvim.wo: never allow non-zero bufnr -453f2c52d2vim_snprintf: special-case handling of binary format -32e128f209watch: exclude .git when using inotifywait (#29914) -9e23b4e185watch: ignore nonexistent paths (ENOENT) -a18652ed61win-msi: add bin to PATH per-machine after installation (#29099) -88f07d6ca4win-msi: set installer scope to machine #29895 -4f9311b759window: making float with title/footer non-float leaks memory (#30551) -7b71fdbc1ewindow: respect hide flag of float windows when switching (#30507) -59da82abd9wininfo: when freeing windows, free the lowest priority wininfo PERFORMANCE -------------------------------------------------------------------------------- -48251134eeadd fast path to vim.validate (#28977) -3abd7ed4a4consider only active decorations when drawing lines -8d2ee542a8decor: join predicates and matches cache -48e3ac60c6diagnostics: cache line diagnostics when `current_line` is set #32288 -b8ddd3b6bbevents: remove unnecessary loop in event_nr2name() (#32777) -15f2da55a8events: use hashy for event name lookup (#32802) -abf4b65a51filetype: cache (more) pattern data during "add" time -f61efe3fe7filetype: implement parent pattern pre-matching (#29660) -ff575b3886filetype: optimize internal data structures -dc04ef2a20filetype: skip contents check in `match()` if there is no contents (#29596) -12d4caa9d3keycodes: use hashy for string lookup -f8fc6cb157loader: reduce calls to Loader.cache_file -138a93a057lsp: avoid repeated table lookup in completion.enable -7342e6b00dlsp: do not apply semantic tokens to folded lines -c85d15e0d5lsp: don't construct potentially expensive strings -cc1f2d2ca6lsp: don't copy completion items in filter pass -3e855d533flsp: use faster version of str_byteindex -000129201cmouse: only generate <MouseMove> for a new cell positon (#31103) -3fdc430241treesitter: cache queries strongly -b192d58284treesitter: calculate folds asynchronously -c6abc97006treesitter: do not use tree cursors with a small lifetime -cbad2c6628treesitter: don't block when finding injection ranges -d9ee0d2984treesitter: don't fetch parser for each fold line -562056c875treesitter: only search for injections within the parse range -c57a85e0edtreesitter: remove unnecessary foldexpr loop -64847fbdc9treesitter: use `child_containing_descendant()` in `is_ancestor()` -4b02916334treesitter: use child_containing_descendant() in has-ancestor? (#28512) -3f3e4837d5validate: use lighter version -99b5ffd688vim.text: use lookup table implementation for hex encoding (#30080) BUILD -------------------------------------------------------------------------------- -104800ce2e"popcount" name conflict on NetBSD #28983 -198a952c13add luals check -ef8067a19dadd quotes around `CMAKE_GENERATOR` variable -32e16cb0b6add utf8proc as dependency -b213f5169callow comment after #include for required header (#29722) -382eb878bcbump lua dev dependencies -1d815acd78bump minimum cmake version to 3.16 -5284a2a793bump unibilium to v2.1.2 -ac5a6d9ff5fix RelWithDebInfo optimization flags #31802 -7c65224257fix lint error on macos -046e0956eefix or silence new clang-tidy warnings -5719f2b91afix uncrustify install in nix devShell (#33020) -4a0ee22e77make makefile work on msys -4ee65484b1make makefile work on windows -1b90f4a9c4mark CMake variables advanced #31412 -0f24b0826amove all generator scripts to `src/gen/` -e5ff302033remove -O2 from gen_cflags -d74c74aae3remove `lintcommit` from `lint` target -573bcb2aafremove enforcement of cmake build type -0e9c92a900remove nix flakes (#28863) -f09f5c45fareuse code for deps.txt for both deps and main build -e1dc824b7eset luals checklevel to Hint #32392 -cac86e9b4csilence "po" noise #30469 -07b14c8e2especify POST_BUILD when using add_custom_command -e83ce331dause treesitter's CMakeLists.txt -e268fcbdaawork around bug in make when PATH includes cmake as dir -b288fa8d62bump_deps: abort if archive doesn't exist -7ead328a48cjson: sync with upstream (#32114) -0e2f92ed79clint: make NOLINT work with header checks (#31281) -327110ff8ccmake: remove unnecessary policy code -535c2f8658contrib: add zsh completion (#32617) -51d85f7ea5deps: drop unused bundled bash, python parsers and queries -9216bc927cdeps: fix formatc target on MSVC -b3641b8008deps: remove libtermkey dependency -1247684ae1deps: remove msgpack-c dependency -fa79a8ad6ddeps: vendor libvterm at v0.3.3 -c614969570docs: update CSS #28896 -0a087f2073generator: add dependencies on hashy (#32796) -e178331488lpeg: search for lpeg.so on MacOS -7e099cf3ebmacos: disable deduplication in link step -f4d9a2983arelease.sh: fix hang when generating docs (#33026) -b923fcbaf0vim-patch.sh: don't ignore changes to version*.txt (#29425) -7aaa4a51b7vim-patch.sh: include commit subject #28767 -3146433190vim-patch.sh: use 7 hex digits for runtime patch file name (#29940)
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*.infiles which are transformed into*.luafiles usingconfigure_fileCMake command: this is for accessing CMake variables in lua tests./test/includes: include-files for use by luajitffi.cdefC definitions parser: normally used to make macros not accessible via this mechanism accessible the other way./test/*/preload.lua: modules preloaded by busted--helperoption/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.luaare 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
$GDBto run functional tests under gdbserver:GDB=1 TEST_FILE=test/functional/api/buffer_spec.lua TEST_FILTER='nvim_buf_set_text works$' make functionaltestRead more about filtering tests.
Then, in another terminal:
gdb -ex 'target remote localhost:7777' build/bin/nvimIf
$VALGRINDis also set it will pass--vgdb=yesto valgrind instead of starting gdbserver directly.See
nvim_argvin 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 intest/functional/ui/screen.luafor 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:
- nvim-dap
- local-lua-debugger-vscode
- nlua
- one-small-step-for-vimkind (called
osv) - A
nbustedcommand in$PATH. This command can be a copy ofbustedwithexec '/usr/bin/lua5.1'"replaced with"exec '/usr/bin/nlua'"(or the path to yournlua)
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_FILEis not a pattern string likeTEST_TAGorTEST_FILTER. The given value toTEST_FILEmust be a path to an existing file.- Both
TEST_TAGandTEST_FILTERfilter tests by the string descriptions found init()anddescribe().
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.#defineconstants must be rewrittenconstorenumso 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 ofmd5sumon$PATH), and you can't mock or fake the dependency, then skip the test viapending()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 anit()block. Provide empty function argument if thepending()call is outsideit()(example).
- Note:
- Really long
source([=[...]=])blocks may break Vim's Lua syntax highlighting. Try:syntax sync fromstartto 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 forsrc/nvim/undo.cshould live intest/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.luagroup that makes sense, before creating a new one.
- Try to find an existing
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 tobusted. -
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 undergdbserver. It will be accessible onlocalhost:7777: usegdb build/bin/nvim, typetarget remote :7777inside. -
GDBSERVER_PORT(F) (I): overrides port used forGDB. -
LOG_DIR(FU) (S!): specifies where to seek for valgrind and ASAN log files. -
VALGRIND(F) (D): makes nvim instances to be run undervalgrind. Log files are namedvalgrind-%p.login 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 withGDB. -
VALGRIND_LOG(F) (S): overrides valgrind log file name used forVALGRIND. -
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): makesffi.cdefrun 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 requiringffi.cdefto do parsing of big strings with C definitions. -
NVIM_TEST_PRINT_I(U) (1): makescimportprint preprocessed, but not yet filtered throughformatcheaders. Used to debugformatc. Printing is done with the line numbers. -
NVIM_TEST_PRINT_CDEF(U) (1): makescimportprint final lines which will be then passed toffi.cdef. Used to debug errorsffi.cdefhappens 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): makesitprun tests which are known to fail (marked by setting third argument totrue). -
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): makescheck_coresnot 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 whenNVIM_TEST_CORE_GLOB_DIRECTORYis defined and this variable is not) cores are checked for after each test. -
NVIM_TEST_RUN_TESTTEST(U) (1): allows runningtest/unit/testtest_spec.luaused to check how testing infrastructure works. -
NVIM_TEST_TRACE_LEVEL(U) (N): specifies unit tests tracing level:0disables tracing (the fastest, but you get no data if tests crash and there no core dump was generated),1leaves only C function calls and returns in the trace (faster than recording everything),2records 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): launchesosvlistening on the given port within nvim test instances.