neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 64057d266c29edb516d2c7dc2e080a59b7063b14
parent 8133760c989e3da797fccb802efe0ee431219ff3
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Tue, 20 Jan 2026 07:36:57 +0800

vim-patch:9.1.2098: Crash with 'wildmenu' when typing Ctrl-Y after Ctrl-A (#37466)

Problem:  Crash with 'wildmenu' when typing Ctrl-Y after Ctrl-A
          (after 9.1.1714) (fizz-is-on-the-way).
Solution: Check if there are matches before applying one (zeertzjq).

closes: vim/vim#19210

https://github.com/vim/vim/commit/311b98d94256038fd2a5a823edcb6ab50d2fc8e8
Diffstat:
Msrc/nvim/ex_getln.c | 3++-
Mtest/old/testdir/test_cmdline.vim | 10++++++++++
2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c @@ -1387,7 +1387,8 @@ static int command_line_execute(VimState *state, int key) int wild_type = 0; const bool key_is_wc = (s->c == p_wc && KeyTyped) || s->c == p_wcm; - if ((cmdline_pum_active() || wild_menu_showing || s->did_wild_list) && !key_is_wc) { + if ((cmdline_pum_active() || wild_menu_showing || s->did_wild_list) + && !key_is_wc && s->xpc.xp_numfiles > 0) { // Ctrl-Y: Accept the current selection and close the popup menu. // Ctrl-E: cancel the cmdline popup menu and return the original text. if (s->c == Ctrl_E || s->c == Ctrl_Y) { diff --git a/test/old/testdir/test_cmdline.vim b/test/old/testdir/test_cmdline.vim @@ -166,6 +166,16 @@ func Test_complete_wildmenu() call feedkeys(":sign un zz\<Left>\<Left>\<Left>\<Tab>\<Tab>\<C-Y> yy\<C-B>\"\<CR>", 'tx') call assert_equal('"sign unplace yy zz', @:) + " This used to crash + call feedkeys(":sign un\<Tab>\<S-Tab>\<C-A>\<C-Y>\<C-B>\"\<CR>", 'tx') + " Ctrl-Y is inserted literally like before 9.1.1714 + call assert_equal("\"sign undefine unplace\<C-Y>", @:) + " Also test Ctrl-Y after Ctrl-A with selected item (the result is the same) + call feedkeys(":sign un\<Tab>\<C-A>\<C-Y>\<C-B>\"\<CR>", 'tx') + call assert_equal("\"sign undefine unplace\<C-Y>", @:) + call feedkeys(":sign un\<Tab>\<Tab>\<C-A>\<C-Y>\<C-B>\"\<CR>", 'tx') + call assert_equal("\"sign undefine unplace\<C-Y>", @:) + " cleanup %bwipe set nowildmenu