Merge from vscode 7eaf220cafb9d9e901370ffce02229171cbf3ea6

This commit is contained in:
ADS Merger
2020-09-03 02:34:56 +00:00
committed by Anthony Dresser
parent 39d9eed585
commit a63578e6f7
519 changed files with 14338 additions and 6670 deletions

View File

@@ -3,7 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Terminal, IMarker, ITerminalAddon } from 'xterm';
import type { Terminal, IMarker, ITerminalAddon } from 'xterm';
import { ICommandTracker } from 'vs/workbench/contrib/terminal/common/terminal';
/**

View File

@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import { IContextKey } from 'vs/platform/contextkey/common/contextkey';
import { Terminal, ITerminalAddon } from 'xterm';
import type { Terminal, ITerminalAddon } from 'xterm';
import { addDisposableListener } from 'vs/base/browser/dom';
import { INavigationMode } from 'vs/workbench/contrib/terminal/common/terminal';

View File

@@ -3,7 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { ILinkProvider, ILink } from 'xterm';
import type { ILinkProvider, ILink } from 'xterm';
import { TerminalLink } from 'vs/workbench/contrib/terminal/browser/links/terminalLink';
export abstract class TerminalBaseLinkProvider implements ILinkProvider {

View File

@@ -3,7 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Terminal, IViewportRange, IBufferLine } from 'xterm';
import type { Terminal, IViewportRange, IBufferLine } from 'xterm';
import { getXtermLineContent, convertLinkRangeToBuffer } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers';
import { TerminalLink } from 'vs/workbench/contrib/terminal/browser/links/terminalLink';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';

View File

@@ -3,7 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { IViewportRange, IBufferRange, ILink, ILinkDecorations } from 'xterm';
import type { IViewportRange, IBufferRange, ILink, ILinkDecorations } from 'xterm';
import { DisposableStore } from 'vs/base/common/lifecycle';
import * as dom from 'vs/base/browser/dom';
import { RunOnceScheduler } from 'vs/base/common/async';

View File

@@ -3,7 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { IViewportRange, IBufferRange, IBufferLine, IBuffer, IBufferCellPosition } from 'xterm';
import type { IViewportRange, IBufferRange, IBufferLine, IBuffer, IBufferCellPosition } from 'xterm';
import { IRange } from 'vs/editor/common/core/range';
export function convertLinkRangeToBuffer(lines: IBufferLine[], bufferWidth: number, range: IRange, startLine: number) {
@@ -54,6 +54,12 @@ export function convertLinkRangeToBuffer(lines: IBufferLine[], bufferWidth: numb
const startLineOffset = (y === startWrappedLineCount - 1 ? startOffset : 0);
let lineOffset = 0;
const line = lines[y];
// Sanity check for line, apparently this can happen but it's not clear under what
// circumstances this happens. Continue on, skipping the remainder of start offset if this
// happens to minimize impact.
if (!line) {
break;
}
for (let x = start; x < Math.min(bufferWidth, lineLength + lineOffset + startLineOffset); x++) {
const cell = line.getCell(x)!;
const width = cell.getWidth();

View File

@@ -13,7 +13,7 @@ import { ITerminalProcessManager, ITerminalConfiguration, TERMINAL_CONFIG_SECTIO
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';
import { Terminal, IViewportRange, ILinkProvider } from 'xterm';
import type { Terminal, IViewportRange, ILinkProvider } from 'xterm';
import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts';
import { posix, win32 } from 'vs/base/common/path';
import { ITerminalExternalLinkProvider, ITerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal';

View File

@@ -3,7 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Terminal, IViewportRange, IBufferLine } from 'xterm';
import type { Terminal, IViewportRange, IBufferLine } from 'xterm';
import { ILinkComputerTarget, LinkComputer } from 'vs/editor/common/modes/linkComputer';
import { getXtermLineContent, convertLinkRangeToBuffer } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers';
import { TerminalLink, OPEN_FILE_LABEL } from 'vs/workbench/contrib/terminal/browser/links/terminalLink';

View File

@@ -3,7 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Terminal, IViewportRange, IBufferLine } from 'xterm';
import type { Terminal, IViewportRange, IBufferLine } from 'xterm';
import { getXtermLineContent, convertLinkRangeToBuffer } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers';
import { OperatingSystem } from 'vs/base/common/platform';
import { URI } from 'vs/base/common/uri';

View File

@@ -3,7 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Terminal, IViewportRange } from 'xterm';
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 { TerminalLink } from 'vs/workbench/contrib/terminal/browser/links/terminalLink';

View File

@@ -196,3 +196,7 @@
padding: 0 22px 0 6px;
}
/* HACK: Can remove when fixed upstream https://github.com/xtermjs/xterm.js/issues/3058 */
.xterm-helper-textarea {
border: 0px;
}

View File

@@ -21,7 +21,7 @@ import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/wor
import { Extensions as ViewContainerExtensions, IViewContainersRegistry, ViewContainerLocation, IViewsRegistry } from 'vs/workbench/common/views';
import { registerTerminalActions, ClearTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, KillTerminalAction, SelectAllTerminalAction, SelectDefaultShellWindowsTerminalAction, SplitInActiveWorkspaceTerminalAction, SplitTerminalAction, TerminalPasteAction, ToggleTerminalAction, 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, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal';
import { KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_VIEW_ID, TERMINAL_ACTION_CATEGORY, TERMINAL_COMMAND_ID, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED } from 'vs/workbench/contrib/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';
@@ -84,7 +84,7 @@ Registry.as<IViewsRegistry>(ViewContainerExtensions.ViewsRegistry).registerViews
const actionRegistry = Registry.as<IWorkbenchActionRegistry>(ActionExtensions.WorkbenchActions);
registerTerminalActions();
const category = TERMINAL_ACTION_CATEGORY;
actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(KillTerminalAction), 'Terminal: Kill the Active Terminal Instance', category);
actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(KillTerminalAction), 'Terminal: Kill the Active Terminal Instance', category, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED);
actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(CreateNewTerminalAction, {
primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.US_BACKTICK,
mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.US_BACKTICK }
@@ -97,7 +97,7 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(SelectAllTermin
// behavior anyway when handed to xterm.js, having this handled by VS Code
// makes it easier for users to see how it works though.
mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_A }
}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Select All', category);
}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Select All', category, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED);
actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(ToggleTerminalAction, {
primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK,
mac: { primary: KeyMod.WinCtrl | KeyCode.US_BACKTICK }
@@ -107,16 +107,16 @@ actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(ToggleTerminalA
actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(ClearTerminalAction, {
primary: 0,
mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_K }
}, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KeybindingWeight.WorkbenchContrib + 1), 'Terminal: Clear', category);
actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(SelectDefaultShellWindowsTerminalAction), 'Terminal: Select Default Shell', category);
}, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KeybindingWeight.WorkbenchContrib + 1), 'Terminal: Clear', category, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED);
actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(SelectDefaultShellWindowsTerminalAction), 'Terminal: Select Default Shell', category, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED);
actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(SplitTerminalAction, {
primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_5,
mac: {
primary: KeyMod.CtrlCmd | KeyCode.US_BACKSLASH,
secondary: [KeyMod.WinCtrl | KeyMod.Shift | KeyCode.KEY_5]
}
}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Split Terminal', category);
actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(SplitInActiveWorkspaceTerminalAction), 'Terminal: Split Terminal (In Active Workspace)', category);
}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Split Terminal', category, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED);
actionRegistry.registerWorkbenchAction(SyncActionDescriptor.from(SplitInActiveWorkspaceTerminalAction), 'Terminal: Split Terminal (In Active Workspace)', category, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED);
// Commands might be affected by Web restrictons
if (BrowserFeatures.clipboard.writeText) {
@@ -124,7 +124,7 @@ if (BrowserFeatures.clipboard.writeText) {
primary: KeyMod.CtrlCmd | KeyCode.KEY_C,
win: { primary: KeyMod.CtrlCmd | KeyCode.KEY_C, secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_C] },
linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_C }
}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FOCUS)), 'Terminal: Copy Selection', category);
}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FOCUS)), 'Terminal: Copy Selection', category, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED);
}
function registerSendSequenceKeybinding(text: string, rule: { when?: ContextKeyExpression } & IKeybindings): void {
@@ -149,7 +149,7 @@ if (BrowserFeatures.clipboard.readText) {
primary: KeyMod.CtrlCmd | KeyCode.KEY_V,
win: { primary: KeyMod.CtrlCmd | KeyCode.KEY_V, secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_V] },
linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_V }
}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Paste into Active Terminal', category);
}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Paste into Active Terminal', category, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED);
// An extra Windows-only ctrl+v keybinding is used for pwsh that sends ctrl+v directly to the
// shell, this gets handled by PSReadLine which properly handles multi-line pastes. This is
// disabled in accessibility mode as PowerShell does not run PSReadLine when it detects a screen

View File

@@ -3,10 +3,10 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Terminal as XTermTerminal } from 'xterm';
import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search';
import { Unicode11Addon as XTermUnicode11Addon } from 'xterm-addon-unicode11';
import { WebglAddon as XTermWebglAddon } from 'xterm-addon-webgl';
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, ITerminalChildProcess, IShellLaunchConfig, IDefaultShellAndArgsRequest, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, IAvailableShellsRequest, ITerminalProcessExtHostProxy, ICommandTracker, INavigationMode, TitleEventSource, ITerminalDimensions, ITerminalLaunchError, ITerminalNativeWindowsDelegate, LinuxDistro } from 'vs/workbench/contrib/terminal/common/terminal';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
import { IProcessEnvironment, Platform } from 'vs/base/common/platform';
@@ -76,6 +76,7 @@ export interface ITerminalService {
configHelper: ITerminalConfigHelper;
terminalInstances: ITerminalInstance[];
terminalTabs: ITerminalTab[];
isProcessSupportRegistered: boolean;
onActiveTabChanged: Event<void>;
onTabDisposed: Event<ITerminalTab>;
@@ -90,6 +91,7 @@ export interface ITerminalService {
onInstanceTitleChanged: Event<ITerminalInstance>;
onActiveInstanceChanged: Event<ITerminalInstance | undefined>;
onRequestAvailableShells: Event<IAvailableShellsRequest>;
onDidRegisterProcessSupport: Event<void>;
/**
* Creates a terminal.
@@ -136,6 +138,7 @@ export interface ITerminalService {
findNext(): void;
findPrevious(): void;
registerProcessSupport(isSupported: boolean): void;
/**
* Registers a link provider that enables integrators to add links to the terminal.
* @param linkProvider When registered, the link provider is asked whenever a cell is hovered

View File

@@ -6,7 +6,7 @@
import { Action, IAction } from 'vs/base/common/actions';
import { EndOfLinePreference } from 'vs/editor/common/model';
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
import { TERMINAL_VIEW_ID, ITerminalConfigHelper, TitleEventSource, TERMINAL_COMMAND_ID, KEYBINDING_CONTEXT_TERMINAL_FIND_FOCUSED, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FIND_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS } from 'vs/workbench/contrib/terminal/common/terminal';
import { TERMINAL_VIEW_ID, ITerminalConfigHelper, TitleEventSource, TERMINAL_COMMAND_ID, KEYBINDING_CONTEXT_TERMINAL_FIND_FOCUSED, TERMINAL_ACTION_CATEGORY, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FIND_NOT_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED } from 'vs/workbench/contrib/terminal/common/terminal';
import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService';
import { attachSelectBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler';
import { IThemeService } from 'vs/platform/theme/common/themeService';
@@ -84,7 +84,7 @@ export class ToggleTerminalAction extends ToggleViewAction {
}
async run() {
if (this.terminalService.terminalInstances.length === 0) {
if (this.terminalService.isProcessSupportRegistered && this.terminalService.terminalInstances.length === 0) {
// If there is not yet an instance attempt to create it here so that we can suggest a
// new shell on Windows (and not do so when the panel is restored on reload).
const newTerminalInstance = this.terminalService.createTerminal(undefined);
@@ -201,23 +201,25 @@ export class CreateNewTerminalAction extends Action {
}
}
let instance: ITerminalInstance | undefined;
if (folders.length <= 1) {
// Allow terminal service to handle the path when there is only a
// single root
instance = this._terminalService.createTerminal(undefined);
} else {
const options: IPickOptions<IQuickPickItem> = {
placeHolder: localize('workbench.action.terminal.newWorkspacePlaceholder', "Select current working directory for new terminal")
};
const workspace = await this._commandService.executeCommand(PICK_WORKSPACE_FOLDER_COMMAND_ID, [options]);
if (!workspace) {
// Don't create the instance if the workspace picker was canceled
return;
if (this._terminalService.isProcessSupportRegistered) {
let instance: ITerminalInstance | undefined;
if (folders.length <= 1) {
// Allow terminal service to handle the path when there is only a
// single root
instance = this._terminalService.createTerminal(undefined);
} else {
const options: IPickOptions<IQuickPickItem> = {
placeHolder: localize('workbench.action.terminal.newWorkspacePlaceholder', "Select current working directory for new terminal")
};
const workspace = await this._commandService.executeCommand(PICK_WORKSPACE_FOLDER_COMMAND_ID, [options]);
if (!workspace) {
// Don't create the instance if the workspace picker was canceled
return;
}
instance = this._terminalService.createTerminal({ cwd: workspace.uri });
}
instance = this._terminalService.createTerminal({ cwd: workspace.uri });
this._terminalService.setActiveInstance(instance);
}
this._terminalService.setActiveInstance(instance);
await this._terminalService.showPanel(true);
}
}
@@ -367,7 +369,7 @@ export class SwitchTerminalActionViewItem extends SelectActionViewItem {
this._register(_terminalService.onActiveTabChanged(this._updateItems, this));
this._register(_terminalService.onInstanceTitleChanged(this._updateItems, this));
this._register(_terminalService.onTabDisposed(this._updateItems, this));
this._register(attachSelectBoxStyler(this.selectBox, _themeService));
this._register(attachSelectBoxStyler(this.selectBox, this._themeService));
}
render(container: HTMLElement): void {
@@ -442,11 +444,13 @@ export function registerTerminalActions() {
}
async run(accessor: ServicesAccessor) {
const terminalService = accessor.get(ITerminalService);
const instance = terminalService.createTerminal(undefined);
if (!instance) {
return;
if (terminalService.isProcessSupportRegistered) {
const instance = terminalService.createTerminal(undefined);
if (!instance) {
return;
}
terminalService.setActiveInstance(instance);
}
terminalService.setActiveInstance(instance);
await terminalService.showPanel(true);
}
});
@@ -466,7 +470,8 @@ export function registerTerminalActions() {
},
when: KEYBINDING_CONTEXT_TERMINAL_FOCUS,
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
async run(accessor: ServicesAccessor) {
@@ -491,7 +496,8 @@ export function registerTerminalActions() {
},
when: KEYBINDING_CONTEXT_TERMINAL_FOCUS,
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
async run(accessor: ServicesAccessor) {
@@ -512,7 +518,8 @@ export function registerTerminalActions() {
mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.LeftArrow },
when: KEYBINDING_CONTEXT_TERMINAL_FOCUS,
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
async run(accessor: ServicesAccessor) {
@@ -531,7 +538,8 @@ export function registerTerminalActions() {
mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.RightArrow },
when: KEYBINDING_CONTEXT_TERMINAL_FOCUS,
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
async run(accessor: ServicesAccessor) {
@@ -549,7 +557,8 @@ export function registerTerminalActions() {
mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.UpArrow },
when: KEYBINDING_CONTEXT_TERMINAL_FOCUS,
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
async run(accessor: ServicesAccessor) {
@@ -567,7 +576,8 @@ export function registerTerminalActions() {
mac: { primary: KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.DownArrow },
when: KEYBINDING_CONTEXT_TERMINAL_FOCUS,
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
async run(accessor: ServicesAccessor) {
@@ -580,7 +590,8 @@ export function registerTerminalActions() {
id: TERMINAL_COMMAND_ID.FOCUS,
title: { value: localize('workbench.action.terminal.focus', "Focus Terminal"), original: 'Focus Terminal' },
f1: true,
category
category,
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
async run(accessor: ServicesAccessor) {
@@ -599,7 +610,8 @@ export function registerTerminalActions() {
id: TERMINAL_COMMAND_ID.FOCUS_NEXT,
title: { value: localize('workbench.action.terminal.focusNext', "Focus Next Terminal"), original: 'Focus Next Terminal' },
f1: true,
category
category,
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
async run(accessor: ServicesAccessor) {
@@ -614,7 +626,8 @@ export function registerTerminalActions() {
id: TERMINAL_COMMAND_ID.FOCUS_PREVIOUS,
title: { value: localize('workbench.action.terminal.focusPrevious', "Focus Previous Terminal"), original: 'Focus Previous Terminal' },
f1: true,
category
category,
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
async run(accessor: ServicesAccessor) {
@@ -629,7 +642,8 @@ export function registerTerminalActions() {
id: TERMINAL_COMMAND_ID.RUN_SELECTED_TEXT,
title: { value: localize('workbench.action.terminal.runSelectedText', "Run Selected Text In Active Terminal"), original: 'Run Selected Text In Active Terminal' },
f1: true,
category
category,
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
async run(accessor: ServicesAccessor) {
@@ -659,7 +673,8 @@ export function registerTerminalActions() {
id: TERMINAL_COMMAND_ID.RUN_ACTIVE_FILE,
title: { value: localize('workbench.action.terminal.runActiveFile', "Run Active File In Active Terminal"), original: 'Run Active File In Active Terminal' },
f1: true,
category
category,
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
async run(accessor: ServicesAccessor) {
@@ -699,7 +714,8 @@ export function registerTerminalActions() {
linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.DownArrow },
when: KEYBINDING_CONTEXT_TERMINAL_FOCUS,
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -718,7 +734,8 @@ export function registerTerminalActions() {
mac: { primary: KeyCode.PageDown },
when: KEYBINDING_CONTEXT_TERMINAL_FOCUS,
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -737,7 +754,8 @@ export function registerTerminalActions() {
linux: { primary: KeyMod.Shift | KeyCode.End },
when: KEYBINDING_CONTEXT_TERMINAL_FOCUS,
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -756,7 +774,8 @@ export function registerTerminalActions() {
linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.UpArrow },
when: KEYBINDING_CONTEXT_TERMINAL_FOCUS,
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -775,7 +794,8 @@ export function registerTerminalActions() {
mac: { primary: KeyCode.PageUp },
when: KEYBINDING_CONTEXT_TERMINAL_FOCUS,
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -794,7 +814,8 @@ export function registerTerminalActions() {
linux: { primary: KeyMod.Shift | KeyCode.Home },
when: KEYBINDING_CONTEXT_TERMINAL_FOCUS,
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -812,7 +833,8 @@ export function registerTerminalActions() {
primary: KeyCode.Escape,
when: ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED),
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -833,7 +855,8 @@ export function registerTerminalActions() {
ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED)
),
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -854,7 +877,8 @@ export function registerTerminalActions() {
ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED)
),
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -872,7 +896,8 @@ export function registerTerminalActions() {
primary: KeyCode.Escape,
when: ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FIND_NOT_VISIBLE),
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -888,7 +913,8 @@ export function registerTerminalActions() {
id: TERMINAL_COMMAND_ID.MANAGE_WORKSPACE_SHELL_PERMISSIONS,
title: { value: localize('workbench.action.terminal.manageWorkspaceShellPermissions', "Manage Workspace Shell Permissions"), original: 'Manage Workspace Shell Permissions' },
f1: true,
category
category,
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -901,7 +927,8 @@ export function registerTerminalActions() {
id: TERMINAL_COMMAND_ID.RENAME,
title: { value: localize('workbench.action.terminal.rename', "Rename"), original: 'Rename' },
f1: true,
category
category,
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
async run(accessor: ServicesAccessor) {
@@ -927,7 +954,8 @@ export function registerTerminalActions() {
primary: KeyMod.CtrlCmd | KeyCode.KEY_F,
when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FIND_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FOCUS),
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -946,7 +974,8 @@ export function registerTerminalActions() {
secondary: [KeyMod.Shift | KeyCode.Escape],
when: ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE),
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -959,7 +988,8 @@ export function registerTerminalActions() {
id: TERMINAL_COMMAND_ID.QUICK_OPEN_TERM,
title: { value: localize('quickAccessTerminal', "Switch Active Terminal"), original: 'Switch Active Terminal' },
f1: true,
category
category,
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -977,7 +1007,8 @@ export function registerTerminalActions() {
mac: { primary: KeyMod.CtrlCmd | KeyCode.UpArrow },
when: ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED.negate()),
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -998,7 +1029,8 @@ export function registerTerminalActions() {
mac: { primary: KeyMod.CtrlCmd | KeyCode.DownArrow },
when: ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, CONTEXT_ACCESSIBILITY_MODE_ENABLED.negate()),
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -1019,7 +1051,8 @@ export function registerTerminalActions() {
mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.UpArrow },
when: KEYBINDING_CONTEXT_TERMINAL_FOCUS,
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -1040,7 +1073,8 @@ export function registerTerminalActions() {
mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.DownArrow },
when: KEYBINDING_CONTEXT_TERMINAL_FOCUS,
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -1056,7 +1090,8 @@ export function registerTerminalActions() {
id: TERMINAL_COMMAND_ID.SELECT_TO_PREVIOUS_LINE,
title: { value: localize('workbench.action.terminal.selectToPreviousLine', "Select To Previous Line"), original: 'Select To Previous Line' },
f1: true,
category
category,
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -1072,7 +1107,8 @@ export function registerTerminalActions() {
id: TERMINAL_COMMAND_ID.SELECT_TO_NEXT_LINE,
title: { value: localize('workbench.action.terminal.selectToNextLine', "Select To Next Line"), original: 'Select To Next Line' },
f1: true,
category
category,
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -1088,7 +1124,8 @@ export function registerTerminalActions() {
id: TERMINAL_COMMAND_ID.TOGGLE_ESCAPE_SEQUENCE_LOGGING,
title: { value: localize('workbench.action.terminal.toggleEscapeSequenceLogging', "Toggle Escape Sequence Logging"), original: 'Toggle Escape Sequence Logging' },
f1: true,
category
category,
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -1114,7 +1151,8 @@ export function registerTerminalActions() {
},
}
}]
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor, args?: { text?: string }) {
@@ -1143,16 +1181,19 @@ export function registerTerminalActions() {
},
}
}]
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
async run(accessor: ServicesAccessor, args?: { cwd?: string }) {
const terminalService = accessor.get(ITerminalService);
const instance = terminalService.createTerminal({ cwd: args?.cwd });
if (!instance) {
return;
if (terminalService.isProcessSupportRegistered) {
const instance = terminalService.createTerminal({ cwd: args?.cwd });
if (!instance) {
return;
}
terminalService.setActiveInstance(instance);
}
terminalService.setActiveInstance(instance);
return terminalService.showPanel(true);
}
});
@@ -1179,7 +1220,8 @@ export function registerTerminalActions() {
}
}
}]
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor, args?: { name?: string }) {
@@ -1203,7 +1245,8 @@ export function registerTerminalActions() {
mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_R },
when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_FOCUSED),
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -1224,6 +1267,7 @@ export function registerTerminalActions() {
when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_FOCUSED),
weight: KeybindingWeight.WorkbenchContrib
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -1243,7 +1287,8 @@ export function registerTerminalActions() {
mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_C },
when: ContextKeyExpr.or(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_FOCUSED),
weight: KeybindingWeight.WorkbenchContrib
}
},
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -1270,7 +1315,8 @@ export function registerTerminalActions() {
when: KEYBINDING_CONTEXT_TERMINAL_FIND_FOCUSED,
weight: KeybindingWeight.WorkbenchContrib
}
]
],
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -1296,7 +1342,8 @@ export function registerTerminalActions() {
when: KEYBINDING_CONTEXT_TERMINAL_FIND_FOCUSED,
weight: KeybindingWeight.WorkbenchContrib
}
]
],
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -1309,7 +1356,8 @@ export function registerTerminalActions() {
id: TERMINAL_COMMAND_ID.RELAUNCH,
title: { value: localize('workbench.action.terminal.relaunch', "Relaunch Active Terminal"), original: 'Relaunch Active Terminal' },
f1: true,
category
category,
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {
@@ -1322,7 +1370,8 @@ export function registerTerminalActions() {
id: TERMINAL_COMMAND_ID.SHOW_ENVIRONMENT_INFORMATION,
title: { value: localize('workbench.action.terminal.showEnvironmentInformation', "Show Environment Information"), original: 'Show Environment Information' },
f1: true,
category
category,
precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}
run(accessor: ServicesAccessor) {

View File

@@ -32,9 +32,9 @@ import { TerminalLinkManager } from 'vs/workbench/contrib/terminal/browser/links
import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility';
import { ITerminalInstanceService, ITerminalInstance, TerminalShellType, WindowsShellType, ITerminalExternalLinkProvider } from 'vs/workbench/contrib/terminal/browser/terminal';
import { TerminalProcessManager } from 'vs/workbench/contrib/terminal/browser/terminalProcessManager';
import { Terminal as XTermTerminal, IBuffer, ITerminalAddon } from 'xterm';
import { SearchAddon, ISearchOptions } from 'xterm-addon-search';
import { Unicode11Addon } from 'xterm-addon-unicode11';
import type { Terminal as XTermTerminal, IBuffer, ITerminalAddon } from 'xterm';
import type { SearchAddon, ISearchOptions } from 'xterm-addon-search';
import type { Unicode11Addon } from 'xterm-addon-unicode11';
import { CommandTrackerAddon } from 'vs/workbench/contrib/terminal/browser/addons/commandTrackerAddon';
import { NavigationModeAddon } from 'vs/workbench/contrib/terminal/browser/addons/navigationModeAddon';
import { XTermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private';
@@ -1128,9 +1128,9 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
if (!reset) {
// HACK: Force initialText to be non-falsy for reused terminals such that the
// conptyInheritCursor flag is passed to the node-pty, this flag can cause a Window to hang
// in Windows 10 1903 so we only want to use it when something is definitely written to the
// terminal.
// conptyInheritCursor flag is passed to the node-pty, this flag can cause a Window to stop
// responding in Windows 10 1903 so we only want to use it when something is definitely written
// to the terminal.
shell.initialText = ' ';
}

View File

@@ -5,10 +5,10 @@
import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal';
import { IWindowsShellHelper, ITerminalChildProcess, IDefaultShellAndArgsRequest } from 'vs/workbench/contrib/terminal/common/terminal';
import { Terminal as XTermTerminal } from 'xterm';
import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search';
import { Unicode11Addon as XTermUnicode11Addon } from 'xterm-addon-unicode11';
import { WebglAddon as XTermWebglAddon } from 'xterm-addon-webgl';
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 { IProcessEnvironment } from 'vs/base/common/platform';
import { Emitter, Event } from 'vs/base/common/event';
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';

View File

@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as nls from 'vs/nls';
import { TERMINAL_VIEW_ID, IShellLaunchConfig, ITerminalConfigHelper, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, IAvailableShellsRequest, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_IS_OPEN, ITerminalProcessExtHostProxy, IShellDefinition, LinuxDistro, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE, ITerminalLaunchError, ITerminalNativeWindowsDelegate } from 'vs/workbench/contrib/terminal/common/terminal';
import { TERMINAL_VIEW_ID, IShellLaunchConfig, ITerminalConfigHelper, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, IAvailableShellsRequest, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_IS_OPEN, KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED, ITerminalProcessExtHostProxy, IShellDefinition, LinuxDistro, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE, ITerminalLaunchError, ITerminalNativeWindowsDelegate } from 'vs/workbench/contrib/terminal/common/terminal';
import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey';
import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService';
import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle';
@@ -23,12 +23,13 @@ import { Event, Emitter } from 'vs/base/common/event';
import { URI } from 'vs/base/common/uri';
import { FindReplaceState } from 'vs/editor/contrib/find/findState';
import { escapeNonWindowsPath } from 'vs/workbench/contrib/terminal/common/terminalEnvironment';
import { isWindows, isMacintosh, OperatingSystem } from 'vs/base/common/platform';
import { isWindows, isMacintosh, OperatingSystem, isWeb } from 'vs/base/common/platform';
import { basename } from 'vs/base/common/path';
import { find } from 'vs/base/common/arrays';
import { timeout } from 'vs/base/common/async';
import { IViewsService, ViewContainerLocation, IViewDescriptorService } from 'vs/workbench/common/views';
import { IDisposable } from 'vs/base/common/lifecycle';
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
interface IExtHostReadyEntry {
promise: Promise<void>;
@@ -52,10 +53,12 @@ export class TerminalService implements ITerminalService {
private _activeTabIndex: number;
private _linkProviders: Set<ITerminalExternalLinkProvider> = new Set();
private _linkProviderDisposables: Map<ITerminalExternalLinkProvider, IDisposable[]> = new Map();
private _processSupportContextKey: IContextKey<boolean>;
public get activeTabIndex(): number { return this._activeTabIndex; }
public get terminalInstances(): ITerminalInstance[] { return this._terminalInstances; }
public get terminalTabs(): ITerminalTab[] { return this._terminalTabs; }
public get isProcessSupportRegistered(): boolean { return !!this._processSupportContextKey.get(); }
private _configHelper: TerminalConfigHelper;
private _terminalContainer: HTMLElement | undefined;
@@ -91,6 +94,8 @@ export class TerminalService implements ITerminalService {
public get onTabDisposed(): Event<ITerminalTab> { return this._onTabDisposed.event; }
private readonly _onRequestAvailableShells = new Emitter<IAvailableShellsRequest>();
public get onRequestAvailableShells(): Event<IAvailableShellsRequest> { return this._onRequestAvailableShells.event; }
private readonly _onDidRegisterProcessSupport = new Emitter<void>();
public get onDidRegisterProcessSupport(): Event<void> { return this._onDidRegisterProcessSupport.event; }
constructor(
@IContextKeyService private _contextKeyService: IContextKeyService,
@@ -103,7 +108,8 @@ export class TerminalService implements ITerminalService {
@IQuickInputService private _quickInputService: IQuickInputService,
@IConfigurationService private _configurationService: IConfigurationService,
@IViewsService private _viewsService: IViewsService,
@IViewDescriptorService private readonly _viewDescriptorService: IViewDescriptorService
@IViewDescriptorService private readonly _viewDescriptorService: IViewDescriptorService,
@IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService
) {
this._activeTabIndex = 0;
this._isShuttingDown = false;
@@ -121,7 +127,9 @@ export class TerminalService implements ITerminalService {
});
this.onInstanceLinksReady(instance => this._setInstanceLinkProviders(instance));
this._handleContextKeys();
this._handleInstanceContextKeys();
this._processSupportContextKey = KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED.bindTo(this._contextKeyService);
this._processSupportContextKey.set(!isWeb || this._remoteAgentService.getConnection() !== null);
}
public setNativeWindowsDelegate(delegate: ITerminalNativeWindowsDelegate): void {
@@ -132,13 +140,11 @@ export class TerminalService implements ITerminalService {
this._configHelper.setLinuxDistro(linuxDistro);
}
private _handleContextKeys(): void {
private _handleInstanceContextKeys(): void {
const terminalIsOpenContext = KEYBINDING_CONTEXT_TERMINAL_IS_OPEN.bindTo(this._contextKeyService);
const updateTerminalContextKeys = () => {
terminalIsOpenContext.set(this.terminalInstances.length > 0);
};
this.onInstancesChanged(() => updateTerminalContextKeys());
}
@@ -411,6 +417,14 @@ export class TerminalService implements ITerminalService {
instance.addDisposable(instance.onFocus(this._onActiveInstanceChanged.fire, this._onActiveInstanceChanged));
}
public registerProcessSupport(isSupported: boolean): void {
if (!isSupported) {
return;
}
this._processSupportContextKey.set(isSupported);
this._onDidRegisterProcessSupport.fire();
}
public registerLinkProvider(linkProvider: ITerminalExternalLinkProvider): IDisposable {
const disposables: IDisposable[] = [];
this._linkProviders.add(linkProvider);
@@ -593,6 +607,9 @@ export class TerminalService implements ITerminalService {
}
public createTerminal(shell: IShellLaunchConfig = {}): ITerminalInstance {
if (!this.isProcessSupportRegistered) {
throw new Error('Could not create terminal when process support is not registered');
}
if (shell.hideFromUser) {
const instance = this.createInstance(undefined, shell);
this._backgroundedTerminalInstances.push(instance);

View File

@@ -19,7 +19,6 @@ import { URI } from 'vs/base/common/uri';
import { TERMINAL_BACKGROUND_COLOR, TERMINAL_BORDER_COLOR } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry';
import { DataTransfers } from 'vs/base/browser/dnd';
import { INotificationService, IPromptChoice, Severity } from 'vs/platform/notification/common/notification';
import { IStorageService } from 'vs/platform/storage/common/storage';
import { ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal';
import { BrowserFeatures } from 'vs/base/browser/canIUse';
import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer';
@@ -56,14 +55,25 @@ export class TerminalViewPane extends ViewPane {
@IThemeService protected readonly themeService: IThemeService,
@ITelemetryService telemetryService: ITelemetryService,
@INotificationService private readonly _notificationService: INotificationService,
@IStorageService storageService: IStorageService,
@IOpenerService openerService: IOpenerService,
) {
super(options, keybindingService, _contextMenuService, configurationService, contextKeyService, viewDescriptorService, _instantiationService, openerService, themeService, telemetryService);
this._terminalService.onDidRegisterProcessSupport(() => {
if (this._actions) {
for (const action of this._actions) {
action.enabled = true;
}
}
this._onDidChangeViewWelcomeState.fire();
});
}
protected renderBody(container: HTMLElement): void {
super.renderBody(container);
if (this.shouldShowWelcome()) {
return;
}
this._parentDomElement = container;
dom.addClass(this._parentDomElement, 'integrated-terminal');
this._fontStyleElement = document.createElement('style');
@@ -120,6 +130,10 @@ export class TerminalViewPane extends ViewPane {
protected layoutBody(height: number, width: number): void {
super.layoutBody(height, width);
if (this.shouldShowWelcome()) {
return;
}
this._bodyDimensions.width = width;
this._bodyDimensions.height = height;
this._terminalService.terminalTabs.forEach(t => t.layout(width, height));
@@ -138,9 +152,12 @@ export class TerminalViewPane extends ViewPane {
this._splitTerminalAction,
this._instantiationService.createInstance(KillTerminalAction, KillTerminalAction.ID, KillTerminalAction.PANEL_LABEL)
];
this._actions.forEach(a => {
this._register(a);
});
for (const action of this._actions) {
if (!this._terminalService.isProcessSupportRegistered) {
action.enabled = false;
}
this._register(action);
}
}
return this._actions;
}
@@ -188,10 +205,7 @@ export class TerminalViewPane extends ViewPane {
}
public focus(): void {
const activeInstance = this._terminalService.getActiveInstance();
if (activeInstance) {
activeInstance.focusWhenReady(true);
}
this._terminalService.getActiveInstance()?.focusWhenReady(true);
}
public focusFindWidget() {
@@ -331,9 +345,11 @@ export class TerminalViewPane extends ViewPane {
theme = this.themeService.getColorTheme();
}
if (this._findWidget) {
this._findWidget.updateTheme(theme);
}
this._findWidget?.updateTheme(theme);
}
shouldShowWelcome(): boolean {
return !this._terminalService.isProcessSupportRegistered;
}
}

View File

@@ -8,7 +8,7 @@ import { IMarkdownString } from 'vs/base/common/htmlContent';
import { Widget } from 'vs/base/browser/ui/widget';
import { ITerminalWidget } from 'vs/workbench/contrib/terminal/browser/widgets/widgets';
import * as dom from 'vs/base/browser/dom';
import { IViewportRange } from 'xterm';
import type { IViewportRange } from 'xterm';
import { IHoverTarget, IHoverService } from 'vs/workbench/services/hover/browser/hover';
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
import { editorHoverHighlight } from 'vs/platform/theme/common/colorRegistry';

View File

@@ -12,7 +12,7 @@ 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';
export const TERMINAL_VIEW_ID = 'workbench.panel.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<boolean>('terminalIsOpen', false);
@@ -46,6 +46,8 @@ export const KEYBINDING_CONTEXT_TERMINAL_FIND_FOCUSED = new RawContextKey<boolea
/** 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<boolean>('terminalProcessSupported', false);
export const IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY = 'terminal.integrated.isWorkspaceShellAllowed';
export const NEVER_MEASURE_RENDER_TIME_STORAGE_KEY = 'terminal.integrated.neverMeasureRenderTime';

View File

@@ -93,7 +93,7 @@ export function shouldSetLangEnvVariable(env: platform.IProcessEnvironment, dete
return true;
}
if (detectLocale === 'auto') {
return !env['LANG'] || env['LANG'].search(/\.UTF\-8$/) === -1;
return !env['LANG'] || (env['LANG'].search(/\.UTF\-8$/) === -1 && env['LANG'].search(/\.utf8$/) === -1);
}
return false; // 'off'
}

View File

@@ -5,7 +5,7 @@
import * as nls from 'vs/nls';
import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions';
import { TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal';
import { KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminal';
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
export function setupTerminalMenu() {
@@ -38,7 +38,8 @@ export function setupTerminalMenu() {
title: nls.localize({ key: 'miSplitTerminal', comment: ['&& denotes a mnemonic'] }, "&&Split Terminal"),
precondition: ContextKeyExpr.has('terminalIsOpen')
},
order: 2
order: 2,
when: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
// Run
@@ -49,7 +50,8 @@ export function setupTerminalMenu() {
id: TERMINAL_COMMAND_ID.RUN_ACTIVE_FILE,
title: nls.localize({ key: 'miRunActiveFile', comment: ['&& denotes a mnemonic'] }, "Run &&Active File")
},
order: 3
order: 3,
when: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
MenuRegistry.appendMenuItem(MenuId.MenubarTerminalMenu, {
group: runGroup,
@@ -57,6 +59,7 @@ export function setupTerminalMenu() {
id: TERMINAL_COMMAND_ID.RUN_SELECTED_TEXT,
title: nls.localize({ key: 'miRunSelectedText', comment: ['&& denotes a mnemonic'] }, "Run &&Selected Text")
},
order: 4
order: 4,
when: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED
});
}

View File

@@ -10,10 +10,10 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti
import { IProcessEnvironment, platform, Platform } from 'vs/base/common/platform';
import { TerminalProcess } from 'vs/workbench/contrib/terminal/node/terminalProcess';
import { getSystemShell } from 'vs/workbench/contrib/terminal/node/terminal';
import { Terminal as XTermTerminal } from 'xterm';
import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search';
import { Unicode11Addon as XTermUnicode11Addon } from 'xterm-addon-unicode11';
import { WebglAddon as XTermWebglAddon } from 'xterm-addon-webgl';
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 { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { getDefaultShell, getDefaultShellArgs } from 'vs/workbench/contrib/terminal/common/terminalEnvironment';
import { StorageScope, IStorageService } from 'vs/platform/storage/common/storage';

View File

@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals';
import { IOpenFileRequest } from 'vs/platform/windows/common/windows';
import { INativeOpenFileRequest } from 'vs/platform/windows/common/windows';
import { URI } from 'vs/base/common/uri';
import { IFileService } from 'vs/platform/files/common/files';
import { getWindowsBuildNumber, linuxDistro } from 'vs/workbench/contrib/terminal/node/terminal';
@@ -15,7 +15,6 @@ import { registerRemoteContributions } from 'vs/workbench/contrib/terminal/elect
import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService';
import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron';
import { Disposable } from 'vs/base/common/lifecycle';
import { INativeOpenFileRequest } from 'vs/platform/windows/node/window';
import { ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal';
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
@@ -31,7 +30,7 @@ export class TerminalNativeContribution extends Disposable implements IWorkbench
) {
super();
ipcRenderer.on('vscode:openFiles', (_: unknown, request: IOpenFileRequest) => this._onOpenFileRequest(request));
ipcRenderer.on('vscode:openFiles', (_: unknown, request: INativeOpenFileRequest) => this._onOpenFileRequest(request));
this._register(electronService.onOSResume(() => this._onOsResume()));
this._terminalService.setLinuxDistro(linuxDistro);

View File

@@ -6,8 +6,8 @@
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 { Terminal as XTermTerminal } from 'xterm';
import * as WindowsProcessTreeType from 'windows-process-tree';
import type { Terminal as XTermTerminal } from 'xterm';
import type * as WindowsProcessTreeType from 'windows-process-tree';
import { Disposable } from 'vs/base/common/lifecycle';
import { timeout } from 'vs/base/common/async';

View File

@@ -5,7 +5,7 @@
import * as path from 'vs/base/common/path';
import * as platform from 'vs/base/common/platform';
import * as pty from 'node-pty';
import type * as pty from 'node-pty';
import * as fs from 'fs';
import { Event, Emitter } from 'vs/base/common/event';
import { getWindowsBuildNumber } from 'vs/workbench/contrib/terminal/node/terminal';
@@ -90,7 +90,7 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess
}
try {
this.setupPtyProcess(this._shellLaunchConfig, this._ptyOptions);
await this.setupPtyProcess(this._shellLaunchConfig, this._ptyOptions);
return undefined;
} catch (err) {
this._logService.trace('IPty#spawn native exception', err);
@@ -136,10 +136,10 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess
return undefined;
}
private setupPtyProcess(shellLaunchConfig: IShellLaunchConfig, options: pty.IPtyForkOptions): void {
private async setupPtyProcess(shellLaunchConfig: IShellLaunchConfig, options: pty.IPtyForkOptions): Promise<void> {
const args = shellLaunchConfig.args || [];
this._logService.trace('IPty#spawn', shellLaunchConfig.executable, args, options);
const ptyProcess = pty.spawn(shellLaunchConfig.executable!, args, options);
const ptyProcess = (await import('node-pty')).spawn(shellLaunchConfig.executable!, args, options);
this._ptyProcess = ptyProcess;
this._processStartupComplete = new Promise<void>(c => {
this.onProcessReady(() => c());

View File

@@ -45,16 +45,22 @@ suite('Workbench - TerminalEnvironment', () => {
test('auto', () => {
assert.equal(shouldSetLangEnvVariable({}, 'auto'), true);
assert.equal(shouldSetLangEnvVariable({ LANG: 'en-US' }, 'auto'), true);
assert.equal(shouldSetLangEnvVariable({ LANG: 'en-US.utf' }, 'auto'), true);
assert.equal(shouldSetLangEnvVariable({ LANG: 'en-US.utf8' }, 'auto'), false);
assert.equal(shouldSetLangEnvVariable({ LANG: 'en-US.UTF-8' }, 'auto'), false);
});
test('off', () => {
assert.equal(shouldSetLangEnvVariable({}, 'off'), false);
assert.equal(shouldSetLangEnvVariable({ LANG: 'en-US' }, 'off'), false);
assert.equal(shouldSetLangEnvVariable({ LANG: 'en-US.utf' }, 'off'), false);
assert.equal(shouldSetLangEnvVariable({ LANG: 'en-US.utf8' }, 'off'), false);
assert.equal(shouldSetLangEnvVariable({ LANG: 'en-US.UTF-8' }, 'off'), false);
});
test('on', () => {
assert.equal(shouldSetLangEnvVariable({}, 'on'), true);
assert.equal(shouldSetLangEnvVariable({ LANG: 'en-US' }, 'on'), true);
assert.equal(shouldSetLangEnvVariable({ LANG: 'en-US.utf' }, 'on'), true);
assert.equal(shouldSetLangEnvVariable({ LANG: 'en-US.utf8' }, 'on'), true);
assert.equal(shouldSetLangEnvVariable({ LANG: 'en-US.UTF-8' }, 'on'), true);
});
});