From df4ff4e4492712a3b8a8fef07c035a8f23f9f980 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 6 Jun 2020 17:03:16 -0700 Subject: [PATCH 1/3] Simplify open in terminal context menu registration Part of #99542 --- .../browser/externalTerminal.contribution.ts | 39 ++++++------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts b/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts index 5cdfe7aba3d5f..84d75072a2c9e 100644 --- a/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts +++ b/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts @@ -8,7 +8,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import * as paths from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; import { IExternalTerminalConfiguration, IExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; -import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; +import { MenuId, MenuRegistry, IMenuItem } from 'vs/platform/actions/common/actions'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED } from 'vs/workbench/contrib/terminal/common/terminal'; import { ITerminalService as IIntegratedTerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; @@ -27,7 +27,7 @@ import { optional } from 'vs/platform/instantiation/common/instantiation'; import { IExplorerService } from 'vs/workbench/contrib/files/common/files'; import { isWeb } from 'vs/base/common/platform'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; - +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; const OPEN_IN_TERMINAL_COMMAND_ID = 'openInTerminal'; CommandsRegistry.registerCommand({ @@ -120,31 +120,14 @@ if (!isWeb) { }); } -const openConsoleCommand = { - id: OPEN_IN_TERMINAL_COMMAND_ID, - title: nls.localize('scopedConsoleAction', "Open in Terminal") -}; -MenuRegistry.appendMenuItem(MenuId.OpenEditorsContext, { - group: 'navigation', - order: 30, - command: openConsoleCommand, - when: ResourceContextKey.Scheme.isEqualTo(Schemas.file) -}); -MenuRegistry.appendMenuItem(MenuId.OpenEditorsContext, { - group: 'navigation', - order: 30, - command: openConsoleCommand, - when: ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote) -}); -MenuRegistry.appendMenuItem(MenuId.ExplorerContext, { +const menuItem: IMenuItem = { group: 'navigation', order: 30, - command: openConsoleCommand, - when: ResourceContextKey.Scheme.isEqualTo(Schemas.file) -}); -MenuRegistry.appendMenuItem(MenuId.ExplorerContext, { - group: 'navigation', - order: 30, - command: openConsoleCommand, - when: ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote) -}); + command: { + id: OPEN_IN_TERMINAL_COMMAND_ID, + title: nls.localize('scopedConsoleAction', "Open in Terminal") + }, + when: ContextKeyExpr.or(ResourceContextKey.Scheme.isEqualTo(Schemas.file), ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote)) +}; +MenuRegistry.appendMenuItem(MenuId.OpenEditorsContext, menuItem); +MenuRegistry.appendMenuItem(MenuId.ExplorerContext, menuItem); From e5c327d8aacb27dd44e24254ee65061466002a48 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 6 Jun 2020 17:39:53 -0700 Subject: [PATCH 2/3] Split out non web parts into node/externalTerminal.contribution --- .../browser/externalTerminal.contribution.ts | 42 ------- .../node/externalTerminal.contribution.ts | 107 ++++++++++++++++++ .../externalTerminal/node/externalTerminal.ts | 6 + .../node/externalTerminalService.test.ts | 3 +- .../node/externalTerminalService.ts | 57 +--------- src/vs/workbench/workbench.desktop.main.ts | 4 +- 6 files changed, 118 insertions(+), 101 deletions(-) create mode 100644 src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts create mode 100644 src/vs/workbench/contrib/externalTerminal/node/externalTerminal.ts diff --git a/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts b/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts index 84d75072a2c9e..96a2aca47382f 100644 --- a/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts +++ b/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts @@ -9,12 +9,8 @@ import * as paths from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; import { IExternalTerminalConfiguration, IExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; import { MenuId, MenuRegistry, IMenuItem } from 'vs/platform/actions/common/actions'; -import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; -import { KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED } from 'vs/workbench/contrib/terminal/common/terminal'; import { ITerminalService as IIntegratedTerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { ResourceContextKey } from 'vs/workbench/common/resources'; -import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IFileService } from 'vs/platform/files/common/files'; import { IListService } from 'vs/platform/list/browser/listService'; import { getMultiSelectedResources } from 'vs/workbench/contrib/files/browser/files'; @@ -25,8 +21,6 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { optional } from 'vs/platform/instantiation/common/instantiation'; import { IExplorerService } from 'vs/workbench/contrib/files/common/files'; -import { isWeb } from 'vs/base/common/platform'; -import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; const OPEN_IN_TERMINAL_COMMAND_ID = 'openInTerminal'; @@ -84,42 +78,6 @@ CommandsRegistry.registerCommand({ } }); -if (!isWeb) { - const OPEN_NATIVE_CONSOLE_COMMAND_ID = 'workbench.action.terminal.openNativeConsole'; - KeybindingsRegistry.registerCommandAndKeybindingRule({ - id: OPEN_NATIVE_CONSOLE_COMMAND_ID, - primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_C, - when: KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED, - weight: KeybindingWeight.WorkbenchContrib, - handler: async (accessor) => { - const historyService = accessor.get(IHistoryService); - // Open external terminal in local workspaces - const terminalService = accessor.get(IExternalTerminalService); - const root = historyService.getLastActiveWorkspaceRoot(Schemas.file); - if (root) { - terminalService.openTerminal(root.fsPath); - } else { - // Opens current file's folder, if no folder is open in editor - const activeFile = historyService.getLastActiveFile(Schemas.file); - if (activeFile) { - terminalService.openTerminal(paths.dirname(activeFile.fsPath)); - } else { - const pathService = accessor.get(IPathService); - const userHome = await pathService.userHome; - terminalService.openTerminal(userHome.fsPath); - } - } - } - }); - - MenuRegistry.appendMenuItem(MenuId.CommandPalette, { - command: { - id: OPEN_NATIVE_CONSOLE_COMMAND_ID, - title: { value: nls.localize('globalConsoleAction', "Open New External Terminal"), original: 'Open New External Terminal' } - } - }); -} - const menuItem: IMenuItem = { group: 'navigation', order: 30, diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts new file mode 100644 index 0000000000000..cdca2aef15bf5 --- /dev/null +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts @@ -0,0 +1,107 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import * as paths from 'vs/base/common/path'; +import { IExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; +import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; +import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; +import { KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IHistoryService } from 'vs/workbench/services/history/common/history'; +import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { Schemas } from 'vs/base/common/network'; +import { IPathService } from 'vs/workbench/services/path/common/pathService'; +import { WindowsExternalTerminalService, MacExternalTerminalService, LinuxExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/node/externalTerminalService'; +import { IConfigurationRegistry, Extensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { isWindows, isMacintosh, isLinux } from 'vs/base/common/platform'; +import { DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/node/externalTerminal'; + +const OPEN_NATIVE_CONSOLE_COMMAND_ID = 'workbench.action.terminal.openNativeConsole'; +KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: OPEN_NATIVE_CONSOLE_COMMAND_ID, + primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_C, + when: KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED, + weight: KeybindingWeight.WorkbenchContrib, + handler: async (accessor) => { + const historyService = accessor.get(IHistoryService); + // Open external terminal in local workspaces + const terminalService = accessor.get(IExternalTerminalService); + const root = historyService.getLastActiveWorkspaceRoot(Schemas.file); + if (root) { + terminalService.openTerminal(root.fsPath); + } else { + // Opens current file's folder, if no folder is open in editor + const activeFile = historyService.getLastActiveFile(Schemas.file); + if (activeFile) { + terminalService.openTerminal(paths.dirname(activeFile.fsPath)); + } else { + const pathService = accessor.get(IPathService); + const userHome = await pathService.userHome; + terminalService.openTerminal(userHome.fsPath); + } + } + } +}); + +MenuRegistry.appendMenuItem(MenuId.CommandPalette, { + command: { + id: OPEN_NATIVE_CONSOLE_COMMAND_ID, + title: { value: nls.localize('globalConsoleAction', "Open New External Terminal"), original: 'Open New External Terminal' } + } +}); + + +if (isWindows) { + registerSingleton(IExternalTerminalService, WindowsExternalTerminalService, true); +} else if (isMacintosh) { + registerSingleton(IExternalTerminalService, MacExternalTerminalService, true); +} else if (isLinux) { + registerSingleton(IExternalTerminalService, LinuxExternalTerminalService, true); +} + +LinuxExternalTerminalService.getDefaultTerminalLinuxReady().then(defaultTerminalLinux => { + let configurationRegistry = Registry.as(Extensions.Configuration); + configurationRegistry.registerConfiguration({ + id: 'externalTerminal', + order: 100, + title: nls.localize('terminalConfigurationTitle', "External Terminal"), + type: 'object', + properties: { + 'terminal.explorerKind': { + type: 'string', + enum: [ + 'integrated', + 'external' + ], + enumDescriptions: [ + nls.localize('terminal.explorerKind.integrated', "Use VS Code's integrated terminal."), + nls.localize('terminal.explorerKind.external', "Use the configured external terminal.") + ], + description: nls.localize('explorer.openInTerminalKind', "Customizes what kind of terminal to launch."), + default: 'integrated' + }, + 'terminal.external.windowsExec': { + type: 'string', + description: nls.localize('terminal.external.windowsExec', "Customizes which terminal to run on Windows."), + default: WindowsExternalTerminalService.getDefaultTerminalWindows(), + scope: ConfigurationScope.APPLICATION + }, + 'terminal.external.osxExec': { + type: 'string', + description: nls.localize('terminal.external.osxExec', "Customizes which terminal application to run on macOS."), + default: DEFAULT_TERMINAL_OSX, + scope: ConfigurationScope.APPLICATION + }, + 'terminal.external.linuxExec': { + type: 'string', + description: nls.localize('terminal.external.linuxExec', "Customizes which terminal to run on Linux."), + default: defaultTerminalLinux, + scope: ConfigurationScope.APPLICATION + } + } + }); +}); diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.ts new file mode 100644 index 0000000000000..ff0fc24b7cfe1 --- /dev/null +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.ts @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export const DEFAULT_TERMINAL_OSX = 'Terminal.app'; diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.test.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.test.ts index 8217f144e926e..264e8a93275fe 100644 --- a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.test.ts +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.test.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { deepEqual, equal } from 'assert'; -import { WindowsExternalTerminalService, LinuxExternalTerminalService, MacExternalTerminalService, DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/node/externalTerminalService'; +import { WindowsExternalTerminalService, LinuxExternalTerminalService, MacExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/node/externalTerminalService'; +import { DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/node/externalTerminal'; suite('ExternalTerminalService', () => { let mockOnExit: Function; diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts index d8ba1abc30159..067cc377d6c32 100644 --- a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts @@ -13,14 +13,10 @@ import { assign } from 'vs/base/common/objects'; import { IExternalTerminalService, IExternalTerminalConfiguration, IExternalTerminalSettings } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { getPathFromAmdModule } from 'vs/base/common/amd'; -import { IConfigurationRegistry, Extensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { Registry } from 'vs/platform/registry/common/platform'; import { optional } from 'vs/platform/instantiation/common/instantiation'; - +import { DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/node/externalTerminal'; const TERMINAL_TITLE = nls.localize('console.title', "VS Code Console"); -export const DEFAULT_TERMINAL_OSX = 'Terminal.app'; export class WindowsExternalTerminalService implements IExternalTerminalService { public _serviceBrand: undefined; @@ -358,54 +354,3 @@ function quote(args: string[]): string { } return r; } - -if (env.isWindows) { - registerSingleton(IExternalTerminalService, WindowsExternalTerminalService, true); -} else if (env.isMacintosh) { - registerSingleton(IExternalTerminalService, MacExternalTerminalService, true); -} else if (env.isLinux) { - registerSingleton(IExternalTerminalService, LinuxExternalTerminalService, true); -} - -LinuxExternalTerminalService.getDefaultTerminalLinuxReady().then(defaultTerminalLinux => { - let configurationRegistry = Registry.as(Extensions.Configuration); - configurationRegistry.registerConfiguration({ - id: 'externalTerminal', - order: 100, - title: nls.localize('terminalConfigurationTitle', "External Terminal"), - type: 'object', - properties: { - 'terminal.explorerKind': { - type: 'string', - enum: [ - 'integrated', - 'external' - ], - enumDescriptions: [ - nls.localize('terminal.explorerKind.integrated', "Use VS Code's integrated terminal."), - nls.localize('terminal.explorerKind.external', "Use the configured external terminal.") - ], - description: nls.localize('explorer.openInTerminalKind', "Customizes what kind of terminal to launch."), - default: 'integrated' - }, - 'terminal.external.windowsExec': { - type: 'string', - description: nls.localize('terminal.external.windowsExec', "Customizes which terminal to run on Windows."), - default: WindowsExternalTerminalService.getDefaultTerminalWindows(), - scope: ConfigurationScope.APPLICATION - }, - 'terminal.external.osxExec': { - type: 'string', - description: nls.localize('terminal.external.osxExec', "Customizes which terminal application to run on macOS."), - default: DEFAULT_TERMINAL_OSX, - scope: ConfigurationScope.APPLICATION - }, - 'terminal.external.linuxExec': { - type: 'string', - description: nls.localize('terminal.external.linuxExec', "Customizes which terminal to run on Linux."), - default: defaultTerminalLinux, - scope: ConfigurationScope.APPLICATION - } - } - }); -}); diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index cb270d205c5ef..c31f06409fa92 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -109,8 +109,8 @@ import 'vs/workbench/contrib/remote/electron-browser/remote.contribution'; // CodeEditor Contributions import 'vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution'; -// Execution -import 'vs/workbench/contrib/externalTerminal/node/externalTerminalService'; +// External Terminal +import 'vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution'; // Performance import 'vs/workbench/contrib/performance/electron-browser/performance.contribution'; From 1ea26c5baa691dd87ea9ecece3b60deb8a180e8b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 6 Jun 2020 18:13:47 -0700 Subject: [PATCH 3/3] Set open in terminal menu dynamically Fixes #99542 --- .../browser/externalTerminal.contribution.ts | 77 +++++++++++++++---- .../node/externalTerminal.contribution.ts | 1 - 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts b/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts index 96a2aca47382f..3fd4c0fe013ed 100644 --- a/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts +++ b/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts @@ -5,7 +5,6 @@ import * as nls from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import * as paths from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; import { IExternalTerminalConfiguration, IExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; import { MenuId, MenuRegistry, IMenuItem } from 'vs/platform/actions/common/actions'; @@ -22,6 +21,12 @@ import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteA import { optional } from 'vs/platform/instantiation/common/instantiation'; import { IExplorerService } from 'vs/workbench/contrib/files/common/files'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { isWeb, isWindows } from 'vs/base/common/platform'; +import { dirname, basename } from 'vs/base/common/path'; +import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { Registry } from 'vs/platform/registry/common/platform'; const OPEN_IN_TERMINAL_COMMAND_ID = 'openInTerminal'; CommandsRegistry.registerCommand({ @@ -56,7 +61,7 @@ CommandsRegistry.registerCommand({ authority: resource.authority, fragment: resource.fragment, query: resource.query, - path: paths.dirname(resource.path) + path: dirname(resource.path) }); }).forEach(cwd => { if (opened[cwd.path]) { @@ -64,13 +69,13 @@ CommandsRegistry.registerCommand({ } opened[cwd.path] = true; const instance = integratedTerminalService.createTerminal({ cwd }); - if (instance && (resources.length === 1 || !resource || cwd.path === resource.path || cwd.path === paths.dirname(resource.path))) { + if (instance && (resources.length === 1 || !resource || cwd.path === resource.path || cwd.path === dirname(resource.path))) { integratedTerminalService.setActiveInstance(instance); integratedTerminalService.showPanel(true); } }); } else { - distinct(targets.map(({ stat }) => stat!.isDirectory ? stat!.resource.fsPath : paths.dirname(stat!.resource.fsPath))).forEach(cwd => { + distinct(targets.map(({ stat }) => stat!.isDirectory ? stat!.resource.fsPath : dirname(stat!.resource.fsPath))).forEach(cwd => { terminalService!.openTerminal(cwd); }); } @@ -78,14 +83,56 @@ CommandsRegistry.registerCommand({ } }); -const menuItem: IMenuItem = { - group: 'navigation', - order: 30, - command: { - id: OPEN_IN_TERMINAL_COMMAND_ID, - title: nls.localize('scopedConsoleAction', "Open in Terminal") - }, - when: ContextKeyExpr.or(ResourceContextKey.Scheme.isEqualTo(Schemas.file), ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote)) -}; -MenuRegistry.appendMenuItem(MenuId.OpenEditorsContext, menuItem); -MenuRegistry.appendMenuItem(MenuId.ExplorerContext, menuItem); +export class ExternalTerminalContribution extends Disposable implements IWorkbenchContribution { + private _openInTerminalMenuItem: IMenuItem; + + constructor( + @IConfigurationService private readonly _configurationService: IConfigurationService + ) { + super(); + + this._openInTerminalMenuItem = { + group: 'navigation', + order: 30, + command: { + id: OPEN_IN_TERMINAL_COMMAND_ID, + title: nls.localize('scopedConsoleAction', "Open in Terminal") + }, + when: ContextKeyExpr.or(ResourceContextKey.Scheme.isEqualTo(Schemas.file), ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote)) + }; + MenuRegistry.appendMenuItem(MenuId.OpenEditorsContext, this._openInTerminalMenuItem); + MenuRegistry.appendMenuItem(MenuId.ExplorerContext, this._openInTerminalMenuItem); + + this._configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('terminal.explorerKind') || e.affectsConfiguration('terminal.external')) { + this._refreshOpenInTerminalMenuItemTitle(); + } + }); + this._refreshOpenInTerminalMenuItemTitle(); + } + + private _refreshOpenInTerminalMenuItemTitle(): void { + if (isWeb) { + this._openInTerminalMenuItem.command.title = nls.localize('scopedConsoleAction.integrated', "Open in Integrated Terminal"); + return; + } + + const config = this._configurationService.getValue().terminal; + if (config.explorerKind === 'integrated') { + this._openInTerminalMenuItem.command.title = nls.localize('scopedConsoleAction.integrated', "Open in Integrated Terminal"); + return; + } + + if (isWindows && config.external.windowsExec) { + const file = basename(config.external.windowsExec); + if (file === 'wt' || file === 'wt.exe') { + this._openInTerminalMenuItem.command.title = nls.localize('scopedConsoleAction.wt', "Open in Windows Terminal"); + return; + } + } + + this._openInTerminalMenuItem.command.title = nls.localize('scopedConsoleAction.external', "Open in External Terminal"); + } +} + +Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(ExternalTerminalContribution, LifecyclePhase.Restored); diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts index cdca2aef15bf5..c4b310c504a90 100644 --- a/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts @@ -54,7 +54,6 @@ MenuRegistry.appendMenuItem(MenuId.CommandPalette, { } }); - if (isWindows) { registerSingleton(IExternalTerminalService, WindowsExternalTerminalService, true); } else if (isMacintosh) {