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)
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.
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
<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
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")
#if defined(FEAT_EVAL)
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);
+#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
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.
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
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)
{
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;
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
if (!wildmenu)
{
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;
{
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)
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
}
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)
{
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
}
// 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;
}
#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
&& 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
// <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
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:
#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
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
// 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;
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
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);
--- /dev/null
+| +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
--- /dev/null
+| +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
--- /dev/null
+| +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
--- /dev/null
+| +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
--- /dev/null
+| +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
--- /dev/null
+| +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|:+0#0000000&|s|i|g|n| > @68
--- /dev/null
+| +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
--- /dev/null
+| +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|:+0#0000000&|s|i|g|n| |u|n> @66
--- /dev/null
+| +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
--- /dev/null
+| +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
--- /dev/null
+| +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
--- /dev/null
+| +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
--- /dev/null
+| +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
--- /dev/null
+| +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
--- /dev/null
+| +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
--- /dev/null
+| +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
--- /dev/null
+| +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
--- /dev/null
+|~+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
--- /dev/null
+| +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
--- /dev/null
+> +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@74
--- /dev/null
+| +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
--- /dev/null
+| +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
--- /dev/null
+| +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
--- /dev/null
+| +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
--- /dev/null
+| +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|:+0#0000000&|b|u|f|d>o| @68
--- /dev/null
+| +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
--- /dev/null
+| +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|:+0#0000000&|s|i|g|n| > @68
--- /dev/null
+| +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|:+0#0000000&> @73
--- /dev/null
+| +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|:+0#0000000&|s|i|g|n| |x|y|z> @65
call delete('Xfile.o')
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
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 4325,
/**/
4324,
/**/
#define WILD_ALL 6
#define WILD_LONGEST 7
#define WILD_ALL_KEEP 8
+#define WILD_CANCEL 9
+#define WILD_APPLY 10
#define WILD_LIST_NOTFOUND 0x01
#define WILD_HOME_REPLACE 0x02