From 6c2ce28d0dca357195d267406b90e705c35312d5 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Fri, 13 Feb 2015 12:25:19 +0900 Subject: [PATCH] Add `--sync` option --- README.md | 4 +++- src/constants.go | 2 +- src/core.go | 19 +++++++------------ src/options.go | 12 +++++++++++- src/util/eventbox.go | 15 +++++++++++++++ 5 files changed, 37 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 8157bf0..fb62dff 100644 --- a/README.md +++ b/README.md @@ -89,10 +89,12 @@ usage: fzf [options] -0, --exit-0 Exit immediately when there's no match -f, --filter=STR Filter mode. Do not start interactive finder. --print-query Print query as the first line + --sync Synchronous search for multi-staged filtering + (e.g. 'fzf --multi | fzf --sync') Environment variables FZF_DEFAULT_COMMAND Default command to use when input is tty - FZF_DEFAULT_OPTS Defaults options. (e.g. "-x -m") + FZF_DEFAULT_OPTS Defaults options. (e.g. '-x -m') ``` fzf will launch curses-based finder, read the list from STDIN, and write the diff --git a/src/constants.go b/src/constants.go index 9b52743..7d54223 100644 --- a/src/constants.go +++ b/src/constants.go @@ -5,7 +5,7 @@ import ( ) // Current version -const Version = "0.9.2" +const Version = "0.9.3" // fzf events const ( diff --git a/src/core.go b/src/core.go index ee90413..ab61a6e 100644 --- a/src/core.go +++ b/src/core.go @@ -110,19 +110,8 @@ func Run(options *Options) { } pattern := patternBuilder([]rune(patternString)) - looping := true eventBox.Unwatch(EvtReadNew) - for looping { - eventBox.Wait(func(events *util.Events) { - for evt := range *events { - switch evt { - case EvtReadFin: - looping = false - return - } - } - }) - } + eventBox.WaitFor(EvtReadFin) snapshot, _ := chunkList.Snapshot() merger, cancelled := matcher.scan(MatchRequest{ @@ -142,6 +131,12 @@ func Run(options *Options) { } } + // Synchronous search + if opts.Sync { + eventBox.Unwatch(EvtReadNew) + eventBox.WaitFor(EvtReadFin) + } + // Go interactive go matcher.Loop() diff --git a/src/options.go b/src/options.go index b11328e..c426e77 100644 --- a/src/options.go +++ b/src/options.go @@ -41,10 +41,12 @@ const usage = `usage: fzf [options] -0, --exit-0 Exit immediately when there's no match -f, --filter=STR Filter mode. Do not start interactive finder. --print-query Print query as the first line + --sync Synchronous search for multi-staged filtering + (e.g. 'fzf --multi | fzf --sync') Environment variables FZF_DEFAULT_COMMAND Default command to use when input is tty - FZF_DEFAULT_OPTS Defaults options. (e.g. "-x -m") + FZF_DEFAULT_OPTS Defaults options. (e.g. '-x -m') ` @@ -88,6 +90,7 @@ type Options struct { Exit0 bool Filter *string PrintQuery bool + Sync bool Version bool } @@ -111,6 +114,7 @@ func defaultOptions() *Options { Exit0: false, Filter: nil, PrintQuery: false, + Sync: false, Version: false} } @@ -244,6 +248,12 @@ func parseOptions(opts *Options, allArgs []string) { opts.PrintQuery = false case "--prompt": opts.Prompt = nextString(allArgs, &i, "prompt string required") + case "--sync": + opts.Sync = true + case "--no-sync": + opts.Sync = false + case "--async": + opts.Sync = false case "--version": opts.Version = true default: diff --git a/src/util/eventbox.go b/src/util/eventbox.go index 568ad9f..a5821ea 100644 --- a/src/util/eventbox.go +++ b/src/util/eventbox.go @@ -78,3 +78,18 @@ func (b *EventBox) Unwatch(events ...EventType) { b.ignore[event] = true } } + +func (b *EventBox) WaitFor(event EventType) { + looping := true + for looping { + b.Wait(func(events *Events) { + for evt := range *events { + switch evt { + case event: + looping = false + return + } + } + }) + } +}