terminal.ts 22.0 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';
8
import * as platform from 'vs/base/common/platform';
D
Daniel Imms 已提交
9
import { RawContextKey, ContextKeyExpr, IContextKey } from 'vs/platform/contextkey/common/contextkey';
10
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
11
import { FindReplaceState } from 'vs/editor/contrib/find/findState';
D
Daniel Imms 已提交
12 13 14 15 16

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

export const TERMINAL_SERVICE_ID = 'terminalService';

17 18 19
/** A context key that is set when there is at least one opened integrated terminal. */
export const KEYBINDING_CONTEXT_TERMINAL_IS_OPEN = new RawContextKey<boolean>('terminalIsOpen', false);
/** A context key that is set when the integrated terminal has focus. */
20
export const KEYBINDING_CONTEXT_TERMINAL_FOCUS = new RawContextKey<boolean>('terminalFocus', false);
21
/** A context key that is set when the integrated terminal does not have focus. */
J
Johannes Rieken 已提交
22
export const KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED: ContextKeyExpr = KEYBINDING_CONTEXT_TERMINAL_FOCUS.toNegated();
23

24
/** A keybinding context key that is set when the integrated terminal has text selected. */
25
export const KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED = new RawContextKey<boolean>('terminalTextSelected', false);
26 27 28
/** 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 已提交
29
/**  A context key that is set when the find widget in integrated terminal is visible. */
30
export const KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE = new RawContextKey<boolean>('terminalFindWidgetVisible', false);
R
rebornix 已提交
31 32
/**  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();
33 34
/**  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);
35 36
/**  A context key that is set when the find widget in integrated terminal is focused. */
export const KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED = new RawContextKey<boolean>('terminalFindWidgetFocused', false);
37 38
/**  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 已提交
39

40
export const IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY = 'terminal.integrated.isWorkspaceShellAllowed';
41
export const NEVER_SUGGEST_SELECT_WINDOWS_SHELL_STORAGE_KEY = 'terminal.integrated.neverSuggestSelectWindowsShell';
D
Daniel Imms 已提交
42
export const NEVER_MEASURE_RENDER_TIME_STORAGE_KEY = 'terminal.integrated.neverMeasureRenderTime';
43

44 45 46 47 48
// The creation of extension host terminals is delayed by this value (milliseconds). The purpose of
// this delay is to allow the terminal instance to initialize correctly and have its ID set before
// trying to create the corressponding object on the ext host.
export const EXT_HOST_CREATION_DELAY = 100;

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

51 52 53 54 55 56
export const TerminalCursorStyle = {
	BLOCK: 'block',
	LINE: 'line',
	UNDERLINE: 'underline'
};

57 58
export const TERMINAL_CONFIG_SECTION = 'terminal.integrated';

59 60 61 62
export const DEFAULT_LETTER_SPACING = 0;
export const MINIMUM_LETTER_SPACING = -5;
export const DEFAULT_LINE_HEIGHT = 1.0;

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

65
export interface ITerminalConfiguration {
D
Daniel Imms 已提交
66 67 68 69
	shell: {
		linux: string;
		osx: string;
		windows: string;
70
	};
D
Daniel Imms 已提交
71 72 73 74 75
	shellArgs: {
		linux: string[];
		osx: string[];
		windows: string[];
	};
D
Daniel Imms 已提交
76
	macOptionIsMeta: boolean;
77
	macOptionClickForcesSelection: boolean;
D
Daniel Imms 已提交
78
	rendererType: 'auto' | 'canvas' | 'dom';
79
	rightClickBehavior: 'default' | 'copyPaste' | 'selectWord';
D
Daniel Imms 已提交
80 81
	cursorBlinking: boolean;
	cursorStyle: string;
82
	drawBoldTextInBrightColors: boolean;
D
Daniel Imms 已提交
83
	fontFamily: string;
84 85
	fontWeight: FontWeight;
	fontWeightBold: FontWeight;
86
	// fontLigatures: boolean;
D
Daniel Imms 已提交
87
	fontSize: number;
88
	letterSpacing: number;
D
Daniel Imms 已提交
89 90 91 92 93 94
	lineHeight: number;
	setLocaleVariables: boolean;
	scrollback: number;
	commandsToSkipShell: string[];
	cwd: string;
	confirmOnExit: boolean;
D
Daniel Imms 已提交
95
	enableBell: boolean;
96 97 98 99 100
	env: {
		linux: { [key: string]: string };
		osx: { [key: string]: string };
		windows: { [key: string]: string };
	};
B
bpceee 已提交
101
	showExitAlert: boolean;
102
	experimentalBufferImpl: 'JsArray' | 'TypedArray';
103
	splitCwd: 'workspaceRoot' | 'sourceInitialCwd' | 'sourceCwd';
104 105
}

106
export interface ITerminalConfigHelper {
107
	config: ITerminalConfiguration;
108
	getFont(): ITerminalFont;
109 110 111
	/**
	 * Merges the default shell path and args into the provided launch configuration
	 */
112
	mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig, platformOverride?: platform.Platform): void;
113 114
	/** Sets whether a workspace shell configuration is allowed or not */
	setWorkspaceShellAllowed(isAllowed: boolean): void;
115 116 117 118
}

export interface ITerminalFont {
	fontFamily: string;
D
Daniel Imms 已提交
119
	fontSize: number;
120
	letterSpacing: number;
121
	lineHeight: number;
122 123
	charWidth?: number;
	charHeight?: number;
124 125
}

126
export interface IShellLaunchConfig {
127 128 129
	/**
	 * The name of the terminal, if this is not set the name of the process will be used.
	 */
130
	name?: string;
131 132 133 134

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

137 138
	/**
	 * The CLI arguments to use with executable, a string[] is in argv format and will be escaped,
D
Daniel Imms 已提交
139 140
	 * 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.
141 142
	 */
	args?: string[] | string;
143

144 145 146 147 148
	/**
	 * The current working directory of the terminal, this overrides the `terminal.integrated.cwd`
	 * settings key.
	 */
	cwd?: string;
149

150 151 152 153 154
	/**
	 * 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 };
155

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

162
	/** Whether to wait for a key press before closing the terminal. */
163 164
	waitOnExit?: boolean | string;

165 166 167 168 169 170 171
	/**
	 * 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;
172 173 174 175 176 177

	/**
	 * When true the terminal will be created with no process. This is primarily used to give
	 * extensions full control over the terminal.
	 */
	isRendererOnly?: boolean;
178 179
}

D
Daniel Imms 已提交
180
export interface ITerminalService {
181
	_serviceBrand: any;
182

D
Daniel Imms 已提交
183
	activeTabIndex: number;
184
	configHelper: ITerminalConfigHelper;
D
Daniel Imms 已提交
185
	onActiveTabChanged: Event<void>;
186
	onTabDisposed: Event<ITerminalTab>;
187
	onInstanceCreated: Event<ITerminalInstance>;
188
	onInstanceDisposed: Event<ITerminalInstance>;
189
	onInstanceProcessIdReady: Event<ITerminalInstance>;
D
Daniel Imms 已提交
190
	onInstanceDimensionsChanged: Event<ITerminalInstance>;
191
	onInstanceRequestExtHostProcess: Event<ITerminalProcessExtHostRequest>;
192
	onInstancesChanged: Event<void>;
193
	onInstanceTitleChanged: Event<ITerminalInstance>;
194
	onActiveInstanceChanged: Event<ITerminalInstance>;
195
	terminalInstances: ITerminalInstance[];
D
Daniel Imms 已提交
196
	terminalTabs: ITerminalTab[];
197

198 199 200 201 202 203 204
	/**
	 * 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;
205 206 207 208 209 210

	/**
	 * Creates a terminal renderer.
	 * @param name The name of the terminal.
	 */
	createTerminalRenderer(name: string): ITerminalInstance;
211 212 213
	/**
	 * Creates a raw terminal instance, this should not be used outside of the terminal part.
	 */
M
Matt Bierner 已提交
214
	createInstance(terminalFocusContextKey: IContextKey<boolean>, configHelper: ITerminalConfigHelper, container: HTMLElement | undefined, shellLaunchConfig: IShellLaunchConfig, doCreateProcess: boolean): ITerminalInstance;
215
	getInstanceFromId(terminalId: number): ITerminalInstance;
T
t-amqi 已提交
216
	getInstanceFromIndex(terminalIndex: number): ITerminalInstance;
D
Daniel Imms 已提交
217
	getTabLabels(): string[];
M
Matt Bierner 已提交
218
	getActiveInstance(): ITerminalInstance | null;
219 220
	setActiveInstance(terminalInstance: ITerminalInstance): void;
	setActiveInstanceByIndex(terminalIndex: number): void;
221
	getActiveOrCreateInstance(wasNewTerminalAction?: boolean): ITerminalInstance;
222
	splitInstance(instance: ITerminalInstance, shell?: IShellLaunchConfig): void;
223

M
Matt Bierner 已提交
224
	getActiveTab(): ITerminalTab | null;
225 226 227 228
	setActiveTabToNext(): void;
	setActiveTabToPrevious(): void;
	setActiveTabByIndex(tabIndex: number): void;

229
	showPanel(focus?: boolean): Promise<void>;
D
Daniel Imms 已提交
230
	hidePanel(): void;
231
	focusFindWidget(): Promise<void>;
232
	hideFindWidget(): void;
233
	getFindState(): FindReplaceState;
234 235
	findNext(): void;
	findPrevious(): void;
236

237
	setContainers(panelContainer: HTMLElement, terminalContainer: HTMLElement): void;
238
	selectDefaultWindowsShell(): Promise<string>;
239
	setWorkspaceShellAllowed(isAllowed: boolean): void;
240

241
	requestExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): void;
D
Daniel Imms 已提交
242
}
D
Daniel Imms 已提交
243

D
Daniel Imms 已提交
244 245 246 247 248 249 250
export const enum Direction {
	Left = 0,
	Right = 1,
	Up = 2,
	Down = 3
}

251
export interface ITerminalTab {
M
Matt Bierner 已提交
252
	activeInstance: ITerminalInstance | null;
253
	terminalInstances: ITerminalInstance[];
D
Daniel Imms 已提交
254
	title: string;
D
Daniel Imms 已提交
255
	onDisposed: Event<ITerminalTab>;
256
	onInstancesChanged: Event<void>;
257

258 259
	focusPreviousPane(): void;
	focusNextPane(): void;
D
Daniel Imms 已提交
260
	resizePane(direction: Direction): void;
261
	setActiveInstanceByIndex(index: number): void;
D
Daniel Imms 已提交
262
	attachToElement(element: HTMLElement): void;
D
Daniel Imms 已提交
263 264
	setVisible(visible: boolean): void;
	layout(width: number, height: number): void;
265
	addDisposable(disposable: IDisposable): void;
M
Matt Bierner 已提交
266
	split(terminalFocusContextKey: IContextKey<boolean>, configHelper: ITerminalConfigHelper, shellLaunchConfig: IShellLaunchConfig): ITerminalInstance | undefined;
267 268
}

D
Daniel Imms 已提交
269 270 271 272 273 274 275 276 277 278 279 280
export interface ITerminalDimensions {
	/**
	 * The columns of the terminal.
	 */
	readonly cols: number;

	/**
	 * The rows of the terminal.
	 */
	readonly rows: number;
}

281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
interface ISearchOptions {
	/**
	 * Whether the find should be done as a regex.
	 */
	regex?: boolean;
	/**
	 * Whether only whole words should match.
	 */
	wholeWord?: boolean;
	/**
	 * Whether find should pay attention to case.
	 */
	caseSensitive?: boolean;
}

296
export interface ITerminalInstance {
D
jsdoc  
Daniel Imms 已提交
297 298 299 300
	/**
	 * The ID of the terminal instance, this is an arbitrary number only used to identify the
	 * terminal instance.
	 */
D
Daniel Imms 已提交
301 302 303 304
	readonly id: number;

	readonly cols: number;
	readonly rows: number;
D
jsdoc  
Daniel Imms 已提交
305

306
	/**
307 308
	 * The process ID of the shell process, this is undefined when there is no process associated
	 * with this terminal.
309
	 */
310
	processId: number | undefined;
311

D
jsdoc  
Daniel Imms 已提交
312 313 314
	/**
	 * An event that fires when the terminal instance's title changes.
	 */
315
	onTitleChanged: Event<ITerminalInstance>;
D
jsdoc  
Daniel Imms 已提交
316

317 318 319 320 321
	/**
	 * An event that fires when the terminal instance is disposed.
	 */
	onDisposed: Event<ITerminalInstance>;

322 323
	onFocused: Event<ITerminalInstance>;

324 325
	onProcessIdReady: Event<ITerminalInstance>;

326 327
	onRequestExtHostProcess: Event<ITerminalInstance>;

D
Daniel Imms 已提交
328 329
	onDimensionsChanged: Event<void>;

330 331
	onFocus: Event<ITerminalInstance>;

D
Daniel Imms 已提交
332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
	/**
	 * Attach a listener to the raw data stream coming from the pty, including ANSI escape
	 * sequences.
	 */
	onData: Event<string>;

	/**
	 * Attach a listener to the "renderer" input event, this event fires for terminal renderers on
	 * keystrokes and when the Terminal.sendText extension API is used.
	 * @param listener The listener function.
	 */
	onRendererInput: Event<string>;

	/**
	 * 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
	 * 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.
	 */
	onLineData: Event<string>;

	/**
	 * Attach a listener that fires when the terminal's pty process exits. The number in the event
	 * is the processes' exit code, an exit code of null means the process was killed as a result of
	 * the ITerminalInstance being disposed.
	 */
	onExit: Event<number>;

364
	processReady: Promise<void>;
D
Daniel Imms 已提交
365

D
jsdoc  
Daniel Imms 已提交
366 367 368 369 370 371
	/**
	 * 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
	 */
372 373
	title: string;

K
Kai Wood 已提交
374 375 376 377 378 379 380
	/**
	 * The focus state of the terminal before exiting.
	 *
	 * @readonly
	 */
	hadFocusOnExit: boolean;

A
Amy Qiu 已提交
381 382 383 384 385 386
	/**
	 * 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;

387 388 389
	/**
	 * The shell launch config used to launch the shell.
	 */
D
Daniel Imms 已提交
390
	readonly shellLaunchConfig: IShellLaunchConfig;
391

392 393 394 395 396 397 398
	/**
	 * 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 已提交
399 400 401 402 403 404
	/**
	 * An object that tracks when commands are run and enables navigating and selecting between
	 * them.
	 */
	readonly commandTracker: ITerminalCommandTracker;

405 406 407 408 409
	/**
	 * The cwd that the terminal instance was initialized with.
	 */
	readonly initialCwd: string;

D
jsdoc  
Daniel Imms 已提交
410 411
	/**
	 * Dispose the terminal instance, removing it from the panel/service and freeing up resources.
412
	 *
413 414 415 416
	 * @param immediate Whether the kill should be immediate or not. Immediate should only be used
	 * when VS Code is shutting down or in cases where the terminal dispose was user initiated.
	 * The immediate===false exists to cover an edge case where the final output of the terminal can
	 * get cut off. If immediate kill any terminal processes immediately.
D
jsdoc  
Daniel Imms 已提交
417
	 */
418
	dispose(immediate?: boolean): void;
D
jsdoc  
Daniel Imms 已提交
419

420 421 422 423 424 425 426
	/**
	 * 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).
427 428
	 * @param validationCallback A callback which can be used to validate the link after it has been
	 * added to the DOM.
429 430
	 * @return The ID of the new matcher, this can be used to deregister.
	 */
D
Daniel Imms 已提交
431
	registerLinkMatcher(regex: RegExp, handler: (url: string) => void, matchIndex?: number, validationCallback?: (uri: string, callback: (isValid: boolean) => void) => void): number;
432 433 434 435 436 437 438 439

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

440 441 442 443 444
	/**
	 * Check if anything is selected in terminal.
	 */
	hasSelection(): boolean;

D
jsdoc  
Daniel Imms 已提交
445 446 447
	/**
	 * Copies the terminal selection to the clipboard.
	 */
448
	copySelection(): void;
D
jsdoc  
Daniel Imms 已提交
449

450 451 452 453 454
	/**
	 * Current selection in the terminal.
	 */
	readonly selection: string | undefined;

455 456 457 458 459
	/**
	 * Clear current selection.
	 */
	clearSelection(): void;

460 461 462 463 464
	/**
	 * Select all text in the terminal.
	 */
	selectAll(): void;

R
rebornix 已提交
465 466 467
	/**
	 * Find the next instance of the term
	*/
468
	findNext(term: string, searchOptions: ISearchOptions): boolean;
R
rebornix 已提交
469 470 471 472

	/**
	 * Find the previous instance of the term
	 */
473
	findPrevious(term: string, searchOptions: ISearchOptions): boolean;
R
rebornix 已提交
474

475 476 477 478 479
	/**
	 * Notifies the terminal that the find widget's focus state has been changed.
	 */
	notifyFindWidgetFocusChanged(isFocused: boolean): void;

D
jsdoc  
Daniel Imms 已提交
480
	/**
481
	 * Focuses the terminal instance if it's able to (xterm.js instance exists).
D
jsdoc  
Daniel Imms 已提交
482 483 484
	 *
	 * @param focus Force focus even if there is a selection.
	 */
D
Daniel Imms 已提交
485
	focus(force?: boolean): void;
D
jsdoc  
Daniel Imms 已提交
486

487 488 489 490 491 492 493 494
	/**
	 * Focuses the terminal instance when it's ready (the xterm.js instance is created). Use this
	 * when the terminal is being shown.
	 *
	 * @param focus Force focus even if there is a selection.
	 */
	focusWhenReady(force?: boolean): Promise<void>;

D
jsdoc  
Daniel Imms 已提交
495 496 497
	/**
	 * Focuses and pastes the contents of the clipboard into the terminal instance.
	 */
498
	paste(): void;
D
jsdoc  
Daniel Imms 已提交
499 500 501 502 503 504 505 506 507 508

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

511 512 513 514 515 516 517 518 519
	/**
	 * Takes a path and returns the properly escaped path to send to the terminal.
	 * On Windows, this included trying to prepare the path for WSL if needed.
	 *
	 * @param path The path to be escaped and formatted.
	 * @returns An escaped version of the path to be execuded in the terminal.
	 */
	preparePathForTerminalAsync(path: string): Promise<string>;

520 521 522 523 524 525
	/**
	 * Write text directly to the terminal, skipping the process if it exists.
	 * @param text The text to write.
	 */
	write(text: string): void;

526 527 528 529
	/** Scroll the terminal buffer down 1 line. */
	scrollDownLine(): void;
	/** Scroll the terminal buffer down 1 page. */
	scrollDownPage(): void;
530 531
	/** Scroll the terminal buffer to the bottom. */
	scrollToBottom(): void;
532 533 534 535
	/** Scroll the terminal buffer up 1 line. */
	scrollUpLine(): void;
	/** Scroll the terminal buffer up 1 page. */
	scrollUpPage(): void;
536 537
	/** Scroll the terminal buffer to the top. */
	scrollToTop(): void;
D
Daniel Imms 已提交
538

D
Daniel Imms 已提交
539 540 541 542 543
	/**
	 * Clears the terminal buffer, leaving only the prompt line.
	 */
	clear(): void;

D
jsdoc  
Daniel Imms 已提交
544 545 546 547 548 549
	/**
	 * 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 已提交
550
	attachToElement(container: HTMLElement): void;
D
jsdoc  
Daniel Imms 已提交
551 552

	/**
553
	 * Updates the configuration of the terminal instance.
D
jsdoc  
Daniel Imms 已提交
554
	 */
555
	updateConfig(): void;
D
Daniel Imms 已提交
556

557 558 559 560 561 562
	/**
	 * Updates the accessibility support state of the terminal instance.
	 * @param isEnabled Whether it's enabled.
	 */
	updateAccessibilitySupport(isEnabled: boolean): void;

D
jsdoc  
Daniel Imms 已提交
563 564 565 566 567
	/**
	 * Configure the dimensions of the terminal instance.
	 *
	 * @param dimension The dimensions of the container.
	 */
568
	layout(dimension: { width: number, height: number }): void;
D
jsdoc  
Daniel Imms 已提交
569 570 571 572 573 574

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

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

B
Ben Stein 已提交
584 585 586
	/**
	 * Sets the title of the terminal instance.
	 */
A
Amy Qiu 已提交
587
	setTitle(title: string, eventFromProcess: boolean): void;
588

589 590
	waitForTitle(): Promise<string>;

D
Daniel Imms 已提交
591 592
	setDimensions(dimensions: ITerminalDimensions): void;

593
	addDisposable(disposable: IDisposable): void;
594 595

	toggleEscapeSequenceLogging(): void;
596 597

	getCwd(): Promise<string>;
D
Daniel Imms 已提交
598
}
D
Daniel Imms 已提交
599 600

export interface ITerminalCommandTracker {
601 602
	scrollToPreviousCommand(): void;
	scrollToNextCommand(): void;
D
Daniel Imms 已提交
603 604
	selectToPreviousCommand(): void;
	selectToNextCommand(): void;
605 606
	selectToPreviousLine(): void;
	selectToNextLine(): void;
607
}
D
Daniel Imms 已提交
608 609

export interface ITerminalProcessManager extends IDisposable {
610
	readonly processState: ProcessState;
611
	readonly ptyProcessReady: Promise<void>;
D
Daniel Imms 已提交
612 613 614 615 616 617 618
	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 已提交
619

D
Daniel Imms 已提交
620
	addDisposable(disposable: IDisposable);
621
	dispose(immediate?: boolean);
D
Daniel Imms 已提交
622
	createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number);
D
Daniel Imms 已提交
623
	write(data: string): void;
D
Daniel Imms 已提交
624
	setDimensions(cols: number, rows: number): void;
625 626
}

627
export const enum ProcessState {
628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644
	// 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
}
645 646


647
export interface ITerminalProcessExtHostProxy extends IDisposable {
648 649
	readonly terminalId: number;

650 651 652
	emitData(data: string): void;
	emitTitle(title: string): void;
	emitPid(pid: number): void;
D
Daniel Imms 已提交
653
	emitExit(exitCode: number): void;
654

D
Daniel Imms 已提交
655 656
	onInput: Event<string>;
	onResize: Event<{ cols: number, rows: number }>;
657
	onShutdown: Event<boolean>;
658
}
659 660 661 662 663 664 665

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