提交 8a67041e 编写于 作者: R Ramya Achutha Rao

Pass env via extension api when creating terminal

上级 49e570e1
...@@ -4852,6 +4852,10 @@ declare module 'vscode' { ...@@ -4852,6 +4852,10 @@ declare module 'vscode' {
* Args for the custom shell executable, this does not work on Windows (see #8429) * Args for the custom shell executable, this does not work on Windows (see #8429)
*/ */
shellArgs?: string[]; shellArgs?: string[];
/**
* Object with environment variables that will be added to the VS Code process.
*/
env?: { [key: string]: string };
} }
/** /**
......
...@@ -33,13 +33,14 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape ...@@ -33,13 +33,14 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
// when the extension host process goes down ? // when the extension host process goes down ?
} }
public $createTerminal(name?: string, shellPath?: string, shellArgs?: string[], waitOnExit?: boolean): TPromise<number> { public $createTerminal(name?: string, shellPath?: string, shellArgs?: string[], env?: { [key: string]: string }, waitOnExit?: boolean): TPromise<number> {
const shellLaunchConfig: IShellLaunchConfig = { const shellLaunchConfig: IShellLaunchConfig = {
name, name,
executable: shellPath, executable: shellPath,
args: shellArgs, args: shellArgs,
waitOnExit, waitOnExit,
ignoreConfigurationCwd: true ignoreConfigurationCwd: true,
env
}; };
return TPromise.as(this.terminalService.createInstance(shellLaunchConfig).id); return TPromise.as(this.terminalService.createInstance(shellLaunchConfig).id);
} }
......
...@@ -280,7 +280,7 @@ export interface MainThreadProgressShape extends IDisposable { ...@@ -280,7 +280,7 @@ export interface MainThreadProgressShape extends IDisposable {
} }
export interface MainThreadTerminalServiceShape extends IDisposable { export interface MainThreadTerminalServiceShape extends IDisposable {
$createTerminal(name?: string, shellPath?: string, shellArgs?: string[], waitOnExit?: boolean): TPromise<number>; $createTerminal(name?: string, shellPath?: string, shellArgs?: string[], env?: { [key: string]: string }, waitOnExit?: boolean): TPromise<number>;
$dispose(terminalId: number): void; $dispose(terminalId: number): void;
$hide(terminalId: number): void; $hide(terminalId: number): void;
$sendText(terminalId: number, text: string, addNewLine: boolean): void; $sendText(terminalId: number, text: string, addNewLine: boolean): void;
......
...@@ -24,6 +24,7 @@ export class ExtHostTerminal implements vscode.Terminal { ...@@ -24,6 +24,7 @@ export class ExtHostTerminal implements vscode.Terminal {
name?: string, name?: string,
shellPath?: string, shellPath?: string,
shellArgs?: string[], shellArgs?: string[],
env?: { [key: string]: string },
waitOnExit?: boolean waitOnExit?: boolean
) { ) {
this._name = name; this._name = name;
...@@ -32,7 +33,7 @@ export class ExtHostTerminal implements vscode.Terminal { ...@@ -32,7 +33,7 @@ export class ExtHostTerminal implements vscode.Terminal {
this._pidPromise = new TPromise<number>(c => { this._pidPromise = new TPromise<number>(c => {
this._pidPromiseComplete = c; this._pidPromiseComplete = c;
}); });
this._proxy.$createTerminal(name, shellPath, shellArgs, waitOnExit).then((id) => { this._proxy.$createTerminal(name, shellPath, shellArgs, env, waitOnExit).then((id) => {
this._id = id; this._id = id;
this._queuedRequests.forEach((r) => { this._queuedRequests.forEach((r) => {
r.run(this._proxy, this._id); r.run(this._proxy, this._id);
...@@ -113,7 +114,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { ...@@ -113,7 +114,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape {
} }
public createTerminalFromOptions(options: vscode.TerminalOptions): vscode.Terminal { public createTerminalFromOptions(options: vscode.TerminalOptions): vscode.Terminal {
let terminal = new ExtHostTerminal(this._proxy, options.name, options.shellPath, options.shellArgs/*, options.waitOnExit*/); let terminal = new ExtHostTerminal(this._proxy, options.name, options.shellPath, options.shellArgs, options.env/*, options.waitOnExit*/);
this._terminals.push(terminal); this._terminals.push(terminal);
return terminal; return terminal;
} }
......
...@@ -549,14 +549,7 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem { ...@@ -549,14 +549,7 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem {
shellLaunchConfig.cwd = options.cwd; shellLaunchConfig.cwd = options.cwd;
} }
if (options.env) { if (options.env) {
let env: IStringDictionary<string> = Object.create(null); shellLaunchConfig.env = options.env;
Object.keys(process.env).forEach((key) => {
env[key] = process.env[key];
});
Object.keys(options.env).forEach((key) => {
env[key] = options.env[key];
});
shellLaunchConfig.env = env;
} }
let prefersSameTerminal = task.command.presentation.panel === PanelKind.Dedicated; let prefersSameTerminal = task.command.presentation.panel === PanelKind.Dedicated;
let allowsSharedTerminal = task.command.presentation.panel === PanelKind.Shared; let allowsSharedTerminal = task.command.presentation.panel === PanelKind.Shared;
......
...@@ -775,7 +775,13 @@ export class TerminalInstance implements ITerminalInstance { ...@@ -775,7 +775,13 @@ export class TerminalInstance implements ITerminalInstance {
// TODO: This should be private/protected // TODO: This should be private/protected
// TODO: locale should not be optional // TODO: locale should not be optional
public static createTerminalEnv(parentEnv: IStringDictionary<string>, shell: IShellLaunchConfig, cwd: string, locale?: string, cols?: number, rows?: number): IStringDictionary<string> { public static createTerminalEnv(parentEnv: IStringDictionary<string>, shell: IShellLaunchConfig, cwd: string, locale?: string, cols?: number, rows?: number): IStringDictionary<string> {
const env = shell.env ? shell.env : TerminalInstance._cloneEnv(parentEnv); const env = TerminalInstance._cloneEnv(parentEnv);
if (shell.env) {
Object.keys(shell.env).forEach((key) => {
env[key] = shell.env[key];
});
}
env['PTYPID'] = process.pid.toString(); env['PTYPID'] = process.pid.toString();
env['PTYSHELL'] = shell.executable; env['PTYSHELL'] = shell.executable;
env['TERM_PROGRAM'] = 'vscode'; env['TERM_PROGRAM'] = 'vscode';
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册