diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 3915f6d258c00639d8824d19c99238e2081eac13..fafb52086c5e4b31bd7c36674104a67ae041de0a 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -5,6 +5,7 @@ import { Terminal as XTermTerminal } from 'xterm'; import { WebLinksAddon as XTermWebLinksAddon } from 'xterm-addon-web-links'; +import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; import { ITerminalInstance, IWindowsShellHelper, ITerminalConfigHelper, ITerminalChildProcess, IShellLaunchConfig } from 'vs/workbench/contrib/terminal/common/terminal'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IProcessEnvironment, Platform } from 'vs/base/common/platform'; @@ -16,6 +17,7 @@ export interface ITerminalInstanceService { getXtermConstructor(): Promise; getXtermWebLinksConstructor(): Promise; + getXtermSearchConstructor(): Promise; createWindowsShellHelper(shellProcessId: number, instance: ITerminalInstance, xterm: XTermTerminal): IWindowsShellHelper; createTerminalProcess(shellLaunchConfig: IShellLaunchConfig, cwd: string, cols: number, rows: number, env: IProcessEnvironment, windowsEnableConpty: boolean): ITerminalChildProcess; getDefaultShell(p: Platform): string; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index ff16d22e2e6f833b8f93840f4fc00f84bcf4560b..e32b5529ccebd908f721ec50e34e5bfb9b5760d3 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -32,11 +32,11 @@ import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/term import { TerminalLinkHandler } from 'vs/workbench/contrib/terminal/browser/terminalLinkHandler'; import { TerminalCommandTracker } from 'vs/workbench/contrib/terminal/browser/terminalCommandTracker'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; -import { Terminal as XTermTerminal, IBuffer } from 'xterm'; import { IAccessibilityService, AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility'; import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { SearchAddon, ISearchOptions } from 'xterm-addon-search'; import { TerminalProcessManager } from 'vs/workbench/contrib/terminal/browser/terminalProcessManager'; +import { Terminal as XTermTerminal, IBuffer } from 'xterm'; +import { SearchAddon, ISearchOptions } from 'xterm-addon-search'; // How long in milliseconds should an average frame take to render for a notification to appear // which suggests the fallback DOM-based renderer @@ -169,7 +169,7 @@ export class TerminalInstance implements ITerminalInstance { private _title: string; private _wrapperElement: HTMLDivElement; private _xterm: XTermTerminal; - private _xtermSearch: SearchAddon; + private _xtermSearch: SearchAddon | undefined; private _xtermElement: HTMLDivElement; private _terminalHasTextContextKey: IContextKey; private _cols: number; @@ -435,8 +435,10 @@ export class TerminalInstance implements ITerminalInstance { // TODO: Guess whether to use canvas or dom better rendererType: config.rendererType === 'auto' ? 'canvas' : config.rendererType }); - this._xtermSearch = new SearchAddon(); - this._xterm.loadAddon(this._xtermSearch); + this._terminalInstanceService.getXtermSearchConstructor().then(Addon => { + this._xtermSearch = new Addon(); + this._xterm.loadAddon(this._xtermSearch); + }); if (this._shellLaunchConfig.initialText) { this._xterm.writeln(this._shellLaunchConfig.initialText); } @@ -720,10 +722,16 @@ export class TerminalInstance implements ITerminalInstance { } public findNext(term: string, searchOptions: ISearchOptions): boolean { + if (!this._xtermSearch) { + return false; + } return this._xtermSearch.findNext(term, searchOptions); } public findPrevious(term: string, searchOptions: ISearchOptions): boolean { + if (!this._xtermSearch) { + return false; + } return this._xtermSearch.findPrevious(term, searchOptions); } diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts index 7abe8980002e4a161388676ed9b6ff2bd2f1eda8..0fcb7cf8a8420adc2b5304c8543a23acab2598c7 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts @@ -4,17 +4,19 @@ *--------------------------------------------------------------------------------------------*/ import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { Terminal as XTermTerminal } from 'xterm'; -import { WebLinksAddon as XTermWebLinksAddon } from 'xterm-addon-web-links'; import { ITerminalInstance, IWindowsShellHelper, IShellLaunchConfig, ITerminalChildProcess } from 'vs/workbench/contrib/terminal/common/terminal'; import { WindowsShellHelper } from 'vs/workbench/contrib/terminal/node/windowsShellHelper'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IProcessEnvironment, Platform } from 'vs/base/common/platform'; import { TerminalProcess } from 'vs/workbench/contrib/terminal/node/terminalProcess'; import { getDefaultShell } from 'vs/workbench/contrib/terminal/node/terminal'; +import { Terminal as XTermTerminal } from 'xterm'; +import { WebLinksAddon as XTermWebLinksAddon } from 'xterm-addon-web-links'; +import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; let Terminal: typeof XTermTerminal; let WebLinksAddon: typeof XTermWebLinksAddon; +let SearchAddon: typeof XTermSearchAddon; /** * A service used by TerminalInstance (and components owned by it) that allows it to break its @@ -43,6 +45,13 @@ export class TerminalInstanceService implements ITerminalInstanceService { return WebLinksAddon; } + public async getXtermSearchConstructor(): Promise { + if (!SearchAddon) { + SearchAddon = (await import('xterm-addon-search')).SearchAddon; + } + return SearchAddon; + } + public createWindowsShellHelper(shellProcessId: number, instance: ITerminalInstance, xterm: XTermTerminal): IWindowsShellHelper { return new WindowsShellHelper(shellProcessId, instance, xterm); }