提交 0b788756 编写于 作者: D Daniel Imms

Create split vertical command

上级 b10ccf74
......@@ -165,6 +165,7 @@ export interface ITerminalService {
setActiveInstanceToNext(): void;
setActiveInstanceToPrevious(): void;
getActiveOrCreateInstance(wasNewTerminalAction?: boolean): ITerminalInstance;
splitInstanceVertically(instance: ITerminalInstance): void;
showPanel(focus?: boolean): TPromise<void>;
hidePanel(): void;
......@@ -181,12 +182,13 @@ export interface ITerminalService {
export interface ITerminalTab {
terminalInstances: ITerminalInstance[];
title: string;
onDisposed: Event<ITerminalTab>;
attachToElement(element: HTMLElement): void;
setVisible(visible: boolean): void;
layout(width: number, height: number): void;
addDisposable(disposable: IDisposable): void;
split(terminalFocusContextKey: IContextKey<boolean>, configHelper: ITerminalConfigHelper, shellLaunchConfig: IShellLaunchConfig): void;
split(terminalFocusContextKey: IContextKey<boolean>, configHelper: ITerminalConfigHelper, shellLaunchConfig: IShellLaunchConfig): ITerminalInstance;
}
export interface ITerminalInstance {
......
......@@ -221,6 +221,39 @@ export abstract class TerminalService implements ITerminalService {
this.setActiveInstanceByIndex(newIndex);
}
public splitInstanceVertically(instanceToSplit: ITerminalInstance): void {
const tab = this._getTabForInstance(instanceToSplit);
if (!tab) {
return;
}
const instance = tab.split(this._terminalFocusContextKey, this.configHelper, {});
// TOOD: The below should be shared with ITerminalService.createInstance
tab.addDisposable(tab.onDisposed(this._onTabDisposed.fire, this._onTabDisposed));
instance.addDisposable(instance.onDisposed(this._onInstanceDisposed.fire, this._onInstanceDisposed));
instance.addDisposable(instance.onTitleChanged(this._onInstanceTitleChanged.fire, this._onInstanceTitleChanged));
instance.addDisposable(instance.onProcessIdReady(this._onInstanceProcessIdReady.fire, this._onInstanceProcessIdReady));
this._onInstancesChanged.fire();
// TODO: This shouldn't be needed
tab.setVisible(true);
}
private _getTabForInstance(instance: ITerminalInstance): ITerminalTab {
let instanceIndex = this._activeTabIndex;
let currentTabIndex = 0;
while (instanceIndex >= 0 && currentTabIndex < this._terminalTabs.length) {
const tab = this._terminalTabs[currentTabIndex];
const count = tab.terminalInstances.length;
if (instanceIndex < count) {
return tab;
}
if (instanceIndex > count) {
instanceIndex -= count;
}
}
return null;
}
public showPanel(focus?: boolean): TPromise<void> {
return new TPromise<void>((complete) => {
let panel = this._panelService.getActivePanel();
......
......@@ -18,7 +18,7 @@ import { TERMINAL_DEFAULT_SHELL_UNIX_LIKE, TERMINAL_DEFAULT_SHELL_WINDOWS } from
import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions';
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
import { KillTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, CreateNewInActiveWorkspaceTerminalAction, FocusActiveTerminalAction, FocusNextTerminalAction, FocusPreviousTerminalAction, SelectDefaultShellWindowsTerminalAction, RunSelectedTextInTerminalAction, RunActiveFileInTerminalAction, ScrollDownTerminalAction, ScrollDownPageTerminalAction, ScrollToBottomTerminalAction, ScrollUpTerminalAction, ScrollUpPageTerminalAction, ScrollToTopTerminalAction, TerminalPasteAction, ToggleTerminalAction, ClearTerminalAction, AllowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand, RenameTerminalAction, SelectAllTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, ShowNextFindTermTerminalFindWidgetAction, ShowPreviousFindTermTerminalFindWidgetAction, DeleteWordLeftTerminalAction, DeleteWordRightTerminalAction, QuickOpenActionTermContributor, QuickOpenTermAction, TERMINAL_PICKER_PREFIX, MoveToLineStartTerminalAction, MoveToLineEndTerminalAction } from 'vs/workbench/parts/terminal/electron-browser/terminalActions';
import { KillTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, CreateNewInActiveWorkspaceTerminalAction, FocusActiveTerminalAction, FocusNextTerminalAction, FocusPreviousTerminalAction, SelectDefaultShellWindowsTerminalAction, RunSelectedTextInTerminalAction, RunActiveFileInTerminalAction, ScrollDownTerminalAction, ScrollDownPageTerminalAction, ScrollToBottomTerminalAction, ScrollUpTerminalAction, ScrollUpPageTerminalAction, ScrollToTopTerminalAction, TerminalPasteAction, ToggleTerminalAction, ClearTerminalAction, AllowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand, RenameTerminalAction, SelectAllTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, ShowNextFindTermTerminalFindWidgetAction, ShowPreviousFindTermTerminalFindWidgetAction, DeleteWordLeftTerminalAction, DeleteWordRightTerminalAction, QuickOpenActionTermContributor, QuickOpenTermAction, TERMINAL_PICKER_PREFIX, MoveToLineStartTerminalAction, MoveToLineEndTerminalAction, SplitVerticalTerminalAction } from 'vs/workbench/parts/terminal/electron-browser/terminalActions';
import { Registry } from 'vs/platform/registry/common/platform';
import { ShowAllCommandsAction } from 'vs/workbench/parts/quickopen/browser/commandsHandler';
import { SyncActionDescriptor } from 'vs/platform/actions/common/actions';
......@@ -409,6 +409,7 @@ actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(MoveToLineEndTer
primary: null,
mac: { primary: KeyMod.CtrlCmd | KeyCode.RightArrow }
}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Move To Line End', category);
actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(SplitVerticalTerminalAction, SplitVerticalTerminalAction.ID, SplitVerticalTerminalAction.LABEL), 'Terminal: Split Vertically', category);
terminalCommands.setup();
......
......@@ -296,6 +296,27 @@ export class CreateNewInActiveWorkspaceTerminalAction extends Action {
}
}
export class SplitVerticalTerminalAction extends Action {
public static readonly ID = 'workbench.action.terminal.splitVertical';
public static readonly LABEL = nls.localize('workbench.action.terminal.splitVertical', "Split the terminal vertically");
constructor(
id: string, label: string,
@ITerminalService private _terminalService: ITerminalService
) {
super(id, label);
}
public run(event?: any): TPromise<any> {
const instance = this._terminalService.getActiveInstance();
if (!instance) {
return TPromise.as(void 0);
}
this._terminalService.splitInstanceVertically(instance);
return this._terminalService.showPanel(true);
}
}
export class FocusActiveTerminalAction extends Action {
public static readonly ID = 'workbench.action.terminal.focus';
......
......@@ -291,7 +291,7 @@ export class TerminalTab extends Disposable implements ITerminalTab {
terminalFocusContextKey: IContextKey<boolean>,
configHelper: TerminalConfigHelper,
shellLaunchConfig: IShellLaunchConfig
): void {
): ITerminalInstance {
const instance = this._instantiationService.createInstance(TerminalInstance,
terminalFocusContextKey,
configHelper,
......@@ -304,6 +304,8 @@ export class TerminalTab extends Disposable implements ITerminalTab {
this._rootSplitPane.split(instance);
// TOOD: Set this correctly
this._activeInstanceIndex = 1;
return instance;
}
public addDisposable(disposable: IDisposable): void {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册