summaryrefslogtreecommitdiffstatshomepage
path: root/src
AgeCommit message (Collapse)AuthorFiles
2026-04-25fix(channel): stack-buffer-overflow with exit during connection (#39387)zeertzjq2
Problem: When Nvim exits while connecting to a socket it leads to stack-buffer-overflow. Solution: Associate the handle with the Stream and use the Stream's internal_close_cb to update the "closed" status.
2026-04-25fix(build): add `_core/time.lua` to gettext #39384Olivia Kinnear1
2026-04-24feat(tui): restore 'ttyfast' to control tty requests #38699Kyle3
Problem: When running nvim on a remote machine over SSH, if there is high ping, then bg detection may not complete in time. This results in a warning every time nvim is started. #38648 Solution: Restore 'ttyfast' option and allow it to control whether or not bg detection is performed. Because this is during startup and before any user config or commands, we use the environment variable `NVIM_NOTTYFAST` to allow disabling `ttyfast` during initialization.
2026-04-24fix(api): leak preview callback LuaRef in nvim_create_user_command #39357Barrett Ruth1
Problem: Invalid `nvim_create_user_command` calls can leak the `preview` callback reference after Neovim has taken ownership of it. 1. build with {a,l}san 2. run: ```sh <path/to/nvim> --headless -u NONE --clean +'lua for i = 1, 100 do pcall(vim.api.nvim_create_user_command, "some very epic stuff" .. i, {}, -- NOTE: this is INVALID (not a function or string) { preview = function() end }) end vim.cmd("qa!") ' +qa ``` 3. see: ``` 100 lua references were leaked! ``` Solution: Clear `preview_luaref` in `err:`.
2026-04-24fix(api): LuaRef leak in nvim_set_keymap on LHS too long (>=66 bytes) #39351Barrett Ruth1
Problem: `nvim_set_keymap` leaks the `callback` `LuaRef` when the LHS is too long. Solution: Make `set_maparg_lhs_rhs` transfer `rhs_lua` to `MapArguments` up front so the caller always owns the ref.
2026-04-24fix(path): normalize path slashes on Windows #37729tao23
Problem: On Windows, path separators may become inconsistent for various reasons, which makes normalization quite painful. Solution: Normalize paths to `/` at the entry boundaries and always use it internally, converting back only in rare cases where `\` is really needed (e.g. cmd.exe/bat scripts?). This is the first commit in a series of incremental steps. Note: * some funcs won't respect shellslash. e.g. `expand/fnamemodify` * some funcs still respect shellslash, but will be updated in a follow PR. e.g. `ex_pwd/f_chdir/f_getcwd` * uv's built-in funcs always return `\`. e.g. `uv.cwd/uv.exepath` Co-authored-by: Justin M. Keyes <justinkz@gmail.com>
2026-04-24feat(api): nvim_echo(percent=nil) means "unknown" progress #39029Peter Cardenas2
Problem: No way to signal "unknown" or "indeterminate" progress percentage. Solution: Treat percent=nil as "indeterminate" percent.
2026-04-23fix(options): repair stale UI state after `:set all&` #39026Barrett Ruth1
Problem: `set all&` resets option values directly and leaves UI-derived state stale for `guicursor`, `laststatus`, and `showtabline`. Solution: Repair some of the stale UI state in the bulk reset path by reparsing `guicursor`, refreshing statusline state, and recomputing tabline/window rows.
2026-04-23feat(excmd): add :uptime command #39331Olivia Kinnear2
Problem Nvim marks its v:starttime, but there is no user-friendly way to get Nvim's uptime. Solution Add :uptime (based loosely on uptime(1)).
2026-04-23fix(lua): don't strip debuginfo in precompile module #39191phanium4
Problem: debug.getinfo on bytecode module/func don't give you detail source info. Solution: - Use `loadstring`+`string.dump` to replace LUAC_PRG(`luac`/`luajit -b`) - `string.dump(…,false)` to generate non-strip version bytecode - `loadstring(…,fname)` to specify the full source name BEFORE: $ nvim --clean +'=debug.getinfo(vim.fn.maparg("]<Space>", "n", 0, 1).callback, "Sl")' --headless +q { currentline = -1, lastlinedefined = 456, linedefined = 452, short_src = "?", source = "=?", what = "Lua" } AFTER: $ nvim --clean +'=debug.getinfo(vim.fn.maparg("]<Space>", "n", 0, 1).callback, "Sl")' --headless +q { currentline = -1, lastlinedefined = 456, linedefined = 452, short_src = "/home/xx/b/neovim/runtime/lua/vim/_core/defaults.lua", source = "@/home/xx/b/neovim/runtime/lua/vim/_core/defaults.lua", what = "Lua" }
2026-04-23fix(terminal): memory leak in pending TermRequest StringBuilder #39333Barrett Ruth1
Problem: Destroying a terminal with pending `TermRequest` events leaks memory. Solution: Make `emit_termrequest` the sole owner of its `pending_send` allocation.
2026-04-23vim-patch:partial:9.2.0315: missing bound-checks (#39334)zeertzjq4
Problem: missing bound-checks Solution: Add defensive guards against potential buffer overflow (Yasuhiro Matsumoto) Add bounds checking and integer overflow guards across multiple files as a defensive measure. While these code paths are unlikely to be exploitable in practice, the guards prevent undefined behavior in edge cases. - libvterm/vterm.c: use heap tmpbuffer instead of stack buffer in vsprintf() fallback path - channel.c: validate len in channel_consume() before mch_memmove() - spell.c: use long instead of int for addlen to avoid signed overflow in size_t subtraction - alloc.c: add SIZE_MAX overflow check in ga_grow_inner() before itemsize multiplication - list.c: add overflow check before count * sizeof(listitem_T) - popupwin.c: add overflow check before width * height allocation - insexpand.c: add overflow check before compl_num_bests multiplication - regexp_bt.c: replace sprintf() with vim_snprintf() in regprop() - spellfile.c: use SIZE_MAX instead of LONG_MAX for allocation overflow check closes: vim/vim#19904 https://github.com/vim/vim/commit/8d23fcb603d8f8938ce0023086326a5db6780ea2 Co-authored-by: Yasuhiro Matsumoto <mattn.jp@gmail.com>
2026-04-22vim-patch:9.2.0388: strange indent in update_topline() (#39324)zeertzjq1
Problem: strange indent in update_topline() Solution: Fix the indentation (zeertzjq) closes: vim/vim#20033 https://github.com/vim/vim/commit/f194676c936d9f3a8479a72afbbe9f244039e27e
2026-04-22feat(:restart): v:starttime, v:exitreason #39282Justin M. Keyes6
Problem: - The `ZR` feature makes it more obvious that we need some sort of flag so that an `ExitPre` / `QuitPre` / `VimLeave` handler can handle restarts differently than a normal exit. For example, it's common that users want `:mksession` on restart, but perhaps not on a normal exit. - Nvim has no way to report its "uptime". Solution: - Introduce `v:starttime` - Introduce `v:exitreason`
2026-04-22feat(eval): treat Lua string as "blob" in writefile() #39098Barrett Ruth2
Problem: vim.fn.writefile() treats Lua strings as Vimscript strings instead of a "binary clean" string. Solution: Treat Lua-originated strings as blob data.
2026-04-22fix(shada): bdelete'd buffers not stored in oldfiles #39070glepnir1
Problem: b98eefd added `!b_p_bl` to `ignore_buf()`, which also skips bdelete'd buffers since bdelete unsets `b_p_bl`. Solution: Check `b_p_initialized` together with `b_p_bl` so that bdelete'd buffers (which have b_p_initialized=false) are not filtered out. Keep `b_p_bl` check only in `shada_get_buflist()`.
2026-04-22fix(cmdline): avoid 'incsearch' recursion after redraw #39303luukvbaal3
Problem: A vim.ui_attach() callback that redraws to show a 'verbose' regex message during 'incsearch' results in recusive redrawing. Solution: Check that curwin was redrawn instead of just any window when determining if 'incsearch' highlighting was cleared.
2026-04-22fix(options): default 'titlestring' shows CWD #39233Nick Krichevsky2
Problem: In the default 'titlestring', if the containing directory is the CWD, it renders as "." Solution: Add `:p` to the titlestring.
2026-04-22fix(cmd): ++p, ++edit should match "word" boundary #39146glepnir1
Problem: `:write ++patate foo` doesn't error out, instead it turns on mkdir_p and uses "atate foo" as the filename. Same with ++edit. The parser just does strncmp without checking what comes after. Solution: require the next char after the option name to not be a letter
2026-04-22vim-patch:3918f32: runtime(doc): fix incorrect description of 'scrolloffpad'zeertzjq1
closes: vim/vim#20029 https://github.com/vim/vim/commit/3918f3232f874b3c96f8bfccc5049711f16c252e
2026-04-22vim-patch:9.2.0356: Cannot apply 'scrolloff' context lines at end of filezeertzjq6
Problem: Cannot apply 'scrolloff' context lines at end of file Solution: Add the 'scrolloffpad' option to keep 'scrolloff' context even when at the end of the file (McAuley Penney). closes: vim/vim#19040 https://github.com/vim/vim/commit/a414630393f81c9a5b8fa4d0fcc1287155f67751 Co-authored-by: McAuley Penney <jacobmpenney@gmail.com>
2026-04-22vim-patch:9.2.0385: Integer overflow with "ze" and large 'sidescrolloff' ↵zeertzjq2
(#39289) Problem: Integer overflow with "ze" and large 'sidescrolloff'. Solution: Check for overflow to avoid negative w_leftcol (zeertzjq). closes: vim/vim#20026 https://github.com/vim/vim/commit/33f3965087b01dccf4382ed419d34799ffd66cd9
2026-04-22vim-patch:9.2.0384: stale Insstart after cursor move breaks undo (#39290)zeertzjq1
vim-patch:9.2.0384: stale Insstart after <Cmd> cursor move breaks undo Problem: A <Cmd> command executed from Insert mode can sync undo and move the cursor before the next edit. stop_arrow() saved the new cursor line for undo, but left Insstart at the previous insertion point. A line-start backspace could then delete lines above the saved line without saving the joined range, leaving a pending undo entry whose bottom resolved above its top and raising E340. Solution: Update Insstart and Insstart_textlen after the pending undo save so the next edit starts from the command-updated cursor position (Jaehwang Jung). closes: vim/vim#20031 AI-assisted: Codex https://github.com/vim/vim/commit/d4fb31762ea0b9de6fffb529c4ffee509621f74c Co-authored-by: Jaehwang Jung <tomtomjhj@gmail.com>
2026-04-22fix(incsearch): support `c_CTRL-{G,T}` with an offset (#39097)Barrett Ruth2
vim-patch:9.2.0374: c_CTRL-{G,T} does not handle offset Problem: c_CTRL-{G,T} does not handle offset, when cycling between matches Solution: Refactor parsing logic into parse_search_pattern_offset() and handle offsets, note: highlighting does not handle offsets yet (Barrett Ruth). fixes: vim/vim#19991 closes: vim/vim#19998 https://github.com/vim/vim/commit/c62342e5cfc339a87c1eb40ef34b2b31070d72a6
2026-04-22fix(:restart): avoid ERR/WRN logging on Windows with --listen (#39287)zeertzjq3
Problem: :restart leads to ERR/WRN logging on Windows with --listen. Solution: Add a log_level flag to vim._with() and use it to suppress logging from serverstart()/serverstop() during restart.
2026-04-21fix(messages): "progress" kind for busy messages #39280luukvbaal5
Problem: The "Scanning:" completion, bufwrite, and indent (there may be more) messages which indicate progress can use the "progress" kind for their msg_show event. Indent message does not have a kind. Solution: Emit these messages with the "progress" kind. Set the message id to the replaced kind so that a UI knows to replace it (and to provide a migration path in case a UI was distinguishing these messages for whatever reason).
2026-04-21Merge pull request #39076 from bfredl/zig0.16bfredl3
IT IS HAPPENING: Zig 0.16
2026-04-21fix(:restart): reuse --listen addr on Windows #38539Sanzhar Kuandyk1
Problem: On Windows, :restart cannot immediately reuse the canonical --listen address because named pipe release is asynchronous. Solution: Start the new Nvim server on a temporary address; in the new Nvim, retry serverstart() with the original ("canonical") address until it succeeds.
2026-04-21feat(normal): normal-mode ZR does :restartJustin M. Keyes1
Make it a normal-mode command instead of a default mapping.
2026-04-21fix(substitute): don't crash with very large count (#39272)zeertzjq3
2026-04-21fix(build): more changes to make zig 0.16.0 workbfredl2
2026-04-21feat(build.zig): update to zig 0.16Chinmay Dalal2
2026-04-21vim-patch:9.2.0380: completion: a few issues in completion code (#39264)zeertzjq1
Problem: ins_compl_stop() sets compl_best_matches = 0, but that's a pointer, should reset compl_num_bests instead, find_common_prefix() reads cpt_sources_array[cur_source] without checking cur_source != -1 which causes an OOB for -1, find_next_completion_match(): second `if` in the pending loop should be `else if`. Forward paging only moves one step per call. Solution: Reset compl_num_bests instead, add a check for cur_source not equal -1, change if to else if (glepnir) closes: vim/vim#20000 https://github.com/vim/vim/commit/b328686d6a1eae1c519a0cdc0420c0d87b6d1fd1 Co-authored-by: glepnir <glephunter@gmail.com>
2026-04-21vim-patch:9.2.0378: Using int as bool type in win_T struct (#39263)zeertzjq1
Problem: Several win_T fields are declared as "int" or "char" but are used strictly as boolean flags with TRUE/FALSE values. The integer types obscure the boolean intent and are wider than needed. Solution: Change the following win_T members to bool (stdbool.h) and update their assignments from TRUE/FALSE to true/false accordingly. The following conversions have been done: - int -> bool (10 members): w_set_curswant, w_botfill, w_old_botfill, w_do_win_fix_cursor, w_popup_fixed, w_border_highlight_isset, w_cline_folded, w_redr_status, w_arg_idx_invalid, w_has_scrollbar - char -> bool (4 members): w_topline_was_set, w_ru_empty, w_fold_manual, w_foldinvalid No existing code compares these members against TRUE/FALSE explicitly or uses ++/-- / bitwise ops on them, so only plain assignments are affected. Excluded: - w_locked (recursion counter with ++/--), - w_want_scrollbar (may hold -1 from dict_get_bool), - w_winbar_height (used in arithmetic and exposed as number via getwininfo()). related: vim/vim#20005 closes: vim/vim#20008 https://github.com/vim/vim/commit/146d5da0d16b7ea9c767a978cf02384d0831eb92 Co-authored-by: Hirohito Higashi <h.east.727@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21vim-patch:9.2.0373: Ctrl-R mapping not triggered during completion (#39261)zeertzjq1
Problem: Ctrl-R mapping not triggered during completion. Solution: Move Ctrl-R check out of vim_is_ctrl_x_key() (zeertzjq). fixes: vim/vim#20004 closes: vim/vim#20006 https://github.com/vim/vim/commit/49e8630a2859e6ed497fb5702663c276f8ab6597
2026-04-21fix(move): avoid integer overflow with large 'scrolloff' (#39251)zeertzjq6
2026-04-20docs: update version.c (#38976)github-actions[bot]1
vim-patch:8.2.0900: function list test fails on MS-Windows vim-patch:8.2.3918: function list test fails vim-patch:9.2.0347: Vim9: script-local variable not found vim-patch:f9cb0d14d CI: Separate out ASan tests vim-patch:9.2.0361: tests: no tests for ch_listen() with IPs vim-patch:336533b35 CI: Bump the github-actions group across 2 directories with 4 updates vim-patch:9.2.0363: Vim9: variable shadowed by script-local function vim-patch:8.2.0150: cannot define python function when using :execute vim-patch:8.2.0344: ":def" not skipped properly vim-patch:8.2.0755: Vim9: No error when variable initializer is not a constant vim-patch:8.2.1732: stuck when win_execute() for a popup causes an error vim-patch:8.2.2967: Vim9: crash when using two levels of partials vim-patch:8.2.3023: Vim9: arguments for execute() not checked at compile time vim-patch:8.2.3816: compiler warning for posible loss of data on MS-Windows vim-patch:9.0.0028: MS-Windows: tests fail if there is a "runtime" directory vim-patch:9.0.0571: MS-Windows: CTRL-C can make Vim exit vim-patch:9.0.0720: MS-Windows GUI may have pixel dust from antialiasing vim-patch:9.0.0763: MS-Windows: warning for using int for size_t vim-patch:9.0.0938: MS-Windows: debug executable not found when running test vim-patch:9.0.1023: MS-Windows: dynamic loading of libsodium doesn't work vim-patch:c98bfb9f59b8045372e4c0e396d707f55d9d027a vim-patch:9.1.1207: MS-Windows: build warning in filepath.c vim-patch:9.1.1499: MS-Windows: no indication of ARM64 architecture vim-patch:9.1.1706: MS-Windows: Compile error when building with if_ruby vim-patch:9.1.1813: MS-Windows: title bar is always white vim-patch:9.1.1830: MS-Windows: Dark mode titlebar is not configurable vim-patch:9.1.1966: MS-Windows: dark mode in gui is not supported vim-patch:9.1.2006: MS-Windows: ANSI colors not correct in terminal vim-patch:9.1.2046: MS-Windows: compile warnings vim-patch:9.1.2081: MS-Windows: unnecessary "#ifdef FEAT_GUI" in os_win32.c vim-patch:9.1.2129: MS-Windows: font size calculation slightly wrong, causing line gaps vim-patch:9.1.2142: MS-Windows: mouse scroll events not handled for popups vim-patch:9.2.0011: A few double semicolons after statement vim-patch:9.2.0163: MS-Windows: Compile warning for unused variable vim-patch:9.2.0179: MS-Windows: Compiler warning for converting from size_t to int vim-patch:9.2.0215: MS-Windows: several tests fail in the Windows CUI. vim-patch:9.2.0216: MS-Windows: Rendering artifacts with DirectX vim-patch:9.2.0321: MS-Windows: No OpenType font support vim-patch:dc47344: Fix a few typos vim-patch:9.2.0353: Missing out-of-memory check in register.c
2026-04-20docs: misc #39207Justin M. Keyes3
2026-04-20fix(api): expose fg_indexed/bg_indexed in nvim_get_hl #39210glepnir3
Problem: fg_indexed/bg_indexed were dropped from nvim_get_hl output due to a wrong short_keys guard. HL_FG_INDEXED also wasn't cleared in hl_blend_attrs, and HLATTRS_DICT_SIZE was too small. Solution: Remove the short_keys guard, clear HL_FG_INDEXED in hl_blend_attrs, bump HLATTRS_DICT_SIZE to 24, and clarify docs that these flags mean rgb is an approximation of the cterm palette index.
2026-04-20Merge #39194 from justinmk/luavimfnJustin M. Keyes5
2026-04-20vim-patch:partial:9.2.0368: too many strlen() calls when adding strings to ↵zeertzjq11
dicts (#39237) Problem: too many strlen() calls when adding strings to dicts Solution: Refactor code to use string_T, use dict_add_string_len() instead of dict_add_string() (John Marriott) Additionally: - In textprop.c, in function prop_fill_dict() use a string_T to store local variable text_align. - In popupwin.c, use a string_T to store struct member pp_name in struct poppos_entry_T. - In mark.c, refactor function add_mark() to pass in the length of argument mname. - In insexpand.c: ->Use a string_T to store the elements of static array ctrl_x_mode_names. ->Refactor function trigger_complete_done_event(): ->->change type of argument char_u *word to string_T *word. ->->make one access of array ctrl_x_mode_names instead of two. ->Refactor function ins_compl_mode() to accept a string_T to return the resulting string. - In fileio.c: ->Refactor function getftypewfd() to accept a string_T to return the resulting string. ->In function create_readdirex_item() use a string_T to store local variable q. - In cmdexpand.c, store global cmdline_orig as a string_T. - In autocmd.c, in function f_autocmd_get() use a string_T to store local variables event_name and group_name. Measure their lengths once when they are assigned so they are not remeasured on each call to dict_add_string() in the subsequent for loop. - In channel.c, in function channel_part_info() drop local variable status and use s instead. Make s a string_T. closes: vim/vim#19999 https://github.com/vim/vim/commit/c13232699db413e735f30b5649c78a7f38a9a069 Co-authored-by: John Marriott <basilisk@internode.on.net>
2026-04-20vim-patch:8.2.4912: using execute() to define a lambda doesn't work (#39229)Jan Edmund Lazo3
Problem: Using execute() to define a lambda doesn't work. (Ernie Rael) Solution: Put the getline function in evalarg. (closes vim/vim#10375) https://github.com/vim/vim/commit/a7583c42cd6b64fd276a5d7bb0db5ce7bfafa730 Co-authored-by: Bram Moolenaar <Bram@vim.org>
2026-04-20fix(smoothscroll): crash when resizing to textoff with showbreakJaehwang Jung1
vim-patch:9.2.0362: division by zero with smoothscroll and small windows Problem: Resizing a smoothscrolled wrapped window to its textoff width with 'showbreak' can leave wrapped continuation lines with zero text width. win_lbr_chartabsize() still runs the partial max_head_vcol calculation in that state and divides by width2, crashing during redraw. Solution: Skip that partial head calculation when the wrapped continuation width is zero, matching the other width2 guards in charset.c (Jaehwang Jung) closes: vim/vim#20012 AI-assisted: Codex https://github.com/vim/vim/commit/0e31fb024c846e36bb0d26d01ff179a0d1b3eae4
2026-04-20vim-patch:9.2.0365: using int as bool (#39232)zeertzjq4
Problem: using int as bool Solution: refactor: use bool type for internal flags in buf_T (Hirohito Higashi) Change the type of 23 internal state flag fields in buf_T from int to bool for improved type clarity and code readability. These fields are pure boolean flags that are never accessed via the option system's varp (which uses *(int *)varp = value), never compared with int fields holding non-0/1 values, and never use tristate values. Converted fields: - State flags: b_dev_valid, b_saving, b_mod_set, b_new_change, b_marks_read, b_modified_was_set, b_did_filetype, b_keep_filetype, b_au_did_filetype, b_u_synced, b_scanned, b_p_initialized - Characteristic flags: b_has_textprop, b_may_swap, b_did_warn, b_help, b_spell, b_shortname, b_has_sign_column, b_netbeans_file, b_was_netbeans_file, b_write_to_channel, b_diff_failed All TRUE/FALSE assignments to these fields have been updated to true/false accordingly. The type of temporary save variables (e.g. help_save in tag.c) has also been adjusted to bool. Option value fields (b_p_XXX) are kept as int because they are accessed via the option system and some use tristate (-1) semantics. Fields compared with int option values (b_start_eof, b_start_eol, b_start_bomb) are also kept as int to preserve comparison integrity. closes: vim/vim#20020 https://github.com/vim/vim/commit/1966a1c8963f59c00a9f25d129bec90366205e1b Co-authored-by: Hirohito Higashi <h.east.727@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19feat(options): add 'winpinned' to pin a window #39157luukvbaal7
Problem: - Unable to "pin" a window to prevent closing without specifically being targeted. - :fclose closes hidden windows (even before visible windows). Solution: - Add 'winpinned' window-local option. When set, window is skipped by :fclose and :only. Pin the ui2 cmdline window (which should always be visible), so that it is not closed by :only/fclose. - Skip over hidden (and pinned) windows with :fclose. Co-authored-by: glepnir <glephunter@gmail.com>
2026-04-20fix(jobstart): use uv_os_environ directlyJustin M. Keyes1
2026-04-20fix(excmd): nlua_call_excmd require() failure is a "lua_error"Justin M. Keyes2
Although `nlua_call_excmd` is semantically for implementing Ex-commands, the `require()` should never fail, so that's a "Lua error". But if the call itself fails (the later `semsg` call), that's an "Ex cmd" error.
2026-04-20refactor(excmd): migrate ex_terminal to LuaJustin M. Keyes2
2026-04-20refactor(excmd): migrate help.c to LuaJustin M. Keyes1
2026-04-20refactor(excmd): migrate ex_checkhealth to LuaJustin M. Keyes2