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
nthRevision := 0
inputRevision := revision{}
snapshotRevision := revision{}
patternCache := make(map[string]*Pattern)
patternBuilder := func(runes []rune) *Pattern {
return BuildPattern(cache, patternCache,
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)
// Filtering mode
@ -382,7 +381,6 @@ func Run(opts *Options) (int, error) {
if val.nth != nil {
// Change nth and clear caches
nth = *val.nth
nthRevision++
patternCache = make(map[string]*Pattern)
cache.Clear()
inputRevision.bumpMinor()

View File

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

View File

@ -60,7 +60,7 @@ type Pattern struct {
cacheKey string
delimiter Delimiter
nth []Range
revision int
revision revision
procFun map[termType]algo.Algo
cache *ChunkCache
}
@ -73,7 +73,7 @@ func init() {
// 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,
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
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 {
return BuildPattern(NewChunkCache(), make(map[string]*Pattern),
fuzzy, fuzzyAlgo, extended, caseMode, normalize, forward,
withPos, cacheable, nth, delimiter, 0, runes)
withPos, cacheable, nth, delimiter, revision{}, runes)
}
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 {
var tokens []Token
if item.transformed != nil {
if item.transformed != nil && item.transformed.revision == t.merger.revision {
tokens = item.transformed.tokens
} else {
tokens = Transform(Tokenize(item.text.ToString(), t.delimiter), t.nthCurrent)