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

M
Matt Bierner 已提交
6
import { Event } from 'vs/base/common/event';
D
Dirk Baeumer 已提交
7
import { IDisposable } from 'vs/base/common/lifecycle';
D
Daniel Imms 已提交
8
import { RawContextKey, ContextKeyExpr, IContextKey } from 'vs/platform/contextkey/common/contextkey';
9 10
import { TPromise } from 'vs/base/common/winjs.base';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
D
Daniel Imms 已提交
11 12 13 14 15

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

export const TERMINAL_SERVICE_ID = 'terminalService';

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

21 22 23 24 25
/** 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();

R
rebornix 已提交
26 27 28 29
/**  A context key that is set when the find widget in integrated terminal is visible. */
export const KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE = new RawContextKey<boolean>('terminalFindWidgetVisible', undefined);
/**  A context key that is set when the find widget in integrated terminal is not visible. */
export const KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE: ContextKeyExpr = KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE.toNegated();
30 31 32 33
/**  A context key that is set when the find widget find input in integrated terminal is focused. */
export const KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED = new RawContextKey<boolean>('terminalFindWidgetInputFocused', false);
/**  A context key that is set when the find widget find input in integrated terminal is not focused. */
export const KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_NOT_FOCUSED: ContextKeyExpr = KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED.toNegated();
R
rebornix 已提交
34

35
export const IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY = 'terminal.integrated.isWorkspaceShellAllowed';
36
export const NEVER_SUGGEST_SELECT_WINDOWS_SHELL_STORAGE_KEY = 'terminal.integrated.neverSuggestSelectWindowsShell';
D
Daniel Imms 已提交
37
export const NEVER_MEASURE_RENDER_TIME_STORAGE_KEY = 'terminal.integrated.neverMeasureRenderTime';
38

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

41 42 43 44 45 46
export const TerminalCursorStyle = {
	BLOCK: 'block',
	LINE: 'line',
	UNDERLINE: 'underline'
};

47 48
export const TERMINAL_CONFIG_SECTION = 'terminal.integrated';

49 50 51 52
export const DEFAULT_LETTER_SPACING = 0;
export const MINIMUM_LETTER_SPACING = -5;
export const DEFAULT_LINE_HEIGHT = 1.0;

53 54
export type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900';

55
export interface ITerminalConfiguration {
D
Daniel Imms 已提交
56 57 58 59
	shell: {
		linux: string;
		osx: string;
		windows: string;
60
	};
D
Daniel Imms 已提交
61 62 63 64 65
	shellArgs: {
		linux: string[];
		osx: string[];
		windows: string[];
	};
D
Daniel Imms 已提交
66
	macOptionIsMeta: boolean;
D
Daniel Imms 已提交
67
	rendererType: 'auto' | 'canvas' | 'dom';
68
	rightClickBehavior: 'default' | 'copyPaste' | 'selectWord';
D
Daniel Imms 已提交
69 70 71
	cursorBlinking: boolean;
	cursorStyle: string;
	fontFamily: string;
72 73
	fontWeight: FontWeight;
	fontWeightBold: FontWeight;
74
	// fontLigatures: boolean;
D
Daniel Imms 已提交
75
	fontSize: number;
76
	letterSpacing: number;
D
Daniel Imms 已提交
77 78 79 80 81 82
	lineHeight: number;
	setLocaleVariables: boolean;
	scrollback: number;
	commandsToSkipShell: string[];
	cwd: string;
	confirmOnExit: boolean;
D
Daniel Imms 已提交
83
	enableBell: boolean;
84 85 86 87 88
	env: {
		linux: { [key: string]: string };
		osx: { [key: string]: string };
		windows: { [key: string]: string };
	};
B
bpceee 已提交
89
	showExitAlert: boolean;
90
	experimentalRestore: boolean;
91
	experimentalTextureCachingStrategy: 'static' | 'dynamic';
92 93
}

94
export interface ITerminalConfigHelper {
95
	config: ITerminalConfiguration;
96
	getFont(): ITerminalFont;
97 98 99 100
	/**
	 * Merges the default shell path and args into the provided launch configuration
	 */
	mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig): void;
101 102
	/** Sets whether a workspace shell configuration is allowed or not */
	setWorkspaceShellAllowed(isAllowed: boolean): void;
103 104 105 106
}

export interface ITerminalFont {
	fontFamily: string;
D
Daniel Imms 已提交
107
	fontSize: number;
108
	letterSpacing: number;
109
	lineHeight: number;
110 111
	charWidth?: number;
	charHeight?: number;
112 113
}

114
export interface IShellLaunchConfig {
115 116 117
	/**
	 * The name of the terminal, if this is not set the name of the process will be used.
	 */
118
	name?: string;
119 120 121 122

	/**
	 * The shell executable (bash, cmd, etc.).
	 */
123
	executable?: string;
124

125 126
	/**
	 * The CLI arguments to use with executable, a string[] is in argv format and will be escaped,
D
Daniel Imms 已提交
127 128
	 * 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.
129 130
	 */
	args?: string[] | string;
131

132 133 134 135 136
	/**
	 * The current working directory of the terminal, this overrides the `terminal.integrated.cwd`
	 * settings key.
	 */
	cwd?: string;
137

138 139 140 141 142
	/**
	 * 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 };
143

144 145 146 147 148
	/**
	 * 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;
149

150
	/** Whether to wait for a key press before closing the terminal. */
151 152
	waitOnExit?: boolean | string;

153 154 155 156 157 158 159
	/**
	 * 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;
160 161
}

D
Daniel Imms 已提交
162
export interface ITerminalService {
163
	_serviceBrand: any;
164

D
Daniel Imms 已提交
165
	activeTabIndex: number;
166
	configHelper: ITerminalConfigHelper;
D
Daniel Imms 已提交
167
	onActiveTabChanged: Event<void>;
168
	onTabDisposed: Event<ITerminalTab>;
169
	onInstanceCreated: Event<ITerminalInstance>;
170
	onInstanceDisposed: Event<ITerminalInstance>;
171
	onInstanceProcessIdReady: Event<ITerminalInstance>;
172
	onInstanceRequestExtHostProcess: Event<ITerminalProcessExtHostRequest>;
173
	onInstancesChanged: Event<void>;
174
	onInstanceTitleChanged: Event<string>;
175
	terminalInstances: ITerminalInstance[];
D
Daniel Imms 已提交
176
	terminalTabs: ITerminalTab[];
177

178 179 180 181 182 183 184 185 186 187 188
	/**
	 * Creates a terminal.
	 * @param shell The shell launch configuration to use.
	 * @param wasNewTerminalAction Whether this was triggered by a new terminal action, if so a
	 * default shell selection dialog may display.
	 */
	createTerminal(shell?: IShellLaunchConfig, wasNewTerminalAction?: boolean): ITerminalInstance;
	/**
	 * Creates a raw terminal instance, this should not be used outside of the terminal part.
	 */
	createInstance(terminalFocusContextKey: IContextKey<boolean>, configHelper: ITerminalConfigHelper, container: HTMLElement, shellLaunchConfig: IShellLaunchConfig, doCreateProcess: boolean): ITerminalInstance;
189
	getInstanceFromId(terminalId: number): ITerminalInstance;
T
t-amqi 已提交
190
	getInstanceFromIndex(terminalIndex: number): ITerminalInstance;
D
Daniel Imms 已提交
191
	getTabLabels(): string[];
192 193 194
	getActiveInstance(): ITerminalInstance;
	setActiveInstance(terminalInstance: ITerminalInstance): void;
	setActiveInstanceByIndex(terminalIndex: number): void;
195
	getActiveOrCreateInstance(wasNewTerminalAction?: boolean): ITerminalInstance;
196
	splitInstance(instance: ITerminalInstance, shell?: IShellLaunchConfig): void;
197

198
	getActiveTab(): ITerminalTab;
199 200 201 202
	setActiveTabToNext(): void;
	setActiveTabToPrevious(): void;
	setActiveTabByIndex(tabIndex: number): void;

203
	showPanel(focus?: boolean): TPromise<void>;
D
Daniel Imms 已提交
204
	hidePanel(): void;
205 206
	focusFindWidget(): TPromise<void>;
	hideFindWidget(): void;
207

208
	setContainers(panelContainer: HTMLElement, terminalContainer: HTMLElement): void;
D
Daniel Imms 已提交
209
	selectDefaultWindowsShell(): TPromise<string>;
210
	setWorkspaceShellAllowed(isAllowed: boolean): void;
211

212
	requestExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): void;
D
Daniel Imms 已提交
213
}
D
Daniel Imms 已提交
214

D
Daniel Imms 已提交
215 216 217 218 219 220 221
export const enum Direction {
	Left = 0,
	Right = 1,
	Up = 2,
	Down = 3
}

222
export interface ITerminalTab {
D
Daniel Imms 已提交
223
	activeInstance: ITerminalInstance;
224
	terminalInstances: ITerminalInstance[];
D
Daniel Imms 已提交
225
	title: string;
D
Daniel Imms 已提交
226
	onDisposed: Event<ITerminalTab>;
227
	onInstancesChanged: Event<void>;
228

229 230
	focusPreviousPane(): void;
	focusNextPane(): void;
D
Daniel Imms 已提交
231
	resizePane(direction: Direction): void;
232
	setActiveInstanceByIndex(index: number): void;
D
Daniel Imms 已提交
233
	attachToElement(element: HTMLElement): void;
D
Daniel Imms 已提交
234 235
	setVisible(visible: boolean): void;
	layout(width: number, height: number): void;
236
	addDisposable(disposable: IDisposable): void;
D
Daniel Imms 已提交
237
	split(terminalFocusContextKey: IContextKey<boolean>, configHelper: ITerminalConfigHelper, shellLaunchConfig: IShellLaunchConfig): ITerminalInstance;
238 239
}

240
export interface ITerminalInstance {
D
jsdoc  
Daniel Imms 已提交
241 242 243 244
	/**
	 * The ID of the terminal instance, this is an arbitrary number only used to identify the
	 * terminal instance.
	 */
245
	id: number;
D
jsdoc  
Daniel Imms 已提交
246

247
	/**
248 249
	 * The process ID of the shell process, this is undefined when there is no process associated
	 * with this terminal.
250
	 */
251
	processId: number | undefined;
252

D
jsdoc  
Daniel Imms 已提交
253 254 255
	/**
	 * An event that fires when the terminal instance's title changes.
	 */
D
Daniel Imms 已提交
256
	onTitleChanged: Event<string>;
D
jsdoc  
Daniel Imms 已提交
257

258 259 260 261 262
	/**
	 * An event that fires when the terminal instance is disposed.
	 */
	onDisposed: Event<ITerminalInstance>;

263 264
	onFocused: Event<ITerminalInstance>;

265 266
	onProcessIdReady: Event<ITerminalInstance>;

267 268
	onRequestExtHostProcess: Event<ITerminalInstance>;

D
Daniel Imms 已提交
269 270
	processReady: TPromise<void>;

D
jsdoc  
Daniel Imms 已提交
271 272 273 274 275 276
	/**
	 * 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
	 */
277 278
	title: string;

K
Kai Wood 已提交
279 280 281 282 283 284 285
	/**
	 * The focus state of the terminal before exiting.
	 *
	 * @readonly
	 */
	hadFocusOnExit: boolean;

A
Amy Qiu 已提交
286 287 288 289 290 291
	/**
	 * False when the title is set by an API or the user. We check this to make sure we
	 * do not override the title when the process title changes in the terminal.
	 */
	isTitleSetByProcess: boolean;

292 293 294 295 296
	/**
	 * The shell launch config used to launch the shell.
	 */
	shellLaunchConfig: IShellLaunchConfig;

297 298 299 300 301 302 303
	/**
	 * Whether to disable layout for the terminal. This is useful when the size of the terminal is
	 * being manipulating (eg. adding a split pane) and we want the terminal to ignore particular
	 * resize events.
	 */
	disableLayout: boolean;

D
Daniel Imms 已提交
304 305 306 307 308 309
	/**
	 * An object that tracks when commands are run and enables navigating and selecting between
	 * them.
	 */
	readonly commandTracker: ITerminalCommandTracker;

D
jsdoc  
Daniel Imms 已提交
310 311 312
	/**
	 * Dispose the terminal instance, removing it from the panel/service and freeing up resources.
	 */
313
	dispose(): void;
D
jsdoc  
Daniel Imms 已提交
314

315 316 317 318 319 320 321
	/**
	 * 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).
322 323
	 * @param validationCallback A callback which can be used to validate the link after it has been
	 * added to the DOM.
324 325
	 * @return The ID of the new matcher, this can be used to deregister.
	 */
D
Daniel Imms 已提交
326
	registerLinkMatcher(regex: RegExp, handler: (url: string) => void, matchIndex?: number, validationCallback?: (uri: string, callback: (isValid: boolean) => void) => void): number;
327 328 329 330 331 332 333 334

	/**
	 * 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;

335 336 337 338 339
	/**
	 * Check if anything is selected in terminal.
	 */
	hasSelection(): boolean;

D
jsdoc  
Daniel Imms 已提交
340 341 342
	/**
	 * Copies the terminal selection to the clipboard.
	 */
343
	copySelection(): void;
D
jsdoc  
Daniel Imms 已提交
344

345 346 347 348 349
	/**
	 * Current selection in the terminal.
	 */
	readonly selection: string | undefined;

350 351 352 353 354
	/**
	 * Clear current selection.
	 */
	clearSelection(): void;

355 356 357 358 359
	/**
	 * Select all text in the terminal.
	 */
	selectAll(): void;

R
rebornix 已提交
360 361 362 363 364 365 366 367 368 369
	/**
	 * Find the next instance of the term
	*/
	findNext(term: string): boolean;

	/**
	 * Find the previous instance of the term
	 */
	findPrevious(term: string): boolean;

370 371 372 373 374
	/**
	 * Notifies the terminal that the find widget's focus state has been changed.
	 */
	notifyFindWidgetFocusChanged(isFocused: boolean): void;

D
jsdoc  
Daniel Imms 已提交
375 376 377 378 379
	/**
	 * Focuses the terminal instance.
	 *
	 * @param focus Force focus even if there is a selection.
	 */
D
Daniel Imms 已提交
380
	focus(force?: boolean): void;
D
jsdoc  
Daniel Imms 已提交
381 382 383 384

	/**
	 * Focuses and pastes the contents of the clipboard into the terminal instance.
	 */
385
	paste(): void;
D
jsdoc  
Daniel Imms 已提交
386 387 388 389 390 391 392 393 394 395

	/**
	 * 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`.
	 */
396
	sendText(text: string, addNewLine: boolean): void;
D
jsdoc  
Daniel Imms 已提交
397

398 399 400 401
	/** Scroll the terminal buffer down 1 line. */
	scrollDownLine(): void;
	/** Scroll the terminal buffer down 1 page. */
	scrollDownPage(): void;
402 403
	/** Scroll the terminal buffer to the bottom. */
	scrollToBottom(): void;
404 405 406 407
	/** Scroll the terminal buffer up 1 line. */
	scrollUpLine(): void;
	/** Scroll the terminal buffer up 1 page. */
	scrollUpPage(): void;
408 409
	/** Scroll the terminal buffer to the top. */
	scrollToTop(): void;
D
Daniel Imms 已提交
410

D
Daniel Imms 已提交
411 412 413 414 415
	/**
	 * Clears the terminal buffer, leaving only the prompt line.
	 */
	clear(): void;

D
jsdoc  
Daniel Imms 已提交
416 417 418 419 420 421
	/**
	 * 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 已提交
422
	attachToElement(container: HTMLElement): void;
D
jsdoc  
Daniel Imms 已提交
423 424

	/**
425
	 * Updates the configuration of the terminal instance.
D
jsdoc  
Daniel Imms 已提交
426
	 */
427
	updateConfig(): void;
D
Daniel Imms 已提交
428

429 430 431 432 433 434
	/**
	 * Updates the accessibility support state of the terminal instance.
	 * @param isEnabled Whether it's enabled.
	 */
	updateAccessibilitySupport(isEnabled: boolean): void;

D
jsdoc  
Daniel Imms 已提交
435 436 437 438 439
	/**
	 * Configure the dimensions of the terminal instance.
	 *
	 * @param dimension The dimensions of the container.
	 */
440
	layout(dimension: { width: number, height: number }): void;
D
jsdoc  
Daniel Imms 已提交
441 442 443 444 445 446

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

D
Daniel Imms 已提交
449 450 451 452 453 454 455
	/**
	 * Attach a listener to the raw data stream coming from the pty, including ANSI escape
	 * sequecnes.
	 * @param listener  The listener function.
	 */
	onData(listener: (data: string) => void): IDisposable;

456 457 458 459 460
	/**
	 * Attach a listener to listen for new lines added to this terminal instance.
	 *
	 * @param listener The listener function which takes new line strings added to the terminal,
	 * excluding ANSI escape sequences. The line event will fire when an LF character is added to
461 462 463 464
	 * the terminal (ie. the line is not wrapped). Note that this means that the line data will
	 * not fire for the last line, until either the line is ended with a LF character of the process
	 * is exited. The lineData string will contain the fully wrapped line, not containing any LF/CR
	 * characters.
465 466 467
	 */
	onLineData(listener: (lineData: string) => void): IDisposable;

468 469 470 471 472 473
	/**
	 * 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 已提交
474
	onExit(listener: (exitCode: number) => void): IDisposable;
475 476 477 478 479 480

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

B
Ben Stein 已提交
483 484 485
	/**
	 * Sets the title of the terminal instance.
	 */
A
Amy Qiu 已提交
486
	setTitle(title: string, eventFromProcess: boolean): void;
487 488

	addDisposable(disposable: IDisposable): void;
D
Daniel Imms 已提交
489
}
D
Daniel Imms 已提交
490 491

export interface ITerminalCommandTracker {
492 493
	scrollToPreviousCommand(): void;
	scrollToNextCommand(): void;
D
Daniel Imms 已提交
494 495
	selectToPreviousCommand(): void;
	selectToNextCommand(): void;
496 497
	selectToPreviousLine(): void;
	selectToNextLine(): void;
498
}
D
Daniel Imms 已提交
499 500

export interface ITerminalProcessManager extends IDisposable {
501
	readonly processState: ProcessState;
D
Daniel Imms 已提交
502 503 504 505 506 507 508 509
	readonly ptyProcessReady: TPromise<void>;
	readonly shellProcessId: number;
	readonly initialCwd: string;

	readonly onProcessReady: Event<void>;
	readonly onProcessData: Event<string>;
	readonly onProcessTitle: Event<string>;
	readonly onProcessExit: Event<number>;
D
Daniel Imms 已提交
510

D
Daniel Imms 已提交
511
	addDisposable(disposable: IDisposable);
D
Daniel Imms 已提交
512
	createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number);
D
Daniel Imms 已提交
513
	write(data: string): void;
D
Daniel Imms 已提交
514
	setDimensions(cols: number, rows: number): void;
515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534
}

export enum ProcessState {
	// The process has not been initialized yet.
	UNINITIALIZED,
	// The process is currently launching, the process is marked as launching
	// for a short duration after being created and is helpful to indicate
	// whether the process died as a result of bad shell and args.
	LAUNCHING,
	// The process is running normally.
	RUNNING,
	// The process was killed during launch, likely as a result of bad shell and
	// args.
	KILLED_DURING_LAUNCH,
	// The process was killed by the user (the event originated from VS Code).
	KILLED_BY_USER,
	// The process was killed by itself, for example the shell crashed or `exit`
	// was run.
	KILLED_BY_PROCESS
}
535 536


537
export interface ITerminalProcessExtHostProxy extends IDisposable {
538 539
	readonly terminalId: number;

540 541 542
	emitData(data: string): void;
	emitTitle(title: string): void;
	emitPid(pid: number): void;
D
Daniel Imms 已提交
543
	emitExit(exitCode: number): void;
544 545 546 547

	onInput(listener: (data: string) => void): void;
	onResize(listener: (cols: number, rows: number) => void): void;
	onShutdown(listener: () => void): void;
548
}
549 550 551 552 553 554 555

export interface ITerminalProcessExtHostRequest {
	proxy: ITerminalProcessExtHostProxy;
	shellLaunchConfig: IShellLaunchConfig;
	cols: number;
	rows: number;
}