patch 9.1.0963: fuzzy-matching does not prefer full match
Commit:
https://github.com/vim/vim/commit/5a04999a7402201cf1b47ff10bc474dd1cdc24f4
Author: glepnir <[email protected]>
Date: Thu Dec 26 15:38:39 2024 +0100
patch 9.1.0963: fuzzy-matching does not prefer full match
Problem: fuzzy-matching does not prefer full match
(Maxim Kim)
Solution: add additional score for a full match
(glepnir)
fixes: #15654
closes: #16300
Signed-off-by: glepnir <[email protected]>
Signed-off-by: Christian Brabandt <[email protected]>
diff --git a/runtime/doc/pattern.txt b/runtime/doc/pattern.txt
index 6ebef9e44..39eb5442b 100644
--- a/runtime/doc/pattern.txt
+++ b/runtime/doc/pattern.txt
@@ -1,4 +1,4 @@
-*pattern.txt* For Vim version 9.1. Last change: 2024 Nov 09
+*pattern.txt* For Vim version 9.1. Last change: 2024 Dec 26
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -1504,6 +1504,7 @@ criteria:
- Matches at a camel case character (e.g. Case in CamelCase)
- Matches after a path separator or a hyphen.
- The number of unmatched characters in a string.
+ - A full/exact match is preferred.
The matching string with the highest score is returned first.
For example, when you search for the "get pat" string using fuzzy matching, it
diff --git a/src/search.c b/src/search.c
index aeb519c67..616331ee1 100644
--- a/src/search.c
+++ b/src/search.c
@@ -4385,6 +4385,7 @@ fuzzy_match_compute_score(
int i;
char_u *p = str;
int_u sidx = 0;
+ int is_exact_match = TRUE;
// Initialize score
score = 100;
@@ -4452,7 +4453,14 @@ fuzzy_match_compute_score(
// First letter
score += FIRST_LETTER_BONUS;
}
+ // Check exact match condition
+ if (currIdx != (int_u)i)
+ is_exact_match = FALSE;
}
+ // Boost score for exact matches
+ if (is_exact_match && numMatches == strSz)
+ score += 100;
+
return score;
}
diff --git a/src/testdir/test_matchfuzzy.vim b/src/testdir/test_matchfuzzy.vim
index 43eca8ff0..e880d7335 100644
--- a/src/testdir/test_matchfuzzy.vim
+++ b/src/testdir/test_matchfuzzy.vim
@@ -23,6 +23,8 @@ func Test_matchfuzzy()
call assert_equal(['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'],
matchfuzzy(['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'], 'aa'))
call assert_equal(256, matchfuzzy([repeat('a', 256)], repeat('a',
256))[0]->len())
call assert_equal([], matchfuzzy([repeat('a', 300)], repeat('a', 257)))
+ " full match has highest score
+ call assert_equal(['Cursor', 'lCursor'], matchfuzzy(["hello", "lCursor",
"Cursor"], "Cursor"))
" matches with same score should not be reordered
let l = ['abc1', 'abc2', 'abc3']
call assert_equal(l, l->matchfuzzy('abc'))
@@ -97,7 +99,7 @@ func Test_matchfuzzypos()
call assert_equal([['curl', 'world'], [[2,3], [2,3]], [128, 127]],
matchfuzzypos(['world', 'curl'], 'rl'))
call assert_equal([['curl', 'world'], [[2,3], [2,3]], [128, 127]],
matchfuzzypos(['world', 'one', 'curl'], 'rl'))
call assert_equal([['hello', 'hello world hello world'],
- \ [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [275, 257]],
+ \ [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], [375, 257]],
\ matchfuzzypos(['hello world hello world', 'hello', 'world'],
'hello'))
call assert_equal([['aaaaaaa'], [[0, 1, 2]], [191]],
matchfuzzypos(['aaaaaaa'], 'aaa'))
call assert_equal([['a b'], [[0, 3]], [219]], matchfuzzypos(['a b'], 'a
b'))
@@ -132,7 +134,7 @@ func Test_matchfuzzypos()
call assert_equal([['foo bar baz'], [[0, 1, 2, 3, 4, 5, 10]], [326]], ['foo
bar baz', 'foo', 'foo bar', 'baz bar']->matchfuzzypos('foo baz', {'matchseq':
1}))
call assert_equal([[], [], []], ['foo bar baz', 'foo', 'foo bar', 'baz
bar']->matchfuzzypos('one two'))
call assert_equal([[], [], []], ['foo bar']->matchfuzzypos(" "))
- call assert_equal([['grace'], [[1, 2, 3, 4, 2, 3, 4, 0, 1, 2, 3, 4]],
[657]], ['grace']->matchfuzzypos('race ace grace'))
+ call assert_equal([['grace'], [[1, 2, 3, 4, 2, 3, 4, 0, 1, 2, 3, 4]],
[757]], ['grace']->matchfuzzypos('race ace grace'))
let l = [{'id' : 5, 'val' : 'crayon'}, {'id' : 6, 'val' : 'camera'}]
call assert_equal([[{'id' : 6, 'val' : 'camera'}], [[0, 1, 2]], [192]],
diff --git a/src/version.c b/src/version.c
index c46e34272..3a049140c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 963,
/**/
962,
/**/
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/vim_dev/E1tQpLH-005Cd7-WE%40256bit.org.