summaryrefslogtreecommitdiff
path: root/src/cmdexpand.c
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2022-02-25 15:24:24 +0000
committerBram Moolenaar <Bram@vim.org>2022-02-25 15:24:24 +0000
commit5ec633b9b0400519db60253cb5846e50394218b4 (patch)
tree0e85ab2bd5fd660ccb24daf164ece05ac57fd081 /src/cmdexpand.c
parent4d56b971cbae01cc454eb09713326224993e38ed (diff)
downloadvim-git-5ec633b9b0400519db60253cb5846e50394218b4.tar.gz
patch 8.2.4465: fuzzy completion does not order matches properlyv8.2.4465
Problem: Fuzzy completion does not order matches properly. Solution: Do not use regular expression match. (Yegappan Lakshmanan, closes #9843)
Diffstat (limited to 'src/cmdexpand.c')
-rw-r--r--src/cmdexpand.c73
1 files changed, 41 insertions, 32 deletions
diff --git a/src/cmdexpand.c b/src/cmdexpand.c
index 909706d1d..94781f82f 100644
--- 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
+ {
+ score = fuzzy_match_str(str, fuzzystr);
+ match = (score != 0);
+ }
+
+ if (!match)
+ continue;
+
+ if (round)
{
- 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 = '.';
- }
-# endif
+ if (func == get_menu_names && str != NULL)
+ {
+ // test for separator added by get_menu_names()
+ str += STRLEN(str) - 1;
+ if (*str == '\001')
+ *str = '.';
}
- ++count;
+# endif
}
+ ++count;
}
if (round == 0)
{