From 2db9790a9c8d886acfbb30833eaaa5fe329c5e8a Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 19 Dec 2023 09:58:38 -0800 Subject: [PATCH 1/3] Allow pasting terminal text as single line Fixes #200413 --- .../terminal/browser/terminalInstance.ts | 6 +++- .../terminal/common/terminalClipboard.ts | 29 +++++++++++++++---- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 1f27f0d7418..755a1bf0df5 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -1188,12 +1188,16 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { return; } - const currentText: string = value; + let currentText = value; const shouldPasteText = await this._scopedInstantiationService.invokeFunction(shouldPasteTerminalText, currentText, this.xterm?.raw.modes.bracketedPasteMode); if (!shouldPasteText) { return; } + if (typeof shouldPasteText === 'object') { + currentText = shouldPasteText.modifiedText; + } + this.focus(); this.xterm.raw.paste(currentText); } diff --git a/src/vs/workbench/contrib/terminal/common/terminalClipboard.ts b/src/vs/workbench/contrib/terminal/common/terminalClipboard.ts index 2e529b6e637..e97008acc8b 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalClipboard.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalClipboard.ts @@ -9,7 +9,7 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { TerminalSettingId } from 'vs/platform/terminal/common/terminal'; -export async function shouldPasteTerminalText(accessor: ServicesAccessor, text: string, bracketedPasteMode: boolean | undefined): Promise { +export async function shouldPasteTerminalText(accessor: ServicesAccessor, text: string, bracketedPasteMode: boolean | undefined): Promise { const configurationService = accessor.get(IConfigurationService); const dialogService = accessor.get(IDialogService); @@ -70,18 +70,37 @@ export async function shouldPasteTerminalText(accessor: ServicesAccessor, text: detail += `\n…`; } - const { confirmed, checkboxChecked } = await dialogService.confirm({ + const { result, checkboxChecked } = await dialogService.prompt<{ confirmed: boolean; singleLine: boolean }>({ message: localize('confirmMoveTrashMessageFilesAndDirectories', "Are you sure you want to paste {0} lines of text into the terminal?", textForLines.length), detail, - primaryButton: localize({ key: 'multiLinePasteButton', comment: ['&& denotes a mnemonic'] }, "&&Paste"), + type: 'warning', + buttons: [ + { + label: localize({ key: 'multiLinePasteButton', comment: ['&& denotes a mnemonic'] }, "&&Paste"), + run: () => ({ confirmed: true, singleLine: false }) + }, + { + label: localize({ key: 'multiLinePasteButton.oneLine', comment: ['&& denotes a mnemonic'] }, "Paste as &&one line"), + run: () => ({ confirmed: true, singleLine: true }) + } + ], + cancelButton: true, checkbox: { label: localize('doNotAskAgain', "Do not ask me again") } }); - if (confirmed && checkboxChecked) { + if (!result) { + return false; + } + + if (result.confirmed && checkboxChecked) { await configurationService.updateValue(TerminalSettingId.EnableMultiLinePasteWarning, false); } - return confirmed; + if (result.singleLine) { + return { modifiedText: text.replaceAll(/\r?\n/, '') }; + } + + return result.confirmed; } From bef52240166334c714a88d5a90fa052620b498c4 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 19 Dec 2023 10:00:02 -0800 Subject: [PATCH 2/3] Fix replace throwing --- src/vs/workbench/contrib/terminal/common/terminalClipboard.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/common/terminalClipboard.ts b/src/vs/workbench/contrib/terminal/common/terminalClipboard.ts index e97008acc8b..2e4bad6a827 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalClipboard.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalClipboard.ts @@ -99,7 +99,7 @@ export async function shouldPasteTerminalText(accessor: ServicesAccessor, text: } if (result.singleLine) { - return { modifiedText: text.replaceAll(/\r?\n/, '') }; + return { modifiedText: text.replace(/\r?\n/g, '') }; } return result.confirmed; From 10800648a576609cdd5cf7520c2d2eef8e855730 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 19 Dec 2023 11:16:22 -0800 Subject: [PATCH 3/3] Move clipboard test to use prompt, not confirm --- src/vs/platform/dialogs/test/common/testDialogService.ts | 8 +++++++- .../terminal/test/common/terminalClipboard.test.ts | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/dialogs/test/common/testDialogService.ts b/src/vs/platform/dialogs/test/common/testDialogService.ts index 9071478d806..f63897d47f0 100644 --- a/src/vs/platform/dialogs/test/common/testDialogService.ts +++ b/src/vs/platform/dialogs/test/common/testDialogService.ts @@ -14,7 +14,10 @@ export class TestDialogService implements IDialogService { readonly onWillShowDialog = Event.None; readonly onDidShowDialog = Event.None; - constructor(private defaultConfirmResult: IConfirmationResult | undefined = undefined) { } + constructor( + private defaultConfirmResult: IConfirmationResult | undefined = undefined, + private defaultPromptResult: IPromptResult | undefined = undefined + ) { } private confirmResult: IConfirmationResult | undefined = undefined; setConfirmResult(result: IConfirmationResult) { @@ -36,6 +39,9 @@ export class TestDialogService implements IDialogService { prompt(prompt: IPromptWithDefaultCancel): Promise>; prompt(prompt: IPrompt): Promise>; async prompt(prompt: IPrompt | IPromptWithCustomCancel): Promise | IPromptResultWithCancel> { + if (this.defaultPromptResult) { + return this.defaultPromptResult; + } const promptButtons: IPromptBaseButton[] = [...(prompt.buttons ?? [])]; if (prompt.cancelButton && typeof prompt.cancelButton !== 'string' && typeof prompt.cancelButton !== 'boolean') { promptButtons.push(prompt.cancelButton); diff --git a/src/vs/workbench/contrib/terminal/test/common/terminalClipboard.test.ts b/src/vs/workbench/contrib/terminal/test/common/terminalClipboard.test.ts index e5e9d7cb6f3..e0deb307948 100644 --- a/src/vs/workbench/contrib/terminal/test/common/terminalClipboard.test.ts +++ b/src/vs/workbench/contrib/terminal/test/common/terminalClipboard.test.ts @@ -25,7 +25,7 @@ suite('TerminalClipboard', function () { configurationService = new TestConfigurationService({ [TerminalSettingId.EnableMultiLinePasteWarning]: 'auto' }); - dialogService = new TestDialogService({ confirmed: false }); + dialogService = new TestDialogService(undefined, { result: { confirmed: false } }); instantiationService.stub(IConfigurationService, configurationService); instantiationService.stub(IDialogService, dialogService);