diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 9a38446fbf1..b4cc8410896 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -1525,7 +1525,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I TaskRevealKind: extHostTypes.TaskRevealKind, TaskScope: extHostTypes.TaskScope, TerminalLink: extHostTypes.TerminalLink, - TerminalQuickFixExecuteTerminalCommand: extHostTypes.TerminalQuickFixCommand, + TerminalQuickFixTerminalCommand: extHostTypes.TerminalQuickFixCommand, TerminalQuickFixOpener: extHostTypes.TerminalQuickFixOpener, TerminalLocation: extHostTypes.TerminalLocation, TerminalProfile: extHostTypes.TerminalProfile, diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 18035b6cb54..26a9c295427 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -2160,15 +2160,16 @@ export interface ITerminalDimensionsDto { type SingleOrMany = T[] | T; -export interface ITerminalQuickFixExecuteTerminalCommandDto { +export interface ITerminalQuickFixTerminalCommandDto { terminalCommand: string; + shouldExecute?: boolean; } export interface ITerminalQuickFixOpenerDto { uri: UriComponents; } -export type TerminalQuickFix = ITerminalQuickFixExecuteTerminalCommandDto | ITerminalQuickFixOpenerDto | ICommandDto; +export type TerminalQuickFix = ITerminalQuickFixTerminalCommandDto | ITerminalQuickFixOpenerDto | ICommandDto; export interface TerminalCommandMatchResultDto { commandLine: string; diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index 37ac47bfaac..429c99760e9 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -5,7 +5,7 @@ import type * as vscode from 'vscode'; import { Event, Emitter } from 'vs/base/common/event'; -import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, ITerminalDimensionsDto, ITerminalLinkDto, ExtHostTerminalIdentifier, ICommandDto, ITerminalQuickFixOpenerDto, ITerminalQuickFixExecuteTerminalCommandDto, TerminalCommandMatchResultDto, ITerminalCommandDto } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, ITerminalDimensionsDto, ITerminalLinkDto, ExtHostTerminalIdentifier, ICommandDto, ITerminalQuickFixOpenerDto, ITerminalQuickFixTerminalCommandDto, TerminalCommandMatchResultDto, ITerminalCommandDto } from 'vs/workbench/api/common/extHost.protocol'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { URI } from 'vs/base/common/uri'; import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; @@ -738,7 +738,7 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I }); } - public async $provideTerminalQuickFixes(id: string, matchResult: TerminalCommandMatchResultDto): Promise<(ITerminalQuickFixExecuteTerminalCommandDto | ITerminalQuickFixOpenerDto | ICommandDto)[] | ITerminalQuickFixExecuteTerminalCommandDto | ITerminalQuickFixOpenerDto | ICommandDto | undefined> { + public async $provideTerminalQuickFixes(id: string, matchResult: TerminalCommandMatchResultDto): Promise<(ITerminalQuickFixTerminalCommandDto | ITerminalQuickFixOpenerDto | ICommandDto)[] | ITerminalQuickFixTerminalCommandDto | ITerminalQuickFixOpenerDto | ICommandDto | undefined> { const token = new CancellationTokenSource().token; if (token.isCancellationRequested) { return; diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index a0c7cd50b8d..18de38ccb74 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -2354,9 +2354,9 @@ export namespace ChatResponseProgress { export namespace TerminalQuickFix { - export function from(quickFix: vscode.TerminalQuickFixExecuteTerminalCommand | vscode.TerminalQuickFixOpener | vscode.Command, converter: Command.ICommandsConverter, disposables: DisposableStore): extHostProtocol.ITerminalQuickFixExecuteTerminalCommandDto | extHostProtocol.ITerminalQuickFixOpenerDto | extHostProtocol.ICommandDto | undefined { + export function from(quickFix: vscode.TerminalQuickFixTerminalCommand | vscode.TerminalQuickFixOpener | vscode.Command, converter: Command.ICommandsConverter, disposables: DisposableStore): extHostProtocol.ITerminalQuickFixTerminalCommandDto | extHostProtocol.ITerminalQuickFixOpenerDto | extHostProtocol.ICommandDto | undefined { if ('terminalCommand' in quickFix) { - return { terminalCommand: quickFix.terminalCommand }; + return { terminalCommand: quickFix.terminalCommand, shouldExecute: quickFix.shouldExecute }; } if ('uri' in quickFix) { return { uri: quickFix.uri }; diff --git a/src/vs/workbench/contrib/terminalContrib/quickFix/browser/quickFix.ts b/src/vs/workbench/contrib/terminalContrib/quickFix/browser/quickFix.ts index f576102fe85..96c2fec0593 100644 --- a/src/vs/workbench/contrib/terminalContrib/quickFix/browser/quickFix.ts +++ b/src/vs/workbench/contrib/terminalContrib/quickFix/browser/quickFix.ts @@ -29,7 +29,7 @@ export interface ITerminalQuickFixProviderSelector { provider: ITerminalQuickFixProvider; } -export type TerminalQuickFixActionInternal = IAction | ITerminalQuickFixExecuteTerminalCommandAction | ITerminalQuickFixOpenerAction; +export type TerminalQuickFixActionInternal = IAction | ITerminalQuickFixTerminalCommandAction | ITerminalQuickFixOpenerAction; export type TerminalQuickFixCallback = (matchResult: ITerminalCommandMatchResult) => TerminalQuickFixActionInternal[] | TerminalQuickFixActionInternal | undefined; export type TerminalQuickFixCallbackExtension = (terminalCommand: ITerminalCommand, lines: string[] | undefined, option: ITerminalQuickFixOptions, token: CancellationToken) => Promise; @@ -65,11 +65,11 @@ export interface ITerminalQuickFix { source: string; } -export interface ITerminalQuickFixExecuteTerminalCommandAction extends ITerminalQuickFix { +export interface ITerminalQuickFixTerminalCommandAction extends ITerminalQuickFix { type: TerminalQuickFixType.TerminalCommand; terminalCommand: string; // TODO: Should this depend on whether alt is held? - addNewLine?: boolean; + shouldExecute?: boolean; } export interface ITerminalQuickFixOpenerAction extends ITerminalQuickFix { type: TerminalQuickFixType.Opener; diff --git a/src/vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon.ts b/src/vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon.ts index 80e8874e62a..6c508088a5c 100644 --- a/src/vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon.ts +++ b/src/vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon.ts @@ -28,7 +28,7 @@ import { IAnchor } from 'vs/base/browser/ui/contextview/contextview'; import { ILabelService } from 'vs/platform/label/common/label'; import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; -import { ITerminalQuickFixInternalOptions, ITerminalQuickFixResolvedExtensionOptions, ITerminalQuickFix, ITerminalQuickFixExecuteTerminalCommandAction, ITerminalQuickFixOpenerAction, ITerminalQuickFixOptions, ITerminalQuickFixProviderSelector, ITerminalQuickFixService, ITerminalQuickFixUnresolvedExtensionOptions, TerminalQuickFixType, ITerminalQuickFixCommandAction } from 'vs/workbench/contrib/terminalContrib/quickFix/browser/quickFix'; +import { ITerminalQuickFixInternalOptions, ITerminalQuickFixResolvedExtensionOptions, ITerminalQuickFix, ITerminalQuickFixTerminalCommandAction, ITerminalQuickFixOpenerAction, ITerminalQuickFixOptions, ITerminalQuickFixProviderSelector, ITerminalQuickFixService, ITerminalQuickFixUnresolvedExtensionOptions, TerminalQuickFixType, ITerminalQuickFixCommandAction } from 'vs/workbench/contrib/terminalContrib/quickFix/browser/quickFix'; import { ITerminalCommandSelector } from 'vs/platform/terminal/common/terminal'; import { ActionListItemKind, IActionListItem } from 'vs/platform/actionWidget/browser/actionList'; import { CodeActionKind } from 'vs/editor/contrib/codeAction/common/types'; @@ -311,6 +311,7 @@ export interface ITerminalAction extends IAction { source: string; uri?: URI; command?: string; + shouldExecute?: boolean; } export async function getQuickFixesForCommand( @@ -366,7 +367,7 @@ export async function getQuickFixesForCommand( if ('type' in quickFix) { switch (quickFix.type) { case TerminalQuickFixType.TerminalCommand: { - const fix = quickFix as ITerminalQuickFixExecuteTerminalCommandAction; + const fix = quickFix as ITerminalQuickFixTerminalCommandAction; if (commandQuickFixSet.has(fix.terminalCommand)) { continue; } @@ -383,11 +384,12 @@ export async function getQuickFixesForCommand( run: () => { onDidRequestRerunCommand?.fire({ command: fix.terminalCommand, - addNewLine: fix.addNewLine ?? true + addNewLine: fix.shouldExecute ?? false }); }, tooltip: label, - command: fix.terminalCommand + command: fix.terminalCommand, + shouldExecute: fix.shouldExecute }; break; } diff --git a/src/vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixBuiltinActions.ts b/src/vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixBuiltinActions.ts index 89284446f73..acfb6889c6d 100644 --- a/src/vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixBuiltinActions.ts +++ b/src/vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixBuiltinActions.ts @@ -5,7 +5,7 @@ import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; -import { ITerminalQuickFixInternalOptions, ITerminalCommandMatchResult, ITerminalQuickFixExecuteTerminalCommandAction, TerminalQuickFixActionInternal, TerminalQuickFixType } from 'vs/workbench/contrib/terminalContrib/quickFix/browser/quickFix'; +import { ITerminalQuickFixInternalOptions, ITerminalCommandMatchResult, ITerminalQuickFixTerminalCommandAction, TerminalQuickFixActionInternal, TerminalQuickFixType } from 'vs/workbench/contrib/terminalContrib/quickFix/browser/quickFix'; export const GitCommandLineRegex = /git/; export const GitPushCommandLineRegex = /git\s+push/; @@ -50,7 +50,7 @@ export function gitSimilar(): ITerminalQuickFixInternalOptions { id: 'Git Similar', type: TerminalQuickFixType.TerminalCommand, terminalCommand: matchResult.commandLine.replace(/git\s+[^\s]+/, () => `git ${fixedCommand}`), - addNewLine: true, + shouldExecute: true, source: QuickFixSource.Builtin }); } @@ -81,7 +81,7 @@ export function gitTwoDashes(): ITerminalQuickFixInternalOptions { type: TerminalQuickFixType.TerminalCommand, id: 'Git Two Dashes', terminalCommand: matchResult.commandLine.replace(` -${problemArg}`, () => ` --${problemArg}`), - addNewLine: true, + shouldExecute: true, source: QuickFixSource.Builtin }; } @@ -175,7 +175,7 @@ export function gitPushSetUpstream(): ITerminalQuickFixInternalOptions { type: TerminalQuickFixType.TerminalCommand, id: 'Git Push Set Upstream', terminalCommand: fixedCommand, - addNewLine: true, + shouldExecute: true, source: QuickFixSource.Builtin }); return actions; @@ -265,12 +265,13 @@ export function pwshGeneralError(): ITerminalQuickFixInternalOptions { if (!suggestions) { return; } - const result: ITerminalQuickFixExecuteTerminalCommandAction[] = []; + const result: ITerminalQuickFixTerminalCommandAction[] = []; for (const suggestion of suggestions) { result.push({ id: 'Pwsh General Error', type: TerminalQuickFixType.TerminalCommand, terminalCommand: suggestion, + shouldExecute: true, source: QuickFixSource.Builtin }); } @@ -311,7 +312,7 @@ export function pwshUnixCommandNotFoundError(): ITerminalQuickFixInternalOptions } // Always remove the first element as it's the "Suggestion [cmd-not-found]"" line - const result: ITerminalQuickFixExecuteTerminalCommandAction[] = []; + const result: ITerminalQuickFixTerminalCommandAction[] = []; let inSuggestions = false; for (; i < lines.length; i++) { const line = lines[i].trim(); @@ -338,6 +339,7 @@ export function pwshUnixCommandNotFoundError(): ITerminalQuickFixInternalOptions id: 'Pwsh Unix Command Not Found Error', type: TerminalQuickFixType.TerminalCommand, terminalCommand: line.trim(), + shouldExecute: true, source: QuickFixSource.Builtin }); } diff --git a/src/vscode-dts/vscode.proposed.terminalQuickFixProvider.d.ts b/src/vscode-dts/vscode.proposed.terminalQuickFixProvider.d.ts index 4daa96722d8..2dc3bdccf72 100644 --- a/src/vscode-dts/vscode.proposed.terminalQuickFixProvider.d.ts +++ b/src/vscode-dts/vscode.proposed.terminalQuickFixProvider.d.ts @@ -16,7 +16,7 @@ declare module 'vscode' { * @param token A cancellation token indicating the result is no longer needed * @return Terminal quick fix(es) if any */ - provideTerminalQuickFixes(commandMatchResult: TerminalCommandMatchResult, token: CancellationToken): ProviderResult>; + provideTerminalQuickFixes(commandMatchResult: TerminalCommandMatchResult, token: CancellationToken): ProviderResult>; } @@ -37,11 +37,15 @@ declare module 'vscode' { export function registerTerminalQuickFixProvider(id: string, provider: TerminalQuickFixProvider): Disposable; } - export class TerminalQuickFixExecuteTerminalCommand { + export class TerminalQuickFixTerminalCommand { /** - * The terminal command to run + * The terminal command to insert or run */ terminalCommand: string; + /** + * Whether the command should be executed or just inserted + */ + shouldExecute?: boolean; constructor(terminalCommand: string); } export class TerminalQuickFixOpener {