提交 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 ...@@ -22,7 +22,7 @@ import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/edito
import {asFileEditorInput} from 'vs/workbench/common/editor'; import {asFileEditorInput} from 'vs/workbench/common/editor';
import {KeyMod, KeyCode} from 'vs/base/common/keyCodes'; import {KeyMod, KeyCode} from 'vs/base/common/keyCodes';
import {Extensions, IConfigurationRegistry} from 'vs/platform/configuration/common/configurationRegistry'; 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); let configurationRegistry = <IConfigurationRegistry>Registry.as(Extensions.Configuration);
configurationRegistry.registerConfiguration({ configurationRegistry.registerConfiguration({
...@@ -36,6 +36,11 @@ configurationRegistry.registerConfiguration({ ...@@ -36,6 +36,11 @@ configurationRegistry.registerConfiguration({
'description': nls.localize('terminal.external.windowsExec', "Customizes which terminal to run on Windows."), 'description': nls.localize('terminal.external.windowsExec', "Customizes which terminal to run on Windows."),
'default': DEFAULT_TERMINAL_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': { 'terminal.external.linuxExec': {
'type': 'string', 'type': 'string',
'description': nls.localize('terminal.external.linuxExec', "Customizes which terminal to run on Linux."), '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) { ...@@ -20,12 +20,15 @@ if (env.isLinux) {
export const DEFAULT_TERMINAL_LINUX = defaultTerminalLinux; export const DEFAULT_TERMINAL_LINUX = defaultTerminalLinux;
export const DEFAULT_TERMINAL_MAC = 'Terminal.app';
export const DEFAULT_TERMINAL_WINDOWS = 'cmd'; export const DEFAULT_TERMINAL_WINDOWS = 'cmd';
export interface ITerminalConfiguration { export interface ITerminalConfiguration {
terminal: { terminal: {
external: { external: {
linuxExec: string, linuxExec: string,
macExec: string,
windowsExec: string windowsExec: string
} }
}; };
......
...@@ -5,11 +5,10 @@ ...@@ -5,11 +5,10 @@
'use strict'; 'use strict';
import errors = require('vs/base/common/errors'); import errors = require('vs/base/common/errors');
import uri from 'vs/base/common/uri';
import {TPromise} from 'vs/base/common/winjs.base'; import {TPromise} from 'vs/base/common/winjs.base';
import {ITerminalService} from 'vs/workbench/parts/execution/common/execution'; import {ITerminalService} from 'vs/workbench/parts/execution/common/execution';
import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; 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 cp = require('child_process');
import processes = require('vs/base/node/processes'); import processes = require('vs/base/node/processes');
...@@ -47,49 +46,26 @@ export class WinTerminalService implements ITerminalService { ...@@ -47,49 +46,26 @@ export class WinTerminalService implements ITerminalService {
export class MacTerminalService implements ITerminalService { export class MacTerminalService implements ITerminalService {
public serviceId = ITerminalService; public serviceId = ITerminalService;
private _terminalApplicationScriptPath: TPromise<string>;
constructor(
@IConfigurationService private _configurationService: IConfigurationService
) { }
public openTerminal(path?: string): void { public openTerminal(path?: string): void {
this.getTerminalHelperScriptPath().done(helperPath => { const configuration = this._configurationService.getConfiguration<ITerminalConfiguration>();
let args = [helperPath];
if (path) {
args.push(path);
}
cp.spawn('/usr/bin/osascript', args); this.spawnTerminal(cp, configuration, path).done(null, errors.onUnexpectedError);
}, errors.onUnexpectedError);
} }
private getTerminalHelperScriptPath(): TPromise<string> { private spawnTerminal(spawner, configuration: ITerminalConfiguration, path?: string): TPromise<void> {
if (this._terminalApplicationScriptPath) { let terminalConfig = configuration.terminal.external;
return this._terminalApplicationScriptPath; let terminalApp = terminalConfig.macExec || DEFAULT_TERMINAL_MAC;
}
return this._terminalApplicationScriptPath = new TPromise<string>((c, e) => { return new TPromise<void>((c, e) => {
let version = ''; let child = spawner.spawn('/usr/bin/open', ['-a', terminalApp, path]);
let child = cp.spawn('/usr/bin/osascript', ['-e', 'version of application "iTerm"']);
child.on('error', e); child.on('error', e);
child.stdout.on('data', (data) => { child.on('exit', () => c(null));
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);
} }
} }
......
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
'use strict'; 'use strict';
import {equal} from 'assert'; import {equal} from 'assert';
import {WinTerminalService, LinuxTerminalService} from 'vs/workbench/parts/execution/electron-browser/terminalService'; import {WinTerminalService, LinuxTerminalService, MacTerminalService} from 'vs/workbench/parts/execution/electron-browser/terminalService';
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';
suite('Execution - TerminalService', () => { suite('Execution - TerminalService', () => {
let mockOnExit; let mockOnExit;
...@@ -19,6 +19,7 @@ suite('Execution - TerminalService', () => { ...@@ -19,6 +19,7 @@ suite('Execution - TerminalService', () => {
terminal: { terminal: {
external: { external: {
windowsExec: 'testWindowsShell', windowsExec: 'testWindowsShell',
macExec: 'testMacShell',
linuxExec: 'testLinuxShell' linuxExec: 'testLinuxShell'
} }
} }
...@@ -78,6 +79,51 @@ suite('Execution - TerminalService', () => { ...@@ -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 => { test("LinuxTerminalService - uses terminal from configuration", done => {
let testCwd = 'path/to/workspace'; let testCwd = 'path/to/workspace';
let mockSpawner = { let mockSpawner = {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册