sshd/terminal: Use N-moves in Terminal.move when possible

This commit is contained in:
Andrey Petrov 2019-03-19 15:05:13 -04:00
parent 8b710da728
commit 418c991677

View File

@ -7,6 +7,7 @@ package terminal
import ( import (
"bytes" "bytes"
"io" "io"
"strconv"
"sync" "sync"
"unicode/utf8" "unicode/utf8"
) )
@ -276,34 +277,44 @@ func (t *Terminal) moveCursorToPos(pos int) {
} }
func (t *Terminal) move(up, down, left, right int) { func (t *Terminal) move(up, down, left, right int) {
movement := make([]rune, 3*(up+down+left+right)) m := []rune{}
m := movement
for i := 0; i < up; i++ { // 1 unit up can be expressed as ^[A
m[0] = keyEscape // 5 units up can be expressed as ^[[5A
m[1] = '['
m[2] = 'A' if up == 1 {
m = m[3:] m = append(m, keyEscape, '[', 'A')
} } else if up > 1 {
for i := 0; i < down; i++ { m = append(m, keyEscape, '[')
m[0] = keyEscape m = append(m, []rune(strconv.Itoa(up))...)
m[1] = '[' m = append(m, 'A')
m[2] = 'B'
m = m[3:]
}
for i := 0; i < left; i++ {
m[0] = keyEscape
m[1] = '['
m[2] = 'D'
m = m[3:]
}
for i := 0; i < right; i++ {
m[0] = keyEscape
m[1] = '['
m[2] = 'C'
m = m[3:]
} }
t.queue(movement) if down == 1 {
m = append(m, keyEscape, '[', 'B')
} else if down > 1 {
m = append(m, keyEscape, '[')
m = append(m, []rune(strconv.Itoa(down))...)
m = append(m, 'B')
}
if right == 1 {
m = append(m, keyEscape, '[', 'C')
} else if right > 1 {
m = append(m, keyEscape, '[')
m = append(m, []rune(strconv.Itoa(right))...)
m = append(m, 'C')
}
if left == 1 {
m = append(m, keyEscape, '[', 'D')
} else if left > 1 {
m = append(m, keyEscape, '[')
m = append(m, []rune(strconv.Itoa(left))...)
m = append(m, 'D')
}
t.queue(m)
} }
func (t *Terminal) clearLineToRight() { func (t *Terminal) clearLineToRight() {