diff options
| author | Junegunn Choi <junegunn.c@gmail.com> | 2015-01-02 04:49:30 +0900 |
|---|---|---|
| committer | Junegunn Choi <junegunn.c@gmail.com> | 2015-01-04 00:37:29 +0900 |
| commit | f3177305d5572b26f135fc045481358b4eb1bf69 (patch) | |
| tree | d59fd9587e44e998581a131875bf45e243df6c6e /src/reader.go | |
| parent | 7ba93d9f8351be64b37c65ae04d594ee261d5d26 (diff) | |
| download | fzf-f3177305d5572b26f135fc045481358b4eb1bf69.tar.gz | |
Rewrite fzf in Go
Diffstat (limited to 'src/reader.go')
| -rw-r--r-- | src/reader.go | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/reader.go b/src/reader.go new file mode 100644 index 00000000..0e1f0a9c --- /dev/null +++ b/src/reader.go @@ -0,0 +1,60 @@ +package fzf + +// #include <unistd.h> +import "C" + +import ( + "bufio" + "fmt" + "io" + "os" + "os/exec" +) + +const DEFAULT_COMMAND = "find * -path '*/\\.*' -prune -o -type f -print -o -type l -print 2> /dev/null" + +type Reader struct { + pusher func(string) + eventBox *EventBox +} + +func (r *Reader) ReadSource() { + if int(C.isatty(C.int(os.Stdin.Fd()))) != 0 { + cmd := os.Getenv("FZF_DEFAULT_COMMAND") + if len(cmd) == 0 { + cmd = DEFAULT_COMMAND + } + r.readFromCommand(cmd) + } else { + r.readFromStdin() + } + r.eventBox.Set(EVT_READ_FIN, nil) +} + +func (r *Reader) feed(src io.Reader) { + if scanner := bufio.NewScanner(src); scanner != nil { + for scanner.Scan() { + r.pusher(scanner.Text()) + r.eventBox.Set(EVT_READ_NEW, nil) + } + } +} + +func (r *Reader) readFromStdin() { + r.feed(os.Stdin) +} + +func (r *Reader) readFromCommand(cmd string) { + arg := fmt.Sprintf("%q", cmd) + listCommand := exec.Command("sh", "-c", arg[1:len(arg)-1]) + out, err := listCommand.StdoutPipe() + if err != nil { + return + } + err = listCommand.Start() + if err != nil { + return + } + defer listCommand.Wait() + r.feed(out) +} |
