diff --git a/src/vs/platform/terminal/common/autoOpenBarrier.ts b/src/vs/platform/terminal/common/autoOpenBarrier.ts new file mode 100644 index 00000000000..59577f8e2a4 --- /dev/null +++ b/src/vs/platform/terminal/common/autoOpenBarrier.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 { Barrier } from 'vs/base/common/async'; + +export class AutoOpenBarrier extends Barrier { + + private readonly _timeout: any; + + constructor(autoOpenTimeMs: number) { + super(); + this._timeout = setTimeout(() => this.open(), autoOpenTimeMs); + } + + open(): void { + clearTimeout(this._timeout); + super.open(); + } +} diff --git a/src/vs/workbench/contrib/terminal/common/environmentVariable.ts b/src/vs/platform/terminal/common/environmentVariable.ts similarity index 100% rename from src/vs/workbench/contrib/terminal/common/environmentVariable.ts rename to src/vs/platform/terminal/common/environmentVariable.ts diff --git a/src/vs/platform/terminal/common/terminal.ts b/src/vs/platform/terminal/common/terminal.ts index 5f5b8ea0fdb..6bc0d332757 100644 --- a/src/vs/platform/terminal/common/terminal.ts +++ b/src/vs/platform/terminal/common/terminal.ts @@ -3,9 +3,566 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as nls from 'vs/nls'; import { Event } from 'vs/base/common/event'; -import { IProcessEnvironment } from 'vs/base/common/platform'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { URI } from 'vs/base/common/uri'; +import { IProcessEnvironment, OperatingSystem } from 'vs/base/common/platform'; +import { IEnvironmentVariableInfo } from 'vs/platform/terminal/common/environmentVariable'; + +export const TERMINAL_VIEW_ID = 'terminal'; + +/** A context key that is set when there is at least one opened integrated terminal. */ +export const KEYBINDING_CONTEXT_TERMINAL_IS_OPEN = new RawContextKey('terminalIsOpen', false); + +/** A context key that is set when the integrated terminal has focus. */ +export const KEYBINDING_CONTEXT_TERMINAL_FOCUS = new RawContextKey('terminalFocus', false); + +export const KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY = 'terminalShellType'; +/** A context key that is set to the detected shell for the most recently active terminal, this is set to the last known value when no terminals exist. */ +export const KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE = new RawContextKey(KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, undefined); + +export const KEYBINDING_CONTEXT_TERMINAL_ALT_BUFFER_ACTIVE = new RawContextKey('terminalAltBufferActive', false); + +/** A context key that is set when the integrated terminal does not have focus. */ +export const KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED = KEYBINDING_CONTEXT_TERMINAL_FOCUS.toNegated(); + +/** A context key that is set when the user is navigating the accessibility tree */ +export const KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS = new RawContextKey('terminalA11yTreeFocus', false); + +/** A keybinding context key that is set when the integrated terminal has text selected. */ +export const KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED = new RawContextKey('terminalTextSelected', false); +/** A keybinding context key that is set when the integrated terminal does not have text selected. */ +export const KEYBINDING_CONTEXT_TERMINAL_TEXT_NOT_SELECTED = KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED.toNegated(); + +/** A context key that is set when the find widget in integrated terminal is visible. */ +export const KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE = new RawContextKey('terminalFindVisible', false); +/** A context key that is set when the find widget in integrated terminal is not visible. */ +export const KEYBINDING_CONTEXT_TERMINAL_FIND_NOT_VISIBLE = KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE.toNegated(); +/** A context key that is set when the find widget find input in integrated terminal is focused. */ +export const KEYBINDING_CONTEXT_TERMINAL_FIND_INPUT_FOCUSED = new RawContextKey('terminalFindInputFocused', false); +/** A context key that is set when the find widget in integrated terminal is focused. */ +export const KEYBINDING_CONTEXT_TERMINAL_FIND_FOCUSED = new RawContextKey('terminalFindFocused', 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_INPUT_NOT_FOCUSED = KEYBINDING_CONTEXT_TERMINAL_FIND_INPUT_FOCUSED.toNegated(); + +export const KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED = new RawContextKey('terminalProcessSupported', false); + +export const IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY = 'terminal.integrated.isWorkspaceShellAllowed'; +export const NEVER_MEASURE_RENDER_TIME_STORAGE_KEY = 'terminal.integrated.neverMeasureRenderTime'; + +export const TERMINAL_CREATION_COMMANDS = ['workbench.action.terminal.toggleTerminal', 'workbench.action.terminal.new', 'workbench.action.togglePanel', 'workbench.action.terminal.focus']; + +export const TerminalCursorStyle = { + BLOCK: 'block', + LINE: 'line', + UNDERLINE: 'underline' +}; + +export const TERMINAL_CONFIG_SECTION = 'terminal.integrated'; + +export const TERMINAL_ACTION_CATEGORY = nls.localize('terminalCategory', "Terminal"); + +export const DEFAULT_LETTER_SPACING = 0; +export const MINIMUM_LETTER_SPACING = -5; +export const DEFAULT_LINE_HEIGHT = 1; + +export const MINIMUM_FONT_WEIGHT = 1; +export const MAXIMUM_FONT_WEIGHT = 1000; +export const DEFAULT_FONT_WEIGHT = 'normal'; +export const DEFAULT_BOLD_FONT_WEIGHT = 'bold'; +export const SUGGESTIONS_FONT_WEIGHT = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900']; + +export type FontWeight = 'normal' | 'bold' | number; + +export interface ITerminalConfiguration { + shell: { + linux: string | null; + osx: string | null; + windows: string | null; + }; + automationShell: { + linux: string | null; + osx: string | null; + windows: string | null; + }; + shellArgs: { + linux: string[]; + osx: string[]; + windows: string[]; + }; + altClickMovesCursor: boolean; + macOptionIsMeta: boolean; + macOptionClickForcesSelection: boolean; + rendererType: 'auto' | 'canvas' | 'dom' | 'experimentalWebgl'; + rightClickBehavior: 'default' | 'copyPaste' | 'paste' | 'selectWord'; + cursorBlinking: boolean; + cursorStyle: string; + cursorWidth: number; + drawBoldTextInBrightColors: boolean; + fastScrollSensitivity: number; + fontFamily: string; + fontWeight: FontWeight; + fontWeightBold: FontWeight; + minimumContrastRatio: number; + mouseWheelScrollSensitivity: number; + sendKeybindingsToShell: boolean; + // fontLigatures: boolean; + fontSize: number; + letterSpacing: number; + lineHeight: number; + detectLocale: 'auto' | 'off' | 'on'; + scrollback: number; + commandsToSkipShell: string[]; + allowChords: boolean; + allowMnemonics: boolean; + cwd: string; + confirmOnExit: boolean; + enableBell: boolean; + inheritEnv: boolean; + env: { + linux: { [key: string]: string }; + osx: { [key: string]: string }; + windows: { [key: string]: string }; + }; + environmentChangesIndicator: 'off' | 'on' | 'warnonly'; + showExitAlert: boolean; + splitCwd: 'workspaceRoot' | 'initial' | 'inherited'; + windowsEnableConpty: boolean; + wordSeparators: string; + experimentalUseTitleEvent: boolean; + enableFileLinks: boolean; + unicodeVersion: '6' | '11'; + experimentalLinkProvider: boolean; + localEchoLatencyThreshold: number; + localEchoExcludePrograms: ReadonlyArray; + localEchoStyle: 'bold' | 'dim' | 'italic' | 'underlined' | 'inverted' | string; + serverSpawn: boolean; + mainSpawn: boolean; + enablePersistentSessions: boolean; + flowControl: boolean; +} + +export const DEFAULT_LOCAL_ECHO_EXCLUDE: ReadonlyArray = ['vim', 'vi', 'nano', 'tmux']; + +export interface ITerminalConfigHelper { + config: ITerminalConfiguration; + + onWorkspacePermissionsChanged: Event; + + configFontIsMonospace(): boolean; + getFont(): ITerminalFont; + /** Sets whether a workspace shell configuration is allowed or not */ + setWorkspaceShellAllowed(isAllowed: boolean): void; + checkWorkspaceShellPermissions(osOverride?: OperatingSystem): boolean; + showRecommendations(shellLaunchConfig: IShellLaunchConfig): void; +} + +export interface ITerminalFont { + fontFamily: string; + fontSize: number; + letterSpacing: number; + lineHeight: number; + charWidth?: number; + charHeight?: number; +} + +export interface IRemoteTerminalAttachTarget { + id: number; + pid: number; + title: string; + cwd: string; + workspaceId: string; + workspaceName: string; + isOrphan: boolean; +} + +export interface IRawTerminalInstanceLayoutInfo { + relativeSize: number; + terminal: T; +} + +export type ITerminalInstanceLayoutInfoById = IRawTerminalInstanceLayoutInfo; +export type ITerminalInstanceLayoutInfo = IRawTerminalInstanceLayoutInfo; + +export interface IRawTerminalTabLayoutInfo { + isActive: boolean; + activeTerminalProcessId: number; + terminals: IRawTerminalInstanceLayoutInfo[]; +} + +export type ITerminalTabLayoutInfoById = IRawTerminalTabLayoutInfo; +export type ITerminalTabLayoutInfo = IRawTerminalTabLayoutInfo; + +export interface IRawTerminalsLayoutInfo { + tabs: IRawTerminalTabLayoutInfo[]; +} + +export type ITerminalsLayoutInfo = IRawTerminalsLayoutInfo; +export type ITerminalsLayoutInfoById = IRawTerminalsLayoutInfo; + +/** + * Provides access to native Windows calls that can be injected into non-native layers. + */ +export interface ITerminalNativeWindowsDelegate { + /** + * Gets the Windows build number, eg. this would be `19041` for Windows 10 version 2004 + */ + getWindowsBuildNumber(): number; + /** + * Converts a regular Windows path into the WSL path equivalent, eg. `C:\` -> `/mnt/c` + * @param path The Windows path. + */ + getWslPath(path: string): Promise; +} + +export interface IShellDefinition { + label: string; + path: string; +} + +export interface ICommandTracker { + scrollToPreviousCommand(): void; + scrollToNextCommand(): void; + selectToPreviousCommand(): void; + selectToNextCommand(): void; + selectToPreviousLine(): void; + selectToNextLine(): void; +} + +export interface INavigationMode { + exitNavigationMode(): void; + focusPreviousLine(): void; + focusNextLine(): void; +} + +export interface IBeforeProcessDataEvent { + /** + * The data of the event, this can be modified by the event listener to change what gets sent + * to the terminal. + */ + data: string; +} + +export interface ITerminalProcessManager extends IDisposable { + readonly processState: ProcessState; + readonly ptyProcessReady: Promise; + readonly shellProcessId: number | undefined; + readonly remoteAuthority: string | undefined; + readonly os: OperatingSystem | undefined; + readonly userHome: string | undefined; + readonly environmentVariableInfo: IEnvironmentVariableInfo | undefined; + readonly remoteTerminalId: number | undefined; + /** Whether the process has had data written to it yet. */ + readonly hasWrittenData: boolean; + + readonly onProcessReady: Event; + readonly onBeforeProcessData: Event; + readonly onProcessData: Event; + readonly onProcessTitle: Event; + readonly onProcessExit: Event; + readonly onProcessOverrideDimensions: Event; + readonly onProcessResolvedShellLaunchConfig: Event; + readonly onEnvironmentVariableInfoChanged: Event; + + dispose(immediate?: boolean): void; + createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number, isScreenReaderModeEnabled: boolean): Promise; + write(data: string): void; + setDimensions(cols: number, rows: number): void; + acknowledgeDataEvent(charCount: number): void; + + getInitialCwd(): Promise; + getCwd(): Promise; + getLatency(): Promise; +} + +export const 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 +} + +export interface ITerminalProcessExtHostProxy extends IDisposable { + readonly terminalId: number; + + emitData(data: string): void; + emitTitle(title: string): void; + emitReady(pid: number, cwd: string): void; + emitExit(exitCode: number | undefined): void; + emitOverrideDimensions(dimensions: ITerminalDimensions | undefined): void; + emitResolvedShellLaunchConfig(shellLaunchConfig: IShellLaunchConfig): void; + emitInitialCwd(initialCwd: string): void; + emitCwd(cwd: string): void; + emitLatency(latency: number): void; + + onInput: Event; + onResize: Event<{ cols: number, rows: number }>; + onAcknowledgeDataEvent: Event; + onShutdown: Event; + onRequestInitialCwd: Event; + onRequestCwd: Event; + onRequestLatency: Event; +} + +export interface ISpawnExtHostProcessRequest { + proxy: ITerminalProcessExtHostProxy; + shellLaunchConfig: IShellLaunchConfig; + activeWorkspaceRootUri: URI | undefined; + cols: number; + rows: number; + isWorkspaceShellAllowed: boolean; + callback: (error: ITerminalLaunchError | undefined) => void; +} + +export interface IStartExtensionTerminalRequest { + proxy: ITerminalProcessExtHostProxy; + cols: number; + rows: number; + callback: (error: ITerminalLaunchError | undefined) => void; +} + +export interface IAvailableShellsRequest { + callback: (shells: IShellDefinition[]) => void; +} + +export interface IDefaultShellAndArgsRequest { + useAutomationShell: boolean; + callback: (shell: string, args: string[] | string | undefined) => void; +} + +export enum LinuxDistro { + Fedora, + Ubuntu, + Unknown +} + +export enum TitleEventSource { + /** From the API or the rename command that overrides any other type */ + Api, + /** From the process name property*/ + Process, + /** From the VT sequence */ + Sequence +} + +export interface IWindowsShellHelper extends IDisposable { + readonly onShellNameChange: Event; + + getShellName(): Promise; +} + +export const enum TERMINAL_COMMAND_ID { + FIND_NEXT = 'workbench.action.terminal.findNext', + FIND_PREVIOUS = 'workbench.action.terminal.findPrevious', + TOGGLE = 'workbench.action.terminal.toggleTerminal', + KILL = 'workbench.action.terminal.kill', + QUICK_KILL = 'workbench.action.terminal.quickKill', + CONFIGURE_TERMINAL_SETTINGS = 'workbench.action.terminal.openSettings', + COPY_SELECTION = 'workbench.action.terminal.copySelection', + SELECT_ALL = 'workbench.action.terminal.selectAll', + DELETE_WORD_LEFT = 'workbench.action.terminal.deleteWordLeft', + DELETE_WORD_RIGHT = 'workbench.action.terminal.deleteWordRight', + DELETE_TO_LINE_START = 'workbench.action.terminal.deleteToLineStart', + MOVE_TO_LINE_START = 'workbench.action.terminal.moveToLineStart', + MOVE_TO_LINE_END = 'workbench.action.terminal.moveToLineEnd', + NEW = 'workbench.action.terminal.new', + NEW_WITH_CWD = 'workbench.action.terminal.newWithCwd', + NEW_LOCAL = 'workbench.action.terminal.newLocal', + NEW_IN_ACTIVE_WORKSPACE = 'workbench.action.terminal.newInActiveWorkspace', + SPLIT = 'workbench.action.terminal.split', + SPLIT_IN_ACTIVE_WORKSPACE = 'workbench.action.terminal.splitInActiveWorkspace', + RELAUNCH = 'workbench.action.terminal.relaunch', + FOCUS_PREVIOUS_PANE = 'workbench.action.terminal.focusPreviousPane', + FOCUS_NEXT_PANE = 'workbench.action.terminal.focusNextPane', + RESIZE_PANE_LEFT = 'workbench.action.terminal.resizePaneLeft', + RESIZE_PANE_RIGHT = 'workbench.action.terminal.resizePaneRight', + RESIZE_PANE_UP = 'workbench.action.terminal.resizePaneUp', + RESIZE_PANE_DOWN = 'workbench.action.terminal.resizePaneDown', + FOCUS = 'workbench.action.terminal.focus', + FOCUS_NEXT = 'workbench.action.terminal.focusNext', + FOCUS_PREVIOUS = 'workbench.action.terminal.focusPrevious', + PASTE = 'workbench.action.terminal.paste', + SELECT_DEFAULT_SHELL = 'workbench.action.terminal.selectDefaultShell', + RUN_SELECTED_TEXT = 'workbench.action.terminal.runSelectedText', + RUN_ACTIVE_FILE = 'workbench.action.terminal.runActiveFile', + SWITCH_TERMINAL = 'workbench.action.terminal.switchTerminal', + SCROLL_DOWN_LINE = 'workbench.action.terminal.scrollDown', + SCROLL_DOWN_PAGE = 'workbench.action.terminal.scrollDownPage', + SCROLL_TO_BOTTOM = 'workbench.action.terminal.scrollToBottom', + SCROLL_UP_LINE = 'workbench.action.terminal.scrollUp', + SCROLL_UP_PAGE = 'workbench.action.terminal.scrollUpPage', + SCROLL_TO_TOP = 'workbench.action.terminal.scrollToTop', + CLEAR = 'workbench.action.terminal.clear', + CLEAR_SELECTION = 'workbench.action.terminal.clearSelection', + MANAGE_WORKSPACE_SHELL_PERMISSIONS = 'workbench.action.terminal.manageWorkspaceShellPermissions', + RENAME = 'workbench.action.terminal.rename', + RENAME_WITH_ARG = 'workbench.action.terminal.renameWithArg', + FIND_FOCUS = 'workbench.action.terminal.focusFind', + FIND_HIDE = 'workbench.action.terminal.hideFind', + QUICK_OPEN_TERM = 'workbench.action.quickOpenTerm', + SCROLL_TO_PREVIOUS_COMMAND = 'workbench.action.terminal.scrollToPreviousCommand', + SCROLL_TO_NEXT_COMMAND = 'workbench.action.terminal.scrollToNextCommand', + SELECT_TO_PREVIOUS_COMMAND = 'workbench.action.terminal.selectToPreviousCommand', + SELECT_TO_NEXT_COMMAND = 'workbench.action.terminal.selectToNextCommand', + SELECT_TO_PREVIOUS_LINE = 'workbench.action.terminal.selectToPreviousLine', + SELECT_TO_NEXT_LINE = 'workbench.action.terminal.selectToNextLine', + TOGGLE_ESCAPE_SEQUENCE_LOGGING = 'toggleEscapeSequenceLogging', + SEND_SEQUENCE = 'workbench.action.terminal.sendSequence', + TOGGLE_FIND_REGEX = 'workbench.action.terminal.toggleFindRegex', + TOGGLE_FIND_WHOLE_WORD = 'workbench.action.terminal.toggleFindWholeWord', + TOGGLE_FIND_CASE_SENSITIVE = 'workbench.action.terminal.toggleFindCaseSensitive', + NAVIGATION_MODE_EXIT = 'workbench.action.terminal.navigationModeExit', + NAVIGATION_MODE_FOCUS_NEXT = 'workbench.action.terminal.navigationModeFocusNext', + NAVIGATION_MODE_FOCUS_PREVIOUS = 'workbench.action.terminal.navigationModeFocusPrevious', + SHOW_ENVIRONMENT_INFORMATION = 'workbench.action.terminal.showEnvironmentInformation', + SEARCH_WORKSPACE = 'workbench.action.terminal.searchWorkspace', + ATTACH_TO_REMOTE_TERMINAL = 'workbench.action.terminal.attachToSession' +} + +export const DEFAULT_COMMANDS_TO_SKIP_SHELL: string[] = [ + TERMINAL_COMMAND_ID.CLEAR_SELECTION, + TERMINAL_COMMAND_ID.CLEAR, + TERMINAL_COMMAND_ID.COPY_SELECTION, + TERMINAL_COMMAND_ID.DELETE_TO_LINE_START, + TERMINAL_COMMAND_ID.DELETE_WORD_LEFT, + TERMINAL_COMMAND_ID.DELETE_WORD_RIGHT, + TERMINAL_COMMAND_ID.FIND_FOCUS, + TERMINAL_COMMAND_ID.FIND_HIDE, + TERMINAL_COMMAND_ID.FIND_NEXT, + TERMINAL_COMMAND_ID.FIND_PREVIOUS, + TERMINAL_COMMAND_ID.TOGGLE_FIND_REGEX, + TERMINAL_COMMAND_ID.TOGGLE_FIND_WHOLE_WORD, + TERMINAL_COMMAND_ID.TOGGLE_FIND_CASE_SENSITIVE, + TERMINAL_COMMAND_ID.FOCUS_NEXT_PANE, + TERMINAL_COMMAND_ID.FOCUS_NEXT, + TERMINAL_COMMAND_ID.FOCUS_PREVIOUS_PANE, + TERMINAL_COMMAND_ID.FOCUS_PREVIOUS, + TERMINAL_COMMAND_ID.FOCUS, + TERMINAL_COMMAND_ID.KILL, + TERMINAL_COMMAND_ID.MOVE_TO_LINE_END, + TERMINAL_COMMAND_ID.MOVE_TO_LINE_START, + TERMINAL_COMMAND_ID.NEW_IN_ACTIVE_WORKSPACE, + TERMINAL_COMMAND_ID.NEW, + TERMINAL_COMMAND_ID.PASTE, + TERMINAL_COMMAND_ID.RESIZE_PANE_DOWN, + TERMINAL_COMMAND_ID.RESIZE_PANE_LEFT, + TERMINAL_COMMAND_ID.RESIZE_PANE_RIGHT, + TERMINAL_COMMAND_ID.RESIZE_PANE_UP, + TERMINAL_COMMAND_ID.RUN_ACTIVE_FILE, + TERMINAL_COMMAND_ID.RUN_SELECTED_TEXT, + TERMINAL_COMMAND_ID.SCROLL_DOWN_LINE, + TERMINAL_COMMAND_ID.SCROLL_DOWN_PAGE, + TERMINAL_COMMAND_ID.SCROLL_TO_BOTTOM, + TERMINAL_COMMAND_ID.SCROLL_TO_NEXT_COMMAND, + TERMINAL_COMMAND_ID.SCROLL_TO_PREVIOUS_COMMAND, + TERMINAL_COMMAND_ID.SCROLL_TO_TOP, + TERMINAL_COMMAND_ID.SCROLL_UP_LINE, + TERMINAL_COMMAND_ID.SCROLL_UP_PAGE, + TERMINAL_COMMAND_ID.SEND_SEQUENCE, + TERMINAL_COMMAND_ID.SELECT_ALL, + TERMINAL_COMMAND_ID.SELECT_TO_NEXT_COMMAND, + TERMINAL_COMMAND_ID.SELECT_TO_NEXT_LINE, + TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_COMMAND, + TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_LINE, + TERMINAL_COMMAND_ID.SPLIT_IN_ACTIVE_WORKSPACE, + TERMINAL_COMMAND_ID.SPLIT, + TERMINAL_COMMAND_ID.TOGGLE, + TERMINAL_COMMAND_ID.NAVIGATION_MODE_EXIT, + TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_NEXT, + TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_PREVIOUS, + 'editor.action.toggleTabFocusMode', + 'workbench.action.quickOpen', + 'workbench.action.quickOpenPreviousEditor', + 'workbench.action.showCommands', + 'workbench.action.tasks.build', + 'workbench.action.tasks.restartTask', + 'workbench.action.tasks.runTask', + 'workbench.action.tasks.reRunTask', + 'workbench.action.tasks.showLog', + 'workbench.action.tasks.showTasks', + 'workbench.action.tasks.terminate', + 'workbench.action.tasks.test', + 'workbench.action.toggleFullScreen', + 'workbench.action.terminal.focusAtIndex1', + 'workbench.action.terminal.focusAtIndex2', + 'workbench.action.terminal.focusAtIndex3', + 'workbench.action.terminal.focusAtIndex4', + 'workbench.action.terminal.focusAtIndex5', + 'workbench.action.terminal.focusAtIndex6', + 'workbench.action.terminal.focusAtIndex7', + 'workbench.action.terminal.focusAtIndex8', + 'workbench.action.terminal.focusAtIndex9', + 'workbench.action.focusSecondEditorGroup', + 'workbench.action.focusThirdEditorGroup', + 'workbench.action.focusFourthEditorGroup', + 'workbench.action.focusFifthEditorGroup', + 'workbench.action.focusSixthEditorGroup', + 'workbench.action.focusSeventhEditorGroup', + 'workbench.action.focusEighthEditorGroup', + 'workbench.action.focusNextPart', + 'workbench.action.focusPreviousPart', + 'workbench.action.nextPanelView', + 'workbench.action.previousPanelView', + 'workbench.action.nextSideBarView', + 'workbench.action.previousSideBarView', + 'workbench.action.debug.start', + 'workbench.action.debug.stop', + 'workbench.action.debug.run', + 'workbench.action.debug.restart', + 'workbench.action.debug.continue', + 'workbench.action.debug.pause', + 'workbench.action.debug.stepInto', + 'workbench.action.debug.stepOut', + 'workbench.action.debug.stepOver', + 'workbench.action.nextEditor', + 'workbench.action.previousEditor', + 'workbench.action.nextEditorInGroup', + 'workbench.action.previousEditorInGroup', + 'workbench.action.openNextRecentlyUsedEditor', + 'workbench.action.openPreviousRecentlyUsedEditor', + 'workbench.action.openNextRecentlyUsedEditorInGroup', + 'workbench.action.openPreviousRecentlyUsedEditorInGroup', + 'workbench.action.quickOpenPreviousRecentlyUsedEditor', + 'workbench.action.quickOpenLeastRecentlyUsedEditor', + 'workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup', + 'workbench.action.quickOpenLeastRecentlyUsedEditorInGroup', + 'workbench.action.focusActiveEditorGroup', + 'workbench.action.focusFirstEditorGroup', + 'workbench.action.focusLastEditorGroup', + 'workbench.action.firstEditorInGroup', + 'workbench.action.lastEditorInGroup', + 'workbench.action.navigateUp', + 'workbench.action.navigateDown', + 'workbench.action.navigateRight', + 'workbench.action.navigateLeft', + 'workbench.action.togglePanel', + 'workbench.action.quickOpenView', + 'workbench.action.toggleMaximizedPanel' +]; + +export interface ITerminalContributions { + types?: ITerminalTypeContribution[]; +} + +export interface ITerminalTypeContribution { + title: string; + command: string; +} + export interface ICommonLocalPtyService { readonly _serviceBrand: undefined; @@ -235,3 +792,27 @@ export interface ITerminalDimensionsOverride extends ITerminalDimensions { */ forceExactSize?: boolean; } + +export function printTime(ms: number): string { + let h = 0; + let m = 0; + let s = 0; + if (ms >= 1000) { + s = Math.floor(ms / 1000); + ms -= s * 1000; + } + if (s >= 60) { + m = Math.floor(s / 60); + s -= m * 60; + } + if (m >= 60) { + h = Math.floor(m / 60); + m -= h * 60; + } + const _h = h ? `${h}h` : ``; + const _m = m ? `${m}m` : ``; + const _s = s ? `${s}s` : ``; + const _ms = ms ? `${ms}ms` : ``; + return `${_h}${_m}${_s}${_ms}`; +} + diff --git a/src/vs/platform/terminal/common/terminalDataBuffering.ts b/src/vs/platform/terminal/common/terminalDataBuffering.ts new file mode 100644 index 00000000000..ff1e611b93c --- /dev/null +++ b/src/vs/platform/terminal/common/terminalDataBuffering.ts @@ -0,0 +1,67 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Event } from 'vs/base/common/event'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { IProcessDataEvent } from 'vs/platform/terminal/common/terminal'; + +interface TerminalDataBuffer extends IDisposable { + data: string[]; + timeoutId: any; +} + +export class TerminalDataBufferer implements IDisposable { + private readonly _terminalBufferMap = new Map(); + + constructor(private readonly _callback: (id: number, data: string) => void) { + } + + dispose() { + for (const buffer of this._terminalBufferMap.values()) { + buffer.dispose(); + } + } + + startBuffering(id: number, event: Event, throttleBy: number = 5): IDisposable { + let disposable: IDisposable; + disposable = event((e: string | IProcessDataEvent) => { + const data = (typeof e === 'string' ? e : e.data); + let buffer = this._terminalBufferMap.get(id); + if (buffer) { + buffer.data.push(data); + + return; + } + + const timeoutId = setTimeout(() => this._flushBuffer(id), throttleBy); + buffer = { + data: [data], + timeoutId: timeoutId, + dispose: () => { + clearTimeout(timeoutId); + this._flushBuffer(id); + disposable.dispose(); + } + }; + this._terminalBufferMap.set(id, buffer); + }); + return disposable; + } + + stopBuffering(id: number) { + const buffer = this._terminalBufferMap.get(id); + if (buffer) { + buffer.dispose(); + } + } + + private _flushBuffer(id: number): void { + const buffer = this._terminalBufferMap.get(id); + if (buffer) { + this._terminalBufferMap.delete(id); + this._callback(id, buffer.data.join('')); + } + } +} diff --git a/src/vs/platform/terminal/common/terminalProcess.ts b/src/vs/platform/terminal/common/terminalProcess.ts new file mode 100644 index 00000000000..38e4c054ea3 --- /dev/null +++ b/src/vs/platform/terminal/common/terminalProcess.ts @@ -0,0 +1,192 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { UriComponents } from 'vs/base/common/uri'; +import { IRawTerminalTabLayoutInfo, ITerminalEnvironment, ITerminalTabLayoutInfoById } from 'vs/platform/terminal/common/terminal'; +import { ISerializableEnvironmentVariableCollection } from 'vs/platform/terminal/common/environmentVariable'; + +export const REMOTE_TERMINAL_CHANNEL_NAME = 'remoteterminal'; + +export interface IShellLaunchConfigDto { + name?: string; + executable?: string; + args?: string[] | string; + cwd?: string | UriComponents; + env?: { [key: string]: string | null; }; + hideFromUser?: boolean; +} + +export interface ISingleTerminalConfiguration { + userValue: T | undefined; + value: T | undefined; + defaultValue: T | undefined; +} + +export interface ICompleteTerminalConfiguration { + 'terminal.integrated.automationShell.windows': ISingleTerminalConfiguration; + 'terminal.integrated.automationShell.osx': ISingleTerminalConfiguration; + 'terminal.integrated.automationShell.linux': ISingleTerminalConfiguration; + 'terminal.integrated.shell.windows': ISingleTerminalConfiguration; + 'terminal.integrated.shell.osx': ISingleTerminalConfiguration; + 'terminal.integrated.shell.linux': ISingleTerminalConfiguration; + 'terminal.integrated.shellArgs.windows': ISingleTerminalConfiguration; + 'terminal.integrated.shellArgs.osx': ISingleTerminalConfiguration; + 'terminal.integrated.shellArgs.linux': ISingleTerminalConfiguration; + 'terminal.integrated.env.windows': ISingleTerminalConfiguration; + 'terminal.integrated.env.osx': ISingleTerminalConfiguration; + 'terminal.integrated.env.linux': ISingleTerminalConfiguration; + 'terminal.integrated.inheritEnv': boolean; + 'terminal.integrated.cwd': string; + 'terminal.integrated.detectLocale': 'auto' | 'off' | 'on'; + 'terminal.flowControl': boolean; +} + +export type ITerminalEnvironmentVariableCollections = [string, ISerializableEnvironmentVariableCollection][]; + +export interface IWorkspaceFolderData { + uri: UriComponents; + name: string; + index: number; +} + +export interface ICreateTerminalProcessArguments { + configuration: ICompleteTerminalConfiguration; + resolvedVariables: { [name: string]: string; }; + envVariableCollections: ITerminalEnvironmentVariableCollections; + shellLaunchConfig: IShellLaunchConfigDto; + workspaceId: string; + workspaceName: string; + workspaceFolders: IWorkspaceFolderData[]; + activeWorkspaceFolder: IWorkspaceFolderData | null; + activeFileResource: UriComponents | undefined; + shouldPersistTerminal: boolean; + cols: number; + rows: number; + isWorkspaceShellAllowed: boolean; + resolverEnv: { [key: string]: string | null; } | undefined +} + +export interface ICreateTerminalProcessResult { + terminalId: number; + resolvedShellLaunchConfig: IShellLaunchConfigDto; +} + +export interface IStartTerminalProcessArguments { + id: number; +} + +export interface ISendInputToTerminalProcessArguments { + id: number; + data: string; +} + +export interface IShutdownTerminalProcessArguments { + id: number; + immediate: boolean; +} + +export interface IResizeTerminalProcessArguments { + id: number; + cols: number; + rows: number; +} + +export interface IGetTerminalInitialCwdArguments { + id: number; +} + +export interface IGetTerminalCwdArguments { + id: number; +} + +export interface ISendCommandResultToTerminalProcessArguments { + id: number; + reqId: number; + isError: boolean; + payload: any; +} + +export interface IOrphanQuestionReplyArgs { + id: number; +} + +export interface IListTerminalsArgs { + isInitialization: boolean; +} + +export interface ISetTerminalLayoutInfoArgs { + workspaceId: string; + tabs: ITerminalTabLayoutInfoById[]; +} + +export interface IGetTerminalLayoutInfoArgs { + workspaceId: string; +} + +export interface IRemoteTerminalDescriptionDto { + id: number; + pid: number; + title: string; + cwd: string; + workspaceId: string; + workspaceName: string; + isOrphan: boolean; +} + +export type ITerminalTabLayoutInfoDto = IRawTerminalTabLayoutInfo; + +export interface ITriggerTerminalDataReplayArguments { + id: number; +} + +export interface ISendCharCountToTerminalProcessArguments { + id: number; + charCount: number; +} + +export interface IRemoteTerminalProcessReadyEvent { + type: 'ready'; + pid: number; + cwd: string; +} +export interface IRemoteTerminalProcessTitleChangedEvent { + type: 'titleChanged'; + title: string; +} +export interface IRemoteTerminalProcessDataEvent { + type: 'data'; + data: string; +} +export interface ReplayEntry { cols: number; rows: number; data: string; } +export interface IRemoteTerminalProcessReplayEvent { + type: 'replay'; + events: ReplayEntry[]; +} +export interface IRemoteTerminalProcessExitEvent { + type: 'exit'; + exitCode: number | undefined; +} +export interface IRemoteTerminalProcessExecCommandEvent { + type: 'execCommand'; + reqId: number; + commandId: string; + commandArgs?: any[]; +} +export interface IRemoteTerminalProcessOrphanQuestionEvent { + type: 'orphan?'; +} +export type IRemoteTerminalProcessEvent = ( + IRemoteTerminalProcessReadyEvent + | IRemoteTerminalProcessTitleChangedEvent + | IRemoteTerminalProcessDataEvent + | IRemoteTerminalProcessReplayEvent + | IRemoteTerminalProcessExitEvent + | IRemoteTerminalProcessExecCommandEvent + | IRemoteTerminalProcessOrphanQuestionEvent +); + +export interface IOnTerminalProcessEventArguments { + id: number; +} diff --git a/src/vs/platform/terminal/common/terminalRecorder.ts b/src/vs/platform/terminal/common/terminalRecorder.ts new file mode 100644 index 00000000000..0a42a1af615 --- /dev/null +++ b/src/vs/platform/terminal/common/terminalRecorder.ts @@ -0,0 +1,93 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const MAX_RECORDER_DATA_SIZE = 1024 * 1024; // 1MB + +interface RecorderEntry { + cols: number; + rows: number; + data: string[]; +} + +export interface ReplayEntry { cols: number; rows: number; data: string; } + +export interface IRemoteTerminalProcessReplayEvent { + type: 'replay'; + events: ReplayEntry[]; +} + +export class TerminalRecorder { + + private _entries: RecorderEntry[]; + private _totalDataLength: number; + + constructor(cols: number, rows: number) { + this._entries = [{ cols, rows, data: [] }]; + this._totalDataLength = 0; + } + + public recordResize(cols: number, rows: number): void { + if (this._entries.length > 0) { + const lastEntry = this._entries[this._entries.length - 1]; + if (lastEntry.data.length === 0) { + // last entry is just a resize, so just remove it + this._entries.pop(); + } + } + + if (this._entries.length > 0) { + const lastEntry = this._entries[this._entries.length - 1]; + if (lastEntry.cols === cols && lastEntry.rows === rows) { + // nothing changed + return; + } + if (lastEntry.cols === 0 && lastEntry.rows === 0) { + // we finally received a good size! + lastEntry.cols = cols; + lastEntry.rows = rows; + return; + } + } + + this._entries.push({ cols, rows, data: [] }); + } + + public recordData(data: string): void { + const lastEntry = this._entries[this._entries.length - 1]; + lastEntry.data.push(data); + + this._totalDataLength += data.length; + while (this._totalDataLength > MAX_RECORDER_DATA_SIZE) { + const firstEntry = this._entries[0]; + const remainingToDelete = this._totalDataLength - MAX_RECORDER_DATA_SIZE; + if (remainingToDelete >= firstEntry.data[0].length) { + // the first data piece must be deleted + this._totalDataLength -= firstEntry.data[0].length; + firstEntry.data.shift(); + if (firstEntry.data.length === 0) { + // the first entry must be deleted + this._entries.shift(); + } + } else { + // the first data piece must be partially deleted + firstEntry.data[0] = firstEntry.data[0].substr(remainingToDelete); + this._totalDataLength -= remainingToDelete; + } + } + } + + public generateReplayEvent(): IRemoteTerminalProcessReplayEvent { + // normalize entries to one element per data array + this._entries.forEach((entry) => { + if (entry.data.length > 0) { + entry.data = [entry.data.join('')]; + } + }); + return { + type: 'replay', + events: this._entries.map(entry => ({ cols: entry.cols, rows: entry.rows, data: entry.data[0] ?? '' })) + }; + } +} diff --git a/src/vs/platform/terminal/electron-main/localPtyMainService.ts b/src/vs/platform/terminal/electron-main/localPtyMainService.ts index e8bc16679d1..17d63c50439 100644 --- a/src/vs/platform/terminal/electron-main/localPtyMainService.ts +++ b/src/vs/platform/terminal/electron-main/localPtyMainService.ts @@ -3,12 +3,18 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Emitter } from 'vs/base/common/event'; +import { Queue, RunOnceScheduler } from 'vs/base/common/async'; +import { Event, Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { IProcessEnvironment } from 'vs/base/common/platform'; +import { ProtocolConstants } from 'vs/base/parts/ipc/common/ipc.net'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; -import { ICommonLocalPtyService, IProcessDataEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensionsOverride, ITerminalLaunchError } from 'vs/platform/terminal/common/terminal'; +import { AutoOpenBarrier } from 'vs/platform/terminal/common/autoOpenBarrier'; +import { IRemoteTerminalProcessDataEvent, IRemoteTerminalProcessEvent, IRemoteTerminalProcessExitEvent, IRemoteTerminalProcessOrphanQuestionEvent, IRemoteTerminalProcessReadyEvent, IRemoteTerminalProcessTitleChangedEvent } from 'vs/platform/terminal/common/terminalProcess'; +import { ICommonLocalPtyService, IProcessDataEvent, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalLaunchError, printTime } from 'vs/platform/terminal/common/terminal'; +import { TerminalDataBufferer } from 'vs/platform/terminal/common/terminalDataBuffering'; +import { TerminalRecorder } from 'vs/platform/terminal/common/terminalRecorder'; import { TerminalProcess } from 'vs/platform/terminal/node/terminalProcess'; export const ILocalPtyMainService = createDecorator('localPtyMainService'); @@ -20,7 +26,7 @@ let currentLocalPtyId = 0; export class LocalPtyMainService extends Disposable implements ICommonLocalPtyService { declare readonly _serviceBrand: undefined; - private readonly _localPtys: Map = new Map(); + private readonly _localPtys: Map = new Map(); private readonly _onProcessData = this._register(new Emitter<{ id: number, event: IProcessDataEvent | string }>()); readonly onProcessData = this._onProcessData.event; @@ -41,6 +47,13 @@ export class LocalPtyMainService extends Disposable implements ICommonLocalPtySe super(); } + acknowledgeDataEvent(id: number, charCount: number): Promise { + throw new Error('Method not implemented.'); + } + getLatency(id: number): Promise { + throw new Error('Method not implemented.'); + } + async createProcess(shellLaunchConfig: IShellLaunchConfig, cwd: string, cols: number, rows: number, env: IProcessEnvironment, executableEnv: IProcessEnvironment, windowsEnableConpty: boolean): Promise { const id = ++currentLocalPtyId; const process = new TerminalProcess(shellLaunchConfig, cwd, cols, rows, env, executableEnv, windowsEnableConpty, this._logService); @@ -54,7 +67,11 @@ export class LocalPtyMainService extends Disposable implements ICommonLocalPtySe if (process.onProcessResolvedShellLaunchConfig) { process.onProcessResolvedShellLaunchConfig(event => this._onProcessResolvedShellLaunchConfig.fire({ id, event })); } - this._localPtys.set(id, process); + const persistentTerminalProcess = new PersistentTerminalProcess(id, process, '', '', true, cols, rows, '', this._logService, () => { + persistentTerminalProcess.dispose(); + this._localPtys.delete(id); + }); + this._localPtys.set(id, persistentTerminalProcess); return id; } @@ -74,10 +91,6 @@ export class LocalPtyMainService extends Disposable implements ICommonLocalPtySe return this._throwIfNoPty(id).resize(cols, rows); } - async acknowledgeDataEvent(id: number, charCount: number): Promise { - return this._throwIfNoPty(id).acknowledgeDataEvent(charCount); - } - async getInitialCwd(id: number): Promise { return this._throwIfNoPty(id).getInitialCwd(); } @@ -86,11 +99,7 @@ export class LocalPtyMainService extends Disposable implements ICommonLocalPtySe return this._throwIfNoPty(id).getCwd(); } - async getLatency(id: number): Promise { - return this._throwIfNoPty(id).getLatency(); - } - - private _throwIfNoPty(id: number): ITerminalChildProcess { + private _throwIfNoPty(id: number): PersistentTerminalProcess { const pty = this._localPtys.get(id); if (!pty) { throw new Error(`Could not find pty with id "${id}"`); @@ -98,3 +107,218 @@ export class LocalPtyMainService extends Disposable implements ICommonLocalPtySe return pty; } } + +export class PersistentTerminalProcess extends Disposable { + + private readonly _events: Emitter; + public readonly events: Event; + + private readonly _bufferer: TerminalDataBufferer; + + private readonly _pendingCommands = new Map void; reject: (err: any) => void; }>(); + + private readonly _recorder: TerminalRecorder; + private _seenFirstListener: boolean; + + private _orphanQuestionBarrier: AutoOpenBarrier | null; + private _orphanQuestionReplyTime: number; + private _orphanRequestQueue = new Queue(); + private _disconnectRunner1: RunOnceScheduler; + private _disconnectRunner2: RunOnceScheduler; + + private _title = ''; + private _pid = -1; + + public get pid(): number { + return this._pid; + } + + public get title(): string { + return this._title; + } + + constructor( + private readonly _id: number, + private readonly _terminalProcess: TerminalProcess, + public readonly workspaceId: string, + public readonly workspaceName: string, + public readonly shouldPersistTerminal: boolean, + cols: number, rows: number, + ipcHandlePath: string, + private readonly _logService: ILogService, + private readonly _onExit: () => void, + ) { + super(); + + this._recorder = new TerminalRecorder(cols, rows); + this._seenFirstListener = false; + + this._orphanQuestionBarrier = null; + this._orphanQuestionReplyTime = 0; + this._disconnectRunner1 = this._register(new RunOnceScheduler(() => { + this._logService.info(`The reconnection grace time of ${printTime(ProtocolConstants.ReconnectionGraceTime)} has expired, so the terminal process with pid ${this._pid} will be shutdown.`); + this.shutdown(true); + }, ProtocolConstants.ReconnectionGraceTime)); + this._disconnectRunner2 = this._register(new RunOnceScheduler(() => { + this._logService.info(`The short reconnection grace time of ${printTime(ProtocolConstants.ReconnectionShortGraceTime)} has expired, so the terminal process with pid ${this._pid} will be shutdown.`); + this.shutdown(true); + }, ProtocolConstants.ReconnectionShortGraceTime)); + + this._events = this._register(new Emitter({ + onListenerDidAdd: () => { + this._disconnectRunner1.cancel(); + this._disconnectRunner2.cancel(); + if (this._seenFirstListener) { + // only replay events to subsequent (reconnected) listeners + this._triggerReplay(); + } + this._seenFirstListener = true; + }, + onLastListenerRemove: () => { + if (this.shouldPersistTerminal) { + this._disconnectRunner1.schedule(); + } else { + this.shutdown(true); + } + } + })); + this.events = this._events.event; + + this._bufferer = new TerminalDataBufferer((id, data) => { + const ev: IRemoteTerminalProcessDataEvent = { + type: 'data', + data: data + }; + this._events.fire(ev); + }); + + this._register(this._terminalProcess.onProcessReady((e: { pid: number, cwd: string; }) => { + this._pid = e.pid; + const ev: IRemoteTerminalProcessReadyEvent = { + type: 'ready', + pid: e.pid, + cwd: e.cwd + }; + this._events.fire(ev); + })); + + this._register(this._terminalProcess.onProcessTitleChanged((title) => { + this._title = title; + const ev: IRemoteTerminalProcessTitleChangedEvent = { + type: 'titleChanged', + title: title + }; + this._events.fire(ev); + })); + + // Buffer data events to reduce the amount of messages going to the renderer + this._register(this._bufferer.startBuffering(this._id, this._terminalProcess.onProcessData)); + this._register(this._terminalProcess.onProcessData(e => { + this._recorder.recordData(e); + })); + this._register(this._terminalProcess.onProcessExit(exitCode => { + this._bufferer.stopBuffering(this._id); + + const ev: IRemoteTerminalProcessExitEvent = { + type: 'exit', + exitCode: exitCode + }; + this._events.fire(ev); + + // Remove process reference + this._onExit(); + })); + } + + public start(): Promise { + return this._terminalProcess.start(); + } + + public shutdown(immediate: boolean): void { + return this._terminalProcess.shutdown(immediate); + } + + public input(data: string): void { + return this._terminalProcess.input(data); + } + + public acknowledgeCharCount(charCount: number): void { + return this._terminalProcess.acknowledgeDataEvent(charCount); + } + + public resize(cols: number, rows: number): void { + this._recorder.recordResize(cols, rows); + return this._terminalProcess.resize(cols, rows); + } + + public getInitialCwd(): Promise { + return this._terminalProcess.getInitialCwd(); + } + + public getCwd(): Promise { + return this._terminalProcess.getCwd(); + } + + private _triggerReplay(): void { + const ev = this._recorder.generateReplayEvent(); + let dataLength = 0; + for (const e of ev.events) { + dataLength += e.data.length; + } + + this._logService.info(`Replaying ${dataLength} chars and ${ev.events.length} size events.`); + this._events.fire(ev); + this._terminalProcess.clearUnacknowledgedChars(); + } + + public sendCommandResult(reqId: number, isError: boolean, serializedPayload: any): void { + const data = this._pendingCommands.get(reqId); + if (!data) { + return; + } + this._pendingCommands.delete(reqId); + } + + public async orphanQuestionReply(): Promise { + this._orphanQuestionReplyTime = Date.now(); + if (this._orphanQuestionBarrier) { + const barrier = this._orphanQuestionBarrier; + this._orphanQuestionBarrier = null; + barrier.open(); + } + } + + public reduceGraceTime(): void { + if (this._disconnectRunner2.isScheduled()) { + // we are disconnected and already running the short reconnection timer + return; + } + if (this._disconnectRunner1.isScheduled()) { + // we are disconnected and running the long reconnection timer + this._disconnectRunner2.schedule(); + } + } + + public async isOrphaned(): Promise { + return await this._orphanRequestQueue.queue(async () => this._isOrphaned()); + } + + private async _isOrphaned(): Promise { + if (this._disconnectRunner1.isScheduled() || this._disconnectRunner2.isScheduled()) { + return true; + } + + if (!this._orphanQuestionBarrier) { + // the barrier opens after 4 seconds with or without a reply + this._orphanQuestionBarrier = new AutoOpenBarrier(4000); + this._orphanQuestionReplyTime = 0; + const ev: IRemoteTerminalProcessOrphanQuestionEvent = { + type: 'orphan?' + }; + this._events.fire(ev); + } + + await this._orphanQuestionBarrier.wait(); + return (Date.now() - this._orphanQuestionReplyTime > 500); + } +} diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index bba54eda321..ae2c9629d2c 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { DisposableStore, Disposable, IDisposable } from 'vs/base/common/lifecycle'; -import { ITerminalProcessExtHostProxy, ISpawnExtHostProcessRequest, IAvailableShellsRequest, IDefaultShellAndArgsRequest, IStartExtensionTerminalRequest, ITerminalConfiguration, TERMINAL_CONFIG_SECTION } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalProcessExtHostProxy, ISpawnExtHostProcessRequest, IAvailableShellsRequest, IDefaultShellAndArgsRequest, IStartExtensionTerminalRequest, ITerminalConfiguration, TERMINAL_CONFIG_SECTION, IShellLaunchConfig, ITerminalDimensions } from 'vs/platform/terminal/common/terminal'; import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, IExtHostContext, IShellLaunchConfigDto, TerminalLaunchConfig, ITerminalDimensionsDto, TerminalIdentifier } from 'vs/workbench/api/common/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { URI } from 'vs/base/common/uri'; @@ -12,12 +12,11 @@ import { StopWatch } from 'vs/base/common/stopwatch'; import { ITerminalInstanceService, ITerminalService, ITerminalInstance, ITerminalExternalLinkProvider, ITerminalLink } from 'vs/workbench/contrib/terminal/browser/terminal'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { TerminalDataBufferer } from 'vs/workbench/contrib/terminal/common/terminalDataBuffering'; -import { IEnvironmentVariableService, ISerializableEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { TerminalDataBufferer } from 'vs/platform/terminal/common/terminalDataBuffering'; +import { IEnvironmentVariableService, ISerializableEnvironmentVariableCollection } from 'vs/platform/terminal/common/environmentVariable'; import { deserializeEnvironmentVariableCollection, serializeEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariableShared'; import { ILogService } from 'vs/platform/log/common/log'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IShellLaunchConfig, ITerminalDimensions } from 'vs/platform/terminal/common/terminal'; @extHostNamedCustomer(MainContext.MainThreadTerminalService) export class MainThreadTerminalService implements MainThreadTerminalServiceShape { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index f993748fd04..6b06d146dd9 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -53,7 +53,7 @@ import { revive } from 'vs/base/common/marshalling'; import { IProcessedOutput, INotebookDisplayOrder, NotebookCellMetadata, NotebookDocumentMetadata, ICellEditOperation, NotebookCellsChangedEventDto, NotebookDataDto, IMainCellDto, INotebookDocumentFilter, INotebookKernelInfoDto2, TransientMetadata, INotebookCellStatusBarEntry, ICellRange, INotebookDecorationRenderOptions, INotebookExclusiveDocumentFilter } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { CallHierarchyItem } from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; import { Dto } from 'vs/base/common/types'; -import { ISerializableEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { ISerializableEnvironmentVariableCollection } from 'vs/platform/terminal/common/environmentVariable'; import { DebugConfigurationProviderTriggerKind, WorkspaceTrustState } from 'vs/workbench/api/common/extHostTypes'; import { IAccessibilityInformation } from 'vs/platform/accessibility/common/accessibility'; import { IExtensionIdWithVersion } from 'vs/platform/userDataSync/common/extensionsStorageSync'; diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index 393fdb64cfb..f8333f064ff 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -15,7 +15,7 @@ import { TerminalDataBufferer } from 'vs/workbench/contrib/terminal/common/termi import { IDisposable, DisposableStore, Disposable } from 'vs/base/common/lifecycle'; import { Disposable as VSCodeDisposable, EnvironmentVariableMutatorType } from './extHostTypes'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; -import { ISerializableEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { ISerializableEnvironmentVariableCollection } from 'vs/platform/terminal/common/environmentVariable'; import { localize } from 'vs/nls'; import { NotSupportedError } from 'vs/base/common/errors'; import { serializeEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariableShared'; diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index d40c0bd2246..d26f26b1708 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -11,11 +11,11 @@ import { ExtensionActivationTimesBuilder } from 'vs/workbench/api/common/extHost import { connectProxyResolver } from 'vs/workbench/services/extensions/node/proxyResolver'; import { AbstractExtHostExtensionService } from 'vs/workbench/api/common/extHostExtensionService'; import { ExtHostDownloadService } from 'vs/workbench/api/node/extHostDownloadService'; -import { CLIServer } from 'vs/workbench/api/node/extHostCLIServer'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ExtensionRuntime } from 'vs/workbench/api/common/extHostTypes'; +import { CLIServer } from 'vs/workbench/api/node/extHostCLIServer'; class NodeModuleRequireInterceptor extends RequireInterceptor { diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts index 84e406323be..16b8712fa4d 100644 --- a/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts @@ -8,7 +8,7 @@ import * as paths from 'vs/base/common/path'; import { IExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; -import { KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED } from 'vs/workbench/contrib/terminal/common/terminal'; +import { KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED } from 'vs/platform/terminal/common/terminal'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { Schemas } from 'vs/base/common/network'; diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index 4a8ebd59358..03126018648 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -27,7 +27,7 @@ import Constants from 'vs/workbench/contrib/markers/browser/constants'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; -import { TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal'; +import { TERMINAL_VIEW_ID, IShellLaunchConfig } from 'vs/platform/terminal/common/terminal'; import { ITerminalService, ITerminalInstanceService, ITerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal'; import { IOutputService } from 'vs/workbench/contrib/output/common/output'; import { StartStopProblemCollector, WatchingProblemCollector, ProblemCollectorEventKind, ProblemHandlingStrategy } from 'vs/workbench/contrib/tasks/common/problemCollectors'; @@ -48,7 +48,6 @@ import { env as processEnv, cwd as processCwd } from 'vs/base/common/process'; import { IViewsService, IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; import { ILogService } from 'vs/platform/log/common/log'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IShellLaunchConfig } from 'vs/platform/terminal/common/terminal'; interface TerminalData { terminal: ITerminalInstance; diff --git a/src/vs/workbench/contrib/terminal/browser/addons/commandTrackerAddon.ts b/src/vs/workbench/contrib/terminal/browser/addons/commandTrackerAddon.ts index 01c90349d9e..cf077da10cc 100644 --- a/src/vs/workbench/contrib/terminal/browser/addons/commandTrackerAddon.ts +++ b/src/vs/workbench/contrib/terminal/browser/addons/commandTrackerAddon.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import type { Terminal, IMarker, ITerminalAddon } from 'xterm'; -import { ICommandTracker } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ICommandTracker } from 'vs/platform/terminal/common/terminal'; /** * The minimum size of the prompt in which to assume the line is a command. diff --git a/src/vs/workbench/contrib/terminal/browser/addons/navigationModeAddon.ts b/src/vs/workbench/contrib/terminal/browser/addons/navigationModeAddon.ts index 8487459af57..1ff4fdd5d86 100644 --- a/src/vs/workbench/contrib/terminal/browser/addons/navigationModeAddon.ts +++ b/src/vs/workbench/contrib/terminal/browser/addons/navigationModeAddon.ts @@ -6,7 +6,7 @@ import { IContextKey } from 'vs/platform/contextkey/common/contextkey'; import type { Terminal, ITerminalAddon } from 'xterm'; import { addDisposableListener } from 'vs/base/browser/dom'; -import { INavigationMode } from 'vs/workbench/contrib/terminal/common/terminal'; +import { INavigationMode } from 'vs/platform/terminal/common/terminal'; export class NavigationModeAddon implements INavigationMode, ITerminalAddon { private _terminal: Terminal | undefined; diff --git a/src/vs/workbench/contrib/terminal/browser/environmentVariableInfo.ts b/src/vs/workbench/contrib/terminal/browser/environmentVariableInfo.ts index d91501663cc..e39e4a5350b 100644 --- a/src/vs/workbench/contrib/terminal/browser/environmentVariableInfo.ts +++ b/src/vs/workbench/contrib/terminal/browser/environmentVariableInfo.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IEnvironmentVariableInfo, IMergedEnvironmentVariableCollection, IMergedEnvironmentVariableCollectionDiff, EnvironmentVariableMutatorType } from 'vs/workbench/contrib/terminal/common/environmentVariable'; -import { TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IEnvironmentVariableInfo, IMergedEnvironmentVariableCollection, IMergedEnvironmentVariableCollectionDiff, EnvironmentVariableMutatorType } from 'vs/platform/terminal/common/environmentVariable'; +import { TERMINAL_COMMAND_ID } from 'vs/platform/terminal/common/terminal'; import { ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { localize } from 'vs/nls'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts index 9f043c29802..297725c02ff 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts @@ -9,7 +9,7 @@ import { DisposableStore, IDisposable, dispose } from 'vs/base/common/lifecycle' import { IOpenerService } from 'vs/platform/opener/common/opener'; import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/widgets/widgetManager'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ITerminalProcessManager, ITerminalConfiguration, TERMINAL_CONFIG_SECTION } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalProcessManager, ITerminalConfiguration, TERMINAL_CONFIG_SECTION } from 'vs/platform/terminal/common/terminal'; import { ITextEditorSelection } from 'vs/platform/editor/common/editor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IFileService } from 'vs/platform/files/common/files'; diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalWordLinkProvider.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalWordLinkProvider.ts index a2cb37f78e4..c6451bc3b47 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalWordLinkProvider.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalWordLinkProvider.ts @@ -5,7 +5,7 @@ import type { Terminal, IViewportRange } from 'xterm'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ITerminalConfiguration, TERMINAL_CONFIG_SECTION } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalConfiguration, TERMINAL_CONFIG_SECTION } from 'vs/platform/terminal/common/terminal'; import { TerminalLink } from 'vs/workbench/contrib/terminal/browser/links/terminalLink'; import { localize } from 'vs/nls'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; diff --git a/src/vs/workbench/contrib/terminal/browser/remoteTerminalService.ts b/src/vs/workbench/contrib/terminal/browser/remoteTerminalService.ts index 0fe3cfeafd2..94f796f88cd 100644 --- a/src/vs/workbench/contrib/terminal/browser/remoteTerminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/remoteTerminalService.ts @@ -14,10 +14,8 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ILogService } from 'vs/platform/log/common/log'; import { IRemoteTerminalService, ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { IRemoteTerminalProcessExecCommandEvent, IShellLaunchConfigDto, RemoteTerminalChannelClient, REMOTE_TERMINAL_CHANNEL_NAME } from 'vs/workbench/contrib/terminal/common/remoteTerminalChannel'; -import { IRemoteTerminalAttachTarget, ITerminalConfigHelper, ITerminalsLayoutInfo, ITerminalsLayoutInfoById } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IProcessDataEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensionsOverride, ITerminalLaunchError, IRemoteTerminalAttachTarget, ITerminalConfigHelper, ITerminalsLayoutInfo, ITerminalsLayoutInfoById } from 'vs/platform/terminal/common/terminal'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; -import { IProcessDataEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensionsOverride, ITerminalLaunchError } from 'vs/platform/terminal/common/terminal'; - export class RemoteTerminalService extends Disposable implements IRemoteTerminalService { public _serviceBrand: undefined; diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 740fd5c5954..634b47af725 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -19,7 +19,7 @@ import { getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views'; import { registerTerminalActions, terminalSendSequenceCommand } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; -import { KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, TERMINAL_VIEW_ID, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; +import { KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, TERMINAL_VIEW_ID, TERMINAL_COMMAND_ID } from 'vs/platform/terminal/common/terminal'; import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { setupTerminalCommands } from 'vs/workbench/contrib/terminal/browser/terminalCommands'; import { setupTerminalMenu } from 'vs/workbench/contrib/terminal/common/terminalMenu'; diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index f6909541055..08b6f81a5fb 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -7,14 +7,13 @@ import type { Terminal as XTermTerminal } from 'xterm'; import type { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; import type { Unicode11Addon as XTermUnicode11Addon } from 'xterm-addon-unicode11'; import type { WebglAddon as XTermWebglAddon } from 'xterm-addon-webgl'; -import { IWindowsShellHelper, ITerminalConfigHelper, IDefaultShellAndArgsRequest, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, IAvailableShellsRequest, ITerminalProcessExtHostProxy, ICommandTracker, INavigationMode, TitleEventSource, ITerminalNativeWindowsDelegate, LinuxDistro, IRemoteTerminalAttachTarget, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, ITerminalTabLayoutInfoById } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IWindowsShellHelper, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensions, ITerminalLaunchError, ITerminalConfigHelper, IDefaultShellAndArgsRequest, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, IAvailableShellsRequest, ITerminalProcessExtHostProxy, ICommandTracker, INavigationMode, TitleEventSource, ITerminalNativeWindowsDelegate, LinuxDistro, IRemoteTerminalAttachTarget, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, ITerminalTabLayoutInfoById } from 'vs/platform/terminal/common/terminal'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IProcessEnvironment, Platform } from 'vs/base/common/platform'; import { Event } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; import { FindReplaceState } from 'vs/editor/contrib/find/findState'; import { URI } from 'vs/base/common/uri'; -import { IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensions, ITerminalLaunchError } from 'vs/platform/terminal/common/terminal'; export const ITerminalService = createDecorator('terminalService'); export const ITerminalInstanceService = createDecorator('terminalInstanceService'); diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.web.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.web.contribution.ts index 6773ae9e4aa..c8201e6a576 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.web.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.web.contribution.ts @@ -6,7 +6,7 @@ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { KeybindingWeight, KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; -import { TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; +import { TERMINAL_COMMAND_ID } from 'vs/platform/terminal/common/terminal'; import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; import { getNoDefaultTerminalShellConfiguration } from 'vs/workbench/contrib/terminal/common/terminalConfiguration'; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 319e6b3f6eb..fd544f4e878 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -30,7 +30,7 @@ import { RemoteNameContext } from 'vs/workbench/browser/contextkeys'; import { FindInFilesCommand, IFindInFilesArgs } from 'vs/workbench/contrib/search/browser/searchActions'; import { Direction, IRemoteTerminalService, ITerminalInstance, ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalQuickAccessProvider } from 'vs/workbench/contrib/terminal/browser/terminalQuickAccess'; -import { IRemoteTerminalAttachTarget, ITerminalConfigHelper, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, KEYBINDING_CONTEXT_TERMINAL_ALT_BUFFER_ACTIVE, KEYBINDING_CONTEXT_TERMINAL_FIND_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_ACTION_CATEGORY, TERMINAL_COMMAND_ID, TERMINAL_VIEW_ID, TitleEventSource } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IRemoteTerminalAttachTarget, ITerminalConfigHelper, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, KEYBINDING_CONTEXT_TERMINAL_ALT_BUFFER_ACTIVE, KEYBINDING_CONTEXT_TERMINAL_FIND_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_ACTION_CATEGORY, TERMINAL_COMMAND_ID, TERMINAL_VIEW_ID, TitleEventSource } from 'vs/platform/terminal/common/terminal'; import { ITerminalContributionService } from 'vs/workbench/contrib/terminal/common/terminalExtensionPoints'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts b/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts index 8ae511a0893..9a494f83139 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts @@ -8,7 +8,7 @@ import * as platform from 'vs/base/common/platform'; import { EDITOR_FONT_DEFAULTS, IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; -import { ITerminalConfiguration, ITerminalFont, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, TERMINAL_CONFIG_SECTION, DEFAULT_LETTER_SPACING, DEFAULT_LINE_HEIGHT, MINIMUM_LETTER_SPACING, LinuxDistro, MINIMUM_FONT_WEIGHT, MAXIMUM_FONT_WEIGHT, DEFAULT_FONT_WEIGHT, DEFAULT_BOLD_FONT_WEIGHT, FontWeight } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalConfiguration, IShellLaunchConfig, ITerminalFont, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, TERMINAL_CONFIG_SECTION, DEFAULT_LETTER_SPACING, DEFAULT_LINE_HEIGHT, MINIMUM_LETTER_SPACING, LinuxDistro, MINIMUM_FONT_WEIGHT, MAXIMUM_FONT_WEIGHT, DEFAULT_FONT_WEIGHT, DEFAULT_BOLD_FONT_WEIGHT, FontWeight } from 'vs/platform/terminal/common/terminal'; import Severity from 'vs/base/common/severity'; import { INotificationService, NeverShowAgainScope } from 'vs/platform/notification/common/notification'; import { IBrowserTerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminal'; @@ -20,7 +20,6 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { InstallRecommendedExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { IProductService } from 'vs/platform/product/common/productService'; import { XTermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private'; -import { IShellLaunchConfig } from 'vs/platform/terminal/common/terminal'; const MINIMUM_FONT_SIZE = 6; const MAXIMUM_FONT_SIZE = 25; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts b/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts index ce03ffc9857..801a03c6b90 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts @@ -5,7 +5,7 @@ import { SimpleFindWidget } from 'vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; -import { KEYBINDING_CONTEXT_TERMINAL_FIND_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_FOCUSED } from 'vs/workbench/contrib/terminal/common/terminal'; +import { KEYBINDING_CONTEXT_TERMINAL_FIND_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_FOCUSED } from 'vs/platform/terminal/common/terminal'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { FindReplaceState } from 'vs/editor/contrib/find/findState'; import { ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 40c4a098459..81972a4c9f5 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -25,7 +25,7 @@ import { activeContrastBorder, scrollbarSliderActiveBackground, scrollbarSliderB import { ICssStyleCollector, IColorTheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { PANEL_BACKGROUND, SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/widgets/widgetManager'; -import { ITerminalProcessManager, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, NEVER_MEASURE_RENDER_TIME_STORAGE_KEY, ProcessState, TERMINAL_VIEW_ID, IWindowsShellHelper, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, INavigationMode, TitleEventSource, DEFAULT_COMMANDS_TO_SKIP_SHELL, TERMINAL_CREATION_COMMANDS, KEYBINDING_CONTEXT_TERMINAL_ALT_BUFFER_ACTIVE } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalProcessManager, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, NEVER_MEASURE_RENDER_TIME_STORAGE_KEY, ProcessState, TERMINAL_VIEW_ID, IWindowsShellHelper, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, INavigationMode, TitleEventSource, DEFAULT_COMMANDS_TO_SKIP_SHELL, TERMINAL_CREATION_COMMANDS, KEYBINDING_CONTEXT_TERMINAL_ALT_BUFFER_ACTIVE, IProcessDataEvent, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalLaunchError } from 'vs/platform/terminal/common/terminal'; import { ansiColorIdentifiers, TERMINAL_BACKGROUND_COLOR, TERMINAL_CURSOR_BACKGROUND_COLOR, TERMINAL_CURSOR_FOREGROUND_COLOR, TERMINAL_FOREGROUND_COLOR, TERMINAL_SELECTION_BACKGROUND_COLOR } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; import { TerminalLinkManager } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkManager'; @@ -42,12 +42,11 @@ import { XTermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IViewsService, IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; import { EnvironmentVariableInfoWidget } from 'vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget'; -import { IEnvironmentVariableInfo } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { IEnvironmentVariableInfo } from 'vs/platform/terminal/common/environmentVariable'; import { TerminalLaunchHelpAction } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TypeAheadAddon } from 'vs/workbench/contrib/terminal/browser/terminalTypeAheadAddon'; import { BrowserFeatures } from 'vs/base/browser/canIUse'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; -import { IProcessDataEvent, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalLaunchError } from 'vs/platform/terminal/common/terminal'; // How long in milliseconds should an average frame take to render for a notification to appear // which suggests the fallback DOM-based renderer diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts index 5959fa80cb5..1677d47b84e 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { IWindowsShellHelper, IDefaultShellAndArgsRequest } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IWindowsShellHelper, IDefaultShellAndArgsRequest, ITerminalChildProcess } from 'vs/platform/terminal/common/terminal'; import type { Terminal as XTermTerminal } from 'xterm'; import type { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; import type { Unicode11Addon as XTermUnicode11Addon } from 'xterm-addon-unicode11'; @@ -12,7 +12,6 @@ import type { WebglAddon as XTermWebglAddon } from 'xterm-addon-webgl'; import { IProcessEnvironment } from 'vs/base/common/platform'; import { Emitter, Event } from 'vs/base/common/event'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { ITerminalChildProcess } from 'vs/platform/terminal/common/terminal'; let Terminal: typeof XTermTerminal; let SearchAddon: typeof XTermSearchAddon; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts index ce47964cff8..4922fbd5a97 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts @@ -4,13 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { Event, Emitter } from 'vs/base/common/event'; -import { ITerminalProcessExtHostProxy, ITerminalConfigHelper } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalProcessExtHostProxy, ITerminalConfigHelper, IShellLaunchConfig, ITerminalLaunchError, ITerminalChildProcess, ITerminalDimensionsOverride, ITerminalDimensions } from 'vs/platform/terminal/common/terminal'; import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import * as nls from 'vs/nls'; import { ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { IShellLaunchConfig, ITerminalLaunchError, ITerminalChildProcess, ITerminalDimensionsOverride, ITerminalDimensions } from 'vs/platform/terminal/common/terminal'; let hasReceivedResponseFromRemoteExtHost: boolean = false; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 7396cd4897e..fe83c7e5c04 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -6,7 +6,7 @@ import * as platform from 'vs/base/common/platform'; import * as terminalEnvironment from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; import { env as processEnv } from 'vs/base/common/process'; -import { ProcessState, ITerminalProcessManager, ITerminalConfigHelper, IBeforeProcessDataEvent } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ProcessState, ITerminalProcessManager, ITerminalConfigHelper, IBeforeProcessDataEvent, IShellLaunchConfig, ITerminalEnvironment, ITerminalLaunchError, FlowControlConstants, ITerminalChildProcess, IProcessDataEvent, ITerminalDimensionsOverride } from 'vs/platform/terminal/common/terminal'; import { ILogService } from 'vs/platform/log/common/log'; import { Emitter, Event } from 'vs/base/common/event'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; @@ -23,11 +23,10 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { Disposable } from 'vs/base/common/lifecycle'; import { withNullAsUndefined } from 'vs/base/common/types'; -import { IEnvironmentVariableService, IMergedEnvironmentVariableCollection, IEnvironmentVariableInfo } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { IEnvironmentVariableService, IMergedEnvironmentVariableCollection, IEnvironmentVariableInfo } from 'vs/platform/terminal/common/environmentVariable'; import { EnvironmentVariableInfoChangesActive, EnvironmentVariableInfoStale } from 'vs/workbench/contrib/terminal/browser/environmentVariableInfo'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { URI } from 'vs/base/common/uri'; -import { IShellLaunchConfig, ITerminalEnvironment, ITerminalLaunchError, FlowControlConstants, ITerminalChildProcess, IProcessDataEvent, ITerminalDimensionsOverride } from 'vs/platform/terminal/common/terminal'; /** The amount of time to consider terminal errors to be related to the launch */ const LAUNCHING_DURATION = 500; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalQuickAccess.ts b/src/vs/workbench/contrib/terminal/browser/terminalQuickAccess.ts index 7a283761ab4..1ea96410fac 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalQuickAccess.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalQuickAccess.ts @@ -9,7 +9,7 @@ import { IPickerQuickAccessItem, PickerQuickAccessProvider, TriggerAction } from import { matchesFuzzy } from 'vs/base/common/filters'; import { ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; +import { TERMINAL_COMMAND_ID } from 'vs/platform/terminal/common/terminal'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; import { killTerminalIcon, renameTerminalIcon } from 'vs/workbench/contrib/terminal/browser/terminalIcons'; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts index 8df95ce36b8..46676ea1a5c 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -19,14 +19,13 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IPickOptions, IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IShellLaunchConfig, ITerminalLaunchError } from 'vs/platform/terminal/common/terminal'; +import { IAvailableShellsRequest, IRemoteTerminalAttachTarget, IShellDefinition, IShellLaunchConfig, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, ITerminalConfigHelper, ITerminalLaunchError, ITerminalNativeWindowsDelegate, ITerminalProcessExtHostProxy, ITerminalsLayoutInfoById, KEYBINDING_CONTEXT_TERMINAL_ALT_BUFFER_ACTIVE, KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_IS_OPEN, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE, LinuxDistro, TERMINAL_VIEW_ID } from 'vs/platform/terminal/common/terminal'; import { IViewDescriptorService, IViewsService, ViewContainerLocation } from 'vs/workbench/common/views'; import { TerminalConnectionState, IRemoteTerminalService, ITerminalExternalLinkProvider, ITerminalInstance, ITerminalService, ITerminalTab, TerminalShellType, WindowsShellType } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; import { TerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminalInstance'; import { TerminalTab } from 'vs/workbench/contrib/terminal/browser/terminalTab'; import { TerminalViewPane } from 'vs/workbench/contrib/terminal/browser/terminalView'; -import { IAvailableShellsRequest, IRemoteTerminalAttachTarget, IShellDefinition, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, ITerminalConfigHelper, ITerminalNativeWindowsDelegate, ITerminalProcessExtHostProxy, ITerminalsLayoutInfoById, KEYBINDING_CONTEXT_TERMINAL_ALT_BUFFER_ACTIVE, KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_IS_OPEN, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE, LinuxDistro, TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { escapeNonWindowsPath } from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; @@ -160,7 +159,7 @@ export class TerminalService implements ITerminalService { let reconnectCounter = 0; let activeTab: ITerminalTab | undefined; if (layoutInfo) { - layoutInfo.tabs.forEach((tabLayout) => { + layoutInfo.tabs.forEach((tabLayout: { terminals: any[]; isActive: any; activeTerminalProcessId: number | undefined; }) => { const terminalLayouts = tabLayout.terminals.filter(t => t.terminal && t.terminal.isOrphan); if (terminalLayouts.length) { reconnectCounter += terminalLayouts.length; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTab.ts b/src/vs/workbench/contrib/terminal/browser/terminalTab.ts index 2acb91ea13e..0fb9f68832c 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTab.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTab.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ITerminalTabLayoutInfoById, TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalTabLayoutInfoById, TERMINAL_VIEW_ID, IShellLaunchConfig } from 'vs/platform/terminal/common/terminal'; import { Event, Emitter } from 'vs/base/common/event'; import { IDisposable, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { SplitView, Orientation, IView, Sizing } from 'vs/base/browser/ui/splitview/splitview'; @@ -11,7 +11,6 @@ import { IWorkbenchLayoutService, Parts, Position } from 'vs/workbench/services/ import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITerminalInstance, Direction, ITerminalTab, ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { ViewContainerLocation, IViewDescriptorService } from 'vs/workbench/common/views'; -import { IShellLaunchConfig } from 'vs/platform/terminal/common/terminal'; const SPLIT_PANE_MIN_SIZE = 120; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTypeAheadAddon.ts b/src/vs/workbench/contrib/terminal/browser/terminalTypeAheadAddon.ts index 835915af1b9..0fe61f29b83 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTypeAheadAddon.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTypeAheadAddon.ts @@ -12,7 +12,7 @@ import { escapeRegExpCharacters } from 'vs/base/common/strings'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; import { XTermAttributes, XTermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private'; -import { DEFAULT_LOCAL_ECHO_EXCLUDE, IBeforeProcessDataEvent, ITerminalConfiguration, ITerminalProcessManager } from 'vs/workbench/contrib/terminal/common/terminal'; +import { DEFAULT_LOCAL_ECHO_EXCLUDE, IBeforeProcessDataEvent, ITerminalConfiguration, ITerminalProcessManager } from 'vs/platform/terminal/common/terminal'; import type { IBuffer, IBufferCell, IDisposable, ITerminalAddon, Terminal } from 'xterm'; const ESC = '\x1b'; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalView.ts b/src/vs/workbench/contrib/terminal/browser/terminalView.ts index 7674a991804..40db627ecc7 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalView.ts @@ -28,7 +28,7 @@ import { IOpenerService } from 'vs/platform/opener/common/opener'; import { PANEL_BACKGROUND, SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { IMenu, IMenuService, MenuId } from 'vs/platform/actions/common/actions'; import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; -import { TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; +import { TERMINAL_COMMAND_ID } from 'vs/platform/terminal/common/terminal'; import { SelectActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems'; import { ITerminalContributionService } from 'vs/workbench/contrib/terminal/common/terminalExtensionPoints'; import { attachSelectBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; diff --git a/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts b/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts index 913e4de7947..9496e74aec1 100644 --- a/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts +++ b/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Widget } from 'vs/base/browser/ui/widget'; -import { IEnvironmentVariableInfo } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { IEnvironmentVariableInfo } from 'vs/platform/terminal/common/environmentVariable'; import { MarkdownString } from 'vs/base/common/htmlContent'; import { ITerminalWidget } from 'vs/workbench/contrib/terminal/browser/widgets/widgets'; import { RunOnceScheduler } from 'vs/base/common/async'; diff --git a/src/vs/workbench/contrib/terminal/common/environmentVariable.contribution.ts b/src/vs/workbench/contrib/terminal/common/environmentVariable.contribution.ts index 4ebe6822816..42733eaad4e 100644 --- a/src/vs/workbench/contrib/terminal/common/environmentVariable.contribution.ts +++ b/src/vs/workbench/contrib/terminal/common/environmentVariable.contribution.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IEnvironmentVariableService } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { IEnvironmentVariableService } from 'vs/platform/terminal/common/environmentVariable'; import { EnvironmentVariableService } from 'vs/workbench/contrib/terminal/common/environmentVariableService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; diff --git a/src/vs/workbench/contrib/terminal/common/environmentVariableCollection.ts b/src/vs/workbench/contrib/terminal/common/environmentVariableCollection.ts index 9db5c7b7f87..fe803303185 100644 --- a/src/vs/workbench/contrib/terminal/common/environmentVariableCollection.ts +++ b/src/vs/workbench/contrib/terminal/common/environmentVariableCollection.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IEnvironmentVariableCollection, EnvironmentVariableMutatorType, IMergedEnvironmentVariableCollection, IMergedEnvironmentVariableCollectionDiff, IExtensionOwnedEnvironmentVariableMutator } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { IEnvironmentVariableCollection, EnvironmentVariableMutatorType, IMergedEnvironmentVariableCollection, IMergedEnvironmentVariableCollectionDiff, IExtensionOwnedEnvironmentVariableMutator } from 'vs/platform/terminal/common/environmentVariable'; import { IProcessEnvironment, isWindows } from 'vs/base/common/platform'; export class MergedEnvironmentVariableCollection implements IMergedEnvironmentVariableCollection { diff --git a/src/vs/workbench/contrib/terminal/common/environmentVariableService.ts b/src/vs/workbench/contrib/terminal/common/environmentVariableService.ts index e1d98440757..477c3df9b49 100644 --- a/src/vs/workbench/contrib/terminal/common/environmentVariableService.ts +++ b/src/vs/workbench/contrib/terminal/common/environmentVariableService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IEnvironmentVariableService, IMergedEnvironmentVariableCollection, ISerializableEnvironmentVariableCollection, IEnvironmentVariableCollectionWithPersistence } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { IEnvironmentVariableService, IMergedEnvironmentVariableCollection, ISerializableEnvironmentVariableCollection, IEnvironmentVariableCollectionWithPersistence } from 'vs/platform/terminal/common/environmentVariable'; import { Event, Emitter } from 'vs/base/common/event'; import { debounce, throttle } from 'vs/base/common/decorators'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; diff --git a/src/vs/workbench/contrib/terminal/common/environmentVariableShared.ts b/src/vs/workbench/contrib/terminal/common/environmentVariableShared.ts index ed39f2e8acd..4791707fe69 100644 --- a/src/vs/workbench/contrib/terminal/common/environmentVariableShared.ts +++ b/src/vs/workbench/contrib/terminal/common/environmentVariableShared.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IEnvironmentVariableMutator, ISerializableEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { IEnvironmentVariableMutator, ISerializableEnvironmentVariableCollection } from 'vs/platform/terminal/common/environmentVariable'; // This file is shared between the renderer and extension host diff --git a/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts b/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts index 9358cbf6d6f..8d9b5cdb181 100644 --- a/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts +++ b/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts @@ -11,15 +11,14 @@ import { IWorkbenchConfigurationService } from 'vs/workbench/services/configurat import { ILogService } from 'vs/platform/log/common/log'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IEnvironmentVariableService, ISerializableEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { IEnvironmentVariableService, ISerializableEnvironmentVariableCollection } from 'vs/platform/terminal/common/environmentVariable'; import { serializeEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariableShared'; -import { IRawTerminalTabLayoutInfo, ITerminalConfiguration, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, ITerminalTabLayoutInfoById, TERMINAL_CONFIG_SECTION } from 'vs/workbench/contrib/terminal/common/terminal'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { SideBySideEditor, EditorResourceAccessor } from 'vs/workbench/common/editor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { Schemas } from 'vs/base/common/network'; import { ILabelService } from 'vs/platform/label/common/label'; -import { ITerminalEnvironment, ITerminalLaunchError } from 'vs/platform/terminal/common/terminal'; +import { IRawTerminalTabLayoutInfo, ITerminalConfiguration, ITerminalEnvironment, ITerminalLaunchError, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, ITerminalTabLayoutInfoById, TERMINAL_CONFIG_SECTION } from 'vs/platform/terminal/common/terminal'; export const REMOTE_TERMINAL_CHANNEL_NAME = 'remoteterminal'; diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts deleted file mode 100644 index 190c8a6060c..00000000000 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ /dev/null @@ -1,595 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as nls from 'vs/nls'; -import { Event } from 'vs/base/common/event'; -import { IDisposable } from 'vs/base/common/lifecycle'; -import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { URI } from 'vs/base/common/uri'; -import { OperatingSystem } from 'vs/base/common/platform'; -import { IEnvironmentVariableInfo } from 'vs/workbench/contrib/terminal/common/environmentVariable'; -import { IExtensionPointDescriptor } from 'vs/workbench/services/extensions/common/extensionsRegistry'; -import { IProcessDataEvent, IShellLaunchConfig, ITerminalDimensions, ITerminalDimensionsOverride, ITerminalLaunchError } from 'vs/platform/terminal/common/terminal'; - -export const TERMINAL_VIEW_ID = 'terminal'; - -/** A context key that is set when there is at least one opened integrated terminal. */ -export const KEYBINDING_CONTEXT_TERMINAL_IS_OPEN = new RawContextKey('terminalIsOpen', false); - -/** A context key that is set when the integrated terminal has focus. */ -export const KEYBINDING_CONTEXT_TERMINAL_FOCUS = new RawContextKey('terminalFocus', false); - -export const KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY = 'terminalShellType'; -/** A context key that is set to the detected shell for the most recently active terminal, this is set to the last known value when no terminals exist. */ -export const KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE = new RawContextKey(KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, undefined); - -export const KEYBINDING_CONTEXT_TERMINAL_ALT_BUFFER_ACTIVE = new RawContextKey('terminalAltBufferActive', false); - -/** A context key that is set when the integrated terminal does not have focus. */ -export const KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED = KEYBINDING_CONTEXT_TERMINAL_FOCUS.toNegated(); - -/** A context key that is set when the user is navigating the accessibility tree */ -export const KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS = new RawContextKey('terminalA11yTreeFocus', false); - -/** A keybinding context key that is set when the integrated terminal has text selected. */ -export const KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED = new RawContextKey('terminalTextSelected', false); -/** A keybinding context key that is set when the integrated terminal does not have text selected. */ -export const KEYBINDING_CONTEXT_TERMINAL_TEXT_NOT_SELECTED = KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED.toNegated(); - -/** A context key that is set when the find widget in integrated terminal is visible. */ -export const KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE = new RawContextKey('terminalFindVisible', false); -/** A context key that is set when the find widget in integrated terminal is not visible. */ -export const KEYBINDING_CONTEXT_TERMINAL_FIND_NOT_VISIBLE = KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE.toNegated(); -/** A context key that is set when the find widget find input in integrated terminal is focused. */ -export const KEYBINDING_CONTEXT_TERMINAL_FIND_INPUT_FOCUSED = new RawContextKey('terminalFindInputFocused', false); -/** A context key that is set when the find widget in integrated terminal is focused. */ -export const KEYBINDING_CONTEXT_TERMINAL_FIND_FOCUSED = new RawContextKey('terminalFindFocused', 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_INPUT_NOT_FOCUSED = KEYBINDING_CONTEXT_TERMINAL_FIND_INPUT_FOCUSED.toNegated(); - -export const KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED = new RawContextKey('terminalProcessSupported', false); - -export const IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY = 'terminal.integrated.isWorkspaceShellAllowed'; -export const NEVER_MEASURE_RENDER_TIME_STORAGE_KEY = 'terminal.integrated.neverMeasureRenderTime'; - -export const TERMINAL_CREATION_COMMANDS = ['workbench.action.terminal.toggleTerminal', 'workbench.action.terminal.new', 'workbench.action.togglePanel', 'workbench.action.terminal.focus']; - -export const TerminalCursorStyle = { - BLOCK: 'block', - LINE: 'line', - UNDERLINE: 'underline' -}; - -export const TERMINAL_CONFIG_SECTION = 'terminal.integrated'; - -export const TERMINAL_ACTION_CATEGORY = nls.localize('terminalCategory', "Terminal"); - -export const DEFAULT_LETTER_SPACING = 0; -export const MINIMUM_LETTER_SPACING = -5; -export const DEFAULT_LINE_HEIGHT = 1; - -export const MINIMUM_FONT_WEIGHT = 1; -export const MAXIMUM_FONT_WEIGHT = 1000; -export const DEFAULT_FONT_WEIGHT = 'normal'; -export const DEFAULT_BOLD_FONT_WEIGHT = 'bold'; -export const SUGGESTIONS_FONT_WEIGHT = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900']; - -export type FontWeight = 'normal' | 'bold' | number; - -export interface ITerminalConfiguration { - shell: { - linux: string | null; - osx: string | null; - windows: string | null; - }; - automationShell: { - linux: string | null; - osx: string | null; - windows: string | null; - }; - shellArgs: { - linux: string[]; - osx: string[]; - windows: string[]; - }; - altClickMovesCursor: boolean; - macOptionIsMeta: boolean; - macOptionClickForcesSelection: boolean; - rendererType: 'auto' | 'canvas' | 'dom' | 'experimentalWebgl'; - rightClickBehavior: 'default' | 'copyPaste' | 'paste' | 'selectWord'; - cursorBlinking: boolean; - cursorStyle: string; - cursorWidth: number; - drawBoldTextInBrightColors: boolean; - fastScrollSensitivity: number; - fontFamily: string; - fontWeight: FontWeight; - fontWeightBold: FontWeight; - minimumContrastRatio: number; - mouseWheelScrollSensitivity: number; - sendKeybindingsToShell: boolean; - // fontLigatures: boolean; - fontSize: number; - letterSpacing: number; - lineHeight: number; - detectLocale: 'auto' | 'off' | 'on'; - scrollback: number; - commandsToSkipShell: string[]; - allowChords: boolean; - allowMnemonics: boolean; - cwd: string; - confirmOnExit: boolean; - enableBell: boolean; - inheritEnv: boolean; - env: { - linux: { [key: string]: string }; - osx: { [key: string]: string }; - windows: { [key: string]: string }; - }; - environmentChangesIndicator: 'off' | 'on' | 'warnonly'; - showExitAlert: boolean; - splitCwd: 'workspaceRoot' | 'initial' | 'inherited'; - windowsEnableConpty: boolean; - wordSeparators: string; - experimentalUseTitleEvent: boolean; - enableFileLinks: boolean; - unicodeVersion: '6' | '11'; - experimentalLinkProvider: boolean; - localEchoLatencyThreshold: number; - localEchoExcludePrograms: ReadonlyArray; - localEchoStyle: 'bold' | 'dim' | 'italic' | 'underlined' | 'inverted' | string; - serverSpawn: boolean; - mainSpawn: boolean; - enablePersistentSessions: boolean; - flowControl: boolean; -} - -export const DEFAULT_LOCAL_ECHO_EXCLUDE: ReadonlyArray = ['vim', 'vi', 'nano', 'tmux']; - -export interface ITerminalConfigHelper { - config: ITerminalConfiguration; - - onWorkspacePermissionsChanged: Event; - - configFontIsMonospace(): boolean; - getFont(): ITerminalFont; - /** Sets whether a workspace shell configuration is allowed or not */ - setWorkspaceShellAllowed(isAllowed: boolean): void; - checkWorkspaceShellPermissions(osOverride?: OperatingSystem): boolean; - showRecommendations(shellLaunchConfig: IShellLaunchConfig): void; -} - -export interface ITerminalFont { - fontFamily: string; - fontSize: number; - letterSpacing: number; - lineHeight: number; - charWidth?: number; - charHeight?: number; -} - -export interface IRemoteTerminalAttachTarget { - id: number; - pid: number; - title: string; - cwd: string; - workspaceId: string; - workspaceName: string; - isOrphan: boolean; -} - -export interface IRawTerminalInstanceLayoutInfo { - relativeSize: number; - terminal: T; -} - -export type ITerminalInstanceLayoutInfoById = IRawTerminalInstanceLayoutInfo; -export type ITerminalInstanceLayoutInfo = IRawTerminalInstanceLayoutInfo; - -export interface IRawTerminalTabLayoutInfo { - isActive: boolean; - activeTerminalProcessId: number; - terminals: IRawTerminalInstanceLayoutInfo[]; -} - -export type ITerminalTabLayoutInfoById = IRawTerminalTabLayoutInfo; -export type ITerminalTabLayoutInfo = IRawTerminalTabLayoutInfo; - -export interface IRawTerminalsLayoutInfo { - tabs: IRawTerminalTabLayoutInfo[]; -} - -export type ITerminalsLayoutInfo = IRawTerminalsLayoutInfo; -export type ITerminalsLayoutInfoById = IRawTerminalsLayoutInfo; - -/** - * Provides access to native Windows calls that can be injected into non-native layers. - */ -export interface ITerminalNativeWindowsDelegate { - /** - * Gets the Windows build number, eg. this would be `19041` for Windows 10 version 2004 - */ - getWindowsBuildNumber(): number; - /** - * Converts a regular Windows path into the WSL path equivalent, eg. `C:\` -> `/mnt/c` - * @param path The Windows path. - */ - getWslPath(path: string): Promise; -} - -export interface IShellDefinition { - label: string; - path: string; -} - -export interface ICommandTracker { - scrollToPreviousCommand(): void; - scrollToNextCommand(): void; - selectToPreviousCommand(): void; - selectToNextCommand(): void; - selectToPreviousLine(): void; - selectToNextLine(): void; -} - -export interface INavigationMode { - exitNavigationMode(): void; - focusPreviousLine(): void; - focusNextLine(): void; -} - -export interface IBeforeProcessDataEvent { - /** - * The data of the event, this can be modified by the event listener to change what gets sent - * to the terminal. - */ - data: string; -} - -export interface ITerminalProcessManager extends IDisposable { - readonly processState: ProcessState; - readonly ptyProcessReady: Promise; - readonly shellProcessId: number | undefined; - readonly remoteAuthority: string | undefined; - readonly os: OperatingSystem | undefined; - readonly userHome: string | undefined; - readonly environmentVariableInfo: IEnvironmentVariableInfo | undefined; - readonly remoteTerminalId: number | undefined; - /** Whether the process has had data written to it yet. */ - readonly hasWrittenData: boolean; - - readonly onProcessReady: Event; - readonly onBeforeProcessData: Event; - readonly onProcessData: Event; - readonly onProcessTitle: Event; - readonly onProcessExit: Event; - readonly onProcessOverrideDimensions: Event; - readonly onProcessResolvedShellLaunchConfig: Event; - readonly onEnvironmentVariableInfoChanged: Event; - - dispose(immediate?: boolean): void; - createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number, isScreenReaderModeEnabled: boolean): Promise; - write(data: string): void; - setDimensions(cols: number, rows: number): void; - acknowledgeDataEvent(charCount: number): void; - - getInitialCwd(): Promise; - getCwd(): Promise; - getLatency(): Promise; -} - -export const 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 -} - -export interface ITerminalProcessExtHostProxy extends IDisposable { - readonly terminalId: number; - - emitData(data: string): void; - emitTitle(title: string): void; - emitReady(pid: number, cwd: string): void; - emitExit(exitCode: number | undefined): void; - emitOverrideDimensions(dimensions: ITerminalDimensions | undefined): void; - emitResolvedShellLaunchConfig(shellLaunchConfig: IShellLaunchConfig): void; - emitInitialCwd(initialCwd: string): void; - emitCwd(cwd: string): void; - emitLatency(latency: number): void; - - onInput: Event; - onResize: Event<{ cols: number, rows: number }>; - onAcknowledgeDataEvent: Event; - onShutdown: Event; - onRequestInitialCwd: Event; - onRequestCwd: Event; - onRequestLatency: Event; -} - -export interface ISpawnExtHostProcessRequest { - proxy: ITerminalProcessExtHostProxy; - shellLaunchConfig: IShellLaunchConfig; - activeWorkspaceRootUri: URI | undefined; - cols: number; - rows: number; - isWorkspaceShellAllowed: boolean; - callback: (error: ITerminalLaunchError | undefined) => void; -} - -export interface IStartExtensionTerminalRequest { - proxy: ITerminalProcessExtHostProxy; - cols: number; - rows: number; - callback: (error: ITerminalLaunchError | undefined) => void; -} - -export interface IAvailableShellsRequest { - callback: (shells: IShellDefinition[]) => void; -} - -export interface IDefaultShellAndArgsRequest { - useAutomationShell: boolean; - callback: (shell: string, args: string[] | string | undefined) => void; -} - -export enum LinuxDistro { - Fedora, - Ubuntu, - Unknown -} - -export enum TitleEventSource { - /** From the API or the rename command that overrides any other type */ - Api, - /** From the process name property*/ - Process, - /** From the VT sequence */ - Sequence -} - -export interface IWindowsShellHelper extends IDisposable { - readonly onShellNameChange: Event; - - getShellName(): Promise; -} - -export const enum TERMINAL_COMMAND_ID { - FIND_NEXT = 'workbench.action.terminal.findNext', - FIND_PREVIOUS = 'workbench.action.terminal.findPrevious', - TOGGLE = 'workbench.action.terminal.toggleTerminal', - KILL = 'workbench.action.terminal.kill', - QUICK_KILL = 'workbench.action.terminal.quickKill', - CONFIGURE_TERMINAL_SETTINGS = 'workbench.action.terminal.openSettings', - COPY_SELECTION = 'workbench.action.terminal.copySelection', - SELECT_ALL = 'workbench.action.terminal.selectAll', - DELETE_WORD_LEFT = 'workbench.action.terminal.deleteWordLeft', - DELETE_WORD_RIGHT = 'workbench.action.terminal.deleteWordRight', - DELETE_TO_LINE_START = 'workbench.action.terminal.deleteToLineStart', - MOVE_TO_LINE_START = 'workbench.action.terminal.moveToLineStart', - MOVE_TO_LINE_END = 'workbench.action.terminal.moveToLineEnd', - NEW = 'workbench.action.terminal.new', - NEW_WITH_CWD = 'workbench.action.terminal.newWithCwd', - NEW_LOCAL = 'workbench.action.terminal.newLocal', - NEW_IN_ACTIVE_WORKSPACE = 'workbench.action.terminal.newInActiveWorkspace', - SPLIT = 'workbench.action.terminal.split', - SPLIT_IN_ACTIVE_WORKSPACE = 'workbench.action.terminal.splitInActiveWorkspace', - RELAUNCH = 'workbench.action.terminal.relaunch', - FOCUS_PREVIOUS_PANE = 'workbench.action.terminal.focusPreviousPane', - FOCUS_NEXT_PANE = 'workbench.action.terminal.focusNextPane', - RESIZE_PANE_LEFT = 'workbench.action.terminal.resizePaneLeft', - RESIZE_PANE_RIGHT = 'workbench.action.terminal.resizePaneRight', - RESIZE_PANE_UP = 'workbench.action.terminal.resizePaneUp', - RESIZE_PANE_DOWN = 'workbench.action.terminal.resizePaneDown', - FOCUS = 'workbench.action.terminal.focus', - FOCUS_NEXT = 'workbench.action.terminal.focusNext', - FOCUS_PREVIOUS = 'workbench.action.terminal.focusPrevious', - PASTE = 'workbench.action.terminal.paste', - SELECT_DEFAULT_SHELL = 'workbench.action.terminal.selectDefaultShell', - RUN_SELECTED_TEXT = 'workbench.action.terminal.runSelectedText', - RUN_ACTIVE_FILE = 'workbench.action.terminal.runActiveFile', - SWITCH_TERMINAL = 'workbench.action.terminal.switchTerminal', - SCROLL_DOWN_LINE = 'workbench.action.terminal.scrollDown', - SCROLL_DOWN_PAGE = 'workbench.action.terminal.scrollDownPage', - SCROLL_TO_BOTTOM = 'workbench.action.terminal.scrollToBottom', - SCROLL_UP_LINE = 'workbench.action.terminal.scrollUp', - SCROLL_UP_PAGE = 'workbench.action.terminal.scrollUpPage', - SCROLL_TO_TOP = 'workbench.action.terminal.scrollToTop', - CLEAR = 'workbench.action.terminal.clear', - CLEAR_SELECTION = 'workbench.action.terminal.clearSelection', - MANAGE_WORKSPACE_SHELL_PERMISSIONS = 'workbench.action.terminal.manageWorkspaceShellPermissions', - RENAME = 'workbench.action.terminal.rename', - RENAME_WITH_ARG = 'workbench.action.terminal.renameWithArg', - FIND_FOCUS = 'workbench.action.terminal.focusFind', - FIND_HIDE = 'workbench.action.terminal.hideFind', - QUICK_OPEN_TERM = 'workbench.action.quickOpenTerm', - SCROLL_TO_PREVIOUS_COMMAND = 'workbench.action.terminal.scrollToPreviousCommand', - SCROLL_TO_NEXT_COMMAND = 'workbench.action.terminal.scrollToNextCommand', - SELECT_TO_PREVIOUS_COMMAND = 'workbench.action.terminal.selectToPreviousCommand', - SELECT_TO_NEXT_COMMAND = 'workbench.action.terminal.selectToNextCommand', - SELECT_TO_PREVIOUS_LINE = 'workbench.action.terminal.selectToPreviousLine', - SELECT_TO_NEXT_LINE = 'workbench.action.terminal.selectToNextLine', - TOGGLE_ESCAPE_SEQUENCE_LOGGING = 'toggleEscapeSequenceLogging', - SEND_SEQUENCE = 'workbench.action.terminal.sendSequence', - TOGGLE_FIND_REGEX = 'workbench.action.terminal.toggleFindRegex', - TOGGLE_FIND_WHOLE_WORD = 'workbench.action.terminal.toggleFindWholeWord', - TOGGLE_FIND_CASE_SENSITIVE = 'workbench.action.terminal.toggleFindCaseSensitive', - NAVIGATION_MODE_EXIT = 'workbench.action.terminal.navigationModeExit', - NAVIGATION_MODE_FOCUS_NEXT = 'workbench.action.terminal.navigationModeFocusNext', - NAVIGATION_MODE_FOCUS_PREVIOUS = 'workbench.action.terminal.navigationModeFocusPrevious', - SHOW_ENVIRONMENT_INFORMATION = 'workbench.action.terminal.showEnvironmentInformation', - SEARCH_WORKSPACE = 'workbench.action.terminal.searchWorkspace', - ATTACH_TO_REMOTE_TERMINAL = 'workbench.action.terminal.attachToSession' -} - -export const DEFAULT_COMMANDS_TO_SKIP_SHELL: string[] = [ - TERMINAL_COMMAND_ID.CLEAR_SELECTION, - TERMINAL_COMMAND_ID.CLEAR, - TERMINAL_COMMAND_ID.COPY_SELECTION, - TERMINAL_COMMAND_ID.DELETE_TO_LINE_START, - TERMINAL_COMMAND_ID.DELETE_WORD_LEFT, - TERMINAL_COMMAND_ID.DELETE_WORD_RIGHT, - TERMINAL_COMMAND_ID.FIND_FOCUS, - TERMINAL_COMMAND_ID.FIND_HIDE, - TERMINAL_COMMAND_ID.FIND_NEXT, - TERMINAL_COMMAND_ID.FIND_PREVIOUS, - TERMINAL_COMMAND_ID.TOGGLE_FIND_REGEX, - TERMINAL_COMMAND_ID.TOGGLE_FIND_WHOLE_WORD, - TERMINAL_COMMAND_ID.TOGGLE_FIND_CASE_SENSITIVE, - TERMINAL_COMMAND_ID.FOCUS_NEXT_PANE, - TERMINAL_COMMAND_ID.FOCUS_NEXT, - TERMINAL_COMMAND_ID.FOCUS_PREVIOUS_PANE, - TERMINAL_COMMAND_ID.FOCUS_PREVIOUS, - TERMINAL_COMMAND_ID.FOCUS, - TERMINAL_COMMAND_ID.KILL, - TERMINAL_COMMAND_ID.MOVE_TO_LINE_END, - TERMINAL_COMMAND_ID.MOVE_TO_LINE_START, - TERMINAL_COMMAND_ID.NEW_IN_ACTIVE_WORKSPACE, - TERMINAL_COMMAND_ID.NEW, - TERMINAL_COMMAND_ID.PASTE, - TERMINAL_COMMAND_ID.RESIZE_PANE_DOWN, - TERMINAL_COMMAND_ID.RESIZE_PANE_LEFT, - TERMINAL_COMMAND_ID.RESIZE_PANE_RIGHT, - TERMINAL_COMMAND_ID.RESIZE_PANE_UP, - TERMINAL_COMMAND_ID.RUN_ACTIVE_FILE, - TERMINAL_COMMAND_ID.RUN_SELECTED_TEXT, - TERMINAL_COMMAND_ID.SCROLL_DOWN_LINE, - TERMINAL_COMMAND_ID.SCROLL_DOWN_PAGE, - TERMINAL_COMMAND_ID.SCROLL_TO_BOTTOM, - TERMINAL_COMMAND_ID.SCROLL_TO_NEXT_COMMAND, - TERMINAL_COMMAND_ID.SCROLL_TO_PREVIOUS_COMMAND, - TERMINAL_COMMAND_ID.SCROLL_TO_TOP, - TERMINAL_COMMAND_ID.SCROLL_UP_LINE, - TERMINAL_COMMAND_ID.SCROLL_UP_PAGE, - TERMINAL_COMMAND_ID.SEND_SEQUENCE, - TERMINAL_COMMAND_ID.SELECT_ALL, - TERMINAL_COMMAND_ID.SELECT_TO_NEXT_COMMAND, - TERMINAL_COMMAND_ID.SELECT_TO_NEXT_LINE, - TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_COMMAND, - TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_LINE, - TERMINAL_COMMAND_ID.SPLIT_IN_ACTIVE_WORKSPACE, - TERMINAL_COMMAND_ID.SPLIT, - TERMINAL_COMMAND_ID.TOGGLE, - TERMINAL_COMMAND_ID.NAVIGATION_MODE_EXIT, - TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_NEXT, - TERMINAL_COMMAND_ID.NAVIGATION_MODE_FOCUS_PREVIOUS, - 'editor.action.toggleTabFocusMode', - 'workbench.action.quickOpen', - 'workbench.action.quickOpenPreviousEditor', - 'workbench.action.showCommands', - 'workbench.action.tasks.build', - 'workbench.action.tasks.restartTask', - 'workbench.action.tasks.runTask', - 'workbench.action.tasks.reRunTask', - 'workbench.action.tasks.showLog', - 'workbench.action.tasks.showTasks', - 'workbench.action.tasks.terminate', - 'workbench.action.tasks.test', - 'workbench.action.toggleFullScreen', - 'workbench.action.terminal.focusAtIndex1', - 'workbench.action.terminal.focusAtIndex2', - 'workbench.action.terminal.focusAtIndex3', - 'workbench.action.terminal.focusAtIndex4', - 'workbench.action.terminal.focusAtIndex5', - 'workbench.action.terminal.focusAtIndex6', - 'workbench.action.terminal.focusAtIndex7', - 'workbench.action.terminal.focusAtIndex8', - 'workbench.action.terminal.focusAtIndex9', - 'workbench.action.focusSecondEditorGroup', - 'workbench.action.focusThirdEditorGroup', - 'workbench.action.focusFourthEditorGroup', - 'workbench.action.focusFifthEditorGroup', - 'workbench.action.focusSixthEditorGroup', - 'workbench.action.focusSeventhEditorGroup', - 'workbench.action.focusEighthEditorGroup', - 'workbench.action.focusNextPart', - 'workbench.action.focusPreviousPart', - 'workbench.action.nextPanelView', - 'workbench.action.previousPanelView', - 'workbench.action.nextSideBarView', - 'workbench.action.previousSideBarView', - 'workbench.action.debug.start', - 'workbench.action.debug.stop', - 'workbench.action.debug.run', - 'workbench.action.debug.restart', - 'workbench.action.debug.continue', - 'workbench.action.debug.pause', - 'workbench.action.debug.stepInto', - 'workbench.action.debug.stepOut', - 'workbench.action.debug.stepOver', - 'workbench.action.nextEditor', - 'workbench.action.previousEditor', - 'workbench.action.nextEditorInGroup', - 'workbench.action.previousEditorInGroup', - 'workbench.action.openNextRecentlyUsedEditor', - 'workbench.action.openPreviousRecentlyUsedEditor', - 'workbench.action.openNextRecentlyUsedEditorInGroup', - 'workbench.action.openPreviousRecentlyUsedEditorInGroup', - 'workbench.action.quickOpenPreviousRecentlyUsedEditor', - 'workbench.action.quickOpenLeastRecentlyUsedEditor', - 'workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup', - 'workbench.action.quickOpenLeastRecentlyUsedEditorInGroup', - 'workbench.action.focusActiveEditorGroup', - 'workbench.action.focusFirstEditorGroup', - 'workbench.action.focusLastEditorGroup', - 'workbench.action.firstEditorInGroup', - 'workbench.action.lastEditorInGroup', - 'workbench.action.navigateUp', - 'workbench.action.navigateDown', - 'workbench.action.navigateRight', - 'workbench.action.navigateLeft', - 'workbench.action.togglePanel', - 'workbench.action.quickOpenView', - 'workbench.action.toggleMaximizedPanel' -]; - -export interface ITerminalContributions { - types?: ITerminalTypeContribution[]; -} - -export interface ITerminalTypeContribution { - title: string; - command: string; -} - -export const terminalContributionsDescriptor: IExtensionPointDescriptor = { - extensionPoint: 'terminal', - defaultExtensionKind: 'workspace', - jsonSchema: { - description: nls.localize('vscode.extension.contributes.terminal', 'Contributes terminal functionality.'), - type: 'object', - properties: { - types: { - type: 'array', - description: nls.localize('vscode.extension.contributes.terminal.types', "Defines additional terminal types that the user can create."), - items: { - type: 'object', - required: ['command', 'title'], - properties: { - command: { - description: nls.localize('vscode.extension.contributes.terminal.types.command', "Command to execute when the user creates this type of terminal."), - type: 'string', - }, - title: { - description: nls.localize('vscode.extension.contributes.terminal.types.title', "Title for this type of terminal."), - type: 'string', - }, - }, - }, - }, - }, - }, -}; diff --git a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts index a0423eeac30..1f6cb1799d2 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts @@ -6,7 +6,7 @@ import { IConfigurationNode } from 'vs/platform/configuration/common/configurationRegistry'; import { localize } from 'vs/nls'; import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; -import { DEFAULT_LETTER_SPACING, DEFAULT_LINE_HEIGHT, TerminalCursorStyle, DEFAULT_COMMANDS_TO_SKIP_SHELL, SUGGESTIONS_FONT_WEIGHT, MINIMUM_FONT_WEIGHT, MAXIMUM_FONT_WEIGHT, DEFAULT_LOCAL_ECHO_EXCLUDE } from 'vs/workbench/contrib/terminal/common/terminal'; +import { DEFAULT_LETTER_SPACING, DEFAULT_LINE_HEIGHT, TerminalCursorStyle, DEFAULT_COMMANDS_TO_SKIP_SHELL, SUGGESTIONS_FONT_WEIGHT, MINIMUM_FONT_WEIGHT, MAXIMUM_FONT_WEIGHT, DEFAULT_LOCAL_ECHO_EXCLUDE } from 'vs/platform/terminal/common/terminal'; import { isMacintosh, isWindows, Platform } from 'vs/base/common/platform'; export const terminalConfiguration: IConfigurationNode = { diff --git a/src/vs/workbench/contrib/terminal/common/terminalContributionsDescriptor.ts b/src/vs/workbench/contrib/terminal/common/terminalContributionsDescriptor.ts new file mode 100644 index 00000000000..804cdb9cf79 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/common/terminalContributionsDescriptor.ts @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import { IExtensionPointDescriptor } from 'vs/workbench/services/extensions/common/extensionsRegistry'; + +export const terminalContributionsDescriptor: IExtensionPointDescriptor = { + extensionPoint: 'terminal', + defaultExtensionKind: 'workspace', + jsonSchema: { + description: nls.localize('vscode.extension.contributes.terminal', 'Contributes terminal functionality.'), + type: 'object', + properties: { + types: { + type: 'array', + description: nls.localize('vscode.extension.contributes.terminal.types', "Defines additional terminal types that the user can create."), + items: { + type: 'object', + required: ['command', 'title'], + properties: { + command: { + description: nls.localize('vscode.extension.contributes.terminal.types.command', "Command to execute when the user creates this type of terminal."), + type: 'string', + }, + title: { + description: nls.localize('vscode.extension.contributes.terminal.types.title', "Title for this type of terminal."), + type: 'string', + }, + }, + }, + }, + }, + }, +}; diff --git a/src/vs/workbench/contrib/terminal/common/terminalExtensionPoints.ts b/src/vs/workbench/contrib/terminal/common/terminalExtensionPoints.ts index 3bd6a63a328..cd274ab28f0 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalExtensionPoints.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalExtensionPoints.ts @@ -4,9 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as extensionsRegistry from 'vs/workbench/services/extensions/common/extensionsRegistry'; -import { ITerminalTypeContribution, ITerminalContributions, terminalContributionsDescriptor } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalTypeContribution, ITerminalContributions } from 'vs/platform/terminal/common/terminal'; import { flatten } from 'vs/base/common/arrays'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { terminalContributionsDescriptor } from 'vs/workbench/contrib/terminal/common/terminalContributionsDescriptor'; // terminal extension point export const terminalsExtPoint = extensionsRegistry.ExtensionsRegistry.registerExtensionPoint(terminalContributionsDescriptor); diff --git a/src/vs/workbench/contrib/terminal/common/terminalMenu.ts b/src/vs/workbench/contrib/terminal/common/terminalMenu.ts index 50f5c02979d..672d5e2364a 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalMenu.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalMenu.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; -import { KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; +import { KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED, TERMINAL_COMMAND_ID } from 'vs/platform/terminal/common/terminal'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; export function setupTerminalMenu() { diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts index 2b150def379..a920f10c1c5 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { IWindowsShellHelper, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IWindowsShellHelper, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, IShellLaunchConfig, ITerminalChildProcess } from 'vs/platform/terminal/common/terminal'; import { WindowsShellHelper } from 'vs/workbench/contrib/terminal/electron-browser/windowsShellHelper'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IProcessEnvironment, platform, Platform } from 'vs/base/common/platform'; @@ -22,7 +22,6 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { ILogService } from 'vs/platform/log/common/log'; import { getSystemShell } from 'vs/base/node/shell'; import { ILocalPtyService } from 'vs/platform/terminal/electron-sandbox/terminal'; -import { IShellLaunchConfig, ITerminalChildProcess } from 'vs/platform/terminal/common/terminal'; import { TerminalProcessMainProxy } from 'vs/workbench/contrib/terminal/electron-browser/terminalProcessMainProxy'; let Terminal: typeof XTermTerminal; diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalRemote.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalRemote.ts index 1547e863513..44aac09f8b8 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalRemote.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalRemote.ts @@ -7,7 +7,7 @@ import * as nls from 'vs/nls'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -import { TERMINAL_ACTION_CATEGORY, TitleEventSource, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; +import { TERMINAL_ACTION_CATEGORY, TitleEventSource, TERMINAL_COMMAND_ID } from 'vs/platform/terminal/common/terminal'; import { Action } from 'vs/base/common/actions'; import { URI } from 'vs/base/common/uri'; import { homedir } from 'os'; diff --git a/src/vs/workbench/contrib/terminal/electron-browser/windowsShellHelper.ts b/src/vs/workbench/contrib/terminal/electron-browser/windowsShellHelper.ts index b510486baaf..60933a754f5 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/windowsShellHelper.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/windowsShellHelper.ts @@ -5,7 +5,7 @@ import * as platform from 'vs/base/common/platform'; import { Emitter, Event } from 'vs/base/common/event'; -import { IWindowsShellHelper } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IWindowsShellHelper } from 'vs/platform/terminal/common/terminal'; import type { Terminal as XTermTerminal } from 'xterm'; import type * as WindowsProcessTreeType from 'windows-process-tree'; import { Disposable } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/contrib/terminal/node/terminal.ts b/src/vs/workbench/contrib/terminal/node/terminal.ts index 11e429a69d6..d9247ac2685 100644 --- a/src/vs/workbench/contrib/terminal/node/terminal.ts +++ b/src/vs/workbench/contrib/terminal/node/terminal.ts @@ -6,7 +6,7 @@ import * as fs from 'fs'; import * as platform from 'vs/base/common/platform'; import { SymlinkSupport } from 'vs/base/node/pfs'; -import { LinuxDistro, IShellDefinition } from 'vs/workbench/contrib/terminal/common/terminal'; +import { LinuxDistro, IShellDefinition } from 'vs/platform/terminal/common/terminal'; import { coalesce } from 'vs/base/common/arrays'; import { normalize, basename } from 'vs/base/common/path'; import { enumeratePowerShellInstallations } from 'vs/base/node/powershell'; diff --git a/src/vs/workbench/contrib/terminal/test/browser/terminalConfigHelper.test.ts b/src/vs/workbench/contrib/terminal/test/browser/terminalConfigHelper.test.ts index d2abd724811..e17375d6ac1 100644 --- a/src/vs/workbench/contrib/terminal/test/browser/terminalConfigHelper.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/terminalConfigHelper.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import { LinuxDistro } from 'vs/workbench/contrib/terminal/common/terminal'; +import { LinuxDistro } from 'vs/platform/terminal/common/terminal'; suite('Workbench - TerminalConfigHelper', () => { let fixture: HTMLElement; diff --git a/src/vs/workbench/contrib/terminal/test/browser/terminalTypeahead.test.ts b/src/vs/workbench/contrib/terminal/test/browser/terminalTypeahead.test.ts index 184af066d14..dd80dcb7362 100644 --- a/src/vs/workbench/contrib/terminal/test/browser/terminalTypeahead.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/terminalTypeahead.test.ts @@ -8,7 +8,7 @@ import { IBuffer, Terminal } from 'xterm'; import { SinonStub, stub, useFakeTimers } from 'sinon'; import { Emitter } from 'vs/base/common/event'; import { CharPredictState, IPrediction, PredictionStats, TypeAheadAddon } from 'vs/workbench/contrib/terminal/browser/terminalTypeAheadAddon'; -import { DEFAULT_LOCAL_ECHO_EXCLUDE, IBeforeProcessDataEvent, ITerminalConfiguration, ITerminalProcessManager } from 'vs/workbench/contrib/terminal/common/terminal'; +import { DEFAULT_LOCAL_ECHO_EXCLUDE, IBeforeProcessDataEvent, ITerminalConfiguration, ITerminalProcessManager } from 'vs/platform/terminal/common/terminal'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; diff --git a/src/vs/workbench/contrib/terminal/test/common/environmentVariableCollection.test.ts b/src/vs/workbench/contrib/terminal/test/common/environmentVariableCollection.test.ts index 7b0b6594d4a..7ff608d6dd2 100644 --- a/src/vs/workbench/contrib/terminal/test/common/environmentVariableCollection.test.ts +++ b/src/vs/workbench/contrib/terminal/test/common/environmentVariableCollection.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { deepStrictEqual, strictEqual } from 'assert'; -import { EnvironmentVariableMutatorType } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { EnvironmentVariableMutatorType } from 'vs/platform/terminal/common/environmentVariable'; import { IProcessEnvironment, isWindows } from 'vs/base/common/platform'; import { MergedEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariableCollection'; import { deserializeEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariableShared'; diff --git a/src/vs/workbench/contrib/terminal/test/common/environmentVariableService.test.ts b/src/vs/workbench/contrib/terminal/test/common/environmentVariableService.test.ts index ed3269a6b83..d6f3de149a7 100644 --- a/src/vs/workbench/contrib/terminal/test/common/environmentVariableService.test.ts +++ b/src/vs/workbench/contrib/terminal/test/common/environmentVariableService.test.ts @@ -6,7 +6,7 @@ import { deepStrictEqual } from 'assert'; import { TestExtensionService, TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; import { EnvironmentVariableService } from 'vs/workbench/contrib/terminal/common/environmentVariableService'; -import { EnvironmentVariableMutatorType, IEnvironmentVariableMutator } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { EnvironmentVariableMutatorType, IEnvironmentVariableMutator } from 'vs/platform/terminal/common/environmentVariable'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; diff --git a/src/vs/workbench/contrib/terminal/test/common/environmentVariableShared.test.ts b/src/vs/workbench/contrib/terminal/test/common/environmentVariableShared.test.ts index 1f4e518c58d..e4948bd44e0 100644 --- a/src/vs/workbench/contrib/terminal/test/common/environmentVariableShared.test.ts +++ b/src/vs/workbench/contrib/terminal/test/common/environmentVariableShared.test.ts @@ -5,7 +5,7 @@ import { deepStrictEqual } from 'assert'; import { deserializeEnvironmentVariableCollection, serializeEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariableShared'; -import { EnvironmentVariableMutatorType, IEnvironmentVariableMutator } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { EnvironmentVariableMutatorType, IEnvironmentVariableMutator } from 'vs/platform/terminal/common/environmentVariable'; suite('EnvironmentVariable - deserializeEnvironmentVariableCollection', () => { test('should construct correctly with 3 arguments', () => { diff --git a/src/vs/workbench/contrib/watermark/browser/watermark.ts b/src/vs/workbench/contrib/watermark/browser/watermark.ts index f08bda7c8fc..e6eead384da 100644 --- a/src/vs/workbench/contrib/watermark/browser/watermark.ts +++ b/src/vs/workbench/contrib/watermark/browser/watermark.ts @@ -22,7 +22,7 @@ import * as dom from 'vs/base/browser/dom'; import { KeybindingLabel } from 'vs/base/browser/ui/keybindingLabel/keybindingLabel'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal'; +import { TERMINAL_COMMAND_ID } from 'vs/platform/terminal/common/terminal'; import { assertIsDefined } from 'vs/base/common/types'; import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration'; import { NEW_UNTITLED_FILE_COMMAND_ID } from 'vs/workbench/contrib/files/browser/fileCommands';