Declare more function and editing keys with modifiers

Resolves #1220.
This commit is contained in:
Yuri Khan 2018-12-11 23:25:46 +07:00
parent f6b5e54890
commit 992de77040
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 . import fast_data_types as defines
from .key_encoding import KEY_MAP 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 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): def modify_complex_key(name, amt):
if not isinstance(name, bytes): if not isinstance(name, bytes):
name = key_as_bytes(name) name = key_as_bytes(name)

View File

@ -6,6 +6,22 @@ import re
from binascii import hexlify, unhexlify 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' names = 'xterm-kitty', 'KovIdTTY'
termcap_aliases = { termcap_aliases = {
@ -156,54 +172,8 @@ string_capabilities = {
# 'invis': r'\E[8m', # 'invis': r'\E[8m',
# Backspace # Backspace
'kbs': r'\177', '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 # Mouse event has occurred
'kmous': r'\E[M', 'kmous': r'\E[M',
# Page down
'knp': r'\E[6~',
# Page up
'kpp': r'\E[5~',
# Scroll backwards (reverse index) # Scroll backwards (reverse index)
'kri': r'\E[1;2A', 'kri': r'\E[1;2A',
# scroll forwards (index) # scroll forwards (index)
@ -270,11 +240,6 @@ string_capabilities = {
# Select alternate charset # Select alternate charset
'smacs': r'\E(0', 'smacs': r'\E(0',
'rmacs': r'\E(B', '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 # Special keys
'khlp': r'', 'khlp': r'',
'kund': r'', 'kund': r'',
@ -298,6 +263,27 @@ string_capabilities = {
# 'rs2': r'\E[!p\E[?3;4l\E[4l\E>', # '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({ termcap_aliases.update({
'ac': 'acsc', 'ac': 'acsc',
'bl': 'bel', 'bl': 'bel',
@ -346,31 +332,6 @@ termcap_aliases.update({
'kd': 'kcud1', 'kd': 'kcud1',
'kr': 'kcuf1', 'kr': 'kcuf1',
'ku': 'kcuu1', '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', 'kh': 'khome',
'@7': 'kend', '@7': 'kend',
'kI': 'kich1', 'kI': 'kich1',
@ -410,8 +371,12 @@ termcap_aliases.update({
'ks': 'smkx', 'ks': 'smkx',
'ke': 'rmkx', 'ke': 'rmkx',
'#2': 'kHOM', '#2': 'kHOM',
'#3': 'kIC',
'#4': 'kLFT', '#4': 'kLFT',
'*4': 'kDC',
'*7': 'kEND', '*7': 'kEND',
'%c': 'kNXT',
'%e': 'kPRV',
'%i': 'kRIT', '%i': 'kRIT',
'%1': 'khlp', '%1': 'khlp',
'&8': 'kund', '&8': 'kund',
@ -433,10 +398,22 @@ termcap_aliases.update({
# 'r2': 'rs2', # '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 = numeric_capabilities.copy()
queryable_capabilities.update(string_capabilities) queryable_capabilities.update(string_capabilities)
extra = (bool_capabilities | numeric_capabilities.keys() | string_capabilities.keys()) - set(termcap_aliases.values()) 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: if extra - no_termcap_for:
raise Exception('Termcap aliases not complete, missing: {}'.format(extra - no_termcap_for)) raise Exception('Termcap aliases not complete, missing: {}'.format(extra - no_termcap_for))
del extra del extra

Binary file not shown.

View File

@ -57,10 +57,66 @@ xterm-kitty|KovIdTTY,
ind=^J, ind=^J,
indn=\E[%p1%dS, 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\\, 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, 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, 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, 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, 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=, ka1=,
ka3=, ka3=,
kbs=\177, kbs=\177,
@ -91,10 +147,48 @@ xterm-kitty|KovIdTTY,
kf23=\E[23;2~, kf23=\E[23;2~,
kf24=\E[24;2~, kf24=\E[24;2~,
kf25=\E[1;5P, kf25=\E[1;5P,
kf26=\E[1;5Q,
kf27=\E[1;5R,
kf28=\E[1;5S,
kf29=\E[15;5~,
kf3=\EOR, 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, 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~, 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~, kf6=\E[17~,
kf60=\E[24;3~,
kf61=\E[1;4P,
kf62=\E[1;4Q,
kf63=\E[1;4R,
kf7=\E[18~, kf7=\E[18~,
kf8=\E[19~, kf8=\E[19~,
kf9=\E[20~, kf9=\E[20~,

Binary file not shown.