diff options
author | Junegunn Choi <junegunn.c@gmail.com> | 2015-02-18 00:08:17 +0900 |
---|---|---|
committer | Junegunn Choi <junegunn.c@gmail.com> | 2015-02-18 00:08:17 +0900 |
commit | e808151c287513c9aef35be339b10a2861115ade (patch) | |
tree | 3f43b5951c61760f0b7cc85a68639b82a0ac615a /src/core.go | |
parent | d760b790b37a5d26b3068ed9f5b4efcaa3cf5cae (diff) |
Make --select-1 and --exit-0 asynchronous
Diffstat (limited to 'src/core.go')
-rw-r--r-- | src/core.go | 60 |
1 files changed, 34 insertions, 26 deletions
diff --git a/src/core.go b/src/core.go index ab61a6e7..71e3aa96 100644 --- a/src/core.go +++ b/src/core.go @@ -95,40 +95,25 @@ func Run(options *Options) { } matcher := NewMatcher(patternBuilder, opts.Sort > 0, eventBox) - // Defered-interactive / Non-interactive - // --select-1 | --exit-0 | --filter - if filtering := opts.Filter != nil; filtering || opts.Select1 || opts.Exit0 { - limit := 0 - var patternString string - if filtering { - patternString = *opts.Filter - } else { - if opts.Select1 || opts.Exit0 { - limit = 1 - } - patternString = opts.Query - } - pattern := patternBuilder([]rune(patternString)) + // Filtering mode + if opts.Filter != nil { + pattern := patternBuilder([]rune(*opts.Filter)) eventBox.Unwatch(EvtReadNew) eventBox.WaitFor(EvtReadFin) snapshot, _ := chunkList.Snapshot() - merger, cancelled := matcher.scan(MatchRequest{ + merger, _ := matcher.scan(MatchRequest{ chunks: snapshot, - pattern: pattern}, limit) + pattern: pattern}) - if !cancelled && (filtering || - opts.Exit0 && merger.Length() == 0 || - opts.Select1 && merger.Length() == 1) { - if opts.PrintQuery { - fmt.Println(patternString) - } - for i := 0; i < merger.Length(); i++ { - fmt.Println(merger.Get(i).AsString()) - } - os.Exit(0) + if opts.PrintQuery { + fmt.Println(*opts.Filter) } + for i := 0; i < merger.Length(); i++ { + fmt.Println(merger.Get(i).AsString()) + } + os.Exit(0) } // Synchronous search @@ -142,7 +127,11 @@ func Run(options *Options) { // Terminal I/O terminal := NewTerminal(opts, eventBox) + deferred := opts.Select1 || opts.Exit0 go terminal.Loop() + if !deferred { + terminal.startChan <- true + } // Event coordination reading := true @@ -176,6 +165,25 @@ func Run(options *Options) { case EvtSearchFin: switch val := value.(type) { case *Merger: + if deferred { + count := val.Length() + if opts.Select1 && count > 1 || opts.Exit0 && !opts.Select1 && count > 0 { + deferred = false + terminal.startChan <- true + } else if !reading { + if opts.Exit0 && count == 0 || opts.Select1 && count == 1 { + if opts.PrintQuery { + fmt.Println(opts.Query) + } + for i := 0; i < count; i++ { + fmt.Println(val.Get(i).AsString()) + } + os.Exit(0) + } + deferred = false + terminal.startChan <- true + } + } terminal.UpdateList(val) } } |