To: vim_dev@googlegroups.com Subject: Patch 8.2.0925 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@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 ///