summaryrefslogtreecommitdiff
path: root/packages/cli/src/ui/components/shared/multiline-editor.tsx
diff options
context:
space:
mode:
authorDeWitt Clinton <[email protected]>2025-05-14 17:33:37 -0700
committerGitHub <[email protected]>2025-05-14 17:33:37 -0700
commitaec6c0861e8244cdaefda14840844e922705c8fa (patch)
tree040c8cc37513d05ec72d855c918ebeccce3a9787 /packages/cli/src/ui/components/shared/multiline-editor.tsx
parentff36c937338d534d7d0ee87944c60f130aa10d23 (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.tsx26
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;
}