This commit is contained in:
Kovid Goyal 2018-12-12 06:26:45 +05:30
commit 1cac757365
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
5 changed files with 149 additions and 88 deletions

View File

@ -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)

View File

@ -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

Binary file not shown.

View File

@ -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~,

Binary file not shown.