Skip to content

Commit

Permalink
Report shell integration status in hover
Browse files Browse the repository at this point in the history
  • Loading branch information
Tyriar committed Jan 7, 2022
1 parent cc5f6e9 commit 2a751e5
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 5 deletions.
7 changes: 6 additions & 1 deletion src/vs/workbench/contrib/terminal/browser/terminal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { URI } from 'vs/base/common/uri';
import { FindReplaceState } from 'vs/editor/contrib/find/findState';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
import { IShellLaunchConfig, ITerminalDimensions, ITerminalLaunchError, ITerminalProfile, ITerminalTabLayoutInfoById, TerminalIcon, TitleEventSource, TerminalShellType, IExtensionTerminalProfile, TerminalLocation, ProcessPropertyType, ProcessCapability, IProcessPropertyMap } from 'vs/platform/terminal/common/terminal';
import { ICommandTracker, INavigationMode, IRemoteTerminalAttachTarget, IStartExtensionTerminalRequest, ITerminalConfigHelper, ITerminalFont, ITerminalBackend, ITerminalProcessExtHostProxy, IRegisterContributedProfileArgs } from 'vs/workbench/contrib/terminal/common/terminal';
import { ICommandTracker, INavigationMode, IRemoteTerminalAttachTarget, IStartExtensionTerminalRequest, ITerminalConfigHelper, ITerminalFont, ITerminalBackend, ITerminalProcessExtHostProxy, IRegisterContributedProfileArgs, IShellIntegration } from 'vs/workbench/contrib/terminal/common/terminal';
import { ITerminalStatusList } from 'vs/workbench/contrib/terminal/browser/terminalStatusList';
import { Orientation } from 'vs/base/browser/ui/splitview/splitview';
import { IEditableData } from 'vs/workbench/common/views';
Expand Down Expand Up @@ -808,6 +808,11 @@ export interface IXtermTerminal {
*/
readonly commandTracker: ICommandTracker;

/**
* Reports the status of shell integration and fires events relating to it.
*/
readonly shellIntegration: IShellIntegration;

/**
* The position of the terminal.
*/
Expand Down
21 changes: 19 additions & 2 deletions src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
import { MenuItemAction } from 'vs/platform/actions/common/actions';
import { MenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem';
import { ITerminalBackend, TerminalCommandId } from 'vs/workbench/contrib/terminal/common/terminal';
import { TerminalLocation, TerminalSettingId } from 'vs/platform/terminal/common/terminal';
import { ProcessCapability, TerminalLocation, TerminalSettingId } from 'vs/platform/terminal/common/terminal';
import { Codicon } from 'vs/base/common/codicons';
import { Action } from 'vs/base/common/actions';
import { MarkdownString } from 'vs/base/common/htmlContent';
Expand Down Expand Up @@ -304,6 +304,16 @@ class TerminalTabsRenderer implements IListRenderer<ITerminalInstance, ITerminal
template.context.hoverActions.push(...status.hoverActions);
}
}

let shellIntegrationString = '';
const capabilities = instance.xterm?.shellIntegration.capabilities;
if (capabilities?.length) {
shellIntegrationString += `\n\n---\n\n$(plug) ${localize('shellIntegration.enabled', "Shell integration is enabled")}`;
for (const capability of capabilities) {
shellIntegrationString += `\n- ${this._getCapabilityName(capability)}`;
}
}

const iconId = getIconId(instance);
const hasActionbar = !this.shouldHideActionBar();
let label: string = '';
Expand Down Expand Up @@ -361,7 +371,7 @@ class TerminalTabsRenderer implements IListRenderer<ITerminalInstance, ITerminal
badges: hasText
},
title: {
markdown: new MarkdownString(instance.title + statusString, { supportThemeIcons: true }),
markdown: new MarkdownString(instance.title + shellIntegrationString + statusString, { supportThemeIcons: true }),
markdownNotSupportedFallback: undefined
},
extraClasses
Expand Down Expand Up @@ -493,6 +503,13 @@ class TerminalTabsRenderer implements IListRenderer<ITerminalInstance, ITerminal
this._terminalGroupService.focusTabs();
this._listService.lastFocusedList?.focusNext();
}

private _getCapabilityName(capability: ProcessCapability): string {
switch (capability) {
case ProcessCapability.CommandCognisant: return localize('capability.commandDetection', "Command detection");
case ProcessCapability.CwdDetection: return localize('capability.cwdDetection', "Current working directory detection");
}
}
}

interface ITerminalTabEntryTemplate {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ export const enum ShellIntegrationInteraction {

export class ShellIntegrationAddon extends Disposable implements IShellIntegration, ITerminalAddon {
private _terminal?: Terminal;
readonly capabilities: ProcessCapability[] = [];

// TODO: Rename ProcessCapability to TerminalCapability, move naive CwdDetection to renderer
private readonly _onCapabilityDisabled = new Emitter<ProcessCapability>();
Expand Down Expand Up @@ -107,6 +108,7 @@ export class ShellIntegrationAddon extends Disposable implements IShellIntegrati
type = ShellIntegrationInteraction.CommandFinished;
break;
case ShellIntegrationOscPt.EnableShellIntegration:
this.capabilities.push(ProcessCapability.CommandCognisant);
this._onCapabilityEnabled.fire(ProcessCapability.CommandCognisant);
return true;
default:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/term
import { DisposableStore } from 'vs/base/common/lifecycle';
import { IEditorOptions } from 'vs/editor/common/config/editorOptions';
import { ProcessCapability, TerminalLocation, TerminalSettingId } from 'vs/platform/terminal/common/terminal';
import { ICommandTracker, ITerminalFont, TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal';
import { ICommandTracker, IShellIntegration, ITerminalFont, TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal';
import { isSafari } from 'vs/base/browser/browser';
import { IXtermTerminal } from 'vs/workbench/contrib/terminal/browser/terminal';
import { ILogService } from 'vs/platform/log/common/log';
Expand Down Expand Up @@ -55,14 +55,15 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {

// Always on addons
private _commandTrackerAddon: CommandTrackerAddon;
private _shellIntegrationAddon: ShellIntegrationAddon;

// Optional addons
private _searchAddon?: SearchAddonType;
private _shellIntegrationAddon?: ShellIntegrationAddon;
private _unicode11Addon?: Unicode11AddonType;
private _webglAddon?: WebglAddonType;

get commandTracker(): ICommandTracker { return this._commandTrackerAddon; }
get shellIntegration(): IShellIntegration { return this._shellIntegrationAddon; }

private _target: TerminalLocation | undefined;
set target(location: TerminalLocation | undefined) {
Expand Down
1 change: 1 addition & 0 deletions src/vs/workbench/contrib/terminal/common/terminal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,7 @@ export interface ICommandTracker {
}

export interface IShellIntegration {
readonly capabilities: readonly ProcessCapability[];
readonly onCapabilityEnabled: Event<ProcessCapability>;
readonly onCapabilityDisabled: Event<ProcessCapability>;
// TODO: Fire more fine-grained and stronger typed events
Expand Down

0 comments on commit 2a751e5

Please sign in to comment.