summaryrefslogtreecommitdiff
path: root/src/result.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2022-08-02 13:44:55 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2022-08-02 21:48:19 +0900
commitf0bfeba733f755a81b2e2d327268f2dabae8f684 (patch)
treef772989dd01c4f7cb7f69937932c0ded5d4b0ece /src/result.go
parentc3a7a24eeaa5b7451e652df68683b5e8b24cde6b (diff)
downloadfzf-f0bfeba733f755a81b2e2d327268f2dabae8f684.tar.gz
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.
Diffstat (limited to 'src/result.go')
-rw-r--r--src/result.go15
1 files changed, 15 insertions, 0 deletions
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: