mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-01 14:47:38 +00:00
102 lines
1.7 KiB
Go
102 lines
1.7 KiB
Go
|
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()
|
||
|
}
|