0
0
mirror of https://github.com/vim/vim.git synced 2025-07-04 23:07:33 -04:00

patch 9.1.1505: not possible to return completion type for :ex command

Problem:  not possible to return command-line completion type for :ex
          command
Solution: make getcmdcompltype() accept an optional and return the
          command-line completion for that arg (Shougo Matsushita).

closes: #17606

Signed-off-by: Shougo Matsushita <Shougo.Matsu@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Shougo Matsushita 2025-07-03 19:57:00 +02:00 committed by Christian Brabandt
parent 20eb68a8f2
commit 5d2354fc07
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
7 changed files with 68 additions and 29 deletions

View File

@ -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 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 getcharstr([{expr} [, {opts}]]) String get one character from the user
getcmdcomplpat() String return the completion pattern of the getcmdcomplpat() String return the completion pattern of the
current command-line completion current command-line completion
getcmdcompltype() String return the type of the current getcmdcompltype({pat}) String return the type of command-line
command-line completion completion
getcmdline() String return the current command-line input getcmdline() String return the current command-line input
getcmdpos() Number return cursor position in command-line getcmdpos() Number return cursor position in command-line
getcmdprompt() String return the current command-line prompt getcmdprompt() String return the current command-line prompt
@ -4201,10 +4201,11 @@ getcmdcomplpat() *getcmdcomplpat()*
Return type: |String| Return type: |String|
getcmdcompltype() *getcmdcompltype()* getcmdcompltype([{pat}]) *getcmdcompltype()*
Return the type of the current command-line completion. Return the type of command-line completion using {pat}.
Only works when the command line is being edited, thus If {pat} is omited, only works when the command line is being
requires use of |c_CTRL-\_e| or |c_CTRL-R_=|. edited, thus requires use of |c_CTRL-\_e| or |c_CTRL-R_=|.
See |:command-completion| for the return string. See |:command-completion| for the return string.
Also see |getcmdtype()|, |setcmdpos()|, |getcmdline()|, Also see |getcmdtype()|, |setcmdpos()|, |getcmdline()|,
|getcmdprompt()|, |getcmdcomplpat()| and |setcmdline()|. |getcmdprompt()|, |getcmdcomplpat()| and |setcmdline()|.

View File

@ -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 VIM USER MANUAL - by Bram Moolenaar
@ -1100,8 +1100,7 @@ Buffers, windows and the argument list:
Command line: *command-line-functions* Command line: *command-line-functions*
getcmdcomplpat() get completion pattern of the current command getcmdcomplpat() get completion pattern of the current command
line line
getcmdcompltype() get the type of the current command line getcmdcompltype() get the type of the command line completion
completion
getcmdline() get the current command line input getcmdline() get the current command line input
getcmdprompt() get the current command line prompt getcmdprompt() get the current command line prompt
getcmdpos() get position of the cursor in the command line getcmdpos() get position of the cursor in the command line

View File

@ -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 VIM REFERENCE MANUAL by Bram Moolenaar
@ -41607,6 +41607,8 @@ Completion: ~
- allow to complete directories from 'cdpath' for |:cd| and similar commands, - allow to complete directories from 'cdpath' for |:cd| and similar commands,
add the "cd_in_path" completion type for e.g. |:command-complete| and add the "cd_in_path" completion type for e.g. |:command-complete| and
|getcompletion()| |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 - allow to complete shell commands and files using the new shellcmdline
completion type using |:command-complete| and |getcmdcomplpat()| completion type using |:command-complete| and |getcmdcomplpat()|
- allow to specify additional attributes in the completion menu (allows to - allow to specify additional attributes in the completion menu (allows to

View File

@ -2264,7 +2264,7 @@ static funcentry_T global_functions[] =
ret_string, f_getcharstr}, ret_string, f_getcharstr},
{"getcmdcomplpat", 0, 0, 0, NULL, {"getcmdcomplpat", 0, 0, 0, NULL,
ret_string, f_getcmdcomplpat}, ret_string, f_getcmdcomplpat},
{"getcmdcompltype", 0, 0, 0, NULL, {"getcmdcompltype", 0, 1, FEARG_1, NULL,
ret_string, f_getcmdcompltype}, ret_string, f_getcmdcompltype},
{"getcmdline", 0, 0, 0, NULL, {"getcmdline", 0, 0, 0, NULL,
ret_string, f_getcmdline}, ret_string, f_getcmdline},

View File

@ -4306,25 +4306,16 @@ get_cmdline_completion_pattern(void)
* Get the current command-line completion type. * Get the current command-line completion type.
*/ */
static char_u * static char_u *
get_cmdline_completion(void) get_cmdline_completion(expand_T *xpc)
{ {
cmdline_info_T *p;
char_u *buffer;
int xp_context; int xp_context;
if (cmdline_star > 0) xp_context = xpc->xp_context;
return NULL;
p = get_ccline_ptr();
if (p == NULL || p->xpc == NULL)
return NULL;
xp_context = p->xpc->xp_context;
if (xp_context == EXPAND_NOTHING) if (xp_context == EXPAND_NOTHING)
{ {
set_expand_context(p->xpc); set_expand_context(xpc);
xp_context = p->xpc->xp_context; xp_context = xpc->xp_context;
p->xpc->xp_context = EXPAND_NOTHING; xpc->xp_context = EXPAND_NOTHING;
} }
if (xp_context == EXPAND_UNSUCCESSFUL) if (xp_context == EXPAND_UNSUCCESSFUL)
return NULL; return NULL;
@ -4335,10 +4326,12 @@ get_cmdline_completion(void)
if (xp_context == EXPAND_USER_LIST || xp_context == EXPAND_USER_DEFINED) 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) if (buffer == NULL)
return 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; return buffer;
} }
@ -4361,8 +4354,40 @@ f_getcmdcomplpat(typval_T *argvars UNUSED, typval_T *rettv)
void void
f_getcmdcompltype(typval_T *argvars UNUSED, typval_T *rettv) 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->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);
}
} }
/* /*

View File

@ -4589,4 +4589,14 @@ func Test_range_complete()
set wildcharm=0 set wildcharm=0
endfunc 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 " vim: shiftwidth=2 sts=2 expandtab

View File

@ -719,6 +719,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1505,
/**/ /**/
1504, 1504,
/**/ /**/