0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.2.1580: wildmenu does not work properly

Problem:    Wildmenu does not work properly.
Solution:   Do not call may_do_incsearch_highlighting() if completion is in
            progress.
This commit is contained in:
Bram Moolenaar
2020-09-03 16:50:13 +02:00
parent 5b5aa11801
commit a60053b8f4
7 changed files with 74 additions and 12 deletions

View File

@@ -397,7 +397,8 @@ may_do_incsearch_highlighting(
// NOTE: must call restore_last_search_pattern() before returning! // NOTE: must call restore_last_search_pattern() before returning!
save_last_search_pattern(); save_last_search_pattern();
if (!do_incsearch_highlighting(firstc, &search_delim, is_state, &skiplen, &patlen)) if (!do_incsearch_highlighting(firstc, &search_delim, is_state,
&skiplen, &patlen))
{ {
restore_last_search_pattern(); restore_last_search_pattern();
finish_incsearch_highlighting(FALSE, is_state, TRUE); finish_incsearch_highlighting(FALSE, is_state, TRUE);
@@ -1235,10 +1236,10 @@ getcmdline_int(
if (has_mbyte) if (has_mbyte)
j -= (*mb_head_off)(ccline.cmdbuff, ccline.cmdbuff + j); j -= (*mb_head_off)(ccline.cmdbuff, ccline.cmdbuff + j);
if (vim_ispathsep(ccline.cmdbuff[j]) if (vim_ispathsep(ccline.cmdbuff[j])
#ifdef BACKSLASH_IN_FILENAME # ifdef BACKSLASH_IN_FILENAME
&& vim_strchr((char_u *)" *?[{`$%#", && vim_strchr((char_u *)" *?[{`$%#",
ccline.cmdbuff[j + 1]) == NULL ccline.cmdbuff[j + 1]) == NULL
#endif # endif
) )
{ {
if (found) if (found)
@@ -1425,6 +1426,7 @@ getcmdline_int(
if ((c == p_wc && !gotesc && KeyTyped) || c == p_wcm) if ((c == p_wc && !gotesc && KeyTyped) || c == p_wcm)
{ {
int options = WILD_NO_BEEP; int options = WILD_NO_BEEP;
if (wim_flags[wim_index] & WIM_BUFLASTUSED) if (wim_flags[wim_index] & WIM_BUFLASTUSED)
options |= WILD_BUFLASTUSED; options |= WILD_BUFLASTUSED;
if (xpc.xp_numfiles > 0) // typed p_wc at least twice if (xpc.xp_numfiles > 0) // typed p_wc at least twice
@@ -1442,8 +1444,7 @@ getcmdline_int(
res = nextwild(&xpc, WILD_LONGEST, options, res = nextwild(&xpc, WILD_LONGEST, options,
firstc != '@'); firstc != '@');
else if (wim_flags[wim_index] & WIM_FULL) else if (wim_flags[wim_index] & WIM_FULL)
res = nextwild(&xpc, WILD_NEXT, options, res = nextwild(&xpc, WILD_NEXT, options, firstc != '@');
firstc != '@');
else else
res = OK; // don't insert 'wildchar' now res = OK; // don't insert 'wildchar' now
} }
@@ -1454,11 +1455,10 @@ getcmdline_int(
// if 'wildmode' first contains "longest", get longest // if 'wildmode' first contains "longest", get longest
// common part // common part
if (wim_flags[0] & WIM_LONGEST) if (wim_flags[0] & WIM_LONGEST)
res = nextwild(&xpc, WILD_LONGEST, options, res = nextwild(&xpc, WILD_LONGEST, options, firstc != '@');
firstc != '@');
else else
res = nextwild(&xpc, WILD_EXPAND_KEEP, options, res = nextwild(&xpc, WILD_EXPAND_KEEP, options,
firstc != '@'); firstc != '@');
// if interrupted while completing, behave like it failed // if interrupted while completing, behave like it failed
if (got_int) if (got_int)
@@ -1483,7 +1483,7 @@ getcmdline_int(
wim_index = 1; wim_index = 1;
if ((wim_flags[wim_index] & WIM_LIST) if ((wim_flags[wim_index] & WIM_LIST)
#ifdef FEAT_WILDMENU #ifdef FEAT_WILDMENU
|| (p_wmnu && (wim_flags[wim_index] & WIM_FULL) != 0) || (p_wmnu && (wim_flags[wim_index] & WIM_FULL) != 0)
#endif #endif
) )
{ {
@@ -1511,8 +1511,7 @@ getcmdline_int(
nextwild(&xpc, WILD_LONGEST, options, nextwild(&xpc, WILD_LONGEST, options,
firstc != '@'); firstc != '@');
else if (wim_flags[wim_index] & WIM_FULL) else if (wim_flags[wim_index] & WIM_FULL)
nextwild(&xpc, WILD_NEXT, options, nextwild(&xpc, WILD_NEXT, options, firstc != '@');
firstc != '@');
} }
else else
vim_beep(BO_WILD); vim_beep(BO_WILD);
@@ -2348,7 +2347,8 @@ cmdline_changed:
trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINECHANGED); trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINECHANGED);
#ifdef FEAT_SEARCH_EXTRA #ifdef FEAT_SEARCH_EXTRA
may_do_incsearch_highlighting(firstc, count, &is_state); if (xpc.xp_context == EXPAND_NOTHING)
may_do_incsearch_highlighting(firstc, count, &is_state);
#endif #endif
#ifdef FEAT_RIGHTLEFT #ifdef FEAT_RIGHTLEFT

View File

@@ -0,0 +1,8 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|v+0#0000001#ffff4012|i|m|9|s|c|r|i|p|t| +3#0000000#ffffff0@1|v|i|m|g|r|e|p| @1|v|i|m|g|r|e|p|a|d@1| @43
|:+0&&|v|i|m|9|s|c|r|i|p|t> @63

View File

@@ -0,0 +1,8 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|v+3#0000000&|i|m|9|s|c|r|i|p|t| @1|v+0#0000001#ffff4012|i|m|g|r|e|p| +3#0000000#ffffff0@1|v|i|m|g|r|e|p|a|d@1| @43
|:+0&&|v|i|m|g|r|e|p> @66

View File

@@ -0,0 +1,8 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|v+3#0000000&|i|m|9|s|c|r|i|p|t| @1|v|i|m|g|r|e|p| @1|v+0#0000001#ffff4012|i|m|g|r|e|p|a|d@1| +3#0000000#ffffff0@43
|:+0&&|v|i|m|g|r|e|p|a|d@1> @63

View File

@@ -0,0 +1,8 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|v+3#0000000&|i|m|9|s|c|r|i|p|t| @1|v|i|m|g|r|e|p| @1|v|i|m|g|r|e|p|a|d@1| @43
|:+0&&|v|i|m> @70

View File

@@ -84,6 +84,34 @@ func Test_complete_wildmenu()
call delete('Xdir1', 'd') call delete('Xdir1', 'd')
set nowildmenu set nowildmenu
endfunc endfunc
f
func Test_wildmenu_screendump()
CheckScreendump
let lines =<< trim [SCRIPT]
set wildmenu hlsearch
[SCRIPT]
call writefile(lines, 'XTest_wildmenu')
let buf = RunVimInTerminal('-S XTest_wildmenu', {'rows': 8})
call term_sendkeys(buf, ":vim\<Tab>")
call VerifyScreenDump(buf, 'Test_wildmenu_1', {})
call term_sendkeys(buf, "\<Tab>")
call VerifyScreenDump(buf, 'Test_wildmenu_2', {})
call term_sendkeys(buf, "\<Tab>")
call VerifyScreenDump(buf, 'Test_wildmenu_3', {})
call term_sendkeys(buf, "\<Tab>")
call VerifyScreenDump(buf, 'Test_wildmenu_4', {})
call term_sendkeys(buf, "\<Esc>")
" clean up
call StopVimInTerminal(buf)
call delete('XTest_wildmenu')
endfunc
func Test_map_completion() func Test_map_completion()
CheckFeature cmdline_compl CheckFeature cmdline_compl

View File

@@ -754,6 +754,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 */
/**/
1580,
/**/ /**/
1579, 1579,
/**/ /**/