Skip to content

Commit 5f25e05

Browse files
authored
Merge pull request #5625 from Tyriar/kitty_shift_disambiguate
Don't disambiguous kitty keyboard on shift only
2 parents f471c0a + 2af9d10 commit 5f25e05

2 files changed

Lines changed: 16 additions & 8 deletions

File tree

src/common/input/KittyKeyboard.test.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,14 @@ describe('KittyKeyboard', () => {
3333
describe('modifier encoding (value = 1 + modifiers)', () => {
3434
const flags = KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES;
3535

36-
it('shift=2 (1+1)', () => {
37-
const result = evaluateKeyboardEventKitty(createEvent({ key: 'a', shiftKey: true }), flags);
38-
assert.strictEqual(result.key, '\x1b[97;2u');
36+
it('shift+letter sends plain character in DISAMBIGUATE mode', () => {
37+
// Kitty spec: DISAMBIGUATE only encodes keys ambiguous in legacy encoding
38+
// Shift+a → "A" is not ambiguous, so send plain "A"
39+
const result = evaluateKeyboardEventKitty(createEvent({ key: 'A', shiftKey: true }), flags);
40+
assert.strictEqual(result.key, 'A');
3941
});
4042

41-
it('alt=3 (1+2)', () => {
43+
it('alt=3 (1+2) still uses CSI u', () => {
4244
const result = evaluateKeyboardEventKitty(createEvent({ key: 'a', altKey: true }), flags);
4345
assert.strictEqual(result.key, '\x1b[97;3u');
4446
});
@@ -598,9 +600,10 @@ describe('KittyKeyboard', () => {
598600
describe('edge cases', () => {
599601
const flags = KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES;
600602

601-
it('always uses lowercase codepoint for letters', () => {
603+
it('shift+letter sends plain character in DISAMBIGUATE mode', () => {
604+
// Shift+A produces printable "A", not ambiguous, so send plain character
602605
const result = evaluateKeyboardEventKitty(createEvent({ key: 'A', shiftKey: true }), flags);
603-
assert.strictEqual(result.key, '\x1b[97;2u');
606+
assert.strictEqual(result.key, 'A');
604607
});
605608

606609
it('ctrl+shift+a sends lowercase codepoint 97', () => {

src/common/input/KittyKeyboard.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,8 +351,13 @@ export function evaluateKeyboardEventKitty(
351351
} else if (isFunc) {
352352
useCsiU = true;
353353
} else if (modifiers > 0) {
354-
// Any modified key
355-
useCsiU = true;
354+
// Shift-only + printable character (e.g., Shift+a → "A") should NOT use CSI u
355+
// per Kitty spec: DISAMBIGUATE only encodes keys ambiguous in legacy encoding
356+
if (ev.shiftKey && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.key.length === 1) {
357+
useCsiU = false;
358+
} else {
359+
useCsiU = true;
360+
}
356361
}
357362
}
358363

0 commit comments

Comments
 (0)