patch 9.1.0963: fuzzy-matching does not prefer full match Commit: https://github.com/vim/vim/commit/5a04999a7402201cf1b47ff10bc474dd1cdc24f4 Author: glepnir <glephun...@gmail.com> 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 <glephun...@gmail.com> Signed-off-by: Christian Brabandt <c...@256bit.org> 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 vim_dev+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_dev/E1tQpLH-005Cd7-WE%40256bit.org.