package readline import ( "container/list" "fmt" "io" "os" "sync" "syscall" "github.com/ergochat/readline/internal/term" ) const ( CharLineStart = 1 CharBackward = 2 CharInterrupt = 3 CharEOT = 4 CharLineEnd = 5 CharForward = 6 CharBell = 7 CharCtrlH = 8 CharTab = 9 CharCtrlJ = 10 CharKill = 11 CharCtrlL = 12 CharEnter = 13 CharNext = 14 CharPrev = 16 CharBckSearch = 18 CharFwdSearch = 19 CharTranspose = 20 CharCtrlU = 21 CharCtrlW = 23 CharCtrlY = 25 CharCtrlZ = 26 CharEsc = 27 CharCtrl_ = 31 CharO = 79 CharEscapeEx = 91 CharBackspace = 127 ) const ( MetaBackward rune = -iota - 1 MetaForward MetaDelete MetaBackspace MetaTranspose MetaShiftTab MetaDeleteKey ) type rawModeHandler struct { sync.Mutex state *term.State } func (r *rawModeHandler) Enter() (err error) { r.Lock() defer r.Unlock() r.state, err = term.MakeRaw(int(syscall.Stdin)) return err } func (r *rawModeHandler) Exit() error { r.Lock() defer r.Unlock() if r.state == nil { return nil } err := term.Restore(int(syscall.Stdin), r.state) if err == nil { r.state = nil } return err } func clearScreen(w io.Writer) error { _, err := w.Write([]byte("\x1b[H\x1b[J")) return err } // ----------------------------------------------------------------------------- // print a linked list to Debug() func debugList(l *list.List) { idx := 0 for e := l.Front(); e != nil; e = e.Next() { debugPrint("%d %+v", idx, e.Value) idx++ } } // append log info to another file func debugPrint(fmtStr string, o ...interface{}) { f, _ := os.OpenFile("debug.tmp", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) fmt.Fprintf(f, fmtStr, o...) fmt.Fprintln(f) f.Close() }