mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-21 09:17:53 +00:00
Sync upstream Gemini-CLI v0.8.2 (#838)
This commit is contained in:
77
packages/cli/src/ui/hooks/keyToAnsi.ts
Normal file
77
packages/cli/src/ui/hooks/keyToAnsi.ts
Normal file
@@ -0,0 +1,77 @@
|
||||
/**
|
||||
* @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;
|
||||
}
|
||||
Reference in New Issue
Block a user