|
@@ -116,19 +116,9 @@ func (i *Instance) Readline() (string, error) {
|
|
|
|
|
|
switch r {
|
|
switch r {
|
|
case KeyUp:
|
|
case KeyUp:
|
|
- if i.History.Pos > 0 {
|
|
|
|
- if i.History.Pos == i.History.Size() {
|
|
|
|
- currentLineBuf = []rune(buf.String())
|
|
|
|
- }
|
|
|
|
- buf.Replace([]rune(i.History.Prev()))
|
|
|
|
- }
|
|
|
|
|
|
+ i.historyPrev(buf, ¤tLineBuf)
|
|
case KeyDown:
|
|
case KeyDown:
|
|
- if i.History.Pos < i.History.Size() {
|
|
|
|
- buf.Replace([]rune(i.History.Next()))
|
|
|
|
- if i.History.Pos == i.History.Size() {
|
|
|
|
- buf.Replace(currentLineBuf)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ i.historyNext(buf, ¤tLineBuf)
|
|
case KeyLeft:
|
|
case KeyLeft:
|
|
buf.MoveLeft()
|
|
buf.MoveLeft()
|
|
case KeyRight:
|
|
case KeyRight:
|
|
@@ -185,6 +175,10 @@ func (i *Instance) Readline() (string, error) {
|
|
esc = true
|
|
esc = true
|
|
case CharInterrupt:
|
|
case CharInterrupt:
|
|
return "", ErrInterrupt
|
|
return "", ErrInterrupt
|
|
|
|
+ case CharPrev:
|
|
|
|
+ i.historyPrev(buf, ¤tLineBuf)
|
|
|
|
+ case CharNext:
|
|
|
|
+ i.historyNext(buf, ¤tLineBuf)
|
|
case CharLineStart:
|
|
case CharLineStart:
|
|
buf.MoveToStart()
|
|
buf.MoveToStart()
|
|
case CharLineEnd:
|
|
case CharLineEnd:
|
|
@@ -246,6 +240,24 @@ func (i *Instance) HistoryDisable() {
|
|
i.History.Enabled = false
|
|
i.History.Enabled = false
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func (i *Instance) historyPrev(buf *Buffer, currentLineBuf *[]rune) {
|
|
|
|
+ if i.History.Pos > 0 {
|
|
|
|
+ if i.History.Pos == i.History.Size() {
|
|
|
|
+ *currentLineBuf = []rune(buf.String())
|
|
|
|
+ }
|
|
|
|
+ buf.Replace([]rune(i.History.Prev()))
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (i *Instance) historyNext(buf *Buffer, currentLineBuf *[]rune) {
|
|
|
|
+ if i.History.Pos < i.History.Size() {
|
|
|
|
+ buf.Replace([]rune(i.History.Next()))
|
|
|
|
+ if i.History.Pos == i.History.Size() {
|
|
|
|
+ buf.Replace(*currentLineBuf)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
func NewTerminal() (*Terminal, error) {
|
|
func NewTerminal() (*Terminal, error) {
|
|
fd := os.Stdin.Fd()
|
|
fd := os.Stdin.Fd()
|
|
termios, err := SetRawMode(fd)
|
|
termios, err := SetRawMode(fd)
|