]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.4325: 'wildmenu' only shows few matches v8.2.4325
authorYegappan Lakshmanan <yegappan@yahoo.com>
Tue, 8 Feb 2022 12:08:07 +0000 (12:08 +0000)
committerBram Moolenaar <Bram@vim.org>
Tue, 8 Feb 2022 12:08:07 +0000 (12:08 +0000)
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)

41 files changed:
runtime/doc/options.txt
src/cmdexpand.c
src/drawscreen.c
src/evalfunc.c
src/ex_getln.c
src/option.h
src/optionstr.c
src/popupmenu.c
src/proto/cmdexpand.pro
src/testdir/dumps/Test_wildmenu_pum_01.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_02.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_03.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_04.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_05.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_06.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_07.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_08.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_09.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_10.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_11.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_12.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_13.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_14.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_15.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_16.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_17.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_18.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_19.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_20.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_21.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_22.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_23.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_24.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_25.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_26.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_27.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_28.dump [new file with mode: 0644]
src/testdir/dumps/Test_wildmenu_pum_29.dump [new file with mode: 0644]
src/testdir/test_cmdline.vim
src/version.c
src/vim.h

index 732e5a74dda48dd4c50f0bdfe828092af471e554..ee2caa753081e7b832d8455556917a43f70b3266 100644 (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,
        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")
index b75903df98292357af9798f8785a85dc9bf550c8..b37c4f9acb0c47707df62eab1acfb988c2e7930b 100644 (file)
@@ -25,6 +25,16 @@ static int   expand_shellcmd(char_u *filepat, int *num_file, char_u ***file, int f
 #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
@@ -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;
@@ -553,6 +610,35 @@ showmatches(expand_T *xp, int wildmenu UNUSED)
        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)
     {
@@ -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
index 5b9619e9fac441dc8e2ac1b8bbb1cdcb5faaea2f..6cae313fa07889e1c321852e0a4941b3119d1bb9 100644 (file)
@@ -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)
        {
index b031369efd661c1413c74e7f3939905ce7d72000..db0d1ceedbfb67ff2d9cba4eb1e9703abdd080da 100644 (file)
@@ -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
 }
index 097b97eeb3e7a3645c252d6eee32adb5b00ec364..5def8a6a242706c68a211399f46191b31f412766 100644 (file)
@@ -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:
index c79eb0bdd73fb5e2f26f957864bd9ab863fb4453..ebbf94b069abcaa029ccba6a94642d2ce5542194 100644 (file)
@@ -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
index 8d74ba0d591e46e25f86e011678153124d019ba4..c8bef03099efae899a4839c590422e36038c76f9 100644 (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};
 #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
index cf5558b0743ce3b0b46337266f277829c44e52c0..cf2f2eff97e0087e11227a74327eebc55984fdcc 100644 (file)
@@ -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
index 1c4f95439484f2c7f828e5a6abfec1f4c4307dc6..b64c6bbdc64bddc70953306a15c19cfc396f8f1d 100644 (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);
 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 (file)
index 0000000..8c48229
--- /dev/null
@@ -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 (file)
index 0000000..f118df7
--- /dev/null
@@ -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 (file)
index 0000000..c3276ab
--- /dev/null
@@ -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 (file)
index 0000000..f118df7
--- /dev/null
@@ -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 (file)
index 0000000..1c3a2e8
--- /dev/null
@@ -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 (file)
index 0000000..4b60c57
--- /dev/null
@@ -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 (file)
index 0000000..20a39ab
--- /dev/null
@@ -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 (file)
index 0000000..7354738
--- /dev/null
@@ -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 (file)
index 0000000..2e8a0a1
--- /dev/null
@@ -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 (file)
index 0000000..9851b7c
--- /dev/null
@@ -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 (file)
index 0000000..4697c8a
--- /dev/null
@@ -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 (file)
index 0000000..d93631d
--- /dev/null
@@ -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 (file)
index 0000000..b2b1424
--- /dev/null
@@ -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 (file)
index 0000000..78da67f
--- /dev/null
@@ -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 (file)
index 0000000..fa4f50b
--- /dev/null
@@ -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 (file)
index 0000000..78da67f
--- /dev/null
@@ -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 (file)
index 0000000..5eef94d
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_18.dump b/src/testdir/dumps/Test_wildmenu_pum_18.dump
new file mode 100644 (file)
index 0000000..09b0b3e
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_19.dump b/src/testdir/dumps/Test_wildmenu_pum_19.dump
new file mode 100644 (file)
index 0000000..fa51c76
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_20.dump b/src/testdir/dumps/Test_wildmenu_pum_20.dump
new file mode 100644 (file)
index 0000000..99c2900
--- /dev/null
@@ -0,0 +1,10 @@
+> +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@74
diff --git a/src/testdir/dumps/Test_wildmenu_pum_21.dump b/src/testdir/dumps/Test_wildmenu_pum_21.dump
new file mode 100644 (file)
index 0000000..ca37931
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_22.dump b/src/testdir/dumps/Test_wildmenu_pum_22.dump
new file mode 100644 (file)
index 0000000..3fd00ad
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_23.dump b/src/testdir/dumps/Test_wildmenu_pum_23.dump
new file mode 100644 (file)
index 0000000..0bd6243
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_24.dump b/src/testdir/dumps/Test_wildmenu_pum_24.dump
new file mode 100644 (file)
index 0000000..f5767f7
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_25.dump b/src/testdir/dumps/Test_wildmenu_pum_25.dump
new file mode 100644 (file)
index 0000000..b7d117d
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_26.dump b/src/testdir/dumps/Test_wildmenu_pum_26.dump
new file mode 100644 (file)
index 0000000..30786c9
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_wildmenu_pum_27.dump b/src/testdir/dumps/Test_wildmenu_pum_27.dump
new file mode 100644 (file)
index 0000000..4b60c57
--- /dev/null
@@ -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_28.dump b/src/testdir/dumps/Test_wildmenu_pum_28.dump
new file mode 100644 (file)
index 0000000..910e224
--- /dev/null
@@ -0,0 +1,10 @@
+| +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|:+0#0000000&> @73
diff --git a/src/testdir/dumps/Test_wildmenu_pum_29.dump b/src/testdir/dumps/Test_wildmenu_pum_29.dump
new file mode 100644 (file)
index 0000000..7a82fce
--- /dev/null
@@ -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
index abd12467dd676a92ef39d23fb928b16ab5eabf00..7faf811dbd384535ec834a2e970f1ff2e696f8c3 100644 (file)
@@ -1965,4 +1965,177 @@ func Test_suffixes_opt()
   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
index cefbd4089f58f23ce71d0760f1ad2c43b8e57ad2..ff7f2f029154ad3677899afb461532b1581da23c 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4325,
 /**/
     4324,
 /**/
index 33d294c9f1ac130523070a233fa36f772453ffe3..67b4e33c1b48aee713e43f7f02291b996fe3f052 100644 (file)
--- a/src/vim.h
+++ b/src/vim.h
@@ -809,6 +809,8 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
 #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