提交 01b1d00a 编写于 作者: D Daniel Imms

Fix cmder external terminal initial cwd

Fixes #6466
上级 9ce81913
......@@ -6,6 +6,7 @@
'use strict';
import cp = require('child_process');
import path = require('path');
import processes = require('vs/base/node/processes');
import nls = require('vs/nls');
import errors = require('vs/base/common/errors');
......@@ -18,6 +19,11 @@ import { IProcessEnvironment } from 'vs/base/common/platform';
const TERMINAL_TITLE = nls.localize('console.title', "VS Code Console");
enum WinSpawnType {
CMD,
CMDER
}
export class WinTerminalService implements ITerminalService {
public _serviceBrand: any;
......@@ -69,15 +75,24 @@ export class WinTerminalService implements ITerminalService {
private spawnTerminal(spawner, configuration: ITerminalConfiguration, command: string, path?: string): TPromise<void> {
let terminalConfig = configuration.terminal.external;
let exec = terminalConfig.windowsExec || DEFAULT_TERMINAL_WINDOWS;
// The '""' argument is the window title. Without this, exec doesn't work when the path
// contains spaces
let cmdArgs = ['/c', 'start', '/wait', '""', exec];
const spawnType = this.getSpawnType(exec);
// Make the drive letter uppercase on Windows (see #9448)
if (path && path[1] === ':') {
path = path[0].toUpperCase() + path.substr(1);
}
// cmder ignores the environment cwd and instead opts to always open in %USERPROFILE%
// unless otherwise specified
if (spawnType === WinSpawnType.CMDER) {
spawner.spawn(exec, [path]);
return TPromise.as(void 0);
}
// The '""' argument is the window title. Without this, exec doesn't work when the path
// contains spaces
let cmdArgs = ['/c', 'start', '/wait', '""', exec];
return new TPromise<void>((c, e) => {
let env = path ? { cwd: path } : void 0;
let child = spawner.spawn(command, cmdArgs, env);
......@@ -85,6 +100,14 @@ export class WinTerminalService implements ITerminalService {
child.on('exit', () => c(null));
});
}
private getSpawnType(exec: string): WinSpawnType {
const basename = path.basename(exec).toLowerCase();
if (basename === 'cmder' || basename === 'cmder.exe') {
return WinSpawnType.CMDER;
}
return WinSpawnType.CMD;
}
}
export class MacTerminalService implements ITerminalService {
......
......@@ -5,7 +5,7 @@
'use strict';
import { equal } from 'assert';
import { deepEqual, equal } from 'assert';
import { WinTerminalService, LinuxTerminalService, MacTerminalService } from 'vs/workbench/parts/execution/electron-browser/terminalService';
import { DEFAULT_TERMINAL_WINDOWS, DEFAULT_TERMINAL_LINUX, DEFAULT_TERMINAL_OSX } from 'vs/workbench/parts/execution/electron-browser/terminal';
......@@ -103,6 +103,30 @@ suite('Execution - TerminalService', () => {
);
});
test("WinTerminalService - cmder should be spawned differently", done => {
let testShell = 'cmd';
mockConfig.terminal.external.windowsExec = 'cmder';
let testCwd = 'c:/foo';
let mockSpawner = {
spawn: (command, args, opts) => {
// assert
deepEqual(args, ['C:/foo']);
equal(opts, undefined);
done();
return { on: (evt) => evt };
}
};
let testService = new WinTerminalService(mockConfig);
(<any>testService).spawnTerminal(
mockSpawner,
mockConfig,
testShell,
testCwd,
mockOnExit,
mockOnError
);
});
test("MacTerminalService - uses terminal from configuration", done => {
let testCwd = 'path/to/workspace';
let mockSpawner = {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册