add basic readline shortcuts
This commit is contained in:
parent
a3594319b7
commit
34c58b634a
80
ui.go
80
ui.go
@ -624,46 +624,90 @@ func (ui *UI) prompt(nav *Nav, pref string) string {
|
|||||||
defer termbox.HideCursor()
|
defer termbox.HideCursor()
|
||||||
termbox.Flush()
|
termbox.Flush()
|
||||||
|
|
||||||
var acc []rune
|
var lacc []rune
|
||||||
|
var racc []rune
|
||||||
|
|
||||||
|
var buf []rune
|
||||||
|
|
||||||
for {
|
for {
|
||||||
switch ev := termbox.PollEvent(); ev.Type {
|
switch ev := termbox.PollEvent(); ev.Type {
|
||||||
case termbox.EventKey:
|
case termbox.EventKey:
|
||||||
if ev.Ch != 0 {
|
if ev.Ch != 0 {
|
||||||
acc = append(acc, ev.Ch)
|
lacc = append(lacc, ev.Ch)
|
||||||
} else {
|
} else {
|
||||||
// TODO: rest of the keys
|
// TODO: rest of the keys
|
||||||
switch ev.Key {
|
switch ev.Key {
|
||||||
|
case termbox.KeyEsc:
|
||||||
|
return ""
|
||||||
case termbox.KeySpace:
|
case termbox.KeySpace:
|
||||||
acc = append(acc, ' ')
|
lacc = append(lacc, ' ')
|
||||||
case termbox.KeyBackspace2:
|
|
||||||
if len(acc) > 0 {
|
|
||||||
acc = acc[:len(acc)-1]
|
|
||||||
}
|
|
||||||
case termbox.KeyEnter:
|
|
||||||
win.printl(0, 0, fg, bg, "")
|
|
||||||
termbox.SetCursor(win.x, win.y)
|
|
||||||
termbox.Flush()
|
|
||||||
return string(acc)
|
|
||||||
case termbox.KeyTab:
|
case termbox.KeyTab:
|
||||||
var matches []string
|
var matches []string
|
||||||
if pref == ":" {
|
if pref == ":" {
|
||||||
matches, acc = compCmd(acc)
|
matches, lacc = compCmd(lacc)
|
||||||
} else {
|
} else {
|
||||||
matches, acc = compShell(acc)
|
matches, lacc = compShell(lacc)
|
||||||
}
|
}
|
||||||
ui.draw(nav)
|
ui.draw(nav)
|
||||||
if len(matches) > 1 {
|
if len(matches) > 1 {
|
||||||
ui.listMatches(matches)
|
ui.listMatches(matches)
|
||||||
}
|
}
|
||||||
case termbox.KeyEsc:
|
case termbox.KeyEnter, termbox.KeyCtrlJ:
|
||||||
return ""
|
win.printl(0, 0, fg, bg, "")
|
||||||
|
termbox.SetCursor(win.x, win.y)
|
||||||
|
termbox.Flush()
|
||||||
|
return string(append(lacc, racc...))
|
||||||
|
case termbox.KeyBackspace, termbox.KeyBackspace2:
|
||||||
|
if len(lacc) > 0 {
|
||||||
|
lacc = lacc[:len(lacc)-1]
|
||||||
|
}
|
||||||
|
case termbox.KeyDelete, termbox.KeyCtrlD:
|
||||||
|
if len(racc) > 0 {
|
||||||
|
racc = racc[1:]
|
||||||
|
}
|
||||||
|
case termbox.KeyArrowLeft, termbox.KeyCtrlB:
|
||||||
|
if len(lacc) > 0 {
|
||||||
|
racc = append([]rune{lacc[len(lacc)-1]}, racc...)
|
||||||
|
lacc = lacc[:len(lacc)-1]
|
||||||
|
}
|
||||||
|
case termbox.KeyArrowRight, termbox.KeyCtrlF:
|
||||||
|
if len(racc) > 0 {
|
||||||
|
lacc = append(lacc, racc[0])
|
||||||
|
racc = racc[1:]
|
||||||
|
}
|
||||||
|
case termbox.KeyHome, termbox.KeyCtrlA:
|
||||||
|
racc = append(lacc, racc...)
|
||||||
|
lacc = nil
|
||||||
|
case termbox.KeyEnd, termbox.KeyCtrlE:
|
||||||
|
lacc = append(lacc, racc...)
|
||||||
|
racc = nil
|
||||||
|
case termbox.KeyCtrlK:
|
||||||
|
if len(racc) > 0 {
|
||||||
|
buf = racc
|
||||||
|
racc = nil
|
||||||
|
}
|
||||||
|
case termbox.KeyCtrlU:
|
||||||
|
if len(lacc) > 0 {
|
||||||
|
buf = lacc
|
||||||
|
lacc = nil
|
||||||
|
}
|
||||||
|
case termbox.KeyCtrlW:
|
||||||
|
ind := strings.LastIndex(strings.TrimRight(string(lacc), " "), " ") + 1
|
||||||
|
buf = lacc[ind:]
|
||||||
|
lacc = lacc[:ind]
|
||||||
|
case termbox.KeyCtrlY:
|
||||||
|
lacc = append(lacc, buf...)
|
||||||
|
case termbox.KeyCtrlT:
|
||||||
|
if len(lacc) > 1 {
|
||||||
|
lacc[len(lacc)-1], lacc[len(lacc)-2] = lacc[len(lacc)-2], lacc[len(lacc)-1]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
win.printl(0, 0, fg, bg, pref)
|
win.printl(0, 0, fg, bg, pref)
|
||||||
win.print(len(pref), 0, fg, bg, string(acc))
|
win.print(len(pref), 0, fg, bg, string(lacc))
|
||||||
termbox.SetCursor(win.x+len(pref)+len(acc), win.y)
|
win.print(len(pref)+len(lacc), 0, fg, bg, string(racc))
|
||||||
|
termbox.SetCursor(win.x+len(pref)+len(lacc), win.y)
|
||||||
termbox.Flush()
|
termbox.Flush()
|
||||||
default:
|
default:
|
||||||
// TODO: handle other events
|
// TODO: handle other events
|
||||||
|
Loading…
Reference in New Issue
Block a user