summaryrefslogtreecommitdiff
path: root/src/reader.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2015-01-02 04:49:30 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2015-01-04 00:37:29 +0900
commitf3177305d5572b26f135fc045481358b4eb1bf69 (patch)
treed59fd9587e44e998581a131875bf45e243df6c6e /src/reader.go
parent7ba93d9f8351be64b37c65ae04d594ee261d5d26 (diff)
downloadfzf-f3177305d5572b26f135fc045481358b4eb1bf69.tar.gz
Rewrite fzf in Go
Diffstat (limited to 'src/reader.go')
-rw-r--r--src/reader.go60
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)
+}