From f0bfeba733f755a81b2e2d327268f2dabae8f684 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Tue, 2 Aug 2022 13:44:55 +0900 Subject: Add new tiebreak: 'chunk' Favors the line with shorter matched chunk. A chunk is a set of consecutive non-whitespace characters. Unlike the default `length`, this new scheme works well with tabular input. # length prefers item #1, because the whole line is shorter, # chunk prefers item #2, because the matched chunk ("foo") is shorter fzf --height=6 --header-lines=2 --tiebreak=chunk --reverse --query=fo << "EOF" N | Field1 | Field2 | Field3 - | ------ | ------ | ------ 1 | hello | foobar | baz 2 | world | foo | bazbaz EOF If the input does not contain any spaces, `chunk` is equivalent to `length`. But we're not going to set it as the default because it is computationally more expensive. Close #2285 Close #2537 - Not the exact solution to --tiebreak=length not taking --nth into account, but this should work. And the added benefit is that it works well even when --nth is not provided. - Adding a bonus point to the last character of a word didn't turn out great. The order of the result suddenly changes when you type in the last character in the word producing a jarring effect. --- src/result.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'src/result.go') diff --git a/src/result.go b/src/result.go index 8abe0d3d..c4acb5fa 100644 --- a/src/result.go +++ b/src/result.go @@ -49,6 +49,21 @@ func buildResult(item *Item, offsets []Offset, score int) Result { case byScore: // Higher is better val = math.MaxUint16 - util.AsUint16(score) + case byChunk: + b := minBegin + e := maxEnd + l := item.text.Length() + for ; b >= 1; b-- { + if unicode.IsSpace(item.text.Get(b - 1)) { + break + } + } + for ; e < l; e++ { + if unicode.IsSpace(item.text.Get(e)) { + break + } + } + val = util.AsUint16(e - b) case byLength: val = item.TrimLength() case byBegin, byEnd: -- cgit v1.2.3