Skip to content

Commit 5930e94

Browse files
authored
Merge pull request microsoft#236685 from microsoft/alexd/popular-krill
Make Tab and Escape work when focus is in the preview
2 parents 1730c76 + 16074f9 commit 5930e94

File tree

9 files changed

+70
-22
lines changed

9 files changed

+70
-22
lines changed

src/vs/editor/browser/widget/codeEditor/codeEditorWidget.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,11 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE
290290
}));
291291

292292
this._contextKeyService = this._register(contextKeyService.createScoped(this._domElement));
293+
if (codeEditorWidgetOptions.contextKeyValues) {
294+
for (const [key, value] of Object.entries(codeEditorWidgetOptions.contextKeyValues)) {
295+
this._contextKeyService.createKey(key, value);
296+
}
297+
}
293298
this._notificationService = notificationService;
294299
this._codeEditorService = codeEditorService;
295300
this._commandService = commandService;
@@ -1988,6 +1993,12 @@ export interface ICodeEditorWidgetOptions {
19881993
* Defaults to MenuId.SimpleEditorContext or MenuId.EditorContext depending on whether the widget is simple.
19891994
*/
19901995
contextMenuId?: MenuId;
1996+
1997+
/**
1998+
* Define extra context keys that will be defined in the context service
1999+
* for the editor.
2000+
*/
2001+
contextKeyValues?: Record<string, ContextKeyValue>;
19912002
}
19922003

19932004
class ModelData {

src/vs/editor/browser/widget/codeEditor/embeddedCodeEditorWidget.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { ILanguageFeaturesService } from '../../../common/services/languageFeatu
1313
import { IAccessibilityService } from '../../../../platform/accessibility/common/accessibility.js';
1414
import { ICommandService } from '../../../../platform/commands/common/commands.js';
1515
import { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';
16-
import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';
16+
import { IInstantiationService, ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
1717
import { INotificationService } from '../../../../platform/notification/common/notification.js';
1818
import { IThemeService } from '../../../../platform/theme/common/themeService.js';
1919

@@ -61,3 +61,11 @@ export class EmbeddedCodeEditorWidget extends CodeEditorWidget {
6161
super.updateOptions(this._overwriteOptions);
6262
}
6363
}
64+
65+
export function getOuterEditor(accessor: ServicesAccessor): ICodeEditor | null {
66+
const editor = accessor.get(ICodeEditorService).getFocusedCodeEditor();
67+
if (editor instanceof EmbeddedCodeEditorWidget) {
68+
return editor.getParentEditor();
69+
}
70+
return editor;
71+
}

src/vs/editor/contrib/gotoSymbol/browser/peek/referencesController.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ import { Position } from '../../../../common/core/position.js';
1414
import { Range } from '../../../../common/core/range.js';
1515
import { IEditorContribution } from '../../../../common/editorCommon.js';
1616
import { Location } from '../../../../common/languages.js';
17-
import { getOuterEditor, PeekContext } from '../../../peekView/browser/peekView.js';
17+
import { PeekContext } from '../../../peekView/browser/peekView.js';
18+
import { getOuterEditor } from '../../../../browser/widget/codeEditor/embeddedCodeEditorWidget.js';
1819
import * as nls from '../../../../../nls.js';
1920
import { CommandsRegistry } from '../../../../../platform/commands/common/commands.js';
2021
import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';

src/vs/editor/contrib/inlineCompletions/browser/controller/commands.ts

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ import { Action2, MenuId } from '../../../../../platform/actions/common/actions.
1111
import { IClipboardService } from '../../../../../platform/clipboard/common/clipboardService.js';
1212
import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';
1313
import { ContextKeyExpr } from '../../../../../platform/contextkey/common/contextkey.js';
14-
import { KeybindingWeight } from '../../../../../platform/keybinding/common/keybindingsRegistry.js';
14+
import { KeybindingsRegistry, KeybindingWeight } from '../../../../../platform/keybinding/common/keybindingsRegistry.js';
15+
import { INotificationService, Severity } from '../../../../../platform/notification/common/notification.js';
1516
import { ICodeEditor } from '../../../../browser/editorBrowser.js';
1617
import { EditorAction, EditorCommand, ServicesAccessor } from '../../../../browser/editorExtensions.js';
1718
import { EditorContextKeys } from '../../../../common/editorContextKeys.js';
1819
import { Context as SuggestContext } from '../../../suggest/browser/suggest.js';
1920
import { inlineSuggestCommitId, showNextInlineSuggestionActionId, showPreviousInlineSuggestionActionId } from './commandIds.js';
2021
import { InlineCompletionContextKeys } from './inlineCompletionContextKeys.js';
2122
import { InlineCompletionsController } from './inlineCompletionsController.js';
22-
import { INotificationService, Severity } from '../../../../../platform/notification/common/notification.js';
2323

2424
export class ShowNextInlineSuggestionAction extends EditorAction {
2525
public static ID = showNextInlineSuggestionActionId;
@@ -211,14 +211,21 @@ export class AcceptInlineCompletion extends EditorAction {
211211
});
212212
}
213213

214-
public async run(accessor: ServicesAccessor | undefined, editor: ICodeEditor): Promise<void> {
215-
const controller = InlineCompletionsController.get(editor);
214+
public async run(accessor: ServicesAccessor, editor: ICodeEditor): Promise<void> {
215+
const controller = InlineCompletionsController.getInFocusedEditorOrParent(accessor);
216216
if (controller) {
217217
controller.model.get()?.accept(controller.editor);
218218
controller.editor.focus();
219219
}
220220
}
221221
}
222+
KeybindingsRegistry.registerKeybindingRule({
223+
id: inlineSuggestCommitId,
224+
weight: 202, // greater than jump
225+
primary: KeyCode.Tab,
226+
when: ContextKeyExpr.and(InlineCompletionContextKeys.inInlineEditsPreviewEditor)
227+
});
228+
222229

223230
export class JumpToNextInlineEdit extends EditorAction {
224231
constructor() {
@@ -276,14 +283,23 @@ export class HideInlineCompletion extends EditorAction {
276283
});
277284
}
278285

279-
public async run(accessor: ServicesAccessor | undefined, editor: ICodeEditor): Promise<void> {
280-
const controller = InlineCompletionsController.get(editor);
286+
public async run(accessor: ServicesAccessor, editor: ICodeEditor): Promise<void> {
287+
const controller = InlineCompletionsController.getInFocusedEditorOrParent(accessor);
281288
transaction(tx => {
282289
controller?.model.get()?.stop('explicitCancel', tx);
283290
});
291+
controller?.editor.focus();
284292
}
285293
}
286294

295+
KeybindingsRegistry.registerKeybindingRule({
296+
id: HideInlineCompletion.ID,
297+
weight: -1, // very weak
298+
primary: KeyCode.Escape,
299+
secondary: [KeyMod.Shift | KeyCode.Escape],
300+
when: ContextKeyExpr.and(InlineCompletionContextKeys.inInlineEditsPreviewEditor)
301+
});
302+
287303
export class ToggleAlwaysShowInlineSuggestionToolbar extends Action2 {
288304
public static ID = 'editor.action.inlineSuggest.toggleAlwaysShowToolbar';
289305

src/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionContextKeys.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import { RawContextKey } from '../../../../../platform/contextkey/common/contextkey.js';
77
import { localize } from '../../../../../nls.js';
8+
import * as nls from '../../../../../nls.js';
89

910
export abstract class InlineCompletionContextKeys {
1011

@@ -19,4 +20,6 @@ export abstract class InlineCompletionContextKeys {
1920
public static readonly inlineEditVisible = new RawContextKey<boolean>('inlineEditIsVisible', false, localize('inlineEditVisible', "Whether an inline edit is visible"));
2021
public static readonly tabShouldJumpToInlineEdit = new RawContextKey<boolean | undefined>('tabShouldJumpToInlineEdit', false, localize('tabShouldJumpToInlineEdit', "Whether tab should jump to an inline edit."));
2122
public static readonly tabShouldAcceptInlineEdit = new RawContextKey<boolean | undefined>('tabShouldAcceptInlineEdit', false, localize('tabShouldAcceptInlineEdit', "Whether tab should accept the inline edit."));
23+
24+
public static readonly inInlineEditsPreviewEditor = new RawContextKey<boolean>('inInlineEditsPreviewEditor', true, nls.localize('inInlineEditsPreviewEditor', "Whether the current code editor is showing an inline edits preview"));
2225
}

src/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { AccessibilitySignal, IAccessibilitySignalService } from '../../../../..
1616
import { ICommandService } from '../../../../../platform/commands/common/commands.js';
1717
import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';
1818
import { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';
19-
import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';
19+
import { IInstantiationService, ServicesAccessor } from '../../../../../platform/instantiation/common/instantiation.js';
2020
import { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js';
2121
import { hotClassGetOriginalInstance } from '../../../../../platform/observable/common/wrapInHotClass.js';
2222
import { CoreEditingCommands } from '../../../../browser/coreCommands.js';
@@ -36,13 +36,25 @@ import { ObservableContextKeyService } from '../utils.js';
3636
import { inlineSuggestCommitId } from './commandIds.js';
3737
import { InlineCompletionContextKeys } from './inlineCompletionContextKeys.js';
3838
import { InlineCompletionsView } from '../view/inlineCompletionsView.js';
39+
import { getOuterEditor } from '../../../../browser/widget/codeEditor/embeddedCodeEditorWidget.js';
3940

4041
export class InlineCompletionsController extends Disposable {
4142
private static readonly _instances = new Set<InlineCompletionsController>();
4243

4344
public static hot = createHotClass(InlineCompletionsController);
4445
public static ID = 'editor.contrib.inlineCompletionsController';
4546

47+
/**
48+
* Find the controller in the focused editor or in the outer editor (if applicable)
49+
*/
50+
public static getInFocusedEditorOrParent(accessor: ServicesAccessor): InlineCompletionsController | null {
51+
const outerEditor = getOuterEditor(accessor);
52+
if (!outerEditor) {
53+
return null;
54+
}
55+
return InlineCompletionsController.get(outerEditor);
56+
}
57+
4658
public static get(editor: ICodeEditor): InlineCompletionsController | null {
4759
return hotClassGetOriginalInstance(editor.getContribution<InlineCompletionsController>(InlineCompletionsController.ID));
4860
}

src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/sideBySideDiff.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ import { Range } from '../../../../../common/core/range.js';
2828
import { Command } from '../../../../../common/languages.js';
2929
import { ITextModel } from '../../../../../common/model.js';
3030
import { StickyScrollController } from '../../../../stickyScroll/browser/stickyScrollController.js';
31+
import { InlineCompletionContextKeys } from '../../controller/inlineCompletionContextKeys.js';
3132
import { CustomizedMenuWorkbenchToolBar } from '../../hintsWidget/inlineCompletionsHintsWidget.js';
3233
import { PathBuilder, StatusBarViewItem, getOffsetForPos, mapOutFalsy, maxContentWidthInRange, n } from './utils.js';
3334
import { InlineEditWithChanges } from './viewAndDiffProducer.js';
3435

35-
3636
export const originalBackgroundColor = registerColor(
3737
'inlineEdit.originalBackground',
3838
Color.transparent,
@@ -271,7 +271,12 @@ export class InlineEditsSideBySideDiff extends Disposable {
271271
wordWrapOverride1: 'off',
272272
wordWrapOverride2: 'off',
273273
},
274-
{ contributions: [], },
274+
{
275+
contextKeyValues: {
276+
[InlineCompletionContextKeys.inInlineEditsPreviewEditor.key]: true,
277+
},
278+
contributions: [],
279+
},
275280
this._editor
276281
));
277282

src/vs/editor/contrib/peekView/browser/peekView.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import * as objects from '../../../../base/common/objects.js';
1616
import './media/peekViewWidget.css';
1717
import { ICodeEditor } from '../../../browser/editorBrowser.js';
1818
import { EditorContributionInstantiation, registerEditorContribution } from '../../../browser/editorExtensions.js';
19-
import { ICodeEditorService } from '../../../browser/services/codeEditorService.js';
2019
import { EmbeddedCodeEditorWidget } from '../../../browser/widget/codeEditor/embeddedCodeEditorWidget.js';
2120
import { EditorOption } from '../../../common/config/editorOptions.js';
2221
import { IEditorContribution } from '../../../common/editorCommon.js';
@@ -25,7 +24,7 @@ import * as nls from '../../../../nls.js';
2524
import { createActionViewItem } from '../../../../platform/actions/browser/menuEntryActionViewItem.js';
2625
import { IContextKeyService, RawContextKey } from '../../../../platform/contextkey/common/contextkey.js';
2726
import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';
28-
import { createDecorator, IInstantiationService, ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
27+
import { createDecorator, IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';
2928
import { activeContrastBorder, contrastBorder, editorForeground, editorInfoForeground, registerColor } from '../../../../platform/theme/common/colorRegistry.js';
3029

3130
export const IPeekViewService = createDecorator<IPeekViewService>('IPeekViewService');
@@ -79,14 +78,6 @@ class PeekContextController implements IEditorContribution {
7978

8079
registerEditorContribution(PeekContextController.ID, PeekContextController, EditorContributionInstantiation.Eager); // eager because it needs to define a context key
8180

82-
export function getOuterEditor(accessor: ServicesAccessor): ICodeEditor | null {
83-
const editor = accessor.get(ICodeEditorService).getFocusedCodeEditor();
84-
if (editor instanceof EmbeddedCodeEditorWidget) {
85-
return editor.getParentEditor();
86-
}
87-
return editor;
88-
}
89-
9081
export interface IPeekViewStyles extends IStyles {
9182
headerBackgroundColor?: Color;
9283
primaryHeadingColor?: Color;

src/vs/workbench/contrib/scm/browser/quickDiffWidget.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { ISelectOptionItem } from '../../../../base/browser/ui/selectBox/selectB
1313
import { SelectActionViewItem } from '../../../../base/browser/ui/actionbar/actionViewItems.js';
1414
import { defaultSelectBoxStyles } from '../../../../platform/theme/browser/defaultStyles.js';
1515
import { IColorTheme, IThemeService } from '../../../../platform/theme/common/themeService.js';
16-
import { getOuterEditor, peekViewBorder, peekViewTitleBackground, peekViewTitleForeground, peekViewTitleInfoForeground, PeekViewWidget } from '../../../../editor/contrib/peekView/browser/peekView.js';
16+
import { peekViewBorder, peekViewTitleBackground, peekViewTitleForeground, peekViewTitleInfoForeground, PeekViewWidget } from '../../../../editor/contrib/peekView/browser/peekView.js';
1717
import { editorBackground } from '../../../../platform/theme/common/colorRegistry.js';
1818
import { IMenu, IMenuService, MenuId, MenuItemAction, MenuRegistry } from '../../../../platform/actions/common/actions.js';
1919
import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from '../../../../editor/browser/editorBrowser.js';
@@ -48,6 +48,7 @@ import { gotoNextLocation, gotoPreviousLocation } from '../../../../platform/the
4848
import { Codicon } from '../../../../base/common/codicons.js';
4949
import { Color } from '../../../../base/common/color.js';
5050
import { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js';
51+
import { getOuterEditor } from '../../../../editor/browser/widget/codeEditor/embeddedCodeEditorWidget.js';
5152

5253
export const isQuickDiffVisible = new RawContextKey<boolean>('dirtyDiffVisible', false);
5354

0 commit comments

Comments
 (0)