Improve fuzzy finding

This commit is contained in:
Krzosa Karol
2026-01-05 14:41:19 +01:00
parent f646a6d22c
commit d694a374d6
2 changed files with 41 additions and 19 deletions

View File

@@ -49,7 +49,7 @@ struct Buffer {
struct FuzzyPair { struct FuzzyPair {
int32_t index; int32_t index;
int32_t rating; float rating;
}; };
enum { enum {

View File

@@ -95,26 +95,48 @@ void CommandWindowLayout(Rect2I *rect, Int wx, Int wy) {
n->document_rect = n->total_rect = CutBottom(rect, barsize); n->document_rect = n->total_rect = CutBottom(rect, barsize);
} }
int32_t FuzzyRate(String16 string, String16 with) { float NewFuzzyRate(String16 s, String16 p) {
ProfileFunction(); float score = 0;
if (with.len == 0) return 0; // try to do this: https://github.com/junegunn/fzf/blob/master/src/algo/algo.go
int32_t points = 0; return score;
int32_t consecutive = 0; }
int32_t with_i = 0;
for (int32_t i = 0; i < string.len; i++) { float FuzzyRate(String16 s, String16 p) {
if (ToLowerCase(string.data[i]) == ToLowerCase(with[with_i])) { float score = 0;
consecutive += 1; for (Int outer_pi = 0; outer_pi < p.len; outer_pi += 1) {
with_i += 1; String16 pit = Skip(p, outer_pi);
} else { if (IsWhitespace(At(pit, 0))) {
with_i = 0; continue;
points += consecutive * consecutive;
consecutive = 0;
} }
if (with_i >= with.len) with_i = 0; float matching = 0;
for (Int outer_si = 0; outer_si < s.len; outer_si += 1) {
String16 sit = Skip(s, outer_si);
if (IsWhitespace(At(sit, 0))) {
continue;
}
Int si = 0;
Int pi = 0;
for (;si < sit.len && pi < pit.len;) {
while (si < sit.len && IsWhitespace(sit[si])) si += 1;
while (pi < pit.len && IsWhitespace(pit[pi])) pi += 1;
if (pi >= pit.len) break;
if (si >= sit.len) break;
if (ToLowerCase(sit[si]) == ToLowerCase(pit[pi])) {
matching += 1.0f;
} else {
break;
}
si += 1;
pi += 1;
}
}
score += matching;
} }
points += consecutive * consecutive; score = score / (float)s.len;
return points; return score;
} }
inline bool MergeSortCompare(FuzzyPair *a, FuzzyPair *b) { inline bool MergeSortCompare(FuzzyPair *a, FuzzyPair *b) {
@@ -139,7 +161,7 @@ Array<FuzzyPair> FuzzySearchLines(Allocator allocator, Buffer *buffer, Int line_
} }
s = Trim(s); s = Trim(s);
int32_t rating = FuzzyRate(s, needle); float rating = FuzzyRate(s, needle);
Add(&ratings, {(int32_t)i, rating}); Add(&ratings, {(int32_t)i, rating});
} }
Array<FuzzyPair> temp = Copy(allocator, ratings); Array<FuzzyPair> temp = Copy(allocator, ratings);