feat(cli): support literal character keybindings and extended Kitty protocol keys (#21972)

This commit is contained in:
Tommaso Sciortino
2026-03-11 04:49:20 +00:00
committed by GitHub
parent bd23fec6a9
commit 557f67f9c1
4 changed files with 97 additions and 28 deletions
@@ -637,6 +637,9 @@ describe('KeypressContext', () => {
describe('Parameterized functional keys', () => {
it.each([
// CSI-u numeric keys
{ sequence: `\x1b[53;5u`, expected: { name: '5', ctrl: true } },
{ sequence: `\x1b[51;2u`, expected: { name: '3', shift: true } },
// ModifyOtherKeys
{ sequence: `\x1b[27;2;13~`, expected: { name: 'enter', shift: true } },
{ sequence: `\x1b[27;5;13~`, expected: { name: 'enter', ctrl: true } },
@@ -665,6 +668,14 @@ describe('KeypressContext', () => {
{ sequence: `\x1b[17~`, expected: { name: 'f6' } },
{ sequence: `\x1b[23~`, expected: { name: 'f11' } },
{ sequence: `\x1b[24~`, expected: { name: 'f12' } },
{ sequence: `\x1b[25~`, expected: { name: 'f13' } },
{ sequence: `\x1b[34~`, expected: { name: 'f20' } },
// Kitty Extended Function Keys (F13-F35)
{ sequence: `\x1b[302u`, expected: { name: 'f13' } },
{ sequence: `\x1b[324u`, expected: { name: 'f35' } },
// Modifier / Special Keys (Kitty Protocol)
{ sequence: `\x1b[57358u`, expected: { name: 'capslock' } },
{ sequence: `\x1b[57362u`, expected: { name: 'pausebreak' } },
// Reverse tabs
{ sequence: `\x1b[Z`, expected: { name: 'tab', shift: true } },
{ sequence: `\x1b[1;2Z`, expected: { name: 'tab', shift: true } },
@@ -820,6 +831,20 @@ describe('KeypressContext', () => {
sequence: '\x1bOn',
expected: { name: '.', sequence: '.', insertable: true },
},
// Kitty Numpad Support (CSI-u)
{
sequence: '\x1b[57404u',
expected: { name: 'numpad5', sequence: '5', insertable: true },
},
{
modifier: 'Ctrl',
sequence: '\x1b[57404;5u',
expected: { name: 'numpad5', ctrl: true, insertable: false },
},
{
sequence: '\x1b[57411u',
expected: { name: 'numpad_multiply', sequence: '*', insertable: true },
},
])(
'should recognize numpad sequence "$sequence" as $expected.name',
({ sequence, expected }) => {