diff options
Diffstat (limited to 'packages/cli/src/ui/components/shared/text-buffer.ts')
| -rw-r--r-- | packages/cli/src/ui/components/shared/text-buffer.ts | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/packages/cli/src/ui/components/shared/text-buffer.ts b/packages/cli/src/ui/components/shared/text-buffer.ts index f2cb1ae2..661df70c 100644 --- a/packages/cli/src/ui/components/shared/text-buffer.ts +++ b/packages/cli/src/ui/components/shared/text-buffer.ts @@ -372,9 +372,9 @@ export function useTextBuffer({ pushUndo, cursorRow, cursorCol, - lines, currentLine, currentLineLen, + lines.length, setPreferredCol, ]); @@ -521,12 +521,58 @@ export function useTextBuffer({ pushUndo, cursorRow, cursorCol, - lines, currentLine, del, + lines.length, setPreferredCol, ]); + const killLineRight = useCallback((): void => { + const lineContent = currentLine(cursorRow); + if (cursorCol < currentLineLen(cursorRow)) { + // Cursor is before the end of the line's content, delete text to the right + pushUndo(); + setLines((prevLines) => { + const newLines = [...prevLines]; + newLines[cursorRow] = cpSlice(lineContent, 0, cursorCol); + return newLines; + }); + // Cursor position and preferredCol do not change in this case + } else if ( + cursorCol === currentLineLen(cursorRow) && + cursorRow < lines.length - 1 + ) { + // Cursor is at the end of the line's content (or line is empty), + // and it's not the last line. Delete the newline. + // `del()` handles pushUndo and setPreferredCol. + del(); + } + // If cursor is at the end of the line and it's the last line, do nothing. + }, [ + pushUndo, + cursorRow, + cursorCol, + currentLine, + currentLineLen, + lines.length, + del, + ]); + + const killLineLeft = useCallback((): void => { + const lineContent = currentLine(cursorRow); + // Only act if the cursor is not at the beginning of the line + if (cursorCol > 0) { + pushUndo(); + setLines((prevLines) => { + const newLines = [...prevLines]; + newLines[cursorRow] = cpSlice(lineContent, cursorCol); + return newLines; + }); + setCursorCol(0); + setPreferredCol(null); + } + }, [pushUndo, cursorRow, cursorCol, currentLine, setPreferredCol]); + const move = useCallback( (dir: Direction): void => { const before = [cursorRow, cursorCol]; @@ -772,6 +818,8 @@ export function useTextBuffer({ replaceRange, deleteWordLeft, deleteWordRight, + killLineRight, + killLineLeft, handleInput, openInExternalEditor, @@ -873,6 +921,14 @@ export interface TextBuffer { */ deleteWordRight: () => void; /** + * Deletes text from the cursor to the end of the current line. + */ + killLineRight: () => void; + /** + * Deletes text from the start of the current line to the cursor. + */ + killLineLeft: () => void; + /** * High level "handleInput" – receives what Ink gives us. */ handleInput: ( |
