From ef8ec984894408953cc6e0ea2e46cfeb9c272507 Mon Sep 17 00:00:00 2001 From: Billy Biggs Date: Mon, 14 Jul 2025 05:34:20 +0200 Subject: [PATCH] Add back support for escaping newline with a \ character (#4064) --- .../cli/src/ui/components/InputPrompt.test.tsx | 16 ++++++++++++++++ packages/cli/src/ui/components/InputPrompt.tsx | 10 +++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/ui/components/InputPrompt.test.tsx b/packages/cli/src/ui/components/InputPrompt.test.tsx index ad7a3985..53a2cb0e 100644 --- a/packages/cli/src/ui/components/InputPrompt.test.tsx +++ b/packages/cli/src/ui/components/InputPrompt.test.tsx @@ -90,6 +90,7 @@ describe('InputPrompt', () => { killLineLeft: vi.fn(), openInExternalEditor: vi.fn(), newline: vi.fn(), + backspace: vi.fn(), } as unknown as TextBuffer; mockShellHistory = { @@ -527,4 +528,19 @@ describe('InputPrompt', () => { expect(props.onSubmit).not.toHaveBeenCalled(); unmount(); }); + + it('should add a newline on enter when the line ends with a backslash', async () => { + props.buffer.setText('first line\\'); + + const { stdin, unmount } = render(); + await wait(); + + stdin.write('\r'); + await wait(); + + expect(props.onSubmit).not.toHaveBeenCalled(); + expect(props.buffer.backspace).toHaveBeenCalled(); + expect(props.buffer.newline).toHaveBeenCalled(); + unmount(); + }); }); diff --git a/packages/cli/src/ui/components/InputPrompt.tsx b/packages/cli/src/ui/components/InputPrompt.tsx index 371fb48d..5edda273 100644 --- a/packages/cli/src/ui/components/InputPrompt.tsx +++ b/packages/cli/src/ui/components/InputPrompt.tsx @@ -329,7 +329,15 @@ export const InputPrompt: React.FC = ({ if (key.name === 'return' && !key.ctrl && !key.meta && !key.paste) { if (buffer.text.trim()) { - handleSubmitAndClear(buffer.text); + const [row, col] = buffer.cursor; + const line = buffer.lines[row]; + const charBefore = col > 0 ? cpSlice(line, col - 1, col) : ''; + if (charBefore === '\\') { + buffer.backspace(); + buffer.newline(); + } else { + handleSubmitAndClear(buffer.text); + } } return; }