From e4ebf18508a890ad4d9df4106c9d4a072aeb4415 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Tue, 24 Feb 2026 21:42:26 +0900 Subject: [PATCH] Fix filterSelection timing: only consume flag on new search results Move the filterSelection check inside the revision-change guard so a stale EvtSearchFin from a previous search cannot consume the flag before the retransformed search results arrive. --- src/terminal.go | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/terminal.go b/src/terminal.go index 19a04a60..dcd9b01d 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -1860,19 +1860,22 @@ func (t *Terminal) UpdateList(result MatchResult) { } t.revision = newRevision t.version++ - } - if t.filterSelection && t.multi > 0 && len(t.selected) > 0 { - t.filterSelection = false - matchMap := t.resultMerger.ToMap() - filtered := make(map[int32]selectedItem) - for k, v := range t.selected { - if _, matched := matchMap[k]; matched { - filtered[k] = v + + // Filter out selections that no longer match after with-nth change. + // Must be inside the revision check so we don't consume the flag + // on a stale EvtSearchFin from a previous search. + if t.filterSelection && t.multi > 0 && len(t.selected) > 0 { + matchMap := t.resultMerger.ToMap() + filtered := make(map[int32]selectedItem) + for k, v := range t.selected { + if _, matched := matchMap[k]; matched { + filtered[k] = v + } } + t.selected = filtered } - t.selected = filtered + t.filterSelection = false } - t.filterSelection = false if t.triggerLoad { t.triggerLoad = false t.eventChan <- tui.Load.AsEvent()