diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 00730a7c3e..8f9c7baa21 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.1. Last change: 2025 Jun 28 +*builtin.txt* For Vim version 9.1. Last change: 2025 Jul 03 VIM REFERENCE MANUAL by Bram Moolenaar @@ -238,8 +238,8 @@ getcharsearch() Dict last character search getcharstr([{expr} [, {opts}]]) String get one character from the user getcmdcomplpat() String return the completion pattern of the current command-line completion -getcmdcompltype() String return the type of the current - command-line completion +getcmdcompltype({pat}) String return the type of command-line + completion getcmdline() String return the current command-line input getcmdpos() Number return cursor position in command-line getcmdprompt() String return the current command-line prompt @@ -4201,10 +4201,11 @@ getcmdcomplpat() *getcmdcomplpat()* Return type: |String| -getcmdcompltype() *getcmdcompltype()* - Return the type of the current command-line completion. - Only works when the command line is being edited, thus - requires use of |c_CTRL-\_e| or |c_CTRL-R_=|. +getcmdcompltype([{pat}]) *getcmdcompltype()* + Return the type of command-line completion using {pat}. + If {pat} is omited, only works when the command line is being + edited, thus requires use of |c_CTRL-\_e| or |c_CTRL-R_=|. + See |:command-completion| for the return string. Also see |getcmdtype()|, |setcmdpos()|, |getcmdline()|, |getcmdprompt()|, |getcmdcomplpat()| and |setcmdline()|. diff --git a/runtime/doc/usr_41.txt b/runtime/doc/usr_41.txt index ffa6fcb7ae..9b8cdc2bea 100644 --- a/runtime/doc/usr_41.txt +++ b/runtime/doc/usr_41.txt @@ -1,4 +1,4 @@ -*usr_41.txt* For Vim version 9.1. Last change: 2025 Apr 27 +*usr_41.txt* For Vim version 9.1. Last change: 2025 Jul 03 VIM USER MANUAL - by Bram Moolenaar @@ -1100,8 +1100,7 @@ Buffers, windows and the argument list: Command line: *command-line-functions* getcmdcomplpat() get completion pattern of the current command line - getcmdcompltype() get the type of the current command line - completion + getcmdcompltype() get the type of the command line completion getcmdline() get the current command line input getcmdprompt() get the current command line prompt getcmdpos() get position of the cursor in the command line diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index f8ddb7f0bd..fcd3b9f343 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -1,4 +1,4 @@ -*version9.txt* For Vim version 9.1. Last change: 2025 Jun 28 +*version9.txt* For Vim version 9.1. Last change: 2025 Jul 03 VIM REFERENCE MANUAL by Bram Moolenaar @@ -41607,6 +41607,8 @@ Completion: ~ - allow to complete directories from 'cdpath' for |:cd| and similar commands, add the "cd_in_path" completion type for e.g. |:command-complete| and |getcompletion()| +- |getcompletion()| now accepts a pat and returns the completion type for the + {pat} argument - allow to complete shell commands and files using the new shellcmdline completion type using |:command-complete| and |getcmdcomplpat()| - allow to specify additional attributes in the completion menu (allows to diff --git a/src/evalfunc.c b/src/evalfunc.c index a31ad1341f..6ba698d566 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -2264,7 +2264,7 @@ static funcentry_T global_functions[] = ret_string, f_getcharstr}, {"getcmdcomplpat", 0, 0, 0, NULL, ret_string, f_getcmdcomplpat}, - {"getcmdcompltype", 0, 0, 0, NULL, + {"getcmdcompltype", 0, 1, FEARG_1, NULL, ret_string, f_getcmdcompltype}, {"getcmdline", 0, 0, 0, NULL, ret_string, f_getcmdline}, diff --git a/src/ex_getln.c b/src/ex_getln.c index 324f492db1..044f3894c9 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -4306,25 +4306,16 @@ get_cmdline_completion_pattern(void) * Get the current command-line completion type. */ static char_u * -get_cmdline_completion(void) +get_cmdline_completion(expand_T *xpc) { - cmdline_info_T *p; - char_u *buffer; int xp_context; - if (cmdline_star > 0) - return NULL; - - p = get_ccline_ptr(); - if (p == NULL || p->xpc == NULL) - return NULL; - - xp_context = p->xpc->xp_context; + xp_context = xpc->xp_context; if (xp_context == EXPAND_NOTHING) { - set_expand_context(p->xpc); - xp_context = p->xpc->xp_context; - p->xpc->xp_context = EXPAND_NOTHING; + set_expand_context(xpc); + xp_context = xpc->xp_context; + xpc->xp_context = EXPAND_NOTHING; } if (xp_context == EXPAND_UNSUCCESSFUL) return NULL; @@ -4335,10 +4326,12 @@ get_cmdline_completion(void) if (xp_context == EXPAND_USER_LIST || xp_context == EXPAND_USER_DEFINED) { - buffer = alloc(STRLEN(cmd_compl) + STRLEN(p->xpc->xp_arg) + 2); + char_u *buffer; + + buffer = alloc(STRLEN(cmd_compl) + STRLEN(xpc->xp_arg) + 2); if (buffer == NULL) return NULL; - sprintf((char *)buffer, "%s,%s", cmd_compl, p->xpc->xp_arg); + sprintf((char *)buffer, "%s,%s", cmd_compl, xpc->xp_arg); return buffer; } @@ -4361,8 +4354,40 @@ f_getcmdcomplpat(typval_T *argvars UNUSED, typval_T *rettv) void f_getcmdcompltype(typval_T *argvars UNUSED, typval_T *rettv) { + if (check_for_opt_string_arg(argvars, 0) == FAIL) + return; + rettv->v_type = VAR_STRING; - rettv->vval.v_string = get_cmdline_completion(); + + if (argvars[0].v_type != VAR_UNKNOWN) + { + char_u *pat; + expand_T xpc; + int cmdline_len; + + pat = tv_get_string(&argvars[0]); + ExpandInit(&xpc); + + cmdline_len = (int)STRLEN(pat); + set_cmd_context(&xpc, pat, cmdline_len, cmdline_len, FALSE); + xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern); + xpc.xp_col = cmdline_len; + + rettv->v_type = VAR_STRING; + rettv->vval.v_string = get_cmdline_completion(&xpc); + + ExpandCleanup(&xpc); + } + else + { + cmdline_info_T *p; + + p = get_ccline_ptr(); + if (cmdline_star > 0 || p == NULL || p->xpc == NULL) + return; + + rettv->vval.v_string = get_cmdline_completion(p->xpc); + } } /* diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim index 59c25db75f..9ebeb0f44a 100644 --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -4589,4 +4589,14 @@ func Test_range_complete() set wildcharm=0 endfunc +func Test_getcmdcompltype_with_pat() + call assert_fails('call getcmdcompltype({})', 'E1174:') + call assert_equal(getcmdcompltype(''), 'command') + call assert_equal(getcmdcompltype('dummy '), '') + call assert_equal(getcmdcompltype('cd '), 'dir_in_path') + call assert_equal(getcmdcompltype('let v:n'), 'var') + call assert_equal(getcmdcompltype('call tag'), 'function') + call assert_equal(getcmdcompltype('help '), 'help') +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 20243ac5db..48d9a44fe1 100644 --- a/src/version.c +++ b/src/version.c @@ -719,6 +719,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1505, /**/ 1504, /**/