go-prompt/main.go

115 lines
2.4 KiB
Go
Raw Normal View History

2017-07-05 15:59:22 +00:00
package main
import (
"fmt"
"syscall"
"github.com/c-bata/go-prompt-toolkit/prompt"
)
func enterAlternateScreen(fd int) {
syscall.Write(fd, []byte{0x1b, 0x5b, 0x3f, 0x01, 0x00, 0x04, 0x09, 0x68, 0x1b, 0x5b, 0x48})
}
func main() {
2017-07-06 16:00:35 +00:00
in := prompt.NewVT100Parser()
out := prompt.NewVT100Writer()
in.Setup()
defer in.TearDown()
2017-07-08 03:25:47 +00:00
defer fmt.Println("\nexited!")
2017-07-06 16:00:35 +00:00
out.SetTitle("はろー")
2017-07-05 15:59:22 +00:00
2017-07-09 13:44:28 +00:00
out.ScrollDown()
out.ScrollDown()
out.ScrollDown()
out.ScrollDown()
out.ScrollUp()
out.ScrollUp()
out.ScrollUp()
out.ScrollUp()
out.Flush()
2017-07-05 15:59:22 +00:00
bufCh := make(chan []byte, 128)
go readBuffer(bufCh)
buffer := prompt.NewBuffer()
for {
b := <-bufCh
2017-07-06 16:00:35 +00:00
if ac := in.GetASCIICode(b); ac == nil {
2017-07-08 03:25:47 +00:00
out.EraseDown()
out.WriteRaw(b)
2017-07-05 15:59:22 +00:00
buffer.InsertText(string(b), false, true)
} else if ac.Key == prompt.Enter || ac.Key == prompt.ControlJ {
buffer.InsertText("\n", false, true)
} else if ac.Key == prompt.Left {
buffer.CursorLeft(1)
2017-07-08 03:25:47 +00:00
out.CursorDown(1)
2017-07-06 16:00:35 +00:00
out.CursorBackward(1)
2017-07-08 03:25:47 +00:00
out.EraseDown()
out.CursorUp(1)
} else if ac.Key == prompt.Right {
buffer.CursorRight(1)
out.CursorDown(1)
out.EraseDown()
out.CursorForward(1)
out.CursorUp(1)
} else if ac.Key == prompt.Backspace {
buffer.DeleteBeforeCursor(1)
out.CursorBackward(1)
out.EraseDown()
2017-07-05 15:59:22 +00:00
} else if ac.Key == prompt.Right {
buffer.CursorRight(1)
} else if ac.Key == prompt.ControlT {
2017-07-06 16:00:35 +00:00
enterAlternateScreen(syscall.Stdout)
2017-07-08 03:25:47 +00:00
} else if ac.Key == prompt.ControlC {
out.EraseDown()
out.ClearTitle()
out.Flush()
return
2017-07-05 15:59:22 +00:00
} else {
2017-07-08 03:25:47 +00:00
out.WriteRaw(b)
//buffer.InsertText(ac.Key.String(), false, true)
2017-07-05 15:59:22 +00:00
}
2017-07-08 03:25:47 +00:00
// Display completions
2017-07-09 13:44:28 +00:00
out.SetColor("white", "teal")
2017-07-08 03:25:47 +00:00
out.CursorDown(1)
2017-07-09 13:44:28 +00:00
out.Write([]byte(" Foo "))
out.SetColor("white", "darkGray")
out.Write([]byte(" "))
out.SetColor("white", "teal")
out.CursorBackward(len("foo") + 3)
2017-07-08 03:25:47 +00:00
out.CursorDown(1)
2017-07-09 13:44:28 +00:00
out.Write([]byte(" Hello "))
out.SetColor("white", "darkGray")
out.Write([]byte(" "))
out.SetColor("white", "teal")
out.CursorBackward(len("Hello") + 3)
2017-07-08 03:25:47 +00:00
out.CursorDown(1)
2017-07-09 13:44:28 +00:00
out.Write([]byte(" World "))
out.SetColor("white", "darkGray")
out.Write([]byte(" "))
out.SetColor("white", "teal")
out.CursorBackward(len("World") + 3)
2017-07-08 03:25:47 +00:00
out.CursorUp(3)
2017-07-09 13:44:28 +00:00
out.SetColor("default", "default")
2017-07-08 03:25:47 +00:00
2017-07-06 16:00:35 +00:00
out.Flush()
2017-07-05 15:59:22 +00:00
}
}
func readBuffer(bufCh chan []byte) {
buf := make([]byte, 1024)
for {
if n, err := syscall.Read(syscall.Stdin, buf); err == nil {
bufCh <- buf[:n]
}
}
}