From 891b8c0bf0b747170ffe35e22b61f6db3b78277b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 19 Apr 2016 12:31:10 -0700 Subject: [PATCH 01/30] Integrated terminal prototype Part of #143 --- package.json | 2 + .../parts/terminal/common/terminal.ts | 20 +++++ .../node/media/terminal.contribution.css | 43 +++++++++ .../workbench/parts/terminal/node/pty.js.d.ts | 16 ++++ .../parts/terminal/node/term.js.d.ts | 17 ++++ .../terminal/node/terminal.contribution.ts | 51 +++++++++++ .../parts/terminal/node/terminalActions.ts | 37 ++++++++ .../parts/terminal/node/terminalPanel.ts | 89 +++++++++++++++++++ .../parts/terminal/node/terminalService.ts | 21 +++++ src/vs/workbench/workbench.main.js | 2 + 10 files changed, 298 insertions(+) create mode 100644 src/vs/workbench/parts/terminal/common/terminal.ts create mode 100644 src/vs/workbench/parts/terminal/node/media/terminal.contribution.css create mode 100644 src/vs/workbench/parts/terminal/node/pty.js.d.ts create mode 100644 src/vs/workbench/parts/terminal/node/term.js.d.ts create mode 100644 src/vs/workbench/parts/terminal/node/terminal.contribution.ts create mode 100644 src/vs/workbench/parts/terminal/node/terminalActions.ts create mode 100644 src/vs/workbench/parts/terminal/node/terminalPanel.ts create mode 100644 src/vs/workbench/parts/terminal/node/terminalService.ts diff --git a/package.json b/package.json index 4a72af69404..40770133839 100644 --- a/package.json +++ b/package.json @@ -26,8 +26,10 @@ "https-proxy-agent": "^0.3.5", "iconv-lite": "^0.4.13", "native-keymap": "^0.1.2", + "pty.js": "^0.3.0", "sax": "^1.1.1", "semver": "^4.2.0", + "term.js": "0.0.7", "vscode-debugprotocol": "1.8.0-pre.3", "vscode-textmate": "^1.0.11", "winreg": "0.0.12", diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts new file mode 100644 index 00000000000..9fbb0644ecd --- /dev/null +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import {TPromise} from 'vs/base/common/winjs.base'; +import {createDecorator, ServiceIdentifier} from 'vs/platform/instantiation/common/instantiation'; + +export const TERMINAL_PANEL_ID = 'workbench.panel.terminal'; + +export const TERMINAL_SERVICE_ID = 'terminalService'; + +export var ITerminalService = createDecorator(TERMINAL_SERVICE_ID); + +export interface ITerminalService { + serviceId: ServiceIdentifier; + + show(): TPromise; +} diff --git a/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css b/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css new file mode 100644 index 00000000000..ed76aefc063 --- /dev/null +++ b/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css @@ -0,0 +1,43 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.monaco-workbench .integrated-terminal { + align-items: flex-end; + display: flex; +} + +.monaco-workbench .integrated-terminal .terminal { + background-color: #1e1e1e!important; +} + +.monaco-workbench .terminal-cursor { + background-color: #1e1e1e; +} + +.monaco-workbench .reverse-video { + color: #CCC; +} + +.vs-dark .monaco-workbench .terminal-cursor { + background-color: #CCC; +} + +.vs-dark .monaco-workbench .reverse-video { + color: #252526; +} + +/* High Contrast Theming */ + +.hc-dark .monaco-workbench .integrated-terminal .terminal { + background-color: black!important; +} + +.hc-dark .monaco-workbench .terminal-cursor { + background-color: white; +} + +.hc-dark .monaco-workbench .reverse-video { + color: black; +} \ No newline at end of file diff --git a/src/vs/workbench/parts/terminal/node/pty.js.d.ts b/src/vs/workbench/parts/terminal/node/pty.js.d.ts new file mode 100644 index 00000000000..0c44c428c51 --- /dev/null +++ b/src/vs/workbench/parts/terminal/node/pty.js.d.ts @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'pty.js' { + export function fork(file: string, args: string[], options: any): Terminal; + export function spawn(file: string, args: string[], options: any): Terminal; + export function createTerminal(file: string, args: string[], options: any): Terminal; + + export interface Terminal { + on(event: string, callback: (data: any) => void): void; + resize(columns: number, rows: number): void; + write(data: string): void; + } +} \ No newline at end of file diff --git a/src/vs/workbench/parts/terminal/node/term.js.d.ts b/src/vs/workbench/parts/terminal/node/term.js.d.ts new file mode 100644 index 00000000000..9f2c4c7ea9e --- /dev/null +++ b/src/vs/workbench/parts/terminal/node/term.js.d.ts @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'term.js' { + function init(): TermJsTerminal; + + // There seems to be no way to export this so it can be referenced outside of this file when a + // module is a function. + interface TermJsTerminal { + on(event: string, callback: (data: any) => void): void; + resize(columns: number, rows: number): void; + } + + export = init; +} \ No newline at end of file diff --git a/src/vs/workbench/parts/terminal/node/terminal.contribution.ts b/src/vs/workbench/parts/terminal/node/terminal.contribution.ts new file mode 100644 index 00000000000..3360a59d19a --- /dev/null +++ b/src/vs/workbench/parts/terminal/node/terminal.contribution.ts @@ -0,0 +1,51 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/css!./media/terminal.contribution'; +import nls = require('vs/nls'); +//import {KeyMod, KeyCode} from 'vs/base/common/keyCodes'; +import {SyncActionDescriptor} from 'vs/platform/actions/common/actions'; +import {registerSingleton} from 'vs/platform/instantiation/common/extensions'; +import {IWorkbenchActionRegistry, Extensions as ActionExtensions} from 'vs/workbench/common/actionRegistry'; +import {TerminalService} from 'vs/workbench/parts/terminal/node/terminalService'; +import {ToggleTerminalAction} from 'vs/workbench/parts/terminal/node/terminalActions'; +import {ITerminalService, TERMINAL_PANEL_ID} from 'vs/workbench/parts/terminal/common/terminal'; +import * as panel from 'vs/workbench/browser/panel'; +import {Registry} from 'vs/platform/platform'; +import {Extensions, IConfigurationRegistry} from 'vs/platform/configuration/common/configurationRegistry'; + +let configurationRegistry = Registry.as(Extensions.Configuration); +configurationRegistry.registerConfiguration({ + 'id': 'terminal', + 'order': 100, + 'title': nls.localize('integratedTerminalConfigurationTitle', "Integrated terminal configuration"), + 'type': 'object', + 'properties': { + 'terminal.integrated.enabled': { + 'description': nls.localize('terminal.integrated.enabled', "(Experimental) Enable the integrated terminal."), + 'type': 'boolean', + 'default': false + } + } +}); + +// Register Service +registerSingleton(ITerminalService, TerminalService); + +// Register Output Panel +(Registry.as(panel.Extensions.Panels)).registerPanel(new panel.PanelDescriptor( + 'vs/workbench/parts/terminal/node/terminalPanel', + 'TerminalPanel', + TERMINAL_PANEL_ID, + nls.localize('terminal', "Terminal"), + 'terminal' +)); + +// register toggle output action globally +let actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); +/*actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK +}), nls.localize('viewCategory', "View"));*/ +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL), nls.localize('viewCategory', "View")); diff --git a/src/vs/workbench/parts/terminal/node/terminalActions.ts b/src/vs/workbench/parts/terminal/node/terminalActions.ts new file mode 100644 index 00000000000..a260a2d5a51 --- /dev/null +++ b/src/vs/workbench/parts/terminal/node/terminalActions.ts @@ -0,0 +1,37 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import {TPromise} from 'vs/base/common/winjs.base'; +import nls = require('vs/nls'); +import {Action} from 'vs/base/common/actions'; +import {IPartService} from 'vs/workbench/services/part/common/partService'; +import {IPanelService} from 'vs/workbench/services/panel/common/panelService'; +import {TERMINAL_PANEL_ID, ITerminalService} from 'vs/workbench/parts/terminal/common/terminal'; + +export class ToggleTerminalAction extends Action { + + public static ID = 'workbench.action.terminal.toggleTerminal'; + public static LABEL = nls.localize('toggleTerminal', "Toggle Terminal"); + + constructor( + id: string, label: string, + @IPartService private partService: IPartService, + @IPanelService private panelService: IPanelService, + @ITerminalService private terminalService: ITerminalService + ) { + super(id, label); + } + + public run(event?: any): TPromise { + const panel = this.panelService.getActivePanel(); + if (panel && panel.getId() === TERMINAL_PANEL_ID) { + this.partService.setPanelHidden(true); + + return TPromise.as(null); + } + + return this.terminalService.show(); + } +} \ No newline at end of file diff --git a/src/vs/workbench/parts/terminal/node/terminalPanel.ts b/src/vs/workbench/parts/terminal/node/terminalPanel.ts new file mode 100644 index 00000000000..cebb5b15bf5 --- /dev/null +++ b/src/vs/workbench/parts/terminal/node/terminalPanel.ts @@ -0,0 +1,89 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import termJs = require('term.js'); +import fs = require('fs'); +import {fork, Terminal} from 'pty.js'; +import {TPromise} from 'vs/base/common/winjs.base'; +import {Builder, Dimension} from 'vs/base/browser/builder'; +import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; +import {TERMINAL_PANEL_ID} from 'vs/workbench/parts/terminal/common/terminal'; +import {Panel} from 'vs/workbench/browser/panel'; +import {ScrollableElement} from 'vs/base/browser/ui/scrollbar/scrollableElementImpl'; +import {DomNodeScrollable} from 'vs/base/browser/ui/scrollbar/domNodeScrollable'; + +const TERMINAL_CHAR_WIDTH = 8; +const TERMINAL_CHAR_HEIGHT = 18; + +export class TerminalPanel extends Panel { + + private ptyProcess: Terminal; + private parentDomElement: HTMLElement; + private terminal; + private terminalDomElement: HTMLDivElement; + + constructor( + @ITelemetryService telemetryService: ITelemetryService + ) { + super(TERMINAL_PANEL_ID, telemetryService); + } + + public layout(dimension: Dimension): void { + let cols = Math.floor(this.parentDomElement.offsetWidth / TERMINAL_CHAR_WIDTH); + let rows = Math.floor(this.parentDomElement.offsetHeight / TERMINAL_CHAR_HEIGHT); + this.terminal.resize(cols, rows); + this.ptyProcess.resize(cols, rows); + } + + public create(parent: Builder): TPromise { + super.create(parent); + + this.ptyProcess = fork(process.env.SHELL || 'sh', [], { + name: fs.existsSync('/usr/share/terminfo/x/xterm-256color') ? 'xterm-256color' : 'xterm', + cols: 80, + rows: 6, + cwd: process.env.HOME + }); + this.parentDomElement = parent.getHTMLElement(); + this.terminalDomElement = document.createElement('div'); + this.parentDomElement.classList.add('integrated-terminal'); + let terminalScrollable = new DomNodeScrollable(this.terminalDomElement); + let terminalContainer = new ScrollableElement(this.terminalDomElement, terminalScrollable, { horizontal: 'hidden', vertical: 'auto' }); + this.terminal = termJs(); + + this.ptyProcess.on('data', (data) => { + this.terminal.write(data); + }); + this.terminal.on('data', (data) => { + this.ptyProcess.write(data); + return false; + }); + + this.terminal.open(this.terminalDomElement); + this.parentDomElement.appendChild(terminalContainer.getDomNode()); + + this.terminalDomElement.style.fontFamily = 'Hack, mono'; + this.terminal.colors = [ + '#000000', // black + '#cd3131', // red + '#09885a', // green + '#e5e510', // yellow + '#0451a5', // blue + '#bc05bc', // magenta + '#0598bc', // cyan + '#e5e5e5', // white + '#111111', // bright black + '#dc6f6f', // bright red + '#53ac8c', // bright green + '#eded58', // bright yellow + '#4f85c0', // bright blue + '#d050d0', // bright magenta + '#50b7d0', // bright cyan + '#FFFFFF', // bright white + ]; + + return TPromise.as(null); + } +} diff --git a/src/vs/workbench/parts/terminal/node/terminalService.ts b/src/vs/workbench/parts/terminal/node/terminalService.ts new file mode 100644 index 00000000000..7d5c3837d96 --- /dev/null +++ b/src/vs/workbench/parts/terminal/node/terminalService.ts @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import {TPromise} from 'vs/base/common/winjs.base'; +import {IPanelService} from 'vs/workbench/services/panel/common/panelService'; +import {ITerminalService, TERMINAL_PANEL_ID} from 'vs/workbench/parts/terminal/common/terminal'; + +export class TerminalService implements ITerminalService { + public serviceId = ITerminalService; + + constructor( + @IPanelService private panelService: IPanelService + ) { + } + + public show(): TPromise { + return this.panelService.openPanel(TERMINAL_PANEL_ID, true); + } +} \ No newline at end of file diff --git a/src/vs/workbench/workbench.main.js b/src/vs/workbench/workbench.main.js index ffa5618f20c..77b25bd7d31 100644 --- a/src/vs/workbench/workbench.main.js +++ b/src/vs/workbench/workbench.main.js @@ -58,6 +58,8 @@ define([ 'vs/workbench/parts/output/browser/output.contribution', + 'vs/workbench/parts/terminal/node/terminal.contribution', + 'vs/workbench/parts/markdown/browser/markdown.contribution', 'vs/workbench/parts/markdown/browser/markdownActions.contribution', From ae6bc331969c94ae2df0ff2d7aad3ecfdb4d615f Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 19 Apr 2016 14:09:59 -0700 Subject: [PATCH 02/30] Set dep to pty.js@0.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6cd11bdafee..6c9fe0fbfda 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "https-proxy-agent": "0.3.6", "iconv-lite": "0.4.13", "native-keymap": "0.1.2", - "pty.js": "^0.3.0", + "pty.js": "0.3.0", "sax": "1.1.2", "semver": "4.3.6", "term.js": "0.0.7", From 49f20e3d5745c4af35072ee539a4336592daead9 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 23 Apr 2016 23:06:15 -0700 Subject: [PATCH 03/30] Support customizable integrated terminal shell --- .../parts/terminal/common/terminal.ts | 16 ++++++++++++++++ .../terminal/node/terminal.contribution.ts | 19 ++++++++++++------- .../parts/terminal/node/terminalPanel.ts | 15 +++++++++++++-- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index 9fbb0644ecd..98ed11c002c 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -6,13 +6,29 @@ import {TPromise} from 'vs/base/common/winjs.base'; import {createDecorator, ServiceIdentifier} from 'vs/platform/instantiation/common/instantiation'; +import path = require('path'); +import platform = require('vs/base/common/platform'); export const TERMINAL_PANEL_ID = 'workbench.panel.terminal'; export const TERMINAL_SERVICE_ID = 'terminalService'; +export const TERMINAL_DEFAULT_SHELL_UNIX_LIKE = process.env.SHELL || 'sh'; +export const TERMINAL_DEFAULT_SHELL_WINDOWS = platform.isWindows ? path.resolve(process.env.SystemRoot, 'System32', 'WindowsPowerShell', 'v1.0', 'powershell.exe') : ''; + export var ITerminalService = createDecorator(TERMINAL_SERVICE_ID); +export interface ITerminalConfiguration { + terminal: { + integrated: { + shell: { + unixLike: string, + windows: string + } + } + }; +} + export interface ITerminalService { serviceId: ServiceIdentifier; diff --git a/src/vs/workbench/parts/terminal/node/terminal.contribution.ts b/src/vs/workbench/parts/terminal/node/terminal.contribution.ts index 3360a59d19a..5380e31b95a 100644 --- a/src/vs/workbench/parts/terminal/node/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/node/terminal.contribution.ts @@ -11,7 +11,7 @@ import {registerSingleton} from 'vs/platform/instantiation/common/extensions'; import {IWorkbenchActionRegistry, Extensions as ActionExtensions} from 'vs/workbench/common/actionRegistry'; import {TerminalService} from 'vs/workbench/parts/terminal/node/terminalService'; import {ToggleTerminalAction} from 'vs/workbench/parts/terminal/node/terminalActions'; -import {ITerminalService, TERMINAL_PANEL_ID} from 'vs/workbench/parts/terminal/common/terminal'; +import {ITerminalService, TERMINAL_PANEL_ID, TERMINAL_DEFAULT_SHELL_UNIX_LIKE, TERMINAL_DEFAULT_SHELL_WINDOWS} from 'vs/workbench/parts/terminal/common/terminal'; import * as panel from 'vs/workbench/browser/panel'; import {Registry} from 'vs/platform/platform'; import {Extensions, IConfigurationRegistry} from 'vs/platform/configuration/common/configurationRegistry'; @@ -20,13 +20,18 @@ let configurationRegistry = Registry.as(Extensions.Confi configurationRegistry.registerConfiguration({ 'id': 'terminal', 'order': 100, - 'title': nls.localize('integratedTerminalConfigurationTitle', "Integrated terminal configuration"), + 'title': nls.localize('integratedTerminalConfigurationTitle', "(Experimental) Integrated terminal configuration"), 'type': 'object', 'properties': { - 'terminal.integrated.enabled': { - 'description': nls.localize('terminal.integrated.enabled', "(Experimental) Enable the integrated terminal."), - 'type': 'boolean', - 'default': false + 'terminal.integrated.shell.unixLike': { + 'description': nls.localize('terminal.integrated.shell.unixLike', "The path to the shell the terminal uses on Unix-like systems (Linux, OS X)."), + 'type': 'string', + 'default': TERMINAL_DEFAULT_SHELL_UNIX_LIKE + }, + 'terminal.integrated.shell.windows': { + 'description': nls.localize('terminal.integrated.shell.windows', "The path to the shell the terminal uses on Windows."), + 'type': 'string', + 'default': TERMINAL_DEFAULT_SHELL_WINDOWS } } }); @@ -48,4 +53,4 @@ let actionRegistry = Registry.as(ActionExtensions.Work /*actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK }), nls.localize('viewCategory', "View"));*/ -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL), nls.localize('viewCategory', "View")); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL), nls.localize('viewCategory', "View"), ['terminal', 'panel']); diff --git a/src/vs/workbench/parts/terminal/node/terminalPanel.ts b/src/vs/workbench/parts/terminal/node/terminalPanel.ts index cebb5b15bf5..fcf73f783f7 100644 --- a/src/vs/workbench/parts/terminal/node/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/node/terminalPanel.ts @@ -6,10 +6,12 @@ import termJs = require('term.js'); import fs = require('fs'); import {fork, Terminal} from 'pty.js'; +import platform = require('vs/base/common/platform'); import {TPromise} from 'vs/base/common/winjs.base'; import {Builder, Dimension} from 'vs/base/browser/builder'; +import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; -import {TERMINAL_PANEL_ID} from 'vs/workbench/parts/terminal/common/terminal'; +import {ITerminalConfiguration, TERMINAL_PANEL_ID} from 'vs/workbench/parts/terminal/common/terminal'; import {Panel} from 'vs/workbench/browser/panel'; import {ScrollableElement} from 'vs/base/browser/ui/scrollbar/scrollableElementImpl'; import {DomNodeScrollable} from 'vs/base/browser/ui/scrollbar/domNodeScrollable'; @@ -25,6 +27,7 @@ export class TerminalPanel extends Panel { private terminalDomElement: HTMLDivElement; constructor( + @IConfigurationService private configurationService: IConfigurationService, @ITelemetryService telemetryService: ITelemetryService ) { super(TERMINAL_PANEL_ID, telemetryService); @@ -40,7 +43,7 @@ export class TerminalPanel extends Panel { public create(parent: Builder): TPromise { super.create(parent); - this.ptyProcess = fork(process.env.SHELL || 'sh', [], { + this.ptyProcess = fork(this.getShell(), [], { name: fs.existsSync('/usr/share/terminfo/x/xterm-256color') ? 'xterm-256color' : 'xterm', cols: 80, rows: 6, @@ -86,4 +89,12 @@ export class TerminalPanel extends Panel { return TPromise.as(null); } + + private getShell(): string { + let config = this.configurationService.getConfiguration(); + if (platform.isWindows) { + return config.terminal.integrated.shell.windows; + } + return config.terminal.integrated.shell.unixLike; + } } From 8e013351701c7835d9ed6302ea4370b46ce2987e Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 23 Apr 2016 23:39:28 -0700 Subject: [PATCH 04/30] Fix errors from merge --- .../parts/terminal/node/terminal.contribution.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/terminal.contribution.ts b/src/vs/workbench/parts/terminal/node/terminal.contribution.ts index 5380e31b95a..e7af77311ca 100644 --- a/src/vs/workbench/parts/terminal/node/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/node/terminal.contribution.ts @@ -24,12 +24,12 @@ configurationRegistry.registerConfiguration({ 'type': 'object', 'properties': { 'terminal.integrated.shell.unixLike': { - 'description': nls.localize('terminal.integrated.shell.unixLike', "The path to the shell the terminal uses on Unix-like systems (Linux, OS X)."), + 'description': nls.localize('terminal.integrated.shell.unixLike', "The path to the shell that the terminal uses on Unix-like systems (Linux, OS X)."), 'type': 'string', 'default': TERMINAL_DEFAULT_SHELL_UNIX_LIKE }, 'terminal.integrated.shell.windows': { - 'description': nls.localize('terminal.integrated.shell.windows', "The path to the shell the terminal uses on Windows."), + 'description': nls.localize('terminal.integrated.shell.windows', "The path to the shell that the terminal uses on Windows."), 'type': 'string', 'default': TERMINAL_DEFAULT_SHELL_WINDOWS } @@ -48,9 +48,7 @@ registerSingleton(ITerminalService, TerminalService); 'terminal' )); -// register toggle output action globally +// Register toggle output action globally let actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); -/*actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK -}), nls.localize('viewCategory', "View"));*/ -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL), nls.localize('viewCategory', "View"), ['terminal', 'panel']); +// { primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK } +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL), 'View: ToggleTerminalAction.LABEL', nls.localize('viewCategory', "View")); From fb71f0447863082eeb6b66a9a4bbb7e93bda1701 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 23 Apr 2016 23:41:27 -0700 Subject: [PATCH 05/30] Fix alias, :lipstick: --- .../parts/terminal/node/terminal.contribution.ts | 10 +++++----- .../workbench/parts/terminal/node/terminalActions.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/terminal.contribution.ts b/src/vs/workbench/parts/terminal/node/terminal.contribution.ts index e7af77311ca..5b0d300747a 100644 --- a/src/vs/workbench/parts/terminal/node/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/node/terminal.contribution.ts @@ -23,13 +23,13 @@ configurationRegistry.registerConfiguration({ 'title': nls.localize('integratedTerminalConfigurationTitle', "(Experimental) Integrated terminal configuration"), 'type': 'object', 'properties': { - 'terminal.integrated.shell.unixLike': { - 'description': nls.localize('terminal.integrated.shell.unixLike', "The path to the shell that the terminal uses on Unix-like systems (Linux, OS X)."), + 'integratedTerminal.shell.unixLike': { + 'description': nls.localize('terminal.integrated.shell.unixLike', "The path of the shell that the terminal uses on Linux and OS X."), 'type': 'string', 'default': TERMINAL_DEFAULT_SHELL_UNIX_LIKE }, - 'terminal.integrated.shell.windows': { - 'description': nls.localize('terminal.integrated.shell.windows', "The path to the shell that the terminal uses on Windows."), + 'integratedTerminal.shell.windows': { + 'description': nls.localize('terminal.integrated.shell.windows', "The path of the shell that the terminal uses on Windows."), 'type': 'string', 'default': TERMINAL_DEFAULT_SHELL_WINDOWS } @@ -51,4 +51,4 @@ registerSingleton(ITerminalService, TerminalService); // Register toggle output action globally let actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); // { primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK } -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL), 'View: ToggleTerminalAction.LABEL', nls.localize('viewCategory', "View")); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL), 'View: ' + ToggleTerminalAction.LABEL, nls.localize('viewCategory', "View")); diff --git a/src/vs/workbench/parts/terminal/node/terminalActions.ts b/src/vs/workbench/parts/terminal/node/terminalActions.ts index a260a2d5a51..aa332ca2234 100644 --- a/src/vs/workbench/parts/terminal/node/terminalActions.ts +++ b/src/vs/workbench/parts/terminal/node/terminalActions.ts @@ -13,7 +13,7 @@ import {TERMINAL_PANEL_ID, ITerminalService} from 'vs/workbench/parts/terminal/c export class ToggleTerminalAction extends Action { public static ID = 'workbench.action.terminal.toggleTerminal'; - public static LABEL = nls.localize('toggleTerminal', "Toggle Terminal"); + public static LABEL = nls.localize('toggleTerminal', "(Experimental) Toggle Terminal"); constructor( id: string, label: string, From 111e6153c4fa3f26762a0da08b4272d9a3216186 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 24 Apr 2016 01:06:15 -0700 Subject: [PATCH 06/30] Support custom colors for ansi escape sequences --- .../parts/terminal/common/terminal.ts | 28 +++++-- .../terminal/node/terminal.contribution.ts | 84 ++++++++++++++++++- .../parts/terminal/node/terminalPanel.ts | 46 +++++----- 3 files changed, 130 insertions(+), 28 deletions(-) diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index 98ed11c002c..5420f41aff8 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -19,12 +19,28 @@ export const TERMINAL_DEFAULT_SHELL_WINDOWS = platform.isWindows ? path.resolve( export var ITerminalService = createDecorator(TERMINAL_SERVICE_ID); export interface ITerminalConfiguration { - terminal: { - integrated: { - shell: { - unixLike: string, - windows: string - } + integratedTerminal: { + shell: { + unixLike: string, + windows: string + }, + ansiColors: { + black: string, + red: string, + green: string, + yellow: string, + blue: string, + magenta: string, + cyan: string, + white: string, + brightBlack: string, + brightRed: string, + brightGreen: string, + brightYellow: string, + brightBlue: string, + brightMagenta: string, + brightCyan: string, + brightWhite: string, } }; } diff --git a/src/vs/workbench/parts/terminal/node/terminal.contribution.ts b/src/vs/workbench/parts/terminal/node/terminal.contribution.ts index 5b0d300747a..d56192488fb 100644 --- a/src/vs/workbench/parts/terminal/node/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/node/terminal.contribution.ts @@ -24,14 +24,94 @@ configurationRegistry.registerConfiguration({ 'type': 'object', 'properties': { 'integratedTerminal.shell.unixLike': { - 'description': nls.localize('terminal.integrated.shell.unixLike', "The path of the shell that the terminal uses on Linux and OS X."), + 'description': nls.localize('integratedTerminal.shell.unixLike', "The path of the shell that the terminal uses on Linux and OS X."), 'type': 'string', 'default': TERMINAL_DEFAULT_SHELL_UNIX_LIKE }, 'integratedTerminal.shell.windows': { - 'description': nls.localize('terminal.integrated.shell.windows', "The path of the shell that the terminal uses on Windows."), + 'description': nls.localize('integratedTerminal.shell.windows', "The path of the shell that the terminal uses on Windows."), 'type': 'string', 'default': TERMINAL_DEFAULT_SHELL_WINDOWS + }, + 'integratedTerminal.ansiColors.black': { + 'description': nls.localize('integratedTerminal.ansiColors.black', "Black color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#000000' + }, + 'integratedTerminal.ansiColors.red': { + 'description': nls.localize('integratedTerminal.ansiColors.red', "Red color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#cd3131' + }, + 'integratedTerminal.ansiColors.green': { + 'description': nls.localize('integratedTerminal.ansiColors.green', "Green color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#09885a' + }, + 'integratedTerminal.ansiColors.yellow': { + 'description': nls.localize('integratedTerminal.ansiColors.yellow', "Yellow color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#e5e510' + }, + 'integratedTerminal.ansiColors.blue': { + 'description': nls.localize('integratedTerminal.ansiColors.blue', "Blue color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#0451a5' + }, + 'integratedTerminal.ansiColors.magenta': { + 'description': nls.localize('integratedTerminal.ansiColors.magenta', "Magenta color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#bc05bc' + }, + 'integratedTerminal.ansiColors.cyan': { + 'description': nls.localize('integratedTerminal.ansiColors.cyan', "Cyan color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#0598bc' + }, + 'integratedTerminal.ansiColors.white': { + 'description': nls.localize('integratedTerminal.ansiColors.white', "White color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#e5e5e5' + }, + 'integratedTerminal.ansiColors.brightBlack': { + 'description': nls.localize('integratedTerminal.ansiColors.brightBlack', "Bright black color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#000000' + }, + 'integratedTerminal.ansiColors.brightRed': { + 'description': nls.localize('integratedTerminal.ansiColors.brightRed', "Bright red color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#cd3131' + }, + 'integratedTerminal.ansiColors.brightGreen': { + 'description': nls.localize('integratedTerminal.ansiColors.brightGreen', "Bright green color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#09885a' + }, + 'integratedTerminal.ansiColors.brightYellow': { + 'description': nls.localize('integratedTerminal.ansiColors.brightYellow', "Bright yellow color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#e5e510' + }, + 'integratedTerminal.ansiColors.brightBlue': { + 'description': nls.localize('integratedTerminal.ansiColors.brightBlue', "Bright blue color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#0451a5' + }, + 'integratedTerminal.ansiColors.brightMagenta': { + 'description': nls.localize('integratedTerminal.ansiColors.brightMagenta', "Bright magenta color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#bc05bc' + }, + 'integratedTerminal.ansiColors.brightCyan': { + 'description': nls.localize('integratedTerminal.ansiColors.brightCyan', "Bright cyan color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#0598bc' + }, + 'integratedTerminal.ansiColors.brightWhite': { + 'description': nls.localize('integratedTerminal.ansiColors.brightWhite', "Bright white color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#e5e5e5' } } }); diff --git a/src/vs/workbench/parts/terminal/node/terminalPanel.ts b/src/vs/workbench/parts/terminal/node/terminalPanel.ts index fcf73f783f7..2e7f4cae0f0 100644 --- a/src/vs/workbench/parts/terminal/node/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/node/terminalPanel.ts @@ -68,24 +68,7 @@ export class TerminalPanel extends Panel { this.parentDomElement.appendChild(terminalContainer.getDomNode()); this.terminalDomElement.style.fontFamily = 'Hack, mono'; - this.terminal.colors = [ - '#000000', // black - '#cd3131', // red - '#09885a', // green - '#e5e510', // yellow - '#0451a5', // blue - '#bc05bc', // magenta - '#0598bc', // cyan - '#e5e5e5', // white - '#111111', // bright black - '#dc6f6f', // bright red - '#53ac8c', // bright green - '#eded58', // bright yellow - '#4f85c0', // bright blue - '#d050d0', // bright magenta - '#50b7d0', // bright cyan - '#FFFFFF', // bright white - ]; + this.terminal.colors = this.getTerminalColors(); return TPromise.as(null); } @@ -93,8 +76,31 @@ export class TerminalPanel extends Panel { private getShell(): string { let config = this.configurationService.getConfiguration(); if (platform.isWindows) { - return config.terminal.integrated.shell.windows; + return config.integratedTerminal.shell.windows; } - return config.terminal.integrated.shell.unixLike; + return config.integratedTerminal.shell.unixLike; + } + + private getTerminalColors(): string[] { + let config = this.configurationService.getConfiguration().integratedTerminal.ansiColors; + let colors = [ + config.black || '#000000', + config.red || '#cd3131', + config.green || '#09885a', + config.yellow || '#e5e510', + config.blue || '#0451a5', + config.magenta || '#bc05bc', + config.cyan || '#0598bc', + config.white || '#e5e5e5', + config.brightBlack || '#111111', + config.brightRed || '#dc6f6f', + config.brightGreen || '#53ac8c', + config.brightYellow || '#eded58', + config.brightBlue || '#4f85c0', + config.brightMagenta || '#d050d0', + config.brightCyan || '#50b7d0', + config.brightWhite || '#FFFFFF' + ]; + return colors; } } From a2fa0094a0800887cfc7010d79645b8f1463f535 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 24 Apr 2016 01:22:15 -0700 Subject: [PATCH 07/30] Make term chars cover entire line --- .../parts/terminal/node/media/terminal.contribution.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css b/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css index ed76aefc063..10486b5a9bb 100644 --- a/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css +++ b/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css @@ -8,6 +8,10 @@ display: flex; } +.monaco-workbench .integrated-terminal .terminal span { + display: inline-block; /* make terminal characters cover height of line */ +} + .monaco-workbench .integrated-terminal .terminal { background-color: #1e1e1e!important; } From 194874bb165997d32c44841ee6c235785c63eca8 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 24 Apr 2016 01:29:29 -0700 Subject: [PATCH 08/30] Remove redundant code --- .../parts/terminal/node/terminalPanel.ts | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/terminalPanel.ts b/src/vs/workbench/parts/terminal/node/terminalPanel.ts index 2e7f4cae0f0..f9f3400173e 100644 --- a/src/vs/workbench/parts/terminal/node/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/node/terminalPanel.ts @@ -84,22 +84,22 @@ export class TerminalPanel extends Panel { private getTerminalColors(): string[] { let config = this.configurationService.getConfiguration().integratedTerminal.ansiColors; let colors = [ - config.black || '#000000', - config.red || '#cd3131', - config.green || '#09885a', - config.yellow || '#e5e510', - config.blue || '#0451a5', - config.magenta || '#bc05bc', - config.cyan || '#0598bc', - config.white || '#e5e5e5', - config.brightBlack || '#111111', - config.brightRed || '#dc6f6f', - config.brightGreen || '#53ac8c', - config.brightYellow || '#eded58', - config.brightBlue || '#4f85c0', - config.brightMagenta || '#d050d0', - config.brightCyan || '#50b7d0', - config.brightWhite || '#FFFFFF' + config.black, + config.red, + config.green, + config.yellow, + config.blue, + config.magenta, + config.cyan, + config.white, + config.brightBlack, + config.brightRed, + config.brightGreen, + config.brightYellow, + config.brightBlue, + config.brightMagenta, + config.brightCyan, + config.brightWhite ]; return colors; } From 7b19cc64c6c35625d49b56c5272d466a451a89d5 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 24 Apr 2016 01:36:02 -0700 Subject: [PATCH 09/30] Support customizable terminal font family --- src/vs/workbench/parts/terminal/common/terminal.ts | 1 + .../workbench/parts/terminal/node/terminal.contribution.ts | 5 +++++ src/vs/workbench/parts/terminal/node/terminalPanel.ts | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index 5420f41aff8..66b820c11c2 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -24,6 +24,7 @@ export interface ITerminalConfiguration { unixLike: string, windows: string }, + fontFamily: string, ansiColors: { black: string, red: string, diff --git a/src/vs/workbench/parts/terminal/node/terminal.contribution.ts b/src/vs/workbench/parts/terminal/node/terminal.contribution.ts index d56192488fb..2a94b34383d 100644 --- a/src/vs/workbench/parts/terminal/node/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/node/terminal.contribution.ts @@ -33,6 +33,11 @@ configurationRegistry.registerConfiguration({ 'type': 'string', 'default': TERMINAL_DEFAULT_SHELL_WINDOWS }, + 'integratedTerminal.fontFamily': { + 'description': nls.localize('integratedTerminal.fontFamily', "The font family used by the terminal (CSS font-family format)."), + 'type': 'string', + 'default': 'Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback"' + }, 'integratedTerminal.ansiColors.black': { 'description': nls.localize('integratedTerminal.ansiColors.black', "Black color for terminals that support ANSI escape sequences (format: #rrggbb)"), 'type': 'string', diff --git a/src/vs/workbench/parts/terminal/node/terminalPanel.ts b/src/vs/workbench/parts/terminal/node/terminalPanel.ts index f9f3400173e..785c0ed073e 100644 --- a/src/vs/workbench/parts/terminal/node/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/node/terminalPanel.ts @@ -67,7 +67,8 @@ export class TerminalPanel extends Panel { this.terminal.open(this.terminalDomElement); this.parentDomElement.appendChild(terminalContainer.getDomNode()); - this.terminalDomElement.style.fontFamily = 'Hack, mono'; + let config = this.configurationService.getConfiguration(); + this.terminalDomElement.style.fontFamily = config.integratedTerminal.fontFamily; this.terminal.colors = this.getTerminalColors(); return TPromise.as(null); From a443f81f0fca3bfbb1fe59723bdabd8ac707a6e2 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 24 Apr 2016 01:52:34 -0700 Subject: [PATCH 10/30] Use jeremyramin/term.js --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 16e4ad78843..395a21c5235 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "pty.js": "0.3.0", "sax": "1.1.2", "semver": "4.3.6", - "term.js": "0.0.7", + "term.js": "git+https://github.com/jeremyramin/term.js.git", "vscode-debugprotocol": "1.8.0-pre.3", "vscode-textmate": "1.0.11", "winreg": "1.2.0", From 11d3e047999784bba3a54dec8de14d16e4a7aa42 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 24 Apr 2016 01:53:22 -0700 Subject: [PATCH 11/30] Focus terminal input if anywhere in panel is clicked --- .../parts/terminal/node/terminalPanel.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/vs/workbench/parts/terminal/node/terminalPanel.ts b/src/vs/workbench/parts/terminal/node/terminalPanel.ts index 785c0ed073e..77e494a9732 100644 --- a/src/vs/workbench/parts/terminal/node/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/node/terminalPanel.ts @@ -63,6 +63,11 @@ export class TerminalPanel extends Panel { this.ptyProcess.write(data); return false; }); + this.parentDomElement.addEventListener('mouseup', (event) => { + if (event.which !== 3) { + this.focusTerminal(); + } + }); this.terminal.open(this.terminalDomElement); this.parentDomElement.appendChild(terminalContainer.getDomNode()); @@ -74,6 +79,16 @@ export class TerminalPanel extends Panel { return TPromise.as(null); } + private focusTerminal(): void { + let text = window.getSelection().toString(); + if (!text) { + this.terminal.focus(); + if (this.terminal._textarea) { + this.terminal._textarea.focus(); + } + } + } + private getShell(): string { let config = this.configurationService.getConfiguration(); if (platform.isWindows) { From fca7837bc1cb2aa55f329bccf25f640ed57e8df1 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 24 Apr 2016 02:11:08 -0700 Subject: [PATCH 12/30] Fix terminal light theme colors The foreground color was not set so the editor's color was used --- .../node/media/terminal.contribution.css | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css b/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css index 10486b5a9bb..66734e11371 100644 --- a/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css +++ b/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css @@ -8,28 +8,25 @@ display: flex; } -.monaco-workbench .integrated-terminal .terminal span { - display: inline-block; /* make terminal characters cover height of line */ +.monaco-workbench .integrated-terminal { + background-color: #1e1e1e!important; + color: #CCC; } .monaco-workbench .integrated-terminal .terminal { background-color: #1e1e1e!important; } -.monaco-workbench .terminal-cursor { - background-color: #1e1e1e; +.monaco-workbench .integrated-terminal .terminal span { + display: inline-block; /* make terminal characters cover height of line */ } -.monaco-workbench .reverse-video { - color: #CCC; -} - -.vs-dark .monaco-workbench .terminal-cursor { +.monaco-workbench .integrated-terminal .terminal-cursor { background-color: #CCC; } -.vs-dark .monaco-workbench .reverse-video { - color: #252526; +.monaco-workbench .integrated-terminal .reverse-video { + color: #1e1e1e; } /* High Contrast Theming */ @@ -38,10 +35,10 @@ background-color: black!important; } -.hc-dark .monaco-workbench .terminal-cursor { +.hc-dark .monaco-workbench .integrated-terminal .terminal-cursor { background-color: white; } -.hc-dark .monaco-workbench .reverse-video { +.hc-dark .monaco-workbench .integrated-terminal .reverse-video { color: black; } \ No newline at end of file From 08fcd6b5a0141071c094ff16d6f2347a18a5c159 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 24 Apr 2016 03:06:32 -0700 Subject: [PATCH 13/30] Fix terminal selection --- .../parts/terminal/node/media/terminal.contribution.css | 1 + src/vs/workbench/parts/terminal/node/term.js.d.ts | 2 +- src/vs/workbench/parts/terminal/node/terminalPanel.ts | 4 +++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css b/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css index 66734e11371..1a31ddb8288 100644 --- a/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css +++ b/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css @@ -11,6 +11,7 @@ .monaco-workbench .integrated-terminal { background-color: #1e1e1e!important; color: #CCC; + -webkit-user-select: initial; } .monaco-workbench .integrated-terminal .terminal { diff --git a/src/vs/workbench/parts/terminal/node/term.js.d.ts b/src/vs/workbench/parts/terminal/node/term.js.d.ts index 9f2c4c7ea9e..faa6d112d7a 100644 --- a/src/vs/workbench/parts/terminal/node/term.js.d.ts +++ b/src/vs/workbench/parts/terminal/node/term.js.d.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ declare module 'term.js' { - function init(): TermJsTerminal; + function init(options: any): TermJsTerminal; // There seems to be no way to export this so it can be referenced outside of this file when a // module is a function. diff --git a/src/vs/workbench/parts/terminal/node/terminalPanel.ts b/src/vs/workbench/parts/terminal/node/terminalPanel.ts index 77e494a9732..2ca313b5547 100644 --- a/src/vs/workbench/parts/terminal/node/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/node/terminalPanel.ts @@ -54,7 +54,9 @@ export class TerminalPanel extends Panel { this.parentDomElement.classList.add('integrated-terminal'); let terminalScrollable = new DomNodeScrollable(this.terminalDomElement); let terminalContainer = new ScrollableElement(this.terminalDomElement, terminalScrollable, { horizontal: 'hidden', vertical: 'auto' }); - this.terminal = termJs(); + this.terminal = termJs({ + cursorBlink: false + }); this.ptyProcess.on('data', (data) => { this.terminal.write(data); From d1d8c0f1ac70bb587bd786b6e1d2924ea7217f41 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 24 Apr 2016 03:06:50 -0700 Subject: [PATCH 14/30] Use jeremyramin/pty.js --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 395a21c5235..16460c1fe36 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "https-proxy-agent": "0.3.6", "iconv-lite": "0.4.13", "native-keymap": "0.1.2", - "pty.js": "0.3.0", + "pty.js": "git+https://github.com/jeremyramin/pty.js.git#28f2667", "sax": "1.1.2", "semver": "4.3.6", "term.js": "git+https://github.com/jeremyramin/term.js.git", From 5194caaf45534fab1956abab0d0e51c6802d0555 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 24 Apr 2016 03:09:20 -0700 Subject: [PATCH 15/30] Fix middle click to paste on Linux when clicking on selection --- src/vs/workbench/parts/terminal/node/terminalPanel.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/terminalPanel.ts b/src/vs/workbench/parts/terminal/node/terminalPanel.ts index 2ca313b5547..468240d0c26 100644 --- a/src/vs/workbench/parts/terminal/node/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/node/terminalPanel.ts @@ -65,6 +65,13 @@ export class TerminalPanel extends Panel { this.ptyProcess.write(data); return false; }); + this.parentDomElement.addEventListener('mousedown', (event) => { + // Drop selection and focus terminal on Linux to enable middle button paste when click + // occurs on the selection itself. + if (event.which === 2 && platform.isLinux) { + this.focusTerminal(true); + } + }); this.parentDomElement.addEventListener('mouseup', (event) => { if (event.which !== 3) { this.focusTerminal(); @@ -81,9 +88,9 @@ export class TerminalPanel extends Panel { return TPromise.as(null); } - private focusTerminal(): void { + private focusTerminal(force?: boolean): void { let text = window.getSelection().toString(); - if (!text) { + if (!text || force) { this.terminal.focus(); if (this.terminal._textarea) { this.terminal._textarea.focus(); From 45753f95bfbe591c2878755f45357c2cfb91c738 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 24 Apr 2016 03:10:42 -0700 Subject: [PATCH 16/30] Add clarifying comment --- src/vs/workbench/parts/terminal/node/terminalPanel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/node/terminalPanel.ts b/src/vs/workbench/parts/terminal/node/terminalPanel.ts index 468240d0c26..22371c584a6 100644 --- a/src/vs/workbench/parts/terminal/node/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/node/terminalPanel.ts @@ -55,7 +55,7 @@ export class TerminalPanel extends Panel { let terminalScrollable = new DomNodeScrollable(this.terminalDomElement); let terminalContainer = new ScrollableElement(this.terminalDomElement, terminalScrollable, { horizontal: 'hidden', vertical: 'auto' }); this.terminal = termJs({ - cursorBlink: false + cursorBlink: false // term.js' blinking cursor breaks selection }); this.ptyProcess.on('data', (data) => { From 4e289c3f4d24c96712b05433099ed979b1589937 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 24 Apr 2016 03:38:14 -0700 Subject: [PATCH 17/30] Add process title to pty.js interface --- src/vs/workbench/parts/terminal/node/pty.js.d.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/parts/terminal/node/pty.js.d.ts b/src/vs/workbench/parts/terminal/node/pty.js.d.ts index 0c44c428c51..25b7054d4d0 100644 --- a/src/vs/workbench/parts/terminal/node/pty.js.d.ts +++ b/src/vs/workbench/parts/terminal/node/pty.js.d.ts @@ -9,6 +9,10 @@ declare module 'pty.js' { export function createTerminal(file: string, args: string[], options: any): Terminal; export interface Terminal { + /** + * The title of the active process. + */ + process: string; on(event: string, callback: (data: any) => void): void; resize(columns: number, rows: number): void; write(data: string): void; From 1fdc39a29a7c0d93a23cce0f780447a39cbfcb9b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 24 Apr 2016 03:44:58 -0700 Subject: [PATCH 18/30] Open terminal in the workspace root if available --- src/vs/workbench/parts/terminal/node/terminalPanel.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/terminalPanel.ts b/src/vs/workbench/parts/terminal/node/terminalPanel.ts index 22371c584a6..41d1843123a 100644 --- a/src/vs/workbench/parts/terminal/node/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/node/terminalPanel.ts @@ -11,6 +11,7 @@ import {TPromise} from 'vs/base/common/winjs.base'; import {Builder, Dimension} from 'vs/base/browser/builder'; import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; +import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {ITerminalConfiguration, TERMINAL_PANEL_ID} from 'vs/workbench/parts/terminal/common/terminal'; import {Panel} from 'vs/workbench/browser/panel'; import {ScrollableElement} from 'vs/base/browser/ui/scrollbar/scrollableElementImpl'; @@ -28,7 +29,8 @@ export class TerminalPanel extends Panel { constructor( @IConfigurationService private configurationService: IConfigurationService, - @ITelemetryService telemetryService: ITelemetryService + @ITelemetryService telemetryService: ITelemetryService, + @IWorkspaceContextService private contextService: IWorkspaceContextService ) { super(TERMINAL_PANEL_ID, telemetryService); } @@ -47,7 +49,7 @@ export class TerminalPanel extends Panel { name: fs.existsSync('/usr/share/terminfo/x/xterm-256color') ? 'xterm-256color' : 'xterm', cols: 80, rows: 6, - cwd: process.env.HOME + cwd: this.contextService.getWorkspace() ? this.contextService.getWorkspace().resource.path : process.env.HOME }); this.parentDomElement = parent.getHTMLElement(); this.terminalDomElement = document.createElement('div'); From deaa5f90089c5a94100042a6eab23d346bd3eb9c Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 24 Apr 2016 03:58:55 -0700 Subject: [PATCH 19/30] Handle exit by opening a new terminal This is temporary until multiple terminals are available. --- .../workbench/parts/terminal/node/pty.js.d.ts | 3 +++ .../parts/terminal/node/terminalPanel.ts | 18 +++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/pty.js.d.ts b/src/vs/workbench/parts/terminal/node/pty.js.d.ts index 25b7054d4d0..cc726238aa2 100644 --- a/src/vs/workbench/parts/terminal/node/pty.js.d.ts +++ b/src/vs/workbench/parts/terminal/node/pty.js.d.ts @@ -13,8 +13,11 @@ declare module 'pty.js' { * The title of the active process. */ process: string; + on(event: string, callback: (data: any) => void): void; + resize(columns: number, rows: number): void; + write(data: string): void; } } \ No newline at end of file diff --git a/src/vs/workbench/parts/terminal/node/terminalPanel.ts b/src/vs/workbench/parts/terminal/node/terminalPanel.ts index 41d1843123a..f9d134a5fd8 100644 --- a/src/vs/workbench/parts/terminal/node/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/node/terminalPanel.ts @@ -45,13 +45,20 @@ export class TerminalPanel extends Panel { public create(parent: Builder): TPromise { super.create(parent); + this.parentDomElement = parent.getHTMLElement(); + this.createTerminal(); + + return TPromise.as(null); + } + + private createTerminal(): void { + this.parentDomElement.innerHTML = ''; this.ptyProcess = fork(this.getShell(), [], { name: fs.existsSync('/usr/share/terminfo/x/xterm-256color') ? 'xterm-256color' : 'xterm', cols: 80, rows: 6, cwd: this.contextService.getWorkspace() ? this.contextService.getWorkspace().resource.path : process.env.HOME }); - this.parentDomElement = parent.getHTMLElement(); this.terminalDomElement = document.createElement('div'); this.parentDomElement.classList.add('integrated-terminal'); let terminalScrollable = new DomNodeScrollable(this.terminalDomElement); @@ -67,6 +74,13 @@ export class TerminalPanel extends Panel { this.ptyProcess.write(data); return false; }); + this.ptyProcess.on('exit', (data) => { + this.terminal.destroy(); + // TODO: When multiple terminals are supported this should do something smarter. There is + // also a weird bug here at leasy on Ubuntu 15.10 where the new terminal text does not + // repaint correctly. + this.createTerminal(); + }); this.parentDomElement.addEventListener('mousedown', (event) => { // Drop selection and focus terminal on Linux to enable middle button paste when click // occurs on the selection itself. @@ -86,8 +100,6 @@ export class TerminalPanel extends Panel { let config = this.configurationService.getConfiguration(); this.terminalDomElement.style.fontFamily = config.integratedTerminal.fontFamily; this.terminal.colors = this.getTerminalColors(); - - return TPromise.as(null); } private focusTerminal(force?: boolean): void { From a4c9ed7203b275b400812892e5c8a7d60a0ec2ea Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 24 Apr 2016 04:17:33 -0700 Subject: [PATCH 20/30] Fix bug where terminal output could obscure panel title --- .../parts/terminal/node/media/terminal.contribution.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css b/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css index 1a31ddb8288..ff499f7f13d 100644 --- a/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css +++ b/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css @@ -12,6 +12,7 @@ background-color: #1e1e1e!important; color: #CCC; -webkit-user-select: initial; + overflow: hidden; /* prevents the terminal output being incorrectly placed over the title */ } .monaco-workbench .integrated-terminal .terminal { From 186094c7240ee1721352e3137c63906fb179dd5e Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 12 May 2016 10:47:01 -0700 Subject: [PATCH 21/30] Use correct path on Windows --- src/vs/workbench/parts/terminal/node/terminalPanel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/node/terminalPanel.ts b/src/vs/workbench/parts/terminal/node/terminalPanel.ts index f9d134a5fd8..93ee7cc86eb 100644 --- a/src/vs/workbench/parts/terminal/node/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/node/terminalPanel.ts @@ -57,7 +57,7 @@ export class TerminalPanel extends Panel { name: fs.existsSync('/usr/share/terminfo/x/xterm-256color') ? 'xterm-256color' : 'xterm', cols: 80, rows: 6, - cwd: this.contextService.getWorkspace() ? this.contextService.getWorkspace().resource.path : process.env.HOME + cwd: this.contextService.getWorkspace() ? this.contextService.getWorkspace().resource.fsPath : process.env.HOME }); this.terminalDomElement = document.createElement('div'); this.parentDomElement.classList.add('integrated-terminal'); From 695ae2ba4165a069f5708e668ac14bfd2f89d275 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 13 May 2016 10:28:25 -0700 Subject: [PATCH 22/30] Use platformio's pty.js --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8cb04e544c7..7ad2657beaf 100644 --- a/package.json +++ b/package.json @@ -27,10 +27,10 @@ "iconv-lite": "0.4.13", "minimist": "^1.2.0", "native-keymap": "0.1.2", - "pty.js": "git+https://github.com/jeremyramin/pty.js.git#28f2667", + "pty.js": "https://github.com/platformio/pty.js/tarball/22e84bd6ef177c7c211a767564ffe64426cb8a69", "sax": "1.1.2", "semver": "4.3.6", - "term.js": "git+https://github.com/jeremyramin/term.js.git", + "term.js": "https://github.com/jeremyramin/term.js/tarball/master", "vscode-debugprotocol": "1.8.0-pre.3", "vscode-textmate": "1.0.11", "winreg": "1.2.0", From 5cb353c381dd7603476c13b9d9c7b5fef706df73 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 13 May 2016 10:28:38 -0700 Subject: [PATCH 23/30] Add dependencies to npm-shrinkwrap.json --- npm-shrinkwrap.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 2e50b73ddde..24d23415030 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -340,6 +340,11 @@ "from": "preserve@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz" }, + "pty.js": { + "version": "0.3.0", + "from": "https://github.com/platformio/pty.js/tarball/22e84bd6ef177c7c211a767564ffe64426cb8a69", + "resolved": "https://github.com/platformio/pty.js/tarball/22e84bd6ef177c7c211a767564ffe64426cb8a69" + }, "randomatic": { "version": "1.1.5", "from": "randomatic@>=1.1.3 <2.0.0", @@ -390,6 +395,11 @@ "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, + "term.js": { + "version": "0.0.7", + "from": "https://github.com/jeremyramin/term.js/tarball/master", + "resolved": "https://github.com/jeremyramin/term.js/tarball/master" + }, "typechecker": { "version": "2.0.8", "from": "typechecker@>=2.0.1 <2.1.0", From 18d11591a925805278a368f73f74dc306fc76c3d Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 13 May 2016 10:59:14 -0700 Subject: [PATCH 24/30] Fix integrated terminal scrollbar after merge --- .../workbench/parts/terminal/node/terminalPanel.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/terminalPanel.ts b/src/vs/workbench/parts/terminal/node/terminalPanel.ts index 93ee7cc86eb..ace17784b3a 100644 --- a/src/vs/workbench/parts/terminal/node/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/node/terminalPanel.ts @@ -14,8 +14,8 @@ import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {ITerminalConfiguration, TERMINAL_PANEL_ID} from 'vs/workbench/parts/terminal/common/terminal'; import {Panel} from 'vs/workbench/browser/panel'; -import {ScrollableElement} from 'vs/base/browser/ui/scrollbar/scrollableElementImpl'; -import {DomNodeScrollable} from 'vs/base/browser/ui/scrollbar/domNodeScrollable'; +import {DomScrollableElement} from 'vs/base/browser/ui/scrollbar/scrollableElement'; +import {ScrollbarVisibility} from 'vs/base/browser/ui/scrollbar/scrollableElementOptions'; const TERMINAL_CHAR_WIDTH = 8; const TERMINAL_CHAR_HEIGHT = 18; @@ -61,8 +61,12 @@ export class TerminalPanel extends Panel { }); this.terminalDomElement = document.createElement('div'); this.parentDomElement.classList.add('integrated-terminal'); - let terminalScrollable = new DomNodeScrollable(this.terminalDomElement); - let terminalContainer = new ScrollableElement(this.terminalDomElement, terminalScrollable, { horizontal: 'hidden', vertical: 'auto' }); + let terminalScrollable = new DomScrollableElement(this.terminalDomElement, { + canUseTranslate3d: false, + horizontal: ScrollbarVisibility.Hidden, + vertical: ScrollbarVisibility.Auto + }); + //let terminalContainer = new ScrollableElement(this.terminalDomElement, terminalScrollable, { horizontal: 'hidden', vertical: 'auto' }); this.terminal = termJs({ cursorBlink: false // term.js' blinking cursor breaks selection }); @@ -95,7 +99,7 @@ export class TerminalPanel extends Panel { }); this.terminal.open(this.terminalDomElement); - this.parentDomElement.appendChild(terminalContainer.getDomNode()); + this.parentDomElement.appendChild(terminalScrollable.getDomNode()); let config = this.configurationService.getConfiguration(); this.terminalDomElement.style.fontFamily = config.integratedTerminal.fontFamily; From 18d8a43f859a6805788d8190cff1913cacae8a14 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 13 May 2016 11:00:20 -0700 Subject: [PATCH 25/30] Remove initial col and row as it's immediately overridden --- src/vs/workbench/parts/terminal/node/terminalPanel.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/terminalPanel.ts b/src/vs/workbench/parts/terminal/node/terminalPanel.ts index ace17784b3a..54192b00377 100644 --- a/src/vs/workbench/parts/terminal/node/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/node/terminalPanel.ts @@ -55,8 +55,6 @@ export class TerminalPanel extends Panel { this.parentDomElement.innerHTML = ''; this.ptyProcess = fork(this.getShell(), [], { name: fs.existsSync('/usr/share/terminfo/x/xterm-256color') ? 'xterm-256color' : 'xterm', - cols: 80, - rows: 6, cwd: this.contextService.getWorkspace() ? this.contextService.getWorkspace().resource.fsPath : process.env.HOME }); this.terminalDomElement = document.createElement('div'); From 613777fbe60fc3bba66703db53d57385419650ce Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 13 May 2016 11:17:14 -0700 Subject: [PATCH 26/30] Move integrated terminal from node -> electron-browser --- .../media/terminal.contribution.css | 0 .../parts/terminal/{node => electron-browser}/pty.js.d.ts | 0 .../parts/terminal/{node => electron-browser}/term.js.d.ts | 0 .../{node => electron-browser}/terminal.contribution.ts | 6 +++--- .../terminal/{node => electron-browser}/terminalActions.ts | 0 .../terminal/{node => electron-browser}/terminalPanel.ts | 0 .../terminal/{node => electron-browser}/terminalService.ts | 0 src/vs/workbench/workbench.main.js | 2 +- 8 files changed, 4 insertions(+), 4 deletions(-) rename src/vs/workbench/parts/terminal/{node => electron-browser}/media/terminal.contribution.css (100%) rename src/vs/workbench/parts/terminal/{node => electron-browser}/pty.js.d.ts (100%) rename src/vs/workbench/parts/terminal/{node => electron-browser}/term.js.d.ts (100%) rename src/vs/workbench/parts/terminal/{node => electron-browser}/terminal.contribution.ts (97%) rename src/vs/workbench/parts/terminal/{node => electron-browser}/terminalActions.ts (100%) rename src/vs/workbench/parts/terminal/{node => electron-browser}/terminalPanel.ts (100%) rename src/vs/workbench/parts/terminal/{node => electron-browser}/terminalService.ts (100%) diff --git a/src/vs/workbench/parts/terminal/node/media/terminal.contribution.css b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.contribution.css similarity index 100% rename from src/vs/workbench/parts/terminal/node/media/terminal.contribution.css rename to src/vs/workbench/parts/terminal/electron-browser/media/terminal.contribution.css diff --git a/src/vs/workbench/parts/terminal/node/pty.js.d.ts b/src/vs/workbench/parts/terminal/electron-browser/pty.js.d.ts similarity index 100% rename from src/vs/workbench/parts/terminal/node/pty.js.d.ts rename to src/vs/workbench/parts/terminal/electron-browser/pty.js.d.ts diff --git a/src/vs/workbench/parts/terminal/node/term.js.d.ts b/src/vs/workbench/parts/terminal/electron-browser/term.js.d.ts similarity index 100% rename from src/vs/workbench/parts/terminal/node/term.js.d.ts rename to src/vs/workbench/parts/terminal/electron-browser/term.js.d.ts diff --git a/src/vs/workbench/parts/terminal/node/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts similarity index 97% rename from src/vs/workbench/parts/terminal/node/terminal.contribution.ts rename to src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index 2a94b34383d..b8e2425cf91 100644 --- a/src/vs/workbench/parts/terminal/node/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -9,8 +9,8 @@ import nls = require('vs/nls'); import {SyncActionDescriptor} from 'vs/platform/actions/common/actions'; import {registerSingleton} from 'vs/platform/instantiation/common/extensions'; import {IWorkbenchActionRegistry, Extensions as ActionExtensions} from 'vs/workbench/common/actionRegistry'; -import {TerminalService} from 'vs/workbench/parts/terminal/node/terminalService'; -import {ToggleTerminalAction} from 'vs/workbench/parts/terminal/node/terminalActions'; +import {TerminalService} from 'vs/workbench/parts/terminal/electron-browser/terminalService'; +import {ToggleTerminalAction} from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; import {ITerminalService, TERMINAL_PANEL_ID, TERMINAL_DEFAULT_SHELL_UNIX_LIKE, TERMINAL_DEFAULT_SHELL_WINDOWS} from 'vs/workbench/parts/terminal/common/terminal'; import * as panel from 'vs/workbench/browser/panel'; import {Registry} from 'vs/platform/platform'; @@ -126,7 +126,7 @@ registerSingleton(ITerminalService, TerminalService); // Register Output Panel (Registry.as(panel.Extensions.Panels)).registerPanel(new panel.PanelDescriptor( - 'vs/workbench/parts/terminal/node/terminalPanel', + 'vs/workbench/parts/terminal/electron-browser/terminalPanel', 'TerminalPanel', TERMINAL_PANEL_ID, nls.localize('terminal', "Terminal"), diff --git a/src/vs/workbench/parts/terminal/node/terminalActions.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts similarity index 100% rename from src/vs/workbench/parts/terminal/node/terminalActions.ts rename to src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts diff --git a/src/vs/workbench/parts/terminal/node/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts similarity index 100% rename from src/vs/workbench/parts/terminal/node/terminalPanel.ts rename to src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts diff --git a/src/vs/workbench/parts/terminal/node/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts similarity index 100% rename from src/vs/workbench/parts/terminal/node/terminalService.ts rename to src/vs/workbench/parts/terminal/electron-browser/terminalService.ts diff --git a/src/vs/workbench/workbench.main.js b/src/vs/workbench/workbench.main.js index 9a30a1160a3..45bbb116fc7 100644 --- a/src/vs/workbench/workbench.main.js +++ b/src/vs/workbench/workbench.main.js @@ -58,7 +58,7 @@ define([ 'vs/workbench/parts/output/browser/output.contribution', - 'vs/workbench/parts/terminal/node/terminal.contribution', + 'vs/workbench/parts/terminal/electron-browser/terminal.contribution', 'vs/workbench/parts/markdown/browser/markdown.contribution', 'vs/workbench/parts/markdown/browser/markdownActions.contribution', From f48a0723fc22358d4fd56cbbb15dc951daeb66da Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 13 May 2016 11:22:41 -0700 Subject: [PATCH 27/30] Encapsulated interfaces with part/panel services in terminalService --- .../terminal/electron-browser/terminalActions.ts | 13 +------------ .../terminal/electron-browser/terminalService.ts | 11 ++++++++++- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts index aa332ca2234..bda26557661 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts @@ -6,9 +6,7 @@ import {TPromise} from 'vs/base/common/winjs.base'; import nls = require('vs/nls'); import {Action} from 'vs/base/common/actions'; -import {IPartService} from 'vs/workbench/services/part/common/partService'; -import {IPanelService} from 'vs/workbench/services/panel/common/panelService'; -import {TERMINAL_PANEL_ID, ITerminalService} from 'vs/workbench/parts/terminal/common/terminal'; +import {ITerminalService} from 'vs/workbench/parts/terminal/common/terminal'; export class ToggleTerminalAction extends Action { @@ -17,21 +15,12 @@ export class ToggleTerminalAction extends Action { constructor( id: string, label: string, - @IPartService private partService: IPartService, - @IPanelService private panelService: IPanelService, @ITerminalService private terminalService: ITerminalService ) { super(id, label); } public run(event?: any): TPromise { - const panel = this.panelService.getActivePanel(); - if (panel && panel.getId() === TERMINAL_PANEL_ID) { - this.partService.setPanelHidden(true); - - return TPromise.as(null); - } - return this.terminalService.show(); } } \ No newline at end of file diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index 7d5c3837d96..b834d580627 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -5,17 +5,26 @@ import {TPromise} from 'vs/base/common/winjs.base'; import {IPanelService} from 'vs/workbench/services/panel/common/panelService'; +import {IPartService} from 'vs/workbench/services/part/common/partService'; import {ITerminalService, TERMINAL_PANEL_ID} from 'vs/workbench/parts/terminal/common/terminal'; export class TerminalService implements ITerminalService { public serviceId = ITerminalService; constructor( - @IPanelService private panelService: IPanelService + @IPanelService private panelService: IPanelService, + @IPartService private partService: IPartService ) { } public show(): TPromise { + const panel = this.panelService.getActivePanel(); + if (panel && panel.getId() === TERMINAL_PANEL_ID) { + this.partService.setPanelHidden(true); + + return TPromise.as(null); + } + return this.panelService.openPanel(TERMINAL_PANEL_ID, true); } } \ No newline at end of file From 55541cc58d28e308142ca59c74083d21ed4e1a46 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 13 May 2016 11:32:49 -0700 Subject: [PATCH 28/30] Have createTerminal execute asynchronously --- .../electron-browser/terminalPanel.ts | 101 +++++++++--------- 1 file changed, 51 insertions(+), 50 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index 54192b00377..0b2db776d05 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -46,62 +46,63 @@ export class TerminalPanel extends Panel { super.create(parent); this.parentDomElement = parent.getHTMLElement(); - this.createTerminal(); - return TPromise.as(null); + return this.createTerminal(); } - private createTerminal(): void { - this.parentDomElement.innerHTML = ''; - this.ptyProcess = fork(this.getShell(), [], { - name: fs.existsSync('/usr/share/terminfo/x/xterm-256color') ? 'xterm-256color' : 'xterm', - cwd: this.contextService.getWorkspace() ? this.contextService.getWorkspace().resource.fsPath : process.env.HOME - }); - this.terminalDomElement = document.createElement('div'); - this.parentDomElement.classList.add('integrated-terminal'); - let terminalScrollable = new DomScrollableElement(this.terminalDomElement, { - canUseTranslate3d: false, - horizontal: ScrollbarVisibility.Hidden, - vertical: ScrollbarVisibility.Auto - }); - //let terminalContainer = new ScrollableElement(this.terminalDomElement, terminalScrollable, { horizontal: 'hidden', vertical: 'auto' }); - this.terminal = termJs({ - cursorBlink: false // term.js' blinking cursor breaks selection - }); + private createTerminal(): TPromise { + return new TPromise(resolve => { + this.parentDomElement.innerHTML = ''; + this.ptyProcess = fork(this.getShell(), [], { + name: fs.existsSync('/usr/share/terminfo/x/xterm-256color') ? 'xterm-256color' : 'xterm', + cwd: this.contextService.getWorkspace() ? this.contextService.getWorkspace().resource.fsPath : process.env.HOME + }); + this.terminalDomElement = document.createElement('div'); + this.parentDomElement.classList.add('integrated-terminal'); + let terminalScrollable = new DomScrollableElement(this.terminalDomElement, { + canUseTranslate3d: false, + horizontal: ScrollbarVisibility.Hidden, + vertical: ScrollbarVisibility.Auto + }); + this.terminal = termJs({ + cursorBlink: false // term.js' blinking cursor breaks selection + }); - this.ptyProcess.on('data', (data) => { - this.terminal.write(data); - }); - this.terminal.on('data', (data) => { - this.ptyProcess.write(data); - return false; - }); - this.ptyProcess.on('exit', (data) => { - this.terminal.destroy(); - // TODO: When multiple terminals are supported this should do something smarter. There is - // also a weird bug here at leasy on Ubuntu 15.10 where the new terminal text does not - // repaint correctly. - this.createTerminal(); - }); - this.parentDomElement.addEventListener('mousedown', (event) => { - // Drop selection and focus terminal on Linux to enable middle button paste when click - // occurs on the selection itself. - if (event.which === 2 && platform.isLinux) { - this.focusTerminal(true); - } - }); - this.parentDomElement.addEventListener('mouseup', (event) => { - if (event.which !== 3) { - this.focusTerminal(); - } - }); + this.ptyProcess.on('data', (data) => { + this.terminal.write(data); + }); + this.terminal.on('data', (data) => { + this.ptyProcess.write(data); + return false; + }); + this.ptyProcess.on('exit', (data) => { + this.terminal.destroy(); + // TODO: When multiple terminals are supported this should do something smarter. There is + // also a weird bug here at leasy on Ubuntu 15.10 where the new terminal text does not + // repaint correctly. + this.createTerminal(); + }); + this.parentDomElement.addEventListener('mousedown', (event) => { + // Drop selection and focus terminal on Linux to enable middle button paste when click + // occurs on the selection itself. + if (event.which === 2 && platform.isLinux) { + this.focusTerminal(true); + } + }); + this.parentDomElement.addEventListener('mouseup', (event) => { + if (event.which !== 3) { + this.focusTerminal(); + } + }); - this.terminal.open(this.terminalDomElement); - this.parentDomElement.appendChild(terminalScrollable.getDomNode()); + this.terminal.open(this.terminalDomElement); + this.parentDomElement.appendChild(terminalScrollable.getDomNode()); - let config = this.configurationService.getConfiguration(); - this.terminalDomElement.style.fontFamily = config.integratedTerminal.fontFamily; - this.terminal.colors = this.getTerminalColors(); + let config = this.configurationService.getConfiguration(); + this.terminalDomElement.style.fontFamily = config.integratedTerminal.fontFamily; + this.terminal.colors = this.getTerminalColors(); + resolve(void 0); + }); } private focusTerminal(force?: boolean): void { From f39ca65cc35cd1d036887cde2ad1d70042c2e5bc Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 13 May 2016 11:39:15 -0700 Subject: [PATCH 29/30] Dispose terminal scrollbar and event listeners --- .../electron-browser/terminalPanel.ts | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index 0b2db776d05..8f9927186b9 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -4,7 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import termJs = require('term.js'); +import lifecycle = require('vs/base/common/lifecycle'); import fs = require('fs'); +import DOM = require('vs/base/browser/dom'); import {fork, Terminal} from 'pty.js'; import platform = require('vs/base/common/platform'); import {TPromise} from 'vs/base/common/winjs.base'; @@ -22,6 +24,7 @@ const TERMINAL_CHAR_HEIGHT = 18; export class TerminalPanel extends Panel { + private toDispose: lifecycle.IDisposable[]; private ptyProcess: Terminal; private parentDomElement: HTMLElement; private terminal; @@ -33,6 +36,7 @@ export class TerminalPanel extends Panel { @IWorkspaceContextService private contextService: IWorkspaceContextService ) { super(TERMINAL_PANEL_ID, telemetryService); + this.toDispose = []; } public layout(dimension: Dimension): void { @@ -59,11 +63,12 @@ export class TerminalPanel extends Panel { }); this.terminalDomElement = document.createElement('div'); this.parentDomElement.classList.add('integrated-terminal'); - let terminalScrollable = new DomScrollableElement(this.terminalDomElement, { + let terminalScrollbar = new DomScrollableElement(this.terminalDomElement, { canUseTranslate3d: false, horizontal: ScrollbarVisibility.Hidden, vertical: ScrollbarVisibility.Auto }); + this.toDispose.push(terminalScrollbar); this.terminal = termJs({ cursorBlink: false // term.js' blinking cursor breaks selection }); @@ -82,21 +87,21 @@ export class TerminalPanel extends Panel { // repaint correctly. this.createTerminal(); }); - this.parentDomElement.addEventListener('mousedown', (event) => { + this.toDispose.push(DOM.addDisposableListener(this.parentDomElement, 'mousedown', (event) => { // Drop selection and focus terminal on Linux to enable middle button paste when click // occurs on the selection itself. if (event.which === 2 && platform.isLinux) { this.focusTerminal(true); } - }); - this.parentDomElement.addEventListener('mouseup', (event) => { + })); + this.toDispose.push(DOM.addDisposableListener(this.parentDomElement, 'mouseup', (event) => { if (event.which !== 3) { this.focusTerminal(); } - }); + })); this.terminal.open(this.terminalDomElement); - this.parentDomElement.appendChild(terminalScrollable.getDomNode()); + this.parentDomElement.appendChild(terminalScrollbar.getDomNode()); let config = this.configurationService.getConfiguration(); this.terminalDomElement.style.fontFamily = config.integratedTerminal.fontFamily; @@ -145,4 +150,9 @@ export class TerminalPanel extends Panel { ]; return colors; } + + public dispose(): void { + this.toDispose = lifecycle.dispose(this.toDispose); + super.dispose(); + } } From 36acfe6b177614b001cb1d0cb697bcf5696085e3 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 13 May 2016 12:09:08 -0700 Subject: [PATCH 30/30] Enable integrated terminal in alpha channel only --- .../electron-browser/terminal.contribution.ts | 238 +++++++++--------- 1 file changed, 121 insertions(+), 117 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index b8e2425cf91..f805c9d9714 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -5,6 +5,7 @@ import 'vs/css!./media/terminal.contribution'; import nls = require('vs/nls'); +import product from 'vs/platform/product'; //import {KeyMod, KeyCode} from 'vs/base/common/keyCodes'; import {SyncActionDescriptor} from 'vs/platform/actions/common/actions'; import {registerSingleton} from 'vs/platform/instantiation/common/extensions'; @@ -16,124 +17,127 @@ import * as panel from 'vs/workbench/browser/panel'; import {Registry} from 'vs/platform/platform'; import {Extensions, IConfigurationRegistry} from 'vs/platform/configuration/common/configurationRegistry'; -let configurationRegistry = Registry.as(Extensions.Configuration); -configurationRegistry.registerConfiguration({ - 'id': 'terminal', - 'order': 100, - 'title': nls.localize('integratedTerminalConfigurationTitle', "(Experimental) Integrated terminal configuration"), - 'type': 'object', - 'properties': { - 'integratedTerminal.shell.unixLike': { - 'description': nls.localize('integratedTerminal.shell.unixLike', "The path of the shell that the terminal uses on Linux and OS X."), - 'type': 'string', - 'default': TERMINAL_DEFAULT_SHELL_UNIX_LIKE - }, - 'integratedTerminal.shell.windows': { - 'description': nls.localize('integratedTerminal.shell.windows', "The path of the shell that the terminal uses on Windows."), - 'type': 'string', - 'default': TERMINAL_DEFAULT_SHELL_WINDOWS - }, - 'integratedTerminal.fontFamily': { - 'description': nls.localize('integratedTerminal.fontFamily', "The font family used by the terminal (CSS font-family format)."), - 'type': 'string', - 'default': 'Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback"' - }, - 'integratedTerminal.ansiColors.black': { - 'description': nls.localize('integratedTerminal.ansiColors.black', "Black color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#000000' - }, - 'integratedTerminal.ansiColors.red': { - 'description': nls.localize('integratedTerminal.ansiColors.red', "Red color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#cd3131' - }, - 'integratedTerminal.ansiColors.green': { - 'description': nls.localize('integratedTerminal.ansiColors.green', "Green color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#09885a' - }, - 'integratedTerminal.ansiColors.yellow': { - 'description': nls.localize('integratedTerminal.ansiColors.yellow', "Yellow color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#e5e510' - }, - 'integratedTerminal.ansiColors.blue': { - 'description': nls.localize('integratedTerminal.ansiColors.blue', "Blue color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#0451a5' - }, - 'integratedTerminal.ansiColors.magenta': { - 'description': nls.localize('integratedTerminal.ansiColors.magenta', "Magenta color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#bc05bc' - }, - 'integratedTerminal.ansiColors.cyan': { - 'description': nls.localize('integratedTerminal.ansiColors.cyan', "Cyan color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#0598bc' - }, - 'integratedTerminal.ansiColors.white': { - 'description': nls.localize('integratedTerminal.ansiColors.white', "White color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#e5e5e5' - }, - 'integratedTerminal.ansiColors.brightBlack': { - 'description': nls.localize('integratedTerminal.ansiColors.brightBlack', "Bright black color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#000000' - }, - 'integratedTerminal.ansiColors.brightRed': { - 'description': nls.localize('integratedTerminal.ansiColors.brightRed', "Bright red color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#cd3131' - }, - 'integratedTerminal.ansiColors.brightGreen': { - 'description': nls.localize('integratedTerminal.ansiColors.brightGreen', "Bright green color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#09885a' - }, - 'integratedTerminal.ansiColors.brightYellow': { - 'description': nls.localize('integratedTerminal.ansiColors.brightYellow', "Bright yellow color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#e5e510' - }, - 'integratedTerminal.ansiColors.brightBlue': { - 'description': nls.localize('integratedTerminal.ansiColors.brightBlue', "Bright blue color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#0451a5' - }, - 'integratedTerminal.ansiColors.brightMagenta': { - 'description': nls.localize('integratedTerminal.ansiColors.brightMagenta', "Bright magenta color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#bc05bc' - }, - 'integratedTerminal.ansiColors.brightCyan': { - 'description': nls.localize('integratedTerminal.ansiColors.brightCyan', "Bright cyan color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#0598bc' - }, - 'integratedTerminal.ansiColors.brightWhite': { - 'description': nls.localize('integratedTerminal.ansiColors.brightWhite', "Bright white color for terminals that support ANSI escape sequences (format: #rrggbb)"), - 'type': 'string', - 'default': '#e5e5e5' +// Only enable in the alpha channel until more stable +if (product.quality === 'alpha') { + let configurationRegistry = Registry.as(Extensions.Configuration); + configurationRegistry.registerConfiguration({ + 'id': 'terminal', + 'order': 100, + 'title': nls.localize('integratedTerminalConfigurationTitle', "(Experimental) Integrated terminal configuration"), + 'type': 'object', + 'properties': { + 'integratedTerminal.shell.unixLike': { + 'description': nls.localize('integratedTerminal.shell.unixLike', "The path of the shell that the terminal uses on Linux and OS X."), + 'type': 'string', + 'default': TERMINAL_DEFAULT_SHELL_UNIX_LIKE + }, + 'integratedTerminal.shell.windows': { + 'description': nls.localize('integratedTerminal.shell.windows', "The path of the shell that the terminal uses on Windows."), + 'type': 'string', + 'default': TERMINAL_DEFAULT_SHELL_WINDOWS + }, + 'integratedTerminal.fontFamily': { + 'description': nls.localize('integratedTerminal.fontFamily', "The font family used by the terminal (CSS font-family format)."), + 'type': 'string', + 'default': 'Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback"' + }, + 'integratedTerminal.ansiColors.black': { + 'description': nls.localize('integratedTerminal.ansiColors.black', "Black color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#000000' + }, + 'integratedTerminal.ansiColors.red': { + 'description': nls.localize('integratedTerminal.ansiColors.red', "Red color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#cd3131' + }, + 'integratedTerminal.ansiColors.green': { + 'description': nls.localize('integratedTerminal.ansiColors.green', "Green color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#09885a' + }, + 'integratedTerminal.ansiColors.yellow': { + 'description': nls.localize('integratedTerminal.ansiColors.yellow', "Yellow color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#e5e510' + }, + 'integratedTerminal.ansiColors.blue': { + 'description': nls.localize('integratedTerminal.ansiColors.blue', "Blue color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#0451a5' + }, + 'integratedTerminal.ansiColors.magenta': { + 'description': nls.localize('integratedTerminal.ansiColors.magenta', "Magenta color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#bc05bc' + }, + 'integratedTerminal.ansiColors.cyan': { + 'description': nls.localize('integratedTerminal.ansiColors.cyan', "Cyan color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#0598bc' + }, + 'integratedTerminal.ansiColors.white': { + 'description': nls.localize('integratedTerminal.ansiColors.white', "White color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#e5e5e5' + }, + 'integratedTerminal.ansiColors.brightBlack': { + 'description': nls.localize('integratedTerminal.ansiColors.brightBlack', "Bright black color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#000000' + }, + 'integratedTerminal.ansiColors.brightRed': { + 'description': nls.localize('integratedTerminal.ansiColors.brightRed', "Bright red color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#cd3131' + }, + 'integratedTerminal.ansiColors.brightGreen': { + 'description': nls.localize('integratedTerminal.ansiColors.brightGreen', "Bright green color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#09885a' + }, + 'integratedTerminal.ansiColors.brightYellow': { + 'description': nls.localize('integratedTerminal.ansiColors.brightYellow', "Bright yellow color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#e5e510' + }, + 'integratedTerminal.ansiColors.brightBlue': { + 'description': nls.localize('integratedTerminal.ansiColors.brightBlue', "Bright blue color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#0451a5' + }, + 'integratedTerminal.ansiColors.brightMagenta': { + 'description': nls.localize('integratedTerminal.ansiColors.brightMagenta', "Bright magenta color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#bc05bc' + }, + 'integratedTerminal.ansiColors.brightCyan': { + 'description': nls.localize('integratedTerminal.ansiColors.brightCyan', "Bright cyan color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#0598bc' + }, + 'integratedTerminal.ansiColors.brightWhite': { + 'description': nls.localize('integratedTerminal.ansiColors.brightWhite', "Bright white color for terminals that support ANSI escape sequences (format: #rrggbb)"), + 'type': 'string', + 'default': '#e5e5e5' + } } - } -}); + }); -// Register Service -registerSingleton(ITerminalService, TerminalService); + // Register Service + registerSingleton(ITerminalService, TerminalService); -// Register Output Panel -(Registry.as(panel.Extensions.Panels)).registerPanel(new panel.PanelDescriptor( - 'vs/workbench/parts/terminal/electron-browser/terminalPanel', - 'TerminalPanel', - TERMINAL_PANEL_ID, - nls.localize('terminal', "Terminal"), - 'terminal' -)); + // Register Output Panel + (Registry.as(panel.Extensions.Panels)).registerPanel(new panel.PanelDescriptor( + 'vs/workbench/parts/terminal/electron-browser/terminalPanel', + 'TerminalPanel', + TERMINAL_PANEL_ID, + nls.localize('terminal', "Terminal"), + 'terminal' + )); -// Register toggle output action globally -let actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); -// { primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK } -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL), 'View: ' + ToggleTerminalAction.LABEL, nls.localize('viewCategory', "View")); + // Register toggle output action globally + let actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); + // { primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK } + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL), 'View: ' + ToggleTerminalAction.LABEL, nls.localize('viewCategory', "View")); +} \ No newline at end of file