mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-21 09:17:53 +00:00
78 lines
1.7 KiB
TypeScript
78 lines
1.7 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2025 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
import type { Key } from '../contexts/KeypressContext.js';
|
|
|
|
export type { Key };
|
|
|
|
/**
|
|
* Translates a Key object into its corresponding ANSI escape sequence.
|
|
* This is useful for sending control characters to a pseudo-terminal.
|
|
*
|
|
* @param key The Key object to translate.
|
|
* @returns The ANSI escape sequence as a string, or null if no mapping exists.
|
|
*/
|
|
export function keyToAnsi(key: Key): string | null {
|
|
if (key.ctrl) {
|
|
// Ctrl + letter
|
|
if (key.name >= 'a' && key.name <= 'z') {
|
|
return String.fromCharCode(
|
|
key.name.charCodeAt(0) - 'a'.charCodeAt(0) + 1,
|
|
);
|
|
}
|
|
// Other Ctrl combinations might need specific handling
|
|
switch (key.name) {
|
|
case 'c':
|
|
return '\x03'; // ETX (End of Text), commonly used for interrupt
|
|
// Add other special ctrl cases if needed
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Arrow keys and other special keys
|
|
switch (key.name) {
|
|
case 'up':
|
|
return '\x1b[A';
|
|
case 'down':
|
|
return '\x1b[B';
|
|
case 'right':
|
|
return '\x1b[C';
|
|
case 'left':
|
|
return '\x1b[D';
|
|
case 'escape':
|
|
return '\x1b';
|
|
case 'tab':
|
|
return '\t';
|
|
case 'backspace':
|
|
return '\x7f';
|
|
case 'delete':
|
|
return '\x1b[3~';
|
|
case 'home':
|
|
return '\x1b[H';
|
|
case 'end':
|
|
return '\x1b[F';
|
|
case 'pageup':
|
|
return '\x1b[5~';
|
|
case 'pagedown':
|
|
return '\x1b[6~';
|
|
default:
|
|
break;
|
|
}
|
|
|
|
// Enter/Return
|
|
if (key.name === 'return') {
|
|
return '\r';
|
|
}
|
|
|
|
// If it's a simple character, return it.
|
|
if (!key.ctrl && !key.meta && key.sequence) {
|
|
return key.sequence;
|
|
}
|
|
|
|
return null;
|
|
}
|