From c594d55bae90276d174cea4ddf2901694d4ebb3e Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 13 Jan 2025 15:13:26 -0600 Subject: [PATCH] add a setting to determine which terminal suggest providers are activated (#237826) --- .../browser/pwshCompletionProviderAddon.ts | 4 ++-- .../browser/terminal.suggest.contribution.ts | 7 ++++++- .../browser/terminalCompletionService.ts | 20 +++++++++++++++++-- .../common/terminalSuggestConfiguration.ts | 18 ++++++++++++++++- .../terminalSuggestAddon.integrationTest.ts | 4 ++++ 5 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/browser/pwshCompletionProviderAddon.ts b/src/vs/workbench/contrib/terminalContrib/suggest/browser/pwshCompletionProviderAddon.ts index f10c11b7cd68c..53a0eb48bccc1 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/browser/pwshCompletionProviderAddon.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/browser/pwshCompletionProviderAddon.ts @@ -56,7 +56,7 @@ export class PwshCompletionProviderAddon extends Disposable implements ITerminal id: string = PwshCompletionProviderAddon.ID; triggerCharacters?: string[] | undefined; isBuiltin?: boolean = true; - static readonly ID = 'terminal.pwshCompletionProvider'; + static readonly ID = 'pwsh-shell-integration'; static cachedPwshCommands: Set; readonly shellTypes = [GeneralShellType.PowerShell]; private _codeCompletionsRequested: boolean = false; @@ -348,7 +348,7 @@ function rawCompletionToITerminalCompletion(rawCompletion: PwshCompletion, repla return { label, - provider: 'pwsh-script', + provider: PwshCompletionProviderAddon.ID, icon, detail, isFile: rawCompletion.ResultType === 3, diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminal.suggest.contribution.ts b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminal.suggest.contribution.ts index 89e59369df8aa..ddaed199002ab 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminal.suggest.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminal.suggest.contribution.ts @@ -112,7 +112,7 @@ class TerminalSuggestContribution extends DisposableStore implements ITerminalCo this._ctx.instance.focus(); this._ctx.instance.sendText(text, false); })); - this.add(this._terminalCompletionService.registerTerminalCompletionProvider('builtinPwsh', 'pwsh', pwshCompletionProviderAddon)); + this.add(this._terminalCompletionService.registerTerminalCompletionProvider('builtinPwsh', pwshCompletionProviderAddon.id, pwshCompletionProviderAddon)); // If completions are requested, pause and queue input events until completions are // received. This fixing some problems in PowerShell, particularly enter not executing // when typing quickly and some characters being printed twice. On Windows this isn't @@ -178,6 +178,11 @@ class TerminalSuggestContribution extends DisposableStore implements ITerminalCo return; } addon.shellType = this._ctx.instance.shellType; + if (!this._ctx.instance.xterm?.raw) { + return; + } + // Relies on shell type being set + this._loadPwshCompletionAddon(this._ctx.instance.xterm.raw); } } diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalCompletionService.ts b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalCompletionService.ts index c7af21695a137..fac59f23a364b 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalCompletionService.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalCompletionService.ts @@ -12,7 +12,7 @@ import { IFileService } from '../../../../../platform/files/common/files.js'; import { createDecorator } from '../../../../../platform/instantiation/common/instantiation.js'; import { TerminalShellType } from '../../../../../platform/terminal/common/terminal.js'; import { ISimpleCompletion } from '../../../../services/suggest/browser/simpleCompletionItem.js'; -import { ITerminalSuggestConfiguration, terminalSuggestConfigSection } from '../common/terminalSuggestConfiguration.js'; +import { ITerminalSuggestConfiguration, terminalSuggestConfigSection, TerminalSuggestSettingId } from '../common/terminalSuggestConfiguration.js'; export const ITerminalCompletionService = createDecorator('terminalCompletionService'); @@ -149,6 +149,17 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo if (!extensionCompletionsEnabled || skipExtensionCompletions) { providers = providers.filter(p => p.isBuiltin); + return this._collectCompletions(providers, shellType, promptValue, cursorPosition, token); + } + + const providerConfig: { [key: string]: boolean } = this._configurationService.getValue(TerminalSuggestSettingId.Providers); + providers = providers.filter(p => { + const providerId = p.id; + return providerId && providerId in providerConfig && providerConfig[providerId]; + }); + + if (!providers.length) { + return; } return this._collectCompletions(providers, shellType, promptValue, cursorPosition, token); @@ -164,7 +175,12 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo return undefined; } const completionItems = Array.isArray(completions) ? completions : completions.items ?? []; - + if (provider.isBuiltin) { + //TODO: why is this needed? + for (const item of completionItems) { + item.provider = provider.id; + } + } if (Array.isArray(completions)) { return completionItems; } diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/common/terminalSuggestConfiguration.ts b/src/vs/workbench/contrib/terminalContrib/suggest/common/terminalSuggestConfiguration.ts index 860bb28015acc..ac7e94ead6a7d 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/common/terminalSuggestConfiguration.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/common/terminalSuggestConfiguration.ts @@ -15,6 +15,7 @@ export const enum TerminalSuggestSettingId { RunOnEnter = 'terminal.integrated.suggest.runOnEnter', BuiltinCompletions = 'terminal.integrated.suggest.builtinCompletions', EnableExtensionCompletions = 'terminal.integrated.suggest.enableExtensionCompletions', + Providers = 'terminal.integrated.suggest.providers', } export const terminalSuggestConfigSection = 'terminal.integrated.suggest'; @@ -28,6 +29,10 @@ export interface ITerminalSuggestConfiguration { 'pwshCode': boolean; 'pwshGit': boolean; }; + providers: { + 'terminal-suggest': boolean; + 'pwsh-shell-integration': boolean; + }; enableExtensionCompletions: boolean; } @@ -39,6 +44,17 @@ export const terminalSuggestConfiguration: IStringDictionary { pwshCode: true, pwshGit: true }, + providers: { + 'terminal-suggest': true, + 'pwsh-shell-integration': true, + }, enableExtensionCompletions: false } satisfies ITerminalSuggestConfiguration }