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;
}