fix(paste) incorrect handling of \\\n in pastes (#6532)

This commit is contained in:
Jacob Richman
2025-08-19 13:41:08 -07:00
committed by GitHub
parent ed1fc4ddb3
commit 2143731f6e
5 changed files with 120 additions and 60 deletions

View File

@@ -1211,6 +1211,43 @@ describe('InputPrompt', () => {
});
});
describe('multiline paste', () => {
it.each([
{
description: 'with \n newlines',
pastedText: 'This \n is \n a \n multiline \n paste.',
},
{
description: 'with extra slashes before \n newlines',
pastedText: 'This \\\n is \\\n a \\\n multiline \\\n paste.',
},
{
description: 'with \r\n newlines',
pastedText: 'This\r\nis\r\na\r\nmultiline\r\npaste.',
},
])('should handle multiline paste $description', async ({ pastedText }) => {
const { stdin, unmount } = renderWithProviders(
<InputPrompt {...props} />,
);
await wait();
// Simulate a bracketed paste event from the terminal
stdin.write(`\x1b[200~${pastedText}\x1b[201~`);
await wait();
// Verify that the buffer's handleInput was called once with the full text
expect(props.buffer.handleInput).toHaveBeenCalledTimes(1);
expect(props.buffer.handleInput).toHaveBeenCalledWith(
expect.objectContaining({
paste: true,
sequence: pastedText,
}),
);
unmount();
});
});
describe('enhanced input UX - double ESC clear functionality', () => {
it('should clear buffer on second ESC press', async () => {
const onEscapePromptChange = vi.fn();

View File

@@ -239,6 +239,12 @@ export const InputPrompt: React.FC<InputPromptProps> = ({
return;
}
if (key.paste) {
// Ensure we never accidentally interpret paste as regular input.
buffer.handleInput(key);
return;
}
if (vimHandleInput && vimHandleInput(key)) {
return;
}

View File

@@ -1833,6 +1833,13 @@ export function useTextBuffer({
}): void => {
const { sequence: input } = key;
if (key.paste) {
// Do not do any other processing on pastes so ensure we handle them
// before all other cases.
insert(input, { paste: key.paste });
return;
}
if (
key.name === 'return' ||
input === '\r' ||