0
0
mirror of https://github.com/vim/vim.git synced 2025-10-21 08:24:06 -04:00

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 <girishji@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Girish Palya
2025-09-06 19:39:32 +02:00
committed by Christian Brabandt
parent 6505dc69d3
commit 8fec92d631
14 changed files with 119 additions and 34 deletions

View File

@@ -1000,7 +1000,10 @@ cmdline_wildchar_complete(
// Remove popup window if no completion items are available // Remove popup window if no completion items are available
if (redraw_if_menu_empty && xp->xp_numfiles <= 0) if (redraw_if_menu_empty && xp->xp_numfiles <= 0)
{
update_screen(0); update_screen(0);
redrawcmd(); // Ensure initial pasted text appears on cmdline
}
// if interrupted while completing, behave like it failed // if interrupted while completing, behave like it failed
if (got_int) if (got_int)
@@ -1016,16 +1019,29 @@ cmdline_wildchar_complete(
// Display matches // Display matches
if (res == OK && xp->xp_numfiles > (wim_noselect ? 0 : 1)) if (res == OK && xp->xp_numfiles > (wim_noselect ? 0 : 1))
{ {
// If "longest" fails to identify the longest item, try other if (wim_longest)
// 'wim' values if available
if (wim_longest && ccline.cmdpos == cmdpos_before)
{ {
if (wim_full) int found_longest_prefix = (ccline.cmdpos != cmdpos_before);
nextwild(xp, WILD_NEXT, options, escape);
if (wim_list || (p_wmnu && wim_full)) 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))) if (wim_list || (p_wmnu && (wim_full || wim_noselect)))
(void)showmatches(xp, p_wmnu, wim_list, wim_noselect); (void)showmatches(xp, p_wmnu, wim_list, wim_noselect);

View File

@@ -1,10 +1,10 @@
| +0&#ffffff0@74 |~+0#4040ff13#ffffff0| @73
|~+0#4040ff13&| @73
|~| @73 |~| @73
|~| @73 |~| @73
|~| @73 |~| @73
|~| @73 |~| @73
|~| @73 |~| @73
|~| @73 |:+0#0000000&|c|n| @71
|~| @73 |c|n|e|w|e|r| @6|c|n|f|i|l|e| @6|c|n|o|r|e|m|a|p| @40
|:+0#0000000&|c|n> @71 |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

View File

@@ -7,4 +7,4 @@
|:+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|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|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

View File

@@ -1,10 +1,10 @@
| +0&#ffffff0@74 |~+0#4040ff13#ffffff0| @73
|~+0#4040ff13&| @73
|~| @73 |~| @73
|~| @73 |~| @73
|~| @73 |~| @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

View File

@@ -6,5 +6,5 @@
|~| @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 |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|d|e|f|i|n|e> @60 |:+0&&|s|i|g|n| |u|n> @66

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -7,4 +7,4 @@
|~| @73 |~| @73
|~| @73 |~| @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

View File

@@ -2829,7 +2829,7 @@ func Test_wildmenu_pum()
call term_sendkeys(buf, "\<C-U>set wildmode=longest,list\<CR>") call term_sendkeys(buf, "\<C-U>set wildmode=longest,list\<CR>")
call term_sendkeys(buf, ":cn\<Tab>") call term_sendkeys(buf, ":cn\<Tab>")
call VerifyScreenDump(buf, 'Test_wildmenu_pum_30', {}) call VerifyScreenDump(buf, 'Test_wildmenu_pum_30', {})
call term_sendkeys(buf, "\<Tab>") call term_sendkeys(buf, "s")
call VerifyScreenDump(buf, 'Test_wildmenu_pum_31', {}) call VerifyScreenDump(buf, 'Test_wildmenu_pum_31', {})
" Tests a directory name contained full-width characters. " Tests a directory name contained full-width characters.
@@ -2931,28 +2931,45 @@ func Test_wildmenu_pum()
call term_sendkeys(buf, "\<Esc>:set showtabline& laststatus& lazyredraw&\<CR>") call term_sendkeys(buf, "\<Esc>:set showtabline& laststatus& lazyredraw&\<CR>")
" Verify that if "longest" finds nothing, wildmenu is still shown " "longest:list" shows list whether it finds a candidate or not
call term_sendkeys(buf, ":set wildmode=longest:full,full wildoptions&\<CR>") call term_sendkeys(buf, ":set wildmode=longest:list,full wildoptions&\<CR>")
call term_sendkeys(buf, ":cn\<Tab>")
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, "\<Esc>:set wildmode=longest:list,full\<CR>")
call term_sendkeys(buf, ":cn\<Tab>") call term_sendkeys(buf, ":cn\<Tab>")
call TermWait(buf, 50) call TermWait(buf, 50)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_55', {}) call VerifyScreenDump(buf, 'Test_wildmenu_pum_55', {})
call term_sendkeys(buf, "\<Tab>") call term_sendkeys(buf, "\<Tab>")
call TermWait(buf, 50) call TermWait(buf, 50)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_56', {}) call VerifyScreenDump(buf, 'Test_wildmenu_pum_56', {})
call term_sendkeys(buf, "\<Esc>:sign u\<Tab>")
" Verify that if "longest" finds a candidate, wildmenu is not shown call TermWait(buf, 50)
call term_sendkeys(buf, "\<Esc>:set wildmode=longest:full,full wildoptions&\<CR>")
call term_sendkeys(buf, ":sign u\<Tab>")
call VerifyScreenDump(buf, 'Test_wildmenu_pum_57', {}) 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, "\<Esc>:set wildmode=longest:full,full\<CR>")
call term_sendkeys(buf, ":sign u\<Tab>")
call TermWait(buf, 50)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_58', {})
call term_sendkeys(buf, "\<Tab>")
call TermWait(buf, 50)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_59', {})
call term_sendkeys(buf, "\<Esc>:cn\<Tab>")
call TermWait(buf, 50)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_60', {})
call term_sendkeys(buf, "\<Tab>")
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, "\<Esc>:set wildmode=longest,full\<CR>")
call term_sendkeys(buf, ":sign u\<Tab>")
call VerifyScreenDump(buf, 'Test_wildmenu_pum_62', {})
" Subsequent wildchar shows wildmenu " Subsequent wildchar shows wildmenu
call term_sendkeys(buf, "\<Tab>") call term_sendkeys(buf, "\<Tab>")
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, "\<Esc>:set wildmode=longest,noselect\<CR>")
call term_sendkeys(buf, ":cn\<Tab>")
call VerifyScreenDump(buf, 'Test_wildmenu_pum_64', {})
call term_sendkeys(buf, "\<C-U>\<Esc>") call term_sendkeys(buf, "\<C-U>\<Esc>")
call StopVimInTerminal(buf) call StopVimInTerminal(buf)

View File

@@ -724,6 +724,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1737,
/**/ /**/
1736, 1736,
/**/ /**/