diff options
author | Yegappan Lakshmanan <yegappan@yahoo.com> | 2021-04-26 21:17:52 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-04-26 21:17:52 +0200 |
commit | bb01a1ef3a093cdb36877ba73474719c531dc8cb (patch) | |
tree | 46d75e2ab284ea6e579e7066edbd3315293f8add /src/search.c | |
parent | 5930ddcd25c3c31a323cdb1b74c228958e124527 (diff) | |
download | vim-git-bb01a1ef3a093cdb36877ba73474719c531dc8cb.tar.gz |
patch 8.2.2813: cannot grep using fuzzy matchingv8.2.2813
Problem: Cannot grep using fuzzy matching.
Solution: Add the "f" flag to :vimgrep. (Yegappan Lakshmanan, closes #8152)
Diffstat (limited to 'src/search.c')
-rw-r--r-- | src/search.c | 38 |
1 files changed, 17 insertions, 21 deletions
diff --git a/src/search.c b/src/search.c index 37ccc37e9..24dcd5a58 100644 --- a/src/search.c +++ b/src/search.c @@ -4285,10 +4285,6 @@ typedef struct #define SCORE_NONE -9999 #define FUZZY_MATCH_RECURSION_LIMIT 10 -// Maximum number of characters that can be fuzzy matched -#define MAXMATCHES 256 - -typedef int_u matchidx_T; /* * Compute a score for a fuzzy matched string. The matching character locations @@ -4298,7 +4294,7 @@ typedef int_u matchidx_T; fuzzy_match_compute_score( char_u *str, int strSz, - matchidx_T *matches, + int_u *matches, int numMatches) { int score; @@ -4306,7 +4302,7 @@ fuzzy_match_compute_score( int unmatched; int i; char_u *p = str; - matchidx_T sidx = 0; + int_u sidx = 0; // Initialize score score = 100; @@ -4324,11 +4320,11 @@ fuzzy_match_compute_score( // Apply ordering bonuses for (i = 0; i < numMatches; ++i) { - matchidx_T currIdx = matches[i]; + int_u currIdx = matches[i]; if (i > 0) { - matchidx_T prevIdx = matches[i - 1]; + int_u prevIdx = matches[i - 1]; // Sequential if (currIdx == (prevIdx + 1)) @@ -4386,19 +4382,19 @@ fuzzy_match_compute_score( fuzzy_match_recursive( char_u *fuzpat, char_u *str, - matchidx_T strIdx, + int_u strIdx, int *outScore, char_u *strBegin, int strLen, - matchidx_T *srcMatches, - matchidx_T *matches, + int_u *srcMatches, + int_u *matches, int maxMatches, int nextMatch, int *recursionCount) { // Recursion params int recursiveMatch = FALSE; - matchidx_T bestRecursiveMatches[MAXMATCHES]; + int_u bestRecursiveMatches[MAX_FUZZY_MATCHES]; int bestRecursiveScore = 0; int first_match; int matched; @@ -4409,7 +4405,7 @@ fuzzy_match_recursive( return 0; // Detect end of strings - if (*fuzpat == '\0' || *str == '\0') + if (*fuzpat == NUL || *str == NUL) return 0; // Loop through fuzpat and str looking for a match @@ -4425,7 +4421,7 @@ fuzzy_match_recursive( // Found match if (vim_tolower(c1) == vim_tolower(c2)) { - matchidx_T recursiveMatches[MAXMATCHES]; + int_u recursiveMatches[MAX_FUZZY_MATCHES]; int recursiveScore = 0; char_u *next_char; @@ -4455,7 +4451,7 @@ fuzzy_match_recursive( if (!recursiveMatch || recursiveScore > bestRecursiveScore) { memcpy(bestRecursiveMatches, recursiveMatches, - MAXMATCHES * sizeof(recursiveMatches[0])); + MAX_FUZZY_MATCHES * sizeof(recursiveMatches[0])); bestRecursiveScore = recursiveScore; } recursiveMatch = TRUE; @@ -4506,19 +4502,19 @@ fuzzy_match_recursive( * normalized and varies with pattern. * Recursion is limited internally (default=10) to prevent degenerate cases * (pat_arg="aaaaaa" str="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"). - * Uses char_u for match indices. Therefore patterns are limited to MAXMATCHES - * characters. + * Uses char_u for match indices. Therefore patterns are limited to + * MAX_FUZZY_MATCHES characters. * * Returns TRUE if 'pat_arg' matches 'str'. Also returns the match score in * 'outScore' and the matching character positions in 'matches'. */ - static int + int fuzzy_match( char_u *str, char_u *pat_arg, int matchseq, int *outScore, - matchidx_T *matches, + int_u *matches, int maxMatches) { int recursionCount = 0; @@ -4630,7 +4626,7 @@ fuzzy_match_in_list( listitem_T *li; long i = 0; int found_match = FALSE; - matchidx_T matches[MAXMATCHES]; + int_u matches[MAX_FUZZY_MATCHES]; len = list_len(items); if (len == 0) @@ -4847,7 +4843,7 @@ do_fuzzymatch(typval_T *argvars, typval_T *rettv, int retmatchpos) return; } } - if ((di = dict_find(d, (char_u *)"matchseq", -1)) != NULL) + if (dict_find(d, (char_u *)"matchseq", -1) != NULL) matchseq = TRUE; } |