From 523213f1148bab4f4c87df11bb96d7473dde0631 Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Wed, 17 Dec 2025 00:07:13 -0800 Subject: [PATCH 1/3] Add IKeybindingService.appendKeybinding to unify and reduce duplicated code --- .../dropOrPasteInto/browser/postEditWidget.ts | 3 +- .../contrib/find/browser/findOptionsWidget.ts | 6 +- .../editor/contrib/find/browser/findWidget.ts | 6 +- .../hover/browser/markdownHoverParticipant.ts | 16 +-- .../inlineCompletionsHintsWidget.ts | 7 +- .../actionWidgetDropdownActionViewItem.ts | 7 +- src/vs/platform/actions/browser/buttonbar.ts | 9 +- .../dropdownActionViewItemWithKeybinding.ts | 8 +- .../browser/menuEntryActionViewItem.ts | 13 +- .../common/abstractKeybindingService.ts | 14 +++ .../platform/keybinding/common/keybinding.ts | 6 + .../common/abstractKeybindingService.test.ts | 116 +++++++++++++++++- .../test/common/mockKeybindingService.ts | 4 + src/vs/workbench/browser/codeeditor.ts | 6 +- .../chatElicitationContentPart.ts | 3 +- .../abstractToolConfirmationSubPart.ts | 6 +- .../chatExtensionsInstallToolSubPart.ts | 6 +- .../chatTerminalToolConfirmationSubPart.ts | 3 +- .../chatTerminalToolProgressPart.ts | 8 +- .../chatEditing/chatEditingEditorOverlay.ts | 6 +- .../chatMarkdownDecorationsRenderer.ts | 8 +- .../browser/find/simpleFindWidget.ts | 6 +- .../debug/browser/debugActionViewItems.ts | 4 +- .../contrib/debug/browser/welcomeView.ts | 3 +- .../browser/languageDetection.contribution.ts | 10 +- .../diagnosticCellStatusBarContrib.ts | 5 +- .../cellStatusBar/statusBarProviders.ts | 10 +- .../preferences/browser/keybindingsEditor.ts | 6 +- .../preferences/browser/settingsTree.ts | 8 +- .../contrib/scm/browser/quickDiffWidget.ts | 3 +- .../search/browser/searchActionsBase.ts | 10 -- .../contrib/search/browser/searchView.ts | 9 +- .../contrib/search/browser/searchWidget.ts | 15 ++- .../browser/codeCoverageDecorations.ts | 5 +- src/vs/workbench/electron-browser/window.ts | 2 +- 35 files changed, 198 insertions(+), 159 deletions(-) diff --git a/src/vs/editor/contrib/dropOrPasteInto/browser/postEditWidget.ts b/src/vs/editor/contrib/dropOrPasteInto/browser/postEditWidget.ts index 0b8a7b23edd..735768eb175 100644 --- a/src/vs/editor/contrib/dropOrPasteInto/browser/postEditWidget.ts +++ b/src/vs/editor/contrib/dropOrPasteInto/browser/postEditWidget.ts @@ -88,8 +88,7 @@ class PostEditWidget extends Dis } private _updateButtonTitle() { - const binding = this._keybindingService.lookupKeybinding(this.showCommand.id)?.getLabel(); - this.button.element.title = this.showCommand.label + (binding ? ` (${binding})` : ''); + this.button.element.title = this._keybindingService.appendKeybinding(this.showCommand.label, this.showCommand.id); } private create(): void { diff --git a/src/vs/editor/contrib/find/browser/findOptionsWidget.ts b/src/vs/editor/contrib/find/browser/findOptionsWidget.ts index 57bb5c1c951..dab491acd42 100644 --- a/src/vs/editor/contrib/find/browser/findOptionsWidget.ts +++ b/src/vs/editor/contrib/find/browser/findOptionsWidget.ts @@ -120,11 +120,7 @@ export class FindOptionsWidget extends Widget implements IOverlayWidget { } private _keybindingLabelFor(actionId: string): string { - const kb = this._keybindingService.lookupKeybinding(actionId); - if (!kb) { - return ''; - } - return ` (${kb.getLabel()})`; + return this._keybindingService.appendKeybinding('', actionId); } public override dispose(): void { diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index b6724abfa60..25efe745fe0 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -910,11 +910,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL // ----- initialization private _keybindingLabelFor(actionId: string): string { - const kb = this._keybindingService.lookupKeybinding(actionId); - if (!kb) { - return ''; - } - return ` (${kb.getLabel()})`; + return this._keybindingService.appendKeybinding('', actionId); } private _buildDomNode(): void { diff --git a/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts b/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts index d56ad211381..e289a3dbca0 100644 --- a/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts +++ b/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts @@ -527,17 +527,9 @@ function renderMarkdown( export function labelForHoverVerbosityAction(keybindingService: IKeybindingService, action: HoverVerbosityAction): string { switch (action) { - case HoverVerbosityAction.Increase: { - const kb = keybindingService.lookupKeybinding(INCREASE_HOVER_VERBOSITY_ACTION_ID); - return kb ? - nls.localize('increaseVerbosityWithKb', "Increase Hover Verbosity ({0})", kb.getLabel()) : - nls.localize('increaseVerbosity', "Increase Hover Verbosity"); - } - case HoverVerbosityAction.Decrease: { - const kb = keybindingService.lookupKeybinding(DECREASE_HOVER_VERBOSITY_ACTION_ID); - return kb ? - nls.localize('decreaseVerbosityWithKb', "Decrease Hover Verbosity ({0})", kb.getLabel()) : - nls.localize('decreaseVerbosity', "Decrease Hover Verbosity"); - } + case HoverVerbosityAction.Increase: + return keybindingService.appendKeybinding(nls.localize('increaseVerbosity', "Increase Hover Verbosity"), INCREASE_HOVER_VERBOSITY_ACTION_ID); + case HoverVerbosityAction.Decrease: + return keybindingService.appendKeybinding(nls.localize('decreaseVerbosity', "Decrease Hover Verbosity"), DECREASE_HOVER_VERBOSITY_ACTION_ID); } } diff --git a/src/vs/editor/contrib/inlineCompletions/browser/hintsWidget/inlineCompletionsHintsWidget.ts b/src/vs/editor/contrib/inlineCompletions/browser/hintsWidget/inlineCompletionsHintsWidget.ts index 52b393c1949..3ecd2a1daa1 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/hintsWidget/inlineCompletionsHintsWidget.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/hintsWidget/inlineCompletionsHintsWidget.ts @@ -143,12 +143,7 @@ export class InlineSuggestionHintsContentWidget extends Disposable implements IC true, () => this._commandService.executeCommand(commandId), ); - const kb = this.keybindingService.lookupKeybinding(commandId, this._contextKeyService); - let tooltip = label; - if (kb) { - tooltip = localize({ key: 'content', comment: ['A label', 'A keybinding'] }, '{0} ({1})', label, kb.getLabel()); - } - action.tooltip = tooltip; + action.tooltip = this.keybindingService.appendKeybinding(label, commandId, this._contextKeyService); return action; } diff --git a/src/vs/platform/actions/browser/actionWidgetDropdownActionViewItem.ts b/src/vs/platform/actions/browser/actionWidgetDropdownActionViewItem.ts index 051603577f7..9f8c1783787 100644 --- a/src/vs/platform/actions/browser/actionWidgetDropdownActionViewItem.ts +++ b/src/vs/platform/actions/browser/actionWidgetDropdownActionViewItem.ts @@ -74,13 +74,8 @@ export class ActionWidgetDropdownActionViewItem extends BaseActionViewItem { } protected override getTooltip() { - const keybinding = this._keybindingService.lookupKeybinding(this.action.id, this._contextKeyService); - const keybindingLabel = keybinding && keybinding.getLabel(); - const tooltip = this.action.tooltip ?? this.action.label; - return keybindingLabel - ? `${tooltip} (${keybindingLabel})` - : tooltip; + return this._keybindingService.appendKeybinding(tooltip, this.action.id, this._contextKeyService); } show(): void { diff --git a/src/vs/platform/actions/browser/buttonbar.ts b/src/vs/platform/actions/browser/buttonbar.ts index 1e29718f04a..45778e15a54 100644 --- a/src/vs/platform/actions/browser/buttonbar.ts +++ b/src/vs/platform/actions/browser/buttonbar.ts @@ -85,12 +85,9 @@ export class WorkbenchButtonBar extends ButtonBar { const actionOrSubmenu = actions[i]; let action: IAction; let btn: IButton; - let tooltip: string = ''; - const kb = actionOrSubmenu instanceof SubmenuAction ? '' : this._keybindingService.lookupKeybinding(actionOrSubmenu.id); - if (kb) { - tooltip = localize('labelWithKeybinding', "{0} ({1})", actionOrSubmenu.tooltip || actionOrSubmenu.label, kb.getLabel()); - } else { - tooltip = actionOrSubmenu.tooltip || actionOrSubmenu.label; + let tooltip = actionOrSubmenu.tooltip || actionOrSubmenu.label; + if (!(actionOrSubmenu instanceof SubmenuAction)) { + tooltip = this._keybindingService.appendKeybinding(tooltip, actionOrSubmenu.id); } if (actionOrSubmenu instanceof SubmenuAction && actionOrSubmenu.actions.length > 0) { const [first, ...rest] = actionOrSubmenu.actions; diff --git a/src/vs/platform/actions/browser/dropdownActionViewItemWithKeybinding.ts b/src/vs/platform/actions/browser/dropdownActionViewItemWithKeybinding.ts index 2fd4cc5d0e5..3d43b4f1505 100644 --- a/src/vs/platform/actions/browser/dropdownActionViewItemWithKeybinding.ts +++ b/src/vs/platform/actions/browser/dropdownActionViewItemWithKeybinding.ts @@ -7,7 +7,6 @@ import { IContextMenuProvider } from '../../../base/browser/contextmenu.js'; import { IActionProvider } from '../../../base/browser/ui/dropdown/dropdown.js'; import { DropdownMenuActionViewItem, IDropdownMenuActionViewItemOptions } from '../../../base/browser/ui/dropdown/dropdownActionViewItem.js'; import { IAction } from '../../../base/common/actions.js'; -import * as nls from '../../../nls.js'; import { IContextKeyService } from '../../contextkey/common/contextkey.js'; import { IKeybindingService } from '../../keybinding/common/keybinding.js'; @@ -24,12 +23,7 @@ export class DropdownMenuActionViewItemWithKeybinding extends DropdownMenuAction } protected override getTooltip() { - const keybinding = this.keybindingService.lookupKeybinding(this.action.id, this.contextKeyService); - const keybindingLabel = keybinding && keybinding.getLabel(); - const tooltip = this.action.tooltip ?? this.action.label; - return keybindingLabel - ? nls.localize('titleAndKb', "{0} ({1})", tooltip, keybindingLabel) - : tooltip; + return this.keybindingService.appendKeybinding(tooltip, this.action.id, this.contextKeyService); } } diff --git a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts index 806513fc139..d4aaf2834f5 100644 --- a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts +++ b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts @@ -263,20 +263,11 @@ export class MenuEntryActionViewItem { onDidChangeContext: undefined!, bufferChangeEvents() { }, createKey: undefined!, - contextMatchesRules: undefined!, + contextMatchesRules: (rules: ContextKeyExpression | null | undefined) => { + if (!rules) { + return true; + } + if (!currentContextValue) { + return false; + } + return rules.evaluate(currentContextValue); + }, getContextKeyValue: undefined!, createScoped: undefined!, createOverlay: undefined!, @@ -613,4 +621,110 @@ suite('AbstractKeybindingService', () => { kbService.dispose(); }); + + suite('appendKeybinding', () => { + test('appends keybinding label when command has a keybinding', () => { + const kbService = createTestKeybindingService([ + kbItem(KeyMod.CtrlCmd | KeyCode.KeyK, 'myCommand'), + ]); + + const result = kbService.appendKeybinding('My Label', 'myCommand'); + const expectedLabel = toUsLabel(KeyMod.CtrlCmd | KeyCode.KeyK); + assert.strictEqual(result, `My Label (${expectedLabel})`); + + kbService.dispose(); + }); + + test('returns only label when command has no keybinding', () => { + const kbService = createTestKeybindingService([]); + + const result = kbService.appendKeybinding('My Label', 'myCommand'); + assert.strictEqual(result, 'My Label'); + + kbService.dispose(); + }); + + test('returns only label when commandId is null', () => { + const kbService = createTestKeybindingService([ + kbItem(KeyMod.CtrlCmd | KeyCode.KeyK, 'myCommand'), + ]); + + const result = kbService.appendKeybinding('My Label', null); + assert.strictEqual(result, 'My Label'); + + kbService.dispose(); + }); + + test('returns only label when commandId is undefined', () => { + const kbService = createTestKeybindingService([ + kbItem(KeyMod.CtrlCmd | KeyCode.KeyK, 'myCommand'), + ]); + + const result = kbService.appendKeybinding('My Label', undefined); + assert.strictEqual(result, 'My Label'); + + kbService.dispose(); + }); + + test('returns only label when commandId is empty string', () => { + const kbService = createTestKeybindingService([ + kbItem(KeyMod.CtrlCmd | KeyCode.KeyK, 'myCommand'), + ]); + + const result = kbService.appendKeybinding('My Label', ''); + assert.strictEqual(result, 'My Label'); + + kbService.dispose(); + }); + + test('appends keybinding for command with context when context matches', () => { + const kbService = createTestKeybindingService([ + kbItem(KeyMod.CtrlCmd | KeyCode.KeyK, 'myCommand', ContextKeyExpr.has('key1')), + ]); + + currentContextValue = createContext({ key1: true }); + const result = kbService.appendKeybinding('My Label', 'myCommand'); + const expectedLabel = toUsLabel(KeyMod.CtrlCmd | KeyCode.KeyK); + assert.strictEqual(result, `My Label (${expectedLabel})`); + + kbService.dispose(); + }); + + test('returns only label when context does not match and enforceContextCheck is true', () => { + const kbService = createTestKeybindingService([ + kbItem(KeyMod.CtrlCmd | KeyCode.KeyK, 'myCommand', ContextKeyExpr.has('key1')), + ]); + + currentContextValue = createContext({}); + const result = kbService.appendKeybinding('My Label', 'myCommand', undefined, true); + assert.strictEqual(result, 'My Label'); + + kbService.dispose(); + }); + + test('appends keybinding when context does not match but enforceContextCheck is false', () => { + const kbService = createTestKeybindingService([ + kbItem(KeyMod.CtrlCmd | KeyCode.KeyK, 'myCommand', ContextKeyExpr.has('key1')), + ]); + + currentContextValue = createContext({}); + const result = kbService.appendKeybinding('My Label', 'myCommand', undefined, false); + const expectedLabel = toUsLabel(KeyMod.CtrlCmd | KeyCode.KeyK); + assert.strictEqual(result, `My Label (${expectedLabel})`); + + kbService.dispose(); + }); + + test('appends keybinding even when label is empty string', () => { + const kbService = createTestKeybindingService([ + kbItem(KeyMod.CtrlCmd | KeyCode.KeyK, 'myCommand'), + ]); + + const result = kbService.appendKeybinding('', 'myCommand'); + const expectedLabel = toUsLabel(KeyMod.CtrlCmd | KeyCode.KeyK); + assert.strictEqual(result, ` (${expectedLabel})`); + + kbService.dispose(); + }); + }); }); diff --git a/src/vs/platform/keybinding/test/common/mockKeybindingService.ts b/src/vs/platform/keybinding/test/common/mockKeybindingService.ts index b6263c56417..017e96fd0df 100644 --- a/src/vs/platform/keybinding/test/common/mockKeybindingService.ts +++ b/src/vs/platform/keybinding/test/common/mockKeybindingService.ts @@ -171,4 +171,8 @@ export class MockKeybindingService implements IKeybindingService { public registerSchemaContribution() { return Disposable.None; } + + public appendKeybinding(label: string, _commandId: string, _context?: IContextKeyService, _enforceContextCheck?: boolean): string { + return label; + } } diff --git a/src/vs/workbench/browser/codeeditor.ts b/src/vs/workbench/browser/codeeditor.ts index a6fed60780e..81f18b872bc 100644 --- a/src/vs/workbench/browser/codeeditor.ts +++ b/src/vs/workbench/browser/codeeditor.ts @@ -139,11 +139,7 @@ export class FloatingEditorClickWidget extends FloatingClickWidget implements IO keyBindingAction: string | null, @IKeybindingService keybindingService: IKeybindingService ) { - super( - keyBindingAction && keybindingService.lookupKeybinding(keyBindingAction) - ? `${label} (${keybindingService.lookupKeybinding(keyBindingAction)!.getLabel()})` - : label - ); + super(keybindingService.appendKeybinding(label, keyBindingAction)); } getId(): string { diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatElicitationContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatElicitationContentPart.ts index 8da7eb3c247..1f3153f0cb4 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatElicitationContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatElicitationContentPart.ts @@ -47,8 +47,7 @@ export class ChatElicitationContentPart extends Disposable implements IChatConte const buttons: IChatConfirmationButton[] = []; if (elicitation.kind === 'elicitation2') { - const acceptKeybinding = this.keybindingService.lookupKeybinding(AcceptElicitationRequestActionId); - const acceptTooltip = acceptKeybinding ? `${elicitation.acceptButtonLabel} (${acceptKeybinding.getLabel()})` : elicitation.acceptButtonLabel; + const acceptTooltip = this.keybindingService.appendKeybinding(elicitation.acceptButtonLabel, AcceptElicitationRequestActionId); buttons.push({ label: elicitation.acceptButtonLabel, diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/abstractToolConfirmationSubPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/abstractToolConfirmationSubPart.ts index c2ac795f45e..4e7e5b1b02e 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/abstractToolConfirmationSubPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/abstractToolConfirmationSubPart.ts @@ -54,10 +54,8 @@ export abstract class AbstractToolConfirmationSubPart extends BaseChatToolInvoca } protected render(config: IToolConfirmationConfig) { const { keybindingService, languageModelToolsService, toolInvocation } = this; - const allowKeybinding = keybindingService.lookupKeybinding(config.allowActionId)?.getLabel(); - const allowTooltip = allowKeybinding ? `${config.allowLabel} (${allowKeybinding})` : config.allowLabel; - const skipKeybinding = keybindingService.lookupKeybinding(config.skipActionId)?.getLabel(); - const skipTooltip = skipKeybinding ? `${config.skipLabel} (${skipKeybinding})` : config.skipLabel; + const allowTooltip = keybindingService.appendKeybinding(config.allowLabel, config.allowActionId); + const skipTooltip = keybindingService.appendKeybinding(config.skipLabel, config.skipActionId); const additionalActions = this.additionalPrimaryActions(); diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatExtensionsInstallToolSubPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatExtensionsInstallToolSubPart.ts index 7f19ecc763a..f22061a2fda 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatExtensionsInstallToolSubPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatExtensionsInstallToolSubPart.ts @@ -57,12 +57,10 @@ export class ExtensionsInstallConfirmationWidgetSubPart extends BaseChatToolInvo if (toolInvocation.state.get().type === IChatToolInvocation.StateKind.WaitingForConfirmation) { const allowLabel = localize('allow', "Allow"); - const allowKeybinding = keybindingService.lookupKeybinding(AcceptToolConfirmationActionId)?.getLabel(); - const allowTooltip = allowKeybinding ? `${allowLabel} (${allowKeybinding})` : allowLabel; + const allowTooltip = keybindingService.appendKeybinding(allowLabel, AcceptToolConfirmationActionId); const cancelLabel = localize('cancel', "Cancel"); - const cancelKeybinding = keybindingService.lookupKeybinding(CancelChatActionId)?.getLabel(); - const cancelTooltip = cancelKeybinding ? `${cancelLabel} (${cancelKeybinding})` : cancelLabel; + const cancelTooltip = keybindingService.appendKeybinding(cancelLabel, CancelChatActionId); const enableAllowButtonEvent = this._register(new Emitter()); const buttons: IChatConfirmationButton[] = [ diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolConfirmationSubPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolConfirmationSubPart.ts index ffd78ae9466..5aac35bdcdd 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolConfirmationSubPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolConfirmationSubPart.ts @@ -332,8 +332,7 @@ export class ChatTerminalToolConfirmationSubPart extends BaseChatToolInvocationS private _createButtons(moreActions: (IChatConfirmationButton | Separator)[] | undefined): IChatConfirmationButton[] { const getLabelAndTooltip = (label: string, actionId: string, tooltipDetail: string = label): { label: string; tooltip: string } => { - const keybinding = this.keybindingService.lookupKeybinding(actionId)?.getLabel(); - const tooltip = keybinding ? `${tooltipDetail} (${keybinding})` : (tooltipDetail); + const tooltip = this.keybindingService.appendKeybinding(tooltipDetail, actionId); return { label, tooltip }; }; return [ diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts index c6240ef2759..7735e346ae8 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts @@ -1072,9 +1072,7 @@ export class ToggleChatTerminalOutputAction extends Action implements IAction { } private _updateTooltip(): void { - const keybinding = this._keybindingService.lookupKeybinding(TerminalContribCommandId.FocusMostRecentChatTerminalOutput); - const label = keybinding?.getLabel(); - this.tooltip = label ? `${this.label} (${label})` : this.label; + this.tooltip = this._keybindingService.appendKeybinding(this.label, TerminalContribCommandId.ToggleChatTerminalOutput); } } @@ -1170,8 +1168,6 @@ export class FocusChatInstanceAction extends Action implements IAction { } private _updateTooltip(): void { - const keybinding = this._keybindingService.lookupKeybinding(TerminalContribCommandId.FocusMostRecentChatTerminal); - const label = keybinding?.getLabel(); - this.tooltip = label ? `${this.label} (${label})` : this.label; + this.tooltip = this._keybindingService.appendKeybinding(this.label, TerminalContribCommandId.FocusChatInstanceAction); } } diff --git a/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorOverlay.ts b/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorOverlay.ts index a97a8f123f2..7539fc7fd39 100644 --- a/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorOverlay.ts +++ b/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorOverlay.ts @@ -280,11 +280,7 @@ class ChatEditorOverlayWidget extends Disposable { if (!value) { return value; } - const kb = that._keybindingService.lookupKeybinding(this.action.id); - if (!kb) { - return value; - } - return localize('tooltip', "{0} ({1})", value, kb.getLabel()); + return that._keybindingService.appendKeybinding(value, action.id); } }; } diff --git a/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts index 4cc65487d31..5bf295d2dcb 100644 --- a/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts @@ -265,13 +265,7 @@ export class ChatMarkdownDecorationsRenderer { private injectKeybindingHint(a: HTMLAnchorElement, href: string, keybindingService: IKeybindingService): void { const command = href.match(/command:([^\)]+)/)?.[1]; if (command) { - const kb = keybindingService.lookupKeybinding(command); - if (kb) { - const keybinding = kb.getLabel(); - if (keybinding) { - a.textContent = `${a.textContent} (${keybinding})`; - } - } + a.textContent = keybindingService.appendKeybinding(a.textContent || '', command); } } } diff --git a/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts b/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts index eff5ea8254c..a3c7b7d6ce5 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts @@ -275,11 +275,7 @@ export abstract class SimpleFindWidget extends Widget implements IVerticalSashLa } private _getKeybinding(actionId: string): string { - const kb = this._keybindingService?.lookupKeybinding(actionId); - if (!kb) { - return ''; - } - return ` (${kb.getLabel()})`; + return this._keybindingService.appendKeybinding('', actionId); } override dispose() { diff --git a/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts b/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts index f4b9cf42ea3..522fbd58a71 100644 --- a/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts +++ b/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts @@ -79,9 +79,7 @@ export class StartDebugActionViewItem extends BaseActionViewItem { this.container = container; container.classList.add('start-debug-action-item'); this.start = dom.append(container, $(ThemeIcon.asCSSSelector(debugStart))); - const keybinding = this.keybindingService.lookupKeybinding(this.action.id)?.getLabel(); - const keybindingLabel = keybinding ? ` (${keybinding})` : ''; - const title = this.action.label + keybindingLabel; + const title = this.keybindingService.appendKeybinding(this.action.label, this.action.id); this.toDispose.push(this.hoverService.setupManagedHover(getDefaultHoverDelegate('mouse'), this.start, title)); this.start.setAttribute('role', 'button'); this._setAriaLabel(title); diff --git a/src/vs/workbench/contrib/debug/browser/welcomeView.ts b/src/vs/workbench/contrib/debug/browser/welcomeView.ts index 481f775794f..32a641f082c 100644 --- a/src/vs/workbench/contrib/debug/browser/welcomeView.ts +++ b/src/vs/workbench/contrib/debug/browser/welcomeView.ts @@ -105,8 +105,7 @@ export class WelcomeView extends ViewPane { })); setContextKey(); - const debugKeybinding = this.keybindingService.lookupKeybinding(DEBUG_START_COMMAND_ID); - debugKeybindingLabel = debugKeybinding ? ` (${debugKeybinding.getLabel()})` : ''; + debugKeybindingLabel = this.keybindingService.appendKeybinding('', DEBUG_START_COMMAND_ID); } override shouldShowWelcome(): boolean { diff --git a/src/vs/workbench/contrib/languageDetection/browser/languageDetection.contribution.ts b/src/vs/workbench/contrib/languageDetection/browser/languageDetection.contribution.ts index 729a6932d6e..1e6a0cb4184 100644 --- a/src/vs/workbench/contrib/languageDetection/browser/languageDetection.contribution.ts +++ b/src/vs/workbench/contrib/languageDetection/browser/languageDetection.contribution.ts @@ -88,12 +88,10 @@ class LanguageDetectionStatusContribution implements IWorkbenchContribution { const existing = editorModel.getLanguageId(); if (lang && lang !== existing && skip[existing] !== lang) { const detectedName = this._languageService.getLanguageName(lang) || lang; - let tooltip = localize('status.autoDetectLanguage', "Accept Detected Language: {0}", detectedName); - const keybinding = this._keybindingService.lookupKeybinding(detectLanguageCommandId); - const label = keybinding?.getLabel(); - if (label) { - tooltip += ` (${label})`; - } + const tooltip = this._keybindingService.appendKeybinding( + localize('status.autoDetectLanguage', "Accept Detected Language: {0}", detectedName), + detectLanguageCommandId + ); const props: IStatusbarEntry = { name: localize('langDetection.name', "Language Detection"), diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/cellDiagnostics/diagnosticCellStatusBarContrib.ts b/src/vs/workbench/contrib/notebook/browser/contrib/cellDiagnostics/diagnosticCellStatusBarContrib.ts index f10ea92275c..4b6d687244b 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/cellDiagnostics/diagnosticCellStatusBarContrib.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/cellDiagnostics/diagnosticCellStatusBarContrib.ts @@ -58,8 +58,9 @@ class DiagnosticCellStatusBarItem extends Disposable { let item: INotebookCellStatusBarItem | undefined; if (error?.location && this.hasNotebookAgent()) { - const keybinding = this.keybindingService.lookupKeybinding(OPEN_CELL_FAILURE_ACTIONS_COMMAND_ID)?.getLabel(); - const tooltip = localize('notebook.cell.status.diagnostic', "Quick Actions {0}", `(${keybinding})`); + const tooltip = this.keybindingService.appendKeybinding( + localize('notebook.cell.status.diagnostic', "Quick Actions"), + OPEN_CELL_FAILURE_ACTIONS_COMMAND_ID); item = { text: `$(sparkle)`, diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/statusBarProviders.ts b/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/statusBarProviders.ts index 4434091f38d..2707009bb29 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/statusBarProviders.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/statusBarProviders.ts @@ -137,12 +137,10 @@ class CellStatusBarLanguageDetectionProvider implements INotebookCellStatusBarIt const items: INotebookCellStatusBarItem[] = []; if (cached.guess && currentLanguageId !== cached.guess) { const detectedName = this._languageService.getLanguageName(cached.guess) || cached.guess; - let tooltip = localize('notebook.cell.status.autoDetectLanguage', "Accept Detected Language: {0}", detectedName); - const keybinding = this._keybindingService.lookupKeybinding(DETECT_CELL_LANGUAGE); - const label = keybinding?.getLabel(); - if (label) { - tooltip += ` (${label})`; - } + const tooltip = this._keybindingService.appendKeybinding( + localize('notebook.cell.status.autoDetectLanguage', "Accept Detected Language: {0}", detectedName), + DETECT_CELL_LANGUAGE + ); items.push({ text: '$(lightbulb-autofix)', command: DETECT_CELL_LANGUAGE, diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts index d4d6346c8a2..759f22b3926 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts @@ -886,23 +886,21 @@ class ActionsColumnRenderer implements ITableRenderer{ class: ThemeIcon.asClassName(keybindingsEditIcon), enabled: true, id: 'editKeybinding', - tooltip: keybinding ? localize('editKeybindingLabelWithKey', "Change Keybinding {0}", `(${keybinding.getLabel()})`) : localize('editKeybindingLabel', "Change Keybinding"), + tooltip: this.keybindingsService.appendKeybinding(localize('editKeybindingLabel', "Change Keybinding"), KEYBINDINGS_EDITOR_COMMAND_DEFINE), run: () => this.keybindingsEditor.defineKeybinding(keybindingItemEntry, false) }; } private createAddAction(keybindingItemEntry: IKeybindingItemEntry): IAction { - const keybinding = this.keybindingsService.lookupKeybinding(KEYBINDINGS_EDITOR_COMMAND_DEFINE); return { class: ThemeIcon.asClassName(keybindingsAddIcon), enabled: true, id: 'addKeybinding', - tooltip: keybinding ? localize('addKeybindingLabelWithKey', "Add Keybinding {0}", `(${keybinding.getLabel()})`) : localize('addKeybindingLabel', "Add Keybinding"), + tooltip: this.keybindingsService.appendKeybinding(localize('addKeybindingLabel', "Add Keybinding"), KEYBINDINGS_EDITOR_COMMAND_DEFINE), run: () => this.keybindingsEditor.defineKeybinding(keybindingItemEntry, false) }; } diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 6e680158a18..41cc21a6393 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -963,11 +963,9 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre } protected renderSettingToolbar(container: HTMLElement): ToolBar { - const toggleMenuKeybinding = this._keybindingService.lookupKeybinding(SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU); - let toggleMenuTitle = localize('settingsContextMenuTitle', "More Actions... "); - if (toggleMenuKeybinding) { - toggleMenuTitle += ` (${toggleMenuKeybinding && toggleMenuKeybinding.getLabel()})`; - } + const toggleMenuTitle = this._keybindingService.appendKeybinding( + localize('settingsContextMenuTitle', "More Actions... "), + SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU); const toolbar = new ToolBar(container, this._contextMenuService, { toggleMenuTitle, diff --git a/src/vs/workbench/contrib/scm/browser/quickDiffWidget.ts b/src/vs/workbench/contrib/scm/browser/quickDiffWidget.ts index fe5daf3b009..a9d0a01955b 100644 --- a/src/vs/workbench/contrib/scm/browser/quickDiffWidget.ts +++ b/src/vs/workbench/contrib/scm/browser/quickDiffWidget.ts @@ -130,8 +130,7 @@ class QuickDiffWidgetEditorAction extends Action { @IKeybindingService keybindingService: IKeybindingService, @IInstantiationService instantiationService: IInstantiationService ) { - const keybinding = keybindingService.lookupKeybinding(action.id); - const label = action.label + (keybinding ? ` (${keybinding.getLabel()})` : ''); + const label = keybindingService.appendKeybinding(action.label, action.id); super(action.id, label, cssClass); diff --git a/src/vs/workbench/contrib/search/browser/searchActionsBase.ts b/src/vs/workbench/contrib/search/browser/searchActionsBase.ts index 1f37b942b83..7a180f06375 100644 --- a/src/vs/workbench/contrib/search/browser/searchActionsBase.ts +++ b/src/vs/workbench/contrib/search/browser/searchActionsBase.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as DOM from '../../../../base/browser/dom.js'; -import { ResolvedKeybinding } from '../../../../base/common/keybindings.js'; import * as nls from '../../../../nls.js'; import { WorkbenchCompressibleAsyncDataTree } from '../../../../platform/list/browser/listService.js'; import { IViewsService } from '../../../services/views/common/viewsService.js'; @@ -20,10 +19,6 @@ export function isSearchViewFocused(viewsService: IViewsService): boolean { return !!(searchView && DOM.isAncestorOfActiveElement(searchView.getContainer())); } -export function appendKeyBindingLabel(label: string, inputKeyBinding: ResolvedKeybinding | undefined): string { - return doAppendKeyBindingLabel(label, inputKeyBinding); -} - export function getSearchView(viewsService: IViewsService): SearchView | undefined { return viewsService.getActiveViewWithId(VIEW_ID) as SearchView; } @@ -68,8 +63,3 @@ function hasDownstreamMatch(elements: RenderableMatch[], focusElement: Renderabl export function openSearchView(viewsService: IViewsService, focus?: boolean): Promise { return viewsService.openView(VIEW_ID, focus).then(view => (view as SearchView ?? undefined)); } - -function doAppendKeyBindingLabel(label: string, keyBinding: ResolvedKeybinding | undefined): string { - return keyBinding ? label + ' (' + keyBinding.getLabel() + ')' : label; -} - diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts index 40149347923..0256e773d0e 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -56,7 +56,6 @@ import { Memento } from '../../../common/memento.js'; import { IViewDescriptorService } from '../../../common/views.js'; import { NotebookEditor } from '../../notebook/browser/notebookEditor.js'; import { ExcludePatternInputWidget, IncludePatternInputWidget } from './patternInputWidget.js'; -import { appendKeyBindingLabel } from './searchActionsBase.js'; import { IFindInFilesArgs } from './searchActionsFind.js'; import { searchDetailsIcon } from './searchIcons.js'; import { renderSearchMessage } from './searchMessage.js'; @@ -1727,9 +1726,9 @@ export class SearchView extends ViewPane { } private appendSearchWithAIButton(messageEl: HTMLElement) { - const searchWithAIButtonTooltip = appendKeyBindingLabel( + const searchWithAIButtonTooltip = this.keybindingService.appendKeybinding( nls.localize('triggerAISearch.tooltip', "Search with AI."), - this.keybindingService.lookupKeybinding(Constants.SearchCommandIds.SearchWithAIActionId) + Constants.SearchCommandIds.SearchWithAIActionId ); const searchWithAIButtonText = nls.localize('searchWithAIButtonTooltip', "Search with AI"); const searchWithAIButton = this.messageDisposables.add(new SearchLinkButton( @@ -2029,9 +2028,9 @@ export class SearchView extends ViewPane { dom.append(messageEl, ' - '); - const openInEditorTooltip = appendKeyBindingLabel( + const openInEditorTooltip = this.keybindingService.appendKeybinding( nls.localize('openInEditor.tooltip', "Copy current search results to an editor"), - this.keybindingService.lookupKeybinding(Constants.SearchCommandIds.OpenInEditorCommandId)); + Constants.SearchCommandIds.OpenInEditorCommandId); const openInEditorButton = this.messageDisposables.add(new SearchLinkButton( nls.localize('openInEditor.message', "Open in editor"), () => this.instantiationService.invokeFunction(createEditorFromSearchResult, this.searchResult, this.searchIncludePattern.getValue(), this.searchExcludePattern.getValue(), this.searchIncludePattern.onlySearchInOpenEditors()), this.hoverService, diff --git a/src/vs/workbench/contrib/search/browser/searchWidget.ts b/src/vs/workbench/contrib/search/browser/searchWidget.ts index 2b370417065..dc22006c34a 100644 --- a/src/vs/workbench/contrib/search/browser/searchWidget.ts +++ b/src/vs/workbench/contrib/search/browser/searchWidget.ts @@ -26,7 +26,7 @@ import { KeybindingsRegistry, KeybindingWeight } from '../../../../platform/keyb import { ISearchConfigurationProperties } from '../../../services/search/common/search.js'; import { ThemeIcon } from '../../../../base/common/themables.js'; import { ContextScopedReplaceInput } from '../../../../platform/history/browser/contextScopedHistoryWidget.js'; -import { appendKeyBindingLabel, isSearchViewFocused, getSearchView } from './searchActionsBase.js'; +import { isSearchViewFocused, getSearchView } from './searchActionsBase.js'; import * as Constants from '../common/constants.js'; import { IAccessibilityService } from '../../../../platform/accessibility/common/accessibility.js'; import { isMacintosh } from '../../../../base/common/platform.js'; @@ -117,8 +117,7 @@ export class SearchWidget extends Widget { private static readonly REPLACE_ALL_DISABLED_LABEL = nls.localize('search.action.replaceAll.disabled.label', "Replace All (Submit Search to Enable)"); private static readonly REPLACE_ALL_ENABLED_LABEL = (keyBindingService2: IKeybindingService): string => { - const kb = keyBindingService2.lookupKeybinding(ReplaceAllAction.ID); - return appendKeyBindingLabel(nls.localize('search.action.replaceAll.enabled.label', "Replace All"), kb); + return keyBindingService2.appendKeybinding(nls.localize('search.action.replaceAll.enabled.label', "Replace All"), ReplaceAllAction.ID); }; domNode: HTMLElement | undefined; @@ -400,9 +399,9 @@ export class SearchWidget extends Widget { label: nls.localize('label.Search', 'Search: Type Search Term and press Enter to search'), validation: (value: string) => this.validateSearchInput(value), placeholder: nls.localize('search.placeHolder', "Search"), - appendCaseSensitiveLabel: appendKeyBindingLabel('', this.keybindingService.lookupKeybinding(Constants.SearchCommandIds.ToggleCaseSensitiveCommandId)), - appendWholeWordsLabel: appendKeyBindingLabel('', this.keybindingService.lookupKeybinding(Constants.SearchCommandIds.ToggleWholeWordCommandId)), - appendRegexLabel: appendKeyBindingLabel('', this.keybindingService.lookupKeybinding(Constants.SearchCommandIds.ToggleRegexCommandId)), + appendCaseSensitiveLabel: this.keybindingService.appendKeybinding('', Constants.SearchCommandIds.ToggleCaseSensitiveCommandId), + appendWholeWordsLabel: this.keybindingService.appendKeybinding('', Constants.SearchCommandIds.ToggleWholeWordCommandId), + appendRegexLabel: this.keybindingService.appendKeybinding('', Constants.SearchCommandIds.ToggleRegexCommandId), history: new Set(history), showHistoryHint: () => showHistoryKeybindingHint(this.keybindingService), flexibleHeight: true, @@ -465,7 +464,7 @@ export class SearchWidget extends Widget { this.showContextToggle = new Toggle({ isChecked: false, - title: appendKeyBindingLabel(nls.localize('showContext', "Toggle Context Lines"), this.keybindingService.lookupKeybinding(ToggleSearchEditorContextLinesCommandId)), + title: this.keybindingService.appendKeybinding(nls.localize('showContext', "Toggle Context Lines"), ToggleSearchEditorContextLinesCommandId), icon: searchShowContextIcon, hoverLifecycleOptions, ...defaultToggleStyles @@ -513,7 +512,7 @@ export class SearchWidget extends Widget { this.replaceInput = this._register(new ContextScopedReplaceInput(replaceBox, this.contextViewService, { label: nls.localize('label.Replace', 'Replace: Type replace term and press Enter to preview'), placeholder: nls.localize('search.replace.placeHolder', "Replace"), - appendPreserveCaseLabel: appendKeyBindingLabel('', this.keybindingService.lookupKeybinding(Constants.SearchCommandIds.TogglePreserveCaseId)), + appendPreserveCaseLabel: this.keybindingService.appendKeybinding('', Constants.SearchCommandIds.TogglePreserveCaseId), history: new Set(options.replaceHistory), showHistoryHint: () => showHistoryKeybindingHint(this.keybindingService), flexibleHeight: true, diff --git a/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts b/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts index a98a27cf60d..c1ccc1aac11 100644 --- a/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts +++ b/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts @@ -718,10 +718,7 @@ class CoverageToolbarWidget extends Disposable implements IOverlayWidget { () => this.coverage.showInline.set(!this.coverage.showInline.get(), undefined), ); - const kb = this.keybindingService.lookupKeybinding(TOGGLE_INLINE_COMMAND_ID); - if (kb) { - toggleAction.tooltip = `${TOGGLE_INLINE_COMMAND_TEXT} (${kb.getLabel()})`; - } + toggleAction.tooltip = this.keybindingService.appendKeybinding(TOGGLE_INLINE_COMMAND_TEXT, TOGGLE_INLINE_COMMAND_ID); const hasUncoveredStmt = current.coverage.statement.covered < current.coverage.statement.total; // Navigation buttons for missed coverage lines diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index b8b3b650c5e..1fd3b3c7380 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -1210,7 +1210,7 @@ class ZoomStatusEntry extends Disposable { const zoomOutAction: Action = disposables.add(new Action('workbench.action.zoomOut', localize('zoomOut', "Zoom Out"), ThemeIcon.asClassName(Codicon.remove), true, () => this.commandService.executeCommand(zoomOutAction.id))); const zoomInAction: Action = disposables.add(new Action('workbench.action.zoomIn', localize('zoomIn', "Zoom In"), ThemeIcon.asClassName(Codicon.plus), true, () => this.commandService.executeCommand(zoomInAction.id))); const zoomResetAction: Action = disposables.add(new Action('workbench.action.zoomReset', localize('zoomReset', "Reset"), undefined, true, () => this.commandService.executeCommand(zoomResetAction.id))); - zoomResetAction.tooltip = localize('zoomResetLabel', "{0} ({1})", zoomResetAction.label, this.keybindingService.lookupKeybinding(zoomResetAction.id)?.getLabel()); + zoomResetAction.tooltip = this.keybindingService.appendKeybinding(zoomResetAction.label, zoomResetAction.id); const zoomSettingsAction: Action = disposables.add(new Action('workbench.action.openSettings', localize('zoomSettings', "Settings"), ThemeIcon.asClassName(Codicon.settingsGear), true, () => this.commandService.executeCommand(zoomSettingsAction.id, 'window.zoom'))); const zoomLevelLabel = disposables.add(new Action('zoomLabel', undefined, undefined, false)); From 0b3f15dd0c79c1fb2bea94d50e8e0a5c9ee70e87 Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Wed, 17 Dec 2025 00:22:42 -0800 Subject: [PATCH 2/3] Update src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../toolInvocationParts/chatTerminalToolProgressPart.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts index 7735e346ae8..1dde8cc2b58 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts @@ -1168,6 +1168,6 @@ export class FocusChatInstanceAction extends Action implements IAction { } private _updateTooltip(): void { - this.tooltip = this._keybindingService.appendKeybinding(this.label, TerminalContribCommandId.FocusChatInstanceAction); + this.tooltip = this._keybindingService.appendKeybinding(this.label, TerminalContribCommandId.FocusMostRecentChatTerminal); } } From 4b2a294e5ee979755045654de7c33d155a5be79f Mon Sep 17 00:00:00 2001 From: Dmitriy Vasyura Date: Wed, 17 Dec 2025 00:23:08 -0800 Subject: [PATCH 3/3] Update src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../toolInvocationParts/chatTerminalToolProgressPart.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts index 1dde8cc2b58..9d978ab0e35 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts @@ -1072,7 +1072,7 @@ export class ToggleChatTerminalOutputAction extends Action implements IAction { } private _updateTooltip(): void { - this.tooltip = this._keybindingService.appendKeybinding(this.label, TerminalContribCommandId.ToggleChatTerminalOutput); + this.tooltip = this._keybindingService.appendKeybinding(this.label, TerminalContribCommandId.FocusMostRecentChatTerminalOutput); } }