summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2025-01-16 10:05:26 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2025-01-16 10:06:11 +0900
commit13135108906fce00dab5a403bf308e19382e630e (patch)
tree4d31ed91c85e747f5454b20ef7f0970c1bd0c7db
parentb712f2bb6a5c1eed5661072604e308951ef655f2 (diff)
downloadfzf-13135108906fce00dab5a403bf308e19382e630e.tar.gz
Do not apply nth style when the whole range is covered
-rw-r--r--CHANGELOG.md2
-rw-r--r--src/terminal.go21
-rw-r--r--src/tokenizer.go4
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 {