diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index 7a507f1eccb44ea9ca02763bb786513917f8fa26..edf262e300d25388e9f73e316dcb34c00565245e 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -10,7 +10,7 @@ import {SyncActionDescriptor} from 'vs/platform/actions/common/actions'; import {registerSingleton} from 'vs/platform/instantiation/common/extensions'; import {IWorkbenchActionRegistry, Extensions as ActionExtensions} from 'vs/workbench/common/actionRegistry'; import {TerminalService} from 'vs/workbench/parts/terminal/electron-browser/terminalService'; -import {CloseTerminalAction, CreateNewTerminalAction, FocusTerminalAction, ToggleTerminalAction} from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; +import {CloseTerminalAction, CreateNewTerminalAction, FocusTerminalAction, FocusNextTerminalAction, FocusPreviousTerminalAction, ToggleTerminalAction} from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; import {ITerminalService, TERMINAL_PANEL_ID, TERMINAL_DEFAULT_SHELL_LINUX, TERMINAL_DEFAULT_SHELL_OSX, TERMINAL_DEFAULT_SHELL_WINDOWS} from 'vs/workbench/parts/terminal/electron-browser/terminal'; import * as panel from 'vs/workbench/browser/panel'; import {Registry} from 'vs/platform/platform'; @@ -91,16 +91,15 @@ registerSingleton(ITerminalService, TerminalService); // On mac cmd+` is reserved to cycle between windows, that's why the keybindings use WinCtrl let actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK, - mac: { primary: KeyMod.WinCtrl | KeyCode.US_BACKTICK } -}), 'View: ' + ToggleTerminalAction.LABEL, nls.localize('viewCategory', "View")); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusTerminalAction, FocusTerminalAction.ID, FocusTerminalAction.LABEL), FocusTerminalAction.LABEL); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(CloseTerminalAction, CloseTerminalAction.ID, CloseTerminalAction.LABEL), CloseTerminalAction.LABEL); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(CreateNewTerminalAction, CreateNewTerminalAction.ID, CreateNewTerminalAction.LABEL, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.US_BACKTICK, mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.US_BACKTICK } }), CreateNewTerminalAction.LABEL); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(CloseTerminalAction, CloseTerminalAction.ID, CloseTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_X, - mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.KEY_X } -}), CloseTerminalAction.LABEL); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusTerminalAction, FocusTerminalAction.ID, FocusTerminalAction.LABEL), FocusTerminalAction.LABEL); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusNextTerminalAction, FocusNextTerminalAction.ID, FocusNextTerminalAction.LABEL), CloseTerminalAction.LABEL); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusPreviousTerminalAction, FocusPreviousTerminalAction.ID, FocusPreviousTerminalAction.LABEL), CloseTerminalAction.LABEL); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK, + mac: { primary: KeyMod.WinCtrl | KeyCode.US_BACKTICK } +}), 'View: ' + ToggleTerminalAction.LABEL, nls.localize('viewCategory', "View")); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts index bddf8d433ddea5093dce19199245e6f5de04dc7a..3e65a1a1ac9640cc4b3f550baf06c2c50722f259 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts @@ -45,5 +45,7 @@ export interface ITerminalService { close(): TPromise; createNew(): TPromise; focus(): TPromise; + focusNext(): TPromise; + focusPrevious(): TPromise; toggle(): TPromise; } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts index e9ef1ae0911507c540593b2074d276e7717d0445..b7b35f4bf24244584e51cd735d28df61ea95fc87 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts @@ -74,4 +74,38 @@ export class FocusTerminalAction extends Action { public run(event?: any): TPromise { return this.terminalService.focus(); } +} + +export class FocusNextTerminalAction extends Action { + + public static ID = 'workbench.action.terminal.focusNext'; + public static LABEL = nls.localize('workbench.action.terminal.focusNext', "Terminal: Focus Next Terminal"); + + constructor( + id: string, label: string, + @ITerminalService private terminalService: ITerminalService + ) { + super(id, label); + } + + public run(event?: any): TPromise { + return this.terminalService.focusNext(); + } +} + +export class FocusPreviousTerminalAction extends Action { + + public static ID = 'workbench.action.terminal.focusPrevious'; + public static LABEL = nls.localize('workbench.action.terminal.focusPrevious', "Terminal: Focus Previous Terminal"); + + constructor( + id: string, label: string, + @ITerminalService private terminalService: ITerminalService + ) { + super(id, label); + } + + public run(event?: any): TPromise { + return this.terminalService.focusPrevious(); + } } \ No newline at end of file diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index 742417bb1bff6553e8c0264a5f0f828543ccbf5a..f0be5f9b185f0a096eb634e1f15a27d8f4773e35 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -158,13 +158,34 @@ export class TerminalPanel extends Panel { this.layout(new Dimension(this.parentDomElement.offsetWidth, this.parentDomElement.offsetHeight)); } - public focus(): void { if (this.terminalInstances.length > 0) { this.terminalInstances[this.activeTerminalIndex].focus(true); } } + public focusNext(): void { + if (this.terminalInstances.length > 1) { + this.activeTerminalIndex++; + if (this.activeTerminalIndex >= this.terminalInstances.length) { + this.activeTerminalIndex = 0; + } + this.setActiveTerminal(this.activeTerminalIndex); + this.focus(); + } + } + + public focusPrevious(): void { + if (this.terminalInstances.length > 1) { + this.activeTerminalIndex--; + if (this.activeTerminalIndex < 0) { + this.activeTerminalIndex = this.terminalInstances.length - 1; + } + this.setActiveTerminal(this.activeTerminalIndex); + this.focus(); + } + } + public dispose(): void { this.toDispose = lifecycle.dispose(this.toDispose); while (this.terminalInstances.length > 0) { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index aac45341cac2cf6f9db8bbfd477567bb51fddd1b..1200f74b74f866a01689ce963609a5e1de982cf3 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -22,6 +22,32 @@ export class TerminalService implements ITerminalService { return this.panelService.openPanel(TERMINAL_PANEL_ID, true); } + public focusNext(): TPromise { + return this.focus().then(() => { + let panel = this.panelService.getActivePanel(); + if (!panel || panel.getId() !== TERMINAL_PANEL_ID) { + return this.toggle().then(() => { + panel = this.panelService.getActivePanel(); + return (panel).focusNext(); + }); + } + return (panel).focusNext(); + }); + } + + public focusPrevious(): TPromise { + return this.focus().then(() => { + let panel = this.panelService.getActivePanel(); + if (!panel || panel.getId() !== TERMINAL_PANEL_ID) { + return this.toggle().then(() => { + panel = this.panelService.getActivePanel(); + return (panel).focusPrevious(); + }); + } + return (panel).focusPrevious(); + }); + } + public toggle(): TPromise { const panel = this.panelService.getActivePanel(); if (panel && panel.getId() === TERMINAL_PANEL_ID) {