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:
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