changeset 32609:0da40da0bbaa v9.0.1636

patch 9.0.1636: expanding a pattern interferes with cmdline completion Commit: https://github.com/vim/vim/commit/094dd152fe1d47878ec6c0b3f54b03ffde7f4a2d Author: zeertzjq <zeertzjq@outlook.com> Date: Thu Jun 15 22:51:57 2023 +0100 patch 9.0.1636: expanding a pattern interferes with cmdline completion Problem: Expanding a pattern interferes with command line completion. Solution: Set the file index only when appropriate. (closes https://github.com/vim/vim/issues/12519)
author Bram Moolenaar <Bram@vim.org>
date Fri, 16 Jun 2023 00:00:03 +0200
parents 5782057ea5d4
children 01f925835f39
files src/cmdexpand.c src/testdir/test_cmdline.vim src/version.c
diffstat 3 files changed, 37 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/cmdexpand.c
+++ b/src/cmdexpand.c
@@ -957,7 +957,7 @@ ExpandOne(
     int		mode)
 {
     char_u	*ss = NULL;
-    static int	findex;
+    static int	findex;			// TODO: Move into expand_T
     static char_u *orig_save = NULL;	// kept value of orig
     int		orig_saved = FALSE;
     int		i;
@@ -971,8 +971,9 @@ ExpandOne(
     if (mode == WILD_CANCEL)
 	ss = vim_strsave(orig_save ? orig_save : (char_u *)"");
     else if (mode == WILD_APPLY)
-	ss = vim_strsave(findex == -1 ? (orig_save ?
-		    orig_save : (char_u *)"") : xp->xp_files[findex]);
+	ss = vim_strsave(findex == -1
+			    ? (orig_save ? orig_save : (char_u *)"")
+			    : xp->xp_files[findex]);
 
     // free old names
     if (xp->xp_numfiles != -1 && mode != WILD_ALL && mode != WILD_LONGEST)
@@ -985,7 +986,9 @@ ExpandOne(
 	if (compl_match_array != NULL)
 	    cmdline_pum_remove();
     }
-    findex = 0;
+    // TODO: Remove condition if "findex" is part of expand_T ?
+    if (mode != WILD_EXPAND_FREE && mode != WILD_ALL && mode != WILD_ALL_KEEP)
+	findex = 0;
 
     if (mode == WILD_FREE)	// only release file name
 	return NULL;
--- a/src/testdir/test_cmdline.vim
+++ b/src/testdir/test_cmdline.vim
@@ -1336,6 +1336,30 @@ func Test_cmdline_complete_various()
   call assert_equal('"py3file', @:)
 endfunc
 
+" Test that expanding a pattern doesn't interfere with cmdline completion.
+func Test_expand_during_cmdline_completion()
+  func ExpandStuff()
+    badd <script>:p:h/README.*
+    call assert_equal(expand('<script>:p:h') .. '/README.txt', bufname('$'))
+    $bwipe
+    call assert_equal('README.txt', expand('README.*'))
+    call assert_equal(['README.txt'], getcompletion('README.*', 'file'))
+  endfunc
+  augroup test_CmdlineChanged
+    autocmd!
+    autocmd CmdlineChanged * call ExpandStuff()
+  augroup END
+
+  call feedkeys(":sign \<Tab>\<Tab>\<Tab>\<Tab>\<C-B>\"\<CR>", 'xt')
+  call assert_equal('"sign place', @:)
+
+  augroup test_CmdlineChanged
+    au!
+  augroup END
+  augroup! test_CmdlineChanged
+  delfunc ExpandStuff
+endfunc
+
 " Test for 'wildignorecase'
 func Test_cmdline_wildignorecase()
   CheckUnix
@@ -1675,6 +1699,7 @@ func Test_cmd_bang_E135()
   augroup test_cmd_filter_E135
     au!
   augroup END
+  augroup! test_cmd_filter_E135
   %bwipe!
 endfunc
 
@@ -2134,7 +2159,7 @@ endfunc
 func Test_cmd_map_cmdlineChanged()
   let g:log = []
   cnoremap <F1> l<Cmd><CR>s
-  augroup test
+  augroup test_CmdlineChanged
     autocmd!
     autocmd CmdlineChanged : let g:log += [getcmdline()]
   augroup END
@@ -2150,9 +2175,10 @@ func Test_cmd_map_cmdlineChanged()
 
   unlet g:log
   cunmap <F1>
-  augroup test
+  augroup test_CmdlineChanged
     autocmd!
   augroup END
+  augroup! test_CmdlineChanged
 endfunc
 
 " Test for the 'suffixes' option
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1636,
+/**/
     1635,
 /**/
     1634,