commit 3d126ec89f230bcdbb560783ba4ad21a708c974b
parent 07d60e8f195c4d17ee860ebb50b80043c2cb1f84
Author: zeertzjq <zeertzjq@outlook.com>
Date: Thu, 24 Apr 2025 06:45:49 +0800
vim-patch:9.1.1338: Calling expand() interferes with cmdcomplete_info()
Problem: Calling expand() interferes with cmdcomplete_info()
(after 9.1.1329).
Solution: Only clear cmdline_orig when starting/ending cmdline mode
(zeertzjq).
closes: vim/vim#17192
https://github.com/vim/vim/commit/ec270a5f5554c62517246281afb547b5c2fe65af
Diffstat:
3 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/src/nvim/cmdexpand.c b/src/nvim/cmdexpand.c
@@ -970,7 +970,6 @@ void ExpandInit(expand_T *xp)
xp->xp_backslash = XP_BS_NONE;
xp->xp_prefix = XP_PREFIX_NONE;
xp->xp_numfiles = -1;
- XFREE_CLEAR(cmdline_orig);
}
/// Cleanup an expand structure after use.
@@ -983,6 +982,11 @@ void ExpandCleanup(expand_T *xp)
XFREE_CLEAR(xp->xp_orig);
}
+void clear_cmdline_orig(void)
+{
+ XFREE_CLEAR(cmdline_orig);
+}
+
/// Display one line of completion matches. Multiple matches are displayed in
/// each line (used by wildmode=list and CTRL-D)
///
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c
@@ -745,6 +745,7 @@ static uint8_t *command_line_enter(int firstc, int count, int indent, bool clear
ExpandInit(&s->xpc);
ccline.xpc = &s->xpc;
+ clear_cmdline_orig();
cmdmsg_rl = (curwin->w_p_rl && *curwin->w_p_rlc == 's'
&& (s->firstc == '/' || s->firstc == '?'));
@@ -901,6 +902,7 @@ static uint8_t *command_line_enter(int firstc, int count, int indent, bool clear
ExpandCleanup(&s->xpc);
ccline.xpc = NULL;
+ clear_cmdline_orig();
finish_incsearch_highlighting(s->gotesc, &s->is_state, false);
diff --git a/test/old/testdir/test_cmdline.vim b/test/old/testdir/test_cmdline.vim
@@ -4287,10 +4287,12 @@ func Test_cd_bslash_completion_windows()
let &shellslash = save_shellslash
endfunc
-" Testg cmdcomplete_info() with CmdlineLeavePre autocmd
+" Test cmdcomplete_info() with CmdlineLeavePre autocmd
func Test_cmdcomplete_info()
augroup test_CmdlineLeavePre
autocmd!
+ " Calling expand() should not interfere with cmdcomplete_info().
+ autocmd CmdlineLeavePre * call expand('test_cmdline.*')
autocmd CmdlineLeavePre * let g:cmdcomplete_info = string(cmdcomplete_info())
augroup END
new