提交 557745c8 编写于 作者: A Andre Weinand

resolved merge conflicts of PR #6136

-------------------------------------------------------------------
-- Copyright (c) Microsoft Corporation. All rights reserved.
-- Licensed under the MIT License.
-- See License.txt in the project root for license information.
-------------------------------------------------------------------
on run argv
set command to "cd \"" & argv & "\"; clear" as string
tell application "iTerm"
activate
if (count terminal) = 0 then
set myterm to (make new terminal)
else
set myterm to (current terminal)
end if
tell myterm
tell (launch session "Default")
write text command
end tell
end tell
end tell
end run
-------------------------------------------------------------------
-- Copyright (c) Microsoft Corporation. All rights reserved.
-- Licensed under the MIT License.
-- See License.txt in the project root for license information.
-------------------------------------------------------------------
on run argv
set command to "cd \"" & argv & "\"; clear" as string
tell application "iTerm"
activate
set theWindow to current window
if theWindow = missing value then
set theWindow to (create window with default profile)
tell theWindow
write (current session) text command
end tell
else
tell theWindow
set theTab to (create tab with default profile)
tell theTab
write (current session) text command
end tell
end tell
end if
end tell
end run
......@@ -22,7 +22,7 @@ import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/edito
import {asFileEditorInput} from 'vs/workbench/common/editor';
import {KeyMod, KeyCode} from 'vs/base/common/keyCodes';
import {Extensions, IConfigurationRegistry} from 'vs/platform/configuration/common/configurationRegistry';
import {DEFAULT_TERMINAL_WINDOWS, DEFAULT_TERMINAL_LINUX} from 'vs/workbench/parts/execution/electron-browser/terminal';
import {DEFAULT_TERMINAL_WINDOWS, DEFAULT_TERMINAL_LINUX, DEFAULT_TERMINAL_MAC} from 'vs/workbench/parts/execution/electron-browser/terminal';
let configurationRegistry = <IConfigurationRegistry>Registry.as(Extensions.Configuration);
configurationRegistry.registerConfiguration({
......@@ -36,6 +36,11 @@ configurationRegistry.registerConfiguration({
'description': nls.localize('terminal.external.windowsExec', "Customizes which terminal to run on Windows."),
'default': DEFAULT_TERMINAL_WINDOWS
},
'terminal.external.macExec': {
'type': 'string',
'description': nls.localize('terminal.external.macExec', "Customizes which terminal Application to run on Mac OS."),
'default': DEFAULT_TERMINAL_MAC
},
'terminal.external.linuxExec': {
'type': 'string',
'description': nls.localize('terminal.external.linuxExec', "Customizes which terminal to run on Linux."),
......
-------------------------------------------------------------------
-- Copyright (c) Microsoft Corporation. All rights reserved.
-- Licensed under the MIT License.
-- See License.txt in the project root for license information.
-------------------------------------------------------------------
on run argv
set command to "cd \"" & argv & "\"; clear" as string
tell application "Terminal"
activate
set targetWindow to null
repeat with currentWindow in windows
if currentWindow is not busy then
set targetWindow to currentWindow
end if
end repeat
if targetWindow null then
do script command in targetWindow
else
do script command
end if
end tell
end run
......@@ -20,12 +20,15 @@ if (env.isLinux) {
export const DEFAULT_TERMINAL_LINUX = defaultTerminalLinux;
export const DEFAULT_TERMINAL_MAC = 'Terminal.app';
export const DEFAULT_TERMINAL_WINDOWS = 'cmd';
export interface ITerminalConfiguration {
terminal: {
external: {
linuxExec: string,
macExec: string,
windowsExec: string
}
};
......
......@@ -5,11 +5,10 @@
'use strict';
import errors = require('vs/base/common/errors');
import uri from 'vs/base/common/uri';
import {TPromise} from 'vs/base/common/winjs.base';
import {ITerminalService} from 'vs/workbench/parts/execution/common/execution';
import {IConfigurationService} from 'vs/platform/configuration/common/configuration';
import {ITerminalConfiguration, DEFAULT_TERMINAL_WINDOWS, DEFAULT_TERMINAL_LINUX} from 'vs/workbench/parts/execution/electron-browser/terminal';
import {ITerminalConfiguration, DEFAULT_TERMINAL_WINDOWS, DEFAULT_TERMINAL_LINUX, DEFAULT_TERMINAL_MAC} from 'vs/workbench/parts/execution/electron-browser/terminal';
import cp = require('child_process');
import processes = require('vs/base/node/processes');
......@@ -47,49 +46,26 @@ export class WinTerminalService implements ITerminalService {
export class MacTerminalService implements ITerminalService {
public serviceId = ITerminalService;
private _terminalApplicationScriptPath: TPromise<string>;
constructor(
@IConfigurationService private _configurationService: IConfigurationService
) { }
public openTerminal(path?: string): void {
this.getTerminalHelperScriptPath().done(helperPath => {
let args = [helperPath];
if (path) {
args.push(path);
}
cp.spawn('/usr/bin/osascript', args);
}, errors.onUnexpectedError);
const configuration = this._configurationService.getConfiguration<ITerminalConfiguration>();
this.spawnTerminal(cp, configuration, path).done(null, errors.onUnexpectedError);
}
private getTerminalHelperScriptPath(): TPromise<string> {
if (this._terminalApplicationScriptPath) {
return this._terminalApplicationScriptPath;
}
private spawnTerminal(spawner, configuration: ITerminalConfiguration, path?: string): TPromise<void> {
let terminalConfig = configuration.terminal.external;
let terminalApp = terminalConfig.macExec || DEFAULT_TERMINAL_MAC;
return this._terminalApplicationScriptPath = new TPromise<string>((c, e) => {
let version = '';
let child = cp.spawn('/usr/bin/osascript', ['-e', 'version of application "iTerm"']);
return new TPromise<void>((c, e) => {
let child = spawner.spawn('/usr/bin/open', ['-a', terminalApp, path]);
child.on('error', e);
child.stdout.on('data', (data) => {
version += data.toString();
});
child.on('exit', (code: number) => {
let script = 'terminal.scpt';
if (code === 0) {
const match = /(\d+).(\d+).(\d+)/.exec(version);
if (match.length >= 4) {
const major = +match[1];
const minor = +match[2];
const veryMinor = +match[3];
if ((major < 2) || (major === 2 && minor < 9) || (major === 2 && minor === 9 && veryMinor < 20150414)) {
script = 'iterm.scpt';
} else {
script = 'itermNew.scpt'; // versions >= 2.9.20150414 use new script syntax
}
}
}
c(script);
});
}).then(name => uri.parse(require.toUrl(`vs/workbench/parts/execution/electron-browser/${name}`)).fsPath);
child.on('exit', () => c(null));
});
}
}
......
......@@ -6,8 +6,8 @@
'use strict';
import {equal} from 'assert';
import {WinTerminalService, LinuxTerminalService} from 'vs/workbench/parts/execution/electron-browser/terminalService';
import {DEFAULT_TERMINAL_WINDOWS, DEFAULT_TERMINAL_LINUX} from 'vs/workbench/parts/execution/electron-browser/terminal';
import {WinTerminalService, LinuxTerminalService, MacTerminalService} from 'vs/workbench/parts/execution/electron-browser/terminalService';
import {DEFAULT_TERMINAL_WINDOWS, DEFAULT_TERMINAL_LINUX, DEFAULT_TERMINAL_MAC} from 'vs/workbench/parts/execution/electron-browser/terminal';
suite('Execution - TerminalService', () => {
let mockOnExit;
......@@ -19,6 +19,7 @@ suite('Execution - TerminalService', () => {
terminal: {
external: {
windowsExec: 'testWindowsShell',
macExec: 'testMacShell',
linuxExec: 'testLinuxShell'
}
}
......@@ -78,6 +79,51 @@ suite('Execution - TerminalService', () => {
);
});
test("MacTerminalService - uses terminal from configuration", done => {
let testCwd = 'path/to/workspace';
let mockSpawner = {
spawn: (command, args, opts) => {
// assert
equal(args[1], mockConfig.terminal.external.macExec, 'terminal should equal expected');
done();
return {
on: (evt) => evt
}
}
};
let testService = new MacTerminalService(mockConfig);
(<any>testService).spawnTerminal(
mockSpawner,
mockConfig,
testCwd,
mockOnExit,
mockOnError
);
});
test("MacTerminalService - uses default terminal when configuration.terminal.external.macExec is undefined", done => {
let testCwd = 'path/to/workspace';
let mockSpawner = {
spawn: (command, args, opts) => {
// assert
equal(args[1], DEFAULT_TERMINAL_MAC, 'terminal should equal expected')
done();
return {
on: (evt) => evt
}
}
};
mockConfig.externalTerminal.macExec = undefined;
let testService = new MacTerminalService(mockConfig);
(<any>testService).spawnTerminal(
mockSpawner,
mockConfig,
testCwd,
mockOnExit,
mockOnError
);
});
test("LinuxTerminalService - 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.
先完成此消息的编辑!
想要评论请 注册