Fix search not triggered when query change and reload happen at the same time

Fix #3268
pull/3275/head
Junegunn Choi 1 year ago
parent 5c2f85c39e
commit 77f9f4664a
No known key found for this signature in database
GPG Key ID: 254BC280FEF9C627

@ -299,10 +299,12 @@ func Run(opts *Options, version string, revision string) {
case EvtSearchNew:
var command *string
var changed bool
switch val := value.(type) {
case searchRequest:
sort = val.sort
command = val.command
changed = val.changed
if command != nil {
useSnapshot = val.sync
}
@ -314,10 +316,17 @@ func Run(opts *Options, version string, revision string) {
} else {
restart(*command)
}
}
if !changed {
break
}
if !useSnapshot {
snapshot, _ = chunkList.Snapshot()
newSnapshot, _ := chunkList.Snapshot()
// We want to avoid showing empty list when reload is triggered
// and the query string is changed at the same time i.e. command != nil && changed
if command == nil || len(newSnapshot) > 0 {
snapshot = newSnapshot
}
}
reset := !useSnapshot && clearCache()
matcher.Reset(snapshot, input(reset), true, !reading, sort, reset)

@ -408,6 +408,7 @@ type searchRequest struct {
sort bool
sync bool
command *string
changed bool
}
type previewRequest struct {
@ -3622,7 +3623,7 @@ func (t *Terminal) Loop() {
t.mutex.Unlock() // Must be unlocked before touching reqBox
if changed || newCommand != nil {
t.eventBox.Set(EvtSearchNew, searchRequest{sort: t.sort, sync: reloadSync, command: newCommand})
t.eventBox.Set(EvtSearchNew, searchRequest{sort: t.sort, sync: reloadSync, command: newCommand, changed: changed})
}
for _, event := range events {
t.reqBox.Set(event, nil)

@ -2861,6 +2861,11 @@ class TestGoFZF < TestBase
tmux.send_keys :c
tmux.until { |lines| assert_equal 0, lines.match_count }
end
def test_reload_and_change
tmux.send_keys "(echo foo; echo bar) | #{FZF} --bind 'load:reload-sync(sleep 60)+change-query(bar)'", :Enter
tmux.until { |lines| assert_equal 1, lines.match_count }
end
end
module TestShell

Loading…
Cancel
Save