From 13135108906fce00dab5a403bf308e19382e630e Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Thu, 16 Jan 2025 10:05:26 +0900 Subject: [PATCH] Do not apply nth style when the whole range is covered --- CHANGELOG.md | 2 +- src/terminal.go | 21 ++++++++++++++++++++- src/tokenizer.go | 4 ++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28d21bbf..94bf57e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -95,7 +95,7 @@ Also, fzf now offers "style presets" for quick customization, which can be activ # With 'change-nth'. The current nth option is exported as $FZF_NTH. ps -ef | fzf --reverse --header-lines 1 --header-border bottom --input-border \ --color nth:regular,fg:dim,current-fg:dim \ - --nth 8.. --bind 'ctrl-n:change-nth(1|2|3|4|5|6|7|)' \ + --bind 'ctrl-n:change-nth(8..|1|2|3|4|5|6|7|)' \ --bind 'result:transform-prompt:echo "${FZF_NTH}> "' ``` - A single-character delimiter is now treated as a plain string delimiter rather than a regular expression delimiter, even if it's a regular expression meta-character. diff --git a/src/terminal.go b/src/terminal.go index 7e7de9d6..2889bf01 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -2724,8 +2724,27 @@ func (t *Terminal) printHighlighted(result Result, colBase tui.ColorPair, colMat } sort.Sort(ByOrder(charOffsets)) } + + wholeCovered := len(t.nthCurrent) == 0 + for _, nth := range t.nthCurrent { + // Do we still want to apply a different style when the current nth + // covers the whole string? Probably not. And we can simplify the logic. + if nth.IsFull() { + wholeCovered = true + break + } + } + // But if 'nth' is set to 'regular', it's a sign that you're applying + // a different style to the rest of the string. e.g. 'nth:regular,fg:dim' + // In this case, we still need to apply and clear the style. + // We do the same when postTask is nil, which means we're printing header lines. + if t.nthAttr == tui.AttrRegular && wholeCovered || postTask == nil { + if t.nthAttr == tui.AttrRegular { + colBase = colBase.WithAttr(t.nthAttr) + } + } var nthOffsets []Offset - if len(t.nthCurrent) > 0 && t.nthAttr > 0 && postTask != nil { + if !wholeCovered && t.nthAttr > 0 && postTask != nil { var tokens []Token if item.transformed != nil { tokens = item.transformed.tokens diff --git a/src/tokenizer.go b/src/tokenizer.go index fade1d10..e5a8e977 100644 --- a/src/tokenizer.go +++ b/src/tokenizer.go @@ -18,6 +18,10 @@ type Range struct { end int } +func (r Range) IsFull() bool { + return r.begin == rangeEllipsis && r.end == rangeEllipsis +} + func RangesToString(ranges []Range) string { strs := []string{} for _, r := range ranges {