summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2015-08-01 23:13:24 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2015-08-01 23:13:24 +0900
commitdea60b11bca22f4bf886ae7026bac44521038010 (patch)
treeaf17cedb91520ee1b6a490ea8e22d2cf49818aa8
parent5e90f0a57bf21393a12ffc05e022760a71098d92 (diff)
Only consider the lengths of the relevant parts when --nth is set
-rw-r--r--src/item.go11
-rw-r--r--test/test_go.rb26
2 files changed, 36 insertions, 1 deletions
diff --git a/src/item.go b/src/item.go
index 1eeb1802..68f52972 100644
--- a/src/item.go
+++ b/src/item.go
@@ -63,7 +63,16 @@ func (i *Item) Rank(cache bool) Rank {
var tiebreak uint16
switch rankTiebreak {
case byLength:
- tiebreak = uint16(len(*i.text))
+ // It is guaranteed that .transformed in not null in normal execution
+ if i.transformed != nil {
+ lenSum := 0
+ for _, token := range *i.transformed {
+ lenSum += len(*token.text)
+ }
+ tiebreak = uint16(lenSum)
+ } else {
+ tiebreak = uint16(len(*i.text))
+ }
case byBegin:
// We can't just look at i.offsets[0][0] because it can be an inverse term
tiebreak = uint16(minBegin)
diff --git a/test/test_go.rb b/test/test_go.rb
index 75fc01ca..c21c94e0 100644
--- a/test/test_go.rb
+++ b/test/test_go.rb
@@ -501,6 +501,32 @@ class TestGoFZF < TestBase
assert_equal input, `cat #{tempname} | #{FZF} -f"!z" -x --tiebreak end`.split($/)
end
+ def test_tiebreak_length_with_nth
+ input = %w[
+ 1:hell
+ 123:hello
+ 12345:he
+ 1234567:h
+ ]
+ writelines tempname, input
+
+ output = %w[
+ 1:hell
+ 12345:he
+ 123:hello
+ 1234567:h
+ ]
+ assert_equal output, `cat #{tempname} | #{FZF} -fh`.split($/)
+
+ output = %w[
+ 1234567:h
+ 12345:he
+ 1:hell
+ 123:hello
+ ]
+ assert_equal output, `cat #{tempname} | #{FZF} -fh -n2 -d:`.split($/)
+ end
+
def test_invalid_cache
tmux.send_keys "(echo d; echo D; echo x) | #{fzf '-q d'}", :Enter
tmux.until { |lines| lines[-2].include? '2/3' }