Commit Graph

36028 Commits

Author SHA1 Message Date
neovim-backports[bot]
abcc5342ee fix(terminal): do not reflow altscreen on resize #39024
Problem: reflow can break tui display
Solution: disable reflow on altscreen
(cherry picked from commit 7bb8231577)

Co-authored-by: phanium <91544758+phanen@users.noreply.github.com>
2026-04-13 18:31:24 -04:00
zeertzjq
aac55faa2c test(terminal/channel_spec): wait some time for shell to start (#38995)
Problem:
The retry on Windows doesn't seem to actually work, as the test still
occasionally fails on Windows. Meanwhile the test can fail on Linux as
well:

FAILED   test/functional/terminal/channel_spec.lua @ 123: chansend sends lines to terminal channel in proper order
test/functional/terminal/channel_spec.lua:131: retry() attempts: 1
test/functional/terminal/channel_spec.lua:134: Failed to match any screen lines.
Expected (anywhere): "echo "hello".*echo "world""
Actual:
  |^ech$ o "hello"                                                                                      |
  |echo "world"                                                                                        |
  |hello                                                                                               |
  |$ world                                                                                             |
  |$                                                                                                   |
  |                                                                                                    |
  |                                                                                                    |
  |                                                                                                    |
  |                                                                                                    |
  |                                                                                                    |
  |                                                                                                    |
  |                                                                                                    |
  |                                                                                                    |
  |                                                                                                    |
  |                                                                                                    |
  |                                                                                                    |
  |                                                                                                    |
  |                                                                                                    |
  |term://~/work/neovim/neovim/build/Xtest_xdg_terminal//32516:sh [-]                                  |
  |                                                                                                    |

Solution:
Use a wait before the chansend() instead.

(cherry picked from commit b081cc3aeb)
2026-04-12 23:29:14 +00:00
Justin M. Keyes
5920a1d07f revert: "fix(lsp): only resolve LSP configs once" #38990
revert eb90f5d9e3

(cherry picked from commit 4eb95c8ed2)
2026-04-12 22:09:15 +00:00
Lars Debor
6250019537 fix(lsp): show_document can't position cursor past EOL in insert-mode #38566
Problem: vim.lsp.util.show_document insert mode is unable
to set the cursor after the target character position if the target character
is at end of line.

Solution: Move cursor after the target character (in append position)
in this case.

(cherry picked from commit 891bb0e6ce)
2026-04-12 16:40:51 +00:00
glepnir
38be4475c6 fix(pum): info float width grows on reselect with 'linebreak' #38680
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.
(cherry picked from commit fcdb148437)
2026-04-12 16:33:50 +00:00
Emilv2
fe09c71c34 fix(lsp): send didOpen on save to all clients+groups #37454
Problem: _get_and_set_name edits the name for the whole group,
thus only one client per group gets the didOpen message.

Solution: move the logic to _changetracking and loop over every
client per group.

(cherry picked from commit 37eb1b9979)
2026-04-12 15:20:42 +00:00
Justin M. Keyes
3d1c0c9902 Merge pull request #38981 from justinmk/release
backport: docs
2026-04-12 11:18:39 -04:00
Justin M. Keyes
b28f00bf9c docs: misc 2026-04-12 15:56:12 +02:00
Justin M. Keyes
5dbc956803 docs: vim.pos 2026-04-12 15:54:27 +02:00
glepnir
4053141cb3 fix(api): nvim_get_hl drops groups defined with link_global #38492
Problem: hlgroup2dict passes &ns_id to ns_get_hl twice. The first call
(link=true) sets *ns_hl = 0 when link_global is set, so the second call
and the sg_cleared guard both see ns_id == 0 and bail out. The group is
silently dropped from the result.

Solution: use a temporary copy of ns_id for each ns_get_hl call so the
original value is preserved.

(cherry picked from commit 49086862fc)
2026-04-12 13:50:40 +00:00
Barrett Ruth
452a9b895c fix(normal): pass count to 'keywordprg' as arg1 #38965
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'`.

(cherry picked from commit 6e95d1ad13)
2026-04-12 13:12:00 +00:00
skewb1k
df3d7e36d0 fix(pack): make 'stash' call compatible with older Git #38679
Problem:
On Git versions 2.13..2.26 there is a bug that prevents using
`stash --message`.

Solution:
Use the full `stash push --message` form to avoid that bug.

(cherry picked from commit 38aec2d3cd)
2026-04-11 22:45:34 +00:00
Justin M. Keyes
6b86f5520d feat(connect): filepath completion #38959
This is a stop-gap; the next step is for :connect to show a menu of
known peers (and perhaps also any files in CWD that look like sockets).

(cherry picked from commit 6f015cdcdf)
2026-04-11 16:10:36 +00:00
glepnir
18b1ff81a3 fix(lsp): check stale context in hover/signature callback #38724
Problem: hover/signature callback lacked consistency checks, so slow LSP servers
could open a float after the cursor had already moved away.

Solution: guard the callback with buf validity, buf version, and cursor
position checks before opening the float. Also fix table capacity calculation.

(cherry picked from commit af9a72d8c1)
2026-04-11 15:38:28 +00:00
glepnir
36bade7efb fix(highlight): preserve inherited colors when update=true breaks links #38750
Problem: Breaking a link with update=true loses colors inherited from
the linked group.

Solution: Copy color indices from the linked group so inherited colors
remain visible in :hi output.

(cherry picked from commit 01567ad4f6)
2026-04-11 15:36:14 +00:00
zeertzjq
e203257fff vim-patch:9.2.0331: spellfile: stack buffer overflows in spell file generation (#38948)
Problem:  spell_read_aff() uses sprintf() into a fixed-size stack buffer
          without bounds checking. store_aff_word() uses STRCAT() to
          append attacker-controlled strings into newword[MAXWLEN] without
          checking remaining space. Both are reachable via :mkspell with
          crafted .aff/.dic files (xinyi234)
Solution: Replace sprintf() with vim_snprintf() in spell_read_aff().
          Replace STRCAT() with STRNCAT() with explicit remaining-space
          calculation in store_aff_word().

closes: vim/vim#19944

07faa961a0

Co-authored-by: Christian Brabandt <cb@256bit.org>
(cherry picked from commit 4f7b6083e5)
2026-04-11 00:01:47 +00:00
Evgeni Chasnovski
1a5d41a48f fix(pack): more advice for out-of-sync lockfile #38931
Problem: If the lockfile points to the revision that is not on disk, the
  `:checkhealth vim.pack` suggests to run `vim.pack.update()`. Although
  usually it should resolve the problem, it is not always the case: like
  if the state on disk is already the latest available.

Solution: Add an extra suggestion with a more drastic measure by
  manually removing `rev` field from the lockfile for it to be repaired
  after the `:restart`.
(cherry picked from commit 94c0e54e5b)
2026-04-10 16:26:27 +00:00
Luis Calle
a15e27fbcf fix(vim.pos): Range:intersect() drops buf #38898
new() only supports nargs=5 or nargs=2, but this was passing 4 args.

(cherry picked from commit 24811c0a14)
2026-04-09 15:55:36 +00:00
zeertzjq
1b36b75832 fix(messages): truncate warning messages only in display (#38901)
For now, add a private "_truncate" flag to nvim_echo, using a truncation
method similar to showmode().

(cherry picked from commit 9c5fba5df0)
2026-04-09 04:31:49 +00:00
Justin M. Keyes
ed47b27ad4 backport: feat(api): rename buffer to buf (#38899)
feat(api): rename buffer to buf

Problem:
`:help dev-name-common` states that "buf" should be used instead of
"buffer" but there are cases where buffer is mentioned in the lua API.

Solution:
- Rename occurrences of "buffer" to "buf" for consistency with the
  documentation.
- Support (but deprecate) "buffer" for backwards compatibility.

Co-authored-by: Jordan <46637683+JordanllHarper@users.noreply.github.com>
2026-04-09 01:23:13 +00:00
Sean Dewar
8669e34bba fix(api): nvim_clear_autocmds() "event" type check
Problem: nvim_clear_autocmds() does not type check "event" correctly.

Solution: fix it.
2026-04-08 23:19:13 +01:00
Sean Dewar
b28e5e4898 docs(api): nvim_exec_autocmds() default "pattern"
Problem: nvim_exec_autocmds() documentation incorrectly describes the default
for "pattern" as *, when it's actually the current file name (like :doautocmd).

Solution: correct it. Add a test.
2026-04-08 23:19:13 +01:00
Justin M. Keyes
cc0a4a653c Merge pull request #38894 backports 2026-04-08 18:12:01 -04:00
glepnir
7ffee0dfbf fix(lsp): apply_text_edits causes unwanted BufDelete events #38778
Problem:
Since 2f6d1d3c88, `apply_text_edits`
unconditionally sets `buflisted=true`, causing spurious BufDelete events
if plugins restore the original 'buflisted' state on unlisted buffers:
65ef6cec1c/src/nvim/option.c (L2159-L2169)

Solution:
- Don't set 'buflisted' in `apply_text_edits`. Set it more narrowly, in
  `apply_workspace_edit` where the semantics requires affected buffers
  to be visible to the user.
- Also skip setting 'buflisted' if it would not be changed, to avoid
  redundant `OptionSet` events.

(cherry picked from commit 6473d007e7)
2026-04-08 21:58:27 +00:00
Justin M. Keyes
47e3efed99 refactor(filetype): move _get_known_filetypes, return a Set #38886
- `_get_known_filetypes` may be useful for other internal code, so move
  it to an internal function.
- Use a set instead of a list, for performance.
2026-04-08 23:26:07 +02:00
ngicks
78234f2d54 feat(vim.version): add __eq to vim.VersionRange #38881
Problem: vim.VersionRange had no __eq metamethod, so comparing 2 distinct
but same value instances always returned false. In vim.pack.add this caused
redundant lockfile rewrites, even when the resulting lockfile content was
unchanged.

Solution: Add __eq metamethod on vim.VersionRange
2026-04-08 23:26:03 +02:00
neovim-backports[bot]
df726644b8 fix(lsp): check filetype registry in health (#38885)
fix(health): misleading warnings re filetypes registered w/ vim.filetype.add() #38867

Problem:
`:checkhealth vim.lsp` validates configured filetypes against
`getcompletion('', 'filetype')`. This only reflects runtime support
files.

This causes false warnings in `:checkhealth vim.lsp` for configured
filetypes that are known to the Lua filetype registry, including
values added with `vim.filetype.add()` and built-in registry-only
filetypes.

Solution:
Build the healthcheck's known-filetype set from both
`getcompletion('', 'filetype')` and `vim.filetype.inspect()`.

(cherry picked from commit 20a3254ad4)

Co-authored-by: Barrett Ruth <62671086+barrettruth@users.noreply.github.com>
2026-04-08 17:24:15 -04:00
Maria Solano
c76bbd0a54 fix(diagnostics)!: restore is_pull namespace argument #38698
Problem:
The current LSP diagnostic implementation can't differ between a pull
diagnostic with no identifier and a set of diagnostics provided via push
diagnostics.

"Anonymous pull providers" are expected by the protocol https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#diagnosticOptions
, depending on how the capability was registered:
- Dynamic registrations have an identifier.
- Static registrations will not.

Solution:
Restore the `is_pull` argument removed in
https://github.com/neovim/neovim/pull/37938, keeping the identifier of
pull diagnostic collections.

(cherry picked from commit 665ebce569)
2026-04-08 20:46:16 +00:00
luukvbaal
5ac95da8ea fix(statusline): no window-local highlights for last line 'ruler' #38879
Problem:  When the 'ruler' is in the last line of the screen, it takes
          local highlight definitions of the current window, tripping an
          assert (since c1648cf8).
Solution: Don't use window-local highlight definitions when the ruler is
          not part of a statusline.

Co-authored-by: glepnir <glephunter@gmail.com>
(cherry picked from commit b35a2e58e9)
2026-04-08 16:39:56 +00:00
Luis Calle
f529bc74f9 docs: vim.range, vim.pos #38869
Problem:
`vim.Range` and `vim.Pos` have signature mismatches on the docs of some functions.

Solution:
Split the "module" functions from the "class" functions (just like it's done in other modules like `vim.version`) and regenerate the docs.

(cherry picked from commit c530fd8e75)
2026-04-08 16:19:48 +00:00
Dan Drennan
11a4a0077c fix(health): recognize Zig build optimization levels #38804
Problem: When Neovim is built with Zig, `:checkhealth` falsely reports
"Non-optimized debug build" for release builds. The extraction regex
stops at the first space, and the validation regex only lists CMake
build type names.

Solution: Fix the extraction regex to capture the full build type string
and add Zig optimization levels (ReleaseFast, ReleaseSafe, ReleaseSmall)
to the validation regex.

AI-assisted: Claude Code
(cherry picked from commit 65ef6cec1c)
2026-04-08 12:43:27 +00:00
glepnir
ca0e3818c0 fix(pum): crash with 'pumborder' and wide item (#38852)
Problem: pum_col goes negative when item width + border exceeds screen.

Solution: account for border_width in pum_compute_horizontal_placement()
instead of adjusting pum_col after the fact

(cherry picked from commit 8603fc9180)
2026-04-08 01:49:56 +00:00
zeertzjq
eee2d10fd2 fix(rpc): trigger UILeave earlier on channel close (#38846)
Problem:
On exit, rpc_free() is called when processing main_loop.events after
libuv calls close callbacks of the channel's stream. However, when there
are no child processes, these libuv callbacks are called in loop_close()
instead of proc_teardown(), and main_loop.events isn't processed after
loop_close(). As a result, calling remote_ui_disconnect() in rpc_free()
causes UILeave to depend on the presence of child processes.

Solution:
Always call remote_ui_disconnect() in rpc_close_event(), and remove the
call in rpc_free().

(cherry picked from commit 5d66ef188f)
2026-04-07 21:55:09 +00:00
luukvbaal
a358b9be64 fix(message): flush messages before "empty" msg_show #38854
Problem:  When emitting a msg_show event with the "empty" kind,
          there may still be messages waiting to be emitted, which
          are then dropped as a result of recursion protection.
Solution: Flush messages before emitting "empty" message show.
(cherry picked from commit 7fff91359e)
2026-04-07 17:54:09 +00:00
Tomas Slusny
6cb5012e36 fix(difftool): ensure standardized locale for diff output parsing #38853
Always pass LC_ALL=C to diff when parsing its output.

Closes #38838

Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
(cherry picked from commit 382a1c40c2)
2026-04-07 17:37:52 +00:00
zeertzjq
a7214c0719 fix: don't make path empty when truncating trailing slashes (#38844)
Fixes the following Coverity warning:

*** CID 549779:         Integer handling issues  (INTEGER_OVERFLOW)
/src/nvim/undo.c: 717             in u_get_undo_file_name()
711           dir_name[dir_len] = NUL;
712
713           // Remove trailing pathseps from directory name
714           char *p = &dir_name[dir_len - 1];
715           while (vim_ispathsep(*p)) {
716             *p-- = NUL;
>>>     CID 549779:         Integer handling issues  (INTEGER_OVERFLOW)
>>>     Expression "dir_len--", where "dir_len" is known to be equal to 0, underflows the type of "dir_len--", which is type "size_t".
717             dir_len--;
718           }
719
720           bool has_directory = os_isdir(dir_name);
721           if (!has_directory && *dirp == NUL && !reading) {
722             // Last directory in the list does not exist, create it.

(cherry picked from commit 6b0367481c)
2026-04-07 02:29:33 +00:00
Sanzhar Kuandyk
319c031820 fix(channel): fix Ctrl-C handling regression in terminal
Problem: Normal Windows builtin-TUI startup spawns the embedded server as DETACHED_PROCESS, which breaks Ctrl-C delivery to :terminal jobs.
Solution: Restores the default behavior once the embedded server has a
console so terminal jobs inherit it.

(cherry picked from commit 8bb7533639)
2026-04-07 01:14:46 +00:00
Sanzhar Kuandyk
608d0e01ba refactor(channel): defer hidden console allocation to :detach
Refactor #37977: instead of allocating a hidden console at startup, borrow the parent's console via AttachConsole() and only create an isolated hidden console when :detach is called, with fd 0/1/2 re-bound to the new CONIN$/CONOUT$.

(cherry picked from commit 789741bb83)
2026-04-07 01:14:46 +00:00
glepnir
25170ca02d fix(diagnostic): virtual_lines should anchor at end_lnum, not lnum #38701
Problem: Multi-line diagnostics always render virtual lines below lnum.

Solution: Use end_lnum when placing the virt_lines extmark.
(cherry picked from commit af707dd242)
2026-04-06 18:05:35 +00:00
luukvbaal
c6c348471d fix(cmdline): 'inccommand' preview after setcmdline() #38795
Problem:  'inccommand' preview is not executed after setcmdline(),
          and as a result cmdline_show event is emitted when redrawing
          is not allowed (5b6477be).
Solution: Call command_line_changed() when ccline.cmdbuff_replaced is
          set (by setcmdline()).
(cherry picked from commit 1354787029)
2026-04-06 17:58:41 +00:00
Justin M. Keyes
69baf0059c Merge #38833 2026-04-06 13:12:25 -04:00
Christian Clason
ceaa8b648a feat(filetype): vim.filetype.inspect() returns copy of registry
Problem: No way of inspecting the (user-added) filetype detection rules.

Solution: Add `vim.filetype.inspect()` returning copies of the internal
`extension`, `filename`, `pattern` tables. Due to the dynamic nature of
filetype detection, this will in general not allow getting the list of
known filetypes, but at least one can see if a given extension is known.
2026-04-06 18:53:36 +02:00
Josh Triplett
c294bc397b fix(tui): check background color on resume
Problem:
We normally get the background color via continuous reporting. However,
if we were backgrounded while the light/dark mode changed, we won't have
received the report, and we'll have the wrong background color.

Without this change, if you background nvim, toggle the light/dark mode,
resume, and check `:set bg`, it will not match the current state.

Solution:
Query it on resume as well. (This requires separating the query from the
flush, to just do the query along with all the others, while waiting to
flush until we've set up uv.)

With this change, if you background nvim, toggle the light/dark mode,
resume, and check `:set bg`, it will have updated.
2026-04-06 18:47:03 +02:00
Luis Calle
0a3add979a feat(vim.pos)!: require buf param on vim.pos, vim.range #38665
Problem: `buf` is optional even though its needed to perform conversions
and the ordering of `(buf, row, col)` is not consistent.

Solution: make `buf` mandatory on `vim.range` and `vim.pos` and enforce
the `buf, row, col` ordering

(cherry picked from commit 01be30f638)
2026-04-06 16:19:43 +00:00
Justin M. Keyes
a5f1b373fa build: version bump 2026-04-06 15:21:14 +02:00
Justin M. Keyes
7ac5a26d56 NVIM v0.12.1
Following is a list of commits (fixes/features only) in this release.
See `:help news` in Nvim for release notes.

FEATURES
--------------------------------------------------------------------------------
- 8a79d3a3bb :restart: reattach all UIs (#38683)

FIXES
--------------------------------------------------------------------------------
- 415626d46d :restart: inherit stderr fd on Unix (#38755)
- 8b3f3113c4 :restart: only pass --headless when there is no UI (#38580)
- e5792f6353 api: avoid error when parsing invalid expr after :echo (#38695)
- 6ef5f59be6 channel: crash on exit after closing v:stderr channel (#38754)
- 14ee84e7a5 cmdline: redraw cmdline after empty message (#38485)
- b2702913b9 defaults: check for TUI on non-stdio channel on startup (#38581)
- c3e52bb264 events: avoid recursive loop_uv_run() from vim.ui_attach() shell message
- 4bf170d79d help: show error when using :help! with nothing at cursor #38775
- c692e848e9 lsp: do not respond to codelens refresh if a request is already scheduled (#38801)
- 2eb14c54bc lsp: highlight snippet preview when server can't completionItem/resolve (#38534)
- f2764a596d lsp: reset document color processed version on clear (#38582)
- 8f7cbf6d66 lsp: use `winresetview()` to avoid switching to normal mode (#38641)
- 6cb439ac9e net: handle remote archive URLs via tar/zip browse #38744
- 35a9bf8785 pack: avoid eager vim.version call #38705
- fdf94493cf pack: use `uv.available_parallelism()` to compute number of threads #38717
- 60a24d707c termkey: use terminfo for (shift+)left/right keys
- 9f16ad8ca3 treesitter: select reset to "v" visualmode()
- 2d9619fac7 treesitter: select with node ending with unicode char (#38557)
- d83141c0f2 ui2: allow empty argument for enable() #38605
- b924afb36b ui2: correct buffer reference in msg:start_timer() (#38600)
- 131a3cacb3 ui2: prevent flicker when entering pager from expanded cmdline (#38662)
- bac7c3a996 ui2: update spill indicator when appending to expanded cmdline #38715
- dee6d2ad97 ui2: vim.on_key should return nil instead of false (#38668)
- e7a07364ad vim.net: check if vim.system's stdout is nil #38713
- 32ca1aae88 window: clear cmdline 'ruler' when window is closed (#38631)
- d660233edf windows: force console codepage to UTF-8 for shell/system() #38742

PERFORMANCE
--------------------------------------------------------------------------------
- 3de423eb20 vim.pos: use `nvim_buf_line_count` instead of fetching all lines #38686

BUILD
--------------------------------------------------------------------------------
- 38b5cfc74a cmake: allow ignoring deps sha

VIM PATCHES
--------------------------------------------------------------------------------
- 90b4f02b44 068c060: runtime(rustfmt): not correctly escaping directory names (#38597)
- 304c0ac9f9 12f6f20: runtime(sh): Keep function name patterns engine neutral (#38719)
- 10bd554c0f 82ebaa7: runtime(racket): Make visual K mapping more robust for shell injection (#38677)
- c084ab9f57 9.2.0276: [security]: modeline security bypass (#38657)
- 04fabbf32d 9.2.0277: tests: test_modeline.vim fails (#38672)
- 3e2ce64f88 9.2.0280: [security]: path traversal issue in zip.vim (#38693)
- 58cc2fdc5f 9.2.0285: :syn sync grouphere may go beyond end of line (#38727)
- bf084967d7 9.2.0299: runtime(zip): may write using absolute paths (#38810)
- a837c906bb 9.2.0303: tests: zip plugin tests don't check for warning message properly
- c09e82d12a 9.2.0304: tests: test for 9.2.0285 doesn't always fail without the fix
- dd85c13382 runtime file updates (#38659)

REFACTOR
--------------------------------------------------------------------------------
- 49133b4f77 typval.c: fix wrong argument to macro (#38813)

REVERTED CHANGES
--------------------------------------------------------------------------------
- 8e490e70ed "fix(scripts): gen_terminfo clears Windows terminfo definitions #36736"
- ad0adbb1b2 "refactor(process): don't read from PTY master using uv_pipe_t" (#37401)
v0.12.1
2026-04-06 15:12:48 +02:00
Luuk van Baal
c3e52bb264 fix(events): avoid recursive loop_uv_run() from vim.ui_attach() shell message
Problem:  vim.ui_attach() msg_show callback runs the risk of a recursive
          loop_uv_run() when trying to display a message from a shell
          command stream.
Solution: Schedule the message callback on the fast_events queue.
(cherry picked from commit fa302037f9)
2026-04-06 09:57:59 +00:00
zeertzjq
c09e82d12a vim-patch:9.2.0304: tests: test for 9.2.0285 doesn't always fail without the fix
Problem:  When the terminal is very large, test for 9.2.0285 doesn't
          trigger an ASAN error without the fix.
Solution: Use a window with fixed height (zeertzjq)

closes: vim/vim#19924

b03970f41f
(cherry picked from commit f8695fc529)
2026-04-06 09:28:32 +00:00
zeertzjq
a837c906bb vim-patch:9.2.0303: tests: zip plugin tests don't check for warning message properly
Problem:  zip plugin tests may match messages from previous test cases
          when checking for warning message.
Solution: Clear messages at the start of these tests (zeertzjq).

closes: vim/vim#19926

a1f4259e68
(cherry picked from commit c2d7f6b642)
2026-04-06 09:28:32 +00:00
nameearly
49133b4f77 refactor(typval.c): fix wrong argument to macro (#38813)
(cherry picked from commit eb9be11da8)
2026-04-06 04:32:05 +00:00