summaryrefslogtreecommitdiff
path: root/packages/cli/src/ui/components/InputPrompt.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'packages/cli/src/ui/components/InputPrompt.tsx')
-rw-r--r--packages/cli/src/ui/components/InputPrompt.tsx68
1 files changed, 39 insertions, 29 deletions
diff --git a/packages/cli/src/ui/components/InputPrompt.tsx b/packages/cli/src/ui/components/InputPrompt.tsx
index 7250afea..78b3b96b 100644
--- a/packages/cli/src/ui/components/InputPrompt.tsx
+++ b/packages/cli/src/ui/components/InputPrompt.tsx
@@ -17,6 +17,7 @@ import { useShellHistory } from '../hooks/useShellHistory.js';
import { useReverseSearchCompletion } from '../hooks/useReverseSearchCompletion.js';
import { useCommandCompletion } from '../hooks/useCommandCompletion.js';
import { useKeypress, Key } from '../hooks/useKeypress.js';
+import { keyMatchers, Command } from '../keyMatchers.js';
import { CommandContext, SlashCommand } from '../commands/types.js';
import { Config } from '@google/gemini-cli-core';
import {
@@ -221,7 +222,7 @@ export const InputPrompt: React.FC<InputPromptProps> = ({
return;
}
- if (key.name === 'escape') {
+ if (keyMatchers[Command.ESCAPE](key)) {
if (reverseSearchActive) {
setReverseSearchActive(false);
reverseSearchCompletion.resetCompletionState();
@@ -234,7 +235,6 @@ export const InputPrompt: React.FC<InputPromptProps> = ({
buffer.moveToOffset(offset);
return;
}
-
if (shellModeActive) {
setShellModeActive(false);
return;
@@ -246,14 +246,14 @@ export const InputPrompt: React.FC<InputPromptProps> = ({
}
}
- if (shellModeActive && key.ctrl && key.name === 'r') {
+ if (shellModeActive && keyMatchers[Command.REVERSE_SEARCH](key)) {
setReverseSearchActive(true);
setTextBeforeReverseSearch(buffer.text);
setCursorPosition(buffer.cursor);
return;
}
- if (key.ctrl && key.name === 'l') {
+ if (keyMatchers[Command.CLEAR_SCREEN](key)) {
onClearScreen();
return;
}
@@ -268,15 +268,15 @@ export const InputPrompt: React.FC<InputPromptProps> = ({
} = reverseSearchCompletion;
if (showSuggestions) {
- if (key.name === 'up') {
+ if (keyMatchers[Command.NAVIGATION_UP](key)) {
navigateUp();
return;
}
- if (key.name === 'down') {
+ if (keyMatchers[Command.NAVIGATION_DOWN](key)) {
navigateDown();
return;
}
- if (key.name === 'tab') {
+ if (keyMatchers[Command.ACCEPT_SUGGESTION_REVERSE_SEARCH](key)) {
reverseSearchCompletion.handleAutocomplete(activeSuggestionIndex);
reverseSearchCompletion.resetCompletionState();
setReverseSearchActive(false);
@@ -284,7 +284,7 @@ export const InputPrompt: React.FC<InputPromptProps> = ({
}
}
- if (key.name === 'return' && !key.ctrl) {
+ if (keyMatchers[Command.SUBMIT_REVERSE_SEARCH](key)) {
const textToSubmit =
showSuggestions && activeSuggestionIndex > -1
? suggestions[activeSuggestionIndex].value
@@ -296,30 +296,39 @@ export const InputPrompt: React.FC<InputPromptProps> = ({
}
// Prevent up/down from falling through to regular history navigation
- if (key.name === 'up' || key.name === 'down') {
+ if (
+ keyMatchers[Command.NAVIGATION_UP](key) ||
+ keyMatchers[Command.NAVIGATION_DOWN](key)
+ ) {
return;
}
}
// If the command is a perfect match, pressing enter should execute it.
- if (completion.isPerfectMatch && key.name === 'return') {
+ if (completion.isPerfectMatch && keyMatchers[Command.RETURN](key)) {
handleSubmitAndClear(buffer.text);
return;
}
if (completion.showSuggestions) {
if (completion.suggestions.length > 1) {
- if (key.name === 'up' || (key.ctrl && key.name === 'p')) {
+ if (
+ keyMatchers[Command.NAVIGATION_UP](key) ||
+ keyMatchers[Command.HISTORY_UP](key)
+ ) {
completion.navigateUp();
return;
}
- if (key.name === 'down' || (key.ctrl && key.name === 'n')) {
+ if (
+ keyMatchers[Command.NAVIGATION_DOWN](key) ||
+ keyMatchers[Command.HISTORY_DOWN](key)
+ ) {
completion.navigateDown();
return;
}
}
- if (key.name === 'tab' || (key.name === 'return' && !key.ctrl)) {
+ if (keyMatchers[Command.ACCEPT_SUGGESTION](key)) {
if (completion.suggestions.length > 0) {
const targetIndex =
completion.activeSuggestionIndex === -1
@@ -334,17 +343,17 @@ export const InputPrompt: React.FC<InputPromptProps> = ({
}
if (!shellModeActive) {
- if (key.ctrl && key.name === 'p') {
+ if (keyMatchers[Command.HISTORY_UP](key)) {
inputHistory.navigateUp();
return;
}
- if (key.ctrl && key.name === 'n') {
+ if (keyMatchers[Command.HISTORY_DOWN](key)) {
inputHistory.navigateDown();
return;
}
// Handle arrow-up/down for history on single-line or at edges
if (
- key.name === 'up' &&
+ keyMatchers[Command.NAVIGATION_UP](key) &&
(buffer.allVisualLines.length === 1 ||
(buffer.visualCursor[0] === 0 && buffer.visualScrollRow === 0))
) {
@@ -352,7 +361,7 @@ export const InputPrompt: React.FC<InputPromptProps> = ({
return;
}
if (
- key.name === 'down' &&
+ keyMatchers[Command.NAVIGATION_DOWN](key) &&
(buffer.allVisualLines.length === 1 ||
buffer.visualCursor[0] === buffer.allVisualLines.length - 1)
) {
@@ -360,18 +369,20 @@ export const InputPrompt: React.FC<InputPromptProps> = ({
return;
}
} else {
- if (key.name === 'up') {
+ // Shell History Navigation
+ if (keyMatchers[Command.NAVIGATION_UP](key)) {
const prevCommand = shellHistory.getPreviousCommand();
if (prevCommand !== null) buffer.setText(prevCommand);
return;
}
- if (key.name === 'down') {
+ if (keyMatchers[Command.NAVIGATION_DOWN](key)) {
const nextCommand = shellHistory.getNextCommand();
if (nextCommand !== null) buffer.setText(nextCommand);
return;
}
}
- if (key.name === 'return' && !key.ctrl && !key.meta && !key.paste) {
+
+ if (keyMatchers[Command.SUBMIT](key)) {
if (buffer.text.trim()) {
const [row, col] = buffer.cursor;
const line = buffer.lines[row];
@@ -387,23 +398,23 @@ export const InputPrompt: React.FC<InputPromptProps> = ({
}
// Newline insertion
- if (key.name === 'return' && (key.ctrl || key.meta || key.paste)) {
+ if (keyMatchers[Command.NEWLINE](key)) {
buffer.newline();
return;
}
// Ctrl+A (Home) / Ctrl+E (End)
- if (key.ctrl && key.name === 'a') {
+ if (keyMatchers[Command.HOME](key)) {
buffer.move('home');
return;
}
- if (key.ctrl && key.name === 'e') {
+ if (keyMatchers[Command.END](key)) {
buffer.move('end');
buffer.moveToOffset(cpLen(buffer.text));
return;
}
// Ctrl+C (Clear input)
- if (key.ctrl && key.name === 'c') {
+ if (keyMatchers[Command.CLEAR_INPUT](key)) {
if (buffer.text.length > 0) {
buffer.setText('');
resetCompletionState();
@@ -413,24 +424,23 @@ export const InputPrompt: React.FC<InputPromptProps> = ({
}
// Kill line commands
- if (key.ctrl && key.name === 'k') {
+ if (keyMatchers[Command.KILL_LINE_RIGHT](key)) {
buffer.killLineRight();
return;
}
- if (key.ctrl && key.name === 'u') {
+ if (keyMatchers[Command.KILL_LINE_LEFT](key)) {
buffer.killLineLeft();
return;
}
// External editor
- const isCtrlX = key.ctrl && (key.name === 'x' || key.sequence === '\x18');
- if (isCtrlX) {
+ if (keyMatchers[Command.OPEN_EXTERNAL_EDITOR](key)) {
buffer.openInExternalEditor();
return;
}
// Ctrl+V for clipboard image paste
- if (key.ctrl && key.name === 'v') {
+ if (keyMatchers[Command.PASTE_CLIPBOARD_IMAGE](key)) {
handleClipboardImage();
return;
}