From 7fd7c1a5394342e00977d2243b90b71fa8360c0f Mon Sep 17 00:00:00 2001 From: Taylor Mullen Date: Tue, 20 May 2025 23:42:40 -0700 Subject: [PATCH] fix(cli): Handle VSCode Shift+Enter in text buffer - The text buffer now correctly interprets `\\\r` (produced by Shift+Enter in the VSCode terminal) as a newline character. - Added a corresponding test case to `text-buffer.test.ts`. Fixes https://buganizer.corp.google.com/issues/418505364 --- packages/cli/src/ui/components/shared/text-buffer.test.ts | 6 ++++++ packages/cli/src/ui/components/shared/text-buffer.ts | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/ui/components/shared/text-buffer.test.ts b/packages/cli/src/ui/components/shared/text-buffer.test.ts index 704666d1..da4a3cd7 100644 --- a/packages/cli/src/ui/components/shared/text-buffer.test.ts +++ b/packages/cli/src/ui/components/shared/text-buffer.test.ts @@ -508,6 +508,12 @@ describe('useTextBuffer', () => { act(() => result.current.handleInput(textWithAnsi, {})); expect(getBufferState(result).text).toBe('Hello World'); }); + + it('should handle VSCode terminal Shift+Enter as newline', () => { + const { result } = renderHook(() => useTextBuffer({ viewport })); + act(() => result.current.handleInput('\r', {})); // Simulates Shift+Enter in VSCode terminal + expect(getBufferState(result).lines).toEqual(['', '']); + }); }); // More tests would be needed for: diff --git a/packages/cli/src/ui/components/shared/text-buffer.ts b/packages/cli/src/ui/components/shared/text-buffer.ts index a8b8cef3..789a909a 100644 --- a/packages/cli/src/ui/components/shared/text-buffer.ts +++ b/packages/cli/src/ui/components/shared/text-buffer.ts @@ -1151,7 +1151,13 @@ export function useTextBuffer({ if (key['escape']) return false; - if (key['return'] || input === '\r' || input === '\n') newline(); + if ( + key['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');