Add key mapping

This commit is contained in:
c-bata 2017-07-04 00:27:20 +09:00
parent 347c448da8
commit b1d9b38a82
2 changed files with 270 additions and 0 deletions

254
prompt/key.go Normal file
View File

@ -0,0 +1,254 @@
package prompt
type Key int
const (
Escape Key = iota
ControlA
ControlB
ControlC
ControlD
ControlE
ControlF
ControlG
ControlH
ControlI
ControlJ
ControlK
ControlL
ControlM
ControlN
ControlO
ControlP
ControlQ
ControlR
ControlS
ControlT
ControlU
ControlV
ControlW
ControlX
ControlY
ControlZ
ControlSpace
ControlBackslash
ControlSquareClose
ControlCircumflex
ControlUnderscore
ControlLeft
ControlRight
ControlUp
ControlDown
Up
Down
Right
Left
ShiftLeft
ShiftUp
ShiftDown
ShiftRight
Home
End
Delete
ShiftDelete
ControlDelete
PageUp
PageDown
BackTab
Insert
Backspace
// Aliases.
Tab
Enter
// Actually Enter equals ControlM, not ControlJ,
// However, in prompt_toolkit, we made the mistake of translating
// \r into \n during the input, so everyone is now handling the
// enter key by binding ControlJ.
// From now on, it's better to bind `ASCII_SEQUENCES.Enter` everywhere,
// because that's future compatible, and will still work when we
// stop replacing \r by \n.
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
F11
F12
F13
F14
F15
F16
F17
F18
F19
F20
F21
F22
F23
F24
// Matches any key.
Any
// Special
CPRResponse
Vt100MouseEvent
WindowsMouseEvent
BracketedPaste
// Key which is ignored. (The key binding for this key should not do anything.)
Ignore
)
type ASCIICode struct {
Key Key
ASCIICode []byte
}
var ASCII_SEQUENCES []*ASCIICode = []*ASCIICode{
&ASCIICode{Key: Escape, ASCIICode: []byte{0x1b}},
&ASCIICode{Key: ControlSpace, ASCIICode: []byte{0x00}},
&ASCIICode{Key: ControlA, ASCIICode: []byte{0x1}},
&ASCIICode{Key: ControlB, ASCIICode: []byte{0x2}},
&ASCIICode{Key: ControlC, ASCIICode: []byte{0x3}},
&ASCIICode{Key: ControlD, ASCIICode: []byte{0x4}},
&ASCIICode{Key: ControlE, ASCIICode: []byte{0x5}},
&ASCIICode{Key: ControlF, ASCIICode: []byte{0x6}},
&ASCIICode{Key: ControlG, ASCIICode: []byte{0x7}},
&ASCIICode{Key: ControlH, ASCIICode: []byte{0x8}},
&ASCIICode{Key: ControlI, ASCIICode: []byte{0x9}},
&ASCIICode{Key: ControlJ, ASCIICode: []byte{0xa}},
&ASCIICode{Key: ControlK, ASCIICode: []byte{0xb}},
&ASCIICode{Key: ControlL, ASCIICode: []byte{0xc}},
&ASCIICode{Key: ControlM, ASCIICode: []byte{0xd}},
&ASCIICode{Key: ControlN, ASCIICode: []byte{0xe}},
&ASCIICode{Key: ControlO, ASCIICode: []byte{0xf}},
&ASCIICode{Key: ControlP, ASCIICode: []byte{0x10}},
&ASCIICode{Key: ControlQ, ASCIICode: []byte{0x11}},
&ASCIICode{Key: ControlR, ASCIICode: []byte{0x12}},
&ASCIICode{Key: ControlS, ASCIICode: []byte{0x13}},
&ASCIICode{Key: ControlT, ASCIICode: []byte{0x14}},
&ASCIICode{Key: ControlU, ASCIICode: []byte{0x15}},
&ASCIICode{Key: ControlV, ASCIICode: []byte{0x16}},
&ASCIICode{Key: ControlW, ASCIICode: []byte{0x17}},
&ASCIICode{Key: ControlX, ASCIICode: []byte{0x18}},
&ASCIICode{Key: ControlY, ASCIICode: []byte{0x19}},
&ASCIICode{Key: ControlZ, ASCIICode: []byte{0x1a}},
&ASCIICode{Key: ControlBackslash, ASCIICode: []byte{0x1c}},
&ASCIICode{Key: ControlSquareClose, ASCIICode: []byte{0x1d}},
&ASCIICode{Key: ControlCircumflex, ASCIICode: []byte{0x1e}},
&ASCIICode{Key: ControlUnderscore, ASCIICode: []byte{0x1f}},
&ASCIICode{Key: Backspace, ASCIICode: []byte{0x7f}},
&ASCIICode{Key: Up, ASCIICode: []byte{0x1b, 0x5b, 0x41}},
&ASCIICode{Key: Down, ASCIICode: []byte{0x1b, 0x5b, 0x42}},
&ASCIICode{Key: Right, ASCIICode: []byte{0x1b, 0x5b, 0x43}},
&ASCIICode{Key: Left, ASCIICode: []byte{0x1b, 0x5b, 0x44}},
&ASCIICode{Key: Home, ASCIICode: []byte{0x1b, 0x5b, 0x48}},
&ASCIICode{Key: Home, ASCIICode: []byte{0x1b, 0x4f, 0x48}},
&ASCIICode{Key: End, ASCIICode: []byte{0x1b, 0x5b, 0x70}},
&ASCIICode{Key: End, ASCIICode: []byte{0x1b, 0x4f, 0x70}},
&ASCIICode{Key: Delete, ASCIICode: []byte{0x1b, 0x5b, 0x33, 0x7e}},
&ASCIICode{Key: ShiftDelete, ASCIICode: []byte{0x1b, 0x5b, 0x33, 0x3b, 0x02, 0x7e}},
&ASCIICode{Key: ControlDelete, ASCIICode: []byte{0x1b, 0x5b, 0x33, 0x3b, 0x05, 0x7e}},
&ASCIICode{Key: Home, ASCIICode: []byte{0x1b, 0x5b, 0x01, 0x7e}},
&ASCIICode{Key: End, ASCIICode: []byte{0x1b, 0x5b, 0x04, 0x7e}},
&ASCIICode{Key: PageUp, ASCIICode: []byte{0x1b, 0x5b, 0x05, 0x7e}},
&ASCIICode{Key: PageDown, ASCIICode: []byte{0x1b, 0x5b, 0x06, 0x7e}},
&ASCIICode{Key: Home, ASCIICode: []byte{0x1b, 0x5b, 0x07, 0x7e}},
&ASCIICode{Key: End, ASCIICode: []byte{0x1b, 0x5b, 0x09, 0x7e}},
&ASCIICode{Key: BackTab, ASCIICode: []byte{0x1b, 0x5b, 0x5a}},
&ASCIICode{Key: Insert, ASCIICode: []byte{0x1b, 0x5b, 0x02, 0x7e}},
&ASCIICode{Key: F1, ASCIICode: []byte{0x1b, 0x4f, 0x50}},
&ASCIICode{Key: F2, ASCIICode: []byte{0x1b, 0x4f, 0x51}},
&ASCIICode{Key: F3, ASCIICode: []byte{0x1b, 0x4f, 0x52}},
&ASCIICode{Key: F4, ASCIICode: []byte{0x1b, 0x4f, 0x53}},
&ASCIICode{Key: F1, ASCIICode: []byte{0x1b, 0x4f, 0x50, 0x41}}, // Linux console
&ASCIICode{Key: F2, ASCIICode: []byte{0x1b, 0x5b, 0x5b, 0x42}}, // Linux console
&ASCIICode{Key: F3, ASCIICode: []byte{0x1b, 0x5b, 0x5b, 0x43}}, // Linux console
&ASCIICode{Key: F4, ASCIICode: []byte{0x1b, 0x5b, 0x5b, 0x44}}, // Linux console
&ASCIICode{Key: F5, ASCIICode: []byte{0x1b, 0x5b, 0x5b, 0x45}}, // Linux console
&ASCIICode{Key: F1, ASCIICode: []byte{0x1b, 0x5b, 0x11, 0x7e}}, // rxvt-unicode
&ASCIICode{Key: F2, ASCIICode: []byte{0x1b, 0x5b, 0x12, 0x7e}}, // rxvt-unicode
&ASCIICode{Key: F3, ASCIICode: []byte{0x1b, 0x5b, 0x13, 0x7e}}, // rxvt-unicode
&ASCIICode{Key: F4, ASCIICode: []byte{0x1b, 0x5b, 0x14, 0x7e}}, // rxvt-unicode
&ASCIICode{Key: F5, ASCIICode: []byte{0x1b, 0x5b, 0x31, 0x35, 0x7e}},
&ASCIICode{Key: F6, ASCIICode: []byte{0x1b, 0x5b, 0x31, 0x37, 0x7e}},
&ASCIICode{Key: F7, ASCIICode: []byte{0x1b, 0x5b, 0x31, 0x38, 0x7e}},
&ASCIICode{Key: F8, ASCIICode: []byte{0x1b, 0x5b, 0x31, 0x39, 0x7e}},
&ASCIICode{Key: F9, ASCIICode: []byte{0x1b, 0x5b, 0x32, 0x30, 0x7e}},
&ASCIICode{Key: F10, ASCIICode: []byte{0x1b, 0x5b, 0x32, 0x31, 0x7e}},
&ASCIICode{Key: F11, ASCIICode: []byte{0x1b, 0x5b, 0x32, 0x32, 0x7e}},
&ASCIICode{Key: F12, ASCIICode: []byte{0x1b, 0x5b, 0x32, 0x34, 0x7e, 0x8}},
&ASCIICode{Key: F13, ASCIICode: []byte{0x1b, 0x5b, 0x25, 0x7e}},
&ASCIICode{Key: F14, ASCIICode: []byte{0x1b, 0x5b, 0x26, 0x7e}},
&ASCIICode{Key: F15, ASCIICode: []byte{0x1b, 0x5b, 0x28, 0x7e}},
&ASCIICode{Key: F16, ASCIICode: []byte{0x1b, 0x5b, 0x29, 0x7e}},
&ASCIICode{Key: F17, ASCIICode: []byte{0x1b, 0x5b, 0x31, 0x7e}},
&ASCIICode{Key: F18, ASCIICode: []byte{0x1b, 0x5b, 0x32, 0x7e}},
&ASCIICode{Key: F19, ASCIICode: []byte{0x1b, 0x5b, 0x33, 0x7e}},
&ASCIICode{Key: F20, ASCIICode: []byte{0x1b, 0x5b, 0x34, 0x7e}},
// Xterm
&ASCIICode{Key: F13, ASCIICode: []byte{0x1b, 0x5b, 0x01, 0x3b, 0x02, 0x50}},
&ASCIICode{Key: F14, ASCIICode: []byte{0x1b, 0x5b, 0x01, 0x3b, 0x02, 0x51}},
// &ASCIICode{Key: F15, ASCIICode: []byte{0x1b, 0x5b, 0x01, 0x3b, 0x02, 0x52}}, // Conflicts with CPR response
&ASCIICode{Key: F16, ASCIICode: []byte{0x1b, 0x5b, 0x01, 0x3b, 0x02, 0x52}},
&ASCIICode{Key: F17, ASCIICode: []byte{0x1b, 0x5b, 0x15, 0x3b, 0x02, 0x7e}},
&ASCIICode{Key: F18, ASCIICode: []byte{0x1b, 0x5b, 0x17, 0x3b, 0x02, 0x7e}},
&ASCIICode{Key: F19, ASCIICode: []byte{0x1b, 0x5b, 0x18, 0x3b, 0x02, 0x7e}},
&ASCIICode{Key: F20, ASCIICode: []byte{0x1b, 0x5b, 0x19, 0x3b, 0x02, 0x7e}},
&ASCIICode{Key: F21, ASCIICode: []byte{0x1b, 0x5b, 0x20, 0x3b, 0x02, 0x7e}},
&ASCIICode{Key: F22, ASCIICode: []byte{0x1b, 0x5b, 0x21, 0x3b, 0x02, 0x7e}},
&ASCIICode{Key: F23, ASCIICode: []byte{0x1b, 0x5b, 0x23, 0x3b, 0x02, 0x7e}},
&ASCIICode{Key: F24, ASCIICode: []byte{0x1b, 0x5b, 0x24, 0x3b, 0x02, 0x7e}},
&ASCIICode{Key: ControlUp, ASCIICode: []byte{0x1b, 0x5b, 0x01, 0x3b, 0x5a}},
&ASCIICode{Key: ControlDown, ASCIICode: []byte{0x1b, 0x5b, 0x01, 0x3b, 0x5b}},
&ASCIICode{Key: ControlRight, ASCIICode: []byte{0x1b, 0x5b, 0x01, 0x3b, 0x5c}},
&ASCIICode{Key: ControlLeft, ASCIICode: []byte{0x1b, 0x5b, 0x01, 0x3b, 0x5d}},
&ASCIICode{Key: ShiftUp, ASCIICode: []byte{0x1b, 0x5b, 0x01, 0x2a}},
&ASCIICode{Key: ShiftDown, ASCIICode: []byte{0x1b, 0x5b, 0x01, 0x2b}},
&ASCIICode{Key: ShiftRight, ASCIICode: []byte{0x1b, 0x5b, 0x01, 0x2c}},
&ASCIICode{Key: ShiftLeft, ASCIICode: []byte{0x1b, 0x5b, 0x01, 0x2d}},
// Tmux sends following keystrokes when control+arrow is pressed, but for
// Emacs ansi-term sends the same sequences for normal arrow keys. Consider
// it a normal arrow press, because that's more important.
&ASCIICode{Key: Up, ASCIICode: []byte{0x1b, 0x4f, 0x41}},
&ASCIICode{Key: Down, ASCIICode: []byte{0x1b, 0x4f, 0x42}},
&ASCIICode{Key: Right, ASCIICode: []byte{0x1b, 0x4f, 0x43}},
&ASCIICode{Key: Left, ASCIICode: []byte{0x1b, 0x4f, 0x44}},
&ASCIICode{Key: ControlUp, ASCIICode: []byte{0x1b, 0x5b, 0x05, 0x41}},
&ASCIICode{Key: ControlDown, ASCIICode: []byte{0x1b, 0x5b, 0x05, 0x42}},
&ASCIICode{Key: ControlRight, ASCIICode: []byte{0x1b, 0x5b, 0x05, 0x43}},
&ASCIICode{Key: ControlLeft, ASCIICode: []byte{0x1b, 0x5b, 0x05, 0x44}},
&ASCIICode{Key: ControlRight, ASCIICode: []byte{0x1b, 0x5b, 0x4f, 0x63}}, // rxvt
&ASCIICode{Key: ControlLeft, ASCIICode: []byte{0x1b, 0x5b, 0x4f, 0x64}}, // rxvt
&ASCIICode{Key: Ignore, ASCIICode: []byte{0x1b, 0x5b, 0x45}}, // Xterm
&ASCIICode{Key: Ignore, ASCIICode: []byte{0x1b, 0x5b, 0x46}}, // Linux console
}

16
prompt/key_string.go Normal file
View File

@ -0,0 +1,16 @@
// Code generated by "stringer -type Key key.go"; DO NOT EDIT
package prompt
import "fmt"
const _Key_name = "EscapeControlAControlBControlCControlDControlEControlFControlGControlHControlIControlJControlKControlLControlMControlNControlOControlPControlQControlRControlSControlTControlUControlVControlWControlXControlYControlZControlSpaceControlBackslashControlSquareCloseControlCircumflexControlUnderscoreControlLeftControlRightControlUpControlDownUpDownRightLeftShiftLeftShiftUpShiftDownShiftRightHomeEndDeleteShiftDeleteControlDeletePageUpPageDownBackTabInsertBackspaceTabEnterF1F2F3F4F5F6F7F8F9F10F11F12F13F14F15F16F17F18F19F20F21F22F23F24AnyCPRResponseVt100MouseEventWindowsMouseEventBracketedPasteIgnore"
var _Key_index = [...]uint16{0, 6, 14, 22, 30, 38, 46, 54, 62, 70, 78, 86, 94, 102, 110, 118, 126, 134, 142, 150, 158, 166, 174, 182, 190, 198, 206, 214, 226, 242, 260, 277, 294, 305, 317, 326, 337, 339, 343, 348, 352, 361, 368, 377, 387, 391, 394, 400, 411, 424, 430, 438, 445, 451, 460, 463, 468, 470, 472, 474, 476, 478, 480, 482, 484, 486, 489, 492, 495, 498, 501, 504, 507, 510, 513, 516, 519, 522, 525, 528, 531, 534, 545, 560, 577, 591, 597}
func (i Key) String() string {
if i < 0 || i >= Key(len(_Key_index)-1) {
return fmt.Sprintf("Key(%d)", i)
}
return _Key_name[_Key_index[i]:_Key_index[i+1]]
}