Patch 8.2.0925
Problem: Getcompletion() does not return command line arguments.
Solution: Add the "cmdline" option. (Shougo, closes #1140)
Files: runtime/doc/eval.txt, src/cmdexpand.c,
src/testdir/test_cmdline.vim
*** ../vim-8.2.0924/runtime/doc/eval.txt 2020-06-07 18:16:31.307293302 +0200
--- runtime/doc/eval.txt 2020-06-07 18:26:24.937198831 +0200
***************
*** 5104,5109 ****
--- 5112,5118 ----
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
***************
*** 5134,5147 ****
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 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 there are no matches, an empty list is returned. An
invalid value for {type} produces an error.
--- 5143,5161 ----
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 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.
*** ../vim-8.2.0924/src/cmdexpand.c 2020-04-02 21:13:21.392362410 +0200
--- src/cmdexpand.c 2020-06-07 18:36:55.083032803 +0200
***************
*** 2675,2684 ****
f_getcompletion(typval_T *argvars, typval_T *rettv)
{
char_u *pat;
expand_T xpc;
int filtered = FALSE;
int options = WILD_SILENT | WILD_USE_NL | WILD_ADD_SLASH
! | WILD_NO_BEEP;
if (argvars[2].v_type != VAR_UNKNOWN)
filtered = tv_get_number_chk(&argvars[2], NULL);
--- 2675,2692 ----
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;
!
! 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,2729 ****
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 (argvars[1].v_type == VAR_STRING)
! semsg(_(e_invarg2), argvars[1].vval.v_string);
! else
! emsg(_(e_invarg));
! 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);
! }
# 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);
! }
# endif
pat = addstar(xpc.xp_pattern, xpc.xp_pattern_len, xpc.xp_context);
if ((rettv_list_alloc(rettv) != FAIL) && (pat != NULL))
--- 2699,2743 ----
options |= WILD_KEEP_ALL;
ExpandInit(&xpc);
! if (STRCMP(type, "cmdline") == 0)
{
! set_one_cmd_context(&xpc, tv_get_string(&argvars[0]));
! xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
}
! else
{
! 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);
! }
# 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);
! }
# endif
+ }
pat = addstar(xpc.xp_pattern, xpc.xp_pattern_len, xpc.xp_context);
if ((rettv_list_alloc(rettv) != FAIL) && (pat != NULL))
*** ../vim-8.2.0924/src/testdir/test_cmdline.vim 2020-06-07 17:30:28.716850169 +0200
--- src/testdir/test_cmdline.vim 2020-06-07 18:37:34.950897019 +0200
***************
*** 355,360 ****
--- 355,374 ----
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,385 ****
set tags&
call assert_fails('call getcompletion("", "burp")', 'E475:')
! call assert_fails('call getcompletion("abc", [])', 'E474:')
endfunc
func Test_shellcmd_completion()
--- 393,399 ----
set tags&
call assert_fails('call getcompletion("", "burp")', 'E475:')
! call assert_fails('call getcompletion("abc", [])', 'E475:')
endfunc
func Test_shellcmd_completion()
*** ../vim-8.2.0924/src/version.c 2020-06-07 18:16:31.311293288 +0200
--- src/version.c 2020-06-07 18:24:42.449556884 +0200
***************
*** 756,757 ****
--- 756,759 ----
{ /* Add new patch number below this line */
+ /**/
+ 925,
/**/
--
Eight Megabytes And Continually Swapping.
/// Bram Moolenaar -- Br...@Moolenaar.net --
http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features --
http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language --
http://www.Zimbu.org ///
\\\ help me help AIDS victims --
http://ICCF-Holland.org ///