From b916d79fe2c151b8576b691ef58956694087910c Mon Sep 17 00:00:00 2001 From: Tommaso Sciortino Date: Tue, 18 Nov 2025 11:49:08 -0800 Subject: [PATCH] Improve keyboard code parsing (#13307) --- packages/cli/src/ui/contexts/KeypressContext.test.tsx | 5 +++++ packages/cli/src/ui/contexts/KeypressContext.tsx | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/ui/contexts/KeypressContext.test.tsx b/packages/cli/src/ui/contexts/KeypressContext.test.tsx index 8a5355a918..6fb8a6f2ab 100644 --- a/packages/cli/src/ui/contexts/KeypressContext.test.tsx +++ b/packages/cli/src/ui/contexts/KeypressContext.test.tsx @@ -406,6 +406,7 @@ describe('KeypressContext', () => { describe('Parameterized functional keys', () => { it.each([ // Parameterized + { sequence: `\x1b[1;129A`, expected: { name: 'up' } }, { sequence: `\x1b[1;2H`, expected: { name: 'home', shift: true } }, { sequence: `\x1b[1;5F`, expected: { name: 'end', ctrl: true } }, { sequence: `\x1b[1;1P`, expected: { name: 'f1' } }, @@ -449,6 +450,10 @@ describe('KeypressContext', () => { sequence: `\x1b[F`, expected: { name: 'end', ctrl: false, meta: false, shift: false }, }, + { + sequence: `\x1b[5H`, + expected: { name: 'home', ctrl: true, meta: false, shift: false }, + }, ])( 'should recognize sequence "$sequence" as $expected.name', ({ sequence, expected }) => { diff --git a/packages/cli/src/ui/contexts/KeypressContext.tsx b/packages/cli/src/ui/contexts/KeypressContext.tsx index 8be139a38f..05c24626cb 100644 --- a/packages/cli/src/ui/contexts/KeypressContext.tsx +++ b/packages/cli/src/ui/contexts/KeypressContext.tsx @@ -405,9 +405,9 @@ function* emitKeys( code += match[1] + match[3]; // Defaults to '1' if no modifier exists, resulting in a 0 modifier value modifier = parseInt(match[2] ?? '1', 10) - 1; - } else if ((match = /^((\d;)?(\d))?([A-Za-z])$/.exec(cmd))) { - code += match[4]; - modifier = parseInt(match[3] ?? '1', 10) - 1; + } else if ((match = /^(\d+)?(?:;(\d+))?([A-Za-z])$/.exec(cmd))) { + code += match[3]; + modifier = parseInt(match[2] ?? match[1] ?? '1', 10) - 1; } else { code += cmd; }