terminal.ts 10.3 KB
Newer Older
D
Daniel Imms 已提交
1 2 3 4 5 6
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
'use strict';

7
import Event from 'vs/base/common/event';
8
import platform = require('vs/base/common/platform');
D
Dirk Baeumer 已提交
9
import { IDisposable } from 'vs/base/common/lifecycle';
10 11 12
import { RawContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
import { TPromise } from 'vs/base/common/winjs.base';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
D
Daniel Imms 已提交
13 14 15 16 17

export const TERMINAL_PANEL_ID = 'workbench.panel.terminal';

export const TERMINAL_SERVICE_ID = 'terminalService';

H
hun1ahpu 已提交
18 19
export const TERMINAL_DEFAULT_RIGHT_CLICK_COPY_PASTE = platform.isWindows;

20
/**  A context key that is set when the integrated terminal has focus. */
A
Alex Dima 已提交
21
export const KEYBINDING_CONTEXT_TERMINAL_FOCUS = new RawContextKey<boolean>('terminalFocus', undefined);
22
/**  A context key that is set when the integrated terminal does not have focus. */
J
Johannes Rieken 已提交
23
export const KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED: ContextKeyExpr = KEYBINDING_CONTEXT_TERMINAL_FOCUS.toNegated();
24

25 26 27 28 29
/** A keybinding context key that is set when the integrated terminal has text selected. */
export const KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED = new RawContextKey<boolean>('terminalTextSelected', undefined);
/** A keybinding context key that is set when the integrated terminal does not have text selected. */
export const KEYBINDING_CONTEXT_TERMINAL_TEXT_NOT_SELECTED: ContextKeyExpr = KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED.toNegated();

B
Benjamin Pasero 已提交
30
export const ITerminalService = createDecorator<ITerminalService>(TERMINAL_SERVICE_ID);
D
Daniel Imms 已提交
31

32 33 34 35 36 37
export const TerminalCursorStyle = {
	BLOCK: 'block',
	LINE: 'line',
	UNDERLINE: 'underline'
};

38
export interface ITerminalConfiguration {
D
Daniel Imms 已提交
39 40 41 42
	shell: {
		linux: string;
		osx: string;
		windows: string;
43
	};
D
Daniel Imms 已提交
44 45 46 47 48
	shellArgs: {
		linux: string[];
		osx: string[];
		windows: string[];
	};
P
Phawin Khongkhasawan 已提交
49
	enableBold: boolean;
D
Daniel Imms 已提交
50 51 52 53 54 55 56 57 58 59 60 61
	rightClickCopyPaste: boolean;
	cursorBlinking: boolean;
	cursorStyle: string;
	fontFamily: string;
	fontLigatures: boolean;
	fontSize: number;
	lineHeight: number;
	setLocaleVariables: boolean;
	scrollback: number;
	commandsToSkipShell: string[];
	cwd: string;
	confirmOnExit: boolean;
62 63
}

64
export interface ITerminalConfigHelper {
65
	config: ITerminalConfiguration;
66
	getFont(): ITerminalFont;
67 68 69 70
	/**
	 * Merges the default shell path and args into the provided launch configuration
	 */
	mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig): void;
71 72 73 74 75 76 77 78 79 80
}

export interface ITerminalFont {
	fontFamily: string;
	fontSize: string;
	lineHeight: number;
	charWidth: number;
	charHeight: number;
}

81
export interface IShellLaunchConfig {
A
Andre Weinand 已提交
82
	/** The name of the terminal, if this is not set the name of the process will be used. */
83 84 85
	name?: string;
	/** The shell executable (bash, cmd, etc.). */
	executable?: string;
86 87
	/**
	 * The CLI arguments to use with executable, a string[] is in argv format and will be escaped,
D
Daniel Imms 已提交
88 89
	 * a string is in "CommandLine" pre-escaped format and will be used as is. The string option is
	 * only supported on Windows and will throw an exception if used on macOS or Linux.
90 91
	 */
	args?: string[] | string;
92 93 94 95 96
	/**
	 * The current working directory of the terminal, this overrides the `terminal.integrated.cwd`
	 * settings key.
	 */
	cwd?: string;
97 98 99 100 101
	/**
	 * A custom environment for the terminal, if this is not set the environment will be inherited
	 * from the VS Code process.
	 */
	env?: { [key: string]: string };
102 103 104 105 106 107
	/**
	 * Whether to ignore a custom cwd from the `terminal.integrated.cwd` settings key (eg. if the
	 * shell is being launched by an extension).
	 */
	ignoreConfigurationCwd?: boolean;
	/** Whether to wait for a key press before closing the terminal. */
108
	waitOnExit?: boolean;
109 110 111 112 113 114 115
	/**
	 * A string including ANSI escape sequences that will be written to the terminal emulator
	 * _before_ the terminal process has launched, a trailing \n is added at the end of the string.
	 * This allows for example the terminal instance to display a styled message as the first line
	 * of the terminal. Use \x1b over \033 or \e for the escape control character.
	 */
	initialText?: string;
116 117
}

D
Daniel Imms 已提交
118
export interface ITerminalService {
119
	_serviceBrand: any;
120

D
Daniel Imms 已提交
121
	activeTerminalInstanceIndex: number;
122
	configHelper: ITerminalConfigHelper;
123
	onActiveInstanceChanged: Event<string>;
124
	onInstanceDisposed: Event<ITerminalInstance>;
125
	onInstanceProcessIdReady: Event<ITerminalInstance>;
126 127
	onInstancesChanged: Event<string>;
	onInstanceTitleChanged: Event<string>;
128 129
	terminalInstances: ITerminalInstance[];

130
	createInstance(shell?: IShellLaunchConfig, wasNewTerminalAction?: boolean): ITerminalInstance;
131
	getInstanceFromId(terminalId: number): ITerminalInstance;
D
Daniel Imms 已提交
132
	getInstanceLabels(): string[];
133 134 135 136 137
	getActiveInstance(): ITerminalInstance;
	setActiveInstance(terminalInstance: ITerminalInstance): void;
	setActiveInstanceByIndex(terminalIndex: number): void;
	setActiveInstanceToNext(): void;
	setActiveInstanceToPrevious(): void;
138
	getActiveOrCreateInstance(wasNewTerminalAction?: boolean): ITerminalInstance;
139 140

	showPanel(focus?: boolean): TPromise<void>;
D
Daniel Imms 已提交
141
	hidePanel(): void;
142
	setContainers(panelContainer: HTMLElement, terminalContainer: HTMLElement): void;
143
	updateConfig(): void;
D
Daniel Imms 已提交
144
	selectDefaultWindowsShell(): TPromise<string>;
D
Daniel Imms 已提交
145
}
D
Daniel Imms 已提交
146

147
export interface ITerminalInstance {
D
jsdoc  
Daniel Imms 已提交
148 149 150 151
	/**
	 * The ID of the terminal instance, this is an arbitrary number only used to identify the
	 * terminal instance.
	 */
152
	id: number;
D
jsdoc  
Daniel Imms 已提交
153

154 155 156 157 158
	/**
	 * The process ID of the shell process.
	 */
	processId: number;

D
jsdoc  
Daniel Imms 已提交
159 160 161
	/**
	 * An event that fires when the terminal instance's title changes.
	 */
D
Daniel Imms 已提交
162
	onTitleChanged: Event<string>;
D
jsdoc  
Daniel Imms 已提交
163

164 165 166 167 168
	/**
	 * An event that fires when the terminal instance is disposed.
	 */
	onDisposed: Event<ITerminalInstance>;

D
jsdoc  
Daniel Imms 已提交
169 170 171 172 173 174
	/**
	 * The title of the terminal. This is either title or the process currently running or an
	 * explicit name given to the terminal instance through the extension API.
	 *
	 * @readonly
	 */
175 176
	title: string;

K
Kai Wood 已提交
177 178 179 180 181 182 183
	/**
	 * The focus state of the terminal before exiting.
	 *
	 * @readonly
	 */
	hadFocusOnExit: boolean;

D
jsdoc  
Daniel Imms 已提交
184 185 186
	/**
	 * Dispose the terminal instance, removing it from the panel/service and freeing up resources.
	 */
187
	dispose(): void;
D
jsdoc  
Daniel Imms 已提交
188

189 190 191 192 193 194 195
	/**
	 * Registers a link matcher, allowing custom link patterns to be matched and handled.
	 * @param regex The regular expression the search for, specifically this searches the
	 * textContent of the rows. You will want to use \s to match a space ' ' character for example.
	 * @param handler The callback when the link is called.
	 * @param matchIndex The index of the link from the regex.match(html) call. This defaults to 0
	 * (for regular expressions without capture groups).
196 197
	 * @param validationCallback A callback which can be used to validate the link after it has been
	 * added to the DOM.
198 199
	 * @return The ID of the new matcher, this can be used to deregister.
	 */
D
Daniel Imms 已提交
200
	registerLinkMatcher(regex: RegExp, handler: (url: string) => void, matchIndex?: number, validationCallback?: (uri: string, element: HTMLElement, callback: (isValid: boolean) => void) => void): number;
201 202 203 204 205 206 207 208

	/**
	 * Deregisters a link matcher if it has been registered.
	 * @param matcherId The link matcher's ID (returned after register)
	 * @return Whether a link matcher was found and deregistered.
	 */
	deregisterLinkMatcher(matcherId: number): void;

209 210 211 212 213
	/**
	 * Check if anything is selected in terminal.
	 */
	hasSelection(): boolean;

D
jsdoc  
Daniel Imms 已提交
214 215 216
	/**
	 * Copies the terminal selection to the clipboard.
	 */
217
	copySelection(): void;
D
jsdoc  
Daniel Imms 已提交
218

219 220 221 222 223
	/**
	 * Clear current selection.
	 */
	clearSelection(): void;

D
jsdoc  
Daniel Imms 已提交
224 225 226 227 228
	/**
	 * Focuses the terminal instance.
	 *
	 * @param focus Force focus even if there is a selection.
	 */
D
Daniel Imms 已提交
229
	focus(force?: boolean): void;
D
jsdoc  
Daniel Imms 已提交
230 231 232 233

	/**
	 * Focuses and pastes the contents of the clipboard into the terminal instance.
	 */
234
	paste(): void;
D
jsdoc  
Daniel Imms 已提交
235 236 237 238 239 240 241 242 243 244

	/**
	 * Send text to the terminal instance. The text is written to the stdin of the underlying pty
	 * process (shell) of the terminal instance.
	 *
	 * @param text The text to send.
	 * @param addNewLine Whether to add a new line to the text being sent, this is normally
	 * required to run a command in the terminal. The character(s) added are \n or \r\n
	 * depending on the platform. This defaults to `true`.
	 */
245
	sendText(text: string, addNewLine: boolean): void;
D
jsdoc  
Daniel Imms 已提交
246

247 248 249 250
	/** Scroll the terminal buffer down 1 line. */
	scrollDownLine(): void;
	/** Scroll the terminal buffer down 1 page. */
	scrollDownPage(): void;
251 252
	/** Scroll the terminal buffer to the bottom. */
	scrollToBottom(): void;
253 254 255 256
	/** Scroll the terminal buffer up 1 line. */
	scrollUpLine(): void;
	/** Scroll the terminal buffer up 1 page. */
	scrollUpPage(): void;
257 258
	/** Scroll the terminal buffer to the top. */
	scrollToTop(): void;
D
Daniel Imms 已提交
259

D
Daniel Imms 已提交
260 261 262 263 264
	/**
	 * Clears the terminal buffer, leaving only the prompt line.
	 */
	clear(): void;

D
jsdoc  
Daniel Imms 已提交
265 266 267 268 269 270
	/**
	 * Attaches the terminal instance to an element on the DOM, before this is called the terminal
	 * instance process may run in the background but cannot be displayed on the UI.
	 *
	 * @param container The element to attach the terminal instance to.
	 */
D
Daniel Imms 已提交
271
	attachToElement(container: HTMLElement): void;
D
jsdoc  
Daniel Imms 已提交
272 273

	/**
274
	 * Updates the configuration of the terminal instance.
D
jsdoc  
Daniel Imms 已提交
275
	 */
276
	updateConfig(): void;
D
Daniel Imms 已提交
277

D
jsdoc  
Daniel Imms 已提交
278 279 280 281 282
	/**
	 * Configure the dimensions of the terminal instance.
	 *
	 * @param dimension The dimensions of the container.
	 */
283
	layout(dimension: { width: number, height: number }): void;
D
jsdoc  
Daniel Imms 已提交
284 285 286 287 288 289

	/**
	 * Sets whether the terminal instance's element is visible in the DOM.
	 *
	 * @param visible Whether the element is visible.
	 */
D
Daniel Imms 已提交
290
	setVisible(visible: boolean): void;
291 292 293 294

	/**
	 * Attach a listener to the data stream from the terminal's pty process.
	 *
295 296
	 * @param listener The listener function which takes the processes' data stream (including
	 * ANSI escape sequences).
297
	 */
D
Dirk Baeumer 已提交
298
	onData(listener: (data: string) => void): IDisposable;
299 300 301 302 303 304 305

	/**
	 * Attach a listener that fires when the terminal's pty process exits.
	 *
	 * @param listener The listener function which takes the processes' exit code, an exit code of
	 * null means the process was killed as a result of the ITerminalInstance being disposed.
	 */
D
Dirk Baeumer 已提交
306
	onExit(listener: (exitCode: number) => void): IDisposable;
307 308 309 310 311 312

	/**
	 * Immediately kills the terminal's current pty process and launches a new one to replace it.
	 *
	 * @param shell The new launch configuration.
	 */
313
	reuseTerminal(shell?: IShellLaunchConfig): void;
D
Daniel Imms 已提交
314
}