From 64057d266c29edb516d2c7dc2e080a59b7063b14 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Tue, 20 Jan 2026 07:36:57 +0800 Subject: [PATCH] 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 --- src/nvim/ex_getln.c | 3 ++- test/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 index 469b7f0d06..bfe01c1cf9 100644 --- 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 index ad164ce212..08d3ee774b 100644 --- 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\\\\\\ yy\\"\", 'tx') call assert_equal('"sign unplace yy zz', @:) + " This used to crash + call feedkeys(":sign un\\\\\\"\", 'tx') + " Ctrl-Y is inserted literally like before 9.1.1714 + call assert_equal("\"sign undefine unplace\", @:) + " Also test Ctrl-Y after Ctrl-A with selected item (the result is the same) + call feedkeys(":sign un\\\\\"\", 'tx') + call assert_equal("\"sign undefine unplace\", @:) + call feedkeys(":sign un\\\\\\"\", 'tx') + call assert_equal("\"sign undefine unplace\", @:) + " cleanup %bwipe set nowildmenu