diff --git a/kitty/keys.py b/kitty/keys.py index 8d1e8bca0..6040cd592 100644 --- a/kitty/keys.py +++ b/kitty/keys.py @@ -6,20 +6,10 @@ import string from . import fast_data_types as defines from .key_encoding import KEY_MAP -from .terminfo import key_as_bytes +from .terminfo import key_as_bytes, modify_key_bytes from .utils import base64_encode -def modify_key_bytes(keybytes, amt): - ans = bytearray(keybytes) - amt = str(amt).encode('ascii') - if ans[-1] == ord('~'): - return bytes(ans[:-1] + bytearray(b';' + amt + b'~')) - if ans[1] == ord('O'): - return bytes(ans[:1] + bytearray(b'[1;' + amt) + ans[-1:]) - raise ValueError('Unknown key type in key: {!r}'.format(keybytes)) - - def modify_complex_key(name, amt): if not isinstance(name, bytes): name = key_as_bytes(name) diff --git a/kitty/terminfo.py b/kitty/terminfo.py index 2517bd6de..0dab46ed4 100644 --- a/kitty/terminfo.py +++ b/kitty/terminfo.py @@ -6,6 +6,22 @@ import re from binascii import hexlify, unhexlify +def modify_key_bytes(keybytes, amt): + if amt == 0: + return keybytes + ans = bytearray(keybytes) + amt = str(amt).encode('ascii') + if ans[-1] == ord('~'): + return bytes(ans[:-1] + bytearray(b';' + amt + b'~')) + if ans[1] == ord('O'): + return bytes(ans[:1] + bytearray(b'[1;' + amt) + ans[-1:]) + raise ValueError('Unknown key type in key: {!r}'.format(keybytes)) + + +def encode_keystring(keybytes): + return keybytes.decode('ascii').replace('\033', r'\E') + + names = 'xterm-kitty', 'KovIdTTY' termcap_aliases = { @@ -156,54 +172,8 @@ string_capabilities = { # 'invis': r'\E[8m', # Backspace 'kbs': r'\177', - # Left - 'kcub1': r'\EOD', - # Down - 'kcud1': r'\EOB', - # Right - 'kcuf1': r'\EOC', - # Up - 'kcuu1': r'\EOA', - # Function keys - 'kf1': r'\EOP', - 'kf2': r'\EOQ', - 'kf3': r'\EOR', - 'kf4': r'\EOS', - 'kf5': r'\E[15~', - 'kf6': r'\E[17~', - 'kf7': r'\E[18~', - 'kf8': r'\E[19~', - 'kf9': r'\E[20~', - 'kf10': r'\E[21~', - 'kf11': r'\E[23~', - 'kf12': r'\E[24~', - 'kf13': r'\E[1;2P', - 'kf14': r'\E[1;2Q', - 'kf15': r'\E[1;2R', - 'kf16': r'\E[1;2S', - 'kf17': r'\E[15;2~', - 'kf18': r'\E[17;2~', - 'kf19': r'\E[18;2~', - 'kf20': r'\E[19;2~', - 'kf21': r'\E[20;2~', - 'kf22': r'\E[21;2~', - 'kf23': r'\E[23;2~', - 'kf24': r'\E[24;2~', - 'kf25': r'\E[1;5P', - # Home - 'khome': r'\EOH', - # End - 'kend': r'\EOF', - # Insert character key - 'kich1': r'\E[2~', - # Delete character key - 'kdch1': r'\E[3~', # Mouse event has occurred 'kmous': r'\E[M', - # Page down - 'knp': r'\E[6~', - # Page up - 'kpp': r'\E[5~', # Scroll backwards (reverse index) 'kri': r'\E[1;2A', # scroll forwards (index) @@ -270,11 +240,6 @@ string_capabilities = { # Select alternate charset 'smacs': r'\E(0', 'rmacs': r'\E(B', - # Shifted keys - 'kRIT': r'\E[1;2C', - 'kLFT': r'\E[1;2D', - 'kEND': r'\E[1;2F', - 'kHOM': r'\E[1;2H', # Special keys 'khlp': r'', 'kund': r'', @@ -298,6 +263,27 @@ string_capabilities = { # 'rs2': r'\E[!p\E[?3;4l\E[4l\E>', } +string_capabilities.update({ + 'kf{}'.format(offset + n): + encode_keystring(modify_key_bytes(b'\033' + value, mod)) + for offset, mod in {0: 0, 12: 2, 24: 5, 36: 6, 48: 3, 60: 4}.items() + for n, value in zip(range(1, 13), + b'OP OQ OR OS [15~ [17~ [18~ [19~ [20~ [21~ [23~ [24~'.split()) + if offset + n < 64 +}) + +string_capabilities.update({ + name.format(unmod=unmod, key=key): + encode_keystring(modify_key_bytes(b'\033' + value, mod)) + for unmod, key, value in zip( + 'cuu1 cud1 cuf1 cub1 end home ich1 dch1 pp np'.split(), + 'UP DN RIT LFT END HOM IC DC PRV NXT'.split(), + b'OA OB OC OD OF OH [2~ [3~ [5~ [6~'.split()) + for name, mod in { + 'k{unmod}': 0, 'k{key}': 2, 'k{key}3': 3, 'k{key}4': 4, + 'k{key}5': 5, 'k{key}6': 6, 'k{key}7': 7}.items() +}) + termcap_aliases.update({ 'ac': 'acsc', 'bl': 'bel', @@ -346,31 +332,6 @@ termcap_aliases.update({ 'kd': 'kcud1', 'kr': 'kcuf1', 'ku': 'kcuu1', - 'k1': 'kf1', - 'k2': 'kf2', - 'k3': 'kf3', - 'k4': 'kf4', - 'k5': 'kf5', - 'k6': 'kf6', - 'k7': 'kf7', - 'k8': 'kf8', - 'k9': 'kf9', - 'k;': 'kf10', - 'F1': 'kf11', - 'F2': 'kf12', - 'F3': 'kf13', - 'F4': 'kf14', - 'F5': 'kf15', - 'F6': 'kf16', - 'F7': 'kf17', - 'F8': 'kf18', - 'F9': 'kf19', - 'FA': 'kf20', - 'FB': 'kf21', - 'FC': 'kf22', - 'FD': 'kf23', - 'FE': 'kf24', - 'FF': 'kf25', 'kh': 'khome', '@7': 'kend', 'kI': 'kich1', @@ -410,8 +371,12 @@ termcap_aliases.update({ 'ks': 'smkx', 'ke': 'rmkx', '#2': 'kHOM', + '#3': 'kIC', '#4': 'kLFT', + '*4': 'kDC', '*7': 'kEND', + '%c': 'kNXT', + '%e': 'kPRV', '%i': 'kRIT', '%1': 'khlp', '&8': 'kund', @@ -433,10 +398,22 @@ termcap_aliases.update({ # 'r2': 'rs2', }) +termcap_aliases.update({ + tc: 'kf{}'.format(n) + for n, tc in enumerate( + 'k1 k2 k3 k4 k5 k6 k7 k8 k9 k; F1 F2 F3 F4 F5 F6 F7 F8 F9 FA ' + 'FB FC FD FE FF FG FH FI FJ FK FL FM FN FO FP FQ FR FS FT FU ' + 'FV FW FX FY FZ Fa Fb Fc Fd Fe Ff Fg Fh Fi Fj Fk Fl Fm Fn Fo ' + 'Fp Fq Fr'.split(), 1)}) + queryable_capabilities = numeric_capabilities.copy() queryable_capabilities.update(string_capabilities) extra = (bool_capabilities | numeric_capabilities.keys() | string_capabilities.keys()) - set(termcap_aliases.values()) -no_termcap_for = frozenset('Su Tc setrgbf setrgbb fullkbd'.split()) +no_termcap_for = frozenset( + 'Su Tc setrgbf setrgbb fullkbd kUP kDN'.split() + [ + 'k{}{}'.format(key, mod) + for key in 'UP DN RIT LFT END HOM IC DC PRV NXT'.split() + for mod in range(3, 8)]) if extra - no_termcap_for: raise Exception('Termcap aliases not complete, missing: {}'.format(extra - no_termcap_for)) del extra diff --git a/terminfo/78/xterm-kitty b/terminfo/78/xterm-kitty index 242107798..e2f792790 100644 Binary files a/terminfo/78/xterm-kitty and b/terminfo/78/xterm-kitty differ diff --git a/terminfo/kitty.terminfo b/terminfo/kitty.terminfo index afe9aa275..14c5907c1 100644 --- a/terminfo/kitty.terminfo +++ b/terminfo/kitty.terminfo @@ -57,10 +57,66 @@ xterm-kitty|KovIdTTY, ind=^J, indn=\E[%p1%dS, initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\, + kDC=\E[3;2~, + kDC3=\E[3;3~, + kDC4=\E[3;4~, + kDC5=\E[3;5~, + kDC6=\E[3;6~, + kDC7=\E[3;7~, + kDN=\E[1;2B, + kDN3=\E[1;3B, + kDN4=\E[1;4B, + kDN5=\E[1;5B, + kDN6=\E[1;6B, + kDN7=\E[1;7B, kEND=\E[1;2F, + kEND3=\E[1;3F, + kEND4=\E[1;4F, + kEND5=\E[1;5F, + kEND6=\E[1;6F, + kEND7=\E[1;7F, kHOM=\E[1;2H, + kHOM3=\E[1;3H, + kHOM4=\E[1;4H, + kHOM5=\E[1;5H, + kHOM6=\E[1;6H, + kHOM7=\E[1;7H, + kIC=\E[2;2~, + kIC3=\E[2;3~, + kIC4=\E[2;4~, + kIC5=\E[2;5~, + kIC6=\E[2;6~, + kIC7=\E[2;7~, kLFT=\E[1;2D, + kLFT3=\E[1;3D, + kLFT4=\E[1;4D, + kLFT5=\E[1;5D, + kLFT6=\E[1;6D, + kLFT7=\E[1;7D, + kNXT=\E[6;2~, + kNXT3=\E[6;3~, + kNXT4=\E[6;4~, + kNXT5=\E[6;5~, + kNXT6=\E[6;6~, + kNXT7=\E[6;7~, + kPRV=\E[5;2~, + kPRV3=\E[5;3~, + kPRV4=\E[5;4~, + kPRV5=\E[5;5~, + kPRV6=\E[5;6~, + kPRV7=\E[5;7~, kRIT=\E[1;2C, + kRIT3=\E[1;3C, + kRIT4=\E[1;4C, + kRIT5=\E[1;5C, + kRIT6=\E[1;6C, + kRIT7=\E[1;7C, + kUP=\E[1;2A, + kUP3=\E[1;3A, + kUP4=\E[1;4A, + kUP5=\E[1;5A, + kUP6=\E[1;6A, + kUP7=\E[1;7A, ka1=, ka3=, kbs=\177, @@ -91,10 +147,48 @@ xterm-kitty|KovIdTTY, kf23=\E[23;2~, kf24=\E[24;2~, kf25=\E[1;5P, + kf26=\E[1;5Q, + kf27=\E[1;5R, + kf28=\E[1;5S, + kf29=\E[15;5~, kf3=\EOR, + kf30=\E[17;5~, + kf31=\E[18;5~, + kf32=\E[19;5~, + kf33=\E[20;5~, + kf34=\E[21;5~, + kf35=\E[23;5~, + kf36=\E[24;5~, + kf37=\E[1;6P, + kf38=\E[1;6Q, + kf39=\E[1;6R, kf4=\EOS, + kf40=\E[1;6S, + kf41=\E[15;6~, + kf42=\E[17;6~, + kf43=\E[18;6~, + kf44=\E[19;6~, + kf45=\E[20;6~, + kf46=\E[21;6~, + kf47=\E[23;6~, + kf48=\E[24;6~, + kf49=\E[1;3P, kf5=\E[15~, + kf50=\E[1;3Q, + kf51=\E[1;3R, + kf52=\E[1;3S, + kf53=\E[15;3~, + kf54=\E[17;3~, + kf55=\E[18;3~, + kf56=\E[19;3~, + kf57=\E[20;3~, + kf58=\E[21;3~, + kf59=\E[23;3~, kf6=\E[17~, + kf60=\E[24;3~, + kf61=\E[1;4P, + kf62=\E[1;4Q, + kf63=\E[1;4R, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, diff --git a/terminfo/x/xterm-kitty b/terminfo/x/xterm-kitty index 242107798..e2f792790 100644 Binary files a/terminfo/x/xterm-kitty and b/terminfo/x/xterm-kitty differ