summaryrefslogtreecommitdiffstatshomepage
path: root/src
AgeCommit message (Collapse)AuthorFiles
2026-04-19fix(drawline): hang while redrawing diff filler above fold #39219Jaehwang Jung1
Problem: win_line() falls into infinite loop when a diff window has top filler above its first visible buffer line, that first visible buffer line is a closed fold, and the folded line uses normal non-empty foldtext. Solution: Allow flushing pending diff filler rows even when the underlying buffer line is folded with foldtext. AI-assisted: Codex Co-authored-by: zeertzjq <zeertzjq@outlook.com>
2026-04-19feat(excmd): add EXX error codes for :lsp, :log #39135Olivia Kinnear1
Also remove the `--add-comments` flag from `xgettext` because it dumped a bunch of comments from Lua files into the `.pot` files.
2026-04-19feat(events): trigger MarkSet autocmd in :delmarks #39156Ashley Hauck1
Problem: `api.nvim_buf_del_mark` already emits a `MarkSet` event with `col` and `line` set to 0. However, `:delmarks` currently emits no events. Solution: Change `:delmarks` to emit the same `col==line==0` event.
2026-04-18vim-patch:8.2.2245: Vim9: return value of winrestcmd() cannot be executedJan Edmund Lazo1
Problem: Vim9: return value of winrestcmd() cannot be executed. Solution: Put colons before each range. (closes vim/vim#7571) https://github.com/vim/vim/commit/285b15fce164ade8b1537b884cc15aebaa60e9ef Co-authored-by: Bram Moolenaar <Bram@vim.org>
2026-04-18docs: misc #39045Justin M. Keyes2
2026-04-18fix(eval): crash on some NULL ptr deref #39182phanium3
Crash on ``` let busy=$FOO call prompt_setcallback(bufnr('%'), $FOO) call chanclose(1, $FOO) ``` Co-authored-by: zeertzjq <zeertzjq@outlook.com>
2026-04-18refactor(vimfn): full-Lua impl of vim.fn.environ()Justin M. Keyes3
2026-04-18feat(vimfn): use Lua for more excmds/vimfnsJustin M. Keyes5
Problem: Too much boilerplate needed to use Lua to impl an excmd or f_xx function. Solution: - Add `nlua_call_vimfn` which takes the args typval, executes Lua, and returns a typval. - refactor(excmd): lua impl for :log, :lsp
2026-04-18fix(marks): adjust marks when unloading "nofile" buffer #39118luukvbaal1
Problem: Marks are not adjusted unloading a buffer that doesn't exist on disk. E.g. extmarks are still valid (and will be beyond the end of the buffer if the buffer is reloaded), even though the text is lost. Solution: Adjust marks for a cleared buffer when unloading a buffer that doesn't exist on disk.
2026-04-17fix(lsp): limit number of created highlight groups (#39133)Evgeni Chasnovski1
* fix(api): allow silencing "Too many highlight groups" error Problem: Using Lua's `vim.api.nvim_set_hl(0, 'New', {...})` can fail if there are too many existing highlight groups. However, this error can not be silenced with `pcall`. Solution: Make it possible to silence in `nvim_set_hl` and `nvim_get_hl_id_by_name`. * fix(lsp): limit number of groups created by `document_color()` Problem: A file can contain many string colors that would be highlighted by an LSP server. If this number crosses 19999 (maximum number of allowed highlight groups), there are general issues with creating other highlight groups, which can break functionality outside of `vim.lsp.document_color`. Solution: Limit number of highlight groups that are created by `vim.lsp.document_color` to 10000 (half of allowed maximum). This is not a 100% solution (since there can exist more than 10000 other highlight groups), but explicitly checking number of groups is slow and 10000 should (hopefully) be enough for most use cases.
2026-04-17perf(vim.fn): call Lua-implemented vim.fn.xx() directly #39166Justin M. Keyes5
Problem: - Builtin "Vimscript" functions (f_xx) are mostly implemented in C. Partly that's because there is some boilerplate required to call out to Lua. - Calls to `vim.fn.foo()` always marshall over the Lua <=> Vimscript ("typval") bridge, even if `fn.foo()` is implemented entirely in Lua: ``` Lua => typval => Object => Lua => Object => typval => Lua. ``` Solution: Functions declared in eval.lua with `func_lua` are implemented in entirely in Lua (`_core/vimfn.lua`). - `gen_eval.lua` wires `func_lua` entries to `lua_wrapper`, which handles the typval conversion for Vimscript callers (slow path). - `nlua_call()` detects `func_lua` functions and calls the Lua implementation directly. This eliminates all conversion overhead for Lua callers (fast path). - Validate at build-time that `func`, `func_float`, and `func_lua` are mutually exclusive. - Migrate `hostname()` as a toy example, to show the idea.
2026-04-18fix(terminal): forward streamed bracketed paste properly (#39152)zeertzjq2
2026-04-17refactor(cmdexpand): duplicate code #39167Justin M. Keyes1
- Also, drop `FUNC_ATTR_UNUSED` because `xp` is actually used.
2026-04-17fix(completion): update CursorColumn during completion (#39159)zeertzjq2
Since Nvim uses a compositor, redrawing windows won't lead to flicker in the popup menu, so the pum_visible() checks in move.c can be removed.
2026-04-17vim-patch:8.2.2440: documentation based on patches is outdated (#39144)zeertzjq2
Problem: Documentation based on patches is outdated. Solution: Add changes to documentation in a patch. https://github.com/vim/vim/commit/853886722c051ecaef6d818ce32a822e4f43dc2b Trailing space was removed in later patches. Also fix a few more misplaced error numbers from #8155. Co-authored-by: Bram Moolenaar <Bram@vim.org>
2026-04-16test: lint EXX error codes #8155Justin M. Keyes1
Problem: - Choosing a new EXX error code is tedious. - It's possible to accidentally use an EXX error code for different purposes. Solution: Add a lint check which requires EXX error codes to have a :help tag. This also avoids duplicates because `make doc` does `:helptags ++t doc` which fails if duplicates are found.
2026-04-16test: lint naming conventions #39117Justin M. Keyes7
Problem: Naming conventions are not automatically checked. Solution: Add a check to the doc generator. Eventually we should extract this somehow, but that will require refactoring the doc generator... Note: this also checks non-public functions, basically anything that passes through `gen_eval_files.lua` and `gen_vimdoc.lua`. And that's a good thing.
2026-04-16fix(float): don't unload 'hidden' float buffer with :close! (#39096)luukvbaal1
Problem: When closing floating windows to close a tabpage, if the current buffer will unload, buffers contained in those floating windows will too (unexpectedly). Solution: Don't pass along "free_buf" argument; check 'bufhidden' for the buffer in the to be closed float.
2026-04-16Merge #39078 render class dot members as module functionsJustin M. Keyes2
2026-04-16docs(l10n): fix fuzzy zh_CN translations #39109purrtc0l1
Problem: Several zh_CN translations were marked fuzzy with wrong or placeholder msgstr. Solution: Fix fuzzy entries, preserve format specifiers, use full-width punctuation.
2026-04-16feat(docs): render class dot members as module functionsYi Ming2
AI-assisted: Codex
2026-04-16fix(treesitter): restore highlighting on 32 bit systems #39091Barrett Ruth1
Problem: Treesitter highlighting regressed on 32-bit builds because ranges that should cover the whole buffer were corrupted when passed into Lua. Solution: Round-trip those range values through Lua and validate them so treesitter sees the same ranges on 32 and 64-bit builds.
2026-04-16vim-patch:9.2.0357: [security]: command injection via backticks in tag files ↵zeertzjq1
(#39102) Problem: [security]: command injection via backticks in tag files (Srinivas Piskala Ganesh Babu, Andy Ngo) Solution: Disallow backticks before attempting to expand filenames. Github Advisory: https://github.com/vim/vim/security/advisories/GHSA-cwgx-gcj7-6qh8 Supported by AI https://github.com/vim/vim/commit/c78194e41d5a0b05b0ddf383b6679b1503f977fb Co-authored-by: Christian Brabandt <cb@256bit.org>
2026-04-16vim-patch:9.2.0351: repeat_string() can be improved (#39101)zeertzjq1
Problem: repeat_string() can be improved Solution: Replace the for() loop by an exponential growing while loop (Yasuhiro Matsumoto) closes: vim/vim#19977 https://github.com/vim/vim/commit/bfa46a52f6a93cb99ec55d56ad43493d875c6dc2 Cherry-pick f_repeat() refactor from patch 9.1.1232. Co-authored-by: Yasuhiro Matsumoto <mattn.jp@gmail.com>
2026-04-15refactor(api): rename "window" to "win" (positional parameters) #39083Justin M. Keyes3
continues d0af4cd9094f. This commit renames positional parameters. This is only "cosmetic", but is intended to make it extra clear which name is preferred, since people often copy existing code despite the guidelines in `:help dev-naming`.
2026-04-15refactor(api): rename buffer to buf (positional parameters) #39013Justin M. Keyes7
In 3a4a66017b74, 4d3a67cd6201, df8d98173cbc we renamed "buffer" to "buf" in dict parameters and return-values. This commit renames positional parameters. This is only "cosmetic", but is intended to make it extra clear which name is preferred, since people often copy existing code despite the guidelines in `:help dev-naming`.
2026-04-15vim-patch:9.2.0346: Wrong cursor position when entering command line window ↵zeertzjq2
(#39072) Problem: Wrong cursor position when entering command line window Solution: Add check_cursor() command to verify the cursor position (Hirohito Higashi). When opening the command-line window with CTRL-F after typing a command that fills the screen width, the cursor was placed past the end of the line. Add check_cursor() after setting State to MODE_NORMAL so the cursor is adjusted to the last character. Also fix the cmdwin prefix character (e.g. ':') being drawn on wrapped continuation rows. Draw an empty space instead so that the text alignment is preserved. closes: vim/vim#19964 https://github.com/vim/vim/commit/c4fe1e958a2051d443abe072c8a5366a887da9b3 Cherry-pick Test_wildmenu_pum() changes from patch 9.1.1995. Co-authored-by: Hirohito Higashi <h.east.727@gmail.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15refactor: move e_invalwindow to errors.h (#39067)glepnir4
Problem: e_invalwindow was a static local, inconsistent with other error strings. Solution: Convert it to EXTERN/INIT style and move it to errors.h.
2026-04-14vim-patch:partial:9.2.0348: potential buffer underrun when setting ↵zeertzjq1
statusline like option (#39063) Problem: potential buffer underrun when settings statusline like option (q1uf3ng) Solution: Validate that p > out before accessing p[-1] closes: vim/vim#19961 https://github.com/vim/vim/commit/91b402f57575ed33649285043a3c631701165f4a Co-authored-by: Christian Brabandt <cb@256bit.org>
2026-04-14vim-patch:9.2.0345: Wrong autoformatting with 'autocomplete' (#39060)zeertzjq1
Problem: Wrong autoformatting with 'autocomplete'. Solution: Don't trigger autoformatting when ending autocompletion without selecting an item (zeertzjq). fixes: vim/vim#19954 closes: vim/vim#19970 https://github.com/vim/vim/commit/efbd482116d0f1a244b436a46ce3544b016de04b
2026-04-14fix(gf): handle local `file:` URI paths #38915Barrett Ruth1
Problem: `gf` and `<cfile>` treat `file:/absolute/path` as a literal path and open `file:/...` instead of the local file. Solution: Strip the local `file:` prefix before path resolution in the hyperlink path code.
2026-04-14feat(api): use zindex to determine dimmed cursor shape #39054luukvbaal2
Problem: The cursor shape is changed to indicate when it is behind an unfocused floating window (since a2b92a5e). This behavior cannot be controlled by a floating window that doesn't want to dim the cursor. Solution: Assign a zindex-offset of 50 to the zindex of the current window. To not dim the cursor when creating a floating window on top of the current window one can assign the zindex accordingly.
2026-04-14build(clang-analyzer): UB pointer subtractionJustin M. Keyes2
Problem: clang-analyzer-security.PointerSub reports "Subtraction of two pointers that do not point into the same array is undefined behavior" in the HIKEY2SFT macro. Computing the offset of a flexible array member by subtracting pointers from a dummy static object, is technically UB. Solution: Use standard `offsetof()` instead. Co-Authored-By: Claude
2026-04-14build(clang-analyzer): suppress clang-analyzer-core.FixedAddressDereferenceJustin M. Keyes1
Problem: clang 21 added core.FixedAddressDereference, which reports "dereference of a fixed address (loaded from variable 'r')" in regexp.c after xmalloc(). The analyzer doesn't model xmalloc as always returning a valid heap pointer (it aborts on failure), so it constructs impossible paths. Solution: Suppress globally in the clang-analyzer cmake target. Co-Authored-By: Claude
2026-04-14build(clang-analyzer): suppress clang-analyzer-security.ArrayBoundJustin M. Keyes2
Problem: clang 21 promoted alpha.security.ArrayBoundV2 to security.ArrayBound (stable). This new check reports false-positive "out of bound access" errors in drawline.c and vimscript.c, where the analyzer constructs impossible paths (e.g. concealed line with draw_text=false yet ptr advanced past the NUL terminator, or root AST node with a "next" sibling). Per-line NOLINT suppression doesn't work because the analyzer finds multiple paths to the same false positive. Solution: Disable clang-analyzer-security.ArrayBound globally in the clang-analyzer cmake target until the check matures. Co-Authored-By: Claude
2026-04-14build: update clang v21, fix warningsdundargoc53
- `src/nvim/ex_cmds_defs.h`: use "U" instead of "u" per `readability-uppercase-literal-suffix`
2026-04-14fix(cmdline): avoid Ex-mode NULL cmdline_block event #39043luukvbaal1
Problem: Attempting to emit cmdline_block event with NULL cmdbuff after <C-\><C-N> in Ex-mode. Solution: Don't emit cmdline_block event when cmdbuff is NULL.
2026-04-14docs: lsp, options, api #38980Justin M. Keyes2
docs: lsp, options - revert bogus change to `_meta/builtin_types.lua` from 3a4a66017b74 Close #38991 Co-authored-by: David Mejorado <david.mejorado@gmail.com>
2026-04-14fix(lua): not obvious which _meta/ files are generated #39035Justin M. Keyes1
Problem: - Not obvious which _meta/ are generated and which should be edited manually. - The require guard (`error('Cannot require a meta file')`) is not consistently present in all meta files. Solution: - Update headers. - Add require() guard to all meta files. - Rename generated meta files with `.gen.lua`.
2026-04-14refactor(options): generate "modeline disallowed" doc text #39019Justin M. Keyes5
Problem: - Lots of redundant text in options docs for "not allowed in a modeline", even though we already have a flag that indicates that. - `deny_in_modelines` is an old vestigial flag only used by 'encoding' (which never changes). Solution: - Generate docs based on the `secure` flag. - Remove the `deny_in_modelines` flag (`kOptFlagNoML`).
2026-04-14fix(completion): preselect ignores completeopt flag #39030glepnir1
Problem: compl_preselect_match is set even when completeopt doesn't include preselect. Solution: Check kOptCotFlagPreselect in ins_compl_add before setting compl_preselect_match.
2026-04-13fix(terminal): do not reflow altscreen on resize #38812phanium1
Problem: reflow can break tui display Solution: disable reflow on altscreen
2026-04-13feat(api): rename buffer to buf in retval #38900Justin M. Keyes5
In 3a4a66017b74192caaf9af9af172bdc08e0c1608, 4d3a67cd620152d11ab9b5f5bdd973f84cc2d44b we renamed "buffer" to "buf" in dict parameters. This commit also renames such keys in dict return-values.
2026-04-13feat(completion): completeopt=preselect, LSP CompletionItem.preselect #36613glepnir2
Problem: LSP CompletionItem.preselect is not supported. https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#completionClientCapabilities Solution: - Add "preselect" field to complete-items and "preselect" flag to 'completeopt'. - Set preselectSupport=true in LSP client capabilities.
2026-04-13vim-patch:9.2.0339: regexp: nfa_regmatch() allocates and frees too often ↵zeertzjq1
(#38996) Problem: nfa_regmatch() allocates and frees two list buffers on every call, causing unnecessary memory allocation overhead for frequently used patterns. Solution: Cache the list buffers in the regprog struct and reuse them on subsequent top-level calls. Recursive calls still allocate their own buffers. Free cached buffers in nfa_regfree() (Yasuhiro Matsumoto). Benchmark: 10K lines, `:%s` x50 iterations | Pattern | Before | After | Improvement | |---|---|---|---| | `\<\(\w\+\%(ing\|tion\|ed\|ly\)\|\w\{3,}\)\>` (many matches) | 4.384s | 4.299s | -2% | | `\(foo\|bar\|baz\)\{3,}\(qux\|quux\|corge\)\{2,}...` (no match, high nstate) | 16.927s | 3.015s | -82% | closes: vim/vim#19956 https://github.com/vim/vim/commit/105d65e29b636981b2a92cd0205b19f85951d770 Co-authored-by: Yasuhiro Matsumoto <mattn.jp@gmail.com>
2026-04-12fix(pum): info float width grows on reselect with 'linebreak' #38680glepnir1
Problem: win_linetabsize() includes wrap overhead from 'linebreak' based on current window width, but the result sizes the window, causing a feedback loop. Solution: Temporarily set w_view_width to Columns before measuring.
2026-04-12feat(api): nvim_set_hl can set "font" #37668glepnir5
Problem: Cannot set highlight group fonts via API, only via :highlight command. Solution: Add font parameter in nvim_set_hl().
2026-04-12fix(tui): use erase_chars for short clears #38973Barrett Ruth1
Problem: Due to optimizations c936ae0f3688, nvim prints literal spaces instead of using `erase_chars` in widths <= 5 even if the terminal advertises `erase_chars` support (perhaps a small-output size heuristic). However, this is not semantically neutral: in some terminals, erased cells and printed spaces are copied differently. I ended up with two useful groups of results. First, I tested raw terminal behavior without nvim involved: | Terminal | Raw plain text | Raw `erase_chars` | Raw literal spaces | | --- | --- | --- | --- | | xterm | clean | trailing spaces copied | trailing spaces copied | | xfce4-terminal | clean | clean | trailing spaces copied | Second, I tested nvim itself: | Terminal | no patch | with this patch | | --- | --- | --- | | xfce4-terminal | trailing spaces reproduced | clean | | xterm | trailing spaces reproduced | trailing spaces reproduced | | Alacritty | clean | clean | | Ghostty | clean | clean | | WezTerm | clean | clean | Nvim often prints spaces instead of sending `erase_chars`, which this patch changes for short clears when the terminal advertises it. This fixes xfce4-terminal because raw `erase_chars` are already cleaned up by the terminal, while spaces aren't. ***Notably, xterm is different***: even when `erase_chars` is sent directly (NO NVIM INVOLVED) xterm *still* copies those cleared blank trailing cells (and this is documented). So for xterm, which is the only remaining problematic fix, I'm quite sure there's nothing we ought to do on the Nvim side. Solution: Drop the `width >= 5` condition.
2026-04-12Merge #38882 docsJustin M. Keyes4
2026-04-12fix(normal): pass count to 'keywordprg' as arg1 #38965Barrett Ruth2
Problem: If `'keywordprg'` begins with `:`, `3K` turns the count into an Ex range. Commands that don't support that then fail. Vim passes the count as the first arg (see #19436, vim/vim#10745). Solution: Pass `[count]` as the first arg for `'keywordprg'`.