mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-04-25 20:44:46 -07:00
112 lines
2.2 KiB
TypeScript
112 lines
2.2 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2025 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
import process from 'node:process';
|
|
import {
|
|
type Command,
|
|
type KeyBinding,
|
|
type KeyBindingConfig,
|
|
defaultKeyBindings,
|
|
} from '../../config/keyBindings.js';
|
|
|
|
/**
|
|
* Maps internal key names to user-friendly display names.
|
|
*/
|
|
const KEY_NAME_MAP: Record<string, string> = {
|
|
return: 'Enter',
|
|
escape: 'Esc',
|
|
backspace: 'Backspace',
|
|
delete: 'Delete',
|
|
up: 'Up',
|
|
down: 'Down',
|
|
left: 'Left',
|
|
right: 'Right',
|
|
pageup: 'Page Up',
|
|
pagedown: 'Page Down',
|
|
home: 'Home',
|
|
end: 'End',
|
|
tab: 'Tab',
|
|
space: 'Space',
|
|
'double escape': 'Double Esc',
|
|
};
|
|
|
|
interface ModifierMap {
|
|
ctrl: string;
|
|
alt: string;
|
|
shift: string;
|
|
cmd: string;
|
|
}
|
|
|
|
const MODIFIER_MAPS: Record<string, ModifierMap> = {
|
|
darwin: {
|
|
ctrl: 'Ctrl',
|
|
alt: 'Option',
|
|
shift: 'Shift',
|
|
cmd: 'Cmd',
|
|
},
|
|
win32: {
|
|
ctrl: 'Ctrl',
|
|
alt: 'Alt',
|
|
shift: 'Shift',
|
|
cmd: 'Win',
|
|
},
|
|
linux: {
|
|
ctrl: 'Ctrl',
|
|
alt: 'Alt',
|
|
shift: 'Shift',
|
|
cmd: 'Super',
|
|
},
|
|
default: {
|
|
ctrl: 'Ctrl',
|
|
alt: 'Alt',
|
|
shift: 'Shift',
|
|
cmd: 'Cmd/Win',
|
|
},
|
|
};
|
|
|
|
/**
|
|
* Formats a single KeyBinding into a human-readable string (e.g., "Ctrl+C").
|
|
*/
|
|
export function formatKeyBinding(
|
|
binding: KeyBinding,
|
|
platform?: string,
|
|
): string {
|
|
const activePlatform =
|
|
platform ??
|
|
(process.env['FORCE_GENERIC_KEYBINDING_HINTS']
|
|
? 'default'
|
|
: process.platform);
|
|
const modMap = MODIFIER_MAPS[activePlatform] || MODIFIER_MAPS['default'];
|
|
const parts: string[] = [];
|
|
|
|
if (binding.ctrl) parts.push(modMap.ctrl);
|
|
if (binding.alt) parts.push(modMap.alt);
|
|
if (binding.shift) parts.push(modMap.shift);
|
|
if (binding.cmd) parts.push(modMap.cmd);
|
|
|
|
const keyName = KEY_NAME_MAP[binding.key] || binding.key.toUpperCase();
|
|
parts.push(keyName);
|
|
|
|
return parts.join('+');
|
|
}
|
|
|
|
/**
|
|
* Formats the primary keybinding for a command.
|
|
*/
|
|
export function formatCommand(
|
|
command: Command,
|
|
config: KeyBindingConfig = defaultKeyBindings,
|
|
platform?: string,
|
|
): string {
|
|
const bindings = config[command];
|
|
if (!bindings || bindings.length === 0) {
|
|
return '';
|
|
}
|
|
|
|
// Use the first binding as the primary one for display
|
|
return formatKeyBinding(bindings[0], platform);
|
|
}
|