summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2025-05-17 11:24:53 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2025-05-17 11:25:15 +0900
commitb27943423e1cde31a7f27c7b031d7fa108cf9c14 (patch)
treeb7feebbd92669131ea8af730dd8c62c2b71f7344
parent894a1016bccfcb3c68707b798a73e99b78e97bd4 (diff)
downloadfzf-b27943423e1cde31a7f27c7b031d7fa108cf9c14.tar.gz
Show ellipsis for truncated labels
Close #4390
-rw-r--r--src/terminal.go11
-rw-r--r--test/test_layout.rb30
2 files changed, 38 insertions, 3 deletions
diff --git a/src/terminal.go b/src/terminal.go
index a79d166f..094d3c91 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -1235,9 +1235,14 @@ func (t *Terminal) ansiLabelPrinter(str string, color *tui.ColorPair, fill bool)
return nil, 0
}
printFn := func(window tui.Window, limit int) {
- if length > limit {
- trimmedRunes, _ := t.trimRight(runes, limit)
- window.CPrint(*color, string(trimmedRunes))
+ ellipsis := []rune{}
+ ellipsisWidth := 0
+ if !fill {
+ ellipsis, ellipsisWidth = util.Truncate(t.ellipsis, limit)
+ }
+ if length > limit-ellipsisWidth {
+ trimmedRunes, _ := t.trimRight(runes, limit-ellipsisWidth)
+ window.CPrint(*color, string(trimmedRunes)+string(ellipsis))
} else if fill {
window.CPrint(*color, util.RepeatToFill(text, length, limit))
} else {
diff --git a/test/test_layout.rb b/test/test_layout.rb
index ed384712..8aa412d5 100644
--- a/test/test_layout.rb
+++ b/test/test_layout.rb
@@ -992,6 +992,36 @@ class TestLayout < TestInteractive
tmux.until { assert_block(block, it) }
end
+ def test_label_trunction
+ command = <<~CMD
+ seq 10 | #{FZF} --style full --border --header-lines=1 --preview ':' \\
+ --border-label "#{'b' * 1000}" \\
+ --preview-label "#{'p' * 1000}" \\
+ --header-label "#{'h' * 1000}" \\
+ --header-label "#{'h' * 1000}" \\
+ --input-label "#{'i' * 1000}" \\
+ --list-label "#{'l' * 1000}"
+ CMD
+ writelines(command.lines.map(&:chomp))
+ tmux.send_keys("sh #{tempname}", :Enter)
+ tmux.until do |lines|
+ text = lines.join
+ assert_includes text, 'b··'
+ assert_includes text, 'l··p'
+ assert_includes text, 'p··'
+ assert_includes text, 'h··'
+ assert_includes text, 'i··'
+ end
+ end
+
+ def test_separator_no_ellipsis
+ tmux.send_keys %(seq 10 | #{FZF} --separator "$(seq 1000 | tr '\\n' ' ')"), :Enter
+ tmux.until do |lines|
+ assert_equal 10, lines.match_count
+ refute_includes lines.join, '··'
+ end
+ end
+
def test_header_border_no_pointer_and_marker
tmux.send_keys %(seq 10 | #{FZF} --header-lines 1 --header-border sharp --no-list-border --pointer '' --marker ''), :Enter
block = <<~BLOCK