From 8fec92d631cf9d852ad794863721c2710ee2ff9e Mon Sep 17 00:00:00 2001 From: Girish Palya Date: Sat, 6 Sep 2025 19:39:32 +0200 Subject: [PATCH] patch 9.1.1737: Patch v9.1.1714 introduce a regression for wildmenu Problem: Patch v9.1.1714 introduce a regression for wildmenu (zeertzjq) Solution: Restore behavior of "longest" in 'wildmode' (Girish Palya) - Fixed a regression caused by PR #18125 selecting wrong item - Fixed another regression where the first pasted text did not appear on the command-line after starting Vim. closes: #18212 Signed-off-by: Girish Palya Signed-off-by: Christian Brabandt --- src/ex_getln.c | 30 ++++++++++--- src/testdir/dumps/Test_wildmenu_pum_30.dump | 10 ++--- src/testdir/dumps/Test_wildmenu_pum_31.dump | 2 +- src/testdir/dumps/Test_wildmenu_pum_57.dump | 8 ++-- src/testdir/dumps/Test_wildmenu_pum_58.dump | 4 +- src/testdir/dumps/Test_wildmenu_pum_59.dump | 10 +++++ src/testdir/dumps/Test_wildmenu_pum_60.dump | 10 +++++ ..._pum_54.dump => Test_wildmenu_pum_61.dump} | 0 src/testdir/dumps/Test_wildmenu_pum_62.dump | 10 +++++ src/testdir/dumps/Test_wildmenu_pum_63.dump | 10 +++++ src/testdir/dumps/Test_wildmenu_pum_64.dump | 10 +++++ .../Test_wildtrigger_update_screen_3.dump | 2 +- src/testdir/test_cmdline.vim | 45 +++++++++++++------ src/version.c | 2 + 14 files changed, 119 insertions(+), 34 deletions(-) create mode 100644 src/testdir/dumps/Test_wildmenu_pum_59.dump create mode 100644 src/testdir/dumps/Test_wildmenu_pum_60.dump rename src/testdir/dumps/{Test_wildmenu_pum_54.dump => Test_wildmenu_pum_61.dump} (100%) create mode 100644 src/testdir/dumps/Test_wildmenu_pum_62.dump create mode 100644 src/testdir/dumps/Test_wildmenu_pum_63.dump create mode 100644 src/testdir/dumps/Test_wildmenu_pum_64.dump diff --git a/src/ex_getln.c b/src/ex_getln.c index 794075c57e..a7f957eab4 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -1000,7 +1000,10 @@ cmdline_wildchar_complete( // Remove popup window if no completion items are available if (redraw_if_menu_empty && xp->xp_numfiles <= 0) + { update_screen(0); + redrawcmd(); // Ensure initial pasted text appears on cmdline + } // if interrupted while completing, behave like it failed if (got_int) @@ -1016,16 +1019,29 @@ cmdline_wildchar_complete( // Display matches if (res == OK && xp->xp_numfiles > (wim_noselect ? 0 : 1)) { - // If "longest" fails to identify the longest item, try other - // 'wim' values if available - if (wim_longest && ccline.cmdpos == cmdpos_before) + if (wim_longest) { - if (wim_full) - nextwild(xp, WILD_NEXT, options, escape); + int found_longest_prefix = (ccline.cmdpos != cmdpos_before); if (wim_list || (p_wmnu && wim_full)) - (void)showmatches(xp, p_wmnu, wim_list, FALSE); + (void)showmatches(xp, p_wmnu, wim_list, TRUE); + else if (!found_longest_prefix) + { + int wim_list_next = (wim_flags[1] & WIM_LIST); + int wim_full_next = (wim_flags[1] & WIM_FULL); + int wim_noselect_next = (wim_flags[1] & WIM_NOSELECT); + if (wim_list_next || (p_wmnu && (wim_full_next + || wim_noselect_next))) + { + if (wim_noselect_next) + options |= WILD_NOSELECT; + if (wim_full_next || wim_noselect_next) + nextwild(xp, WILD_NEXT, options, escape); + (void)showmatches(xp, p_wmnu, wim_list_next, + wim_noselect_next); + } + } } - else if (!wim_longest) + else { if (wim_list || (p_wmnu && (wim_full || wim_noselect))) (void)showmatches(xp, p_wmnu, wim_list, wim_noselect); diff --git a/src/testdir/dumps/Test_wildmenu_pum_30.dump b/src/testdir/dumps/Test_wildmenu_pum_30.dump index 732e8a8ac0..76e4780ea2 100644 --- a/src/testdir/dumps/Test_wildmenu_pum_30.dump +++ b/src/testdir/dumps/Test_wildmenu_pum_30.dump @@ -1,10 +1,10 @@ -| +0&#ffffff0@74 -|~+0#4040ff13&| @73 +|~+0#4040ff13#ffffff0| @73 |~| @73 |~| @73 |~| @73 |~| @73 |~| @73 -|~| @73 -|~| @73 -|:+0#0000000&|c|n> @71 +|:+0#0000000&|c|n| @71 +|c|n|e|w|e|r| @6|c|n|f|i|l|e| @6|c|n|o|r|e|m|a|p| @40 +|c|n|e|x|t| @7|c|n|o|r|e|a|b@1|r|e|v| @1|c|n|o|r|e|m|e|n|u| @39 +|:|c|n> @71 diff --git a/src/testdir/dumps/Test_wildmenu_pum_31.dump b/src/testdir/dumps/Test_wildmenu_pum_31.dump index 76e4780ea2..157f16c89c 100644 --- a/src/testdir/dumps/Test_wildmenu_pum_31.dump +++ b/src/testdir/dumps/Test_wildmenu_pum_31.dump @@ -7,4 +7,4 @@ |:+0#0000000&|c|n| @71 |c|n|e|w|e|r| @6|c|n|f|i|l|e| @6|c|n|o|r|e|m|a|p| @40 |c|n|e|x|t| @7|c|n|o|r|e|a|b@1|r|e|v| @1|c|n|o|r|e|m|e|n|u| @39 -|:|c|n> @71 +|:|c|n|s> @70 diff --git a/src/testdir/dumps/Test_wildmenu_pum_57.dump b/src/testdir/dumps/Test_wildmenu_pum_57.dump index 73547387eb..f67557a891 100644 --- a/src/testdir/dumps/Test_wildmenu_pum_57.dump +++ b/src/testdir/dumps/Test_wildmenu_pum_57.dump @@ -1,10 +1,10 @@ -| +0&#ffffff0@74 -|~+0#4040ff13&| @73 +|~+0#4040ff13#ffffff0| @73 |~| @73 |~| @73 |~| @73 |~| @73 |~| @73 |~| @73 -|~| @73 -|:+0#0000000&|s|i|g|n| |u|n> @66 +|:+0#0000000&|s|i|g|n| |u|n| @66 +|u|n|d|e|f|i|n|e| @1|u|n|p|l|a|c|e| @57 +|:|s|i|g|n| |u|n> @66 diff --git a/src/testdir/dumps/Test_wildmenu_pum_58.dump b/src/testdir/dumps/Test_wildmenu_pum_58.dump index 4170891a48..a53c0cebb0 100644 --- a/src/testdir/dumps/Test_wildmenu_pum_58.dump +++ b/src/testdir/dumps/Test_wildmenu_pum_58.dump @@ -6,5 +6,5 @@ |~| @73 |~| @73 |~| @73 -|u+0#0000001#ffff4012|n|d|e|f|i|n|e| +3#0000000#ffffff0@1|u|n|p|l|a|c|e| @57 -|:+0&&|s|i|g|n| |u|n|d|e|f|i|n|e> @60 +|u+3#0000000&|n|d|e|f|i|n|e| @1|u|n|p|l|a|c|e| @57 +|:+0&&|s|i|g|n| |u|n> @66 diff --git a/src/testdir/dumps/Test_wildmenu_pum_59.dump b/src/testdir/dumps/Test_wildmenu_pum_59.dump new file mode 100644 index 0000000000..4170891a48 --- /dev/null +++ b/src/testdir/dumps/Test_wildmenu_pum_59.dump @@ -0,0 +1,10 @@ +| +0&#ffffff0@74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|u+0#0000001#ffff4012|n|d|e|f|i|n|e| +3#0000000#ffffff0@1|u|n|p|l|a|c|e| @57 +|:+0&&|s|i|g|n| |u|n|d|e|f|i|n|e> @60 diff --git a/src/testdir/dumps/Test_wildmenu_pum_60.dump b/src/testdir/dumps/Test_wildmenu_pum_60.dump new file mode 100644 index 0000000000..d0bd039e4d --- /dev/null +++ b/src/testdir/dumps/Test_wildmenu_pum_60.dump @@ -0,0 +1,10 @@ +| +0&#ffffff0@74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|c+3#0000000&|n|e|w|e|r| @1|c|n|e|x|t| @1|c|n|f|i|l|e| @1|c|n|o|r|e|a|b@1|r|e|v| @1|c|n|o|r|e|m|a|p| @1|c|n|o|r|e|m|e|n|u| @19 +|:+0&&|c|n> @71 diff --git a/src/testdir/dumps/Test_wildmenu_pum_54.dump b/src/testdir/dumps/Test_wildmenu_pum_61.dump similarity index 100% rename from src/testdir/dumps/Test_wildmenu_pum_54.dump rename to src/testdir/dumps/Test_wildmenu_pum_61.dump diff --git a/src/testdir/dumps/Test_wildmenu_pum_62.dump b/src/testdir/dumps/Test_wildmenu_pum_62.dump new file mode 100644 index 0000000000..73547387eb --- /dev/null +++ b/src/testdir/dumps/Test_wildmenu_pum_62.dump @@ -0,0 +1,10 @@ +| +0&#ffffff0@74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|:+0#0000000&|s|i|g|n| |u|n> @66 diff --git a/src/testdir/dumps/Test_wildmenu_pum_63.dump b/src/testdir/dumps/Test_wildmenu_pum_63.dump new file mode 100644 index 0000000000..4170891a48 --- /dev/null +++ b/src/testdir/dumps/Test_wildmenu_pum_63.dump @@ -0,0 +1,10 @@ +| +0&#ffffff0@74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|u+0#0000001#ffff4012|n|d|e|f|i|n|e| +3#0000000#ffffff0@1|u|n|p|l|a|c|e| @57 +|:+0&&|s|i|g|n| |u|n|d|e|f|i|n|e> @60 diff --git a/src/testdir/dumps/Test_wildmenu_pum_64.dump b/src/testdir/dumps/Test_wildmenu_pum_64.dump new file mode 100644 index 0000000000..d0bd039e4d --- /dev/null +++ b/src/testdir/dumps/Test_wildmenu_pum_64.dump @@ -0,0 +1,10 @@ +| +0&#ffffff0@74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|c+3#0000000&|n|e|w|e|r| @1|c|n|e|x|t| @1|c|n|f|i|l|e| @1|c|n|o|r|e|a|b@1|r|e|v| @1|c|n|o|r|e|m|a|p| @1|c|n|o|r|e|m|e|n|u| @19 +|:+0&&|c|n> @71 diff --git a/src/testdir/dumps/Test_wildtrigger_update_screen_3.dump b/src/testdir/dumps/Test_wildtrigger_update_screen_3.dump index 836ea6d15b..d936b1aa27 100644 --- a/src/testdir/dumps/Test_wildtrigger_update_screen_3.dump +++ b/src/testdir/dumps/Test_wildtrigger_update_screen_3.dump @@ -7,4 +7,4 @@ |~| @73 |~| @73 |~| @73 -|:+0#0000000&|T|e|s|t|C|m|d| |a|x> @45|0|,|0|-|1| @8|A|l@1| +|:+0#0000000&|T|e|s|t|C|m|d| |a|x> @63 diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim index 84234b803c..09dfa3e93b 100644 --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -2829,7 +2829,7 @@ func Test_wildmenu_pum() call term_sendkeys(buf, "\set wildmode=longest,list\") call term_sendkeys(buf, ":cn\") call VerifyScreenDump(buf, 'Test_wildmenu_pum_30', {}) - call term_sendkeys(buf, "\") + call term_sendkeys(buf, "s") call VerifyScreenDump(buf, 'Test_wildmenu_pum_31', {}) " Tests a directory name contained full-width characters. @@ -2931,28 +2931,45 @@ func Test_wildmenu_pum() call term_sendkeys(buf, "\:set showtabline& laststatus& lazyredraw&\") - " Verify that if "longest" finds nothing, wildmenu is still shown - call term_sendkeys(buf, ":set wildmode=longest:full,full wildoptions&\") - call term_sendkeys(buf, ":cn\") - call TermWait(buf, 50) - call VerifyScreenDump(buf, 'Test_wildmenu_pum_54', {}) - - " Verify that if "longest" finds nothing, "list" is still shown - call term_sendkeys(buf, "\:set wildmode=longest:list,full\") + " "longest:list" shows list whether it finds a candidate or not + call term_sendkeys(buf, ":set wildmode=longest:list,full wildoptions&\") call term_sendkeys(buf, ":cn\") call TermWait(buf, 50) call VerifyScreenDump(buf, 'Test_wildmenu_pum_55', {}) call term_sendkeys(buf, "\") call TermWait(buf, 50) call VerifyScreenDump(buf, 'Test_wildmenu_pum_56', {}) - - " Verify that if "longest" finds a candidate, wildmenu is not shown - call term_sendkeys(buf, "\:set wildmode=longest:full,full wildoptions&\") - call term_sendkeys(buf, ":sign u\") + call term_sendkeys(buf, "\:sign u\") + call TermWait(buf, 50) call VerifyScreenDump(buf, 'Test_wildmenu_pum_57', {}) + + " "longest:full" shows wildmenu whether it finds a candidate or not; item not selected + call term_sendkeys(buf, "\:set wildmode=longest:full,full\") + call term_sendkeys(buf, ":sign u\") + call TermWait(buf, 50) + call VerifyScreenDump(buf, 'Test_wildmenu_pum_58', {}) + call term_sendkeys(buf, "\") + call TermWait(buf, 50) + call VerifyScreenDump(buf, 'Test_wildmenu_pum_59', {}) + call term_sendkeys(buf, "\:cn\") + call TermWait(buf, 50) + call VerifyScreenDump(buf, 'Test_wildmenu_pum_60', {}) + call term_sendkeys(buf, "\") + call TermWait(buf, 50) + call VerifyScreenDump(buf, 'Test_wildmenu_pum_61', {}) + + " If "longest,full" finds a candidate, wildmenu is not shown + call term_sendkeys(buf, "\:set wildmode=longest,full\") + call term_sendkeys(buf, ":sign u\") + call VerifyScreenDump(buf, 'Test_wildmenu_pum_62', {}) " Subsequent wildchar shows wildmenu call term_sendkeys(buf, "\") - call VerifyScreenDump(buf, 'Test_wildmenu_pum_58', {}) + call VerifyScreenDump(buf, 'Test_wildmenu_pum_63', {}) + + " 'longest' does not find candidate, and displays menu without selecting item + call term_sendkeys(buf, "\:set wildmode=longest,noselect\") + call term_sendkeys(buf, ":cn\") + call VerifyScreenDump(buf, 'Test_wildmenu_pum_64', {}) call term_sendkeys(buf, "\\") call StopVimInTerminal(buf) diff --git a/src/version.c b/src/version.c index cf2f991016..596cd17dd8 100644 --- a/src/version.c +++ b/src/version.c @@ -724,6 +724,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1737, /**/ 1736, /**/