summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2019-12-09 21:32:58 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2019-12-09 21:32:58 +0900
commit2b725a4db5e973d7ce90d1ac0996dcfd3c3f0116 (patch)
treec9eea79293181e3049ac974d3f8cc892bd27bf77
parentaf1a5f130bbd2464131ec2ae91c538ace6801a73 (diff)
downloadfzf-2b725a4db5e973d7ce90d1ac0996dcfd3c3f0116.tar.gz
Defer resetting multi-selection on reload
-rw-r--r--src/core.go17
-rw-r--r--src/terminal.go6
-rw-r--r--src/util/util.go10
-rw-r--r--src/util/util_test.go18
4 files changed, 41 insertions, 10 deletions
diff --git a/src/core.go b/src/core.go
index 985c177f..ff558497 100644
--- a/src/core.go
+++ b/src/core.go
@@ -224,12 +224,14 @@ func Run(opts *Options, revision string) {
// Event coordination
reading := true
- clearCache := false
+ clearCache := util.Once(false)
+ clearSelection := util.Once(false)
ticks := 0
var nextCommand *string
restart := func(command string) {
reading = true
- clearCache = true
+ clearCache = util.Once(true)
+ clearSelection = util.Once(true)
chunkList.Clear()
header = make([]string, 0, opts.HeaderLines)
go reader.restart(command)
@@ -262,10 +264,10 @@ func Run(opts *Options, revision string) {
snapshot, count := chunkList.Snapshot()
terminal.UpdateCount(count, !reading, value.(*string))
if opts.Sync {
- terminal.UpdateList(PassMerger(&snapshot, opts.Tac))
+ opts.Sync = false
+ terminal.UpdateList(PassMerger(&snapshot, opts.Tac), false)
}
- matcher.Reset(snapshot, input(), false, !reading, sort, clearCache)
- clearCache = false
+ matcher.Reset(snapshot, input(), false, !reading, sort, clearCache())
case EvtSearchNew:
var command *string
@@ -284,8 +286,7 @@ func Run(opts *Options, revision string) {
break
}
snapshot, _ := chunkList.Snapshot()
- matcher.Reset(snapshot, input(), true, !reading, sort, clearCache)
- clearCache = false
+ matcher.Reset(snapshot, input(), true, !reading, sort, clearCache())
delay = false
case EvtSearchProgress:
@@ -327,7 +328,7 @@ func Run(opts *Options, revision string) {
terminal.startChan <- true
}
}
- terminal.UpdateList(val)
+ terminal.UpdateList(val, clearSelection())
}
}
}
diff --git a/src/terminal.go b/src/terminal.go
index d31ff6fe..87789a51 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -495,10 +495,13 @@ func (t *Terminal) UpdateProgress(progress float32) {
}
// UpdateList updates Merger to display the list
-func (t *Terminal) UpdateList(merger *Merger) {
+func (t *Terminal) UpdateList(merger *Merger, reset bool) {
t.mutex.Lock()
t.progress = 100
t.merger = merger
+ if reset {
+ t.selected = make(map[int32]selectedItem)
+ }
t.mutex.Unlock()
t.reqBox.Set(reqInfo, nil)
t.reqBox.Set(reqList, nil)
@@ -2068,7 +2071,6 @@ func (t *Terminal) Loop() {
command := replacePlaceholder(a.a,
t.ansi, t.delimiter, t.printsep, false, string(t.input), list)
newCommand = &command
- t.selected = make(map[int32]selectedItem)
}
}
return true
diff --git a/src/util/util.go b/src/util/util.go
index 95c4e1b4..0aa1d804 100644
--- a/src/util/util.go
+++ b/src/util/util.go
@@ -112,3 +112,13 @@ func DurWithin(
func IsTty() bool {
return isatty.IsTerminal(os.Stdin.Fd())
}
+
+// Once returns a function that returns the specified boolean value only once
+func Once(nextResponse bool) func() bool {
+ state := nextResponse
+ return func() bool {
+ prevState := state
+ state = false
+ return prevState
+ }
+}
diff --git a/src/util/util_test.go b/src/util/util_test.go
index d6a03d9d..4baa56fb 100644
--- a/src/util/util_test.go
+++ b/src/util/util_test.go
@@ -20,3 +20,21 @@ func TestContrain(t *testing.T) {
t.Error("Expected", 3)
}
}
+
+func TestOnce(t *testing.T) {
+ o := Once(false)
+ if o() {
+ t.Error("Expected: false")
+ }
+ if o() {
+ t.Error("Expected: false")
+ }
+
+ o = Once(true)
+ if !o() {
+ t.Error("Expected: true")
+ }
+ if o() {
+ t.Error("Expected: false")
+ }
+}