From 2517c1f4b2ea5233b2e7e5ef19df4cb1efe3569f Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Fri, 4 Feb 2022 17:35:05 -0600 Subject: [PATCH] align terminal link commands with internal link types (#142216) --- .../terminal/browser/links/terminalLink.ts | 4 ++++ .../links/terminalLinkDetectorAdapter.ts | 3 ++- .../browser/links/terminalLinkManager.ts | 16 ++++++++------ .../browser/links/terminalLinkQuickpick.ts | 8 +++---- .../contrib/terminal/browser/terminal.ts | 2 +- .../terminal/browser/terminalActions.ts | 8 +++---- .../terminal/browser/terminalInstance.ts | 2 +- .../contrib/terminal/common/terminal.ts | 2 +- .../browser/links/terminalLinkManager.test.ts | 22 +++++++++---------- 9 files changed, 37 insertions(+), 30 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts index 2dcd61f0c2f..8e9bcde15ab 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts @@ -12,6 +12,7 @@ import { isMacintosh } from 'vs/base/common/platform'; import { localize } from 'vs/nls'; import { Emitter, Event } from 'vs/base/common/event'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { TerminalLinkType } from 'vs/workbench/contrib/terminal/browser/links/links'; import { IHoverAction } from 'vs/workbench/services/hover/browser/hover'; export const OPEN_FILE_LABEL = localize('openFile', 'Open file in editor'); @@ -28,6 +29,8 @@ export class TerminalLink extends DisposableStore implements ILink { private readonly _onInvalidated = new Emitter(); get onInvalidated(): Event { return this._onInvalidated.event; } + get type(): TerminalLinkType { return this._type; } + constructor( private readonly _xterm: Terminal, readonly range: IBufferRange, @@ -38,6 +41,7 @@ export class TerminalLink extends DisposableStore implements ILink { private readonly _tooltipCallback: (link: TerminalLink, viewportRange: IViewportRange, modifierDownCallback?: () => void, modifierUpCallback?: () => void) => void, private readonly _isHighConfidenceLink: boolean, readonly label: string | undefined, + private readonly _type: TerminalLinkType, @IConfigurationService private readonly _configurationService: IConfigurationService ) { super(); diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkDetectorAdapter.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkDetectorAdapter.ts index 993dd0e2a9e..868bf9600e8 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkDetectorAdapter.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkDetectorAdapter.ts @@ -99,7 +99,8 @@ export class TerminalLinkDetectorAdapter extends Disposable implements ILinkProv modifierUpCallback }), l.type !== TerminalBuiltinLinkType.Search, // Only search is low confidence - l.label || this._getLabel(l.type) + l.label || this._getLabel(l.type), + l.type ); } diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts index b8cb806e867..5229a53d8d7 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts @@ -122,7 +122,7 @@ export class TerminalLinkManager extends DisposableStore { await opener.open(link); } - async openRecentLink(type: 'file' | 'web'): Promise { + async openRecentLink(type: 'localFile' | 'url'): Promise { let links; let i = this._xterm.buffer.active.length; while ((!links || links.length === 0) && i >= this._xterm.buffer.active.viewportY) { @@ -163,8 +163,8 @@ export class TerminalLinkManager extends DisposableStore { private async _getLinksForLine(y: number): Promise { let unfilteredWordLinks = await this._getLinksForType(y, 'word'); - const webLinks = await this._getLinksForType(y, 'web'); - const fileLinks = await this._getLinksForType(y, 'file'); + const webLinks = await this._getLinksForType(y, 'url'); + const fileLinks = await this._getLinksForType(y, 'localFile'); const words = new Set(); let wordLinks; if (unfilteredWordLinks) { @@ -179,14 +179,16 @@ export class TerminalLinkManager extends DisposableStore { return { wordLinks, webLinks, fileLinks }; } - protected async _getLinksForType(y: number, type: 'word' | 'web' | 'file'): Promise { + protected async _getLinksForType(y: number, type: 'word' | 'url' | 'localFile'): Promise { switch (type) { case 'word': return (await new Promise(r => this._standardLinkProviders.get(TerminalWordLinkDetector.id)?.provideLinks(y, r))); - case 'web': + case 'url': return (await new Promise(r => this._standardLinkProviders.get(TerminalUriLinkDetector.id)?.provideLinks(y, r))); - case 'file': - return (await new Promise(r => this._standardLinkProviders.get(TerminalLocalLinkDetector.id)?.provideLinks(y, r))); + case 'localFile': { + const links = (await new Promise(r => this._standardLinkProviders.get(TerminalLocalLinkDetector.id)?.provideLinks(y, r))); + return links?.filter(link => (link as TerminalLink).type === TerminalBuiltinLinkType.LocalFile); + } } } diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkQuickpick.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkQuickpick.ts index 51e87dfeeb4..1a2b18727b5 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkQuickpick.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkQuickpick.ts @@ -20,20 +20,20 @@ export class TerminalLinkQuickpick { const filePicks = links.fileLinks ? await this._generatePicks(links.fileLinks) : undefined; const webPicks = links.webLinks ? await this._generatePicks(links.webLinks) : undefined; const options = { - placeHolder: localize('terminal.integrated.openWebLink', "Select the link to open"), + placeHolder: localize('terminal.integrated.openDetectedLink', "Select the link to open"), canPickMany: false }; const picks: LinkQuickPickItem[] = []; if (webPicks) { - picks.push({ type: 'separator', label: localize('terminal.integrated.webLinks', "Web") }); + picks.push({ type: 'separator', label: localize('terminal.integrated.urlLinks', "Url") }); picks.push(...webPicks); } if (filePicks) { - picks.push({ type: 'separator', label: localize('terminal.integrated.fileLinks', "File") }); + picks.push({ type: 'separator', label: localize('terminal.integrated.localFileLinks', "Local File") }); picks.push(...filePicks); } if (wordPicks) { - picks.push({ type: 'separator', label: localize('terminal.integrated.wordLinks', "Word") }); + picks.push({ type: 'separator', label: localize('terminal.integrated.searchLinks', "Workspace Search") }); picks.push(...wordPicks); } diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 2ff18c80e48..89f667cac60 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -818,7 +818,7 @@ export interface ITerminalInstance { /** * Activates the most recent link of the given type. */ - openRecentLink(type: 'file' | 'web'): Promise; + openRecentLink(type: 'localFile' | 'url'): Promise; } export interface IXtermTerminal { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 0770e05598b..79862cc9eea 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -1955,14 +1955,14 @@ export function registerTerminalActions() { constructor() { super({ id: TerminalCommandId.OpenWebLink, - title: { value: localize('workbench.action.terminal.openLastWebLink', "Open Last Web Link"), original: 'Open Last Web Link' }, + title: { value: localize('workbench.action.terminal.openLastUrlLink', "Open Last Url Link"), original: 'Open Last Url Link' }, f1: true, category, precondition: TerminalContextKeys.terminalHasBeenCreated, }); } run(accessor: ServicesAccessor) { - accessor.get(ITerminalService).doWithActiveInstance(t => t.openRecentLink('web')); + accessor.get(ITerminalService).doWithActiveInstance(t => t.openRecentLink('url')); } }); @@ -1970,14 +1970,14 @@ export function registerTerminalActions() { constructor() { super({ id: TerminalCommandId.OpenFileLink, - title: { value: localize('workbench.action.terminal.openLastFileLink', "Open Last File Link"), original: 'Open Last File Link' }, + title: { value: localize('workbench.action.terminal.openLastLocalFileLink', "Open Last Local File Link"), original: 'Open Last Local File Link' }, f1: true, category, precondition: TerminalContextKeys.terminalHasBeenCreated, }); } run(accessor: ServicesAccessor) { - accessor.get(ITerminalService).doWithActiveInstance(t => t.openRecentLink('file')); + accessor.get(ITerminalService).doWithActiveInstance(t => t.openRecentLink('localFile')); } }); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 92dd91deeb8..e378dc878df 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -743,7 +743,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { return this._linkManager.getLinks(); } - async openRecentLink(type: 'file' | 'web'): Promise { + async openRecentLink(type: 'localFile' | 'url'): Promise { if (!this.areLinksReady || !this._linkManager) { throw new Error('terminal links are not ready, cannot open a link'); } diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index b766671fdb5..0012a9c3e67 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -481,7 +481,7 @@ export const enum TerminalCommandId { OpenDetectedLink = 'workbench.action.terminal.openDetectedLink', OpenWordLink = 'workbench.action.terminal.openWordLink', OpenFileLink = 'workbench.action.terminal.openFileLink', - OpenWebLink = 'workbench.action.terminal.openWebLink', + OpenWebLink = 'workbench.action.terminal.openUrlLink', RunRecentCommand = 'workbench.action.terminal.runRecentCommand', GoToRecentDirectory = 'workbench.action.terminal.goToRecentDirectory', CopySelection = 'workbench.action.terminal.copySelection', diff --git a/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkManager.test.ts b/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkManager.test.ts index cecbd3a13da..18bbf9e4d82 100644 --- a/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkManager.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkManager.test.ts @@ -34,13 +34,13 @@ const defaultTerminalConfig: Partial = { class TestLinkManager extends TerminalLinkManager { private _links: IDetectedLinks | undefined; - protected override async _getLinksForType(y: number, type: 'word' | 'web' | 'file'): Promise { + protected override async _getLinksForType(y: number, type: 'word' | 'url' | 'localFile'): Promise { switch (type) { case 'word': return this._links?.wordLinks?.[y] ? [this._links?.wordLinks?.[y]] : undefined; - case 'web': + case 'url': return this._links?.webLinks?.[y] ? [this._links?.webLinks?.[y]] : undefined; - case 'file': + case 'localFile': return this._links?.fileLinks?.[y] ? [this._links?.fileLinks?.[y]] : undefined; } } @@ -91,9 +91,9 @@ suite('TerminalLinkManager', () => { equals(links.webLinks, []); equals(links.wordLinks, []); equals(links.fileLinks, []); - const webLink = await linkManager.openRecentLink('web'); + const webLink = await linkManager.openRecentLink('url'); strictEqual(webLink, undefined); - const fileLink = await linkManager.openRecentLink('file'); + const fileLink = await linkManager.openRecentLink('localFile'); strictEqual(fileLink, undefined); }); test('should return word links in order', async () => { @@ -115,9 +115,9 @@ suite('TerminalLinkManager', () => { const links = await linkManager.getLinks(); deepStrictEqual(links.wordLinks?.[0].text, link2.text); deepStrictEqual(links.wordLinks?.[1].text, link1.text); - const webLink = await linkManager.openRecentLink('web'); + const webLink = await linkManager.openRecentLink('url'); strictEqual(webLink, undefined); - const fileLink = await linkManager.openRecentLink('file'); + const fileLink = await linkManager.openRecentLink('localFile'); strictEqual(fileLink, undefined); }); test('should return web links in order', async () => { @@ -135,9 +135,9 @@ suite('TerminalLinkManager', () => { const links = await linkManager.getLinks(); deepStrictEqual(links.webLinks?.[0].text, link2.text); deepStrictEqual(links.webLinks?.[1].text, link1.text); - const webLink = await linkManager.openRecentLink('web'); + const webLink = await linkManager.openRecentLink('url'); strictEqual(webLink, link2); - const fileLink = await linkManager.openRecentLink('file'); + const fileLink = await linkManager.openRecentLink('localFile'); strictEqual(fileLink, undefined); }); test('should return file links in order', async () => { @@ -155,10 +155,10 @@ suite('TerminalLinkManager', () => { const links = await linkManager.getLinks(); deepStrictEqual(links.fileLinks?.[0].text, link2.text); deepStrictEqual(links.fileLinks?.[1].text, link1.text); - const webLink = await linkManager.openRecentLink('web'); + const webLink = await linkManager.openRecentLink('url'); strictEqual(webLink, undefined); linkManager.setLinks({ fileLinks: [link2] }); - const fileLink = await linkManager.openRecentLink('file'); + const fileLink = await linkManager.openRecentLink('localFile'); strictEqual(fileLink, link2); }); });