Commit: patch 9.1.0498: getcmdcompltype() interferes with cmdline completion

2 views
Skip to first unread message

Christian Brabandt

unread,
2:45 PM (7 hours ago) 2:45 PM
to vim...@googlegroups.com
patch 9.1.0498: getcmdcompltype() interferes with cmdline completion

Commit: https://github.com/vim/vim/commit/a821b609f9bb9daef032fe1cb8fb95995822e367
Author: zeertzjq <zeer...@outlook.com>
Date: Tue Jun 18 20:31:08 2024 +0200

patch 9.1.0498: getcmdcompltype() interferes with cmdline completion

Problem: getcmdcompltype() interferes with cmdline completion.
Solution: Don't set expand context when it's already set.
(zeertzjq)

closes: #15036

Signed-off-by: zeertzjq <zeer...@outlook.com>
Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/ex_getln.c b/src/ex_getln.c
index 3ae4958f8..3444a0e86 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -4176,6 +4176,7 @@ get_cmdline_completion(void)
{
cmdline_info_T *p;
char_u *buffer;
+ int xp_context;

if (cmdline_star > 0)
return NULL;
@@ -4184,15 +4185,21 @@ get_cmdline_completion(void)
if (p == NULL || p->xpc == NULL)
return NULL;

- set_expand_context(p->xpc);
- if (p->xpc->xp_context == EXPAND_UNSUCCESSFUL)
+ xp_context = p->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;
+ }
+ if (xp_context == EXPAND_UNSUCCESSFUL)
return NULL;

- char_u *cmd_compl = cmdcomplete_type_to_str(p->xpc->xp_context);
+ char_u *cmd_compl = cmdcomplete_type_to_str(xp_context);
if (cmd_compl == NULL)
return NULL;

- if (p->xpc->xp_context == EXPAND_USER_LIST || p->xpc->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);
if (buffer == NULL)
diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim
index 8b7489ea4..8651a9dbb 100644
--- a/src/testdir/test_cmdline.vim
+++ b/src/testdir/test_cmdline.vim
@@ -3612,7 +3612,7 @@ func Test_cmdline_complete_bang_cmd_argument()
endfunc

func Call_cmd_funcs()
- return string([getcmdpos(), getcmdscreenpos(), getcmdcompltype()])
+ return [getcmdpos(), getcmdscreenpos(), getcmdcompltype()]
endfunc

func Test_screenpos_and_completion()
@@ -3620,13 +3620,24 @@ func Test_screenpos_and_completion()
call assert_equal(0, getcmdscreenpos())
call assert_equal('', getcmdcompltype())

- cnoremap <expr> <F2> string([getcmdpos(), getcmdscreenpos(), getcmdcompltype()])
+ cnoremap <expr> <F2> string(Call_cmd_funcs())
call feedkeys(":let a\<F2>\<C-B>\"\<CR>", "xt")
call assert_equal("\"let a[6, 7, 'var']", @:)
call feedkeys(":quit \<F2>\<C-B>\"\<CR>", "xt")
call assert_equal("\"quit [6, 7, '']", @:)
call feedkeys(":nosuchcommand \<F2>\<C-B>\"\<CR>", "xt")
call assert_equal("\"nosuchcommand [15, 16, '']", @:)
+
+ " Check that getcmdcompltype() doesn't interfere with cmdline completion.
+ let g:results = []
+ cnoremap <F2> <Cmd>let g:results += [[getcmdline()] + Call_cmd_funcs()]<CR>
+ call feedkeys(":sign un\<Tab>\<F2>\<Tab>\<F2>\<Tab>\<F2>\<C-C>", "xt")
+ call assert_equal([
+ \ ['sign undefine', 14, 15, 'sign'],
+ \ ['sign unplace', 13, 14, 'sign'],
+ \ ['sign un', 8, 9, 'sign']], g:results)
+
+ unlet g:results
cunmap <F2>
endfunc

diff --git a/src/version.c b/src/version.c
index 817410476..7f84d9dfd 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 498,
/**/
497,
/**/
Reply all
Reply to author
Forward
0 new messages