1
0
mirror of https://github.com/shazow/ssh-chat.git synced 2025-04-23 12:10:30 +03:00

sshd/terminal: Add more readline-compatible navigation

- Alt-F: jump forward by a word
- Alt-B: jump backword by a word
- Ctrl-F: jump forward by a character
- Ctrl-B: jump backword by a character
This commit is contained in:
Akshay Shekher 2020-01-05 07:51:10 -08:00 committed by Andrey Petrov
parent 0a122be81e
commit 1b2a3e97a0

@ -129,6 +129,8 @@ const (
keyRight
keyAltLeft
keyAltRight
keyAltF
keyAltB
keyHome
keyEnd
keyDeleteWord
@ -155,8 +157,12 @@ func bytesToKey(b []byte, pasteActive bool) (rune, []byte) {
switch b[0] {
case 1: // ^A
return keyHome, b[1:]
case 2: // ^B
return keyLeft, b[1:]
case 5: // ^E
return keyEnd, b[1:]
case 6: // ^F
return keyRight, b[1:]
case 8: // ^H
return keyBackspace, b[1:]
case 11: // ^K
@ -206,6 +212,15 @@ func bytesToKey(b []byte, pasteActive bool) (rune, []byte) {
}
}
if !pasteActive && len(b) >= 2 && b[0] == keyEscape {
switch b[1] {
case 'f':
return keyAltF, b[2:]
case 'b':
return keyAltB, b[2:]
}
}
if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) {
return keyPasteStart, b[6:]
}
@ -467,10 +482,14 @@ func (t *Terminal) handleKey(key rune) (line string, ok bool) {
return
}
t.eraseNPreviousChars(1)
case keyAltB:
fallthrough
case keyAltLeft:
// move left by a word.
t.pos -= t.countToLeftWord()
t.moveCursorToPos(t.pos)
case keyAltF:
fallthrough
case keyAltRight:
// move right by a word.
t.pos += t.countToRightWord()