|
""" |
|
Mappings from VT100 (ANSI) escape sequences to the corresponding prompt_toolkit |
|
keys. |
|
|
|
We are not using the terminfo/termcap databases to detect the ANSI escape |
|
sequences for the input. Instead, we recognize 99% of the most common |
|
sequences. This works well, because in practice, every modern terminal is |
|
mostly Xterm compatible. |
|
|
|
Some useful docs: |
|
- Mintty: https://github.com/mintty/mintty/blob/master/wiki/Keycodes.md |
|
""" |
|
|
|
from __future__ import annotations |
|
|
|
from ..keys import Keys |
|
|
|
__all__ = [ |
|
"ANSI_SEQUENCES", |
|
"REVERSE_ANSI_SEQUENCES", |
|
] |
|
|
|
|
|
ANSI_SEQUENCES: dict[str, Keys | tuple[Keys, ...]] = { |
|
|
|
"\x00": Keys.ControlAt, |
|
"\x01": Keys.ControlA, |
|
"\x02": Keys.ControlB, |
|
"\x03": Keys.ControlC, |
|
"\x04": Keys.ControlD, |
|
"\x05": Keys.ControlE, |
|
"\x06": Keys.ControlF, |
|
"\x07": Keys.ControlG, |
|
"\x08": Keys.ControlH, |
|
"\x09": Keys.ControlI, |
|
"\x0a": Keys.ControlJ, |
|
"\x0b": Keys.ControlK, |
|
"\x0c": Keys.ControlL, |
|
"\x0d": Keys.ControlM, |
|
"\x0e": Keys.ControlN, |
|
"\x0f": Keys.ControlO, |
|
"\x10": Keys.ControlP, |
|
"\x11": Keys.ControlQ, |
|
"\x12": Keys.ControlR, |
|
"\x13": Keys.ControlS, |
|
"\x14": Keys.ControlT, |
|
"\x15": Keys.ControlU, |
|
"\x16": Keys.ControlV, |
|
"\x17": Keys.ControlW, |
|
"\x18": Keys.ControlX, |
|
"\x19": Keys.ControlY, |
|
"\x1a": Keys.ControlZ, |
|
"\x1b": Keys.Escape, |
|
"\x9b": Keys.ShiftEscape, |
|
"\x1c": Keys.ControlBackslash, |
|
"\x1d": Keys.ControlSquareClose, |
|
"\x1e": Keys.ControlCircumflex, |
|
"\x1f": Keys.ControlUnderscore, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"\x7f": Keys.ControlH, |
|
|
|
|
|
"\x1b[1~": Keys.Home, |
|
"\x1b[2~": Keys.Insert, |
|
"\x1b[3~": Keys.Delete, |
|
"\x1b[4~": Keys.End, |
|
"\x1b[5~": Keys.PageUp, |
|
"\x1b[6~": Keys.PageDown, |
|
"\x1b[7~": Keys.Home, |
|
"\x1b[8~": Keys.End, |
|
"\x1b[Z": Keys.BackTab, |
|
"\x1b\x09": Keys.BackTab, |
|
"\x1b[~": Keys.BackTab, |
|
|
|
|
|
"\x1bOP": Keys.F1, |
|
"\x1bOQ": Keys.F2, |
|
"\x1bOR": Keys.F3, |
|
"\x1bOS": Keys.F4, |
|
"\x1b[[A": Keys.F1, |
|
"\x1b[[B": Keys.F2, |
|
"\x1b[[C": Keys.F3, |
|
"\x1b[[D": Keys.F4, |
|
"\x1b[[E": Keys.F5, |
|
"\x1b[11~": Keys.F1, |
|
"\x1b[12~": Keys.F2, |
|
"\x1b[13~": Keys.F3, |
|
"\x1b[14~": Keys.F4, |
|
"\x1b[15~": Keys.F5, |
|
"\x1b[17~": Keys.F6, |
|
"\x1b[18~": Keys.F7, |
|
"\x1b[19~": Keys.F8, |
|
"\x1b[20~": Keys.F9, |
|
"\x1b[21~": Keys.F10, |
|
"\x1b[23~": Keys.F11, |
|
"\x1b[24~": Keys.F12, |
|
"\x1b[25~": Keys.F13, |
|
"\x1b[26~": Keys.F14, |
|
"\x1b[28~": Keys.F15, |
|
"\x1b[29~": Keys.F16, |
|
"\x1b[31~": Keys.F17, |
|
"\x1b[32~": Keys.F18, |
|
"\x1b[33~": Keys.F19, |
|
"\x1b[34~": Keys.F20, |
|
|
|
"\x1b[1;2P": Keys.F13, |
|
"\x1b[1;2Q": Keys.F14, |
|
|
|
"\x1b[1;2S": Keys.F16, |
|
"\x1b[15;2~": Keys.F17, |
|
"\x1b[17;2~": Keys.F18, |
|
"\x1b[18;2~": Keys.F19, |
|
"\x1b[19;2~": Keys.F20, |
|
"\x1b[20;2~": Keys.F21, |
|
"\x1b[21;2~": Keys.F22, |
|
"\x1b[23;2~": Keys.F23, |
|
"\x1b[24;2~": Keys.F24, |
|
|
|
|
|
|
|
|
|
|
|
"\x1b[27;2;13~": Keys.ControlM, |
|
"\x1b[27;5;13~": Keys.ControlM, |
|
"\x1b[27;6;13~": Keys.ControlM, |
|
|
|
|
|
"\x1b[1;5P": Keys.ControlF1, |
|
"\x1b[1;5Q": Keys.ControlF2, |
|
|
|
"\x1b[1;5S": Keys.ControlF4, |
|
"\x1b[15;5~": Keys.ControlF5, |
|
"\x1b[17;5~": Keys.ControlF6, |
|
"\x1b[18;5~": Keys.ControlF7, |
|
"\x1b[19;5~": Keys.ControlF8, |
|
"\x1b[20;5~": Keys.ControlF9, |
|
"\x1b[21;5~": Keys.ControlF10, |
|
"\x1b[23;5~": Keys.ControlF11, |
|
"\x1b[24;5~": Keys.ControlF12, |
|
"\x1b[1;6P": Keys.ControlF13, |
|
"\x1b[1;6Q": Keys.ControlF14, |
|
|
|
"\x1b[1;6S": Keys.ControlF16, |
|
"\x1b[15;6~": Keys.ControlF17, |
|
"\x1b[17;6~": Keys.ControlF18, |
|
"\x1b[18;6~": Keys.ControlF19, |
|
"\x1b[19;6~": Keys.ControlF20, |
|
"\x1b[20;6~": Keys.ControlF21, |
|
"\x1b[21;6~": Keys.ControlF22, |
|
"\x1b[23;6~": Keys.ControlF23, |
|
"\x1b[24;6~": Keys.ControlF24, |
|
|
|
|
|
"\x1b[62~": Keys.ScrollUp, |
|
"\x1b[63~": Keys.ScrollDown, |
|
"\x1b[200~": Keys.BracketedPaste, |
|
|
|
|
|
|
|
"\x1b[E": Keys.Ignore, |
|
"\x1b[G": Keys.Ignore, |
|
|
|
|
|
"\x1b[3;2~": Keys.ShiftDelete, |
|
"\x1b[5;2~": Keys.ShiftPageUp, |
|
"\x1b[6;2~": Keys.ShiftPageDown, |
|
"\x1b[2;3~": (Keys.Escape, Keys.Insert), |
|
"\x1b[3;3~": (Keys.Escape, Keys.Delete), |
|
"\x1b[5;3~": (Keys.Escape, Keys.PageUp), |
|
"\x1b[6;3~": (Keys.Escape, Keys.PageDown), |
|
"\x1b[2;4~": (Keys.Escape, Keys.ShiftInsert), |
|
"\x1b[3;4~": (Keys.Escape, Keys.ShiftDelete), |
|
"\x1b[5;4~": (Keys.Escape, Keys.ShiftPageUp), |
|
"\x1b[6;4~": (Keys.Escape, Keys.ShiftPageDown), |
|
"\x1b[3;5~": Keys.ControlDelete, |
|
"\x1b[5;5~": Keys.ControlPageUp, |
|
"\x1b[6;5~": Keys.ControlPageDown, |
|
"\x1b[3;6~": Keys.ControlShiftDelete, |
|
"\x1b[5;6~": Keys.ControlShiftPageUp, |
|
"\x1b[6;6~": Keys.ControlShiftPageDown, |
|
"\x1b[2;7~": (Keys.Escape, Keys.ControlInsert), |
|
"\x1b[5;7~": (Keys.Escape, Keys.ControlPageDown), |
|
"\x1b[6;7~": (Keys.Escape, Keys.ControlPageDown), |
|
"\x1b[2;8~": (Keys.Escape, Keys.ControlShiftInsert), |
|
"\x1b[5;8~": (Keys.Escape, Keys.ControlShiftPageDown), |
|
"\x1b[6;8~": (Keys.Escape, Keys.ControlShiftPageDown), |
|
|
|
|
|
|
|
"\x1b[A": Keys.Up, |
|
"\x1b[B": Keys.Down, |
|
"\x1b[C": Keys.Right, |
|
"\x1b[D": Keys.Left, |
|
"\x1b[H": Keys.Home, |
|
"\x1b[F": Keys.End, |
|
|
|
|
|
|
|
|
|
"\x1bOA": Keys.Up, |
|
"\x1bOB": Keys.Down, |
|
"\x1bOC": Keys.Right, |
|
"\x1bOD": Keys.Left, |
|
"\x1bOF": Keys.End, |
|
"\x1bOH": Keys.Home, |
|
|
|
"\x1b[1;2A": Keys.ShiftUp, |
|
"\x1b[1;2B": Keys.ShiftDown, |
|
"\x1b[1;2C": Keys.ShiftRight, |
|
"\x1b[1;2D": Keys.ShiftLeft, |
|
"\x1b[1;2F": Keys.ShiftEnd, |
|
"\x1b[1;2H": Keys.ShiftHome, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"\x1b[1;3A": (Keys.Escape, Keys.Up), |
|
"\x1b[1;3B": (Keys.Escape, Keys.Down), |
|
"\x1b[1;3C": (Keys.Escape, Keys.Right), |
|
"\x1b[1;3D": (Keys.Escape, Keys.Left), |
|
"\x1b[1;3F": (Keys.Escape, Keys.End), |
|
"\x1b[1;3H": (Keys.Escape, Keys.Home), |
|
|
|
"\x1b[1;4A": (Keys.Escape, Keys.ShiftDown), |
|
"\x1b[1;4B": (Keys.Escape, Keys.ShiftUp), |
|
"\x1b[1;4C": (Keys.Escape, Keys.ShiftRight), |
|
"\x1b[1;4D": (Keys.Escape, Keys.ShiftLeft), |
|
"\x1b[1;4F": (Keys.Escape, Keys.ShiftEnd), |
|
"\x1b[1;4H": (Keys.Escape, Keys.ShiftHome), |
|
|
|
"\x1b[1;5A": Keys.ControlUp, |
|
"\x1b[1;5B": Keys.ControlDown, |
|
"\x1b[1;5C": Keys.ControlRight, |
|
"\x1b[1;5D": Keys.ControlLeft, |
|
"\x1b[1;5F": Keys.ControlEnd, |
|
"\x1b[1;5H": Keys.ControlHome, |
|
|
|
|
|
|
|
"\x1b[5A": Keys.ControlUp, |
|
"\x1b[5B": Keys.ControlDown, |
|
"\x1b[5C": Keys.ControlRight, |
|
"\x1b[5D": Keys.ControlLeft, |
|
"\x1bOc": Keys.ControlRight, |
|
"\x1bOd": Keys.ControlLeft, |
|
|
|
"\x1b[1;6A": Keys.ControlShiftDown, |
|
"\x1b[1;6B": Keys.ControlShiftUp, |
|
"\x1b[1;6C": Keys.ControlShiftRight, |
|
"\x1b[1;6D": Keys.ControlShiftLeft, |
|
"\x1b[1;6F": Keys.ControlShiftEnd, |
|
"\x1b[1;6H": Keys.ControlShiftHome, |
|
|
|
"\x1b[1;7A": (Keys.Escape, Keys.ControlDown), |
|
"\x1b[1;7B": (Keys.Escape, Keys.ControlUp), |
|
"\x1b[1;7C": (Keys.Escape, Keys.ControlRight), |
|
"\x1b[1;7D": (Keys.Escape, Keys.ControlLeft), |
|
"\x1b[1;7F": (Keys.Escape, Keys.ControlEnd), |
|
"\x1b[1;7H": (Keys.Escape, Keys.ControlHome), |
|
|
|
"\x1b[1;8A": (Keys.Escape, Keys.ControlShiftDown), |
|
"\x1b[1;8B": (Keys.Escape, Keys.ControlShiftUp), |
|
"\x1b[1;8C": (Keys.Escape, Keys.ControlShiftRight), |
|
"\x1b[1;8D": (Keys.Escape, Keys.ControlShiftLeft), |
|
"\x1b[1;8F": (Keys.Escape, Keys.ControlShiftEnd), |
|
"\x1b[1;8H": (Keys.Escape, Keys.ControlShiftHome), |
|
|
|
"\x1b[1;9A": (Keys.Escape, Keys.Up), |
|
"\x1b[1;9B": (Keys.Escape, Keys.Down), |
|
"\x1b[1;9C": (Keys.Escape, Keys.Right), |
|
"\x1b[1;9D": (Keys.Escape, Keys.Left), |
|
|
|
|
|
|
|
"\x1b[1;5p": Keys.Control0, |
|
"\x1b[1;5q": Keys.Control1, |
|
"\x1b[1;5r": Keys.Control2, |
|
"\x1b[1;5s": Keys.Control3, |
|
"\x1b[1;5t": Keys.Control4, |
|
"\x1b[1;5u": Keys.Control5, |
|
"\x1b[1;5v": Keys.Control6, |
|
"\x1b[1;5w": Keys.Control7, |
|
"\x1b[1;5x": Keys.Control8, |
|
"\x1b[1;5y": Keys.Control9, |
|
"\x1b[1;6p": Keys.ControlShift0, |
|
"\x1b[1;6q": Keys.ControlShift1, |
|
"\x1b[1;6r": Keys.ControlShift2, |
|
"\x1b[1;6s": Keys.ControlShift3, |
|
"\x1b[1;6t": Keys.ControlShift4, |
|
"\x1b[1;6u": Keys.ControlShift5, |
|
"\x1b[1;6v": Keys.ControlShift6, |
|
"\x1b[1;6w": Keys.ControlShift7, |
|
"\x1b[1;6x": Keys.ControlShift8, |
|
"\x1b[1;6y": Keys.ControlShift9, |
|
"\x1b[1;7p": (Keys.Escape, Keys.Control0), |
|
"\x1b[1;7q": (Keys.Escape, Keys.Control1), |
|
"\x1b[1;7r": (Keys.Escape, Keys.Control2), |
|
"\x1b[1;7s": (Keys.Escape, Keys.Control3), |
|
"\x1b[1;7t": (Keys.Escape, Keys.Control4), |
|
"\x1b[1;7u": (Keys.Escape, Keys.Control5), |
|
"\x1b[1;7v": (Keys.Escape, Keys.Control6), |
|
"\x1b[1;7w": (Keys.Escape, Keys.Control7), |
|
"\x1b[1;7x": (Keys.Escape, Keys.Control8), |
|
"\x1b[1;7y": (Keys.Escape, Keys.Control9), |
|
"\x1b[1;8p": (Keys.Escape, Keys.ControlShift0), |
|
"\x1b[1;8q": (Keys.Escape, Keys.ControlShift1), |
|
"\x1b[1;8r": (Keys.Escape, Keys.ControlShift2), |
|
"\x1b[1;8s": (Keys.Escape, Keys.ControlShift3), |
|
"\x1b[1;8t": (Keys.Escape, Keys.ControlShift4), |
|
"\x1b[1;8u": (Keys.Escape, Keys.ControlShift5), |
|
"\x1b[1;8v": (Keys.Escape, Keys.ControlShift6), |
|
"\x1b[1;8w": (Keys.Escape, Keys.ControlShift7), |
|
"\x1b[1;8x": (Keys.Escape, Keys.ControlShift8), |
|
"\x1b[1;8y": (Keys.Escape, Keys.ControlShift9), |
|
} |
|
|
|
|
|
def _get_reverse_ansi_sequences() -> dict[Keys, str]: |
|
""" |
|
Create a dictionary that maps prompt_toolkit keys back to the VT100 escape |
|
sequences. |
|
""" |
|
result: dict[Keys, str] = {} |
|
|
|
for sequence, key in ANSI_SEQUENCES.items(): |
|
if not isinstance(key, tuple): |
|
if key not in result: |
|
result[key] = sequence |
|
|
|
return result |
|
|
|
|
|
REVERSE_ANSI_SEQUENCES = _get_reverse_ansi_sequences() |
|
|