diff src/cmdexpand.c @ 27879:76e2115dddb8 v8.2.4465

patch 8.2.4465: fuzzy completion does not order matches properly Commit: https://github.com/vim/vim/commit/5ec633b9b0400519db60253cb5846e50394218b4 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Fri Feb 25 15:24:24 2022 +0000 patch 8.2.4465: fuzzy completion does not order matches properly Problem: Fuzzy completion does not order matches properly. Solution: Do not use regular expression match. (Yegappan Lakshmanan, closes #9843)
author Bram Moolenaar <Bram@vim.org>
date Fri, 25 Feb 2022 16:30:07 +0100
parents ae38d2e81fca
children 5426a1d3f12d
line wrap: on
line diff
--- a/src/cmdexpand.c
+++ b/src/cmdexpand.c
@@ -2633,6 +2633,7 @@ ExpandGeneric(
     int			score = 0;
     int		fuzzy = (fuzzystr != NULL);
     int		funcsort = FALSE;
+    int		match;
 
     // do this loop twice:
     // round == 0: count the number of matching names
@@ -2647,44 +2648,52 @@ ExpandGeneric(
 	    if (*str == NUL)	    // skip empty strings
 		continue;
 
-	    if (vim_regexec(regmatch, str, (colnr_T)0) ||
-		    (fuzzy && ((score = fuzzy_match_str(str, fuzzystr)) != 0)))
+	    if (!fuzzy)
+	       match = vim_regexec(regmatch, str, (colnr_T)0);
+	    else
 	    {
-		if (round)
+		score = fuzzy_match_str(str, fuzzystr);
+		match = (score != 0);
+	    }
+
+	    if (!match)
+		continue;
+
+	    if (round)
+	    {
+		if (escaped)
+		    str = vim_strsave_escaped(str, (char_u *)" \t\\.");
+		else
+		    str = vim_strsave(str);
+		if (str == NULL)
 		{
-		    if (escaped)
-			str = vim_strsave_escaped(str, (char_u *)" \t\\.");
-		    else
-			str = vim_strsave(str);
-		    if (str == NULL)
-		    {
-			FreeWild(count, *matches);
-			if (fuzzy)
-			    fuzmatch_str_free(fuzmatch, count);
-			*numMatches = 0;
-			*matches = NULL;
-			return FAIL;
-		    }
 		    if (fuzzy)
-		    {
-			fuzmatch[count].idx = count;
-			fuzmatch[count].str = str;
-			fuzmatch[count].score = score;
-		    }
-		    else
-			(*matches)[count] = str;
+			fuzmatch_str_free(fuzmatch, count);
+		    else if (count > 0)
+			FreeWild(count, *matches);
+		    *numMatches = 0;
+		    *matches = NULL;
+		    return FAIL;
+		}
+		if (fuzzy)
+		{
+		    fuzmatch[count].idx = count;
+		    fuzmatch[count].str = str;
+		    fuzmatch[count].score = score;
+		}
+		else
+		    (*matches)[count] = str;
 # ifdef FEAT_MENU
-		    if (func == get_menu_names && str != NULL)
-		    {
-			// test for separator added by get_menu_names()
-			str += STRLEN(str) - 1;
-			if (*str == '\001')
-			    *str = '.';
-		    }
+		if (func == get_menu_names && str != NULL)
+		{
+		    // test for separator added by get_menu_names()
+		    str += STRLEN(str) - 1;
+		    if (*str == '\001')
+			*str = '.';
+		}
 # endif
-		}
-		++count;
 	    }
+	    ++count;
 	}
 	if (round == 0)
 	{