Merge pull request #5625 from Tyriar/kitty_shift_disambiguate

Don't disambiguous kitty keyboard on shift only
This commit is contained in:
Daniel Imms
2026-01-26 14:51:17 -08:00
committed by GitHub
2 changed files with 16 additions and 8 deletions
+9 -6
View File
@@ -33,12 +33,14 @@ describe('KittyKeyboard', () => {
describe('modifier encoding (value = 1 + modifiers)', () => { describe('modifier encoding (value = 1 + modifiers)', () => {
const flags = KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES; const flags = KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES;
it('shift=2 (1+1)', () => { it('shift+letter sends plain character in DISAMBIGUATE mode', () => {
const result = evaluateKeyboardEventKitty(createEvent({ key: 'a', shiftKey: true }), flags); // Kitty spec: DISAMBIGUATE only encodes keys ambiguous in legacy encoding
assert.strictEqual(result.key, '\x1b[97;2u'); // Shift+a → "A" is not ambiguous, so send plain "A"
const result = evaluateKeyboardEventKitty(createEvent({ key: 'A', shiftKey: true }), flags);
assert.strictEqual(result.key, 'A');
}); });
it('alt=3 (1+2)', () => { it('alt=3 (1+2) still uses CSI u', () => {
const result = evaluateKeyboardEventKitty(createEvent({ key: 'a', altKey: true }), flags); const result = evaluateKeyboardEventKitty(createEvent({ key: 'a', altKey: true }), flags);
assert.strictEqual(result.key, '\x1b[97;3u'); assert.strictEqual(result.key, '\x1b[97;3u');
}); });
@@ -598,9 +600,10 @@ describe('KittyKeyboard', () => {
describe('edge cases', () => { describe('edge cases', () => {
const flags = KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES; const flags = KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES;
it('always uses lowercase codepoint for letters', () => { it('shift+letter sends plain character in DISAMBIGUATE mode', () => {
// Shift+A produces printable "A", not ambiguous, so send plain character
const result = evaluateKeyboardEventKitty(createEvent({ key: 'A', shiftKey: true }), flags); const result = evaluateKeyboardEventKitty(createEvent({ key: 'A', shiftKey: true }), flags);
assert.strictEqual(result.key, '\x1b[97;2u'); assert.strictEqual(result.key, 'A');
}); });
it('ctrl+shift+a sends lowercase codepoint 97', () => { it('ctrl+shift+a sends lowercase codepoint 97', () => {
+7 -2
View File
@@ -351,8 +351,13 @@ export function evaluateKeyboardEventKitty(
} else if (isFunc) { } else if (isFunc) {
useCsiU = true; useCsiU = true;
} else if (modifiers > 0) { } else if (modifiers > 0) {
// Any modified key // Shift-only + printable character (e.g., Shift+a → "A") should NOT use CSI u
useCsiU = true; // per Kitty spec: DISAMBIGUATE only encodes keys ambiguous in legacy encoding
if (ev.shiftKey && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.key.length === 1) {
useCsiU = false;
} else {
useCsiU = true;
}
} }
} }