diff options
Diffstat (limited to 'packages/cli/src/ui/components/InputPrompt.tsx')
| -rw-r--r-- | packages/cli/src/ui/components/InputPrompt.tsx | 68 |
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; } |
