mirror of
https://github.com/vim/vim
synced 2025-07-15 16:51:57 +00:00
patch 9.1.1445: negative matchfuzzy scores although there is a match
Problem: negative matchfuzzy scores although there is a match (Maxim Kim) Solution: reset the score if a match has been found but the score is negative (Girish Palya) The fuzzy algorithm may miss some matches in long strings due to recursion limits. As a result, the score can end up negative even when matches exist. In such cases, reset the score to ensure it is non-negative. fixes: ##17449 closes: #17469 Signed-off-by: Girish Palya <girishji@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
de1c7ac432
commit
328332b0b0
@ -4413,6 +4413,10 @@ fuzzy_match_compute_score(
|
||||
// Apply unmatched penalty
|
||||
unmatched = strSz - numMatches;
|
||||
score += UNMATCHED_LETTER_PENALTY * unmatched;
|
||||
// In a long string, not all matches may be found due to the recursion limit.
|
||||
// If at least one match is found, reset the score to a non-negative value.
|
||||
if (score < 0 && numMatches > 0)
|
||||
score = 0;
|
||||
|
||||
// Apply ordering bonuses
|
||||
for (i = 0; i < numMatches; ++i)
|
||||
|
@ -125,7 +125,7 @@ func Test_matchfuzzypos()
|
||||
call assert_equal([[], [], []], matchfuzzypos([], 'abc'))
|
||||
|
||||
" match in a long string
|
||||
call assert_equal([[repeat('x', 300) .. 'abc'], [[300, 301, 302]], [-60]],
|
||||
call assert_equal([[repeat('x', 300) .. 'abc'], [[300, 301, 302]], [155]],
|
||||
\ matchfuzzypos([repeat('x', 300) .. 'abc'], 'abc'))
|
||||
|
||||
" preference for camel case match
|
||||
@ -258,7 +258,7 @@ func Test_matchfuzzypos_mbyte()
|
||||
call assert_equal([[], [], []], ['세 마리의 작은 돼지', '마리의', '마리의 작은', '작은 돼지']->matchfuzzypos('파란 하늘'))
|
||||
|
||||
" match in a long string
|
||||
call assert_equal([[repeat('ぶ', 300) .. 'ẼẼẼ'], [[300, 301, 302]], [-110]],
|
||||
call assert_equal([[repeat('ぶ', 300) .. 'ẼẼẼ'], [[300, 301, 302]], [105]],
|
||||
\ matchfuzzypos([repeat('ぶ', 300) .. 'ẼẼẼ'], 'ẼẼẼ'))
|
||||
" preference for camel case match
|
||||
call assert_equal([['xѳѵҁxxѳѴҁ'], [[6, 7, 8]], [219]], matchfuzzypos(['xѳѵҁxxѳѴҁ'], 'ѳѵҁ'))
|
||||
|
@ -709,6 +709,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1445,
|
||||
/**/
|
||||
1444,
|
||||
/**/
|
||||
|
Reference in New Issue
Block a user