Mercurial > vim
diff src/search.c @ 24547:192058cad081 v8.2.2813
patch 8.2.2813: cannot grep using fuzzy matching
Commit: https://github.com/vim/vim/commit/bb01a1ef3a093cdb36877ba73474719c531dc8cb
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Mon Apr 26 21:17:52 2021 +0200
patch 8.2.2813: cannot grep using fuzzy matching
Problem: Cannot grep using fuzzy matching.
Solution: Add the "f" flag to :vimgrep. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/8152)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 26 Apr 2021 21:30:04 +0200 |
parents | 55f458d35292 |
children | 7334bf933510 |
line wrap: on
line diff
--- 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_ return; } } - if ((di = dict_find(d, (char_u *)"matchseq", -1)) != NULL) + if (dict_find(d, (char_u *)"matchseq", -1) != NULL) matchseq = TRUE; }