summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2022-02-08 12:08:07 +0000
committerBram Moolenaar <Bram@vim.org>2022-02-08 12:08:07 +0000
commit3908ef5017a6b4425727013588f72cc7343199b9 (patch)
treee70cbd04c972b1566a45e8536210e1334e1b0373
parent3787f26c2ed33732a36f26ebe46faeebfe0151af (diff)
patch 8.2.4325: 'wildmenu' only shows few matchesv8.2.4325
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)
-rw-r--r--runtime/doc/options.txt31
-rw-r--r--src/cmdexpand.c109
-rw-r--r--src/drawscreen.c4
-rw-r--r--src/evalfunc.c2
-rw-r--r--src/ex_getln.c55
-rw-r--r--src/option.h5
-rw-r--r--src/optionstr.c2
-rw-r--r--src/popupmenu.c10
-rw-r--r--src/proto/cmdexpand.pro5
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_01.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_02.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_03.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_04.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_05.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_06.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_07.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_08.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_09.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_10.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_11.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_12.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_13.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_14.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_15.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_16.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_17.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_18.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_19.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_20.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_21.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_22.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_23.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_24.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_25.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_26.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_27.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_28.dump10
-rw-r--r--src/testdir/dumps/Test_wildmenu_pum_29.dump10
-rw-r--r--src/testdir/test_cmdline.vim173
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h2
41 files changed, 673 insertions, 17 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 732e5a74dd..ee2caa7530 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -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,
the possible matches are shown just above the command line, with the
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.
When 'wildmode' is used, "wildmenu" mode is used where "full" is
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
the right and/or a "<" is shown on the left. The status line scrolls
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
for selecting a completion.
- While the "wildmenu" is active the following keys have special
- meanings:
+ While the "wildmenu" is active, not using the popup menu, the
+ following keys have special meanings:
<Left> <Right> - select previous/next match (like CTRL-P/CTRL-N)
<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
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|.
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
{not available when compiled without the |+wildignore|
feature}
- A list of words that change how command line completion is done.
- Currently only one word is allowed:
+ A list of words that change how |cmdline-completion| is done.
+ 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
tag and the file of the tag is listed. Only one match
is displayed per line. Often used tag kinds are:
d #define
f function
- Also see |cmdline-completion|.
*'winaltkeys'* *'wak'*
'winaltkeys' 'wak' string (default "menu")
diff --git a/src/cmdexpand.c b/src/cmdexpand.c
index b75903df98..b37c4f9acb 100644
--- a/src/cmdexpand.c
+++ b/src/cmdexpand.c
@@ -27,6 +27,16 @@ static int ExpandUserDefined(expand_T *xp, regmatch_T *regmatch, int *num_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
+
static int
sort_func_compare(const void *s1, const void *s2)
{
@@ -245,6 +255,42 @@ nextwild(
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'.
* Chars that should not be expanded must be preceded with a backslash.
@@ -327,7 +373,12 @@ ExpandOne(
findex = -1;
}
#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,
findex, cmd_showtail);
#endif
@@ -339,6 +390,12 @@ ExpandOne(
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
if (xp->xp_numfiles != -1 && mode != WILD_ALL && mode != WILD_LONGEST)
{
@@ -351,7 +408,7 @@ ExpandOne(
if (mode == WILD_FREE) // only release file name
return NULL;
- if (xp->xp_numfiles == -1)
+ if (xp->xp_numfiles == -1 && mode != WILD_APPLY && mode != WILD_CANCEL)
{
vim_free(orig_save);
orig_save = orig;
@@ -554,6 +611,35 @@ showmatches(expand_T *xp, int wildmenu UNUSED)
}
#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
if (!wildmenu)
{
#endif
@@ -1500,7 +1586,7 @@ set_one_cmd_context(
case CMD_tjump:
case CMD_stjump:
case CMD_ptjump:
- if (*p_wop != NUL)
+ if (vim_strchr(p_wop, WOP_TAGFILE) != NULL)
xp->xp_context = EXPAND_TAGS_LISTFILES;
else
xp->xp_context = EXPAND_TAGS;
@@ -2639,6 +2725,22 @@ wildmenu_translate_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 (c == K_LEFT)
@@ -2646,6 +2748,7 @@ wildmenu_translate_key(
else if (c == K_RIGHT)
c = Ctrl_N;
}
+
// Hitting CR after "emenu Name.": complete submenu
if (xp->xp_context == EXPAND_MENUNAMES && p_wmnu
&& cclp->cmdpos > 1
diff --git a/src/drawscreen.c b/src/drawscreen.c
index 5b9619e9fa..6cae313fa0 100644
--- a/src/drawscreen.c
+++ b/src/drawscreen.c
@@ -3048,6 +3048,10 @@ redraw_after_callback(int call_update_screen, int do_message)
}
else if (State & CMDLINE)
{
+#ifdef FEAT_WILDMENU
+ if (pum_visible())
+ cmdline_pum_display();
+#endif
// Don't redraw when in prompt_for_number().
if (cmdline_row > 0)
{
diff --git a/src/evalfunc.c b/src/evalfunc.c
index b031369efd..db0d1ceedb 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -10336,7 +10336,7 @@ f_visualmode(typval_T *argvars, typval_T *rettv)
f_wildmenumode(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
{
#ifdef FEAT_WILDMENU
- if (wild_menu_showing)
+ if (wild_menu_showing || ((State & CMDLINE) && cmdline_pum_active()))
rettv->vval.v_number = 1;
#endif
}
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 097b97eeb3..5def8a6a24 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -924,9 +924,18 @@ cmdline_wildchar_complete(
// if 'wildmode' contains "list" may still need to list
if (xp->xp_numfiles > 1
&& !*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);
+#endif
redrawcmd();
*did_wild_list = TRUE;
}
@@ -1848,6 +1857,23 @@ getcmdline_int(
#ifdef FEAT_WILDMENU
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
// 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_L)
{
+#ifdef FEAT_WILDMENU
+ cmdline_pum_remove();
+#endif
(void)ExpandOne(&xpc, NULL, NULL, 0, WILD_FREE);
did_wild_list = FALSE;
#ifdef FEAT_WILDMENU
@@ -1950,10 +1979,19 @@ getcmdline_int(
// <S-Tab> goes to last match, in a clumsy way
if (c == K_S_TAB && KeyTyped)
{
- if (nextwild(&xpc, WILD_EXPAND_KEEP, 0, firstc != '@') == OK
- && nextwild(&xpc, WILD_PREV, 0, firstc != '@') == OK
- && nextwild(&xpc, WILD_PREV, 0, firstc != '@') == OK)
- goto cmdline_changed;
+ if (nextwild(&xpc, WILD_EXPAND_KEEP, 0, firstc != '@') == OK)
+ {
+#ifdef FEAT_WILDMENU
+ // 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
@@ -2222,6 +2260,13 @@ getcmdline_int(
case Ctrl_A: // all matches
if (nextwild(&xpc, WILD_ALL, 0, firstc != '@') == FAIL)
break;
+#ifdef FEAT_WILDMENU
+ if (cmdline_pum_active())
+ {
+ cmdline_pum_cleanup(&ccline);
+ xpc.xp_context = EXPAND_NOTHING;
+ }
+#endif
goto cmdline_changed;
case Ctrl_L:
diff --git a/src/option.h b/src/option.h
index c79eb0bdd7..ebbf94b069 100644
--- a/src/option.h
+++ b/src/option.h
@@ -356,6 +356,11 @@ typedef enum {
#define WIM_LIST 0x04
#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()
// each defined char should be unique over all values
// except for BS_START, that intentionally also matches BS_NOSTOP
diff --git a/src/optionstr.c b/src/optionstr.c
index 8d74ba0d59..c8bef03099 100644
--- a/src/optionstr.c
+++ b/src/optionstr.c
@@ -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};
#endif
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
static char *(p_wak_values[]) = {"yes", "menu", "no", NULL};
#endif
diff --git a/src/popupmenu.c b/src/popupmenu.c
index cf5558b074..cf2f2eff97 100644
--- a/src/popupmenu.c
+++ b/src/popupmenu.c
@@ -116,7 +116,10 @@ pum_display(
// Remember the essential parts of the window position and size, so we
// can decide when to reposition the popup menu.
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_col = curwin->w_wincol;
pum_win_wcol = curwin->w_wcol;
@@ -215,6 +218,11 @@ pum_display(
max_width = pum_base_width;
// Calculate column
+#ifdef FEAT_WILDMENU
+ if (State == CMDLINE)
+ cursor_col = cmdline_compl_startcol();
+ else
+#endif
#ifdef FEAT_RIGHTLEFT
if (curwin->w_p_rl)
cursor_col = curwin->w_wincol + curwin->w_width
diff --git a/src/proto/cmdexpand.pro b/src/proto/cmdexpand.pro
index 1c4f954394..b64c6bbdc6 100644
--- a/src/proto/cmdexpand.pro
+++ b/src/proto/cmdexpand.pro
@@ -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);
void ExpandInit(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);
char_u *sm_gettail(char_u *s);
char_u *addstar(char_u *fname, int len, int context);
diff --git a/src/testdir/dumps/Test_wildmenu_pum_01.dump b/src/testdir/dumps/Test_wildmenu_pum_01.dump
new file mode 100644
index 0000000000..8c48229949
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_01.dump
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_02.dump b/src/testdir/dumps/Test_wildmenu_pum_02.dump
new file mode 100644
index 0000000000..f118df78e1
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_02.dump
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_03.dump b/src/testdir/dumps/Test_wildmenu_pum_03.dump
new file mode 100644
index 0000000000..c3276ab387
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_03.dump
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_04.dump b/src/testdir/dumps/Test_wildmenu_pum_04.dump
new file mode 100644
index 0000000000..f118df78e1
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_04.dump
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_05.dump b/src/testdir/dumps/Test_wildmenu_pum_05.dump
new file mode 100644
index 0000000000..1c3a2e885a
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_05.dump
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_06.dump b/src/testdir/dumps/Test_wildmenu_pum_06.dump
new file mode 100644
index 0000000000..4b60c5745f
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_06.dump
@@ -0,0 +1,10 @@
+| +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|:+0#0000000&|s|i|g|n| > @68
diff --git a/src/testdir/dumps/Test_wildmenu_pum_07.dump b/src/testdir/dumps/Test_wildmenu_pum_07.dump
new file mode 100644
index 0000000000..20a39ab3ff
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_07.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|p|l|a|c|e> @61
diff --git a/src/testdir/dumps/Test_wildmenu_pum_08.dump b/src/testdir/dumps/Test_wildmenu_pum_08.dump
new file mode 100644
index 0000000000..73547387eb
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_08.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_09.dump b/src/testdir/dumps/Test_wildmenu_pum_09.dump
new file mode 100644
index 0000000000..2e8a0a16b3
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_09.dump
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_10.dump b/src/testdir/dumps/Test_wildmenu_pum_10.dump
new file mode 100644
index 0000000000..9851b7ce3f
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_10.dump
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_11.dump b/src/testdir/dumps/Test_wildmenu_pum_11.dump
new file mode 100644
index 0000000000..4697c8a562
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_11.dump
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_12.dump b/src/testdir/dumps/Test_wildmenu_pum_12.dump
new file mode 100644
index 0000000000..d93631de77
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_12.dump
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_13.dump b/src/testdir/dumps/Test_wildmenu_pum_13.dump
new file mode 100644
index 0000000000..b2b1424f56
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_13.dump
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_14.dump b/src/testdir/dumps/Test_wildmenu_pum_14.dump
new file mode 100644
index 0000000000..78da67f409
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_14.dump
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_15.dump b/src/testdir/dumps/Test_wildmenu_pum_15.dump
new file mode 100644
index 0000000000..fa4f50b2f6
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_15.dump
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_16.dump b/src/testdir/dumps/Test_wildmenu_pum_16.dump
new file mode 100644
index 0000000000..78da67f409
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_16.dump
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_17.dump b/src/testdir/dumps/Test_wildmenu_pum_17.dump
new file mode 100644
index 0000000000..5eef94d82a
--- /dev/null
+++ b/src/testdir/dumps/Test_wildmenu_pum_17.dump
@@ -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|