dr1p_pymux/pymux/key_mappings.py

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, ),
}