changeset 27899:5426a1d3f12d v8.2.4475

patch 8.2.4475: fuzzy cmdline completion does not work for lower case Commit: https://github.com/vim/vim/commit/4df5b33f206210fec2a0297aea27e7db8b5173c0 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Sat Feb 26 11:04:42 2022 +0000 patch 8.2.4475: fuzzy cmdline completion does not work for lower case Problem: Fuzzy cmdline completion does not work for lower case. Solution: Also use fuzzy completion for lower case input. (Yegappan Lakshmanan, closes #9849)
author Bram Moolenaar <Bram@vim.org>
date Sat, 26 Feb 2022 12:15:02 +0100
parents c53b4662bdba
children b39a350da22f
files src/cmdexpand.c src/testdir/test_cmdline.vim src/version.c
diffstat 3 files changed, 30 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/cmdexpand.c
+++ b/src/cmdexpand.c
@@ -1212,6 +1212,7 @@ set_cmd_index(char_u *cmd, exarg_T *eap,
 {
     char_u	*p = NULL;
     int		len = 0;
+    int		fuzzy = cmdline_fuzzy_complete(cmd);
 
     // Isolate the command and search for it in the command table.
     // Exceptions:
@@ -1253,7 +1254,9 @@ set_cmd_index(char_u *cmd, exarg_T *eap,
 
 	eap->cmdidx = excmd_get_cmdidx(cmd, len);
 
-	if (cmd[0] >= 'A' && cmd[0] <= 'Z')
+	// User defined commands support alphanumeric characters.
+	// Also when doing fuzzy expansion, support alphanumeric characters.
+	if ((cmd[0] >= 'A' && cmd[0] <= 'Z') || (fuzzy && *p != NUL))
 	    while (ASCII_ISALNUM(*p) || *p == '*')	// Allow * wild card
 		++p;
     }
@@ -2493,6 +2496,7 @@ ExpandFromContext(
     int		ret;
     int		flags;
     char_u	*tofree = NULL;
+    int		fuzzy = cmdline_fuzzy_complete(pat);
 
     flags = map_wildopts_to_ewflags(options);
 
@@ -2577,12 +2581,15 @@ ExpandFromContext(
 	pat = tofree;
     }
 
-    regmatch.regprog = vim_regcomp(pat, magic_isset() ? RE_MAGIC : 0);
-    if (regmatch.regprog == NULL)
-	return FAIL;
-
-    // set ignore-case according to p_ic, p_scs and pat
-    regmatch.rm_ic = ignorecase(pat);
+    if (!fuzzy)
+    {
+	regmatch.regprog = vim_regcomp(pat, magic_isset() ? RE_MAGIC : 0);
+	if (regmatch.regprog == NULL)
+	    return FAIL;
+
+	// set ignore-case according to p_ic, p_scs and pat
+	regmatch.rm_ic = ignorecase(pat);
+    }
 
     if (xp->xp_context == EXPAND_SETTINGS
 	    || xp->xp_context == EXPAND_BOOL_SETTINGS)
@@ -2596,7 +2603,8 @@ ExpandFromContext(
     else
 	ret = ExpandOther(pat, xp, &regmatch, matches, numMatches);
 
-    vim_regfree(regmatch.regprog);
+    if (!fuzzy)
+	vim_regfree(regmatch.regprog);
     vim_free(tofree);
 
     return ret;
--- a/src/testdir/test_cmdline.vim
+++ b/src/testdir/test_cmdline.vim
@@ -2776,6 +2776,18 @@ func Test_wildoptions_fuzzy()
   delcommand T123FendingOff
   %bw
 
+  " Test for fuzzy completion of a command with lower case letters and a
+  " number
+  command Foo2Bar :
+  set wildoptions=fuzzy
+  call feedkeys(":foo2\<Tab>\<C-B>\"\<CR>", 'tx')
+  call assert_equal('"Foo2Bar', @:)
+  call feedkeys(":foo\<Tab>\<C-B>\"\<CR>", 'tx')
+  call assert_equal('"Foo2Bar', @:)
+  call feedkeys(":bar\<Tab>\<C-B>\"\<CR>", 'tx')
+  call assert_equal('"Foo2Bar', @:)
+  delcommand Foo2Bar
+
   set wildoptions&
   %bw!
 endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4475,
+/**/
     4474,
 /**/
     4473,