232 lines
6.9 KiB
Python
232 lines
6.9 KiB
Python
"""
|
|
Mapping between vt100 key sequences, the prompt_toolkit key constants and the
|
|
Pymux namings. (Those namings are kept compatible with tmux.)
|
|
"""
|
|
from __future__ import unicode_literals
|
|
from prompt_toolkit.keys import Keys
|
|
from prompt_toolkit.input.vt100_parser import ANSI_SEQUENCES
|
|
|
|
__all__ = (
|
|
'pymux_key_to_prompt_toolkit_key_sequence',
|
|
'prompt_toolkit_key_to_vt100_key',
|
|
'PYMUX_TO_PROMPT_TOOLKIT_KEYS',
|
|
)
|
|
|
|
|
|
def pymux_key_to_prompt_toolkit_key_sequence(key):
|
|
"""
|
|
Turn a pymux description of a key. E.g. "C-a" or "M-x" into a
|
|
prompt-toolkit key sequence.
|
|
|
|
Raises `ValueError` if the key is not known.
|
|
"""
|
|
# Make the c- and m- prefixes case insensitive.
|
|
if key.lower().startswith('m-c-'):
|
|
key = 'M-C-' + key[4:]
|
|
elif key.lower().startswith('c-'):
|
|
key = 'C-' + key[2:]
|
|
elif key.lower().startswith('m-'):
|
|
key = 'M-' + key[2:]
|
|
|
|
# Lookup key.
|
|
try:
|
|
return PYMUX_TO_PROMPT_TOOLKIT_KEYS[key]
|
|
except KeyError:
|
|
if len(key) == 1:
|
|
return (key, )
|
|
else:
|
|
raise ValueError('Unknown key: %r' % (key, ))
|
|
|
|
|
|
# Create a mapping from prompt_toolkit keys to their ANSI sequences.
|
|
# TODO: This is not completely correct yet. It doesn't take
|
|
# cursor/application mode into account. Create new tables for this.
|
|
_PROMPT_TOOLKIT_KEY_TO_VT100 = dict(
|
|
(key, vt100_data) for vt100_data, key in ANSI_SEQUENCES.items())
|
|
|
|
|
|
def prompt_toolkit_key_to_vt100_key(key, application_mode=False):
|
|
"""
|
|
Turn a prompt toolkit key. (E.g Keys.ControlB) into a Vt100 key sequence.
|
|
(E.g. \x1b[A.)
|
|
"""
|
|
application_mode_keys = {
|
|
Keys.Up: '\x1bOA',
|
|
Keys.Left: '\x1bOD',
|
|
Keys.Right: '\x1bOC',
|
|
Keys.Down: '\x1bOB',
|
|
}
|
|
|
|
if key == Keys.ControlJ:
|
|
# Required for redis-cli. This can be removed when prompt_toolkit stops
|
|
# replacing \r by \n.
|
|
return '\r'
|
|
|
|
if key == '\n':
|
|
return '\r'
|
|
|
|
elif application_mode and key in application_mode_keys:
|
|
return application_mode_keys.get(key)
|
|
else:
|
|
return _PROMPT_TOOLKIT_KEY_TO_VT100.get(key, key)
|
|
|
|
|
|
PYMUX_TO_PROMPT_TOOLKIT_KEYS = {
|
|
'Space': (' '),
|
|
|
|
'C-a': (Keys.ControlA, ),
|
|
'C-b': (Keys.ControlB, ),
|
|
'C-c': (Keys.ControlC, ),
|
|
'C-d': (Keys.ControlD, ),
|
|
'C-e': (Keys.ControlE, ),
|
|
'C-f': (Keys.ControlF, ),
|
|
'C-g': (Keys.ControlG, ),
|
|
'C-h': (Keys.ControlH, ),
|
|
'C-i': (Keys.ControlI, ),
|
|
'C-j': (Keys.ControlJ, ),
|
|
'C-k': (Keys.ControlK, ),
|
|
'C-l': (Keys.ControlL, ),
|
|
'C-m': (Keys.ControlM, ),
|
|
'C-n': (Keys.ControlN, ),
|
|
'C-o': (Keys.ControlO, ),
|
|
'C-p': (Keys.ControlP, ),
|
|
'C-q': (Keys.ControlQ, ),
|
|
'C-r': (Keys.ControlR, ),
|
|
'C-s': (Keys.ControlS, ),
|
|
'C-t': (Keys.ControlT, ),
|
|
'C-u': (Keys.ControlU, ),
|
|
'C-v': (Keys.ControlV, ),
|
|
'C-w': (Keys.ControlW, ),
|
|
'C-x': (Keys.ControlX, ),
|
|
'C-y': (Keys.ControlY, ),
|
|
'C-z': (Keys.ControlZ, ),
|
|
|
|
'C-Left': (Keys.ControlLeft, ),
|
|
'C-Right': (Keys.ControlRight, ),
|
|
'C-Up': (Keys.ControlUp, ),
|
|
'C-Down': (Keys.ControlDown, ),
|
|
'C-\\': (Keys.ControlBackslash, ),
|
|
|
|
'S-Left': (Keys.ShiftLeft, ),
|
|
'S-Right': (Keys.ShiftRight, ),
|
|
'S-Up': (Keys.ShiftUp, ),
|
|
'S-Down': (Keys.ShiftDown, ),
|
|
|
|
'M-C-a': (Keys.Escape, Keys.ControlA, ),
|
|
'M-C-b': (Keys.Escape, Keys.ControlB, ),
|
|
'M-C-c': (Keys.Escape, Keys.ControlC, ),
|
|
'M-C-d': (Keys.Escape, Keys.ControlD, ),
|
|
'M-C-e': (Keys.Escape, Keys.ControlE, ),
|
|
'M-C-f': (Keys.Escape, Keys.ControlF, ),
|
|
'M-C-g': (Keys.Escape, Keys.ControlG, ),
|
|
'M-C-h': (Keys.Escape, Keys.ControlH, ),
|
|
'M-C-i': (Keys.Escape, Keys.ControlI, ),
|
|
'M-C-j': (Keys.Escape, Keys.ControlJ, ),
|
|
'M-C-k': (Keys.Escape, Keys.ControlK, ),
|
|
'M-C-l': (Keys.Escape, Keys.ControlL, ),
|
|
'M-C-m': (Keys.Escape, Keys.ControlM, ),
|
|
'M-C-n': (Keys.Escape, Keys.ControlN, ),
|
|
'M-C-o': (Keys.Escape, Keys.ControlO, ),
|
|
'M-C-p': (Keys.Escape, Keys.ControlP, ),
|
|
'M-C-q': (Keys.Escape, Keys.ControlQ, ),
|
|
'M-C-r': (Keys.Escape, Keys.ControlR, ),
|
|
'M-C-s': (Keys.Escape, Keys.ControlS, ),
|
|
'M-C-t': (Keys.Escape, Keys.ControlT, ),
|
|
'M-C-u': (Keys.Escape, Keys.ControlU, ),
|
|
'M-C-v': (Keys.Escape, Keys.ControlV, ),
|
|
'M-C-w': (Keys.Escape, Keys.ControlW, ),
|
|
'M-C-x': (Keys.Escape, Keys.ControlX, ),
|
|
'M-C-y': (Keys.Escape, Keys.ControlY, ),
|
|
'M-C-z': (Keys.Escape, Keys.ControlZ, ),
|
|
|
|
'M-C-Left': (Keys.Escape, Keys.ControlLeft, ),
|
|
'M-C-Right': (Keys.Escape, Keys.ControlRight, ),
|
|
'M-C-Up': (Keys.Escape, Keys.ControlUp, ),
|
|
'M-C-Down': (Keys.Escape, Keys.ControlDown, ),
|
|
'M-C-\\': (Keys.Escape, Keys.ControlBackslash, ),
|
|
|
|
'M-a': (Keys.Escape, 'a'),
|
|
'M-b': (Keys.Escape, 'b'),
|
|
'M-c': (Keys.Escape, 'c'),
|
|
'M-d': (Keys.Escape, 'd'),
|
|
'M-e': (Keys.Escape, 'e'),
|
|
'M-f': (Keys.Escape, 'f'),
|
|
'M-g': (Keys.Escape, 'g'),
|
|
'M-h': (Keys.Escape, 'h'),
|
|
'M-i': (Keys.Escape, 'i'),
|
|
'M-j': (Keys.Escape, 'j'),
|
|
'M-k': (Keys.Escape, 'k'),
|
|
'M-l': (Keys.Escape, 'l'),
|
|
'M-m': (Keys.Escape, 'm'),
|
|
'M-n': (Keys.Escape, 'n'),
|
|
'M-o': (Keys.Escape, 'o'),
|
|
'M-p': (Keys.Escape, 'p'),
|
|
'M-q': (Keys.Escape, 'q'),
|
|
'M-r': (Keys.Escape, 'r'),
|
|
'M-s': (Keys.Escape, 's'),
|
|
'M-t': (Keys.Escape, 't'),
|
|
'M-u': (Keys.Escape, 'u'),
|
|
'M-v': (Keys.Escape, 'v'),
|
|
'M-w': (Keys.Escape, 'w'),
|
|
'M-x': (Keys.Escape, 'x'),
|
|
'M-y': (Keys.Escape, 'y'),
|
|
'M-z': (Keys.Escape, 'z'),
|
|
|
|
'M-0': (Keys.Escape, '0'),
|
|
'M-1': (Keys.Escape, '1'),
|
|
'M-2': (Keys.Escape, '2'),
|
|
'M-3': (Keys.Escape, '3'),
|
|
'M-4': (Keys.Escape, '4'),
|
|
'M-5': (Keys.Escape, '5'),
|
|
'M-6': (Keys.Escape, '6'),
|
|
'M-7': (Keys.Escape, '7'),
|
|
'M-8': (Keys.Escape, '8'),
|
|
'M-9': (Keys.Escape, '9'),
|
|
|
|
'M-Up': (Keys.Escape, Keys.Up),
|
|
'M-Down': (Keys.Escape, Keys.Down, ),
|
|
'M-Left': (Keys.Escape, Keys.Left, ),
|
|
'M-Right': (Keys.Escape, Keys.Right, ),
|
|
'Left': (Keys.Left, ),
|
|
'Right': (Keys.Right, ),
|
|
'Up': (Keys.Up, ),
|
|
'Down': (Keys.Down, ),
|
|
'BSpace': (Keys.Backspace, ),
|
|
'BTab': (Keys.BackTab, ),
|
|
'DC': (Keys.Delete, ),
|
|
'IC': (Keys.Insert, ),
|
|
'End': (Keys.End, ),
|
|
'Enter': (Keys.ControlJ, ),
|
|
'Home': (Keys.Home, ),
|
|
'Escape': (Keys.Escape, ),
|
|
'Tab': (Keys.Tab, ),
|
|
|
|
'F1': (Keys.F1, ),
|
|
'F2': (Keys.F2, ),
|
|
'F3': (Keys.F3, ),
|
|
'F4': (Keys.F4, ),
|
|
'F5': (Keys.F5, ),
|
|
'F6': (Keys.F6, ),
|
|
'F7': (Keys.F7, ),
|
|
'F8': (Keys.F8, ),
|
|
'F9': (Keys.F9, ),
|
|
'F10': (Keys.F10, ),
|
|
'F11': (Keys.F11, ),
|
|
'F12': (Keys.F12, ),
|
|
'F13': (Keys.F13, ),
|
|
'F14': (Keys.F14, ),
|
|
'F15': (Keys.F15, ),
|
|
'F16': (Keys.F16, ),
|
|
'F17': (Keys.F17, ),
|
|
'F18': (Keys.F18, ),
|
|
'F19': (Keys.F19, ),
|
|
'F20': (Keys.F20, ),
|
|
|
|
'NPage': (Keys.PageDown, ),
|
|
'PageDown': (Keys.PageDown, ),
|
|
'PgDn': (Keys.PageDown, ),
|
|
'PPage': (Keys.PageUp, ),
|
|
'PageUp': (Keys.PageUp, ),
|
|
'PgUp': (Keys.PageUp, ),
|
|
}
|