fix(terminal): skip resize snapshots and standardize key encoding

This commit is contained in:
Mohamed Boudra
2026-03-23 14:47:27 +07:00
parent b862f7b72d
commit b873523eab
10 changed files with 167 additions and 86 deletions
@@ -23,10 +23,11 @@ describe("encodeTerminalKeyInput", () => {
expect(encodeTerminalKeyInput({ key: "Enter", shift: true })).toBe("\x1b[13;2u");
});
it("encodes enter with other modifiers as plain carriage return", () => {
expect(encodeTerminalKeyInput({ key: "Enter", ctrl: true })).toBe("\r");
expect(encodeTerminalKeyInput({ key: "Enter", alt: true })).toBe("\x1b\r");
expect(encodeTerminalKeyInput({ key: "Enter", shift: true, ctrl: true })).toBe("\r");
it("encodes enter with modifiers using CSI u", () => {
expect(encodeTerminalKeyInput({ key: "Enter", ctrl: true })).toBe("\x1b[13;5u");
expect(encodeTerminalKeyInput({ key: "Enter", alt: true })).toBe("\x1b[13;3u");
expect(encodeTerminalKeyInput({ key: "Enter", meta: true })).toBe("\x1b[13;9u");
expect(encodeTerminalKeyInput({ key: "Enter", shift: true, ctrl: true })).toBe("\x1b[13;6u");
});
it("returns empty string for unsupported keys", () => {
@@ -9,13 +9,14 @@ export interface TerminalKeyInput {
function modifierParam(input: TerminalKeyInput): number {
let value = 1;
if (input.shift) value += 1;
if (input.alt || input.meta) value += 2;
if (input.alt) value += 2;
if (input.ctrl) value += 4;
if (input.meta) value += 8;
return value;
}
function applyAltLikePrefix(sequence: string, input: TerminalKeyInput): string {
return input.alt || input.meta ? `\x1b${sequence}` : sequence;
return input.alt ? `\x1b${sequence}` : sequence;
}
function encodePrintableKey(input: TerminalKeyInput): string {
@@ -85,11 +86,13 @@ export function encodeTerminalKeyInput(input: TerminalKeyInput): string {
}
switch (key) {
case "Enter":
if (input.shift && !input.ctrl && !input.alt && !input.meta) {
return "\x1b[13;2u";
case "Enter": {
const mod = modifierParam(input);
if (mod > 1) {
return `\x1b[13;${mod}u`;
}
return applyAltLikePrefix("\r", input);
return "\r";
}
case "Tab":
if (input.shift && !input.ctrl && !input.alt && !input.meta) {
return "\x1b[Z";