diff options
| author | DeWitt Clinton <[email protected]> | 2025-05-14 17:33:37 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-05-14 17:33:37 -0700 |
| commit | aec6c0861e8244cdaefda14840844e922705c8fa (patch) | |
| tree | 040c8cc37513d05ec72d855c918ebeccce3a9787 /packages/cli/src/ui/components/shared/multiline-editor.tsx | |
| parent | ff36c937338d534d7d0ee87944c60f130aa10d23 (diff) | |
Add readline-like keybindings to the input prompts. (#354)
New keybindings in the main input prompt (when auto-suggestions are not active):
- `Ctrl+L`: Clears the entire screen.
- `Ctrl+A`: Moves the cursor to the beginning of the current input line.
- `Ctrl+E`: Moves the cursor to the end of the current input line.
- `Ctrl+P`: Navigates to the previous command in the input history.
- `Ctrl+N`: Navigates to the next command in the input history.
In the multiline text editor (e.g., when editing a previous message):
- `Ctrl+K`: Deletes text from the current cursor position to the end of the line ("kill line right").
Diffstat (limited to 'packages/cli/src/ui/components/shared/multiline-editor.tsx')
| -rw-r--r-- | packages/cli/src/ui/components/shared/multiline-editor.tsx | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/packages/cli/src/ui/components/shared/multiline-editor.tsx b/packages/cli/src/ui/components/shared/multiline-editor.tsx index bd49efcb..e1e21fff 100644 --- a/packages/cli/src/ui/components/shared/multiline-editor.tsx +++ b/packages/cli/src/ui/components/shared/multiline-editor.tsx @@ -43,7 +43,12 @@ export interface MultilineTextEditorProps { // Called on all key events to allow the caller. Returns true if the // event was handled and should not be passed to the editor. - readonly inputPreprocessor?: (input: string, key: Key) => boolean; + readonly inputPreprocessor?: ( + input: string, + key: Key, + currentText: string, + cursorOffset: number, + ) => boolean; // Optional initial cursor position (character offset) readonly initialCursorOffset?: number; @@ -92,7 +97,24 @@ export const MultilineTextEditor = ({ return; } - if (inputPreprocessor?.(input, key) === true) { + // Calculate cursorOffset for inputPreprocessor + let charOffset = 0; + for (let i = 0; i < buffer.cursor[0]; i++) { + charOffset += buffer.lines[i].length + 1; // +1 for newline + } + charOffset += buffer.cursor[1]; + + if (inputPreprocessor?.(input, key, buffer.text, charOffset) === true) { + return; + } + + if (key.ctrl && input === 'k') { + buffer.killLineRight(); + return; + } + + if (key.ctrl && input === 'u') { + buffer.killLineLeft(); return; } |
