diff --git a/src/vs/workbench/parts/execution/electron-browser/iterm.scpt b/src/vs/workbench/parts/execution/electron-browser/iterm.scpt deleted file mode 100644 index 0002a807644fee5266ca7e44b42d0d3ba78774c1..0000000000000000000000000000000000000000 --- a/src/vs/workbench/parts/execution/electron-browser/iterm.scpt +++ /dev/null @@ -1,25 +0,0 @@ -------------------------------------------------------------------- --- 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 diff --git a/src/vs/workbench/parts/execution/electron-browser/itermNew.scpt b/src/vs/workbench/parts/execution/electron-browser/itermNew.scpt deleted file mode 100644 index ca572682136152a511da1a52581449f49803686e..0000000000000000000000000000000000000000 --- a/src/vs/workbench/parts/execution/electron-browser/itermNew.scpt +++ /dev/null @@ -1,30 +0,0 @@ -------------------------------------------------------------------- --- 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 diff --git a/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.ts index edcacb833aded542bfef90f010ff5fd036ac770e..db5b02f14a0f20382650a965b147cae6e94a8595 100644 --- a/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.ts @@ -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 = 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."), diff --git a/src/vs/workbench/parts/execution/electron-browser/terminal.scpt b/src/vs/workbench/parts/execution/electron-browser/terminal.scpt deleted file mode 100644 index 43fc40fdb4c8763e6602622c44428f5fcc1cdd54..0000000000000000000000000000000000000000 --- a/src/vs/workbench/parts/execution/electron-browser/terminal.scpt +++ /dev/null @@ -1,26 +0,0 @@ -------------------------------------------------------------------- --- 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 diff --git a/src/vs/workbench/parts/execution/electron-browser/terminal.ts b/src/vs/workbench/parts/execution/electron-browser/terminal.ts index 57d32480109af6dc2d2bf492b16ec51400d95a78..990bcef3a69388f8b2acf1a25f499db85f6c8c7d 100644 --- a/src/vs/workbench/parts/execution/electron-browser/terminal.ts +++ b/src/vs/workbench/parts/execution/electron-browser/terminal.ts @@ -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 } }; diff --git a/src/vs/workbench/parts/execution/electron-browser/terminalService.ts b/src/vs/workbench/parts/execution/electron-browser/terminalService.ts index 228c5a6a9a6a88d1f09b1dc53b35ad60496c6973..fb190fd2395d2c558b15a099a625b8c85b1e2416 100644 --- a/src/vs/workbench/parts/execution/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/execution/electron-browser/terminalService.ts @@ -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; + + 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(); + + this.spawnTerminal(cp, configuration, path).done(null, errors.onUnexpectedError); } - private getTerminalHelperScriptPath(): TPromise { - if (this._terminalApplicationScriptPath) { - return this._terminalApplicationScriptPath; - } + private spawnTerminal(spawner, configuration: ITerminalConfiguration, path?: string): TPromise { + let terminalConfig = configuration.terminal.external; + let terminalApp = terminalConfig.macExec || DEFAULT_TERMINAL_MAC; - return this._terminalApplicationScriptPath = new TPromise((c, e) => { - let version = ''; - let child = cp.spawn('/usr/bin/osascript', ['-e', 'version of application "iTerm"']); + return new TPromise((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)); + }); } } diff --git a/src/vs/workbench/parts/execution/test/electron-browser/terminalService.test.ts b/src/vs/workbench/parts/execution/test/electron-browser/terminalService.test.ts index 587c0ff0ba3f392cd54d9f908cb52d8ee7320dfb..43f45919ba4cba68010124f76f84d2672b34343d 100644 --- a/src/vs/workbench/parts/execution/test/electron-browser/terminalService.test.ts +++ b/src/vs/workbench/parts/execution/test/electron-browser/terminalService.test.ts @@ -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); + (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); + (testService).spawnTerminal( + mockSpawner, + mockConfig, + testCwd, + mockOnExit, + mockOnError + ); + }); + test("LinuxTerminalService - uses terminal from configuration", done => { let testCwd = 'path/to/workspace'; let mockSpawner = {