v0.4.1 export control key
This commit is contained in:
2 files changed
+53
No files matched your search
@@ -0,0 +1,26 @@
|
|||||||
|
package terminal
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestControlKey(t *testing.T) {
|
||||||
|
cases := map[rune]Key{
|
||||||
|
'a': KeyCtrlA, 'G': KeyCtrlG, 'z': KeyCtrlZ,
|
||||||
|
'h': KeyBackspace, 'i': KeyTab, 'j': KeyEnter, 'm': KeyEnter,
|
||||||
|
' ': KeyCtrlSpace, '@': KeyCtrlSpace, '2': KeyCtrlSpace,
|
||||||
|
'[': KeyEscape, '3': KeyEscape,
|
||||||
|
'\\': KeyCtrlBackslash, '4': KeyCtrlBackslash,
|
||||||
|
']': KeyCtrlBracketRight, '5': KeyCtrlBracketRight,
|
||||||
|
'^': KeyCtrlCaret, '6': KeyCtrlCaret,
|
||||||
|
'_': KeyCtrlUnderscore, '-': KeyCtrlUnderscore, '/': KeyCtrlUnderscore, '7': KeyCtrlUnderscore,
|
||||||
|
}
|
||||||
|
for r, want := range cases {
|
||||||
|
if got, ok := ControlKey(r); !ok || got != want {
|
||||||
|
t.Errorf("ControlKey(%q) = %v, %v; want %v, true", r, got, ok, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, r := range []rune{'1', '8', '.', '~', 'é', 0} {
|
||||||
|
if _, ok := ControlKey(r); ok {
|
||||||
|
t.Errorf("ControlKey(%q) ok, want none", r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -663,3 +663,30 @@ func decodeRune(data []byte) (rune, int) {
|
|||||||
|
|
||||||
return r, size
|
return r, size
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ControlKey is the key a terminal reads for Ctrl with a printable character: the
|
||||||
|
// control byte that pair sends, parsed as input parsing reads it. Letters of
|
||||||
|
// either case, space and '@', '[' '\' ']' '^' '_', '-' and '/' as '_', and the
|
||||||
|
// digits 2 to 7 have one; ok is false for any other character.
|
||||||
|
func ControlKey(r rune) (Key, bool) {
|
||||||
|
var b byte
|
||||||
|
switch {
|
||||||
|
case r >= 'a' && r <= 'z', r >= 'A' && r <= 'Z':
|
||||||
|
b = byte(r) & 0x1f
|
||||||
|
case r == ' ', r == '@', r == '2':
|
||||||
|
b = 0x00
|
||||||
|
case r == '[', r == '3':
|
||||||
|
b = 0x1b
|
||||||
|
case r == '\\', r == '4':
|
||||||
|
b = 0x1c
|
||||||
|
case r == ']', r == '5':
|
||||||
|
b = 0x1d
|
||||||
|
case r == '^', r == '6':
|
||||||
|
b = 0x1e
|
||||||
|
case r == '_', r == '-', r == '/', r == '7':
|
||||||
|
b = 0x1f
|
||||||
|
default:
|
||||||
|
return KeyNone, false
|
||||||
|
}
|
||||||
|
return (*inputReader)(nil).parseControl(b).Key, true
|
||||||
|
}
|
||||||
Reference in new issue
Block a user