From b2434e3120b18df0f2a2b5ead47ae844d85400b7 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 07:51:23 -0700 Subject: [PATCH 01/19] Convert send sequence and new with cwd to Action2 Part of #93390 --- .../terminal/browser/terminal.contribution.ts | 52 ++-------------- .../terminal/browser/terminalActions.ts | 61 +++++++++++++++---- 2 files changed, 53 insertions(+), 60 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 0c101e2a431..e40bdf1641b 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -19,7 +19,7 @@ import * as panel from 'vs/workbench/browser/panel'; import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; -import { ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FindNext, FindPrevious, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleCaseSensitiveCommand, ToggleEscapeSequenceLoggingAction, ToggleRegexCommand, ToggleTerminalAction, ToggleWholeWordCommand, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, CreateNewWithCwdTerminalAction, RenameWithArgTerminalAction, SendSequenceTerminalAction, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FindNext, FindPrevious, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleCaseSensitiveCommand, ToggleEscapeSequenceLoggingAction, ToggleRegexCommand, ToggleTerminalAction, ToggleWholeWordCommand, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, CreateNewWithCwdTerminalAction2, RenameWithArgTerminalAction, terminalSendSequenceCommand, SendSequenceTerminalAction2 } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; import { KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, DEFAULT_LETTER_SPACING, DEFAULT_LINE_HEIGHT, TerminalCursorStyle, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; @@ -564,7 +564,7 @@ if (BrowserFeatures.clipboard.writeText) { function registerSendSequenceKeybinding(text: string, rule: { when?: ContextKeyExpression } & IKeybindings): void { KeybindingsRegistry.registerCommandAndKeybindingRule({ - id: SendSequenceTerminalAction.ID, + id: TERMINAL_COMMAND_ID.SEND_SEQUENCE, weight: KeybindingWeight.WorkbenchContrib, when: rule.when || KEYBINDING_CONTEXT_TERMINAL_FOCUS, primary: rule.primary, @@ -614,52 +614,8 @@ registerSendSequenceKeybinding(String.fromCharCode('A'.charCodeAt(0) - 64), { registerSendSequenceKeybinding(String.fromCharCode('E'.charCodeAt(0) - 64), { mac: { primary: KeyMod.CtrlCmd | KeyCode.RightArrow } }); - -registerAction2(class extends SendSequenceTerminalAction { - constructor() { - super({ - id: SendSequenceTerminalAction.ID, - title: SendSequenceTerminalAction.LABEL, - description: { - description: SendSequenceTerminalAction.LABEL, - args: [{ - name: 'args', - schema: { - type: 'object', - required: ['text'], - properties: { - text: { type: 'string' } - }, - } - }] - } - }); - } -}); -registerAction2(class extends CreateNewWithCwdTerminalAction { - constructor() { - super({ - id: CreateNewWithCwdTerminalAction.ID, - title: CreateNewWithCwdTerminalAction.LABEL, - description: { - description: CreateNewWithCwdTerminalAction.LABEL, - args: [{ - name: 'args', - schema: { - type: 'object', - required: ['cwd'], - properties: { - cwd: { - description: CreateNewWithCwdTerminalAction.CWD_ARG_LABEL, - type: 'string' - } - }, - } - }] - } - }); - } -}); +registerAction2(SendSequenceTerminalAction2); +registerAction2(CreateNewWithCwdTerminalAction2); registerAction2(class extends RenameWithArgTerminalAction { constructor() { super({ diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 8dbec9aae38..d06e688b957 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -165,19 +165,36 @@ export class SelectAllTerminalAction extends Action { } } +export class SendSequenceTerminalAction2 extends Action2 { + constructor() { + const title = nls.localize('workbench.action.terminal.sendSequence', "Send Custom Sequence To Terminal"); + super({ + id: TERMINAL_COMMAND_ID.SEND_SEQUENCE, + title, + description: { + description: title, + args: [{ + name: 'args', + schema: { + type: 'object', + required: ['text'], + properties: { + text: { type: 'string' } + }, + } + }] + } + }); + } -export class SendSequenceTerminalAction extends Action2 { - public static readonly ID = TERMINAL_COMMAND_ID.SEND_SEQUENCE; - public static readonly LABEL = nls.localize('workbench.action.terminal.sendSequence', "Send Custom Sequence To Terminal"); - - public run(accessor: ServicesAccessor, args: any): void { + run(accessor: ServicesAccessor, args: { text?: string } | undefined) { terminalSendSequenceCommand(accessor, args); } } -export const terminalSendSequenceCommand = (accessor: ServicesAccessor, args: any) => { +export const terminalSendSequenceCommand = (accessor: ServicesAccessor, args: { text?: string } | undefined) => { const terminalInstance = accessor.get(ITerminalService).getActiveInstance(); - if (!terminalInstance) { + if (!terminalInstance || !args?.text) { return; } @@ -190,12 +207,32 @@ export const terminalSendSequenceCommand = (accessor: ServicesAccessor, args: an terminalInstance.sendText(resolvedText, false); }; -export class CreateNewWithCwdTerminalAction extends Action2 { - public static readonly ID = TERMINAL_COMMAND_ID.NEW_WITH_CWD; - public static readonly LABEL = nls.localize('workbench.action.terminal.newWithCwd', "Create New Integrated Terminal Starting in a Custom Working Directory"); - public static readonly CWD_ARG_LABEL = nls.localize('workbench.action.terminal.newWithCwd.cwd', "The directory to start the terminal at"); +export class CreateNewWithCwdTerminalAction2 extends Action2 { + constructor() { + const title = nls.localize('workbench.action.terminal.newWithCwd', "Create New Integrated Terminal Starting in a Custom Working Directory"); + super({ + id: TERMINAL_COMMAND_ID.NEW_WITH_CWD, + title, + description: { + description: title, + args: [{ + name: 'args', + schema: { + type: 'object', + required: ['cwd'], + properties: { + cwd: { + description: nls.localize('workbench.action.terminal.newWithCwd.cwd', "The directory to start the terminal at"), + type: 'string' + } + }, + } + }] + } + }); + } - public run(accessor: ServicesAccessor, args: { cwd: string } | undefined): Promise { + public run(accessor: ServicesAccessor, args: { cwd?: string } | undefined): Promise { const terminalService = accessor.get(ITerminalService); const instance = terminalService.createTerminal({ cwd: args?.cwd }); if (!instance) { From cd09afee2b65c4d5ea1f842e4b3e0510c7e5568f Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 07:57:58 -0700 Subject: [PATCH 02/19] Move terminal configuration into new common file --- .../terminal/browser/terminal.contribution.ts | 333 +----------------- .../terminal/browser/terminalActions.ts | 29 +- .../terminal/browser/terminalInstance.ts | 121 +------ .../contrib/terminal/common/terminal.ts | 119 +++++++ .../terminal/common/terminalConfiguration.ts | 305 ++++++++++++++++ 5 files changed, 458 insertions(+), 449 deletions(-) create mode 100644 src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index e40bdf1641b..c78410c58ab 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -19,15 +19,13 @@ import * as panel from 'vs/workbench/browser/panel'; import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; -import { ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FindNext, FindPrevious, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleCaseSensitiveCommand, ToggleEscapeSequenceLoggingAction, ToggleRegexCommand, ToggleTerminalAction, ToggleWholeWordCommand, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, CreateNewWithCwdTerminalAction2, RenameWithArgTerminalAction, terminalSendSequenceCommand, SendSequenceTerminalAction2 } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FindNext, FindPrevious, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleCaseSensitiveCommand, ToggleEscapeSequenceLoggingAction, ToggleRegexCommand, ToggleTerminalAction, ToggleWholeWordCommand, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, CreateNewWithCwdTerminalAction2, RenameWithArgTerminalAction2, terminalSendSequenceCommand, SendSequenceTerminalAction2 } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; -import { KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, DEFAULT_LETTER_SPACING, DEFAULT_LINE_HEIGHT, TerminalCursorStyle, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; +import { KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { setupTerminalCommands } from 'vs/workbench/contrib/terminal/browser/terminalCommands'; import { setupTerminalMenu } from 'vs/workbench/contrib/terminal/common/terminalMenu'; import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; -import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; -import { DEFAULT_COMMANDS_TO_SKIP_SHELL } from 'vs/workbench/contrib/terminal/browser/terminalInstance'; import { TerminalService } from 'vs/workbench/contrib/terminal/browser/terminalService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { registerShellConfiguration } from 'vs/workbench/contrib/terminal/common/terminalShellConfig'; @@ -38,6 +36,7 @@ import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { IQuickAccessRegistry, Extensions as QuickAccessExtensions } from 'vs/platform/quickinput/common/quickAccess'; import { TerminalQuickAccessProvider } from 'vs/workbench/contrib/terminal/browser/terminalsQuickAccess'; +import { terminalConfiguration } from 'vs/workbench/contrib/terminal/common/terminalConfiguration'; registerSingleton(ITerminalService, TerminalService, true); @@ -66,300 +65,7 @@ CommandsRegistry.registerCommand( const configurationRegistry = Registry.as(Extensions.Configuration); -configurationRegistry.registerConfiguration({ - id: 'terminal', - order: 100, - title: nls.localize('terminalIntegratedConfigurationTitle', "Integrated Terminal"), - type: 'object', - properties: { - 'terminal.integrated.automationShell.linux': { - markdownDescription: nls.localize('terminal.integrated.automationShell.linux', "A path that when set will override {0} and ignore {1} values for automation-related terminal usage like tasks and debug.", '`terminal.integrated.shell.linux`', '`shellArgs`'), - type: ['string', 'null'], - default: null - }, - 'terminal.integrated.automationShell.osx': { - markdownDescription: nls.localize('terminal.integrated.automationShell.osx', "A path that when set will override {0} and ignore {1} values for automation-related terminal usage like tasks and debug.", '`terminal.integrated.shell.osx`', '`shellArgs`'), - type: ['string', 'null'], - default: null - }, - 'terminal.integrated.automationShell.windows': { - markdownDescription: nls.localize('terminal.integrated.automationShell.windows', "A path that when set will override {0} and ignore {1} values for automation-related terminal usage like tasks and debug.", '`terminal.integrated.shell.windows`', '`shellArgs`'), - type: ['string', 'null'], - default: null - }, - 'terminal.integrated.shellArgs.linux': { - markdownDescription: nls.localize('terminal.integrated.shellArgs.linux', "The command line arguments to use when on the Linux terminal. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)."), - type: 'array', - items: { - type: 'string' - }, - default: [] - }, - 'terminal.integrated.shellArgs.osx': { - markdownDescription: nls.localize('terminal.integrated.shellArgs.osx', "The command line arguments to use when on the macOS terminal. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)."), - type: 'array', - items: { - type: 'string' - }, - // Unlike on Linux, ~/.profile is not sourced when logging into a macOS session. This - // is the reason terminals on macOS typically run login shells by default which set up - // the environment. See http://unix.stackexchange.com/a/119675/115410 - default: ['-l'] - }, - 'terminal.integrated.shellArgs.windows': { - markdownDescription: nls.localize('terminal.integrated.shellArgs.windows', "The command line arguments to use when on the Windows terminal. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)."), - 'anyOf': [ - { - type: 'array', - items: { - type: 'string', - markdownDescription: nls.localize('terminal.integrated.shellArgs.windows', "The command line arguments to use when on the Windows terminal. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).") - }, - }, - { - type: 'string', - markdownDescription: nls.localize('terminal.integrated.shellArgs.windows.string', "The command line arguments in [command-line format](https://msdn.microsoft.com/en-au/08dfcab2-eb6e-49a4-80eb-87d4076c98c6) to use when on the Windows terminal. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).") - } - ], - default: [] - }, - 'terminal.integrated.macOptionIsMeta': { - description: nls.localize('terminal.integrated.macOptionIsMeta', "Controls whether to treat the option key as the meta key in the terminal on macOS."), - type: 'boolean', - default: false - }, - 'terminal.integrated.macOptionClickForcesSelection': { - description: nls.localize('terminal.integrated.macOptionClickForcesSelection', "Controls whether to force selection when using Option+click on macOS. This will force a regular (line) selection and disallow the use of column selection mode. This enables copying and pasting using the regular terminal selection, for example, when mouse mode is enabled in tmux."), - type: 'boolean', - default: false - }, - 'terminal.integrated.copyOnSelection': { - description: nls.localize('terminal.integrated.copyOnSelection', "Controls whether text selected in the terminal will be copied to the clipboard."), - type: 'boolean', - default: false - }, - 'terminal.integrated.drawBoldTextInBrightColors': { - description: nls.localize('terminal.integrated.drawBoldTextInBrightColors', "Controls whether bold text in the terminal will always use the \"bright\" ANSI color variant."), - type: 'boolean', - default: true - }, - 'terminal.integrated.fontFamily': { - markdownDescription: nls.localize('terminal.integrated.fontFamily', "Controls the font family of the terminal, this defaults to `#editor.fontFamily#`'s value."), - type: 'string' - }, - // TODO: Support font ligatures - // 'terminal.integrated.fontLigatures': { - // 'description': nls.localize('terminal.integrated.fontLigatures', "Controls whether font ligatures are enabled in the terminal."), - // 'type': 'boolean', - // 'default': false - // }, - 'terminal.integrated.fontSize': { - description: nls.localize('terminal.integrated.fontSize', "Controls the font size in pixels of the terminal."), - type: 'number', - default: EDITOR_FONT_DEFAULTS.fontSize - }, - 'terminal.integrated.letterSpacing': { - description: nls.localize('terminal.integrated.letterSpacing', "Controls the letter spacing of the terminal, this is an integer value which represents the amount of additional pixels to add between characters."), - type: 'number', - default: DEFAULT_LETTER_SPACING - }, - 'terminal.integrated.lineHeight': { - description: nls.localize('terminal.integrated.lineHeight', "Controls the line height of the terminal, this number is multiplied by the terminal font size to get the actual line-height in pixels."), - type: 'number', - default: DEFAULT_LINE_HEIGHT - }, - 'terminal.integrated.minimumContrastRatio': { - markdownDescription: nls.localize('terminal.integrated.minimumContrastRatio', "When set the foreground color of each cell will change to try meet the contrast ratio specified. Example values:\n\n- 1: The default, do nothing.\n- 4.5: [WCAG AA compliance (minimum)](https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html).\n- 7: [WCAG AAA compliance (enhanced)](https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast7.html).\n- 21: White on black or black on white."), - type: 'number', - default: 1 - }, - 'terminal.integrated.fastScrollSensitivity': { - markdownDescription: nls.localize('terminal.integrated.fastScrollSensitivity', "Scrolling speed multiplier when pressing `Alt`."), - type: 'number', - default: 5 - }, - 'terminal.integrated.mouseWheelScrollSensitivity': { - markdownDescription: nls.localize('terminal.integrated.mouseWheelScrollSensitivity', "A multiplier to be used on the `deltaY` of mouse wheel scroll events."), - type: 'number', - default: 1 - }, - 'terminal.integrated.fontWeight': { - type: 'string', - enum: ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'], - description: nls.localize('terminal.integrated.fontWeight', "The font weight to use within the terminal for non-bold text."), - default: 'normal' - }, - 'terminal.integrated.fontWeightBold': { - type: 'string', - enum: ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'], - description: nls.localize('terminal.integrated.fontWeightBold', "The font weight to use within the terminal for bold text."), - default: 'bold' - }, - 'terminal.integrated.cursorBlinking': { - description: nls.localize('terminal.integrated.cursorBlinking', "Controls whether the terminal cursor blinks."), - type: 'boolean', - default: false - }, - 'terminal.integrated.cursorStyle': { - description: nls.localize('terminal.integrated.cursorStyle', "Controls the style of terminal cursor."), - enum: [TerminalCursorStyle.BLOCK, TerminalCursorStyle.LINE, TerminalCursorStyle.UNDERLINE], - default: TerminalCursorStyle.BLOCK - }, - 'terminal.integrated.cursorWidth': { - markdownDescription: nls.localize('terminal.integrated.cursorWidth', "Controls the width of the cursor when `#terminal.integrated.cursorStyle#` is set to `line`."), - type: 'number', - default: 1 - }, - 'terminal.integrated.scrollback': { - description: nls.localize('terminal.integrated.scrollback', "Controls the maximum amount of lines the terminal keeps in its buffer."), - type: 'number', - default: 1000 - }, - 'terminal.integrated.detectLocale': { - markdownDescription: nls.localize('terminal.integrated.detectLocale', "Controls whether to detect and set the `$LANG` environment variable to a UTF-8 compliant option since VS Code's terminal only supports UTF-8 encoded data coming from the shell."), - type: 'string', - enum: ['auto', 'off', 'on'], - markdownEnumDescriptions: [ - nls.localize('terminal.integrated.detectLocale.auto', "Set the `$LANG` environment variable if the existing variable does not exist or it does not end in `'.UTF-8'`."), - nls.localize('terminal.integrated.detectLocale.off', "Do not set the `$LANG` environment variable."), - nls.localize('terminal.integrated.detectLocale.on', "Always set the `$LANG` environment variable.") - ], - default: 'auto' - }, - 'terminal.integrated.rendererType': { - type: 'string', - enum: ['auto', 'canvas', 'dom', 'experimentalWebgl'], - markdownEnumDescriptions: [ - nls.localize('terminal.integrated.rendererType.auto', "Let VS Code guess which renderer to use."), - nls.localize('terminal.integrated.rendererType.canvas', "Use the standard GPU/canvas-based renderer."), - nls.localize('terminal.integrated.rendererType.dom', "Use the fallback DOM-based renderer."), - nls.localize('terminal.integrated.rendererType.experimentalWebgl', "Use the experimental webgl-based renderer. Note that this has some [known issues](https://github.com/xtermjs/xterm.js/issues?q=is%3Aopen+is%3Aissue+label%3Aarea%2Faddon%2Fwebgl) and this will only be enabled for new terminals (not hot swappable like the other renderers).") - ], - default: 'auto', - description: nls.localize('terminal.integrated.rendererType', "Controls how the terminal is rendered.") - }, - 'terminal.integrated.rightClickBehavior': { - type: 'string', - enum: ['default', 'copyPaste', 'paste', 'selectWord'], - enumDescriptions: [ - nls.localize('terminal.integrated.rightClickBehavior.default', "Show the context menu."), - nls.localize('terminal.integrated.rightClickBehavior.copyPaste', "Copy when there is a selection, otherwise paste."), - nls.localize('terminal.integrated.rightClickBehavior.paste', "Paste on right click."), - nls.localize('terminal.integrated.rightClickBehavior.selectWord', "Select the word under the cursor and show the context menu.") - ], - default: platform.isMacintosh ? 'selectWord' : platform.isWindows ? 'copyPaste' : 'default', - description: nls.localize('terminal.integrated.rightClickBehavior', "Controls how terminal reacts to right click.") - }, - 'terminal.integrated.cwd': { - description: nls.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."), - type: 'string', - default: undefined - }, - 'terminal.integrated.confirmOnExit': { - description: nls.localize('terminal.integrated.confirmOnExit', "Controls whether to confirm on exit if there are active terminal sessions."), - type: 'boolean', - default: false - }, - 'terminal.integrated.enableBell': { - description: nls.localize('terminal.integrated.enableBell', "Controls whether the terminal bell is enabled."), - type: 'boolean', - default: false - }, - 'terminal.integrated.commandsToSkipShell': { - markdownDescription: nls.localize('terminal.integrated.commandsToSkipShell', "A set of command IDs whose keybindings will not be sent to the shell and instead always be handled by Code. This allows the use of keybindings that would normally be consumed by the shell to act the same as when the terminal is not focused, for example ctrl+p to launch Quick Open.\nDefault Skipped Commands:\n\n{0}", DEFAULT_COMMANDS_TO_SKIP_SHELL.sort().map(command => `- ${command}`).join('\n')), - type: 'array', - items: { - type: 'string' - }, - default: [] - }, - 'terminal.integrated.allowChords': { - markdownDescription: nls.localize('terminal.integrated.allowChords', "Whether or not to allow chord keybindings in the terminal. Note that when this is true and the keystroke results in a chord it will bypass `#terminal.integrated.commandsToSkipShell#`, setting this to false is particularly useful when you want ctrl+k to go to your shell (not VS Code)."), - type: 'boolean', - default: true - }, - 'terminal.integrated.allowMnemonics': { - markdownDescription: nls.localize('terminal.integrated.allowMnemonics', "Whether to allow menubar mnemonics (eg. alt+f) to trigger the open the menubar. Note that this will cause all alt keystrokes will skip the shell when true. This does nothing on macOS."), - type: 'boolean', - default: false - }, - 'terminal.integrated.inheritEnv': { - markdownDescription: nls.localize('terminal.integrated.inheritEnv', "Whether new shells should inherit their environment from VS Code. This is not supported on Windows."), - type: 'boolean', - default: true - }, - 'terminal.integrated.env.osx': { - markdownDescription: nls.localize('terminal.integrated.env.osx', "Object with environment variables that will be added to the VS Code process to be used by the terminal on macOS. Set to `null` to delete the environment variable."), - type: 'object', - additionalProperties: { - type: ['string', 'null'] - }, - default: {} - }, - 'terminal.integrated.env.linux': { - markdownDescription: nls.localize('terminal.integrated.env.linux', "Object with environment variables that will be added to the VS Code process to be used by the terminal on Linux. Set to `null` to delete the environment variable."), - type: 'object', - additionalProperties: { - type: ['string', 'null'] - }, - default: {} - }, - 'terminal.integrated.env.windows': { - markdownDescription: nls.localize('terminal.integrated.env.windows', "Object with environment variables that will be added to the VS Code process to be used by the terminal on Windows. Set to `null` to delete the environment variable."), - type: 'object', - additionalProperties: { - type: ['string', 'null'] - }, - default: {} - }, - 'terminal.integrated.showExitAlert': { - description: nls.localize('terminal.integrated.showExitAlert', "Controls whether to show the alert \"The terminal process terminated with exit code\" when exit code is non-zero."), - type: 'boolean', - default: true - }, - 'terminal.integrated.splitCwd': { - description: nls.localize('terminal.integrated.splitCwd', "Controls the working directory a split terminal starts with."), - type: 'string', - enum: ['workspaceRoot', 'initial', 'inherited'], - enumDescriptions: [ - nls.localize('terminal.integrated.splitCwd.workspaceRoot', "A new split terminal will use the workspace root as the working directory. In a multi-root workspace a choice for which root folder to use is offered."), - nls.localize('terminal.integrated.splitCwd.initial', "A new split terminal will use the working directory that the parent terminal started with."), - nls.localize('terminal.integrated.splitCwd.inherited', "On macOS and Linux, a new split terminal will use the working directory of the parent terminal. On Windows, this behaves the same as initial."), - ], - default: 'inherited' - }, - 'terminal.integrated.windowsEnableConpty': { - description: nls.localize('terminal.integrated.windowsEnableConpty', "Whether to use ConPTY for Windows terminal process communication (requires Windows 10 build number 18309+). Winpty will be used if this is false."), - type: 'boolean', - default: true - }, - 'terminal.integrated.wordSeparators': { - description: nls.localize('terminal.integrated.wordSeparators', "A string containing all characters to be considered word separators by the double click to select word feature."), - type: 'string', - default: ' ()[]{}\',"`' - }, - 'terminal.integrated.experimentalUseTitleEvent': { - description: nls.localize('terminal.integrated.experimentalUseTitleEvent', "An experimental setting that will use the terminal title event for the dropdown title. This setting will only apply to new terminals."), - type: 'boolean', - default: false - }, - 'terminal.integrated.enableFileLinks': { - description: nls.localize('terminal.integrated.enableFileLinks', "Whether to enable file links in the terminal. Links can be slow when working on a network drive in particular because each file link is verified against the file system."), - type: 'boolean', - default: true - }, - 'terminal.integrated.unicodeVersion': { - type: 'string', - enum: ['6', '11'], - enumDescriptions: [ - nls.localize('terminal.integrated.unicodeVersion.six', "Version 6 of unicode, this is an older version which should work better on older systems."), - nls.localize('terminal.integrated.unicodeVersion.eleven', "Version 11 of unicode, this version provides better support on modern systems that use modern versions of unicode.") - ], - default: '11', - description: nls.localize('terminal.integrated.unicodeVersion', "Controls what version of unicode to use when evaluating the width of characters in the terminal. If you experience emoji or other wide characters not taking up the right amount of space or backspace either deleting too much or too little then you may want to try tweaking this setting.") - } - } -}); +configurationRegistry.registerConfiguration(terminalConfiguration); const registry = Registry.as(ActionExtensions.WorkbenchActions); registry.registerWorkbenchAction(SyncActionDescriptor.create(QuickAccessTerminalAction, QuickAccessTerminalAction.ID, QuickAccessTerminalAction.LABEL), 'Terminal: Switch Active Terminal', nls.localize('terminal', "Terminal")); @@ -553,6 +259,10 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(FindPrevious, mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G, secondary: [KeyMod.Shift | KeyCode.F3, KeyCode.Enter] }, }, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), 'Terminal: Find previous', category); +registerAction2(SendSequenceTerminalAction2); +registerAction2(CreateNewWithCwdTerminalAction2); +registerAction2(RenameWithArgTerminalAction2); + // Commands might be affected by Web restrictons if (BrowserFeatures.clipboard.writeText) { actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(CopyTerminalSelectionAction, CopyTerminalSelectionAction.ID, CopyTerminalSelectionAction.LABEL, { @@ -614,33 +324,6 @@ registerSendSequenceKeybinding(String.fromCharCode('A'.charCodeAt(0) - 64), { registerSendSequenceKeybinding(String.fromCharCode('E'.charCodeAt(0) - 64), { mac: { primary: KeyMod.CtrlCmd | KeyCode.RightArrow } }); -registerAction2(SendSequenceTerminalAction2); -registerAction2(CreateNewWithCwdTerminalAction2); -registerAction2(class extends RenameWithArgTerminalAction { - constructor() { - super({ - id: RenameWithArgTerminalAction.ID, - title: RenameWithArgTerminalAction.LABEL, - description: { - description: RenameWithArgTerminalAction.LABEL, - args: [{ - name: 'args', - schema: { - type: 'object', - required: ['name'], - properties: { - name: { - description: RenameWithArgTerminalAction.NAME_ARG_LABEL, - type: 'string', - minLength: 1 - } - } - } - }] - } - }); - } -}); setupTerminalCommands(); setupTerminalMenu(); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index d06e688b957..1ebf999c807 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -988,10 +988,31 @@ export class RenameTerminalAction extends Action { } } } -export class RenameWithArgTerminalAction extends Action2 { - public static readonly ID = TERMINAL_COMMAND_ID.RENAME_WITH_ARG; - public static readonly LABEL = nls.localize('workbench.action.terminal.renameWithArg', "Rename the Currently Active Terminal"); - public static readonly NAME_ARG_LABEL = nls.localize('workbench.action.terminal.renameWithArg.name', "The new name for the terminal"); +export class RenameWithArgTerminalAction2 extends Action2 { + constructor() { + const title = nls.localize('workbench.action.terminal.renameWithArg', "Rename the Currently Active Terminal"); + super({ + id: TERMINAL_COMMAND_ID.RENAME_WITH_ARG, + title, + description: { + description: title, + args: [{ + name: 'args', + schema: { + type: 'object', + required: ['name'], + properties: { + name: { + description: nls.localize('workbench.action.terminal.renameWithArg.name', "The new name for the terminal"), + type: 'string', + minLength: 1 + } + } + } + }] + } + }); + } public run( accessor: ServicesAccessor, diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 3c191048690..8f22139ccb7 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -25,7 +25,7 @@ import { activeContrastBorder, scrollbarSliderActiveBackground, scrollbarSliderB import { ICssStyleCollector, IColorTheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { PANEL_BACKGROUND, SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/terminalWidgetManager'; -import { IShellLaunchConfig, ITerminalDimensions, ITerminalProcessManager, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, NEVER_MEASURE_RENDER_TIME_STORAGE_KEY, ProcessState, TERMINAL_VIEW_ID, IWindowsShellHelper, SHELL_PATH_INVALID_EXIT_CODE, SHELL_PATH_DIRECTORY_EXIT_CODE, SHELL_CWD_INVALID_EXIT_CODE, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, INavigationMode, TitleEventSource, TERMINAL_COMMAND_ID, LEGACY_CONSOLE_MODE_EXIT_CODE } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IShellLaunchConfig, ITerminalDimensions, ITerminalProcessManager, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, NEVER_MEASURE_RENDER_TIME_STORAGE_KEY, ProcessState, TERMINAL_VIEW_ID, IWindowsShellHelper, SHELL_PATH_INVALID_EXIT_CODE, SHELL_PATH_DIRECTORY_EXIT_CODE, SHELL_CWD_INVALID_EXIT_CODE, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, INavigationMode, TitleEventSource, LEGACY_CONSOLE_MODE_EXIT_CODE, DEFAULT_COMMANDS_TO_SKIP_SHELL } from 'vs/workbench/contrib/terminal/common/terminal'; import { ansiColorIdentifiers, TERMINAL_BACKGROUND_COLOR, TERMINAL_CURSOR_BACKGROUND_COLOR, TERMINAL_CURSOR_FOREGROUND_COLOR, TERMINAL_FOREGROUND_COLOR, TERMINAL_SELECTION_BACKGROUND_COLOR } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; import { TerminalLinkHandler } from 'vs/workbench/contrib/terminal/browser/terminalLinkHandler'; @@ -47,125 +47,6 @@ import { IViewsService, IViewDescriptorService, ViewContainerLocation } from 'vs const SLOW_CANVAS_RENDER_THRESHOLD = 50; const NUMBER_OF_FRAMES_TO_MEASURE = 20; -export const DEFAULT_COMMANDS_TO_SKIP_SHELL: string[] = [ - TERMINAL_COMMAND_ID.CLEAR_SELECTION, - TERMINAL_COMMAND_ID.CLEAR, - TERMINAL_COMMAND_ID.COPY_SELECTION, - TERMINAL_COMMAND_ID.DELETE_TO_LINE_START, - TERMINAL_COMMAND_ID.DELETE_WORD_LEFT, - TERMINAL_COMMAND_ID.DELETE_WORD_RIGHT, - TERMINAL_COMMAND_ID.FIND_WIDGET_FOCUS, - TERMINAL_COMMAND_ID.FIND_WIDGET_HIDE, - TERMINAL_COMMAND_ID.FIND_NEXT, - TERMINAL_COMMAND_ID.FIND_PREVIOUS, - TERMINAL_COMMAND_ID.TOGGLE_FIND_REGEX, - TERMINAL_COMMAND_ID.TOGGLE_FIND_WHOLE_WORD, - TERMINAL_COMMAND_ID.TOGGLE_FIND_CASE_SENSITIVE, - TERMINAL_COMMAND_ID.FOCUS_NEXT_PANE, - TERMINAL_COMMAND_ID.FOCUS_NEXT, - TERMINAL_COMMAND_ID.FOCUS_PREVIOUS_PANE, - TERMINAL_COMMAND_ID.FOCUS_PREVIOUS, - TERMINAL_COMMAND_ID.FOCUS, - TERMINAL_COMMAND_ID.KILL, - TERMINAL_COMMAND_ID.MOVE_TO_LINE_END, - TERMINAL_COMMAND_ID.MOVE_TO_LINE_START, - TERMINAL_COMMAND_ID.NEW_IN_ACTIVE_WORKSPACE, - TERMINAL_COMMAND_ID.NEW, - TERMINAL_COMMAND_ID.PASTE, - TERMINAL_COMMAND_ID.RESIZE_PANE_DOWN, - TERMINAL_COMMAND_ID.RESIZE_PANE_LEFT, - TERMINAL_COMMAND_ID.RESIZE_PANE_RIGHT, - TERMINAL_COMMAND_ID.RESIZE_PANE_UP, - TERMINAL_COMMAND_ID.RUN_ACTIVE_FILE, - TERMINAL_COMMAND_ID.RUN_SELECTED_TEXT, - TERMINAL_COMMAND_ID.SCROLL_DOWN_LINE, - TERMINAL_COMMAND_ID.SCROLL_DOWN_PAGE, - TERMINAL_COMMAND_ID.SCROLL_TO_BOTTOM, - TERMINAL_COMMAND_ID.SCROLL_TO_NEXT_COMMAND, - TERMINAL_COMMAND_ID.SCROLL_TO_PREVIOUS_COMMAND, - TERMINAL_COMMAND_ID.SCROLL_TO_TOP, - TERMINAL_COMMAND_ID.SCROLL_UP_LINE, - TERMINAL_COMMAND_ID.SCROLL_UP_PAGE, - TERMINAL_COMMAND_ID.SEND_SEQUENCE, - TERMINAL_COMMAND_ID.SELECT_ALL, - TERMINAL_COMMAND_ID.SELECT_TO_NEXT_COMMAND, - TERMINAL_COMMAND_ID.SELECT_TO_NEXT_LINE, - TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_COMMAND, - TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_LINE, - TERMINAL_COMMAND_ID.SPLIT_IN_ACTIVE_WORKSPACE, - TERMINAL_COMMAND_ID.SPLIT, - TERMINAL_COMMAND_ID.TOGGLE, - TERMINAL_COMMAND_ID.NAVIGATION_MODE_EXIT, - TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_NEXT, - TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_PREVIOUS, - 'editor.action.toggleTabFocusMode', - 'workbench.action.quickOpen', - 'workbench.action.quickOpenPreviousEditor', - 'workbench.action.showCommands', - 'workbench.action.tasks.build', - 'workbench.action.tasks.restartTask', - 'workbench.action.tasks.runTask', - 'workbench.action.tasks.reRunTask', - 'workbench.action.tasks.showLog', - 'workbench.action.tasks.showTasks', - 'workbench.action.tasks.terminate', - 'workbench.action.tasks.test', - 'workbench.action.toggleFullScreen', - 'workbench.action.terminal.focusAtIndex1', - 'workbench.action.terminal.focusAtIndex2', - 'workbench.action.terminal.focusAtIndex3', - 'workbench.action.terminal.focusAtIndex4', - 'workbench.action.terminal.focusAtIndex5', - 'workbench.action.terminal.focusAtIndex6', - 'workbench.action.terminal.focusAtIndex7', - 'workbench.action.terminal.focusAtIndex8', - 'workbench.action.terminal.focusAtIndex9', - 'workbench.action.focusSecondEditorGroup', - 'workbench.action.focusThirdEditorGroup', - 'workbench.action.focusFourthEditorGroup', - 'workbench.action.focusFifthEditorGroup', - 'workbench.action.focusSixthEditorGroup', - 'workbench.action.focusSeventhEditorGroup', - 'workbench.action.focusEighthEditorGroup', - 'workbench.action.nextPanelView', - 'workbench.action.previousPanelView', - 'workbench.action.nextSideBarView', - 'workbench.action.previousSideBarView', - 'workbench.action.debug.start', - 'workbench.action.debug.stop', - 'workbench.action.debug.run', - 'workbench.action.debug.restart', - 'workbench.action.debug.continue', - 'workbench.action.debug.pause', - 'workbench.action.debug.stepInto', - 'workbench.action.debug.stepOut', - 'workbench.action.debug.stepOver', - 'workbench.action.nextEditor', - 'workbench.action.previousEditor', - 'workbench.action.nextEditorInGroup', - 'workbench.action.previousEditorInGroup', - 'workbench.action.openNextRecentlyUsedEditor', - 'workbench.action.openPreviousRecentlyUsedEditor', - 'workbench.action.openNextRecentlyUsedEditorInGroup', - 'workbench.action.openPreviousRecentlyUsedEditorInGroup', - 'workbench.action.quickOpenPreviousRecentlyUsedEditor', - 'workbench.action.quickOpenLeastRecentlyUsedEditor', - 'workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup', - 'workbench.action.quickOpenLeastRecentlyUsedEditorInGroup', - 'workbench.action.focusActiveEditorGroup', - 'workbench.action.focusFirstEditorGroup', - 'workbench.action.focusLastEditorGroup', - 'workbench.action.firstEditorInGroup', - 'workbench.action.lastEditorInGroup', - 'workbench.action.navigateUp', - 'workbench.action.navigateDown', - 'workbench.action.navigateRight', - 'workbench.action.navigateLeft', - 'workbench.action.togglePanel', - 'workbench.action.quickOpenView', - 'workbench.action.toggleMaximizedPanel' -]; - let xtermConstructor: Promise | undefined; interface ICanvasDimensions { diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 41400261a91..dc2d844b8ae 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -484,3 +484,122 @@ export const enum TERMINAL_COMMAND_ID { NAVIGATION_MODE_FOCUS_NEXT = 'workbench.action.terminal.navigationModeFocusNext', NAVIGATION_MODE_FOCUS_PREVIOUS = 'workbench.action.terminal.navigationModeFocusPrevious' } + +export const DEFAULT_COMMANDS_TO_SKIP_SHELL: string[] = [ + TERMINAL_COMMAND_ID.CLEAR_SELECTION, + TERMINAL_COMMAND_ID.CLEAR, + TERMINAL_COMMAND_ID.COPY_SELECTION, + TERMINAL_COMMAND_ID.DELETE_TO_LINE_START, + TERMINAL_COMMAND_ID.DELETE_WORD_LEFT, + TERMINAL_COMMAND_ID.DELETE_WORD_RIGHT, + TERMINAL_COMMAND_ID.FIND_WIDGET_FOCUS, + TERMINAL_COMMAND_ID.FIND_WIDGET_HIDE, + TERMINAL_COMMAND_ID.FIND_NEXT, + TERMINAL_COMMAND_ID.FIND_PREVIOUS, + TERMINAL_COMMAND_ID.TOGGLE_FIND_REGEX, + TERMINAL_COMMAND_ID.TOGGLE_FIND_WHOLE_WORD, + TERMINAL_COMMAND_ID.TOGGLE_FIND_CASE_SENSITIVE, + TERMINAL_COMMAND_ID.FOCUS_NEXT_PANE, + TERMINAL_COMMAND_ID.FOCUS_NEXT, + TERMINAL_COMMAND_ID.FOCUS_PREVIOUS_PANE, + TERMINAL_COMMAND_ID.FOCUS_PREVIOUS, + TERMINAL_COMMAND_ID.FOCUS, + TERMINAL_COMMAND_ID.KILL, + TERMINAL_COMMAND_ID.MOVE_TO_LINE_END, + TERMINAL_COMMAND_ID.MOVE_TO_LINE_START, + TERMINAL_COMMAND_ID.NEW_IN_ACTIVE_WORKSPACE, + TERMINAL_COMMAND_ID.NEW, + TERMINAL_COMMAND_ID.PASTE, + TERMINAL_COMMAND_ID.RESIZE_PANE_DOWN, + TERMINAL_COMMAND_ID.RESIZE_PANE_LEFT, + TERMINAL_COMMAND_ID.RESIZE_PANE_RIGHT, + TERMINAL_COMMAND_ID.RESIZE_PANE_UP, + TERMINAL_COMMAND_ID.RUN_ACTIVE_FILE, + TERMINAL_COMMAND_ID.RUN_SELECTED_TEXT, + TERMINAL_COMMAND_ID.SCROLL_DOWN_LINE, + TERMINAL_COMMAND_ID.SCROLL_DOWN_PAGE, + TERMINAL_COMMAND_ID.SCROLL_TO_BOTTOM, + TERMINAL_COMMAND_ID.SCROLL_TO_NEXT_COMMAND, + TERMINAL_COMMAND_ID.SCROLL_TO_PREVIOUS_COMMAND, + TERMINAL_COMMAND_ID.SCROLL_TO_TOP, + TERMINAL_COMMAND_ID.SCROLL_UP_LINE, + TERMINAL_COMMAND_ID.SCROLL_UP_PAGE, + TERMINAL_COMMAND_ID.SEND_SEQUENCE, + TERMINAL_COMMAND_ID.SELECT_ALL, + TERMINAL_COMMAND_ID.SELECT_TO_NEXT_COMMAND, + TERMINAL_COMMAND_ID.SELECT_TO_NEXT_LINE, + TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_COMMAND, + TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_LINE, + TERMINAL_COMMAND_ID.SPLIT_IN_ACTIVE_WORKSPACE, + TERMINAL_COMMAND_ID.SPLIT, + TERMINAL_COMMAND_ID.TOGGLE, + TERMINAL_COMMAND_ID.NAVIGATION_MODE_EXIT, + TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_NEXT, + TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_PREVIOUS, + 'editor.action.toggleTabFocusMode', + 'workbench.action.quickOpen', + 'workbench.action.quickOpenPreviousEditor', + 'workbench.action.showCommands', + 'workbench.action.tasks.build', + 'workbench.action.tasks.restartTask', + 'workbench.action.tasks.runTask', + 'workbench.action.tasks.reRunTask', + 'workbench.action.tasks.showLog', + 'workbench.action.tasks.showTasks', + 'workbench.action.tasks.terminate', + 'workbench.action.tasks.test', + 'workbench.action.toggleFullScreen', + 'workbench.action.terminal.focusAtIndex1', + 'workbench.action.terminal.focusAtIndex2', + 'workbench.action.terminal.focusAtIndex3', + 'workbench.action.terminal.focusAtIndex4', + 'workbench.action.terminal.focusAtIndex5', + 'workbench.action.terminal.focusAtIndex6', + 'workbench.action.terminal.focusAtIndex7', + 'workbench.action.terminal.focusAtIndex8', + 'workbench.action.terminal.focusAtIndex9', + 'workbench.action.focusSecondEditorGroup', + 'workbench.action.focusThirdEditorGroup', + 'workbench.action.focusFourthEditorGroup', + 'workbench.action.focusFifthEditorGroup', + 'workbench.action.focusSixthEditorGroup', + 'workbench.action.focusSeventhEditorGroup', + 'workbench.action.focusEighthEditorGroup', + 'workbench.action.nextPanelView', + 'workbench.action.previousPanelView', + 'workbench.action.nextSideBarView', + 'workbench.action.previousSideBarView', + 'workbench.action.debug.start', + 'workbench.action.debug.stop', + 'workbench.action.debug.run', + 'workbench.action.debug.restart', + 'workbench.action.debug.continue', + 'workbench.action.debug.pause', + 'workbench.action.debug.stepInto', + 'workbench.action.debug.stepOut', + 'workbench.action.debug.stepOver', + 'workbench.action.nextEditor', + 'workbench.action.previousEditor', + 'workbench.action.nextEditorInGroup', + 'workbench.action.previousEditorInGroup', + 'workbench.action.openNextRecentlyUsedEditor', + 'workbench.action.openPreviousRecentlyUsedEditor', + 'workbench.action.openNextRecentlyUsedEditorInGroup', + 'workbench.action.openPreviousRecentlyUsedEditorInGroup', + 'workbench.action.quickOpenPreviousRecentlyUsedEditor', + 'workbench.action.quickOpenLeastRecentlyUsedEditor', + 'workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup', + 'workbench.action.quickOpenLeastRecentlyUsedEditorInGroup', + 'workbench.action.focusActiveEditorGroup', + 'workbench.action.focusFirstEditorGroup', + 'workbench.action.focusLastEditorGroup', + 'workbench.action.firstEditorInGroup', + 'workbench.action.lastEditorInGroup', + 'workbench.action.navigateUp', + 'workbench.action.navigateDown', + 'workbench.action.navigateRight', + 'workbench.action.navigateLeft', + 'workbench.action.togglePanel', + 'workbench.action.quickOpenView', + 'workbench.action.toggleMaximizedPanel' +]; diff --git a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts new file mode 100644 index 00000000000..b63e87a55c9 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts @@ -0,0 +1,305 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IConfigurationNode } from 'vs/platform/configuration/common/configurationRegistry'; +import { localize } from 'vs/nls'; +import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; +import { DEFAULT_LETTER_SPACING, DEFAULT_LINE_HEIGHT, TerminalCursorStyle, DEFAULT_COMMANDS_TO_SKIP_SHELL } from 'vs/workbench/contrib/terminal/common/terminal'; +import { isMacintosh, isWindows } from 'vs/base/common/platform'; + +export const terminalConfiguration: IConfigurationNode = { + id: 'terminal', + order: 100, + title: localize('terminalIntegratedConfigurationTitle', "Integrated Terminal"), + type: 'object', + properties: { + 'terminal.integrated.automationShell.linux': { + markdownDescription: localize('terminal.integrated.automationShell.linux', "A path that when set will override {0} and ignore {1} values for automation-related terminal usage like tasks and debug.", '`terminal.integrated.shell.linux`', '`shellArgs`'), + type: ['string', 'null'], + default: null + }, + 'terminal.integrated.automationShell.osx': { + markdownDescription: localize('terminal.integrated.automationShell.osx', "A path that when set will override {0} and ignore {1} values for automation-related terminal usage like tasks and debug.", '`terminal.integrated.shell.osx`', '`shellArgs`'), + type: ['string', 'null'], + default: null + }, + 'terminal.integrated.automationShell.windows': { + markdownDescription: localize('terminal.integrated.automationShell.windows', "A path that when set will override {0} and ignore {1} values for automation-related terminal usage like tasks and debug.", '`terminal.integrated.shell.windows`', '`shellArgs`'), + type: ['string', 'null'], + default: null + }, + 'terminal.integrated.shellArgs.linux': { + markdownDescription: localize('terminal.integrated.shellArgs.linux', "The command line arguments to use when on the Linux terminal. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)."), + type: 'array', + items: { + type: 'string' + }, + default: [] + }, + 'terminal.integrated.shellArgs.osx': { + markdownDescription: localize('terminal.integrated.shellArgs.osx', "The command line arguments to use when on the macOS terminal. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)."), + type: 'array', + items: { + type: 'string' + }, + // Unlike on Linux, ~/.profile is not sourced when logging into a macOS session. This + // is the reason terminals on macOS typically run login shells by default which set up + // the environment. See http://unix.stackexchange.com/a/119675/115410 + default: ['-l'] + }, + 'terminal.integrated.shellArgs.windows': { + markdownDescription: localize('terminal.integrated.shellArgs.windows', "The command line arguments to use when on the Windows terminal. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)."), + 'anyOf': [ + { + type: 'array', + items: { + type: 'string', + markdownDescription: localize('terminal.integrated.shellArgs.windows', "The command line arguments to use when on the Windows terminal. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).") + }, + }, + { + type: 'string', + markdownDescription: localize('terminal.integrated.shellArgs.windows.string', "The command line arguments in [command-line format](https://msdn.microsoft.com/en-au/08dfcab2-eb6e-49a4-80eb-87d4076c98c6) to use when on the Windows terminal. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).") + } + ], + default: [] + }, + 'terminal.integrated.macOptionIsMeta': { + description: localize('terminal.integrated.macOptionIsMeta', "Controls whether to treat the option key as the meta key in the terminal on macOS."), + type: 'boolean', + default: false + }, + 'terminal.integrated.macOptionClickForcesSelection': { + description: localize('terminal.integrated.macOptionClickForcesSelection', "Controls whether to force selection when using Option+click on macOS. This will force a regular (line) selection and disallow the use of column selection mode. This enables copying and pasting using the regular terminal selection, for example, when mouse mode is enabled in tmux."), + type: 'boolean', + default: false + }, + 'terminal.integrated.copyOnSelection': { + description: localize('terminal.integrated.copyOnSelection', "Controls whether text selected in the terminal will be copied to the clipboard."), + type: 'boolean', + default: false + }, + 'terminal.integrated.drawBoldTextInBrightColors': { + description: localize('terminal.integrated.drawBoldTextInBrightColors', "Controls whether bold text in the terminal will always use the \"bright\" ANSI color variant."), + type: 'boolean', + default: true + }, + 'terminal.integrated.fontFamily': { + markdownDescription: localize('terminal.integrated.fontFamily', "Controls the font family of the terminal, this defaults to `#editor.fontFamily#`'s value."), + type: 'string' + }, + // TODO: Support font ligatures + // 'terminal.integrated.fontLigatures': { + // 'description': localize('terminal.integrated.fontLigatures', "Controls whether font ligatures are enabled in the terminal."), + // 'type': 'boolean', + // 'default': false + // }, + 'terminal.integrated.fontSize': { + description: localize('terminal.integrated.fontSize', "Controls the font size in pixels of the terminal."), + type: 'number', + default: EDITOR_FONT_DEFAULTS.fontSize + }, + 'terminal.integrated.letterSpacing': { + description: localize('terminal.integrated.letterSpacing', "Controls the letter spacing of the terminal, this is an integer value which represents the amount of additional pixels to add between characters."), + type: 'number', + default: DEFAULT_LETTER_SPACING + }, + 'terminal.integrated.lineHeight': { + description: localize('terminal.integrated.lineHeight', "Controls the line height of the terminal, this number is multiplied by the terminal font size to get the actual line-height in pixels."), + type: 'number', + default: DEFAULT_LINE_HEIGHT + }, + 'terminal.integrated.minimumContrastRatio': { + markdownDescription: localize('terminal.integrated.minimumContrastRatio', "When set the foreground color of each cell will change to try meet the contrast ratio specified. Example values:\n\n- 1: The default, do nothing.\n- 4.5: [WCAG AA compliance (minimum)](https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html).\n- 7: [WCAG AAA compliance (enhanced)](https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast7.html).\n- 21: White on black or black on white."), + type: 'number', + default: 1 + }, + 'terminal.integrated.fastScrollSensitivity': { + markdownDescription: localize('terminal.integrated.fastScrollSensitivity', "Scrolling speed multiplier when pressing `Alt`."), + type: 'number', + default: 5 + }, + 'terminal.integrated.mouseWheelScrollSensitivity': { + markdownDescription: localize('terminal.integrated.mouseWheelScrollSensitivity', "A multiplier to be used on the `deltaY` of mouse wheel scroll events."), + type: 'number', + default: 1 + }, + 'terminal.integrated.fontWeight': { + type: 'string', + enum: ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'], + description: localize('terminal.integrated.fontWeight', "The font weight to use within the terminal for non-bold text."), + default: 'normal' + }, + 'terminal.integrated.fontWeightBold': { + type: 'string', + enum: ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'], + description: localize('terminal.integrated.fontWeightBold', "The font weight to use within the terminal for bold text."), + default: 'bold' + }, + 'terminal.integrated.cursorBlinking': { + description: localize('terminal.integrated.cursorBlinking', "Controls whether the terminal cursor blinks."), + type: 'boolean', + default: false + }, + 'terminal.integrated.cursorStyle': { + description: localize('terminal.integrated.cursorStyle', "Controls the style of terminal cursor."), + enum: [TerminalCursorStyle.BLOCK, TerminalCursorStyle.LINE, TerminalCursorStyle.UNDERLINE], + default: TerminalCursorStyle.BLOCK + }, + 'terminal.integrated.cursorWidth': { + markdownDescription: localize('terminal.integrated.cursorWidth', "Controls the width of the cursor when `#terminal.integrated.cursorStyle#` is set to `line`."), + type: 'number', + default: 1 + }, + 'terminal.integrated.scrollback': { + description: localize('terminal.integrated.scrollback', "Controls the maximum amount of lines the terminal keeps in its buffer."), + type: 'number', + default: 1000 + }, + 'terminal.integrated.detectLocale': { + markdownDescription: localize('terminal.integrated.detectLocale', "Controls whether to detect and set the `$LANG` environment variable to a UTF-8 compliant option since VS Code's terminal only supports UTF-8 encoded data coming from the shell."), + type: 'string', + enum: ['auto', 'off', 'on'], + markdownEnumDescriptions: [ + localize('terminal.integrated.detectLocale.auto', "Set the `$LANG` environment variable if the existing variable does not exist or it does not end in `'.UTF-8'`."), + localize('terminal.integrated.detectLocale.off', "Do not set the `$LANG` environment variable."), + localize('terminal.integrated.detectLocale.on', "Always set the `$LANG` environment variable.") + ], + default: 'auto' + }, + 'terminal.integrated.rendererType': { + type: 'string', + enum: ['auto', 'canvas', 'dom', 'experimentalWebgl'], + markdownEnumDescriptions: [ + localize('terminal.integrated.rendererType.auto', "Let VS Code guess which renderer to use."), + localize('terminal.integrated.rendererType.canvas', "Use the standard GPU/canvas-based renderer."), + localize('terminal.integrated.rendererType.dom', "Use the fallback DOM-based renderer."), + localize('terminal.integrated.rendererType.experimentalWebgl', "Use the experimental webgl-based renderer. Note that this has some [known issues](https://github.com/xtermjs/xterm.js/issues?q=is%3Aopen+is%3Aissue+label%3Aarea%2Faddon%2Fwebgl) and this will only be enabled for new terminals (not hot swappable like the other renderers).") + ], + default: 'auto', + description: localize('terminal.integrated.rendererType', "Controls how the terminal is rendered.") + }, + 'terminal.integrated.rightClickBehavior': { + type: 'string', + enum: ['default', 'copyPaste', 'paste', 'selectWord'], + enumDescriptions: [ + localize('terminal.integrated.rightClickBehavior.default', "Show the context menu."), + localize('terminal.integrated.rightClickBehavior.copyPaste', "Copy when there is a selection, otherwise paste."), + localize('terminal.integrated.rightClickBehavior.paste', "Paste on right click."), + localize('terminal.integrated.rightClickBehavior.selectWord', "Select the word under the cursor and show the context menu.") + ], + default: isMacintosh ? 'selectWord' : isWindows ? 'copyPaste' : 'default', + description: localize('terminal.integrated.rightClickBehavior', "Controls how terminal reacts to right click.") + }, + 'terminal.integrated.cwd': { + 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."), + type: 'string', + default: undefined + }, + 'terminal.integrated.confirmOnExit': { + description: localize('terminal.integrated.confirmOnExit', "Controls whether to confirm on exit if there are active terminal sessions."), + type: 'boolean', + default: false + }, + 'terminal.integrated.enableBell': { + description: localize('terminal.integrated.enableBell', "Controls whether the terminal bell is enabled."), + type: 'boolean', + default: false + }, + 'terminal.integrated.commandsToSkipShell': { + markdownDescription: localize('terminal.integrated.commandsToSkipShell', "A set of command IDs whose keybindings will not be sent to the shell and instead always be handled by Code. This allows the use of keybindings that would normally be consumed by the shell to act the same as when the terminal is not focused, for example ctrl+p to launch Quick Open.\nDefault Skipped Commands:\n\n{0}", DEFAULT_COMMANDS_TO_SKIP_SHELL.sort().map(command => `- ${command}`).join('\n')), + type: 'array', + items: { + type: 'string' + }, + default: [] + }, + 'terminal.integrated.allowChords': { + markdownDescription: localize('terminal.integrated.allowChords', "Whether or not to allow chord keybindings in the terminal. Note that when this is true and the keystroke results in a chord it will bypass `#terminal.integrated.commandsToSkipShell#`, setting this to false is particularly useful when you want ctrl+k to go to your shell (not VS Code)."), + type: 'boolean', + default: true + }, + 'terminal.integrated.allowMnemonics': { + markdownDescription: localize('terminal.integrated.allowMnemonics', "Whether to allow menubar mnemonics (eg. alt+f) to trigger the open the menubar. Note that this will cause all alt keystrokes will skip the shell when true. This does nothing on macOS."), + type: 'boolean', + default: false + }, + 'terminal.integrated.inheritEnv': { + markdownDescription: localize('terminal.integrated.inheritEnv', "Whether new shells should inherit their environment from VS Code. This is not supported on Windows."), + type: 'boolean', + default: true + }, + 'terminal.integrated.env.osx': { + markdownDescription: localize('terminal.integrated.env.osx', "Object with environment variables that will be added to the VS Code process to be used by the terminal on macOS. Set to `null` to delete the environment variable."), + type: 'object', + additionalProperties: { + type: ['string', 'null'] + }, + default: {} + }, + 'terminal.integrated.env.linux': { + markdownDescription: localize('terminal.integrated.env.linux', "Object with environment variables that will be added to the VS Code process to be used by the terminal on Linux. Set to `null` to delete the environment variable."), + type: 'object', + additionalProperties: { + type: ['string', 'null'] + }, + default: {} + }, + 'terminal.integrated.env.windows': { + markdownDescription: localize('terminal.integrated.env.windows', "Object with environment variables that will be added to the VS Code process to be used by the terminal on Windows. Set to `null` to delete the environment variable."), + type: 'object', + additionalProperties: { + type: ['string', 'null'] + }, + default: {} + }, + 'terminal.integrated.showExitAlert': { + description: localize('terminal.integrated.showExitAlert', "Controls whether to show the alert \"The terminal process terminated with exit code\" when exit code is non-zero."), + type: 'boolean', + default: true + }, + 'terminal.integrated.splitCwd': { + description: localize('terminal.integrated.splitCwd', "Controls the working directory a split terminal starts with."), + type: 'string', + enum: ['workspaceRoot', 'initial', 'inherited'], + enumDescriptions: [ + localize('terminal.integrated.splitCwd.workspaceRoot', "A new split terminal will use the workspace root as the working directory. In a multi-root workspace a choice for which root folder to use is offered."), + localize('terminal.integrated.splitCwd.initial', "A new split terminal will use the working directory that the parent terminal started with."), + localize('terminal.integrated.splitCwd.inherited', "On macOS and Linux, a new split terminal will use the working directory of the parent terminal. On Windows, this behaves the same as initial."), + ], + default: 'inherited' + }, + 'terminal.integrated.windowsEnableConpty': { + description: localize('terminal.integrated.windowsEnableConpty', "Whether to use ConPTY for Windows terminal process communication (requires Windows 10 build number 18309+). Winpty will be used if this is false."), + type: 'boolean', + default: true + }, + 'terminal.integrated.wordSeparators': { + description: localize('terminal.integrated.wordSeparators', "A string containing all characters to be considered word separators by the double click to select word feature."), + type: 'string', + default: ' ()[]{}\',"`' + }, + 'terminal.integrated.experimentalUseTitleEvent': { + description: localize('terminal.integrated.experimentalUseTitleEvent', "An experimental setting that will use the terminal title event for the dropdown title. This setting will only apply to new terminals."), + type: 'boolean', + default: false + }, + 'terminal.integrated.enableFileLinks': { + description: localize('terminal.integrated.enableFileLinks', "Whether to enable file links in the terminal. Links can be slow when working on a network drive in particular because each file link is verified against the file system."), + type: 'boolean', + default: true + }, + 'terminal.integrated.unicodeVersion': { + type: 'string', + enum: ['6', '11'], + enumDescriptions: [ + localize('terminal.integrated.unicodeVersion.six', "Version 6 of unicode, this is an older version which should work better on older systems."), + localize('terminal.integrated.unicodeVersion.eleven', "Version 11 of unicode, this version provides better support on modern systems that use modern versions of unicode.") + ], + default: '11', + description: localize('terminal.integrated.unicodeVersion', "Controls what version of unicode to use when evaluating the width of characters in the terminal. If you experience emoji or other wide characters not taking up the right amount of space or backspace either deleting too much or too little then you may want to try tweaking this setting.") + } + } +}; From 86866286f0a775b4f642b3949d4cbdde692197f9 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 08:07:56 -0700 Subject: [PATCH 03/19] Consolidate all terminal config register into one file --- .../terminal/browser/terminal.contribution.ts | 35 +++++++-------- .../terminal/common/terminalConfiguration.ts | 37 ++++++++++++++- .../terminal/common/terminalShellConfig.ts | 45 ------------------- .../electron-browser/terminal.contribution.ts | 12 ++++- 4 files changed, 61 insertions(+), 68 deletions(-) delete mode 100644 src/vs/workbench/contrib/terminal/common/terminalShellConfig.ts diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index c78410c58ab..61ed793b9db 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -28,7 +28,6 @@ import { setupTerminalMenu } from 'vs/workbench/contrib/terminal/common/terminal import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; import { TerminalService } from 'vs/workbench/contrib/terminal/browser/terminalService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { registerShellConfiguration } from 'vs/workbench/contrib/terminal/common/terminalShellConfig'; import { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from 'vs/platform/accessibility/common/accessibility'; import { ITerminalService, WindowsShellType } from 'vs/workbench/contrib/terminal/browser/terminal'; import { BrowserFeatures } from 'vs/base/browser/canIUse'; @@ -36,17 +35,14 @@ import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { IQuickAccessRegistry, Extensions as QuickAccessExtensions } from 'vs/platform/quickinput/common/quickAccess'; import { TerminalQuickAccessProvider } from 'vs/workbench/contrib/terminal/browser/terminalsQuickAccess'; -import { terminalConfiguration } from 'vs/workbench/contrib/terminal/common/terminalConfiguration'; +import { terminalConfiguration, getTerminalShellConfiguration } from 'vs/workbench/contrib/terminal/common/terminalConfiguration'; +// Register services registerSingleton(ITerminalService, TerminalService, true); -if (platform.isWeb) { - registerShellConfiguration(); -} - -const inTerminalsPicker = 'inTerminalPicker'; +// Register quick accesses const quickAccessRegistry = (Registry.as(QuickAccessExtensions.Quickaccess)); - +const inTerminalsPicker = 'inTerminalPicker'; quickAccessRegistry.registerQuickAccessProvider({ ctor: TerminalQuickAccessProvider, prefix: TerminalQuickAccessProvider.PREFIX, @@ -54,22 +50,19 @@ quickAccessRegistry.registerQuickAccessProvider({ placeholder: nls.localize('tasksQuickAccessPlaceholder', "Type the name of a terminal to open."), helpEntries: [{ description: nls.localize('tasksQuickAccessHelp', "Show All Opened Terminals"), needsEditor: false }] }); - const quickAccessNavigateNextInTerminalPickerId = 'workbench.action.quickOpenNavigateNextInTerminalPicker'; -CommandsRegistry.registerCommand( - { id: quickAccessNavigateNextInTerminalPickerId, handler: getQuickNavigateHandler(quickAccessNavigateNextInTerminalPickerId, true) }); - +CommandsRegistry.registerCommand({ id: quickAccessNavigateNextInTerminalPickerId, handler: getQuickNavigateHandler(quickAccessNavigateNextInTerminalPickerId, true) }); const quickAccessNavigatePreviousInTerminalPickerId = 'workbench.action.quickOpenNavigatePreviousInTerminalPicker'; -CommandsRegistry.registerCommand( - { id: quickAccessNavigatePreviousInTerminalPickerId, handler: getQuickNavigateHandler(quickAccessNavigatePreviousInTerminalPickerId, false) }); - +CommandsRegistry.registerCommand({ id: quickAccessNavigatePreviousInTerminalPickerId, handler: getQuickNavigateHandler(quickAccessNavigatePreviousInTerminalPickerId, false) }); +// Register configurations const configurationRegistry = Registry.as(Extensions.Configuration); configurationRegistry.registerConfiguration(terminalConfiguration); +if (platform.isWeb) { + configurationRegistry.registerConfiguration(getTerminalShellConfiguration()); +} -const registry = Registry.as(ActionExtensions.WorkbenchActions); -registry.registerWorkbenchAction(SyncActionDescriptor.create(QuickAccessTerminalAction, QuickAccessTerminalAction.ID, QuickAccessTerminalAction.LABEL), 'Terminal: Switch Active Terminal', nls.localize('terminal', "Terminal")); - +// Register view containers const VIEW_CONTAINER = Registry.as(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer({ id: TERMINAL_VIEW_ID, name: nls.localize('terminal', "Terminal"), @@ -80,6 +73,7 @@ const VIEW_CONTAINER = Registry.as(ViewContainerExtensi }, ViewContainerLocation.Panel); Registry.as(panel.Extensions.Panels).setDefaultPanelId(TERMINAL_VIEW_ID); +// Register views Registry.as(ViewContainerExtensions.ViewsRegistry).registerViews([{ id: TERMINAL_VIEW_ID, name: nls.localize('terminal', "Terminal"), @@ -89,9 +83,10 @@ Registry.as(ViewContainerExtensions.ViewsRegistry).registerViews ctorDescriptor: new SyncDescriptor(TerminalViewPane) }], VIEW_CONTAINER); -// On mac cmd+` is reserved to cycle between windows, that's why the keybindings use WinCtrl -const category = TERMINAL_ACTION_CATEGORY; +// Register actions const actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); +const category = TERMINAL_ACTION_CATEGORY; +actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(QuickAccessTerminalAction, QuickAccessTerminalAction.ID, QuickAccessTerminalAction.LABEL), 'Terminal: Switch Active Terminal', nls.localize('terminal', "Terminal")); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(KillTerminalAction, KillTerminalAction.ID, KillTerminalAction.LABEL), 'Terminal: Kill the Active Terminal Instance', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(CreateNewTerminalAction, CreateNewTerminalAction.ID, CreateNewTerminalAction.LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.US_BACKTICK, diff --git a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts index b63e87a55c9..ee9846eb41c 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts @@ -7,7 +7,7 @@ import { IConfigurationNode } from 'vs/platform/configuration/common/configurati import { localize } from 'vs/nls'; import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { DEFAULT_LETTER_SPACING, DEFAULT_LINE_HEIGHT, TerminalCursorStyle, DEFAULT_COMMANDS_TO_SKIP_SHELL } from 'vs/workbench/contrib/terminal/common/terminal'; -import { isMacintosh, isWindows } from 'vs/base/common/platform'; +import { isMacintosh, isWindows, Platform } from 'vs/base/common/platform'; export const terminalConfiguration: IConfigurationNode = { id: 'terminal', @@ -303,3 +303,38 @@ export const terminalConfiguration: IConfigurationNode = { } } }; + +export function getTerminalShellConfiguration(getSystemShell?: (p: Platform) => string): IConfigurationNode { + return { + id: 'terminal', + order: 100, + title: localize('terminalIntegratedConfigurationTitle', "Integrated Terminal"), + type: 'object', + properties: { + 'terminal.integrated.shell.linux': { + markdownDescription: + getSystemShell + ? localize('terminal.integrated.shell.linux', "The path of the shell that the terminal uses on Linux (default: {0}). [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).", getSystemShell(Platform.Linux)) + : localize('terminal.integrated.shell.linux.noDefault', "The path of the shell that the terminal uses on Linux. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)."), + type: ['string', 'null'], + default: null + }, + 'terminal.integrated.shell.osx': { + markdownDescription: + getSystemShell + ? localize('terminal.integrated.shell.osx', "The path of the shell that the terminal uses on macOS (default: {0}). [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).", getSystemShell(Platform.Mac)) + : localize('terminal.integrated.shell.osx.noDefault', "The path of the shell that the terminal uses on macOS. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)."), + type: ['string', 'null'], + default: null + }, + 'terminal.integrated.shell.windows': { + markdownDescription: + getSystemShell + ? localize('terminal.integrated.shell.windows', "The path of the shell that the terminal uses on Windows (default: {0}). [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).", getSystemShell(Platform.Windows)) + : localize('terminal.integrated.shell.windows.noDefault', "The path of the shell that the terminal uses on Windows. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)."), + type: ['string', 'null'], + default: null + } + } + }; +} diff --git a/src/vs/workbench/contrib/terminal/common/terminalShellConfig.ts b/src/vs/workbench/contrib/terminal/common/terminalShellConfig.ts deleted file mode 100644 index c08a6f47fe8..00000000000 --- a/src/vs/workbench/contrib/terminal/common/terminalShellConfig.ts +++ /dev/null @@ -1,45 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * 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 { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { Platform } from 'vs/base/common/platform'; - -export function registerShellConfiguration(getSystemShell?: (p: Platform) => string): void { - const configurationRegistry = Registry.as(Extensions.Configuration); - configurationRegistry.registerConfiguration({ - id: 'terminal', - order: 100, - title: nls.localize('terminalIntegratedConfigurationTitle', "Integrated Terminal"), - type: 'object', - properties: { - 'terminal.integrated.shell.linux': { - markdownDescription: - getSystemShell - ? nls.localize('terminal.integrated.shell.linux', "The path of the shell that the terminal uses on Linux (default: {0}). [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).", getSystemShell(Platform.Linux)) - : nls.localize('terminal.integrated.shell.linux.noDefault', "The path of the shell that the terminal uses on Linux. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)."), - type: ['string', 'null'], - default: null - }, - 'terminal.integrated.shell.osx': { - markdownDescription: - getSystemShell - ? nls.localize('terminal.integrated.shell.osx', "The path of the shell that the terminal uses on macOS (default: {0}). [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).", getSystemShell(Platform.Mac)) - : nls.localize('terminal.integrated.shell.osx.noDefault', "The path of the shell that the terminal uses on macOS. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)."), - type: ['string', 'null'], - default: null - }, - 'terminal.integrated.shell.windows': { - markdownDescription: - getSystemShell - ? nls.localize('terminal.integrated.shell.windows', "The path of the shell that the terminal uses on Windows (default: {0}). [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration).", getSystemShell(Platform.Windows)) - : nls.localize('terminal.integrated.shell.windows.noDefault', "The path of the shell that the terminal uses on Windows. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)."), - type: ['string', 'null'], - default: null - } - } - }); -} diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminal.contribution.ts index f9dd46267ca..1721bf226a6 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminal.contribution.ts @@ -7,10 +7,18 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalInstanceService } from 'vs/workbench/contrib/terminal/electron-browser/terminalInstanceService'; import { getSystemShell } from 'vs/workbench/contrib/terminal/node/terminal'; -import { registerShellConfiguration } from 'vs/workbench/contrib/terminal/common/terminalShellConfig'; import { TerminalNativeService } from 'vs/workbench/contrib/terminal/electron-browser/terminalNativeService'; import { ITerminalNativeService } from 'vs/workbench/contrib/terminal/common/terminal'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; +import { getTerminalShellConfiguration } from 'vs/workbench/contrib/terminal/common/terminalConfiguration'; -registerShellConfiguration(getSystemShell); +// This file contains additional desktop-only contributions on top of those in browser/ + +// Register services registerSingleton(ITerminalNativeService, TerminalNativeService, true); registerSingleton(ITerminalInstanceService, TerminalInstanceService, true); + +// Register configurations +const configurationRegistry = Registry.as(Extensions.Configuration); +configurationRegistry.registerConfiguration(getTerminalShellConfiguration(getSystemShell)); From af3345fed8f8082132a06966385e93278bfcf829 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 08:24:03 -0700 Subject: [PATCH 04/19] Convert find previous to action2 --- .../terminal/browser/terminal.contribution.ts | 19 ++----- .../terminal/browser/terminalActions.ts | 51 +++++++++++-------- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 61ed793b9db..ef7ab6aa3a7 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -19,7 +19,7 @@ import * as panel from 'vs/workbench/browser/panel'; import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; -import { ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FindNext, FindPrevious, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleCaseSensitiveCommand, ToggleEscapeSequenceLoggingAction, ToggleRegexCommand, ToggleTerminalAction, ToggleWholeWordCommand, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, CreateNewWithCwdTerminalAction2, RenameWithArgTerminalAction2, terminalSendSequenceCommand, SendSequenceTerminalAction2 } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FindNext, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleCaseSensitiveCommand, ToggleEscapeSequenceLoggingAction, ToggleRegexCommand, ToggleTerminalAction, ToggleWholeWordCommand, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, CreateNewWithCwdTerminalAction2, RenameWithArgTerminalAction2, terminalSendSequenceCommand, SendSequenceTerminalAction2, FindPreviousAction2 } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; import { KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; @@ -59,10 +59,12 @@ CommandsRegistry.registerCommand({ id: quickAccessNavigatePreviousInTerminalPick const configurationRegistry = Registry.as(Extensions.Configuration); configurationRegistry.registerConfiguration(terminalConfiguration); if (platform.isWeb) { + // Desktop shell configuration are registered in electron-browser as their default values rely + // on process.env configurationRegistry.registerConfiguration(getTerminalShellConfiguration()); } -// Register view containers +// Register views const VIEW_CONTAINER = Registry.as(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer({ id: TERMINAL_VIEW_ID, name: nls.localize('terminal', "Terminal"), @@ -72,8 +74,6 @@ const VIEW_CONTAINER = Registry.as(ViewContainerExtensi order: 3 }, ViewContainerLocation.Panel); Registry.as(panel.Extensions.Panels).setDefaultPanelId(TERMINAL_VIEW_ID); - -// Register views Registry.as(ViewContainerExtensions.ViewsRegistry).registerViews([{ id: TERMINAL_VIEW_ID, name: nls.localize('terminal', "Terminal"), @@ -244,16 +244,7 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(FindNext, Fin secondary: [KeyMod.Shift | KeyCode.Enter], mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_G, secondary: [KeyCode.F3, KeyMod.Shift | KeyCode.Enter] } }, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), 'Terminal: Find next', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(FindPrevious, FindPrevious.ID, FindPrevious.LABEL, { - primary: KeyMod.Shift | KeyCode.F3, - mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G, secondary: [KeyMod.Shift | KeyCode.F3] }, -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Find previous', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(FindPrevious, FindPrevious.ID, FindPrevious.LABEL, { - primary: KeyMod.Shift | KeyCode.F3, - secondary: [KeyCode.Enter], - mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G, secondary: [KeyMod.Shift | KeyCode.F3, KeyCode.Enter] }, -}, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), 'Terminal: Find previous', category); - +registerAction2(FindPreviousAction2); registerAction2(SendSequenceTerminalAction2); registerAction2(CreateNewWithCwdTerminalAction2); registerAction2(RenameWithArgTerminalAction2); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 1ebf999c807..b4d4c52f351 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -7,7 +7,7 @@ import * as nls from 'vs/nls'; import { Action, IAction } from 'vs/base/common/actions'; import { EndOfLinePreference } from 'vs/editor/common/model'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { TERMINAL_VIEW_ID, ITerminalConfigHelper, TitleEventSource, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; +import { TERMINAL_VIEW_ID, ITerminalConfigHelper, TitleEventSource, TERMINAL_COMMAND_ID, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_FOCUS } from 'vs/workbench/contrib/terminal/common/terminal'; import { SelectActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { attachSelectBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; @@ -32,9 +32,11 @@ import { Action2 } from 'vs/platform/actions/common/actions'; import { TerminalQuickAccessProvider } from 'vs/workbench/contrib/terminal/browser/terminalsQuickAccess'; import { ToggleViewAction } from 'vs/workbench/browser/actions/layoutActions'; import { IViewsService, IViewDescriptorService } from 'vs/workbench/common/views'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { addClass } from 'vs/base/browser/dom'; import { selectBorder } from 'vs/platform/theme/common/colorRegistry'; +import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; +import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; async function getCwdForSplit(configHelper: ITerminalConfigHelper, instance: ITerminalInstance, folders?: IWorkspaceFolder[], commandService?: ICommandService): Promise { switch (configHelper.config.splitCwd) { @@ -187,7 +189,7 @@ export class SendSequenceTerminalAction2 extends Action2 { }); } - run(accessor: ServicesAccessor, args: { text?: string } | undefined) { + run(accessor: ServicesAccessor, args?: { text?: string }) { terminalSendSequenceCommand(accessor, args); } } @@ -232,7 +234,7 @@ export class CreateNewWithCwdTerminalAction2 extends Action2 { }); } - public run(accessor: ServicesAccessor, args: { cwd?: string } | undefined): Promise { + public run(accessor: ServicesAccessor, args?: { cwd?: string }): Promise { const terminalService = accessor.get(ITerminalService); const instance = terminalService.createTerminal({ cwd: args?.cwd }); if (!instance) { @@ -1014,10 +1016,7 @@ export class RenameWithArgTerminalAction2 extends Action2 { }); } - public run( - accessor: ServicesAccessor, - args?: { name?: string } - ): void { + public run(accessor: ServicesAccessor, args?: { name?: string }): void { const notificationService = accessor.get(INotificationService); const terminalInstance = accessor.get(ITerminalService).getActiveInstance(); @@ -1295,19 +1294,31 @@ export class FindNext extends Action { } } -export class FindPrevious extends Action { - public static readonly ID = TERMINAL_COMMAND_ID.FIND_PREVIOUS; - public static readonly LABEL = nls.localize('workbench.action.terminal.findPrevious', "Find previous"); - - constructor( - id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService - ) { - super(id, label); +export class FindPreviousAction2 extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.FIND_PREVIOUS, + title: nls.localize('workbench.action.terminal.findPrevious', "Find previous"), + keybinding: [ + { + primary: KeyMod.Shift | KeyCode.F3, + mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G, secondary: [KeyMod.Shift | KeyCode.F3] }, + when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), + weight: KeybindingWeight.WorkbenchContrib + }, + { + primary: KeyCode.Enter, + mac: { primary: KeyCode.Enter }, + when: KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, + weight: KeybindingWeight.WorkbenchContrib + } + ], + category: TERMINAL_ACTION_CATEGORY, + f1: true + }); } - public run(): Promise { - this.terminalService.findPrevious(); - return Promise.resolve(undefined); + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).findPrevious(); } } From 2ef3c425386b92ad265eb07ba58e43a2433422ac Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 08:27:53 -0700 Subject: [PATCH 05/19] Convert find next to action2 --- .../terminal/browser/terminal.contribution.ts | 12 ++----- .../terminal/browser/terminalActions.ts | 36 ++++++++++++------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index ef7ab6aa3a7..540aea4210b 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -19,7 +19,7 @@ import * as panel from 'vs/workbench/browser/panel'; import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; -import { ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FindNext, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleCaseSensitiveCommand, ToggleEscapeSequenceLoggingAction, ToggleRegexCommand, ToggleTerminalAction, ToggleWholeWordCommand, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, CreateNewWithCwdTerminalAction2, RenameWithArgTerminalAction2, terminalSendSequenceCommand, SendSequenceTerminalAction2, FindPreviousAction2 } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleCaseSensitiveCommand, ToggleEscapeSequenceLoggingAction, ToggleRegexCommand, ToggleTerminalAction, ToggleWholeWordCommand, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, CreateNewWithCwdTerminalAction2, RenameWithArgTerminalAction2, terminalSendSequenceCommand, SendSequenceTerminalAction2, FindPreviousAction2, FindNextAction2 } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; import { KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; @@ -235,15 +235,7 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ToggleCaseSen primary: KeyMod.Alt | KeyCode.KEY_C, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_C } }, ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED)), 'Terminal: Toggle find using case sensitive', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(FindNext, FindNext.ID, FindNext.LABEL, { - primary: KeyCode.F3, - mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_G, secondary: [KeyCode.F3] } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Find next', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(FindNext, FindNext.ID, FindNext.LABEL, { - primary: KeyCode.F3, - secondary: [KeyMod.Shift | KeyCode.Enter], - mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_G, secondary: [KeyCode.F3, KeyMod.Shift | KeyCode.Enter] } -}, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), 'Terminal: Find next', category); +registerAction2(FindNextAction2); registerAction2(FindPreviousAction2); registerAction2(SendSequenceTerminalAction2); registerAction2(CreateNewWithCwdTerminalAction2); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index b4d4c52f351..cabcc026f53 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -1277,20 +1277,31 @@ export class ToggleCaseSensitiveCommand extends ToggleFindOptionCommand { } } -export class FindNext extends Action { - public static readonly ID = TERMINAL_COMMAND_ID.FIND_NEXT; - public static readonly LABEL = nls.localize('workbench.action.terminal.findNext', "Find next"); - - constructor( - id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService - ) { - super(id, label); +export class FindNextAction2 extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.FIND_NEXT, + title: nls.localize('workbench.action.terminal.findNext', "Find next"), + keybinding: [ + { + primary: KeyCode.F3, + mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_G, secondary: [KeyCode.F3] }, + when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), + weight: KeybindingWeight.WorkbenchContrib + }, + { + primary: KeyMod.Shift | KeyCode.Enter, + when: KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, + weight: KeybindingWeight.WorkbenchContrib + } + ], + category: TERMINAL_ACTION_CATEGORY, + f1: true + }); } - public run(): Promise { - this.terminalService.findNext(); - return Promise.resolve(undefined); + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).findNext(); } } @@ -1308,7 +1319,6 @@ export class FindPreviousAction2 extends Action2 { }, { primary: KeyCode.Enter, - mac: { primary: KeyCode.Enter }, when: KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, weight: KeybindingWeight.WorkbenchContrib } From a5677140109d35e1a55eaf512c0b7a06a600c2ec Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 08:32:22 -0700 Subject: [PATCH 06/19] Move action2 registration into terminalActions --- .../terminal/browser/terminal.contribution.ts | 11 +- .../terminal/browser/terminalActions.ts | 312 +++++++++--------- 2 files changed, 160 insertions(+), 163 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 540aea4210b..684279ee315 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -10,7 +10,7 @@ import 'vs/css!./media/terminal'; import 'vs/css!./media/widgets'; import 'vs/css!./media/xterm'; import * as nls from 'vs/nls'; -import { SyncActionDescriptor, registerAction2 } from 'vs/platform/actions/common/actions'; +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr, ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingWeight, KeybindingsRegistry, IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -19,7 +19,7 @@ import * as panel from 'vs/workbench/browser/panel'; import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; -import { ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleCaseSensitiveCommand, ToggleEscapeSequenceLoggingAction, ToggleRegexCommand, ToggleTerminalAction, ToggleWholeWordCommand, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, CreateNewWithCwdTerminalAction2, RenameWithArgTerminalAction2, terminalSendSequenceCommand, SendSequenceTerminalAction2, FindPreviousAction2, FindNextAction2 } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { registerTerminalActions, ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleCaseSensitiveCommand, ToggleEscapeSequenceLoggingAction, ToggleRegexCommand, ToggleTerminalAction, ToggleWholeWordCommand, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; import { KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; @@ -235,11 +235,8 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ToggleCaseSen primary: KeyMod.Alt | KeyCode.KEY_C, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_C } }, ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED)), 'Terminal: Toggle find using case sensitive', category); -registerAction2(FindNextAction2); -registerAction2(FindPreviousAction2); -registerAction2(SendSequenceTerminalAction2); -registerAction2(CreateNewWithCwdTerminalAction2); -registerAction2(RenameWithArgTerminalAction2); + +registerTerminalActions(); // Commands might be affected by Web restrictons if (BrowserFeatures.clipboard.writeText) { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index cabcc026f53..96332797294 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -28,7 +28,7 @@ import { URI } from 'vs/base/common/uri'; import { isWindows } from 'vs/base/common/platform'; import { withNullAsUndefined } from 'vs/base/common/types'; import { ITerminalInstance, ITerminalService, Direction } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { Action2 } from 'vs/platform/actions/common/actions'; +import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; import { TerminalQuickAccessProvider } from 'vs/workbench/contrib/terminal/browser/terminalsQuickAccess'; import { ToggleViewAction } from 'vs/workbench/browser/actions/layoutActions'; import { IViewsService, IViewDescriptorService } from 'vs/workbench/common/views'; @@ -167,33 +167,6 @@ export class SelectAllTerminalAction extends Action { } } -export class SendSequenceTerminalAction2 extends Action2 { - constructor() { - const title = nls.localize('workbench.action.terminal.sendSequence', "Send Custom Sequence To Terminal"); - super({ - id: TERMINAL_COMMAND_ID.SEND_SEQUENCE, - title, - description: { - description: title, - args: [{ - name: 'args', - schema: { - type: 'object', - required: ['text'], - properties: { - text: { type: 'string' } - }, - } - }] - } - }); - } - - run(accessor: ServicesAccessor, args?: { text?: string }) { - terminalSendSequenceCommand(accessor, args); - } -} - export const terminalSendSequenceCommand = (accessor: ServicesAccessor, args: { text?: string } | undefined) => { const terminalInstance = accessor.get(ITerminalService).getActiveInstance(); if (!terminalInstance || !args?.text) { @@ -209,41 +182,6 @@ export const terminalSendSequenceCommand = (accessor: ServicesAccessor, args: { terminalInstance.sendText(resolvedText, false); }; -export class CreateNewWithCwdTerminalAction2 extends Action2 { - constructor() { - const title = nls.localize('workbench.action.terminal.newWithCwd', "Create New Integrated Terminal Starting in a Custom Working Directory"); - super({ - id: TERMINAL_COMMAND_ID.NEW_WITH_CWD, - title, - description: { - description: title, - args: [{ - name: 'args', - schema: { - type: 'object', - required: ['cwd'], - properties: { - cwd: { - description: nls.localize('workbench.action.terminal.newWithCwd.cwd', "The directory to start the terminal at"), - type: 'string' - } - }, - } - }] - } - }); - } - - public run(accessor: ServicesAccessor, args?: { cwd?: string }): Promise { - const terminalService = accessor.get(ITerminalService); - const instance = terminalService.createTerminal({ cwd: args?.cwd }); - if (!instance) { - return Promise.resolve(undefined); - } - terminalService.setActiveInstance(instance); - return terminalService.showPanel(true); - } -} export class CreateNewTerminalAction extends Action { @@ -990,49 +928,6 @@ export class RenameTerminalAction extends Action { } } } -export class RenameWithArgTerminalAction2 extends Action2 { - constructor() { - const title = nls.localize('workbench.action.terminal.renameWithArg', "Rename the Currently Active Terminal"); - super({ - id: TERMINAL_COMMAND_ID.RENAME_WITH_ARG, - title, - description: { - description: title, - args: [{ - name: 'args', - schema: { - type: 'object', - required: ['name'], - properties: { - name: { - description: nls.localize('workbench.action.terminal.renameWithArg.name', "The new name for the terminal"), - type: 'string', - minLength: 1 - } - } - } - }] - } - }); - } - - public run(accessor: ServicesAccessor, args?: { name?: string }): void { - const notificationService = accessor.get(INotificationService); - const terminalInstance = accessor.get(ITerminalService).getActiveInstance(); - - if (!terminalInstance) { - notificationService.warn(nls.localize('workbench.action.terminal.renameWithArg.noTerminal', "No active terminal to rename")); - return; - } - - if (!args || !args.name) { - notificationService.warn(nls.localize('workbench.action.terminal.renameWithArg.noName', "No name argument provided")); - return; - } - - terminalInstance.setTitle(args.name, TitleEventSource.Api); - } -} export class FocusTerminalFindWidgetAction extends Action { @@ -1277,58 +1172,163 @@ export class ToggleCaseSensitiveCommand extends ToggleFindOptionCommand { } } -export class FindNextAction2 extends Action2 { - constructor() { - super({ - id: TERMINAL_COMMAND_ID.FIND_NEXT, - title: nls.localize('workbench.action.terminal.findNext', "Find next"), - keybinding: [ - { - primary: KeyCode.F3, - mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_G, secondary: [KeyCode.F3] }, - when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), - weight: KeybindingWeight.WorkbenchContrib - }, - { - primary: KeyMod.Shift | KeyCode.Enter, - when: KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, - weight: KeybindingWeight.WorkbenchContrib +export function registerTerminalActions() { + registerAction2(class extends Action2 { + constructor() { + const title = nls.localize('workbench.action.terminal.sendSequence', "Send Custom Sequence To Terminal"); + super({ + id: TERMINAL_COMMAND_ID.SEND_SEQUENCE, + title, + description: { + description: title, + args: [{ + name: 'args', + schema: { + type: 'object', + required: ['text'], + properties: { + text: { type: 'string' } + }, + } + }] } - ], - category: TERMINAL_ACTION_CATEGORY, - f1: true - }); - } + }); + } - run(accessor: ServicesAccessor) { - accessor.get(ITerminalService).findNext(); - } -} - -export class FindPreviousAction2 extends Action2 { - constructor() { - super({ - id: TERMINAL_COMMAND_ID.FIND_PREVIOUS, - title: nls.localize('workbench.action.terminal.findPrevious', "Find previous"), - keybinding: [ - { - primary: KeyMod.Shift | KeyCode.F3, - mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G, secondary: [KeyMod.Shift | KeyCode.F3] }, - when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), - weight: KeybindingWeight.WorkbenchContrib - }, - { - primary: KeyCode.Enter, - when: KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, - weight: KeybindingWeight.WorkbenchContrib + run(accessor: ServicesAccessor, args?: { text?: string }) { + terminalSendSequenceCommand(accessor, args); + } + }); + registerAction2(class extends Action2 { + constructor() { + const title = nls.localize('workbench.action.terminal.newWithCwd', "Create New Integrated Terminal Starting in a Custom Working Directory"); + super({ + id: TERMINAL_COMMAND_ID.NEW_WITH_CWD, + title, + description: { + description: title, + args: [{ + name: 'args', + schema: { + type: 'object', + required: ['cwd'], + properties: { + cwd: { + description: nls.localize('workbench.action.terminal.newWithCwd.cwd', "The directory to start the terminal at"), + type: 'string' + } + }, + } + }] } - ], - category: TERMINAL_ACTION_CATEGORY, - f1: true - }); - } + }); + } - run(accessor: ServicesAccessor) { - accessor.get(ITerminalService).findPrevious(); - } + public run(accessor: ServicesAccessor, args?: { cwd?: string }): Promise { + const terminalService = accessor.get(ITerminalService); + const instance = terminalService.createTerminal({ cwd: args?.cwd }); + if (!instance) { + return Promise.resolve(undefined); + } + terminalService.setActiveInstance(instance); + return terminalService.showPanel(true); + } + }); + registerAction2(class extends Action2 { + constructor() { + const title = nls.localize('workbench.action.terminal.renameWithArg', "Rename the Currently Active Terminal"); + super({ + id: TERMINAL_COMMAND_ID.RENAME_WITH_ARG, + title, + description: { + description: title, + args: [{ + name: 'args', + schema: { + type: 'object', + required: ['name'], + properties: { + name: { + description: nls.localize('workbench.action.terminal.renameWithArg.name', "The new name for the terminal"), + type: 'string', + minLength: 1 + } + } + } + }] + } + }); + } + + public run(accessor: ServicesAccessor, args?: { name?: string }): void { + const notificationService = accessor.get(INotificationService); + const terminalInstance = accessor.get(ITerminalService).getActiveInstance(); + + if (!terminalInstance) { + notificationService.warn(nls.localize('workbench.action.terminal.renameWithArg.noTerminal', "No active terminal to rename")); + return; + } + + if (!args || !args.name) { + notificationService.warn(nls.localize('workbench.action.terminal.renameWithArg.noName', "No name argument provided")); + return; + } + + terminalInstance.setTitle(args.name, TitleEventSource.Api); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.FIND_NEXT, + title: nls.localize('workbench.action.terminal.findNext', "Find next"), + keybinding: [ + { + primary: KeyCode.F3, + mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_G, secondary: [KeyCode.F3] }, + when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), + weight: KeybindingWeight.WorkbenchContrib + }, + { + primary: KeyMod.Shift | KeyCode.Enter, + when: KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, + weight: KeybindingWeight.WorkbenchContrib + } + ], + category: TERMINAL_ACTION_CATEGORY, + f1: true + }); + } + + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).findNext(); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.FIND_PREVIOUS, + title: nls.localize('workbench.action.terminal.findPrevious', "Find previous"), + keybinding: [ + { + primary: KeyMod.Shift | KeyCode.F3, + mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G, secondary: [KeyMod.Shift | KeyCode.F3] }, + when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), + weight: KeybindingWeight.WorkbenchContrib + }, + { + primary: KeyCode.Enter, + when: KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, + weight: KeybindingWeight.WorkbenchContrib + } + ], + category: TERMINAL_ACTION_CATEGORY, + f1: true + }); + } + + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).findPrevious(); + } + }); } From 15e9f2bca50a650e2dabb99d99b09d72161f3955 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 08:41:42 -0700 Subject: [PATCH 07/19] Convert terminal find states to action2 --- .../terminal/browser/terminal.contribution.ts | 14 +-- .../terminal/browser/terminalActions.ts | 117 +++++++++++------- 2 files changed, 71 insertions(+), 60 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 684279ee315..f0569903bbc 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -19,7 +19,7 @@ import * as panel from 'vs/workbench/browser/panel'; import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; -import { registerTerminalActions, ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleCaseSensitiveCommand, ToggleEscapeSequenceLoggingAction, ToggleRegexCommand, ToggleTerminalAction, ToggleWholeWordCommand, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { registerTerminalActions, ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleEscapeSequenceLoggingAction, ToggleTerminalAction, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; import { KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; @@ -223,18 +223,6 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(NavigationMod actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(SelectToPreviousLineAction, SelectToPreviousLineAction.ID, SelectToPreviousLineAction.LABEL), 'Terminal: Select To Previous Line', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(SelectToNextLineAction, SelectToNextLineAction.ID, SelectToNextLineAction.LABEL), 'Terminal: Select To Next Line', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ToggleEscapeSequenceLoggingAction, ToggleEscapeSequenceLoggingAction.ID, ToggleEscapeSequenceLoggingAction.LABEL), 'Terminal: Toggle Escape Sequence Logging', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ToggleRegexCommand, ToggleRegexCommand.ID, ToggleRegexCommand.LABEL, { - primary: KeyMod.Alt | KeyCode.KEY_R, - mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_R } -}, ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED)), 'Terminal: Toggle find using regex', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ToggleWholeWordCommand, ToggleWholeWordCommand.ID, ToggleWholeWordCommand.LABEL, { - primary: KeyMod.Alt | KeyCode.KEY_W, - mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_W } -}, ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED)), 'Terminal: Toggle find using whole word', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ToggleCaseSensitiveCommand, ToggleCaseSensitiveCommand.ID, ToggleCaseSensitiveCommand.LABEL, { - primary: KeyMod.Alt | KeyCode.KEY_C, - mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_C } -}, ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED)), 'Terminal: Toggle find using case sensitive', category); registerTerminalActions(); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 96332797294..1d8b775d521 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -19,7 +19,6 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { PICK_WORKSPACE_FOLDER_COMMAND_ID } from 'vs/workbench/browser/actions/workspaceCommands'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { FindReplaceState } from 'vs/editor/contrib/find/findState'; import { ISelectOptionItem } from 'vs/base/browser/ui/selectBox/selectBox'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; @@ -1128,50 +1127,6 @@ export class ToggleEscapeSequenceLoggingAction extends Action { } } -abstract class ToggleFindOptionCommand extends Action { - constructor( - id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService - ) { - super(id, label); - } - - protected abstract runInner(state: FindReplaceState): void; - - public run(): Promise { - const state = this.terminalService.getFindState(); - this.runInner(state); - return Promise.resolve(undefined); - } -} - -export class ToggleRegexCommand extends ToggleFindOptionCommand { - public static readonly ID = TERMINAL_COMMAND_ID.TOGGLE_FIND_REGEX; - public static readonly LABEL = nls.localize('workbench.action.terminal.toggleFindRegex', "Toggle find using regex"); - - protected runInner(state: FindReplaceState): void { - state.change({ isRegex: !state.isRegex }, false); - } -} - -export class ToggleWholeWordCommand extends ToggleFindOptionCommand { - public static readonly ID = TERMINAL_COMMAND_ID.TOGGLE_FIND_WHOLE_WORD; - public static readonly LABEL = nls.localize('workbench.action.terminal.toggleFindWholeWord', "Toggle find using whole word"); - - protected runInner(state: FindReplaceState): void { - state.change({ wholeWord: !state.wholeWord }, false); - } -} - -export class ToggleCaseSensitiveCommand extends ToggleFindOptionCommand { - public static readonly ID = TERMINAL_COMMAND_ID.TOGGLE_FIND_CASE_SENSITIVE; - public static readonly LABEL = nls.localize('workbench.action.terminal.toggleFindCaseSensitive', "Toggle find using case sensitive"); - - protected runInner(state: FindReplaceState): void { - state.change({ matchCase: !state.matchCase }, false); - } -} - export function registerTerminalActions() { registerAction2(class extends Action2 { constructor() { @@ -1277,6 +1232,74 @@ export function registerTerminalActions() { terminalInstance.setTitle(args.name, TitleEventSource.Api); } }); + + const category = TERMINAL_ACTION_CATEGORY; + registerAction2(class extends Action2 { + constructor() { + const title = nls.localize('workbench.action.terminal.toggleFindRegex', "Toggle find using regex"); + super({ + id: TERMINAL_COMMAND_ID.TOGGLE_FIND_REGEX, + title, + f1: true, + keybinding: { + primary: KeyMod.Alt | KeyCode.KEY_R, + mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_R }, + when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), + weight: KeybindingWeight.WorkbenchContrib + }, + category + }); + } + + run(accessor: ServicesAccessor) { + const state = accessor.get(ITerminalService).getFindState(); + state.change({ isRegex: !state.isRegex }, false); + } + }); + registerAction2(class extends Action2 { + constructor() { + const title = nls.localize('workbench.action.terminal.toggleFindWholeWord', "Toggle find using whole word"); + super({ + id: TERMINAL_COMMAND_ID.TOGGLE_FIND_WHOLE_WORD, + title, + f1: true, + keybinding: { + primary: KeyMod.Alt | KeyCode.KEY_W, + mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_W }, + when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), + weight: KeybindingWeight.WorkbenchContrib + }, + category + }); + } + + run(accessor: ServicesAccessor) { + const state = accessor.get(ITerminalService).getFindState(); + state.change({ wholeWord: !state.wholeWord }, false); + } + }); + registerAction2(class extends Action2 { + constructor() { + const title = nls.localize('workbench.action.terminal.toggleFindCaseSensitive', "Toggle find using case sensitive"); + super({ + id: TERMINAL_COMMAND_ID.TOGGLE_FIND_CASE_SENSITIVE, + title, + f1: true, + keybinding: { + primary: KeyMod.Alt | KeyCode.KEY_C, + mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_C }, + when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), + weight: KeybindingWeight.WorkbenchContrib + }, + category + }); + } + + run(accessor: ServicesAccessor) { + const state = accessor.get(ITerminalService).getFindState(); + state.change({ matchCase: !state.matchCase }, false); + } + }); registerAction2(class extends Action2 { constructor() { super({ @@ -1295,7 +1318,7 @@ export function registerTerminalActions() { weight: KeybindingWeight.WorkbenchContrib } ], - category: TERMINAL_ACTION_CATEGORY, + category, f1: true }); } @@ -1322,7 +1345,7 @@ export function registerTerminalActions() { weight: KeybindingWeight.WorkbenchContrib } ], - category: TERMINAL_ACTION_CATEGORY, + category, f1: true }); } From 6d1f08d825f1bc8909447228874a8f6c5a7ec557 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 08:49:05 -0700 Subject: [PATCH 08/19] Move toggle esc seq logging to Action2 --- .../terminal/browser/terminal.contribution.ts | 3 +- .../terminal/browser/terminalActions.ts | 70 ++++++++----------- 2 files changed, 31 insertions(+), 42 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index f0569903bbc..24923a5387a 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -19,7 +19,7 @@ import * as panel from 'vs/workbench/browser/panel'; import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; -import { registerTerminalActions, ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleEscapeSequenceLoggingAction, ToggleTerminalAction, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { registerTerminalActions, ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; import { KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; @@ -222,7 +222,6 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(NavigationMod }, ContextKeyExpr.or(ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED), ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED))), 'Terminal: Focus Next Line (Navigation Mode)', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(SelectToPreviousLineAction, SelectToPreviousLineAction.ID, SelectToPreviousLineAction.LABEL), 'Terminal: Select To Previous Line', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(SelectToNextLineAction, SelectToNextLineAction.ID, SelectToNextLineAction.LABEL), 'Terminal: Select To Next Line', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ToggleEscapeSequenceLoggingAction, ToggleEscapeSequenceLoggingAction.ID, ToggleEscapeSequenceLoggingAction.LABEL), 'Terminal: Toggle Escape Sequence Logging', category); registerTerminalActions(); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 1d8b775d521..167efdabbb8 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -1106,28 +1106,23 @@ export class SelectToNextLineAction extends Action { } } - -export class ToggleEscapeSequenceLoggingAction extends Action { - public static readonly ID = TERMINAL_COMMAND_ID.TOGGLE_ESCAPE_SEQUENCE_LOGGING; - public static readonly LABEL = nls.localize('workbench.action.terminal.toggleEscapeSequenceLogging', "Toggle Escape Sequence Logging"); - - constructor( - id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService - ) { - super(id, label); - } - - public run(): Promise { - const instance = this.terminalService.getActiveInstance(); - if (instance) { - instance.toggleEscapeSequenceLogging(); - } - return Promise.resolve(undefined); - } -} - export function registerTerminalActions() { + const category = TERMINAL_ACTION_CATEGORY; + + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.TOGGLE_ESCAPE_SEQUENCE_LOGGING, + title: nls.localize('workbench.action.terminal.toggleEscapeSequenceLogging', "Toggle Escape Sequence Logging"), + f1: true, + category + }); + } + + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).getActiveInstance()?.toggleEscapeSequenceLogging(); + } + }); registerAction2(class extends Action2 { constructor() { const title = nls.localize('workbench.action.terminal.sendSequence', "Send Custom Sequence To Terminal"); @@ -1232,22 +1227,19 @@ export function registerTerminalActions() { terminalInstance.setTitle(args.name, TitleEventSource.Api); } }); - - const category = TERMINAL_ACTION_CATEGORY; registerAction2(class extends Action2 { constructor() { - const title = nls.localize('workbench.action.terminal.toggleFindRegex', "Toggle find using regex"); super({ id: TERMINAL_COMMAND_ID.TOGGLE_FIND_REGEX, - title, + title: nls.localize('workbench.action.terminal.toggleFindRegex', "Toggle find using regex"), f1: true, + category, keybinding: { primary: KeyMod.Alt | KeyCode.KEY_R, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_R }, when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), weight: KeybindingWeight.WorkbenchContrib - }, - category + } }); } @@ -1258,18 +1250,17 @@ export function registerTerminalActions() { }); registerAction2(class extends Action2 { constructor() { - const title = nls.localize('workbench.action.terminal.toggleFindWholeWord', "Toggle find using whole word"); super({ id: TERMINAL_COMMAND_ID.TOGGLE_FIND_WHOLE_WORD, - title, + title: nls.localize('workbench.action.terminal.toggleFindWholeWord', "Toggle find using whole word"), f1: true, + category, keybinding: { primary: KeyMod.Alt | KeyCode.KEY_W, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_W }, when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), weight: KeybindingWeight.WorkbenchContrib }, - category }); } @@ -1280,18 +1271,17 @@ export function registerTerminalActions() { }); registerAction2(class extends Action2 { constructor() { - const title = nls.localize('workbench.action.terminal.toggleFindCaseSensitive', "Toggle find using case sensitive"); super({ id: TERMINAL_COMMAND_ID.TOGGLE_FIND_CASE_SENSITIVE, - title, + title: nls.localize('workbench.action.terminal.toggleFindCaseSensitive', "Toggle find using case sensitive"), f1: true, + category, keybinding: { primary: KeyMod.Alt | KeyCode.KEY_C, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_C }, when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), weight: KeybindingWeight.WorkbenchContrib - }, - category + } }); } @@ -1305,6 +1295,8 @@ export function registerTerminalActions() { super({ id: TERMINAL_COMMAND_ID.FIND_NEXT, title: nls.localize('workbench.action.terminal.findNext', "Find next"), + f1: true, + category, keybinding: [ { primary: KeyCode.F3, @@ -1317,9 +1309,7 @@ export function registerTerminalActions() { when: KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, weight: KeybindingWeight.WorkbenchContrib } - ], - category, - f1: true + ] }); } @@ -1332,6 +1322,8 @@ export function registerTerminalActions() { super({ id: TERMINAL_COMMAND_ID.FIND_PREVIOUS, title: nls.localize('workbench.action.terminal.findPrevious', "Find previous"), + f1: true, + category, keybinding: [ { primary: KeyMod.Shift | KeyCode.F3, @@ -1344,9 +1336,7 @@ export function registerTerminalActions() { when: KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, weight: KeybindingWeight.WorkbenchContrib } - ], - category, - f1: true + ] }); } From 61a47377f35210cf2368898262b3c07d09f1804d Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 08:49:26 -0700 Subject: [PATCH 09/19] Import localize directly --- .../terminal/browser/terminalActions.ts | 136 +++++++++--------- 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 167efdabbb8..4b9a46f4ea1 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as nls from 'vs/nls'; import { Action, IAction } from 'vs/base/common/actions'; import { EndOfLinePreference } from 'vs/editor/common/model'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; @@ -36,6 +35,7 @@ import { addClass } from 'vs/base/browser/dom'; import { selectBorder } from 'vs/platform/theme/common/colorRegistry'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { localize } from 'vs/nls'; async function getCwdForSplit(configHelper: ITerminalConfigHelper, instance: ITerminalInstance, folders?: IWorkspaceFolder[], commandService?: ICommandService): Promise { switch (configHelper.config.splitCwd) { @@ -46,7 +46,7 @@ async function getCwdForSplit(configHelper: ITerminalConfigHelper, instance: ITe } else if (folders.length > 1) { // Only choose a path when there's more than 1 folder const options: IPickOptions = { - placeHolder: nls.localize('workbench.action.terminal.newWorkspacePlaceholder', "Select current working directory for new terminal") + placeHolder: localize('workbench.action.terminal.newWorkspacePlaceholder', "Select current working directory for new terminal") }; const workspace = await commandService.executeCommand(PICK_WORKSPACE_FOLDER_COMMAND_ID, [options]); if (!workspace) { @@ -67,7 +67,7 @@ async function getCwdForSplit(configHelper: ITerminalConfigHelper, instance: ITe export class ToggleTerminalAction extends ToggleViewAction { public static readonly ID = TERMINAL_COMMAND_ID.TOGGLE; - public static readonly LABEL = nls.localize('workbench.action.terminal.toggleTerminal', "Toggle Integrated Terminal"); + public static readonly LABEL = localize('workbench.action.terminal.toggleTerminal', "Toggle Integrated Terminal"); constructor( id: string, label: string, @@ -97,8 +97,8 @@ export class ToggleTerminalAction extends ToggleViewAction { export class KillTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.KILL; - public static readonly LABEL = nls.localize('workbench.action.terminal.kill', "Kill the Active Terminal Instance"); - public static readonly PANEL_LABEL = nls.localize('workbench.action.terminal.kill.short', "Kill Terminal"); + public static readonly LABEL = localize('workbench.action.terminal.kill', "Kill the Active Terminal Instance"); + public static readonly PANEL_LABEL = localize('workbench.action.terminal.kill.short', "Kill Terminal"); constructor( id: string, label: string, @@ -126,8 +126,8 @@ export class KillTerminalAction extends Action { export class CopyTerminalSelectionAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.COPY_SELECTION; - public static readonly LABEL = nls.localize('workbench.action.terminal.copySelection', "Copy Selection"); - public static readonly SHORT_LABEL = nls.localize('workbench.action.terminal.copySelection.short', "Copy"); + public static readonly LABEL = localize('workbench.action.terminal.copySelection', "Copy Selection"); + public static readonly SHORT_LABEL = localize('workbench.action.terminal.copySelection.short', "Copy"); constructor( id: string, label: string, @@ -148,7 +148,7 @@ export class CopyTerminalSelectionAction extends Action { export class SelectAllTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SELECT_ALL; - public static readonly LABEL = nls.localize('workbench.action.terminal.selectAll', "Select All"); + public static readonly LABEL = localize('workbench.action.terminal.selectAll', "Select All"); constructor( id: string, label: string, @@ -185,8 +185,8 @@ export const terminalSendSequenceCommand = (accessor: ServicesAccessor, args: { export class CreateNewTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.NEW; - public static readonly LABEL = nls.localize('workbench.action.terminal.new', "Create New Integrated Terminal"); - public static readonly SHORT_LABEL = nls.localize('workbench.action.terminal.new.short', "New Terminal"); + public static readonly LABEL = localize('workbench.action.terminal.new', "Create New Integrated Terminal"); + public static readonly SHORT_LABEL = localize('workbench.action.terminal.new.short', "New Terminal"); constructor( id: string, label: string, @@ -215,7 +215,7 @@ export class CreateNewTerminalAction extends Action { instance = this.terminalService.createTerminal(undefined); } else { const options: IPickOptions = { - placeHolder: nls.localize('workbench.action.terminal.newWorkspacePlaceholder', "Select current working directory for new terminal") + placeHolder: localize('workbench.action.terminal.newWorkspacePlaceholder', "Select current working directory for new terminal") }; const workspace = await this.commandService.executeCommand(PICK_WORKSPACE_FOLDER_COMMAND_ID, [options]); if (!workspace) { @@ -232,7 +232,7 @@ export class CreateNewTerminalAction extends Action { export class CreateNewInActiveWorkspaceTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.NEW_IN_ACTIVE_WORKSPACE; - public static readonly LABEL = nls.localize('workbench.action.terminal.newInActiveWorkspace', "Create New Integrated Terminal (In Active Workspace)"); + public static readonly LABEL = localize('workbench.action.terminal.newInActiveWorkspace', "Create New Integrated Terminal (In Active Workspace)"); constructor( id: string, label: string, @@ -253,8 +253,8 @@ export class CreateNewInActiveWorkspaceTerminalAction extends Action { export class SplitTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SPLIT; - public static readonly LABEL = nls.localize('workbench.action.terminal.split', "Split Terminal"); - public static readonly SHORT_LABEL = nls.localize('workbench.action.terminal.split.short', "Split"); + public static readonly LABEL = localize('workbench.action.terminal.split', "Split Terminal"); + public static readonly SHORT_LABEL = localize('workbench.action.terminal.split.short', "Split"); public static readonly HORIZONTAL_CLASS = 'terminal-action codicon-split-horizontal'; public static readonly VERTICAL_CLASS = 'terminal-action codicon-split-vertical'; @@ -283,7 +283,7 @@ export class SplitTerminalAction extends Action { export class SplitInActiveWorkspaceTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SPLIT_IN_ACTIVE_WORKSPACE; - public static readonly LABEL = nls.localize('workbench.action.terminal.splitInActiveWorkspace', "Split Terminal (In Active Workspace)"); + public static readonly LABEL = localize('workbench.action.terminal.splitInActiveWorkspace', "Split Terminal (In Active Workspace)"); constructor( id: string, label: string, @@ -305,7 +305,7 @@ export class SplitInActiveWorkspaceTerminalAction extends Action { export class FocusPreviousPaneTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.FOCUS_PREVIOUS_PANE; - public static readonly LABEL = nls.localize('workbench.action.terminal.focusPreviousPane', "Focus Previous Pane"); + public static readonly LABEL = localize('workbench.action.terminal.focusPreviousPane', "Focus Previous Pane"); constructor( id: string, label: string, @@ -326,7 +326,7 @@ export class FocusPreviousPaneTerminalAction extends Action { export class FocusNextPaneTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.FOCUS_NEXT_PANE; - public static readonly LABEL = nls.localize('workbench.action.terminal.focusNextPane', "Focus Next Pane"); + public static readonly LABEL = localize('workbench.action.terminal.focusNextPane', "Focus Next Pane"); constructor( id: string, label: string, @@ -365,7 +365,7 @@ export abstract class BaseFocusDirectionTerminalAction extends Action { export class ResizePaneLeftTerminalAction extends BaseFocusDirectionTerminalAction { public static readonly ID = TERMINAL_COMMAND_ID.RESIZE_PANE_LEFT; - public static readonly LABEL = nls.localize('workbench.action.terminal.resizePaneLeft', "Resize Pane Left"); + public static readonly LABEL = localize('workbench.action.terminal.resizePaneLeft', "Resize Pane Left"); constructor( id: string, label: string, @@ -377,7 +377,7 @@ export class ResizePaneLeftTerminalAction extends BaseFocusDirectionTerminalActi export class ResizePaneRightTerminalAction extends BaseFocusDirectionTerminalAction { public static readonly ID = TERMINAL_COMMAND_ID.RESIZE_PANE_RIGHT; - public static readonly LABEL = nls.localize('workbench.action.terminal.resizePaneRight', "Resize Pane Right"); + public static readonly LABEL = localize('workbench.action.terminal.resizePaneRight', "Resize Pane Right"); constructor( id: string, label: string, @@ -389,7 +389,7 @@ export class ResizePaneRightTerminalAction extends BaseFocusDirectionTerminalAct export class ResizePaneUpTerminalAction extends BaseFocusDirectionTerminalAction { public static readonly ID = TERMINAL_COMMAND_ID.RESIZE_PANE_UP; - public static readonly LABEL = nls.localize('workbench.action.terminal.resizePaneUp', "Resize Pane Up"); + public static readonly LABEL = localize('workbench.action.terminal.resizePaneUp', "Resize Pane Up"); constructor( id: string, label: string, @@ -401,7 +401,7 @@ export class ResizePaneUpTerminalAction extends BaseFocusDirectionTerminalAction export class ResizePaneDownTerminalAction extends BaseFocusDirectionTerminalAction { public static readonly ID = TERMINAL_COMMAND_ID.RESIZE_PANE_DOWN; - public static readonly LABEL = nls.localize('workbench.action.terminal.resizePaneDown', "Resize Pane Down"); + public static readonly LABEL = localize('workbench.action.terminal.resizePaneDown', "Resize Pane Down"); constructor( id: string, label: string, @@ -414,7 +414,7 @@ export class ResizePaneDownTerminalAction extends BaseFocusDirectionTerminalActi export class FocusActiveTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.FOCUS; - public static readonly LABEL = nls.localize('workbench.action.terminal.focus', "Focus Terminal"); + public static readonly LABEL = localize('workbench.action.terminal.focus', "Focus Terminal"); constructor( id: string, label: string, @@ -436,7 +436,7 @@ export class FocusActiveTerminalAction extends Action { export class FocusNextTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.FOCUS_NEXT; - public static readonly LABEL = nls.localize('workbench.action.terminal.focusNext', "Focus Next Terminal"); + public static readonly LABEL = localize('workbench.action.terminal.focusNext', "Focus Next Terminal"); constructor( id: string, label: string, @@ -454,7 +454,7 @@ export class FocusNextTerminalAction extends Action { export class FocusPreviousTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.FOCUS_PREVIOUS; - public static readonly LABEL = nls.localize('workbench.action.terminal.focusPrevious', "Focus Previous Terminal"); + public static readonly LABEL = localize('workbench.action.terminal.focusPrevious', "Focus Previous Terminal"); constructor( id: string, label: string, @@ -472,8 +472,8 @@ export class FocusPreviousTerminalAction extends Action { export class TerminalPasteAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.PASTE; - public static readonly LABEL = nls.localize('workbench.action.terminal.paste', "Paste into Active Terminal"); - public static readonly SHORT_LABEL = nls.localize('workbench.action.terminal.paste.short', "Paste"); + public static readonly LABEL = localize('workbench.action.terminal.paste', "Paste into Active Terminal"); + public static readonly SHORT_LABEL = localize('workbench.action.terminal.paste.short', "Paste"); constructor( id: string, label: string, @@ -493,7 +493,7 @@ export class TerminalPasteAction extends Action { export class SelectDefaultShellWindowsTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SELECT_DEFAULT_SHELL; - public static readonly LABEL = nls.localize('workbench.action.terminal.selectDefaultShell', "Select Default Shell"); + public static readonly LABEL = localize('workbench.action.terminal.selectDefaultShell', "Select Default Shell"); constructor( id: string, label: string, @@ -510,7 +510,7 @@ export class SelectDefaultShellWindowsTerminalAction extends Action { export class RunSelectedTextInTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.RUN_SELECTED_TEXT; - public static readonly LABEL = nls.localize('workbench.action.terminal.runSelectedText', "Run Selected Text In Active Terminal"); + public static readonly LABEL = localize('workbench.action.terminal.runSelectedText', "Run Selected Text In Active Terminal"); constructor( id: string, label: string, @@ -545,7 +545,7 @@ export class RunSelectedTextInTerminalAction extends Action { export class RunActiveFileInTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.RUN_ACTIVE_FILE; - public static readonly LABEL = nls.localize('workbench.action.terminal.runActiveFile', "Run Active File In Active Terminal"); + public static readonly LABEL = localize('workbench.action.terminal.runActiveFile', "Run Active File In Active Terminal"); constructor( id: string, label: string, @@ -569,7 +569,7 @@ export class RunActiveFileInTerminalAction extends Action { } const uri = editor.getModel().uri; if (uri.scheme !== 'file') { - this.notificationService.warn(nls.localize('workbench.action.terminal.runActiveFile.noFile', 'Only files on disk can be run in the terminal')); + this.notificationService.warn(localize('workbench.action.terminal.runActiveFile.noFile', 'Only files on disk can be run in the terminal')); return Promise.resolve(undefined); } @@ -583,7 +583,7 @@ export class RunActiveFileInTerminalAction extends Action { export class SwitchTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SWITCH_TERMINAL; - public static readonly LABEL = nls.localize('workbench.action.terminal.switchTerminal', "Switch Terminal"); + public static readonly LABEL = localize('workbench.action.terminal.switchTerminal', "Switch Terminal"); constructor( id: string, label: string, @@ -620,7 +620,7 @@ export class SwitchTerminalActionViewItem extends SelectActionViewItem { @IThemeService private readonly themeService: IThemeService, @IContextViewService contextViewService: IContextViewService ) { - super(null, action, getTerminalSelectOpenItems(terminalService), terminalService.activeTabIndex, contextViewService, { ariaLabel: nls.localize('terminals', 'Open Terminals.') }); + super(null, action, getTerminalSelectOpenItems(terminalService), terminalService.activeTabIndex, contextViewService, { ariaLabel: localize('terminals', 'Open Terminals.') }); this._register(terminalService.onInstancesChanged(this._updateItems, this)); this._register(terminalService.onActiveTabChanged(this._updateItems, this)); @@ -652,7 +652,7 @@ function getTerminalSelectOpenItems(terminalService: ITerminalService): ISelectO export class ScrollDownTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_DOWN_LINE; - public static readonly LABEL = nls.localize('workbench.action.terminal.scrollDown', "Scroll Down (Line)"); + public static readonly LABEL = localize('workbench.action.terminal.scrollDown', "Scroll Down (Line)"); constructor( id: string, label: string, @@ -673,7 +673,7 @@ export class ScrollDownTerminalAction extends Action { export class ScrollDownPageTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_DOWN_PAGE; - public static readonly LABEL = nls.localize('workbench.action.terminal.scrollDownPage', "Scroll Down (Page)"); + public static readonly LABEL = localize('workbench.action.terminal.scrollDownPage', "Scroll Down (Page)"); constructor( id: string, label: string, @@ -694,7 +694,7 @@ export class ScrollDownPageTerminalAction extends Action { export class ScrollToBottomTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_TO_BOTTOM; - public static readonly LABEL = nls.localize('workbench.action.terminal.scrollToBottom', "Scroll to Bottom"); + public static readonly LABEL = localize('workbench.action.terminal.scrollToBottom', "Scroll to Bottom"); constructor( id: string, label: string, @@ -715,7 +715,7 @@ export class ScrollToBottomTerminalAction extends Action { export class ScrollUpTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_UP_LINE; - public static readonly LABEL = nls.localize('workbench.action.terminal.scrollUp', "Scroll Up (Line)"); + public static readonly LABEL = localize('workbench.action.terminal.scrollUp', "Scroll Up (Line)"); constructor( id: string, label: string, @@ -736,7 +736,7 @@ export class ScrollUpTerminalAction extends Action { export class ScrollUpPageTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_UP_PAGE; - public static readonly LABEL = nls.localize('workbench.action.terminal.scrollUpPage', "Scroll Up (Page)"); + public static readonly LABEL = localize('workbench.action.terminal.scrollUpPage', "Scroll Up (Page)"); constructor( id: string, label: string, @@ -757,7 +757,7 @@ export class ScrollUpPageTerminalAction extends Action { export class ScrollToTopTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_TO_TOP; - public static readonly LABEL = nls.localize('workbench.action.terminal.scrollToTop', "Scroll to Top"); + public static readonly LABEL = localize('workbench.action.terminal.scrollToTop', "Scroll to Top"); constructor( id: string, label: string, @@ -778,7 +778,7 @@ export class ScrollToTopTerminalAction extends Action { export class NavigationModeExitTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.NAVIGATION_MODE_EXIT; - public static readonly LABEL = nls.localize('workbench.action.terminal.navigationModeExit', "Exit Navigation Mode"); + public static readonly LABEL = localize('workbench.action.terminal.navigationModeExit', "Exit Navigation Mode"); constructor( id: string, label: string, @@ -801,7 +801,7 @@ export class NavigationModeExitTerminalAction extends Action { export class NavigationModeFocusPreviousTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_PREVIOUS; - public static readonly LABEL = nls.localize('workbench.action.terminal.navigationModeFocusPrevious', "Focus Previous Line (Navigation Mode)"); + public static readonly LABEL = localize('workbench.action.terminal.navigationModeFocusPrevious', "Focus Previous Line (Navigation Mode)"); constructor( id: string, label: string, @@ -822,7 +822,7 @@ export class NavigationModeFocusPreviousTerminalAction extends Action { export class NavigationModeFocusNextTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_NEXT; - public static readonly LABEL = nls.localize('workbench.action.terminal.navigationModeFocusNext', "Focus Next Line (Navigation Mode)"); + public static readonly LABEL = localize('workbench.action.terminal.navigationModeFocusNext', "Focus Next Line (Navigation Mode)"); constructor( id: string, label: string, @@ -843,7 +843,7 @@ export class NavigationModeFocusNextTerminalAction extends Action { export class ClearTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.CLEAR; - public static readonly LABEL = nls.localize('workbench.action.terminal.clear', "Clear"); + public static readonly LABEL = localize('workbench.action.terminal.clear', "Clear"); constructor( id: string, label: string, @@ -865,7 +865,7 @@ export class ClearTerminalAction extends Action { export class ClearSelectionTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.CLEAR_SELECTION; - public static readonly LABEL = nls.localize('workbench.action.terminal.clearSelection', "Clear Selection"); + public static readonly LABEL = localize('workbench.action.terminal.clearSelection', "Clear Selection"); constructor( id: string, label: string, @@ -886,7 +886,7 @@ export class ClearSelectionTerminalAction extends Action { export class ManageWorkspaceShellPermissionsTerminalCommand extends Action { public static readonly ID = TERMINAL_COMMAND_ID.MANAGE_WORKSPACE_SHELL_PERMISSIONS; - public static readonly LABEL = nls.localize('workbench.action.terminal.manageWorkspaceShellPermissions', "Manage Workspace Shell Permissions"); + public static readonly LABEL = localize('workbench.action.terminal.manageWorkspaceShellPermissions', "Manage Workspace Shell Permissions"); constructor( id: string, label: string, @@ -903,7 +903,7 @@ export class ManageWorkspaceShellPermissionsTerminalCommand extends Action { export class RenameTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.RENAME; - public static readonly LABEL = nls.localize('workbench.action.terminal.rename', "Rename"); + public static readonly LABEL = localize('workbench.action.terminal.rename', "Rename"); constructor( id: string, label: string, @@ -920,7 +920,7 @@ export class RenameTerminalAction extends Action { } const name = await this.quickInputService.input({ value: terminalInstance.title, - prompt: nls.localize('workbench.action.terminal.rename.prompt', "Enter terminal name"), + prompt: localize('workbench.action.terminal.rename.prompt', "Enter terminal name"), }); if (name) { terminalInstance.setTitle(name, TitleEventSource.Api); @@ -931,7 +931,7 @@ export class RenameTerminalAction extends Action { export class FocusTerminalFindWidgetAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.FIND_WIDGET_FOCUS; - public static readonly LABEL = nls.localize('workbench.action.terminal.focusFindWidget', "Focus Find Widget"); + public static readonly LABEL = localize('workbench.action.terminal.focusFindWidget', "Focus Find Widget"); constructor( id: string, label: string, @@ -948,7 +948,7 @@ export class FocusTerminalFindWidgetAction extends Action { export class HideTerminalFindWidgetAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.FIND_WIDGET_HIDE; - public static readonly LABEL = nls.localize('workbench.action.terminal.hideFindWidget', "Hide Find Widget"); + public static readonly LABEL = localize('workbench.action.terminal.hideFindWidget', "Hide Find Widget"); constructor( id: string, label: string, @@ -965,7 +965,7 @@ export class HideTerminalFindWidgetAction extends Action { export class QuickAccessTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.QUICK_OPEN_TERM; - public static readonly LABEL = nls.localize('quickAccessTerminal', "Switch Active Terminal"); + public static readonly LABEL = localize('quickAccessTerminal', "Switch Active Terminal"); constructor( id: string, @@ -982,7 +982,7 @@ export class QuickAccessTerminalAction extends Action { export class ScrollToPreviousCommandAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_TO_PREVIOUS_COMMAND; - public static readonly LABEL = nls.localize('workbench.action.terminal.scrollToPreviousCommand', "Scroll To Previous Command"); + public static readonly LABEL = localize('workbench.action.terminal.scrollToPreviousCommand', "Scroll To Previous Command"); constructor( id: string, label: string, @@ -1003,7 +1003,7 @@ export class ScrollToPreviousCommandAction extends Action { export class ScrollToNextCommandAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_TO_NEXT_COMMAND; - public static readonly LABEL = nls.localize('workbench.action.terminal.scrollToNextCommand', "Scroll To Next Command"); + public static readonly LABEL = localize('workbench.action.terminal.scrollToNextCommand', "Scroll To Next Command"); constructor( id: string, label: string, @@ -1024,7 +1024,7 @@ export class ScrollToNextCommandAction extends Action { export class SelectToPreviousCommandAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_COMMAND; - public static readonly LABEL = nls.localize('workbench.action.terminal.selectToPreviousCommand', "Select To Previous Command"); + public static readonly LABEL = localize('workbench.action.terminal.selectToPreviousCommand', "Select To Previous Command"); constructor( id: string, label: string, @@ -1045,7 +1045,7 @@ export class SelectToPreviousCommandAction extends Action { export class SelectToNextCommandAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SELECT_TO_NEXT_COMMAND; - public static readonly LABEL = nls.localize('workbench.action.terminal.selectToNextCommand', "Select To Next Command"); + public static readonly LABEL = localize('workbench.action.terminal.selectToNextCommand', "Select To Next Command"); constructor( id: string, label: string, @@ -1066,7 +1066,7 @@ export class SelectToNextCommandAction extends Action { export class SelectToPreviousLineAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_LINE; - public static readonly LABEL = nls.localize('workbench.action.terminal.selectToPreviousLine', "Select To Previous Line"); + public static readonly LABEL = localize('workbench.action.terminal.selectToPreviousLine', "Select To Previous Line"); constructor( id: string, label: string, @@ -1087,7 +1087,7 @@ export class SelectToPreviousLineAction extends Action { export class SelectToNextLineAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SELECT_TO_NEXT_LINE; - public static readonly LABEL = nls.localize('workbench.action.terminal.selectToNextLine', "Select To Next Line"); + public static readonly LABEL = localize('workbench.action.terminal.selectToNextLine', "Select To Next Line"); constructor( id: string, label: string, @@ -1113,7 +1113,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.TOGGLE_ESCAPE_SEQUENCE_LOGGING, - title: nls.localize('workbench.action.terminal.toggleEscapeSequenceLogging', "Toggle Escape Sequence Logging"), + title: localize('workbench.action.terminal.toggleEscapeSequenceLogging', "Toggle Escape Sequence Logging"), f1: true, category }); @@ -1125,7 +1125,7 @@ export function registerTerminalActions() { }); registerAction2(class extends Action2 { constructor() { - const title = nls.localize('workbench.action.terminal.sendSequence', "Send Custom Sequence To Terminal"); + const title = localize('workbench.action.terminal.sendSequence', "Send Custom Sequence To Terminal"); super({ id: TERMINAL_COMMAND_ID.SEND_SEQUENCE, title, @@ -1151,7 +1151,7 @@ export function registerTerminalActions() { }); registerAction2(class extends Action2 { constructor() { - const title = nls.localize('workbench.action.terminal.newWithCwd', "Create New Integrated Terminal Starting in a Custom Working Directory"); + const title = localize('workbench.action.terminal.newWithCwd', "Create New Integrated Terminal Starting in a Custom Working Directory"); super({ id: TERMINAL_COMMAND_ID.NEW_WITH_CWD, title, @@ -1164,7 +1164,7 @@ export function registerTerminalActions() { required: ['cwd'], properties: { cwd: { - description: nls.localize('workbench.action.terminal.newWithCwd.cwd', "The directory to start the terminal at"), + description: localize('workbench.action.terminal.newWithCwd.cwd', "The directory to start the terminal at"), type: 'string' } }, @@ -1186,7 +1186,7 @@ export function registerTerminalActions() { }); registerAction2(class extends Action2 { constructor() { - const title = nls.localize('workbench.action.terminal.renameWithArg', "Rename the Currently Active Terminal"); + const title = localize('workbench.action.terminal.renameWithArg', "Rename the Currently Active Terminal"); super({ id: TERMINAL_COMMAND_ID.RENAME_WITH_ARG, title, @@ -1199,7 +1199,7 @@ export function registerTerminalActions() { required: ['name'], properties: { name: { - description: nls.localize('workbench.action.terminal.renameWithArg.name', "The new name for the terminal"), + description: localize('workbench.action.terminal.renameWithArg.name', "The new name for the terminal"), type: 'string', minLength: 1 } @@ -1215,12 +1215,12 @@ export function registerTerminalActions() { const terminalInstance = accessor.get(ITerminalService).getActiveInstance(); if (!terminalInstance) { - notificationService.warn(nls.localize('workbench.action.terminal.renameWithArg.noTerminal', "No active terminal to rename")); + notificationService.warn(localize('workbench.action.terminal.renameWithArg.noTerminal', "No active terminal to rename")); return; } if (!args || !args.name) { - notificationService.warn(nls.localize('workbench.action.terminal.renameWithArg.noName', "No name argument provided")); + notificationService.warn(localize('workbench.action.terminal.renameWithArg.noName', "No name argument provided")); return; } @@ -1231,7 +1231,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.TOGGLE_FIND_REGEX, - title: nls.localize('workbench.action.terminal.toggleFindRegex', "Toggle find using regex"), + title: localize('workbench.action.terminal.toggleFindRegex', "Toggle find using regex"), f1: true, category, keybinding: { @@ -1252,7 +1252,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.TOGGLE_FIND_WHOLE_WORD, - title: nls.localize('workbench.action.terminal.toggleFindWholeWord', "Toggle find using whole word"), + title: localize('workbench.action.terminal.toggleFindWholeWord', "Toggle find using whole word"), f1: true, category, keybinding: { @@ -1273,7 +1273,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.TOGGLE_FIND_CASE_SENSITIVE, - title: nls.localize('workbench.action.terminal.toggleFindCaseSensitive', "Toggle find using case sensitive"), + title: localize('workbench.action.terminal.toggleFindCaseSensitive', "Toggle find using case sensitive"), f1: true, category, keybinding: { @@ -1294,7 +1294,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.FIND_NEXT, - title: nls.localize('workbench.action.terminal.findNext', "Find next"), + title: localize('workbench.action.terminal.findNext', "Find next"), f1: true, category, keybinding: [ @@ -1321,7 +1321,7 @@ export function registerTerminalActions() { constructor() { super({ id: TERMINAL_COMMAND_ID.FIND_PREVIOUS, - title: nls.localize('workbench.action.terminal.findPrevious', "Find previous"), + title: localize('workbench.action.terminal.findPrevious', "Find previous"), f1: true, category, keybinding: [ From bf27fd85f2d6f47e71a346f4cbf6e26f2c2004db Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 08:53:16 -0700 Subject: [PATCH 10/19] Convert select to prev/next line to Action2 --- .../terminal/browser/terminal.contribution.ts | 4 +- .../terminal/browser/terminalActions.ts | 78 +++++++++---------- 2 files changed, 37 insertions(+), 45 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 24923a5387a..d30d69a06b4 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -19,7 +19,7 @@ import * as panel from 'vs/workbench/browser/panel'; import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; -import { registerTerminalActions, ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToNextLineAction, SelectToPreviousCommandAction, SelectToPreviousLineAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { registerTerminalActions, ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToPreviousCommandAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; import { KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; @@ -220,8 +220,6 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(NavigationMod actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(NavigationModeFocusNextTerminalAction, NavigationModeFocusNextTerminalAction.ID, NavigationModeFocusNextTerminalAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.DownArrow }, ContextKeyExpr.or(ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED), ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED))), 'Terminal: Focus Next Line (Navigation Mode)', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(SelectToPreviousLineAction, SelectToPreviousLineAction.ID, SelectToPreviousLineAction.LABEL), 'Terminal: Select To Previous Line', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(SelectToNextLineAction, SelectToNextLineAction.ID, SelectToNextLineAction.LABEL), 'Terminal: Select To Next Line', category); registerTerminalActions(); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 4b9a46f4ea1..03038536c18 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -1064,51 +1064,45 @@ export class SelectToNextCommandAction extends Action { } } -export class SelectToPreviousLineAction extends Action { - public static readonly ID = TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_LINE; - public static readonly LABEL = localize('workbench.action.terminal.selectToPreviousLine', "Select To Previous Line"); - - constructor( - id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService - ) { - super(id, label); - } - - public run(): Promise { - const instance = this.terminalService.getActiveInstance(); - if (instance && instance.commandTracker) { - instance.commandTracker.selectToPreviousLine(); - instance.focus(); - } - return Promise.resolve(undefined); - } -} - -export class SelectToNextLineAction extends Action { - public static readonly ID = TERMINAL_COMMAND_ID.SELECT_TO_NEXT_LINE; - public static readonly LABEL = localize('workbench.action.terminal.selectToNextLine', "Select To Next Line"); - - constructor( - id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService - ) { - super(id, label); - } - - public run(): Promise { - const instance = this.terminalService.getActiveInstance(); - if (instance && instance.commandTracker) { - instance.commandTracker.selectToNextLine(); - instance.focus(); - } - return Promise.resolve(undefined); - } -} - export function registerTerminalActions() { const category = TERMINAL_ACTION_CATEGORY; + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_LINE, + title: localize('workbench.action.terminal.selectToPreviousLine', "Select To Previous Line"), + f1: true, + category + }); + } + + run(accessor: ServicesAccessor) { + const instance = accessor.get(ITerminalService).getActiveInstance(); + if (instance && instance.commandTracker) { + instance.commandTracker.selectToPreviousLine(); + instance.focus(); + } + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.SELECT_TO_NEXT_LINE, + title: localize('workbench.action.terminal.selectToNextLine', "Select To Next Line"), + f1: true, + category + }); + } + + run(accessor: ServicesAccessor) { + const instance = accessor.get(ITerminalService).getActiveInstance(); + if (instance && instance.commandTracker) { + instance.commandTracker.selectToNextLine(); + instance.focus(); + } + } + }); registerAction2(class extends Action2 { constructor() { super({ From eb42c564baacf02e365c0bacca3d1f0ef260106a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 08:57:42 -0700 Subject: [PATCH 11/19] Convert select to prev/next cmd to Action2 --- .../terminal/browser/terminal.contribution.ts | 10 +-- .../terminal/browser/terminalActions.ts | 88 ++++++++++--------- 2 files changed, 47 insertions(+), 51 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index d30d69a06b4..3aca3b0bf1a 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -19,7 +19,7 @@ import * as panel from 'vs/workbench/browser/panel'; import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; -import { registerTerminalActions, ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SelectToNextCommandAction, SelectToPreviousCommandAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { registerTerminalActions, ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; import { KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; @@ -203,14 +203,6 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ScrollToNextC primary: 0, mac: { primary: KeyMod.CtrlCmd | KeyCode.DownArrow } }, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED.negate())), 'Terminal: Scroll To Next Command', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(SelectToPreviousCommandAction, SelectToPreviousCommandAction.ID, SelectToPreviousCommandAction.LABEL, { - primary: 0, - mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.UpArrow } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Select To Previous Command', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(SelectToNextCommandAction, SelectToNextCommandAction.ID, SelectToNextCommandAction.LABEL, { - primary: 0, - mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.DownArrow } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Select To Next Command', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(NavigationModeExitTerminalAction, NavigationModeExitTerminalAction.ID, NavigationModeExitTerminalAction.LABEL, { primary: KeyCode.Escape }, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED)), 'Terminal: Exit Navigation Mode', category); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 03038536c18..af2a02d7ebc 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -1022,51 +1022,55 @@ export class ScrollToNextCommandAction extends Action { } } -export class SelectToPreviousCommandAction extends Action { - public static readonly ID = TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_COMMAND; - public static readonly LABEL = localize('workbench.action.terminal.selectToPreviousCommand', "Select To Previous Command"); - - constructor( - id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService - ) { - super(id, label); - } - - public run(): Promise { - const instance = this.terminalService.getActiveInstance(); - if (instance && instance.commandTracker) { - instance.commandTracker.selectToPreviousCommand(); - instance.focus(); - } - return Promise.resolve(undefined); - } -} - -export class SelectToNextCommandAction extends Action { - public static readonly ID = TERMINAL_COMMAND_ID.SELECT_TO_NEXT_COMMAND; - public static readonly LABEL = localize('workbench.action.terminal.selectToNextCommand', "Select To Next Command"); - - constructor( - id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService - ) { - super(id, label); - } - - public run(): Promise { - const instance = this.terminalService.getActiveInstance(); - if (instance && instance.commandTracker) { - instance.commandTracker.selectToNextCommand(); - instance.focus(); - } - return Promise.resolve(undefined); - } -} - export function registerTerminalActions() { const category = TERMINAL_ACTION_CATEGORY; + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_COMMAND, + title: localize('workbench.action.terminal.selectToPreviousCommand', "Select To Previous Command"), + f1: true, + category, + keybinding: { + mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.UpArrow }, + when: KEYBINDING_CONTEXT_TERMINAL_FOCUS, + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + + run(accessor: ServicesAccessor) { + const instance = accessor.get(ITerminalService).getActiveInstance(); + if (instance && instance.commandTracker) { + instance.commandTracker.selectToPreviousCommand(); + instance.focus(); + } + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.SELECT_TO_NEXT_COMMAND, + title: localize('workbench.action.terminal.selectToNextCommand', "Select To Next Command"), + f1: true, + category, + keybinding: { + mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.DownArrow }, + when: KEYBINDING_CONTEXT_TERMINAL_FOCUS, + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + + run(accessor: ServicesAccessor) { + const instance = accessor.get(ITerminalService).getActiveInstance(); + if (instance && instance.commandTracker) { + instance.commandTracker.selectToNextCommand(); + instance.focus(); + } + } + }); registerAction2(class extends Action2 { constructor() { super({ From 7809b75a3cb5fde73337a87447ae0674ede5c624 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 09:04:22 -0700 Subject: [PATCH 12/19] Convert scroll to next/prev command to Action2 --- .../terminal/browser/terminal.contribution.ts | 10 +-- .../terminal/browser/terminalActions.ts | 89 ++++++++++--------- 2 files changed, 48 insertions(+), 51 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 3aca3b0bf1a..31981eb1f99 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -19,7 +19,7 @@ import * as panel from 'vs/workbench/browser/panel'; import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; -import { registerTerminalActions, ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToNextCommandAction, ScrollToPreviousCommandAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { registerTerminalActions, ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; import { KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; @@ -195,14 +195,6 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ResizePaneDow primary: 0, mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.DownArrow } }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Resize Pane Down', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ScrollToPreviousCommandAction, ScrollToPreviousCommandAction.ID, ScrollToPreviousCommandAction.LABEL, { - primary: 0, - mac: { primary: KeyMod.CtrlCmd | KeyCode.UpArrow } -}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED.negate())), 'Terminal: Scroll To Previous Command', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ScrollToNextCommandAction, ScrollToNextCommandAction.ID, ScrollToNextCommandAction.LABEL, { - primary: 0, - mac: { primary: KeyMod.CtrlCmd | KeyCode.DownArrow } -}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED.negate())), 'Terminal: Scroll To Next Command', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(NavigationModeExitTerminalAction, NavigationModeExitTerminalAction.ID, NavigationModeExitTerminalAction.LABEL, { primary: KeyCode.Escape }, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED)), 'Terminal: Exit Navigation Mode', category); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index af2a02d7ebc..89c198a2d89 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -36,6 +36,7 @@ import { selectBorder } from 'vs/platform/theme/common/colorRegistry'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { localize } from 'vs/nls'; +import { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from 'vs/platform/accessibility/common/accessibility'; async function getCwdForSplit(configHelper: ITerminalConfigHelper, instance: ITerminalInstance, folders?: IWorkspaceFolder[], commandService?: ICommandService): Promise { switch (configHelper.config.splitCwd) { @@ -980,51 +981,55 @@ export class QuickAccessTerminalAction extends Action { } } -export class ScrollToPreviousCommandAction extends Action { - public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_TO_PREVIOUS_COMMAND; - public static readonly LABEL = localize('workbench.action.terminal.scrollToPreviousCommand', "Scroll To Previous Command"); - - constructor( - id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService - ) { - super(id, label); - } - - public run(): Promise { - const instance = this.terminalService.getActiveInstance(); - if (instance && instance.commandTracker) { - instance.commandTracker.scrollToPreviousCommand(); - instance.focus(); - } - return Promise.resolve(undefined); - } -} - -export class ScrollToNextCommandAction extends Action { - public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_TO_NEXT_COMMAND; - public static readonly LABEL = localize('workbench.action.terminal.scrollToNextCommand', "Scroll To Next Command"); - - constructor( - id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService - ) { - super(id, label); - } - - public run(): Promise { - const instance = this.terminalService.getActiveInstance(); - if (instance && instance.commandTracker) { - instance.commandTracker.scrollToNextCommand(); - instance.focus(); - } - return Promise.resolve(undefined); - } -} - export function registerTerminalActions() { const category = TERMINAL_ACTION_CATEGORY; + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.SCROLL_TO_PREVIOUS_COMMAND, + title: localize('workbench.action.terminal.scrollToPreviousCommand', "Scroll To Previous Command"), + f1: true, + category, + keybinding: { + mac: { primary: KeyMod.CtrlCmd | KeyCode.UpArrow }, + when: ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED.negate()), + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + + run(accessor: ServicesAccessor) { + const instance = accessor.get(ITerminalService).getActiveInstance(); + if (instance && instance.commandTracker) { + instance.commandTracker.scrollToPreviousCommand(); + instance.focus(); + } + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.SCROLL_TO_NEXT_COMMAND, + title: localize('workbench.action.terminal.scrollToNextCommand', "Scroll To Next Command"), + f1: true, + category, + keybinding: { + mac: { primary: KeyMod.CtrlCmd | KeyCode.DownArrow }, + when: ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED.negate()), + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + + run(accessor: ServicesAccessor) { + const instance = accessor.get(ITerminalService).getActiveInstance(); + if (instance && instance.commandTracker) { + instance.commandTracker.scrollToNextCommand(); + instance.focus(); + } + } + }); registerAction2(class extends Action2 { constructor() { super({ From 4b9247c1fdedd8757b080d118ed12728ae876fa2 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 09:19:52 -0700 Subject: [PATCH 13/19] Convert more commands --- .../terminal/browser/terminal.contribution.ts | 18 +- .../terminal/browser/terminalActions.ts | 236 +++++++++--------- 2 files changed, 119 insertions(+), 135 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 31981eb1f99..5966e7b65ca 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -19,9 +19,9 @@ import * as panel from 'vs/workbench/browser/panel'; import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; -import { registerTerminalActions, ClearSelectionTerminalAction, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, KillTerminalAction, QuickAccessTerminalAction, RenameTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, ManageWorkspaceShellPermissionsTerminalCommand, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { registerTerminalActions, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, KillTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; -import { KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; +import { KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { setupTerminalCommands } from 'vs/workbench/contrib/terminal/browser/terminalCommands'; import { setupTerminalMenu } from 'vs/workbench/contrib/terminal/common/terminalMenu'; @@ -86,16 +86,11 @@ Registry.as(ViewContainerExtensions.ViewsRegistry).registerViews // Register actions const actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); const category = TERMINAL_ACTION_CATEGORY; -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(QuickAccessTerminalAction, QuickAccessTerminalAction.ID, QuickAccessTerminalAction.LABEL), 'Terminal: Switch Active Terminal', nls.localize('terminal', "Terminal")); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(KillTerminalAction, KillTerminalAction.ID, KillTerminalAction.LABEL), 'Terminal: Kill the Active Terminal Instance', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(CreateNewTerminalAction, CreateNewTerminalAction.ID, CreateNewTerminalAction.LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.US_BACKTICK, mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.US_BACKTICK } }), 'Terminal: Create New Integrated Terminal', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ClearSelectionTerminalAction, ClearSelectionTerminalAction.ID, ClearSelectionTerminalAction.LABEL, { - primary: KeyCode.Escape, - linux: { primary: KeyCode.Escape } -}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE)), 'Terminal: Clear Selection', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(CreateNewInActiveWorkspaceTerminalAction, CreateNewInActiveWorkspaceTerminalAction.ID, CreateNewInActiveWorkspaceTerminalAction.LABEL), 'Terminal: Create New Integrated Terminal (In Active Workspace)', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(FocusActiveTerminalAction, FocusActiveTerminalAction.ID, FocusActiveTerminalAction.LABEL), 'Terminal: Focus Terminal', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(FocusNextTerminalAction, FocusNextTerminalAction.ID, FocusNextTerminalAction.LABEL), 'Terminal: Focus Next Terminal', category); @@ -144,15 +139,6 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ClearTerminal mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_K } }, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KeybindingWeight.WorkbenchContrib + 1), 'Terminal: Clear', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(SelectDefaultShellWindowsTerminalAction, SelectDefaultShellWindowsTerminalAction.ID, SelectDefaultShellWindowsTerminalAction.LABEL), 'Terminal: Select Default Shell', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ManageWorkspaceShellPermissionsTerminalCommand, ManageWorkspaceShellPermissionsTerminalCommand.ID, ManageWorkspaceShellPermissionsTerminalCommand.LABEL), 'Terminal: Manage Workspace Shell Permissions', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(RenameTerminalAction, RenameTerminalAction.ID, RenameTerminalAction.LABEL), 'Terminal: Rename', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(FocusTerminalFindWidgetAction, FocusTerminalFindWidgetAction.ID, FocusTerminalFindWidgetAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.KEY_F -}, ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FOCUS)), 'Terminal: Focus Find Widget', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(HideTerminalFindWidgetAction, HideTerminalFindWidgetAction.ID, HideTerminalFindWidgetAction.LABEL, { - primary: KeyCode.Escape, - secondary: [KeyMod.Shift | KeyCode.Escape] -}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE)), 'Terminal: Hide Find Widget', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(SplitTerminalAction, SplitTerminalAction.ID, SplitTerminalAction.LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_5, mac: { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 89c198a2d89..da60dd16c8c 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -6,7 +6,7 @@ import { Action, IAction } from 'vs/base/common/actions'; import { EndOfLinePreference } from 'vs/editor/common/model'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { TERMINAL_VIEW_ID, ITerminalConfigHelper, TitleEventSource, TERMINAL_COMMAND_ID, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_FOCUS } from 'vs/workbench/contrib/terminal/common/terminal'; +import { TERMINAL_VIEW_ID, ITerminalConfigHelper, TitleEventSource, TERMINAL_COMMAND_ID, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE } from 'vs/workbench/contrib/terminal/common/terminal'; import { SelectActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { attachSelectBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; @@ -863,127 +863,122 @@ export class ClearTerminalAction extends Action { } } -export class ClearSelectionTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.CLEAR_SELECTION; - public static readonly LABEL = localize('workbench.action.terminal.clearSelection', "Clear Selection"); - - constructor( - id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService - ) { - super(id, label); - } - - public run(event?: any): Promise { - const terminalInstance = this.terminalService.getActiveInstance(); - if (terminalInstance && terminalInstance.hasSelection()) { - terminalInstance.clearSelection(); - } - return Promise.resolve(undefined); - } -} - -export class ManageWorkspaceShellPermissionsTerminalCommand extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.MANAGE_WORKSPACE_SHELL_PERMISSIONS; - public static readonly LABEL = localize('workbench.action.terminal.manageWorkspaceShellPermissions', "Manage Workspace Shell Permissions"); - - constructor( - id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService - ) { - super(id, label); - } - - public async run(event?: any): Promise { - await this.terminalService.manageWorkspaceShellPermissions(); - } -} - -export class RenameTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.RENAME; - public static readonly LABEL = localize('workbench.action.terminal.rename', "Rename"); - - constructor( - id: string, label: string, - @IQuickInputService protected quickInputService: IQuickInputService, - @ITerminalService protected terminalService: ITerminalService - ) { - super(id, label); - } - - public async run(): Promise { - const terminalInstance = this.terminalService.getActiveInstance(); - if (!terminalInstance) { - return Promise.resolve(undefined); - } - const name = await this.quickInputService.input({ - value: terminalInstance.title, - prompt: localize('workbench.action.terminal.rename.prompt', "Enter terminal name"), - }); - if (name) { - terminalInstance.setTitle(name, TitleEventSource.Api); - } - } -} - -export class FocusTerminalFindWidgetAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.FIND_WIDGET_FOCUS; - public static readonly LABEL = localize('workbench.action.terminal.focusFindWidget', "Focus Find Widget"); - - constructor( - id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService - ) { - super(id, label); - } - - public run(): Promise { - return this.terminalService.focusFindWidget(); - } -} - -export class HideTerminalFindWidgetAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.FIND_WIDGET_HIDE; - public static readonly LABEL = localize('workbench.action.terminal.hideFindWidget', "Hide Find Widget"); - - constructor( - id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService - ) { - super(id, label); - } - - public run(): Promise { - return Promise.resolve(this.terminalService.hideFindWidget()); - } -} - -export class QuickAccessTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.QUICK_OPEN_TERM; - public static readonly LABEL = localize('quickAccessTerminal', "Switch Active Terminal"); - - constructor( - id: string, - label: string, - @IQuickInputService private readonly quickInputService: IQuickInputService - ) { - super(id, label); - } - - async run(): Promise { - this.quickInputService.quickAccess.show(TerminalQuickAccessProvider.PREFIX); - } -} - export function registerTerminalActions() { const category = TERMINAL_ACTION_CATEGORY; + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.CLEAR_SELECTION, + title: localize('workbench.action.terminal.clearSelection', "Clear Selection"), + f1: true, + category, + keybinding: { + primary: KeyCode.Escape, + when: ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE), + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + + run(accessor: ServicesAccessor) { + const terminalInstance = accessor.get(ITerminalService).getActiveInstance(); + if (terminalInstance && terminalInstance.hasSelection()) { + terminalInstance.clearSelection(); + } + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.MANAGE_WORKSPACE_SHELL_PERMISSIONS, + title: localize('workbench.action.terminal.manageWorkspaceShellPermissions', "Manage Workspace Shell Permissions"), + f1: true, + category + }); + } + + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).manageWorkspaceShellPermissions(); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.RENAME, + title: localize('workbench.action.terminal.rename', "Rename"), + f1: true, + category + }); + } + + async run(accessor: ServicesAccessor) { + const terminalInstance = accessor.get(ITerminalService).getActiveInstance(); + if (!terminalInstance) { + return; + } + const name = await accessor.get(IQuickInputService).input({ + value: terminalInstance.title, + prompt: localize('workbench.action.terminal.rename.prompt', "Enter terminal name"), + }); + if (name) { + terminalInstance.setTitle(name, TitleEventSource.Api); + } + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.FIND_WIDGET_FOCUS, + title: localize('workbench.action.terminal.focusFindWidget', "Focus Find Widget"), + f1: true, + category, + keybinding: { + primary: KeyMod.CtrlCmd | KeyCode.KEY_F, + when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FOCUS), + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).focusFindWidget(); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.FIND_WIDGET_HIDE, + title: localize('workbench.action.terminal.hideFindWidget', "Hide Find Widget"), + f1: true, + category, + keybinding: { + primary: KeyCode.Escape, + secondary: [KeyMod.Shift | KeyCode.Escape], + when: ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE), + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).hideFindWidget(); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.QUICK_OPEN_TERM, + title: localize('quickAccessTerminal', "Switch Active Terminal"), + f1: true, + category + }); + } + + run(accessor: ServicesAccessor) { + accessor.get(IQuickInputService).quickAccess.show(TerminalQuickAccessProvider.PREFIX); + } + }); registerAction2(class extends Action2 { constructor() { super({ @@ -1132,6 +1127,7 @@ export function registerTerminalActions() { super({ id: TERMINAL_COMMAND_ID.SEND_SEQUENCE, title, + category, description: { description: title, args: [{ @@ -1158,6 +1154,7 @@ export function registerTerminalActions() { super({ id: TERMINAL_COMMAND_ID.NEW_WITH_CWD, title, + category, description: { description: title, args: [{ @@ -1193,6 +1190,7 @@ export function registerTerminalActions() { super({ id: TERMINAL_COMMAND_ID.RENAME_WITH_ARG, title, + category, description: { description: title, args: [{ From aa8b5ee8c56c719eebff94cbda12c328ff36f9a6 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 09:32:07 -0700 Subject: [PATCH 14/19] Reduce terminal null checks in terminalActions --- .../terminal/browser/terminal.contribution.ts | 2 + .../contrib/terminal/browser/terminal.ts | 7 ++ .../terminal/browser/terminalActions.ts | 90 ++++++++----------- .../terminal/browser/terminalService.ts | 7 ++ 4 files changed, 53 insertions(+), 53 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 5966e7b65ca..8582f4a81aa 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -134,6 +134,8 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ScrollToTopTe primary: KeyMod.CtrlCmd | KeyCode.Home, linux: { primary: KeyMod.Shift | KeyCode.Home } }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll to Top', category); +// Weight is higher than work workbench contributions so the keybinding remains +// highest priority when chords are registered afterwards actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ClearTerminalAction, ClearTerminalAction.ID, ClearTerminalAction.LABEL, { primary: 0, mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_K } diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 15afd525b6c..e33616878ab 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -112,6 +112,13 @@ export interface ITerminalService { getActiveOrCreateInstance(): ITerminalInstance; splitInstance(instance: ITerminalInstance, shell?: IShellLaunchConfig): ITerminalInstance | null; + /** + * Perform an action with the active terminal instance, if the terminal does + * not exist the callback will not be called. + * @param callback The callback that fires with the active terminal + */ + doWithActiveInstance(callback: (terminal: ITerminalInstance) => T): T | void; + getActiveTab(): ITerminalTab | null; setActiveTabToNext(): void; setActiveTabToPrevious(): void; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index da60dd16c8c..0208dda6d99 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -913,17 +913,15 @@ export function registerTerminalActions() { } async run(accessor: ServicesAccessor) { - const terminalInstance = accessor.get(ITerminalService).getActiveInstance(); - if (!terminalInstance) { - return; - } - const name = await accessor.get(IQuickInputService).input({ - value: terminalInstance.title, - prompt: localize('workbench.action.terminal.rename.prompt', "Enter terminal name"), + await accessor.get(ITerminalService).doWithActiveInstance(async t => { + const name = await accessor.get(IQuickInputService).input({ + value: t.title, + prompt: localize('workbench.action.terminal.rename.prompt', "Enter terminal name"), + }); + if (name) { + t.setTitle(name, TitleEventSource.Api); + } }); - if (name) { - terminalInstance.setTitle(name, TitleEventSource.Api); - } } }); registerAction2(class extends Action2 { @@ -995,11 +993,10 @@ export function registerTerminalActions() { } run(accessor: ServicesAccessor) { - const instance = accessor.get(ITerminalService).getActiveInstance(); - if (instance && instance.commandTracker) { - instance.commandTracker.scrollToPreviousCommand(); - instance.focus(); - } + accessor.get(ITerminalService).doWithActiveInstance(t => { + t.commandTracker?.scrollToPreviousCommand(); + t.focus(); + }); } }); registerAction2(class extends Action2 { @@ -1018,11 +1015,10 @@ export function registerTerminalActions() { } run(accessor: ServicesAccessor) { - const instance = accessor.get(ITerminalService).getActiveInstance(); - if (instance && instance.commandTracker) { - instance.commandTracker.scrollToNextCommand(); - instance.focus(); - } + accessor.get(ITerminalService).doWithActiveInstance(t => { + t.commandTracker?.scrollToNextCommand(); + t.focus(); + }); } }); registerAction2(class extends Action2 { @@ -1041,11 +1037,10 @@ export function registerTerminalActions() { } run(accessor: ServicesAccessor) { - const instance = accessor.get(ITerminalService).getActiveInstance(); - if (instance && instance.commandTracker) { - instance.commandTracker.selectToPreviousCommand(); - instance.focus(); - } + accessor.get(ITerminalService).doWithActiveInstance(t => { + t.commandTracker?.selectToPreviousCommand(); + t.focus(); + }); } }); registerAction2(class extends Action2 { @@ -1064,11 +1059,10 @@ export function registerTerminalActions() { } run(accessor: ServicesAccessor) { - const instance = accessor.get(ITerminalService).getActiveInstance(); - if (instance && instance.commandTracker) { - instance.commandTracker.selectToNextCommand(); - instance.focus(); - } + accessor.get(ITerminalService).doWithActiveInstance(t => { + t.commandTracker?.selectToNextCommand(); + t.focus(); + }); } }); registerAction2(class extends Action2 { @@ -1082,11 +1076,10 @@ export function registerTerminalActions() { } run(accessor: ServicesAccessor) { - const instance = accessor.get(ITerminalService).getActiveInstance(); - if (instance && instance.commandTracker) { - instance.commandTracker.selectToPreviousLine(); - instance.focus(); - } + accessor.get(ITerminalService).doWithActiveInstance(t => { + t.commandTracker?.selectToPreviousLine(); + t.focus(); + }); } }); registerAction2(class extends Action2 { @@ -1100,11 +1093,10 @@ export function registerTerminalActions() { } run(accessor: ServicesAccessor) { - const instance = accessor.get(ITerminalService).getActiveInstance(); - if (instance && instance.commandTracker) { - instance.commandTracker.selectToNextLine(); - instance.focus(); - } + accessor.get(ITerminalService).doWithActiveInstance(t => { + t.commandTracker?.selectToNextLine(); + t.focus(); + }); } }); registerAction2(class extends Action2 { @@ -1174,11 +1166,11 @@ export function registerTerminalActions() { }); } - public run(accessor: ServicesAccessor, args?: { cwd?: string }): Promise { + async run(accessor: ServicesAccessor, args?: { cwd?: string }) { const terminalService = accessor.get(ITerminalService); const instance = terminalService.createTerminal({ cwd: args?.cwd }); if (!instance) { - return Promise.resolve(undefined); + return; } terminalService.setActiveInstance(instance); return terminalService.showPanel(true); @@ -1211,21 +1203,13 @@ export function registerTerminalActions() { }); } - public run(accessor: ServicesAccessor, args?: { name?: string }): void { + run(accessor: ServicesAccessor, args?: { name?: string }) { const notificationService = accessor.get(INotificationService); - const terminalInstance = accessor.get(ITerminalService).getActiveInstance(); - - if (!terminalInstance) { - notificationService.warn(localize('workbench.action.terminal.renameWithArg.noTerminal', "No active terminal to rename")); - return; - } - - if (!args || !args.name) { + if (!args?.name) { notificationService.warn(localize('workbench.action.terminal.renameWithArg.noName', "No name argument provided")); return; } - - terminalInstance.setTitle(args.name, TitleEventSource.Api); + accessor.get(ITerminalService).getActiveInstance()?.setTitle(args.name, TitleEventSource.Api); } }); registerAction2(class extends Action2 { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts index 858a2bb7f5e..667b3ed88da 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -297,6 +297,13 @@ export class TerminalService implements ITerminalService { return tab.activeInstance; } + public doWithActiveInstance(callback: (terminal: ITerminalInstance) => T): T | void { + const instance = this.getActiveInstance(); + if (instance) { + return callback(instance); + } + } + public getInstanceFromId(terminalId: number): ITerminalInstance | undefined { let bgIndex = -1; this._backgroundedTerminalInstances.forEach((terminalInstance, i) => { From a7d4e9cc4482eba66bb22eac20b912580eb2cd6e Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 09:48:45 -0700 Subject: [PATCH 15/19] Simplify/modernize actions code --- .../terminal/browser/terminalActions.ts | 387 +++++++----------- 1 file changed, 157 insertions(+), 230 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 0208dda6d99..f4fe446948b 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -81,7 +81,7 @@ export class ToggleTerminalAction extends ToggleViewAction { super(id, label, TERMINAL_VIEW_ID, viewsService, viewDescriptorService, contextKeyService, layoutService); } - public run(event?: any): Promise { + async run() { if (this.terminalService.terminalInstances.length === 0) { // If there is not yet an instance attempt to create it here so that we can suggest a // new shell on Windows (and not do so when the panel is restored on reload). @@ -103,20 +103,18 @@ export class KillTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label, 'terminal-action codicon-trash'); } - public run(event?: any): Promise { - const instance = this.terminalService.getActiveInstance(); - if (instance) { - instance.dispose(true); - if (this.terminalService.terminalInstances.length > 0) { - this.terminalService.showPanel(true); + async run() { + await this._terminalService.doWithActiveInstance(async t => { + t.dispose(true); + if (this._terminalService.terminalInstances.length > 0) { + await this._terminalService.showPanel(true); } - } - return Promise.resolve(undefined); + }); } } @@ -132,17 +130,13 @@ export class CopyTerminalSelectionAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public async run(event?: any): Promise { - const terminalInstance = this.terminalService.getActiveInstance(); - if (terminalInstance) { - await terminalInstance.copySelection(); - } - return Promise.resolve(undefined); + async run() { + await this._terminalService.getActiveInstance()?.copySelection(); } } @@ -153,33 +147,29 @@ export class SelectAllTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - const terminalInstance = this.terminalService.getActiveInstance(); - if (terminalInstance) { - terminalInstance.selectAll(); - } - return Promise.resolve(undefined); + async run() { + this._terminalService.getActiveInstance()?.selectAll(); } } export const terminalSendSequenceCommand = (accessor: ServicesAccessor, args: { text?: string } | undefined) => { - const terminalInstance = accessor.get(ITerminalService).getActiveInstance(); - if (!terminalInstance || !args?.text) { - return; - } - - const configurationResolverService = accessor.get(IConfigurationResolverService); - const workspaceContextService = accessor.get(IWorkspaceContextService); - const historyService = accessor.get(IHistoryService); - const activeWorkspaceRootUri = historyService.getLastActiveWorkspaceRoot(Schemas.file); - const lastActiveWorkspaceRoot = activeWorkspaceRootUri ? withNullAsUndefined(workspaceContextService.getWorkspaceFolder(activeWorkspaceRootUri)) : undefined; - const resolvedText = configurationResolverService.resolve(lastActiveWorkspaceRoot, args.text); - terminalInstance.sendText(resolvedText, false); + accessor.get(ITerminalService).doWithActiveInstance(t => { + if (!args?.text) { + return; + } + const configurationResolverService = accessor.get(IConfigurationResolverService); + const workspaceContextService = accessor.get(IWorkspaceContextService); + const historyService = accessor.get(IHistoryService); + const activeWorkspaceRootUri = historyService.getLastActiveWorkspaceRoot(Schemas.file); + const lastActiveWorkspaceRoot = activeWorkspaceRootUri ? withNullAsUndefined(workspaceContextService.getWorkspaceFolder(activeWorkspaceRootUri)) : undefined; + const resolvedText = configurationResolverService.resolve(lastActiveWorkspaceRoot, args.text); + t.sendText(resolvedText, false); + }); }; @@ -191,21 +181,21 @@ export class CreateNewTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService, - @ICommandService private readonly commandService: ICommandService, - @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService + @ITerminalService private readonly _terminalService: ITerminalService, + @ICommandService private readonly _commandService: ICommandService, + @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService ) { super(id, label, 'terminal-action codicon-add'); } - public async run(event?: any): Promise { - const folders = this.workspaceContextService.getWorkspace().folders; + async run(event?: any) { + const folders = this._workspaceContextService.getWorkspace().folders; if (event instanceof MouseEvent && (event.altKey || event.ctrlKey)) { - const activeInstance = this.terminalService.getActiveInstance(); + const activeInstance = this._terminalService.getActiveInstance(); if (activeInstance) { - const cwd = await getCwdForSplit(this.terminalService.configHelper, activeInstance); - this.terminalService.splitInstance(activeInstance, { cwd }); - return undefined; + const cwd = await getCwdForSplit(this._terminalService.configHelper, activeInstance); + this._terminalService.splitInstance(activeInstance, { cwd }); + return; } } @@ -213,20 +203,20 @@ export class CreateNewTerminalAction extends Action { if (folders.length <= 1) { // Allow terminal service to handle the path when there is only a // single root - instance = this.terminalService.createTerminal(undefined); + instance = this._terminalService.createTerminal(undefined); } else { const options: IPickOptions = { placeHolder: localize('workbench.action.terminal.newWorkspacePlaceholder', "Select current working directory for new terminal") }; - const workspace = await this.commandService.executeCommand(PICK_WORKSPACE_FOLDER_COMMAND_ID, [options]); + const workspace = await this._commandService.executeCommand(PICK_WORKSPACE_FOLDER_COMMAND_ID, [options]); if (!workspace) { // Don't create the instance if the workspace picker was canceled - return undefined; + return; } - instance = this.terminalService.createTerminal({ cwd: workspace.uri }); + instance = this._terminalService.createTerminal({ cwd: workspace.uri }); } - this.terminalService.setActiveInstance(instance); - return this.terminalService.showPanel(true); + this._terminalService.setActiveInstance(instance); + await this._terminalService.showPanel(true); } } @@ -237,18 +227,18 @@ export class CreateNewInActiveWorkspaceTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - const instance = this.terminalService.createTerminal(undefined); + async run() { + const instance = this._terminalService.createTerminal(undefined); if (!instance) { - return Promise.resolve(undefined); + return; } - this.terminalService.setActiveInstance(instance); - return this.terminalService.showPanel(true); + this._terminalService.setActiveInstance(instance); + await this._terminalService.showPanel(true); } } @@ -262,23 +252,21 @@ export class SplitTerminalAction extends Action { constructor( id: string, label: string, @ITerminalService private readonly _terminalService: ITerminalService, - @ICommandService private readonly commandService: ICommandService, - @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService + @ICommandService private readonly _commandService: ICommandService, + @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService ) { super(id, label, SplitTerminalAction.HORIZONTAL_CLASS); } public async run(event?: any): Promise { - const instance = this._terminalService.getActiveInstance(); - if (!instance) { - return Promise.resolve(undefined); - } - const cwd = await getCwdForSplit(this._terminalService.configHelper, instance, this.workspaceContextService.getWorkspace().folders, this.commandService); - if (cwd === undefined) { - return undefined; - } - this._terminalService.splitInstance(instance, { cwd }); - return this._terminalService.showPanel(true); + await this._terminalService.doWithActiveInstance(async t => { + const cwd = await getCwdForSplit(this._terminalService.configHelper, t, this._workspaceContextService.getWorkspace().folders, this._commandService); + if (cwd === undefined) { + return undefined; + } + this._terminalService.splitInstance(t, { cwd }); + return this._terminalService.showPanel(true); + }); } } @@ -293,14 +281,12 @@ export class SplitInActiveWorkspaceTerminalAction extends Action { super(id, label); } - public async run(event?: any): Promise { - const instance = this._terminalService.getActiveInstance(); - if (!instance) { - return Promise.resolve(undefined); - } - const cwd = await getCwdForSplit(this._terminalService.configHelper, instance); - this._terminalService.splitInstance(instance, { cwd }); - return this._terminalService.showPanel(true); + async run() { + await this._terminalService.doWithActiveInstance(async t => { + const cwd = await getCwdForSplit(this._terminalService.configHelper, t); + this._terminalService.splitInstance(t, { cwd }); + await this._terminalService.showPanel(true); + }); } } @@ -315,13 +301,9 @@ export class FocusPreviousPaneTerminalAction extends Action { super(id, label); } - public run(event?: any): Promise { - const tab = this._terminalService.getActiveTab(); - if (!tab) { - return Promise.resolve(undefined); - } - tab.focusPreviousPane(); - return this._terminalService.showPanel(true); + async run() { + this._terminalService.getActiveTab()?.focusPreviousPane(); + await this._terminalService.showPanel(true); } } @@ -336,13 +318,9 @@ export class FocusNextPaneTerminalAction extends Action { super(id, label); } - public run(event?: any): Promise { - const tab = this._terminalService.getActiveTab(); - if (!tab) { - return Promise.resolve(undefined); - } - tab.focusNextPane(); - return this._terminalService.showPanel(true); + async run() { + this._terminalService.getActiveTab()?.focusNextPane(); + await this._terminalService.showPanel(true); } } @@ -355,12 +333,8 @@ export abstract class BaseFocusDirectionTerminalAction extends Action { super(id, label); } - public run(event?: any): Promise { - const tab = this._terminalService.getActiveTab(); - if (tab) { - tab.resizePane(this._direction); - } - return Promise.resolve(undefined); + async run() { + this._terminalService.getActiveTab()?.resizePane(this._direction); } } @@ -419,18 +393,18 @@ export class FocusActiveTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - const instance = this.terminalService.getActiveOrCreateInstance(); + async run() { + const instance = this._terminalService.getActiveOrCreateInstance(); if (!instance) { - return Promise.resolve(undefined); + return; } - this.terminalService.setActiveInstance(instance); - return this.terminalService.showPanel(true); + this._terminalService.setActiveInstance(instance); + return this._terminalService.showPanel(true); } } @@ -441,14 +415,14 @@ export class FocusNextTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - this.terminalService.setActiveTabToNext(); - return this.terminalService.showPanel(true); + async run() { + this._terminalService.setActiveTabToNext(); + await this._terminalService.showPanel(true); } } @@ -459,14 +433,14 @@ export class FocusPreviousTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - this.terminalService.setActiveTabToPrevious(); - return this.terminalService.showPanel(true); + async run() { + this._terminalService.setActiveTabToPrevious(); + await this._terminalService.showPanel(true); } } @@ -478,16 +452,13 @@ export class TerminalPasteAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public async run(event?: any): Promise { - const instance = this.terminalService.getActiveOrCreateInstance(); - if (instance) { - await instance.paste(); - } + async run() { + this._terminalService.getActiveOrCreateInstance()?.paste(); } } @@ -503,8 +474,8 @@ export class SelectDefaultShellWindowsTerminalAction extends Action { super(id, label); } - public run(event?: any): Promise { - return this._terminalService.selectDefaultShell(); + async run() { + this._terminalService.selectDefaultShell(); } } @@ -515,20 +486,17 @@ export class RunSelectedTextInTerminalAction extends Action { constructor( id: string, label: string, - @ICodeEditorService private readonly codeEditorService: ICodeEditorService, - @ITerminalService private readonly terminalService: ITerminalService + @ICodeEditorService private readonly _codeEditorService: ICodeEditorService, + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - const instance = this.terminalService.getActiveOrCreateInstance(); - if (!instance) { - return Promise.resolve(undefined); - } - let editor = this.codeEditorService.getFocusedCodeEditor(); + async run() { + const instance = this._terminalService.getActiveOrCreateInstance(); + let editor = this._codeEditorService.getFocusedCodeEditor(); if (!editor || !editor.hasModel()) { - return Promise.resolve(undefined); + return; } let selection = editor.getSelection(); let text: string; @@ -539,7 +507,7 @@ export class RunSelectedTextInTerminalAction extends Action { text = editor.getModel().getValueInRange(selection, endOfLinePreference); } instance.sendText(text, true); - return this.terminalService.showPanel(); + return this._terminalService.showPanel(); } } @@ -550,34 +518,31 @@ export class RunActiveFileInTerminalAction extends Action { constructor( id: string, label: string, - @ICodeEditorService private readonly codeEditorService: ICodeEditorService, - @ITerminalService private readonly terminalService: ITerminalService, - @INotificationService private readonly notificationService: INotificationService + @ICodeEditorService private readonly _codeEditorService: ICodeEditorService, + @ITerminalService private readonly _terminalService: ITerminalService, + @INotificationService private readonly _notificationService: INotificationService ) { super(id, label); } - public async run(event?: any): Promise { - const instance = this.terminalService.getActiveOrCreateInstance(); - if (!instance) { - return Promise.resolve(undefined); - } + async run() { + const instance = this._terminalService.getActiveOrCreateInstance(); await instance.processReady; - const editor = this.codeEditorService.getActiveCodeEditor(); + const editor = this._codeEditorService.getActiveCodeEditor(); if (!editor || !editor.hasModel()) { - return Promise.resolve(undefined); + return; } const uri = editor.getModel().uri; if (uri.scheme !== 'file') { - this.notificationService.warn(localize('workbench.action.terminal.runActiveFile.noFile', 'Only files on disk can be run in the terminal')); - return Promise.resolve(undefined); + this._notificationService.warn(localize('workbench.action.terminal.runActiveFile.noFile', 'Only files on disk can be run in the terminal')); + return; } // TODO: Convert this to ctrl+c, ctrl+v for pwsh? - const path = await this.terminalService.preparePathForTerminalAsync(uri.fsPath, instance.shellLaunchConfig.executable, instance.title, instance.shellType); + const path = await this._terminalService.preparePathForTerminalAsync(uri.fsPath, instance.shellLaunchConfig.executable, instance.title, instance.shellType); instance.sendText(path, true); - return this.terminalService.showPanel(); + return this._terminalService.showPanel(); } } @@ -588,7 +553,7 @@ export class SwitchTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label, 'terminal-action switch-terminal'); } @@ -598,16 +563,16 @@ export class SwitchTerminalAction extends Action { return Promise.resolve(null); } if (item === SwitchTerminalActionViewItem.SEPARATOR) { - this.terminalService.refreshActiveTab(); + this._terminalService.refreshActiveTab(); return Promise.resolve(null); } if (item === SelectDefaultShellWindowsTerminalAction.LABEL) { - this.terminalService.refreshActiveTab(); - return this.terminalService.selectDefaultShell(); + this._terminalService.refreshActiveTab(); + return this._terminalService.selectDefaultShell(); } const selectedTabIndex = parseInt(item.split(':')[0], 10) - 1; - this.terminalService.setActiveTabByIndex(selectedTabIndex); - return this.terminalService.showPanel(true); + this._terminalService.setActiveTabByIndex(selectedTabIndex); + return this._terminalService.showPanel(true); } } @@ -617,29 +582,29 @@ export class SwitchTerminalActionViewItem extends SelectActionViewItem { constructor( action: IAction, - @ITerminalService private readonly terminalService: ITerminalService, - @IThemeService private readonly themeService: IThemeService, + @ITerminalService private readonly _terminalService: ITerminalService, + @IThemeService private readonly _themeService: IThemeService, @IContextViewService contextViewService: IContextViewService ) { - super(null, action, getTerminalSelectOpenItems(terminalService), terminalService.activeTabIndex, contextViewService, { ariaLabel: localize('terminals', 'Open Terminals.') }); + super(null, action, getTerminalSelectOpenItems(_terminalService), _terminalService.activeTabIndex, contextViewService, { ariaLabel: localize('terminals', 'Open Terminals.') }); - this._register(terminalService.onInstancesChanged(this._updateItems, this)); - this._register(terminalService.onActiveTabChanged(this._updateItems, this)); - this._register(terminalService.onInstanceTitleChanged(this._updateItems, this)); - this._register(terminalService.onTabDisposed(this._updateItems, this)); - this._register(attachSelectBoxStyler(this.selectBox, themeService)); + this._register(_terminalService.onInstancesChanged(this._updateItems, this)); + this._register(_terminalService.onActiveTabChanged(this._updateItems, this)); + this._register(_terminalService.onInstanceTitleChanged(this._updateItems, this)); + this._register(_terminalService.onTabDisposed(this._updateItems, this)); + this._register(attachSelectBoxStyler(this.selectBox, _themeService)); } render(container: HTMLElement): void { super.render(container); addClass(container, 'switch-terminal'); - this._register(attachStylerCallback(this.themeService, { selectBorder }, colors => { + this._register(attachStylerCallback(this._themeService, { selectBorder }, colors => { container.style.borderColor = colors.selectBorder ? `${colors.selectBorder}` : ''; })); } private _updateItems(): void { - this.setOptions(getTerminalSelectOpenItems(this.terminalService), this.terminalService.activeTabIndex); + this.setOptions(getTerminalSelectOpenItems(this._terminalService), this._terminalService.activeTabIndex); } } @@ -657,17 +622,13 @@ export class ScrollDownTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - const terminalInstance = this.terminalService.getActiveInstance(); - if (terminalInstance) { - terminalInstance.scrollDownLine(); - } - return Promise.resolve(undefined); + async run() { + this._terminalService.getActiveInstance()?.scrollDownLine(); } } @@ -678,17 +639,13 @@ export class ScrollDownPageTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - const terminalInstance = this.terminalService.getActiveInstance(); - if (terminalInstance) { - terminalInstance.scrollDownPage(); - } - return Promise.resolve(undefined); + async run() { + this._terminalService.getActiveInstance()?.scrollDownPage(); } } @@ -699,17 +656,13 @@ export class ScrollToBottomTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - const terminalInstance = this.terminalService.getActiveInstance(); - if (terminalInstance) { - terminalInstance.scrollToBottom(); - } - return Promise.resolve(undefined); + async run() { + this._terminalService.getActiveInstance()?.scrollToBottom(); } } @@ -720,17 +673,13 @@ export class ScrollUpTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - const terminalInstance = this.terminalService.getActiveInstance(); - if (terminalInstance) { - terminalInstance.scrollUpLine(); - } - return Promise.resolve(undefined); + async run() { + this._terminalService.getActiveInstance()?.scrollUpLine(); } } @@ -741,17 +690,13 @@ export class ScrollUpPageTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - const terminalInstance = this.terminalService.getActiveInstance(); - if (terminalInstance) { - terminalInstance.scrollUpPage(); - } - return Promise.resolve(undefined); + async run() { + this._terminalService.getActiveInstance()?.scrollUpPage(); } } @@ -762,17 +707,13 @@ export class ScrollToTopTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - const terminalInstance = this.terminalService.getActiveInstance(); - if (terminalInstance) { - terminalInstance.scrollToTop(); - } - return Promise.resolve(undefined); + async run() { + this._terminalService.getActiveInstance()?.scrollToTop(); } } @@ -783,17 +724,13 @@ export class NavigationModeExitTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - const terminalInstance = this.terminalService.getActiveInstance(); - if (terminalInstance && terminalInstance.navigationMode) { - terminalInstance.navigationMode.exitNavigationMode(); - } - return Promise.resolve(undefined); + async run() { + this._terminalService.getActiveInstance()?.navigationMode?.exitNavigationMode(); } } @@ -806,17 +743,13 @@ export class NavigationModeFocusPreviousTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - const terminalInstance = this.terminalService.getActiveInstance(); - if (terminalInstance && terminalInstance.navigationMode) { - terminalInstance.navigationMode.focusPreviousLine(); - } - return Promise.resolve(undefined); + async run() { + this._terminalService.getActiveInstance()?.navigationMode?.focusPreviousLine(); } } @@ -827,17 +760,13 @@ export class NavigationModeFocusNextTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - const terminalInstance = this.terminalService.getActiveInstance(); - if (terminalInstance && terminalInstance.navigationMode) { - terminalInstance.navigationMode.focusNextLine(); - } - return Promise.resolve(undefined); + async run() { + this._terminalService.getActiveInstance()?.navigationMode?.focusNextLine(); } } @@ -848,18 +777,16 @@ export class ClearTerminalAction extends Action { constructor( id: string, label: string, - @ITerminalService private readonly terminalService: ITerminalService + @ITerminalService private readonly _terminalService: ITerminalService ) { super(id, label); } - public run(event?: any): Promise { - const terminalInstance = this.terminalService.getActiveInstance(); - if (terminalInstance) { - terminalInstance.clear(); - terminalInstance.focus(); - } - return Promise.resolve(undefined); + async run() { + this._terminalService.doWithActiveInstance(t => { + t.clear(); + t.focus(); + }); } } From b9184d81890a717386ff94b4d9de0d382e75008f Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 15:48:48 -0700 Subject: [PATCH 16/19] Convert nav mode to Action2 --- .../terminal/browser/terminal.contribution.ts | 14 +- .../terminal/browser/terminalActions.ts | 136 ++++++++---------- 2 files changed, 63 insertions(+), 87 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 8582f4a81aa..515a470fa05 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -19,16 +19,15 @@ import * as panel from 'vs/workbench/browser/panel'; import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; -import { registerTerminalActions, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, KillTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, NavigationModeFocusPreviousTerminalAction, NavigationModeFocusNextTerminalAction, NavigationModeExitTerminalAction, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { registerTerminalActions, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, KillTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; -import { KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; +import { KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { setupTerminalCommands } from 'vs/workbench/contrib/terminal/browser/terminalCommands'; import { setupTerminalMenu } from 'vs/workbench/contrib/terminal/common/terminalMenu'; import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; import { TerminalService } from 'vs/workbench/contrib/terminal/browser/terminalService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from 'vs/platform/accessibility/common/accessibility'; import { ITerminalService, WindowsShellType } from 'vs/workbench/contrib/terminal/browser/terminal'; import { BrowserFeatures } from 'vs/base/browser/canIUse'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; @@ -183,15 +182,6 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ResizePaneDow primary: 0, mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.DownArrow } }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Resize Pane Down', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(NavigationModeExitTerminalAction, NavigationModeExitTerminalAction.ID, NavigationModeExitTerminalAction.LABEL, { - primary: KeyCode.Escape -}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED)), 'Terminal: Exit Navigation Mode', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(NavigationModeFocusPreviousTerminalAction, NavigationModeFocusPreviousTerminalAction.ID, NavigationModeFocusPreviousTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.UpArrow -}, ContextKeyExpr.or(ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED), ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED))), 'Terminal: Focus Previous Line (Navigation Mode)', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(NavigationModeFocusNextTerminalAction, NavigationModeFocusNextTerminalAction.ID, NavigationModeFocusNextTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.DownArrow -}, ContextKeyExpr.or(ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED), ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED))), 'Terminal: Focus Next Line (Navigation Mode)', category); registerTerminalActions(); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index f4fe446948b..3f92035af25 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -6,7 +6,7 @@ import { Action, IAction } from 'vs/base/common/actions'; import { EndOfLinePreference } from 'vs/editor/common/model'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { TERMINAL_VIEW_ID, ITerminalConfigHelper, TitleEventSource, TERMINAL_COMMAND_ID, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE } from 'vs/workbench/contrib/terminal/common/terminal'; +import { TERMINAL_VIEW_ID, ITerminalConfigHelper, TitleEventSource, TERMINAL_COMMAND_ID, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS } from 'vs/workbench/contrib/terminal/common/terminal'; import { SelectActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { attachSelectBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; @@ -717,59 +717,6 @@ export class ScrollToTopTerminalAction extends Action { } } -export class NavigationModeExitTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.NAVIGATION_MODE_EXIT; - public static readonly LABEL = localize('workbench.action.terminal.navigationModeExit', "Exit Navigation Mode"); - - constructor( - id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - this._terminalService.getActiveInstance()?.navigationMode?.exitNavigationMode(); - } -} - - - -export class NavigationModeFocusPreviousTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_PREVIOUS; - public static readonly LABEL = localize('workbench.action.terminal.navigationModeFocusPrevious', "Focus Previous Line (Navigation Mode)"); - - constructor( - id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - this._terminalService.getActiveInstance()?.navigationMode?.focusPreviousLine(); - } -} - -export class NavigationModeFocusNextTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_NEXT; - public static readonly LABEL = localize('workbench.action.terminal.navigationModeFocusNext', "Focus Next Line (Navigation Mode)"); - - constructor( - id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - this._terminalService.getActiveInstance()?.navigationMode?.focusNextLine(); - } -} - export class ClearTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.CLEAR; @@ -793,6 +740,66 @@ export class ClearTerminalAction extends Action { export function registerTerminalActions() { const category = TERMINAL_ACTION_CATEGORY; + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.NAVIGATION_MODE_EXIT, + title: localize('workbench.action.terminal.navigationModeExit', "Exit Navigation Mode"), + f1: true, + category, + keybinding: { + primary: KeyCode.Escape, + when: ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED), + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).getActiveInstance()?.navigationMode?.focusPreviousLine(); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_PREVIOUS, + title: localize('workbench.action.terminal.navigationModeFocusPrevious', "Focus Previous Line (Navigation Mode)"), + f1: true, + category, + keybinding: { + primary: KeyMod.CtrlCmd | KeyCode.UpArrow, + when: ContextKeyExpr.or( + ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED), + ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED) + ), + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).getActiveInstance()?.navigationMode?.focusPreviousLine(); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_NEXT, + title: localize('workbench.action.terminal.navigationModeFocusNext', "Focus Next Line (Navigation Mode)"), + f1: true, + category, + keybinding: { + primary: KeyMod.CtrlCmd | KeyCode.DownArrow, + when: ContextKeyExpr.or( + ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED), + ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED) + ), + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).getActiveInstance()?.navigationMode?.focusNextLine(); + } + }); registerAction2(class extends Action2 { constructor() { super({ @@ -807,7 +814,6 @@ export function registerTerminalActions() { } }); } - run(accessor: ServicesAccessor) { const terminalInstance = accessor.get(ITerminalService).getActiveInstance(); if (terminalInstance && terminalInstance.hasSelection()) { @@ -824,7 +830,6 @@ export function registerTerminalActions() { category }); } - run(accessor: ServicesAccessor) { accessor.get(ITerminalService).manageWorkspaceShellPermissions(); } @@ -838,7 +843,6 @@ export function registerTerminalActions() { category }); } - async run(accessor: ServicesAccessor) { await accessor.get(ITerminalService).doWithActiveInstance(async t => { const name = await accessor.get(IQuickInputService).input({ @@ -865,7 +869,6 @@ export function registerTerminalActions() { } }); } - run(accessor: ServicesAccessor) { accessor.get(ITerminalService).focusFindWidget(); } @@ -885,7 +888,6 @@ export function registerTerminalActions() { } }); } - run(accessor: ServicesAccessor) { accessor.get(ITerminalService).hideFindWidget(); } @@ -899,7 +901,6 @@ export function registerTerminalActions() { category }); } - run(accessor: ServicesAccessor) { accessor.get(IQuickInputService).quickAccess.show(TerminalQuickAccessProvider.PREFIX); } @@ -918,7 +919,6 @@ export function registerTerminalActions() { } }); } - run(accessor: ServicesAccessor) { accessor.get(ITerminalService).doWithActiveInstance(t => { t.commandTracker?.scrollToPreviousCommand(); @@ -940,7 +940,6 @@ export function registerTerminalActions() { } }); } - run(accessor: ServicesAccessor) { accessor.get(ITerminalService).doWithActiveInstance(t => { t.commandTracker?.scrollToNextCommand(); @@ -962,7 +961,6 @@ export function registerTerminalActions() { } }); } - run(accessor: ServicesAccessor) { accessor.get(ITerminalService).doWithActiveInstance(t => { t.commandTracker?.selectToPreviousCommand(); @@ -984,7 +982,6 @@ export function registerTerminalActions() { } }); } - run(accessor: ServicesAccessor) { accessor.get(ITerminalService).doWithActiveInstance(t => { t.commandTracker?.selectToNextCommand(); @@ -1001,7 +998,6 @@ export function registerTerminalActions() { category }); } - run(accessor: ServicesAccessor) { accessor.get(ITerminalService).doWithActiveInstance(t => { t.commandTracker?.selectToPreviousLine(); @@ -1018,7 +1014,6 @@ export function registerTerminalActions() { category }); } - run(accessor: ServicesAccessor) { accessor.get(ITerminalService).doWithActiveInstance(t => { t.commandTracker?.selectToNextLine(); @@ -1035,7 +1030,6 @@ export function registerTerminalActions() { category }); } - run(accessor: ServicesAccessor) { accessor.get(ITerminalService).getActiveInstance()?.toggleEscapeSequenceLogging(); } @@ -1062,7 +1056,6 @@ export function registerTerminalActions() { } }); } - run(accessor: ServicesAccessor, args?: { text?: string }) { terminalSendSequenceCommand(accessor, args); } @@ -1092,7 +1085,6 @@ export function registerTerminalActions() { } }); } - async run(accessor: ServicesAccessor, args?: { cwd?: string }) { const terminalService = accessor.get(ITerminalService); const instance = terminalService.createTerminal({ cwd: args?.cwd }); @@ -1129,7 +1121,6 @@ export function registerTerminalActions() { } }); } - run(accessor: ServicesAccessor, args?: { name?: string }) { const notificationService = accessor.get(INotificationService); if (!args?.name) { @@ -1154,7 +1145,6 @@ export function registerTerminalActions() { } }); } - run(accessor: ServicesAccessor) { const state = accessor.get(ITerminalService).getFindState(); state.change({ isRegex: !state.isRegex }, false); @@ -1175,7 +1165,6 @@ export function registerTerminalActions() { }, }); } - run(accessor: ServicesAccessor) { const state = accessor.get(ITerminalService).getFindState(); state.change({ wholeWord: !state.wholeWord }, false); @@ -1196,7 +1185,6 @@ export function registerTerminalActions() { } }); } - run(accessor: ServicesAccessor) { const state = accessor.get(ITerminalService).getFindState(); state.change({ matchCase: !state.matchCase }, false); @@ -1224,7 +1212,6 @@ export function registerTerminalActions() { ] }); } - run(accessor: ServicesAccessor) { accessor.get(ITerminalService).findNext(); } @@ -1251,7 +1238,6 @@ export function registerTerminalActions() { ] }); } - run(accessor: ServicesAccessor) { accessor.get(ITerminalService).findPrevious(); } From 5ccf261e43a56b0a384bf814d9c52a24c38b7340 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 15:54:21 -0700 Subject: [PATCH 17/19] Convert terminal scroll to Action2 --- .../terminal/browser/terminal.contribution.ts | 26 +-- .../terminal/browser/terminalActions.ts | 216 +++++++++--------- 2 files changed, 115 insertions(+), 127 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 515a470fa05..9dcb59ad515 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -19,7 +19,7 @@ import * as panel from 'vs/workbench/browser/panel'; import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; -import { registerTerminalActions, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, KillTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, ScrollDownPageTerminalAction, ScrollDownTerminalAction, ScrollToBottomTerminalAction, ScrollToTopTerminalAction, ScrollUpPageTerminalAction, ScrollUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { registerTerminalActions, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, KillTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; import { KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; @@ -109,30 +109,6 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ToggleTermina primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK, mac: { primary: KeyMod.WinCtrl | KeyCode.US_BACKTICK } }), 'View: Toggle Integrated Terminal', nls.localize('viewCategory', "View")); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ScrollDownTerminalAction, ScrollDownTerminalAction.ID, ScrollDownTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageDown, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.DownArrow } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Down (Line)', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ScrollDownPageTerminalAction, ScrollDownPageTerminalAction.ID, ScrollDownPageTerminalAction.LABEL, { - primary: KeyMod.Shift | KeyCode.PageDown, - mac: { primary: KeyCode.PageDown } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Down (Page)', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ScrollToBottomTerminalAction, ScrollToBottomTerminalAction.ID, ScrollToBottomTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.End, - linux: { primary: KeyMod.Shift | KeyCode.End } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll to Bottom', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ScrollUpTerminalAction, ScrollUpTerminalAction.ID, ScrollUpTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageUp, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.UpArrow }, -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Up (Line)', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ScrollUpPageTerminalAction, ScrollUpPageTerminalAction.ID, ScrollUpPageTerminalAction.LABEL, { - primary: KeyMod.Shift | KeyCode.PageUp, - mac: { primary: KeyCode.PageUp } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Up (Page)', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ScrollToTopTerminalAction, ScrollToTopTerminalAction.ID, ScrollToTopTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.Home, - linux: { primary: KeyMod.Shift | KeyCode.Home } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll to Top', category); // Weight is higher than work workbench contributions so the keybinding remains // highest priority when chords are registered afterwards actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ClearTerminalAction, ClearTerminalAction.ID, ClearTerminalAction.LABEL, { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 3f92035af25..7eba3a67dde 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -615,108 +615,6 @@ function getTerminalSelectOpenItems(terminalService: ITerminalService): ISelectO return items; } -export class ScrollDownTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_DOWN_LINE; - public static readonly LABEL = localize('workbench.action.terminal.scrollDown', "Scroll Down (Line)"); - - constructor( - id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - this._terminalService.getActiveInstance()?.scrollDownLine(); - } -} - -export class ScrollDownPageTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_DOWN_PAGE; - public static readonly LABEL = localize('workbench.action.terminal.scrollDownPage', "Scroll Down (Page)"); - - constructor( - id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - this._terminalService.getActiveInstance()?.scrollDownPage(); - } -} - -export class ScrollToBottomTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_TO_BOTTOM; - public static readonly LABEL = localize('workbench.action.terminal.scrollToBottom', "Scroll to Bottom"); - - constructor( - id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - this._terminalService.getActiveInstance()?.scrollToBottom(); - } -} - -export class ScrollUpTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_UP_LINE; - public static readonly LABEL = localize('workbench.action.terminal.scrollUp', "Scroll Up (Line)"); - - constructor( - id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - this._terminalService.getActiveInstance()?.scrollUpLine(); - } -} - -export class ScrollUpPageTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_UP_PAGE; - public static readonly LABEL = localize('workbench.action.terminal.scrollUpPage', "Scroll Up (Page)"); - - constructor( - id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - this._terminalService.getActiveInstance()?.scrollUpPage(); - } -} - -export class ScrollToTopTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.SCROLL_TO_TOP; - public static readonly LABEL = localize('workbench.action.terminal.scrollToTop', "Scroll to Top"); - - constructor( - id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - this._terminalService.getActiveInstance()?.scrollToTop(); - } -} - export class ClearTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.CLEAR; @@ -740,6 +638,120 @@ export class ClearTerminalAction extends Action { export function registerTerminalActions() { const category = TERMINAL_ACTION_CATEGORY; + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.SCROLL_DOWN_LINE, + title: localize('workbench.action.terminal.scrollDown', "Scroll Down (Line)"), + f1: true, + category, + keybinding: { + primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageDown, + linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.DownArrow }, + when: KEYBINDING_CONTEXT_TERMINAL_FOCUS, + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).getActiveInstance()?.scrollDownLine(); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.SCROLL_DOWN_PAGE, + title: localize('workbench.action.terminal.scrollDownPage', "Scroll Down (Page)"), + f1: true, + category, + keybinding: { + primary: KeyMod.Shift | KeyCode.PageDown, + mac: { primary: KeyCode.PageDown }, + when: KEYBINDING_CONTEXT_TERMINAL_FOCUS, + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).getActiveInstance()?.scrollDownPage(); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.SCROLL_TO_BOTTOM, + title: localize('workbench.action.terminal.scrollToBottom', "Scroll to Bottom"), + f1: true, + category, + keybinding: { + primary: KeyMod.CtrlCmd | KeyCode.End, + linux: { primary: KeyMod.Shift | KeyCode.End }, + when: KEYBINDING_CONTEXT_TERMINAL_FOCUS, + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).getActiveInstance()?.scrollToBottom(); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.SCROLL_UP_LINE, + title: localize('workbench.action.terminal.scrollUp', "Scroll Up (Line)"), + f1: true, + category, + keybinding: { + primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.PageUp, + linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.UpArrow }, + when: KEYBINDING_CONTEXT_TERMINAL_FOCUS, + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).getActiveInstance()?.scrollUpLine(); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.SCROLL_UP_PAGE, + title: localize('workbench.action.terminal.scrollUpPage', "Scroll Up (Page)"), + f1: true, + category, + keybinding: { + primary: KeyMod.Shift | KeyCode.PageUp, + mac: { primary: KeyCode.PageUp }, + when: KEYBINDING_CONTEXT_TERMINAL_FOCUS, + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).getActiveInstance()?.scrollUpPage(); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.SCROLL_TO_TOP, + title: localize('workbench.action.terminal.scrollToTop', "Scroll to Top"), + f1: true, + category, + keybinding: { + primary: KeyMod.CtrlCmd | KeyCode.Home, + linux: { primary: KeyMod.Shift | KeyCode.Home }, + when: KEYBINDING_CONTEXT_TERMINAL_FOCUS, + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).getActiveInstance()?.scrollToTop(); + } + }); registerAction2(class extends Action2 { constructor() { super({ From 98f35f8a39e3e7ccb78a4378579a47af67fe935b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 16:03:02 -0700 Subject: [PATCH 18/19] Convert terminal run commands to action2 --- .../terminal/browser/terminal.contribution.ts | 4 +- .../terminal/browser/terminalActions.ts | 131 +++++++++--------- 2 files changed, 65 insertions(+), 70 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 9dcb59ad515..33fc56982be 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -19,7 +19,7 @@ import * as panel from 'vs/workbench/browser/panel'; import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; -import { registerTerminalActions, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, KillTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, RunActiveFileInTerminalAction, RunSelectedTextInTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { registerTerminalActions, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, KillTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; import { KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; @@ -103,8 +103,6 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(SelectAllTerm // makes it easier for users to see how it works though. mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_A } }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Select All', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(RunSelectedTextInTerminalAction, RunSelectedTextInTerminalAction.ID, RunSelectedTextInTerminalAction.LABEL), 'Terminal: Run Selected Text In Active Terminal', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(RunActiveFileInTerminalAction, RunActiveFileInTerminalAction.ID, RunActiveFileInTerminalAction.LABEL), 'Terminal: Run Active File In Active Terminal', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK, mac: { primary: KeyMod.WinCtrl | KeyCode.US_BACKTICK } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 7eba3a67dde..06479ef8052 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -479,73 +479,6 @@ export class SelectDefaultShellWindowsTerminalAction extends Action { } } -export class RunSelectedTextInTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.RUN_SELECTED_TEXT; - public static readonly LABEL = localize('workbench.action.terminal.runSelectedText', "Run Selected Text In Active Terminal"); - - constructor( - id: string, label: string, - @ICodeEditorService private readonly _codeEditorService: ICodeEditorService, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - const instance = this._terminalService.getActiveOrCreateInstance(); - let editor = this._codeEditorService.getFocusedCodeEditor(); - if (!editor || !editor.hasModel()) { - return; - } - let selection = editor.getSelection(); - let text: string; - if (selection.isEmpty()) { - text = editor.getModel().getLineContent(selection.selectionStartLineNumber).trim(); - } else { - const endOfLinePreference = isWindows ? EndOfLinePreference.LF : EndOfLinePreference.CRLF; - text = editor.getModel().getValueInRange(selection, endOfLinePreference); - } - instance.sendText(text, true); - return this._terminalService.showPanel(); - } -} - -export class RunActiveFileInTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.RUN_ACTIVE_FILE; - public static readonly LABEL = localize('workbench.action.terminal.runActiveFile', "Run Active File In Active Terminal"); - - constructor( - id: string, label: string, - @ICodeEditorService private readonly _codeEditorService: ICodeEditorService, - @ITerminalService private readonly _terminalService: ITerminalService, - @INotificationService private readonly _notificationService: INotificationService - ) { - super(id, label); - } - - async run() { - const instance = this._terminalService.getActiveOrCreateInstance(); - await instance.processReady; - - const editor = this._codeEditorService.getActiveCodeEditor(); - if (!editor || !editor.hasModel()) { - return; - } - const uri = editor.getModel().uri; - if (uri.scheme !== 'file') { - this._notificationService.warn(localize('workbench.action.terminal.runActiveFile.noFile', 'Only files on disk can be run in the terminal')); - return; - } - - // TODO: Convert this to ctrl+c, ctrl+v for pwsh? - const path = await this._terminalService.preparePathForTerminalAsync(uri.fsPath, instance.shellLaunchConfig.executable, instance.title, instance.shellType); - instance.sendText(path, true); - return this._terminalService.showPanel(); - } -} - export class SwitchTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SWITCH_TERMINAL; @@ -638,6 +571,70 @@ export class ClearTerminalAction extends Action { export function registerTerminalActions() { const category = TERMINAL_ACTION_CATEGORY; + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.RUN_SELECTED_TEXT, + title: localize('workbench.action.terminal.runSelectedText', "Run Selected Text In Active Terminal"), + f1: true, + category + }); + } + async run(accessor: ServicesAccessor) { + const terminalService = accessor.get(ITerminalService); + const codeEditorService = accessor.get(ICodeEditorService); + + const instance = terminalService.getActiveOrCreateInstance(); + let editor = codeEditorService.getFocusedCodeEditor(); + if (!editor || !editor.hasModel()) { + return; + } + let selection = editor.getSelection(); + let text: string; + if (selection.isEmpty()) { + text = editor.getModel().getLineContent(selection.selectionStartLineNumber).trim(); + } else { + const endOfLinePreference = isWindows ? EndOfLinePreference.LF : EndOfLinePreference.CRLF; + text = editor.getModel().getValueInRange(selection, endOfLinePreference); + } + instance.sendText(text, true); + return terminalService.showPanel(); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.RUN_ACTIVE_FILE, + title: localize('workbench.action.terminal.runActiveFile', "Run Active File In Active Terminal"), + f1: true, + category + }); + } + async run(accessor: ServicesAccessor) { + const terminalService = accessor.get(ITerminalService); + const codeEditorService = accessor.get(ICodeEditorService); + const notificationService = accessor.get(INotificationService); + + const instance = terminalService.getActiveOrCreateInstance(); + await instance.processReady; + + const editor = codeEditorService.getActiveCodeEditor(); + if (!editor || !editor.hasModel()) { + return; + } + + const uri = editor.getModel().uri; + if (uri.scheme !== 'file') { + notificationService.warn(localize('workbench.action.terminal.runActiveFile.noFile', 'Only files on disk can be run in the terminal')); + return; + } + + // TODO: Convert this to ctrl+c, ctrl+v for pwsh? + const path = await terminalService.preparePathForTerminalAsync(uri.fsPath, instance.shellLaunchConfig.executable, instance.title, instance.shellType); + instance.sendText(path, true); + return terminalService.showPanel(); + } + }); registerAction2(class extends Action2 { constructor() { super({ From d1615c969b4b9996c42b02073d03dee6de222c76 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 9 Apr 2020 16:16:14 -0700 Subject: [PATCH 19/19] Convert remaining actions not used by views/menus --- .../terminal/browser/terminal.contribution.ts | 43 +- .../terminal/browser/terminalActions.ts | 368 +++++++++--------- 2 files changed, 194 insertions(+), 217 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 33fc56982be..25a2010e1c9 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -19,7 +19,7 @@ import * as panel from 'vs/workbench/browser/panel'; import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; -import { registerTerminalActions, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewInActiveWorkspaceTerminalAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextPaneTerminalAction, FocusNextTerminalAction, FocusPreviousPaneTerminalAction, FocusPreviousTerminalAction, KillTerminalAction, ResizePaneDownTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { registerTerminalActions, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, KillTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; import { KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; @@ -84,16 +84,13 @@ Registry.as(ViewContainerExtensions.ViewsRegistry).registerViews // Register actions const actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); +registerTerminalActions(); const category = TERMINAL_ACTION_CATEGORY; actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(KillTerminalAction, KillTerminalAction.ID, KillTerminalAction.LABEL), 'Terminal: Kill the Active Terminal Instance', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(CreateNewTerminalAction, CreateNewTerminalAction.ID, CreateNewTerminalAction.LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.US_BACKTICK, mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.US_BACKTICK } }), 'Terminal: Create New Integrated Terminal', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(CreateNewInActiveWorkspaceTerminalAction, CreateNewInActiveWorkspaceTerminalAction.ID, CreateNewInActiveWorkspaceTerminalAction.LABEL), 'Terminal: Create New Integrated Terminal (In Active Workspace)', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(FocusActiveTerminalAction, FocusActiveTerminalAction.ID, FocusActiveTerminalAction.LABEL), 'Terminal: Focus Terminal', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(FocusNextTerminalAction, FocusNextTerminalAction.ID, FocusNextTerminalAction.LABEL), 'Terminal: Focus Next Terminal', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(FocusPreviousTerminalAction, FocusPreviousTerminalAction.ID, FocusPreviousTerminalAction.LABEL), 'Terminal: Focus Previous Terminal', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(SelectAllTerminalAction, SelectAllTerminalAction.ID, SelectAllTerminalAction.LABEL, { // Don't use ctrl+a by default as that would override the common go to start // of prompt shell binding @@ -122,42 +119,6 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(SplitTerminal } }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Split Terminal', category); actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(SplitInActiveWorkspaceTerminalAction, SplitInActiveWorkspaceTerminalAction.ID, SplitInActiveWorkspaceTerminalAction.LABEL), 'Terminal: Split Terminal (In Active Workspace)', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(FocusPreviousPaneTerminalAction, FocusPreviousPaneTerminalAction.ID, FocusPreviousPaneTerminalAction.LABEL, { - primary: KeyMod.Alt | KeyCode.LeftArrow, - secondary: [KeyMod.Alt | KeyCode.UpArrow], - mac: { - primary: KeyMod.Alt | KeyMod.CtrlCmd | KeyCode.LeftArrow, - secondary: [KeyMod.Alt | KeyMod.CtrlCmd | KeyCode.UpArrow] - } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Focus Previous Pane', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(FocusNextPaneTerminalAction, FocusNextPaneTerminalAction.ID, FocusNextPaneTerminalAction.LABEL, { - primary: KeyMod.Alt | KeyCode.RightArrow, - secondary: [KeyMod.Alt | KeyCode.DownArrow], - mac: { - primary: KeyMod.Alt | KeyMod.CtrlCmd | KeyCode.RightArrow, - secondary: [KeyMod.Alt | KeyMod.CtrlCmd | KeyCode.DownArrow] - } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Focus Next Pane', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ResizePaneLeftTerminalAction, ResizePaneLeftTerminalAction.ID, ResizePaneLeftTerminalAction.LABEL, { - primary: 0, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.LeftArrow }, - mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.LeftArrow } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Resize Pane Left', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ResizePaneRightTerminalAction, ResizePaneRightTerminalAction.ID, ResizePaneRightTerminalAction.LABEL, { - primary: 0, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.RightArrow }, - mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.RightArrow } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Resize Pane Right', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ResizePaneUpTerminalAction, ResizePaneUpTerminalAction.ID, ResizePaneUpTerminalAction.LABEL, { - primary: 0, - mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.UpArrow } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Resize Pane Up', category); -actionRegistry.registerWorkbenchAction(SyncActionDescriptor.create(ResizePaneDownTerminalAction, ResizePaneDownTerminalAction.ID, ResizePaneDownTerminalAction.LABEL, { - primary: 0, - mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.DownArrow } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Resize Pane Down', category); - -registerTerminalActions(); // Commands might be affected by Web restrictons if (BrowserFeatures.clipboard.writeText) { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 06479ef8052..56aa1d47225 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -220,28 +220,6 @@ export class CreateNewTerminalAction extends Action { } } -export class CreateNewInActiveWorkspaceTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.NEW_IN_ACTIVE_WORKSPACE; - public static readonly LABEL = localize('workbench.action.terminal.newInActiveWorkspace', "Create New Integrated Terminal (In Active Workspace)"); - - constructor( - id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - const instance = this._terminalService.createTerminal(undefined); - if (!instance) { - return; - } - this._terminalService.setActiveInstance(instance); - await this._terminalService.showPanel(true); - } -} - export class SplitTerminalAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.SPLIT; public static readonly LABEL = localize('workbench.action.terminal.split', "Split Terminal"); @@ -290,160 +268,6 @@ export class SplitInActiveWorkspaceTerminalAction extends Action { } } -export class FocusPreviousPaneTerminalAction extends Action { - public static readonly ID = TERMINAL_COMMAND_ID.FOCUS_PREVIOUS_PANE; - public static readonly LABEL = localize('workbench.action.terminal.focusPreviousPane', "Focus Previous Pane"); - - constructor( - id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - this._terminalService.getActiveTab()?.focusPreviousPane(); - await this._terminalService.showPanel(true); - } -} - -export class FocusNextPaneTerminalAction extends Action { - public static readonly ID = TERMINAL_COMMAND_ID.FOCUS_NEXT_PANE; - public static readonly LABEL = localize('workbench.action.terminal.focusNextPane', "Focus Next Pane"); - - constructor( - id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - this._terminalService.getActiveTab()?.focusNextPane(); - await this._terminalService.showPanel(true); - } -} - -export abstract class BaseFocusDirectionTerminalAction extends Action { - constructor( - id: string, label: string, - private _direction: Direction, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - this._terminalService.getActiveTab()?.resizePane(this._direction); - } -} - -export class ResizePaneLeftTerminalAction extends BaseFocusDirectionTerminalAction { - public static readonly ID = TERMINAL_COMMAND_ID.RESIZE_PANE_LEFT; - public static readonly LABEL = localize('workbench.action.terminal.resizePaneLeft', "Resize Pane Left"); - - constructor( - id: string, label: string, - @ITerminalService readonly terminalService: ITerminalService - ) { - super(id, label, Direction.Left, terminalService); - } -} - -export class ResizePaneRightTerminalAction extends BaseFocusDirectionTerminalAction { - public static readonly ID = TERMINAL_COMMAND_ID.RESIZE_PANE_RIGHT; - public static readonly LABEL = localize('workbench.action.terminal.resizePaneRight', "Resize Pane Right"); - - constructor( - id: string, label: string, - @ITerminalService readonly terminalService: ITerminalService - ) { - super(id, label, Direction.Right, terminalService); - } -} - -export class ResizePaneUpTerminalAction extends BaseFocusDirectionTerminalAction { - public static readonly ID = TERMINAL_COMMAND_ID.RESIZE_PANE_UP; - public static readonly LABEL = localize('workbench.action.terminal.resizePaneUp', "Resize Pane Up"); - - constructor( - id: string, label: string, - @ITerminalService readonly terminalService: ITerminalService - ) { - super(id, label, Direction.Up, terminalService); - } -} - -export class ResizePaneDownTerminalAction extends BaseFocusDirectionTerminalAction { - public static readonly ID = TERMINAL_COMMAND_ID.RESIZE_PANE_DOWN; - public static readonly LABEL = localize('workbench.action.terminal.resizePaneDown', "Resize Pane Down"); - - constructor( - id: string, label: string, - @ITerminalService readonly terminalService: ITerminalService - ) { - super(id, label, Direction.Down, terminalService); - } -} - -export class FocusActiveTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.FOCUS; - public static readonly LABEL = localize('workbench.action.terminal.focus', "Focus Terminal"); - - constructor( - id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - const instance = this._terminalService.getActiveOrCreateInstance(); - if (!instance) { - return; - } - this._terminalService.setActiveInstance(instance); - return this._terminalService.showPanel(true); - } -} - -export class FocusNextTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.FOCUS_NEXT; - public static readonly LABEL = localize('workbench.action.terminal.focusNext', "Focus Next Terminal"); - - constructor( - id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - this._terminalService.setActiveTabToNext(); - await this._terminalService.showPanel(true); - } -} - -export class FocusPreviousTerminalAction extends Action { - - public static readonly ID = TERMINAL_COMMAND_ID.FOCUS_PREVIOUS; - public static readonly LABEL = localize('workbench.action.terminal.focusPrevious', "Focus Previous Terminal"); - - constructor( - id: string, label: string, - @ITerminalService private readonly _terminalService: ITerminalService - ) { - super(id, label); - } - - async run() { - this._terminalService.setActiveTabToPrevious(); - await this._terminalService.showPanel(true); - } -} - export class TerminalPasteAction extends Action { public static readonly ID = TERMINAL_COMMAND_ID.PASTE; @@ -571,6 +395,198 @@ export class ClearTerminalAction extends Action { export function registerTerminalActions() { const category = TERMINAL_ACTION_CATEGORY; + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.NEW_IN_ACTIVE_WORKSPACE, + title: localize('workbench.action.terminal.newInActiveWorkspace', "Create New Integrated Terminal (In Active Workspace)"), + f1: true, + category + }); + } + async run(accessor: ServicesAccessor) { + const terminalService = accessor.get(ITerminalService); + const instance = terminalService.createTerminal(undefined); + if (!instance) { + return; + } + terminalService.setActiveInstance(instance); + await terminalService.showPanel(true); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.FOCUS_PREVIOUS_PANE, + title: localize('workbench.action.terminal.focusPreviousPane', "Focus Previous Pane"), + f1: true, + category, + keybinding: { + primary: KeyMod.Alt | KeyCode.LeftArrow, + secondary: [KeyMod.Alt | KeyCode.UpArrow], + mac: { + primary: KeyMod.Alt | KeyMod.CtrlCmd | KeyCode.LeftArrow, + secondary: [KeyMod.Alt | KeyMod.CtrlCmd | KeyCode.UpArrow] + }, + when: KEYBINDING_CONTEXT_TERMINAL_FOCUS, + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + async run(accessor: ServicesAccessor) { + const terminalService = accessor.get(ITerminalService); + terminalService.getActiveTab()?.focusPreviousPane(); + await terminalService.showPanel(true); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.FOCUS_NEXT_PANE, + title: localize('workbench.action.terminal.focusNextPane', "Focus Next Pane"), + f1: true, + category, + keybinding: { + primary: KeyMod.Alt | KeyCode.RightArrow, + secondary: [KeyMod.Alt | KeyCode.DownArrow], + mac: { + primary: KeyMod.Alt | KeyMod.CtrlCmd | KeyCode.RightArrow, + secondary: [KeyMod.Alt | KeyMod.CtrlCmd | KeyCode.DownArrow] + }, + when: KEYBINDING_CONTEXT_TERMINAL_FOCUS, + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + async run(accessor: ServicesAccessor) { + const terminalService = accessor.get(ITerminalService); + terminalService.getActiveTab()?.focusNextPane(); + await terminalService.showPanel(true); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.RESIZE_PANE_LEFT, + title: localize('workbench.action.terminal.resizePaneLeft', "Resize Pane Left"), + f1: true, + category, + keybinding: { + linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.LeftArrow }, + mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.LeftArrow }, + when: KEYBINDING_CONTEXT_TERMINAL_FOCUS, + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + async run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).getActiveTab()?.resizePane(Direction.Left); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.RESIZE_PANE_RIGHT, + title: localize('workbench.action.terminal.resizePaneRight', "Resize Pane Right"), + f1: true, + category, + keybinding: { + linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.RightArrow }, + mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.RightArrow }, + when: KEYBINDING_CONTEXT_TERMINAL_FOCUS, + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + async run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).getActiveTab()?.resizePane(Direction.Right); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.RESIZE_PANE_UP, + title: localize('workbench.action.terminal.resizePaneUp', "Resize Pane Up"), + f1: true, + category, + keybinding: { + mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.UpArrow }, + when: KEYBINDING_CONTEXT_TERMINAL_FOCUS, + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + async run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).getActiveTab()?.resizePane(Direction.Up); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.RESIZE_PANE_DOWN, + title: localize('workbench.action.terminal.resizePaneDown', "Resize Pane Down"), + f1: true, + category, + keybinding: { + mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.DownArrow }, + when: KEYBINDING_CONTEXT_TERMINAL_FOCUS, + weight: KeybindingWeight.WorkbenchContrib + } + }); + } + async run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).getActiveTab()?.resizePane(Direction.Down); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.FOCUS, + title: localize('workbench.action.terminal.focus', "Focus Terminal"), + f1: true, + category + }); + } + async run(accessor: ServicesAccessor) { + const terminalService = accessor.get(ITerminalService); + const instance = terminalService.getActiveOrCreateInstance(); + if (!instance) { + return; + } + terminalService.setActiveInstance(instance); + return terminalService.showPanel(true); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.FOCUS_NEXT, + title: localize('workbench.action.terminal.focusNext', "Focus Next Terminal"), + f1: true, + category + }); + } + async run(accessor: ServicesAccessor) { + const terminalService = accessor.get(ITerminalService); + terminalService.setActiveTabToNext(); + await terminalService.showPanel(true); + } + }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TERMINAL_COMMAND_ID.FOCUS_PREVIOUS, + title: localize('workbench.action.terminal.focusPrevious', "Focus Previous Terminal"), + f1: true, + category + }); + } + async run(accessor: ServicesAccessor) { + const terminalService = accessor.get(ITerminalService); + terminalService.setActiveTabToPrevious(); + await terminalService.showPanel(true); + } + }); registerAction2(class extends Action2 { constructor() { super({