]> granicus.if.org Git - vim/commitdiff
patch 8.2.0925: getcompletion() does not return command line arguments v8.2.0925
authorBram Moolenaar <Bram@vim.org>
Sun, 7 Jun 2020 16:45:14 +0000 (18:45 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 7 Jun 2020 16:45:14 +0000 (18:45 +0200)
Problem:    Getcompletion() does not return command line arguments.
Solution:   Add the "cmdline" option. (Shougo, closes #1140)

runtime/doc/eval.txt
src/cmdexpand.c
src/testdir/test_cmdline.vim
src/version.c

index 52994f1179ad912629695f213df61a2fe742bbfe..94fc497886a0e97632bd00fd0f604c17324188a8 100644 (file)
@@ -5112,6 +5112,7 @@ getcompletion({pat}, {type} [, {filtered}])               *getcompletion()*
                behave          :behave suboptions
                color           color schemes
                command         Ex command (and arguments)
+               cmdline         |cmdline-completion| result
                compiler        compilers
                cscope          |:cscope| suboptions
                diff_buffer     |:diffget| and |:diffput| completion
@@ -5142,14 +5143,19 @@ getcompletion({pat}, {type} [, {filtered}])             *getcompletion()*
                user            user names
                var             user variables
 
-               If {pat} is an empty string, then all the matches are returned.
-               Otherwise only items matching {pat} are returned. See
-               |wildcards| for the use of special characters in {pat}.
+               If {pat} is an empty string, then all the matches are
+               returned.  Otherwise only items matching {pat} are returned.
+               See |wildcards| for the use of special characters in {pat}.
 
                If the optional {filtered} flag is set to 1, then 'wildignore'
                is applied to filter the results.  Otherwise all the matches
                are returned. The 'wildignorecase' option always applies.
 
+               If {type} is "cmdline", then the |cmdline-completion| result is
+               returned.  For example, to complete the possible values after
+               a ":call" command: >
+                       echo getcompletion('call ', 'cmdline')
+<
                If there are no matches, an empty list is returned.  An
                invalid value for {type} produces an error.
 
index 3a2b10c5a78526065562e3b7039a638fdb8f2b9c..f84bf7abc686f2f9f37a88d33e744a04e187daa3 100644 (file)
@@ -2675,10 +2675,18 @@ globpath(
 f_getcompletion(typval_T *argvars, typval_T *rettv)
 {
     char_u     *pat;
+    char_u     *type;
     expand_T   xpc;
     int                filtered = FALSE;
     int                options = WILD_SILENT | WILD_USE_NL | WILD_ADD_SLASH
-                                       | WILD_NO_BEEP;
+                                                               | WILD_NO_BEEP;
+
+    if (argvars[1].v_type != VAR_STRING)
+    {
+       semsg(_(e_invarg2), "type must be a string");
+       return;
+    }
+    type = tv_get_string(&argvars[1]);
 
     if (argvars[2].v_type != VAR_UNKNOWN)
        filtered = tv_get_number_chk(&argvars[2], NULL);
@@ -2691,39 +2699,45 @@ f_getcompletion(typval_T *argvars, typval_T *rettv)
        options |= WILD_KEEP_ALL;
 
     ExpandInit(&xpc);
-    xpc.xp_pattern = tv_get_string(&argvars[0]);
-    xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
-    xpc.xp_context = cmdcomplete_str_to_type(tv_get_string(&argvars[1]));
-    if (xpc.xp_context == EXPAND_NOTHING)
+    if (STRCMP(type, "cmdline") == 0)
     {
-       if (argvars[1].v_type == VAR_STRING)
-           semsg(_(e_invarg2), argvars[1].vval.v_string);
-       else
-           emsg(_(e_invarg));
-       return;
+       set_one_cmd_context(&xpc, tv_get_string(&argvars[0]));
+       xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
     }
-
-# if defined(FEAT_MENU)
-    if (xpc.xp_context == EXPAND_MENUS)
+    else
     {
-       set_context_in_menu_cmd(&xpc, (char_u *)"menu", xpc.xp_pattern, FALSE);
+       xpc.xp_pattern = tv_get_string(&argvars[0]);
        xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
-    }
+
+       xpc.xp_context = cmdcomplete_str_to_type(type);
+       if (xpc.xp_context == EXPAND_NOTHING)
+       {
+           semsg(_(e_invarg2), type);
+           return;
+       }
+
+# if defined(FEAT_MENU)
+       if (xpc.xp_context == EXPAND_MENUS)
+       {
+           set_context_in_menu_cmd(&xpc, (char_u *)"menu", xpc.xp_pattern, FALSE);
+           xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
+       }
 # endif
 # ifdef FEAT_CSCOPE
-    if (xpc.xp_context == EXPAND_CSCOPE)
-    {
-       set_context_in_cscope_cmd(&xpc, xpc.xp_pattern, CMD_cscope);
-       xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
-    }
+       if (xpc.xp_context == EXPAND_CSCOPE)
+       {
+           set_context_in_cscope_cmd(&xpc, xpc.xp_pattern, CMD_cscope);
+           xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
+       }
 # endif
 # ifdef FEAT_SIGNS
-    if (xpc.xp_context == EXPAND_SIGN)
-    {
-       set_context_in_sign_cmd(&xpc, xpc.xp_pattern);
-       xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
-    }
+       if (xpc.xp_context == EXPAND_SIGN)
+       {
+           set_context_in_sign_cmd(&xpc, xpc.xp_pattern);
+           xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
+       }
 # endif
+    }
 
     pat = addstar(xpc.xp_pattern, xpc.xp_pattern_len, xpc.xp_context);
     if ((rettv_list_alloc(rettv) != FAIL) && (pat != NULL))
index 81350aa645c71a9fee4c68535b4d616fba265025..1d3f27562da2832e296a2b713575062b37009763 100644 (file)
@@ -355,6 +355,20 @@ func Test_getcompletion()
     call assert_equal(['Testing'], l)
   endif
 
+  " Command line completion tests
+  let l = getcompletion('cd ', 'cmdline')
+  call assert_true(index(l, 'samples/') >= 0)
+  let l = getcompletion('cd NoMatch', 'cmdline')
+  call assert_equal([], l)
+  let l = getcompletion('let v:n', 'cmdline')
+  call assert_true(index(l, 'v:null') >= 0)
+  let l = getcompletion('let v:notexists', 'cmdline')
+  call assert_equal([], l)
+  let l = getcompletion('call tag', 'cmdline')
+  call assert_true(index(l, 'taglist(') >= 0)
+  let l = getcompletion('call paint', 'cmdline')
+  call assert_equal([], l)
+
   " For others test if the name is recognized.
   let names = ['buffer', 'environment', 'file_in_path', 'mapping', 'tag', 'tag_listfiles', 'user']
   if has('cmdline_hist')
@@ -379,7 +393,7 @@ func Test_getcompletion()
   set tags&
 
   call assert_fails('call getcompletion("", "burp")', 'E475:')
-  call assert_fails('call getcompletion("abc", [])', 'E474:')
+  call assert_fails('call getcompletion("abc", [])', 'E475:')
 endfunc
 
 func Test_shellcmd_completion()
index 9e4993ddae012117270ed46a031b60998d2fff13..bfe94cf85161350fc75ec1fe268a47bd155ef19e 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    925,
 /**/
     924,
 /**/