From 1df99db0b24c99a4ab139e046a1a3848a6e51fca Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Thu, 13 Nov 2025 22:38:49 +0900 Subject: [PATCH] Keep the previous delimiter before frozen columns --- src/terminal.go | 8 +++++--- src/tokenizer.go | 17 +++++++++++++++++ test/test_core.rb | 7 +++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/terminal.go b/src/terminal.go index 9f0d1d04..8cb8fd71 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -3546,8 +3546,9 @@ func (t *Terminal) printHighlighted(result Result, colBase tui.ColorPair, colMat if t.freezeLeft > 0 || t.freezeRight > 0 { tokens = Tokenize(item.text.ToString(), t.delimiter) } - // 0 1 2| 3 |4 5 - // -----> <--- + + // 0 | 1 | 2 | 3 | 4 | 5 + // ------> <------ if t.freezeLeft > 0 { if len(tokens) > 0 { token := tokens[util.Min(t.freezeLeft, len(tokens))-1] @@ -3560,7 +3561,8 @@ func (t *Terminal) printHighlighted(result Result, colBase tui.ColorPair, colMat splitOffset2 = 0 } else if index >= t.freezeLeft { token := tokens[index] - splitOffset2 = int(token.prefixLength) + token.text.Length() + delimiter := strings.TrimLeftFunc(GetLastDelimiter(token.text.ToString(), t.delimiter), unicode.IsSpace) + splitOffset2 = int(token.prefixLength) + token.text.Length() - len([]rune(delimiter)) } splitOffset2 = util.Max(splitOffset2, splitOffset1) } diff --git a/src/tokenizer.go b/src/tokenizer.go index 431844de..40208e24 100644 --- a/src/tokenizer.go +++ b/src/tokenizer.go @@ -234,6 +234,23 @@ func StripLastDelimiter(str string, delimiter Delimiter) string { return strings.TrimRightFunc(str, unicode.IsSpace) } +func GetLastDelimiter(str string, delimiter Delimiter) string { + if delimiter.str != nil { + if strings.HasSuffix(str, *delimiter.str) { + return *delimiter.str + } + } else if delimiter.regex != nil { + locs := delimiter.regex.FindAllStringIndex(str, -1) + if len(locs) > 0 { + lastLoc := locs[len(locs)-1] + if lastLoc[1] == len(str) { + return str[lastLoc[0]:] + } + } + } + return "" +} + // JoinTokens concatenates the tokens into a single string func JoinTokens(tokens []Token) string { var output bytes.Buffer diff --git a/test/test_core.rb b/test/test_core.rb index ac02cbbc..d5540d96 100644 --- a/test/test_core.rb +++ b/test/test_core.rb @@ -1208,6 +1208,13 @@ class TestCore < TestInteractive tmux.until { |lines| assert_match(/^> 1 2 3XX.*XX9998 9999 10000$/,lines[-3]) } end + def test_freeze_left_and_right_delimiter + tmux.send_keys %[seq 10000 | tr "\n" ' ' | sed 's/ / , /g' | #{FZF} --freeze-left 3 --freeze-right 3 --ellipsis XX --delimiter ' , '], :Enter + tmux.until { |lines| assert_match(/XX, 9999 , 10000 ,$/, lines[-3]) } + tmux.send_keys "'1000" + tmux.until { |lines| assert_match(/^> 1 , 2 , 3 ,XX.*XX, 9999 , 10000 ,$/,lines[-3]) } + end + def test_freeze_right_exceed_range tmux.send_keys %[seq 10000 | tr "\n" ' ' | #{FZF} --freeze-right 100000 --ellipsis XX], :Enter ['', "'1000"].each do |query|