1
0
forked from aniani/vim

patch 8.2.4325: 'wildmenu' only shows few matches

Problem:    'wildmenu' only shows few matches.
Solution:   Add the "pum" option: use a popup menu to show the matches.
            (Yegappan Lakshmanan et al., closes #9707)
This commit is contained in:
Yegappan Lakshmanan
2022-02-08 12:08:07 +00:00
committed by Bram Moolenaar
parent 3787f26c2e
commit 3908ef5017
41 changed files with 673 additions and 17 deletions

View File

@@ -8974,7 +8974,8 @@ A jump table for the options with a short description can be found at |Q_op|.
mode. On pressing 'wildchar' (usually <Tab>) to invoke completion, mode. On pressing 'wildchar' (usually <Tab>) to invoke completion,
the possible matches are shown just above the command line, with the the possible matches are shown just above the command line, with the
first match highlighted (overwriting the status line, if there is first match highlighted (overwriting the status line, if there is
one). Keys that show the previous/next match, such as <Tab> or one). This is the behavior without "pum" in 'wildoptions.
Keys that show the previous/next match, such as <Tab> or
CTRL-P/CTRL-N, cause the highlight to move to the appropriate match. CTRL-P/CTRL-N, cause the highlight to move to the appropriate match.
When 'wildmode' is used, "wildmenu" mode is used where "full" is When 'wildmode' is used, "wildmenu" mode is used where "full" is
specified. "longest" and "list" do not start "wildmenu" mode. specified. "longest" and "list" do not start "wildmenu" mode.
@@ -8982,10 +8983,12 @@ A jump table for the options with a short description can be found at |Q_op|.
If there are more matches than can fit in the line, a ">" is shown on If there are more matches than can fit in the line, a ">" is shown on
the right and/or a "<" is shown on the left. The status line scrolls the right and/or a "<" is shown on the left. The status line scrolls
as needed. as needed.
When 'wildoptions' contains "pum", then the completion matches are
shown in a popup menu.
The "wildmenu" mode is abandoned when a key is hit that is not used The "wildmenu" mode is abandoned when a key is hit that is not used
for selecting a completion. for selecting a completion.
While the "wildmenu" is active the following keys have special While the "wildmenu" is active, not using the popup menu, the
meanings: following keys have special meanings:
<Left> <Right> - select previous/next match (like CTRL-P/CTRL-N) <Left> <Right> - select previous/next match (like CTRL-P/CTRL-N)
<Down> - in filename/menu name completion: move into a <Down> - in filename/menu name completion: move into a
@@ -8995,6 +8998,21 @@ A jump table for the options with a short description can be found at |Q_op|.
<Up> - in filename/menu name completion: move up into <Up> - in filename/menu name completion: move up into
parent directory or parent menu. parent directory or parent menu.
When using the popup menu for command line completion, the following
keys have special meanings:
<Down> - select next match (like CTRL-N)
<Left> - in filename/menu name completion: move up into
parent directory or parent menu.
<Right> - in filename/menu name completion: move into a
subdirectory or submenu.
<Up> - select previous match (like CTRL-P)
CTRL-E - end completion, go back to what was there before
selecting a match.
CTRL-N - go to the next entry
CTRL-P - go to the previous entry
CTRL-Y - accept the currently selected match and stop
completion.
This makes the menus accessible from the console |console-menus|. This makes the menus accessible from the console |console-menus|.
If you prefer the <Left> and <Right> keys to move the cursor instead If you prefer the <Left> and <Right> keys to move the cursor instead
@@ -9057,14 +9075,15 @@ A jump table for the options with a short description can be found at |Q_op|.
global global
{not available when compiled without the |+wildignore| {not available when compiled without the |+wildignore|
feature} feature}
A list of words that change how command line completion is done. A list of words that change how |cmdline-completion| is done.
Currently only one word is allowed: The following values are supported:
pum Display the completion matches using the popupmenu
in the same style as the |ins-completion-menu|.
tagfile When using CTRL-D to list matching tags, the kind of tagfile When using CTRL-D to list matching tags, the kind of
tag and the file of the tag is listed. Only one match tag and the file of the tag is listed. Only one match
is displayed per line. Often used tag kinds are: is displayed per line. Often used tag kinds are:
d #define d #define
f function f function
Also see |cmdline-completion|.
*'winaltkeys'* *'wak'* *'winaltkeys'* *'wak'*
'winaltkeys' 'wak' string (default "menu") 'winaltkeys' 'wak' string (default "menu")

View File

@@ -25,6 +25,16 @@ static int expand_shellcmd(char_u *filepat, int *num_file, char_u ***file, int f
#if defined(FEAT_EVAL) #if defined(FEAT_EVAL)
static int ExpandUserDefined(expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file); static int ExpandUserDefined(expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file);
static int ExpandUserList(expand_T *xp, int *num_file, char_u ***file); static int ExpandUserList(expand_T *xp, int *num_file, char_u ***file);
#endif
#ifdef FEAT_WILDMENU
// "compl_match_array" points the currently displayed list of entries in the
// popup menu. It is NULL when there is no popup menu.
static pumitem_T *compl_match_array = NULL;
static int compl_match_arraysize;
// First column in cmdline of the matched item for completion.
static int compl_startcol;
static int compl_selected;
#endif #endif
static int static int
@@ -245,6 +255,42 @@ nextwild(
return OK; return OK;
} }
#if defined(FEAT_WILDMENU) || defined(PROTO)
/*
* Display the cmdline completion matches in a popup menu
*/
void cmdline_pum_display(void)
{
pum_display(compl_match_array, compl_match_arraysize, compl_selected);
}
int cmdline_pum_active(void)
{
return p_wmnu && pum_visible() && compl_match_array != NULL;
}
/*
* Remove the cmdline completion popup menu
*/
void cmdline_pum_remove(void)
{
pum_undisplay();
VIM_CLEAR(compl_match_array);
update_screen(0);
}
void cmdline_pum_cleanup(cmdline_info_T *cclp)
{
cmdline_pum_remove();
wildmenu_cleanup(cclp);
}
int cmdline_compl_startcol(void)
{
return compl_startcol;
}
#endif
/* /*
* Do wildcard expansion on the string 'str'. * Do wildcard expansion on the string 'str'.
* Chars that should not be expanded must be preceded with a backslash. * Chars that should not be expanded must be preceded with a backslash.
@@ -327,7 +373,12 @@ ExpandOne(
findex = -1; findex = -1;
} }
#ifdef FEAT_WILDMENU #ifdef FEAT_WILDMENU
if (p_wmnu) if (compl_match_array)
{
compl_selected = findex;
cmdline_pum_display();
}
else if (p_wmnu)
win_redr_status_matches(xp, xp->xp_numfiles, xp->xp_files, win_redr_status_matches(xp, xp->xp_numfiles, xp->xp_files,
findex, cmd_showtail); findex, cmd_showtail);
#endif #endif
@@ -339,6 +390,12 @@ ExpandOne(
return NULL; return NULL;
} }
if (mode == WILD_CANCEL)
ss = vim_strsave(orig_save ? orig_save : (char_u *)"");
else if (mode == WILD_APPLY)
ss = vim_strsave(findex == -1 ? (orig_save ?
orig_save : (char_u *)"") : xp->xp_files[findex]);
// free old names // free old names
if (xp->xp_numfiles != -1 && mode != WILD_ALL && mode != WILD_LONGEST) if (xp->xp_numfiles != -1 && mode != WILD_ALL && mode != WILD_LONGEST)
{ {
@@ -351,7 +408,7 @@ ExpandOne(
if (mode == WILD_FREE) // only release file name if (mode == WILD_FREE) // only release file name
return NULL; return NULL;
if (xp->xp_numfiles == -1) if (xp->xp_numfiles == -1 && mode != WILD_APPLY && mode != WILD_CANCEL)
{ {
vim_free(orig_save); vim_free(orig_save);
orig_save = orig; orig_save = orig;
@@ -553,6 +610,35 @@ showmatches(expand_T *xp, int wildmenu UNUSED)
showtail = cmd_showtail; showtail = cmd_showtail;
} }
#ifdef FEAT_WILDMENU
if (wildmenu && vim_strchr(p_wop, WOP_PUM) != NULL)
{
compl_match_arraysize = num_files;
compl_match_array = ALLOC_MULT(pumitem_T, compl_match_arraysize);
for (i = 0; i < num_files; i++)
{
compl_match_array[i].pum_text = L_SHOWFILE(i);
compl_match_array[i].pum_info = NULL;
compl_match_array[i].pum_extra = NULL;
compl_match_array[i].pum_kind = NULL;
}
compl_startcol = ccline->cmdpos + 1;
columns = vim_strsize(xp->xp_pattern);
if (showtail)
{
columns += vim_strsize(sm_gettail(files_found[0]));
columns -= vim_strsize(files_found[0]);
}
if (columns >= compl_startcol)
compl_startcol = 0;
else
compl_startcol -= columns;
compl_selected = -1;
cmdline_pum_display();
return EXPAND_OK;
}
#endif
#ifdef FEAT_WILDMENU #ifdef FEAT_WILDMENU
if (!wildmenu) if (!wildmenu)
{ {
@@ -1500,7 +1586,7 @@ set_one_cmd_context(
case CMD_tjump: case CMD_tjump:
case CMD_stjump: case CMD_stjump:
case CMD_ptjump: case CMD_ptjump:
if (*p_wop != NUL) if (vim_strchr(p_wop, WOP_TAGFILE) != NULL)
xp->xp_context = EXPAND_TAGS_LISTFILES; xp->xp_context = EXPAND_TAGS_LISTFILES;
else else
xp->xp_context = EXPAND_TAGS; xp->xp_context = EXPAND_TAGS;
@@ -2639,6 +2725,22 @@ wildmenu_translate_key(
{ {
int c = key; int c = key;
#ifdef FEAT_WILDMENU
if (p_wmnu && cmdline_pum_active())
{
// When the popup menu is used, Up/Down keys go to the previous and
// next items in the menu and Left/Right keys go up/down a directory.
if (c == K_UP)
c = K_LEFT;
else if (c == K_DOWN)
c = K_RIGHT;
else if (c == K_LEFT)
c = K_UP;
else if (c == K_RIGHT)
c = K_DOWN;
}
#endif
if (did_wild_list && p_wmnu) if (did_wild_list && p_wmnu)
{ {
if (c == K_LEFT) if (c == K_LEFT)
@@ -2646,6 +2748,7 @@ wildmenu_translate_key(
else if (c == K_RIGHT) else if (c == K_RIGHT)
c = Ctrl_N; c = Ctrl_N;
} }
// Hitting CR after "emenu Name.": complete submenu // Hitting CR after "emenu Name.": complete submenu
if (xp->xp_context == EXPAND_MENUNAMES && p_wmnu if (xp->xp_context == EXPAND_MENUNAMES && p_wmnu
&& cclp->cmdpos > 1 && cclp->cmdpos > 1

View File

@@ -3048,6 +3048,10 @@ redraw_after_callback(int call_update_screen, int do_message)
} }
else if (State & CMDLINE) else if (State & CMDLINE)
{ {
#ifdef FEAT_WILDMENU
if (pum_visible())
cmdline_pum_display();
#endif
// Don't redraw when in prompt_for_number(). // Don't redraw when in prompt_for_number().
if (cmdline_row > 0) if (cmdline_row > 0)
{ {

View File

@@ -10336,7 +10336,7 @@ f_visualmode(typval_T *argvars, typval_T *rettv)
f_wildmenumode(typval_T *argvars UNUSED, typval_T *rettv UNUSED) f_wildmenumode(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
{ {
#ifdef FEAT_WILDMENU #ifdef FEAT_WILDMENU
if (wild_menu_showing) if (wild_menu_showing || ((State & CMDLINE) && cmdline_pum_active()))
rettv->vval.v_number = 1; rettv->vval.v_number = 1;
#endif #endif
} }

View File

@@ -924,9 +924,18 @@ cmdline_wildchar_complete(
// if 'wildmode' contains "list" may still need to list // if 'wildmode' contains "list" may still need to list
if (xp->xp_numfiles > 1 if (xp->xp_numfiles > 1
&& !*did_wild_list && !*did_wild_list
&& (wim_flags[wim_index] & WIM_LIST)) && ((wim_flags[wim_index] & WIM_LIST)
#ifdef FEAT_WILDMENU
|| (p_wmnu && (wim_flags[wim_index] & WIM_FULL) != 0)
#endif
))
{ {
#ifdef FEAT_WILDMENU
(void)showmatches(xp,
p_wmnu && ((wim_flags[wim_index] & WIM_LIST) == 0));
#else
(void)showmatches(xp, FALSE); (void)showmatches(xp, FALSE);
#endif
redrawcmd(); redrawcmd();
*did_wild_list = TRUE; *did_wild_list = TRUE;
} }
@@ -1848,6 +1857,23 @@ getcmdline_int(
#ifdef FEAT_WILDMENU #ifdef FEAT_WILDMENU
c = wildmenu_translate_key(&ccline, c, &xpc, did_wild_list); c = wildmenu_translate_key(&ccline, c, &xpc, did_wild_list);
if (cmdline_pum_active())
{
if (c == Ctrl_E || c == Ctrl_Y)
{
int wild_type;
wild_type = (c == Ctrl_E) ? WILD_CANCEL : WILD_APPLY;
if (nextwild(&xpc, wild_type, WILD_NO_BEEP,
firstc != '@') == FAIL)
break;
cmdline_pum_cleanup(&ccline);
xpc.xp_context = EXPAND_NOTHING;
goto cmdline_changed;
}
}
#endif #endif
// free expanded names when finished walking through matches // free expanded names when finished walking through matches
@@ -1856,6 +1882,9 @@ getcmdline_int(
&& c != Ctrl_N && c != Ctrl_P && c != Ctrl_A && c != Ctrl_N && c != Ctrl_P && c != Ctrl_A
&& c != Ctrl_L) && c != Ctrl_L)
{ {
#ifdef FEAT_WILDMENU
cmdline_pum_remove();
#endif
(void)ExpandOne(&xpc, NULL, NULL, 0, WILD_FREE); (void)ExpandOne(&xpc, NULL, NULL, 0, WILD_FREE);
did_wild_list = FALSE; did_wild_list = FALSE;
#ifdef FEAT_WILDMENU #ifdef FEAT_WILDMENU
@@ -1950,10 +1979,19 @@ getcmdline_int(
// <S-Tab> goes to last match, in a clumsy way // <S-Tab> goes to last match, in a clumsy way
if (c == K_S_TAB && KeyTyped) if (c == K_S_TAB && KeyTyped)
{ {
if (nextwild(&xpc, WILD_EXPAND_KEEP, 0, firstc != '@') == OK if (nextwild(&xpc, WILD_EXPAND_KEEP, 0, firstc != '@') == OK)
&& nextwild(&xpc, WILD_PREV, 0, firstc != '@') == OK {
&& nextwild(&xpc, WILD_PREV, 0, firstc != '@') == OK) #ifdef FEAT_WILDMENU
goto cmdline_changed; // Trigger the popup menu when wildoptions=pum
showmatches(&xpc,
p_wmnu && ((wim_flags[wim_index] & WIM_LIST) == 0));
#else
(void)showmatches(&xpc, FALSE);
#endif
if (nextwild(&xpc, WILD_PREV, 0, firstc != '@') == OK
&& nextwild(&xpc, WILD_PREV, 0, firstc != '@') == OK)
goto cmdline_changed;
}
} }
if (c == NUL || c == K_ZERO) // NUL is stored as NL if (c == NUL || c == K_ZERO) // NUL is stored as NL
@@ -2222,6 +2260,13 @@ getcmdline_int(
case Ctrl_A: // all matches case Ctrl_A: // all matches
if (nextwild(&xpc, WILD_ALL, 0, firstc != '@') == FAIL) if (nextwild(&xpc, WILD_ALL, 0, firstc != '@') == FAIL)
break; break;
#ifdef FEAT_WILDMENU
if (cmdline_pum_active())
{
cmdline_pum_cleanup(&ccline);
xpc.xp_context = EXPAND_NOTHING;
}
#endif
goto cmdline_changed; goto cmdline_changed;
case Ctrl_L: case Ctrl_L:

View File

@@ -356,6 +356,11 @@ typedef enum {
#define WIM_LIST 0x04 #define WIM_LIST 0x04
#define WIM_BUFLASTUSED 0x08 #define WIM_BUFLASTUSED 0x08
// flags for the 'wildoptions' option
// each defined char should be unique over all values.
#define WOP_TAGFILE 't'
#define WOP_PUM 'p'
// arguments for can_bs() // arguments for can_bs()
// each defined char should be unique over all values // each defined char should be unique over all values
// except for BS_START, that intentionally also matches BS_NOSTOP // except for BS_START, that intentionally also matches BS_NOSTOP

View File

@@ -57,7 +57,7 @@ static char *(p_tbis_values[]) = {"tiny", "small", "medium", "large", "huge", "g
static char *(p_ttym_values[]) = {"xterm", "xterm2", "dec", "netterm", "jsbterm", "pterm", "urxvt", "sgr", NULL}; static char *(p_ttym_values[]) = {"xterm", "xterm2", "dec", "netterm", "jsbterm", "pterm", "urxvt", "sgr", NULL};
#endif #endif
static char *(p_ve_values[]) = {"block", "insert", "all", "onemore", "none", "NONE", NULL}; static char *(p_ve_values[]) = {"block", "insert", "all", "onemore", "none", "NONE", NULL};
static char *(p_wop_values[]) = {"tagfile", NULL}; static char *(p_wop_values[]) = {"tagfile", "pum", NULL};
#ifdef FEAT_WAK #ifdef FEAT_WAK
static char *(p_wak_values[]) = {"yes", "menu", "no", NULL}; static char *(p_wak_values[]) = {"yes", "menu", "no", NULL};
#endif #endif

View File

@@ -116,7 +116,10 @@ pum_display(
// Remember the essential parts of the window position and size, so we // Remember the essential parts of the window position and size, so we
// can decide when to reposition the popup menu. // can decide when to reposition the popup menu.
pum_window = curwin; pum_window = curwin;
pum_win_row = curwin->w_wrow + W_WINROW(curwin); if (State == CMDLINE)
pum_win_row = cmdline_row;
else
pum_win_row = curwin->w_wrow + W_WINROW(curwin);
pum_win_height = curwin->w_height; pum_win_height = curwin->w_height;
pum_win_col = curwin->w_wincol; pum_win_col = curwin->w_wincol;
pum_win_wcol = curwin->w_wcol; pum_win_wcol = curwin->w_wcol;
@@ -215,6 +218,11 @@ pum_display(
max_width = pum_base_width; max_width = pum_base_width;
// Calculate column // Calculate column
#ifdef FEAT_WILDMENU
if (State == CMDLINE)
cursor_col = cmdline_compl_startcol();
else
#endif
#ifdef FEAT_RIGHTLEFT #ifdef FEAT_RIGHTLEFT
if (curwin->w_p_rl) if (curwin->w_p_rl)
cursor_col = curwin->w_wincol + curwin->w_width cursor_col = curwin->w_wincol + curwin->w_width

View File

@@ -3,6 +3,11 @@ int nextwild(expand_T *xp, int type, int options, int escape);
char_u *ExpandOne(expand_T *xp, char_u *str, char_u *orig, int options, int mode); char_u *ExpandOne(expand_T *xp, char_u *str, char_u *orig, int options, int mode);
void ExpandInit(expand_T *xp); void ExpandInit(expand_T *xp);
void ExpandCleanup(expand_T *xp); void ExpandCleanup(expand_T *xp);
void cmdline_pum_display(void);
int cmdline_pum_active(void);
void cmdline_pum_remove(void);
void cmdline_pum_cleanup(cmdline_info_T *cclp);
int cmdline_compl_startcol(void);
int showmatches(expand_T *xp, int wildmenu); int showmatches(expand_T *xp, int wildmenu);
char_u *sm_gettail(char_u *s); char_u *sm_gettail(char_u *s);
char_u *addstar(char_u *fname, int len, int context); char_u *addstar(char_u *fname, int len, int context);

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @3| +0#0000001#e0e0e08|d|e|f|i|n|e| @8| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|j|u|m|p| @10| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|l|i|s|t| @10| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|p|l|a|c|e| @9| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|u|n|d|e|f|i|n|e| @6| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|u|n|p|l|a|c|e| @7| +0#4040ff13#ffffff0@53
|:+0#0000000&|s|i|g|n| |d|e|f|i|n|e> @62

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @3| +0#0000001#ffd7ff255|d|e|f|i|n|e| @8| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|j|u|m|p| @10| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#e0e0e08|l|i|s|t| @10| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|p|l|a|c|e| @9| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|u|n|d|e|f|i|n|e| @6| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|u|n|p|l|a|c|e| @7| +0#4040ff13#ffffff0@53
|:+0#0000000&|s|i|g|n| |l|i|s|t> @64

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @3| +0#0000001#ffd7ff255|d|e|f|i|n|e| @8| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|j|u|m|p| @10| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|l|i|s|t| @10| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#e0e0e08|p|l|a|c|e| @9| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|u|n|d|e|f|i|n|e| @6| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|u|n|p|l|a|c|e| @7| +0#4040ff13#ffffff0@53
|:+0#0000000&|s|i|g|n| |p|l|a|c|e> @63

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @3| +0#0000001#ffd7ff255|d|e|f|i|n|e| @8| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|j|u|m|p| @10| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#e0e0e08|l|i|s|t| @10| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|p|l|a|c|e| @9| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|u|n|d|e|f|i|n|e| @6| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|u|n|p|l|a|c|e| @7| +0#4040ff13#ffffff0@53
|:+0#0000000&|s|i|g|n| |l|i|s|t> @64

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @3| +0#0000001#ffd7ff255|d|e|f|i|n|e| @8| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#e0e0e08|j|u|m|p| @10| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|l|i|s|t| @10| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|p|l|a|c|e| @9| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|u|n|d|e|f|i|n|e| @6| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|u|n|p|l|a|c|e| @7| +0#4040ff13#ffffff0@53
|:+0#0000000&|s|i|g|n| |j|u|m|p> @64

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

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|p|l|a|c|e> @61

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
|~| @3| +0#0000001#e0e0e08|u|n|d|e|f|i|n|e| @6| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|u|n|p|l|a|c|e| @7| +0#4040ff13#ffffff0@53
|:+0#0000000&|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
|~| @3| +0#0000001#ffd7ff255|u|n|d|e|f|i|n|e| @6| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#e0e0e08|u|n|p|l|a|c|e| @7| +0#4040ff13#ffffff0@53
|:+0#0000000&|s|i|g|n| |u|n|p|l|a|c|e> @61

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @10| +0#0000001#e0e0e08|c|u|l|h|l|=| @8| +0#4040ff13#ffffff0@46
|~| @10| +0#0000001#ffd7ff255|i|c|o|n|=| @9| +0#4040ff13#ffffff0@46
|~| @10| +0#0000001#ffd7ff255|l|i|n|e|h|l|=| @7| +0#4040ff13#ffffff0@46
|~| @10| +0#0000001#ffd7ff255|n|u|m|h|l|=| @8| +0#4040ff13#ffffff0@46
|~| @10| +0#0000001#ffd7ff255|t|e|x|t|=| @9| +0#4040ff13#ffffff0@46
|~| @10| +0#0000001#ffd7ff255|t|e|x|t|h|l|=| @7| +0#4040ff13#ffffff0@46
|:+0#0000000&|s|i|g|n| |d|e|f|i|n|e| |c|u|l|h|l|=> @55

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @17| +0#0000001#e0e0e08|c|u|l|h|l|=| @8| +0#4040ff13#ffffff0@39
|~| @17| +0#0000001#ffd7ff255|i|c|o|n|=| @9| +0#4040ff13#ffffff0@39
|~| @17| +0#0000001#ffd7ff255|l|i|n|e|h|l|=| @7| +0#4040ff13#ffffff0@39
|~| @17| +0#0000001#ffd7ff255|n|u|m|h|l|=| @8| +0#4040ff13#ffffff0@39
|~| @17| +0#0000001#ffd7ff255|t|e|x|t|=| @9| +0#4040ff13#ffffff0@39
|~| @17| +0#0000001#ffd7ff255|t|e|x|t|h|l|=| @7| +0#4040ff13#ffffff0@39
|:+0#0000000&|s|i|g|n| |d|e|f|i|n|e| |c|u|l|h|l|=| |c|u|l|h|l|=> @48

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @24| +0#0000001#e0e0e08|c|u|l|h|l|=| @8| +0#4040ff13#ffffff0@32
|~| @24| +0#0000001#ffd7ff255|i|c|o|n|=| @9| +0#4040ff13#ffffff0@32
|~| @24| +0#0000001#ffd7ff255|l|i|n|e|h|l|=| @7| +0#4040ff13#ffffff0@32
|~| @24| +0#0000001#ffd7ff255|n|u|m|h|l|=| @8| +0#4040ff13#ffffff0@32
|~| @24| +0#0000001#ffd7ff255|t|e|x|t|=| @9| +0#4040ff13#ffffff0@32
|~| @24| +0#0000001#ffd7ff255|t|e|x|t|h|l|=| @7| +0#4040ff13#ffffff0@32
|:+0#0000000&|s|i|g|n| |d|e|f|i|n|e| |c|u|l|h|l|=| |c|u|l|h|l|=| |c|u|l|h|l|=> @41

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @5| +0#0000001#e0e0e08|X|d|i|r|A|/| @8| +0#4040ff13#ffffff0@51
|~| @5| +0#0000001#ffd7ff255|X|f|i|l|e|A| @8| +0#4040ff13#ffffff0@51
|:+0#0000000&|e| |X|d|i|r|/|X|d|i|r|A|/> @60

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @11| +0#0000001#e0e0e08|X|d|i|r|B|/| @8| +0#4040ff13#ffffff0@45
|~| @11| +0#0000001#ffd7ff255|X|f|i|l|e|B| @8| +0#4040ff13#ffffff0@45
|:+0#0000000&|e| |X|d|i|r|/|X|d|i|r|A|/|X|d|i|r|B|/> @54

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @5| +0#0000001#e0e0e08|X|d|i|r|A|/| @8| +0#4040ff13#ffffff0@51
|~| @5| +0#0000001#ffd7ff255|X|f|i|l|e|A| @8| +0#4040ff13#ffffff0@51
|:+0#0000000&|e| |X|d|i|r|/|X|d|i|r|A|/> @60

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| |d|e|f|i|n|e| |j|u|m|p| |l|i|s|t| |p|l|a|c|e| |u|n|d|e|f|i|n|e| |u|n|p|l|a|c|e> @29

View File

@@ -0,0 +1,10 @@
|~+0#4040ff13#ffffff0| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|:+0#0000000&|s|i|g|n| |d|e|f|i|n|e| @62
|d|e|f|i|n|e| @68
|:|s|i|g|n| |d|e|f|i|n|e> @62

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @3| +0#0000001#ffd7ff255|d|e|f|i|n|e| @8| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|j|u|m|p| @10| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|l|i|s|t| @10| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|p|l|a|c|e| @9| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#e0e0e08|u|n|d|e|f|i|n|e| @6| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|u|n|p|l|a|c|e| @7| +0#4040ff13#ffffff0@53
|:+0#0000000&|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
|~| @73
| +0#0000000&@74

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| |d|e|f|i|n|e|x> @61

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|[+1&&|N|o| |N|a|m|e|]| @65
|:+0#4040ff13&|s+0#af5f00255&|e|t| +0#0000000&|w+0#e000e06&|i|l|d|m|o|d|e|=+0#0000000&|l|o|n|g|e|s|t|,+0#af5f00255&|f+0#0000000&|u|l@1| @48
|:+0#4040ff13&|s+0#af5f00255&|e|t| +0#0000000&|w+0#e000e06&|i|l|d|m|o|d|e|=+0#0000000&|f|u|l@1| @56
|:+0#4040ff13&|s+0#af5f00255&|i|g|n| +0#0000000&|d|e|f|i|n|e| @62
|:+0#4040ff13&|s+0#af5f00255&|i|g|n| +0#0000000&|d|e|f|i|n|e> @62
|~+0#4040ff13&| @73
|~| @73
|[+3#0000000&|C|o|m@1|a|n|d| |L|i|n|e|]| @60
|Y+0#0000001#ffff4012|o|u| |d|i|s|c|o|v|e|r|e|d| |t|h|e| |c|o|m@1|a|n|d|-|l|i|n|e| |w|i|n|d|o|w|!| |Y|o|u| |c|a|n| |c|l|o|s|e| |i|t| |w|i|t|h| |"|:|q|"|.| +0#0000000#ffffff0@7

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @3| +0#0000001#ffd7ff255|u|n|d|e|f|i|n|e| @6| +0#4040ff13#ffffff0@53
|~| @3| +0#0000001#ffd7ff255|u|n|p|l|a|c|e| @7| +0#4040ff13#ffffff0@53
|:+0#0000000&|s|i|g|n| |u> @67

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
| +0#0000001#e0e0e08|b|u|f|d|o| @9| +0#4040ff13#ffffff0@58
| +0#0000001#ffd7ff255|b|u|f@1|e|r| @8| +0#4040ff13#ffffff0@58
| +0#0000001#ffd7ff255|b|u|f@1|e|r|s| @7| +0#4040ff13#ffffff0@58
| +0#0000001#ffd7ff255|b|u|n|l|o|a|d| @7| +0#4040ff13#ffffff0@58
|:+0#0000000&|b|u|f|d|o> @68

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|:+0#0000000&|b|u|f|d>o| @68

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| |d|e|f|i|n> @63

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

View File

@@ -0,0 +1,10 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|~| @73
|:+0#0000000&> @73

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| |x|y|z> @65

View File

@@ -1965,4 +1965,177 @@ func Test_suffixes_opt()
call delete('Xfile.o') call delete('Xfile.o')
endfunc endfunc
" Test for using a popup menu for the command line completion matches
" (wildoptions=pum)
func Test_wildmenu_pum()
CheckRunVimInTerminal
let commands =<< trim [CODE]
set wildmenu
set wildoptions=pum
set shm+=I
set noruler
set noshowcmd
[CODE]
call writefile(commands, 'Xtest')
let buf = RunVimInTerminal('-S Xtest', #{rows: 10})
call term_sendkeys(buf, ":sign \<Tab>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_01', {})
call term_sendkeys(buf, "\<Down>\<Down>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_02', {})
call term_sendkeys(buf, "\<C-N>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_03', {})
call term_sendkeys(buf, "\<C-P>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_04', {})
call term_sendkeys(buf, "\<Up>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_05', {})
" pressing <C-E> should end completion and go back to the original match
call term_sendkeys(buf, "\<C-E>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_06', {})
" pressing <C-Y> should select the current match and end completion
call term_sendkeys(buf, "\<Tab>\<C-P>\<C-P>\<C-Y>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_07', {})
" With 'wildmode' set to 'longest,full', completing a match should display
" the longest match, the wildmenu should not be displayed.
call term_sendkeys(buf, ":\<C-U>set wildmode=longest,full\<CR>")
call TermWait(buf)
call term_sendkeys(buf, ":sign u\<Tab>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_08', {})
" pressing <Tab> should display the wildmenu
call term_sendkeys(buf, "\<Tab>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_09', {})
" pressing <Tab> second time should select the next entry in the menu
call term_sendkeys(buf, "\<Tab>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_10', {})
call term_sendkeys(buf, ":\<C-U>set wildmode=full\<CR>")
" " showing popup menu in different columns in the cmdline
call term_sendkeys(buf, ":sign define \<Tab>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_11', {})
call term_sendkeys(buf, " \<Tab>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_12', {})
call term_sendkeys(buf, " \<Tab>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_13', {})
" Directory name completion
call mkdir('Xdir/XdirA/XdirB', 'p')
call writefile([], 'Xdir/XfileA')
call writefile([], 'Xdir/XdirA/XfileB')
call writefile([], 'Xdir/XdirA/XdirB/XfileC')
call term_sendkeys(buf, "\<C-U>e Xdi\<Tab>\<Tab>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_14', {})
" Pressing <Right> on a directory name should go into that directory
call term_sendkeys(buf, "\<Right>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_15', {})
" Pressing <Left> on a directory name should go to the parent directory
call term_sendkeys(buf, "\<Left>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_16', {})
" Pressing <C-A> when the popup menu is displayed should list all the
" matches and remove the popup menu
call term_sendkeys(buf, "\<C-U>sign \<Tab>\<C-A>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_17', {})
" Pressing <C-D> when the popup menu is displayed should remove the popup
" menu
call term_sendkeys(buf, "\<C-U>sign \<Tab>\<C-D>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_18', {})
" Pressing <S-Tab> should open the popup menu with the last entry selected
call term_sendkeys(buf, "\<C-U>\<CR>:sign \<S-Tab>\<C-P>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_19', {})
" Pressing <Esc> should close the popup menu and cancel the cmd line
call term_sendkeys(buf, "\<C-U>\<CR>:sign \<Tab>\<Esc>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_20', {})
" Typing a character when the popup is open, should close the popup
call term_sendkeys(buf, ":sign \<Tab>x")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_21', {})
" When the popup is open, entering the cmdline window should close the popup
call term_sendkeys(buf, "\<C-U>sign \<Tab>\<C-F>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_22', {})
call term_sendkeys(buf, ":q\<CR>")
" After the last popup menu item, <C-N> should show the original string
call term_sendkeys(buf, ":sign u\<Tab>\<C-N>\<C-N>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_23', {})
" Use the popup menu for the command name
call term_sendkeys(buf, "\<C-U>bu\<Tab>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_24', {})
" Pressing the left arrow should remove the popup menu
call term_sendkeys(buf, "\<Left>\<Left>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_25', {})
" Pressing <BS> should remove the popup menu and erase the last character
call term_sendkeys(buf, "\<C-E>\<C-U>sign \<Tab>\<BS>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_26', {})
" Pressing <C-W> should remove the popup menu and erase the previous word
call term_sendkeys(buf, "\<C-E>\<C-U>sign \<Tab>\<C-W>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_27', {})
" Pressing <C-U> should remove the popup menu and erase the entire line
call term_sendkeys(buf, "\<C-E>\<C-U>sign \<Tab>\<C-U>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_28', {})
" Using <C-E> to cancel the popup menu and then pressing <Up> should recall
" the cmdline from history
call term_sendkeys(buf, "sign xyz\<Esc>:sign \<Tab>\<C-E>\<Up>")
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_wildmenu_pum_29', {})
call term_sendkeys(buf, "\<C-U>\<CR>")
call StopVimInTerminal(buf)
call delete('Xtest')
call delete('Xdir', 'rf')
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -746,6 +746,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 */
/**/
4325,
/**/ /**/
4324, 4324,
/**/ /**/

View File

@@ -809,6 +809,8 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
#define WILD_ALL 6 #define WILD_ALL 6
#define WILD_LONGEST 7 #define WILD_LONGEST 7
#define WILD_ALL_KEEP 8 #define WILD_ALL_KEEP 8
#define WILD_CANCEL 9
#define WILD_APPLY 10
#define WILD_LIST_NOTFOUND 0x01 #define WILD_LIST_NOTFOUND 0x01
#define WILD_HOME_REPLACE 0x02 #define WILD_HOME_REPLACE 0x02