diff options
| author | Billy Biggs <[email protected]> | 2025-06-27 10:57:32 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-06-27 17:57:32 +0000 |
| commit | 4fbffdf617b2fb87c1b663391fbe488c5c81beb8 (patch) | |
| tree | aa0f984ccd95016693a52826ff11e6b30bc422c7 /packages/cli/src/ui/components/shared/text-buffer.ts | |
| parent | 5fd6664c4b1c4a1ca84119ea709e5dac2a9fce70 (diff) | |
Handle stdin for prompts using readline for escape character parsing (#1972)
Diffstat (limited to 'packages/cli/src/ui/components/shared/text-buffer.ts')
| -rw-r--r-- | packages/cli/src/ui/components/shared/text-buffer.ts | 75 |
1 files changed, 41 insertions, 34 deletions
diff --git a/packages/cli/src/ui/components/shared/text-buffer.ts b/packages/cli/src/ui/components/shared/text-buffer.ts index 82f10fa1..15fc6d3c 100644 --- a/packages/cli/src/ui/components/shared/text-buffer.ts +++ b/packages/cli/src/ui/components/shared/text-buffer.ts @@ -1220,9 +1220,16 @@ export function useTextBuffer({ ); const handleInput = useCallback( - (input: string | undefined, key: Record<string, boolean>): boolean => { + (key: { + name: string; + ctrl: boolean; + meta: boolean; + shift: boolean; + paste: boolean; + sequence: string; + }): boolean => { + const { sequence: input } = key; dbg('handleInput', { - input, key, cursor: [cursorRow, cursorCol], visualCursor, @@ -1231,50 +1238,46 @@ export function useTextBuffer({ const beforeLogicalCursor = [cursorRow, cursorCol]; const beforeVisualCursor = [...visualCursor]; - if (key['escape']) return false; + if (key.name === 'escape') return false; if ( - key['return'] || + key.name === 'return' || input === '\r' || input === '\n' || input === '\\\r' // VSCode terminal represents shift + enter this way ) newline(); - else if (key['leftArrow'] && !key['meta'] && !key['ctrl'] && !key['alt']) - move('left'); - else if (key['ctrl'] && input === 'b') move('left'); - else if (key['rightArrow'] && !key['meta'] && !key['ctrl'] && !key['alt']) - move('right'); - else if (key['ctrl'] && input === 'f') move('right'); - else if (key['upArrow']) move('up'); - else if (key['downArrow']) move('down'); - else if ((key['ctrl'] || key['alt']) && key['leftArrow']) - move('wordLeft'); - else if (key['meta'] && input === 'b') move('wordLeft'); - else if ((key['ctrl'] || key['alt']) && key['rightArrow']) + else if (key.name === 'left' && !key.meta && !key.ctrl) move('left'); + else if (key.ctrl && key.name === 'b') move('left'); + else if (key.name === 'right' && !key.meta && !key.ctrl) move('right'); + else if (key.ctrl && key.name === 'f') move('right'); + else if (key.name === 'up') move('up'); + else if (key.name === 'down') move('down'); + else if ((key.ctrl || key.meta) && key.name === 'left') move('wordLeft'); + else if (key.meta && key.name === 'b') move('wordLeft'); + else if ((key.ctrl || key.meta) && key.name === 'right') move('wordRight'); - else if (key['meta'] && input === 'f') move('wordRight'); - else if (key['home']) move('home'); - else if (key['ctrl'] && input === 'a') move('home'); - else if (key['end']) move('end'); - else if (key['ctrl'] && input === 'e') move('end'); - else if (key['ctrl'] && input === 'w') deleteWordLeft(); + else if (key.meta && key.name === 'f') move('wordRight'); + else if (key.name === 'home') move('home'); + else if (key.ctrl && key.name === 'a') move('home'); + else if (key.name === 'end') move('end'); + else if (key.ctrl && key.name === 'e') move('end'); + else if (key.ctrl && key.name === 'w') deleteWordLeft(); else if ( - (key['meta'] || key['ctrl'] || key['alt']) && - (key['backspace'] || input === '\x7f') + (key.meta || key.ctrl) && + (key.name === 'backspace' || input === '\x7f') ) deleteWordLeft(); - else if ((key['meta'] || key['ctrl'] || key['alt']) && key['delete']) + else if ((key.meta || key.ctrl) && key.name === 'delete') deleteWordRight(); else if ( - key['backspace'] || + key.name === 'backspace' || input === '\x7f' || - (key['ctrl'] && input === 'h') || - (key['delete'] && !key['shift']) + (key.ctrl && key.name === 'h') ) backspace(); - else if (key['delete'] || (key['ctrl'] && input === 'd')) del(); - else if (input && !key['ctrl'] && !key['meta']) { + else if (key.name === 'delete' || (key.ctrl && key.name === 'd')) del(); + else if (input && !key.ctrl && !key.meta) { insert(input); } @@ -1483,10 +1486,14 @@ export interface TextBuffer { /** * High level "handleInput" – receives what Ink gives us. */ - handleInput: ( - input: string | undefined, - key: Record<string, boolean>, - ) => boolean; + handleInput: (key: { + name: string; + ctrl: boolean; + meta: boolean; + shift: boolean; + paste: boolean; + sequence: string; + }) => boolean; /** * Opens the current buffer contents in the user's preferred terminal text * editor ($VISUAL or $EDITOR, falling back to "vi"). The method blocks |
