From a7eaf157d509a2d83e7bab2b04b25437d5b3e0ec Mon Sep 17 00:00:00 2001 From: Martin Sander Date: Sun, 7 Nov 2021 22:52:46 +0100 Subject: [PATCH 1/5] Middle-click paste in terminal on non-Linux --- src/vs/platform/terminal/common/terminal.ts | 1 + .../terminal/browser/terminalEditor.ts | 19 +++++++++++++------ .../terminal/browser/terminalTabbedView.ts | 12 ++++++++---- .../contrib/terminal/common/terminal.ts | 1 + .../terminal/common/terminalConfiguration.ts | 10 ++++++++++ 5 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/vs/platform/terminal/common/terminal.ts b/src/vs/platform/terminal/common/terminal.ts index 71c62368b09..79c9369e6bc 100644 --- a/src/vs/platform/terminal/common/terminal.ts +++ b/src/vs/platform/terminal/common/terminal.ts @@ -71,6 +71,7 @@ export const enum TerminalSettingId { TerminalTitle = 'terminal.integrated.tabs.title', TerminalDescription = 'terminal.integrated.tabs.description', RightClickBehavior = 'terminal.integrated.rightClickBehavior', + MiddleClickBehavior = 'terminal.integrated.middleClickBehavior', Cwd = 'terminal.integrated.cwd', ConfirmOnExit = 'terminal.integrated.confirmOnExit', ConfirmOnKill = 'terminal.integrated.confirmOnKill', diff --git a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts index 124238bcac6..c0c231efe17 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts @@ -131,12 +131,19 @@ export class TerminalEditor extends EditorPane { return; } - if (event.which === 2 && isLinux) { - // Drop selection and focus terminal on Linux to enable middle button paste when click - // occurs on the selection itself. - const terminal = this._terminalEditorService.activeInstance; - if (terminal) { - terminal.focus(); + if (event.which === 2) { + if (isLinux) { + // Drop selection and focus terminal on Linux to enable middle button paste when click + // occurs on the selection itself. + const terminal = this._terminalEditorService.activeInstance; + if (terminal) { + terminal.focus(); + } + } else if (this._terminalService.configHelper.config.middleClickBehavior === 'paste') { + const terminal = this._terminalEditorService.activeInstance; + if (terminal) { + terminal.paste(); + } } } else if (event.which === 3) { const rightClickBehavior = this._terminalService.configHelper.config.rightClickBehavior; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts b/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts index adae67849dc..30806c967f8 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts @@ -346,10 +346,14 @@ export class TerminalTabbedView extends Disposable { return; } - if (event.which === 2 && isLinux) { - // Drop selection and focus terminal on Linux to enable middle button paste when click - // occurs on the selection itself. - terminal.focus(); + if (event.which === 2) { + if (isLinux) { + // Drop selection and focus terminal on Linux to enable middle button paste when click + // occurs on the selection itself. + terminal.focus(); + } else if (this._terminalService.configHelper.config.middleClickBehavior === 'paste') { + terminal.paste(); + } } else if (event.which === 3) { const rightClickBehavior = this._terminalService.configHelper.config.rightClickBehavior; if (rightClickBehavior === 'copyPaste' || rightClickBehavior === 'paste') { diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index bf99ce95676..b40de7524af 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -203,6 +203,7 @@ export interface ITerminalConfiguration { macOptionClickForcesSelection: boolean; gpuAcceleration: 'auto' | 'on' | 'canvas' | 'off'; rightClickBehavior: 'default' | 'copyPaste' | 'paste' | 'selectWord'; + middleClickBehavior: 'default' | 'paste'; cursorBlinking: boolean; cursorStyle: 'block' | 'underline' | 'line'; cursorWidth: number; diff --git a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts index 84d3e578a02..e8ff265bb9e 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts @@ -293,6 +293,16 @@ const terminalConfiguration: IConfigurationNode = { default: isMacintosh ? 'selectWord' : isWindows ? 'copyPaste' : 'default', description: localize('terminal.integrated.rightClickBehavior', "Controls how terminal reacts to right click.") }, + [TerminalSettingId.MiddleClickBehavior]: { + type: 'string', + enum: ['default', 'paste'], + enumDescriptions: [ + localize('terminal.integrated.middleClickBehavior.default', "Platform default"), + localize('terminal.integrated.middleClickBehavior.paste', "Paste on middle click."), + ], + default: 'default', + description: localize('terminal.integrated.middleClickBehavior', "Controls how terminal reacts to middle click.") + }, [TerminalSettingId.Cwd]: { restricted: true, description: localize('terminal.integrated.cwd', "An explicit start path where the terminal will be launched, this is used as the current working directory (cwd) for the shell process. This may be particularly useful in workspace settings if the root directory is not a convenient cwd."), From 4fe8f60274770160cb4bb60a77d626421d0270ea Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 2 Apr 2024 06:54:36 -0700 Subject: [PATCH 2/5] Move onto ITerminalConfigurationService --- src/vs/workbench/contrib/terminal/browser/terminalEditor.ts | 2 +- src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts index 00ab81f90c9..2a5d8630592 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts @@ -133,7 +133,7 @@ export class TerminalEditor extends EditorPane { // occurs on the selection itself. const terminal = this._terminalEditorService.activeInstance; terminal?.focus(); - } else if (this._terminalService.configHelper.config.middleClickBehavior === 'paste') { + } else if (this._terminalConfigurationService.config.middleClickBehavior === 'paste') { const terminal = this._terminalEditorService.activeInstance; terminal?.paste(); } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts b/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts index ab43601ac68..27d75b99327 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts @@ -344,7 +344,7 @@ export class TerminalTabbedView extends Disposable { // Drop selection and focus terminal on Linux to enable middle button paste when click // occurs on the selection itself. terminal.focus(); - } else if (this._terminalService.configHelper.config.middleClickBehavior === 'paste') { + } else if (this._terminalConfigurationService.config.middleClickBehavior === 'paste') { terminal.paste(); } } else if (event.which === 3) { From 6f989eb488fcd0040b4d72232c68906fec8f8d8e Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 2 Apr 2024 06:56:08 -0700 Subject: [PATCH 3/5] Bring terminal editor's mousedown handling closer in line with tabbed view --- .../contrib/terminal/browser/terminalEditor.ts | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts index 2a5d8630592..1fafecbda9f 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts @@ -123,7 +123,8 @@ export class TerminalEditor extends EditorPane { return; } this._register(dom.addDisposableListener(this._editorInstanceElement, 'mousedown', async (event: MouseEvent) => { - if (this._terminalEditorService.instances.length === 0) { + const terminal = this._terminalEditorService.activeInstance; + if (this._terminalEditorService.instances.length === 0 || !terminal) { return; } @@ -131,11 +132,9 @@ export class TerminalEditor extends EditorPane { if (isLinux) { // Drop selection and focus terminal on Linux to enable middle button paste when click // occurs on the selection itself. - const terminal = this._terminalEditorService.activeInstance; - terminal?.focus(); + terminal.focus(); } else if (this._terminalConfigurationService.config.middleClickBehavior === 'paste') { - const terminal = this._terminalEditorService.activeInstance; - terminal?.paste(); + terminal.paste(); } } else if (event.which === 3) { const rightClickBehavior = this._terminalConfigurationService.config.rightClickBehavior; @@ -146,11 +145,6 @@ export class TerminalEditor extends EditorPane { return; } else if (rightClickBehavior === 'copyPaste' || rightClickBehavior === 'paste') { - const terminal = this._terminalEditorService.activeInstance; - if (!terminal) { - return; - } - // copyPaste: Shift+right click should open context menu if (rightClickBehavior === 'copyPaste' && event.shiftKey) { openContextMenu(this.window, event, this._editorInput?.terminalInstance, this._instanceMenu, this._contextMenuService); From dc4e8af04b092e85bcc06c452c5d535af5427686 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 2 Apr 2024 06:58:17 -0700 Subject: [PATCH 4/5] Use switch, allow Linux to paste regular clipboard too --- .../contrib/terminal/browser/terminalEditor.ts | 16 ++++++++++------ .../terminal/browser/terminalTabbedView.ts | 16 ++++++++++------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts index 1fafecbda9f..f30e31840a0 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts @@ -129,12 +129,16 @@ export class TerminalEditor extends EditorPane { } if (event.which === 2) { - if (isLinux) { - // Drop selection and focus terminal on Linux to enable middle button paste when click - // occurs on the selection itself. - terminal.focus(); - } else if (this._terminalConfigurationService.config.middleClickBehavior === 'paste') { - terminal.paste(); + switch (this._terminalConfigurationService.config.middleClickBehavior) { + case 'paste': + terminal.paste(); + break; + case 'default': + default: + // Drop selection and focus terminal on Linux to enable middle button paste + // when click occurs on the selection itself. + terminal.focus(); + break; } } else if (event.which === 3) { const rightClickBehavior = this._terminalConfigurationService.config.rightClickBehavior; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts b/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts index 27d75b99327..1b6de61c313 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts @@ -340,12 +340,16 @@ export class TerminalTabbedView extends Disposable { } if (event.which === 2) { - if (isLinux) { - // Drop selection and focus terminal on Linux to enable middle button paste when click - // occurs on the selection itself. - terminal.focus(); - } else if (this._terminalConfigurationService.config.middleClickBehavior === 'paste') { - terminal.paste(); + switch (this._terminalConfigurationService.config.middleClickBehavior) { + case 'paste': + terminal.paste(); + break; + case 'default': + default: + // Drop selection and focus terminal on Linux to enable middle button paste + // when click occurs on the selection itself. + terminal.focus(); + break; } } else if (event.which === 3) { const rightClickBehavior = this._terminalConfigurationService.config.rightClickBehavior; From bf235f662c762272463437a1e0a9482a943621e3 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 2 Apr 2024 07:00:16 -0700 Subject: [PATCH 5/5] Improve setting description --- src/vs/workbench/contrib/terminal/browser/terminalEditor.ts | 2 +- src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts | 2 +- .../workbench/contrib/terminal/common/terminalConfiguration.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts index f30e31840a0..d2a36a289b3 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts @@ -23,7 +23,7 @@ import { TerminalEditorInput } from 'vs/workbench/contrib/terminal/browser/termi import { getTerminalActionBarArgs } from 'vs/workbench/contrib/terminal/browser/terminalMenus'; import { ITerminalProfileResolverService, ITerminalProfileService, TerminalCommandId } from 'vs/workbench/contrib/terminal/common/terminal'; import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; -import { isLinux, isMacintosh } from 'vs/base/common/platform'; +import { isMacintosh } from 'vs/base/common/platform'; import { BrowserFeatures } from 'vs/base/browser/canIUse'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { openContextMenu } from 'vs/workbench/contrib/terminal/browser/terminalContextMenu'; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts b/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts index 1b6de61c313..a93fccec1b5 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts @@ -9,7 +9,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITerminalConfigurationService, ITerminalGroupService, ITerminalInstance, ITerminalService, TerminalConnectionState } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalTabsListSizes, TerminalTabList } from 'vs/workbench/contrib/terminal/browser/terminalTabsList'; -import { isLinux, isMacintosh } from 'vs/base/common/platform'; +import { isMacintosh } from 'vs/base/common/platform'; import * as dom from 'vs/base/browser/dom'; import { BrowserFeatures } from 'vs/base/browser/canIUse'; import { INotificationService } from 'vs/platform/notification/common/notification'; diff --git a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts index 094bb19591d..630cc865a1a 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts @@ -338,7 +338,7 @@ const terminalConfiguration: IConfigurationNode = { type: 'string', enum: ['default', 'paste'], enumDescriptions: [ - localize('terminal.integrated.middleClickBehavior.default', "Platform default"), + localize('terminal.integrated.middleClickBehavior.default', "The platform default to focus the terminal. On Linux this will also paste the selection."), localize('terminal.integrated.middleClickBehavior.paste', "Paste on middle click."), ], default: 'default',