From 296699027228ddf65642b59730da775c90efa78a Mon Sep 17 00:00:00 2001 From: Pine Wu Date: Tue, 13 Sep 2016 14:07:16 -0700 Subject: [PATCH] Add shellArgs. Fix #10917 --- src/vs/vscode.d.ts | 2 +- src/vs/workbench/api/node/extHost.api.impl.ts | 4 ++-- src/vs/workbench/api/node/extHost.protocol.ts | 2 +- src/vs/workbench/api/node/extHostTerminalService.ts | 9 +++++---- src/vs/workbench/api/node/mainThreadTerminalService.ts | 4 ++-- .../parts/terminal/electron-browser/terminal.ts | 2 +- .../terminal/electron-browser/terminalInstance.ts | 10 ++++++---- .../parts/terminal/electron-browser/terminalService.ts | 10 +++++++--- 8 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 33044f955f6..024de4ba099 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3500,7 +3500,7 @@ declare namespace vscode { * @param shellPath Optional path to a custom shell executable to be used in the terminal. * @return A new Terminal. */ - export function createTerminal(name?: string, shellPath?: string): Terminal; + export function createTerminal(name?: string, shellPath?: string, shellArgs?: string[]): Terminal; } /** diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 0533d77c825..8190d313b37 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -260,8 +260,8 @@ export class ExtHostAPIImplementation { createOutputChannel(name: string): vscode.OutputChannel { return extHostOutputService.createOutputChannel(name); }, - createTerminal(name?: string, shellPath?: string): vscode.Terminal { - return extHostTerminalService.createTerminal(name, shellPath); + createTerminal(name?: string, shellPath?: string, shellArgs?: string[]): vscode.Terminal { + return extHostTerminalService.createTerminal(name, shellPath, shellArgs); } }; diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 287936c1410..2b0c5345d70 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -153,7 +153,7 @@ export abstract class MainThreadOutputServiceShape { } export abstract class MainThreadTerminalServiceShape { - $createTerminal(name?: string, shellPath?: string): number { throw ni(); } + $createTerminal(name?: string, shellPath?: string, shellArgs?: string[]): number { throw ni(); } $dispose(terminalId: number): void { throw ni(); } $hide(terminalId: number): void { throw ni(); } $sendText(terminalId: number, text: string, addNewLine: boolean): void { throw ni(); } diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 74d0de54efa..79e19be8d68 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -12,16 +12,17 @@ export class ExtHostTerminal implements vscode.Terminal { public _name: string; public _shellPath: string; + public _shellArgs: string[]; private _id: number; private _proxy: MainThreadTerminalServiceShape; private _disposed: boolean; - constructor(proxy: MainThreadTerminalServiceShape, id: number, name?: string, shellPath?: string) { + constructor(proxy: MainThreadTerminalServiceShape, id: number, name?: string, shellPath?: string, shellArgs?: string[]) { this._name = name; this._shellPath = shellPath; this._proxy = proxy; - this._id = this._proxy.$createTerminal(name, shellPath); + this._id = this._proxy.$createTerminal(name, shellPath, shellArgs); } public get name(): string { @@ -66,7 +67,7 @@ export class ExtHostTerminalService { this._proxy = threadService.get(MainContext.MainThreadTerminalService); } - public createTerminal(name?: string, shellPath?: string): vscode.Terminal { - return new ExtHostTerminal(this._proxy, -1, name, shellPath); + public createTerminal(name?: string, shellPath?: string, shellArgs?: string[]): vscode.Terminal { + return new ExtHostTerminal(this._proxy, -1, name, shellPath, shellArgs); } } diff --git a/src/vs/workbench/api/node/mainThreadTerminalService.ts b/src/vs/workbench/api/node/mainThreadTerminalService.ts index 94d11f0aa92..67c0c1bd8fe 100644 --- a/src/vs/workbench/api/node/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/node/mainThreadTerminalService.ts @@ -19,8 +19,8 @@ export class MainThreadTerminalService extends MainThreadTerminalServiceShape { super(); } - public $createTerminal(name?: string, shellPath?: string): number { - return this.terminalService.createInstance(name, shellPath).id; + public $createTerminal(name?: string, shellPath?: string, shellArgs?: string[]): number { + return this.terminalService.createInstance(name, shellPath, shellArgs).id; } public $show(terminalId: number, preserveFocus: boolean): void { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts index 794b7a2ce95..1c558a60f49 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts @@ -62,7 +62,7 @@ export interface ITerminalService { onInstanceTitleChanged: Event; terminalInstances: ITerminalInstance[]; - createInstance(name?: string, shellPath?: string): ITerminalInstance; + createInstance(name?: string, shellPath?: string, shellArgs?: string[]): ITerminalInstance; getInstanceFromId(terminalId: number): ITerminalInstance; getInstanceLabels(): string[]; getActiveInstance(): ITerminalInstance; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index f895e8ee838..e703cdaaeab 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -52,13 +52,13 @@ export class TerminalInstance implements ITerminalInstance { private container: HTMLElement, private workspace: IWorkspace, name: string, - shellPath: string, + shell: IShell, @IKeybindingService private keybindingService: IKeybindingService, @IMessageService private messageService: IMessageService ) { this._id = TerminalInstance.ID_COUNTER++; this._onTitleChanged = new Emitter(); - this.createProcess(workspace, name, shellPath); + this.createProcess(workspace, name, shell); if (container) { this.attachToElement(container); @@ -210,9 +210,11 @@ export class TerminalInstance implements ITerminalInstance { return typeof data === 'string' ? data.replace(TerminalInstance.EOL_REGEX, os.EOL) : data; } - private createProcess(workspace: IWorkspace, name?: string, shellPath?: string) { + private createProcess(workspace: IWorkspace, name?: string, shell?: IShell) { let locale = this.configHelper.isSetLocaleVariables() ? platform.locale : undefined; - let shell = shellPath ? { executable: shellPath, args: [] } : this.configHelper.getShell(); + if (!shell) { + shell = this.configHelper.getShell(); + } let env = TerminalInstance.createTerminalEnv(process.env, shell, workspace, locale); this._title = name ? name : ''; this.process = cp.fork('./terminalProcess', [], { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index b9bc29f817d..fcfc0a8f8a0 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -14,7 +14,7 @@ import { IPartService } from 'vs/workbench/services/part/common/partService'; import { ITerminalInstance, ITerminalService, KEYBINDING_CONTEXT_TERMINAL_FOCUS, TERMINAL_PANEL_ID } from 'vs/workbench/parts/terminal/electron-browser/terminal'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { TPromise } from 'vs/base/common/winjs.base'; -import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-browser/terminalConfigHelper'; +import { TerminalConfigHelper, IShell } from 'vs/workbench/parts/terminal/electron-browser/terminalConfigHelper'; import { TerminalInstance } from 'vs/workbench/parts/terminal/electron-browser/terminalInstance'; export class TerminalService implements ITerminalService { @@ -51,7 +51,11 @@ export class TerminalService implements ITerminalService { this._configHelper = this.instantiationService.createInstance(TerminalConfigHelper, platform.platform); } - public createInstance(name?: string, shellPath?: string): ITerminalInstance { + public createInstance(name?: string, shellPath?: string, shellArgs?: string[]): ITerminalInstance { + let shell: IShell = { + executable: shellPath, + args: shellArgs + }; let terminalInstance = this.instantiationService.createInstance(TerminalInstance, this.terminalFocusContextKey, this.onTerminalInstanceDispose.bind(this), @@ -59,7 +63,7 @@ export class TerminalService implements ITerminalService { this.terminalContainer, this.workspaceContextService.getWorkspace(), name, - shellPath); + shell); terminalInstance.addDisposable(terminalInstance.onTitleChanged(this._onInstanceTitleChanged.fire, this._onInstanceTitleChanged)); this.terminalInstances.push(terminalInstance); if (this.terminalInstances.length === 1) {