Fix nth highlighting

Fix #4222
This commit is contained in:
Junegunn Choi 2025-02-06 19:56:40 +09:00
parent bbe1721a18
commit 62e0a2824a
No known key found for this signature in database
GPG Key ID: 254BC280FEF9C627
5 changed files with 8 additions and 10 deletions

View File

@ -195,15 +195,14 @@ func Run(opts *Options) (int, error) {
} }
nth := opts.Nth nth := opts.Nth
nthRevision := 0 inputRevision := revision{}
snapshotRevision := revision{}
patternCache := make(map[string]*Pattern) patternCache := make(map[string]*Pattern)
patternBuilder := func(runes []rune) *Pattern { patternBuilder := func(runes []rune) *Pattern {
return BuildPattern(cache, patternCache, return BuildPattern(cache, patternCache,
opts.Fuzzy, opts.FuzzyAlgo, opts.Extended, opts.Case, opts.Normalize, forward, withPos, opts.Fuzzy, opts.FuzzyAlgo, opts.Extended, opts.Case, opts.Normalize, forward, withPos,
opts.Filter == nil, nth, opts.Delimiter, nthRevision, runes) opts.Filter == nil, nth, opts.Delimiter, inputRevision, runes)
} }
inputRevision := revision{}
snapshotRevision := revision{}
matcher := NewMatcher(cache, patternBuilder, sort, opts.Tac, eventBox, inputRevision) matcher := NewMatcher(cache, patternBuilder, sort, opts.Tac, eventBox, inputRevision)
// Filtering mode // Filtering mode
@ -382,7 +381,6 @@ func Run(opts *Options) (int, error) {
if val.nth != nil { if val.nth != nil {
// Change nth and clear caches // Change nth and clear caches
nth = *val.nth nth = *val.nth
nthRevision++
patternCache = make(map[string]*Pattern) patternCache = make(map[string]*Pattern)
cache.Clear() cache.Clear()
inputRevision.bumpMinor() inputRevision.bumpMinor()

View File

@ -9,7 +9,7 @@ import (
type transformed struct { type transformed struct {
// Because nth can be changed dynamically by change-nth action, we need to // Because nth can be changed dynamically by change-nth action, we need to
// keep the revision number at the time of transformation. // keep the revision number at the time of transformation.
revision int revision revision
tokens []Token tokens []Token
} }

View File

@ -60,7 +60,7 @@ type Pattern struct {
cacheKey string cacheKey string
delimiter Delimiter delimiter Delimiter
nth []Range nth []Range
revision int revision revision
procFun map[termType]algo.Algo procFun map[termType]algo.Algo
cache *ChunkCache cache *ChunkCache
} }
@ -73,7 +73,7 @@ func init() {
// BuildPattern builds Pattern object from the given arguments // BuildPattern builds Pattern object from the given arguments
func BuildPattern(cache *ChunkCache, patternCache map[string]*Pattern, fuzzy bool, fuzzyAlgo algo.Algo, extended bool, caseMode Case, normalize bool, forward bool, func BuildPattern(cache *ChunkCache, patternCache map[string]*Pattern, fuzzy bool, fuzzyAlgo algo.Algo, extended bool, caseMode Case, normalize bool, forward bool,
withPos bool, cacheable bool, nth []Range, delimiter Delimiter, revision int, runes []rune) *Pattern { withPos bool, cacheable bool, nth []Range, delimiter Delimiter, revision revision, runes []rune) *Pattern {
var asString string var asString string
if extended { if extended {

View File

@ -68,7 +68,7 @@ func buildPattern(fuzzy bool, fuzzyAlgo algo.Algo, extended bool, caseMode Case,
withPos bool, cacheable bool, nth []Range, delimiter Delimiter, runes []rune) *Pattern { withPos bool, cacheable bool, nth []Range, delimiter Delimiter, runes []rune) *Pattern {
return BuildPattern(NewChunkCache(), make(map[string]*Pattern), return BuildPattern(NewChunkCache(), make(map[string]*Pattern),
fuzzy, fuzzyAlgo, extended, caseMode, normalize, forward, fuzzy, fuzzyAlgo, extended, caseMode, normalize, forward,
withPos, cacheable, nth, delimiter, 0, runes) withPos, cacheable, nth, delimiter, revision{}, runes)
} }
func TestExact(t *testing.T) { func TestExact(t *testing.T) {

View File

@ -2932,7 +2932,7 @@ func (t *Terminal) printHighlighted(result Result, colBase tui.ColorPair, colMat
} }
if !wholeCovered && t.nthAttr > 0 { if !wholeCovered && t.nthAttr > 0 {
var tokens []Token var tokens []Token
if item.transformed != nil { if item.transformed != nil && item.transformed.revision == t.merger.revision {
tokens = item.transformed.tokens tokens = item.transformed.tokens
} else { } else {
tokens = Transform(Tokenize(item.text.ToString(), t.delimiter), t.nthCurrent) tokens = Transform(Tokenize(item.text.ToString(), t.delimiter), t.nthCurrent)