Skip to content

Commit 2d8042f

Browse files
author
Loïc Mangeonjean
committed
fix: fix user defined action keybinding not showing up in command palette
1 parent 0e1a84c commit 2d8042f

File tree

3 files changed

+93
-27
lines changed

3 files changed

+93
-27
lines changed

scripts/vscode.patch

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,26 @@ index 23d547570e9..31dfb4fd8d4 100644
252252
-import 'vs/editor/standalone/browser/toggleHighContrast/toggleHighContrast';
253253

254254
export * from 'vs/editor/editor.api';
255+
diff --git a/src/vs/editor/standalone/browser/standaloneServices.ts b/src/vs/editor/standalone/browser/standaloneServices.ts
256+
index f026f61f400..706d3e15da0 100644
257+
--- a/src/vs/editor/standalone/browser/standaloneServices.ts
258+
+++ b/src/vs/editor/standalone/browser/standaloneServices.ts
259+
@@ -517,10 +517,14 @@ export class StandaloneKeybindingService extends AbstractKeybindingService {
260+
this._onDidUpdateKeybindings.fire();
261+
}
262+
263+
+ protected getUserKeybindingItems() {
264+
+ return this._toNormalizedKeybindingItems(this._dynamicKeybindings, false);
265+
+ }
266+
+
267+
protected _getResolver(): KeybindingResolver {
268+
if (!this._cachedResolver) {
269+
const defaults = this._toNormalizedKeybindingItems(KeybindingsRegistry.getDefaultKeybindings(), true);
270+
- const overrides = this._toNormalizedKeybindingItems(this._dynamicKeybindings, false);
271+
+ const overrides = this.getUserKeybindingItems();
272+
this._cachedResolver = new KeybindingResolver(defaults, overrides, (str) => this._log(str));
273+
}
274+
return this._cachedResolver;
255275
diff --git a/src/vs/platform/assignment/common/assignmentService.ts b/src/vs/platform/assignment/common/assignmentService.ts
256276
index 67e34826627..7c5287d6a32 100644
257277
--- a/src/vs/platform/assignment/common/assignmentService.ts
@@ -1108,6 +1128,32 @@ index c529886ca92..2311e7a0fb5 100644
11081128
constructor(
11091129
public readonly toAdd: IExtension[],
11101130
public readonly toRemove: string[] | IExtension[]
1131+
diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts
1132+
index e6112182d25..0bc70e55633 100644
1133+
--- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts
1134+
+++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts
1135+
@@ -381,15 +381,19 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService {
1136+
return this.userKeybindings.keybindings.length;
1137+
}
1138+
1139+
- private updateResolver(): void {
1140+
+ protected updateResolver(): void {
1141+
this._cachedResolver = null;
1142+
this._onDidUpdateKeybindings.fire();
1143+
}
1144+
1145+
+ protected getUserKeybindingItems() {
1146+
+ return this._resolveUserKeybindingItems(this.userKeybindings.keybindings, false);
1147+
+ }
1148+
+
1149+
protected _getResolver(): KeybindingResolver {
1150+
if (!this._cachedResolver) {
1151+
const defaults = this._resolveKeybindingItems(KeybindingsRegistry.getDefaultKeybindings(), true);
1152+
- const overrides = this._resolveUserKeybindingItems(this.userKeybindings.keybindings, false);
1153+
+ const overrides = this.getUserKeybindingItems();
1154+
this._cachedResolver = new KeybindingResolver(defaults, overrides, (str) => this._log(str));
1155+
}
1156+
return this._cachedResolver;
11111157
diff --git a/src/vs/workbench/services/languageDetection/browser/languageDetectionSimpleWorker.ts b/src/vs/workbench/services/languageDetection/browser/languageDetectionSimpleWorker.ts
11121158
index e8c8239b35f..9017a971ee5 100644
11131159
--- a/src/vs/workbench/services/languageDetection/browser/languageDetectionSimpleWorker.ts

src/monaco.ts

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import type { create as createEditor, createDiffEditor } from 'vs/editor/standal
1111
import { errorHandler } from 'vs/base/common/errors'
1212
import { FoldingModel, setCollapseStateForMatchingLines } from 'vs/editor/contrib/folding/browser/foldingModel'
1313
import { FoldingController } from 'vs/editor/contrib/folding/browser/folding'
14-
import { DisposableStore, IReference } from 'vs/base/common/lifecycle'
14+
import { DisposableStore, IDisposable, IReference } from 'vs/base/common/lifecycle'
1515
import { Registry } from 'vs/platform/registry/common/platform'
1616
import { IJSONContributionRegistry, Extensions as JsonExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'
1717
import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'
@@ -39,7 +39,7 @@ import { ILogService } from 'vs/platform/log/common/log'
3939
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'
4040
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'
4141
import { KeybindingResolver } from 'vs/platform/keybinding/common/keybindingResolver'
42-
import { WorkbenchKeybindingService } from 'vs/workbench/services/keybinding/browser/keybindingService'
42+
import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'
4343
import { createInjectedClass } from './tools/injection'
4444
// Selectively comes from vs/workbench/contrib/codeEditor/browser/codeEditor.contribution.ts
4545
import 'vs/workbench/contrib/codeEditor/browser/workbenchReferenceSearch'
@@ -178,13 +178,21 @@ export async function createModelReference (resource: URI, content?: string): Pr
178178
return (await StandaloneServices.get(ITextModelService).createModelReference(resource)) as IReference<ITextFileEditorModel>
179179
}
180180

181+
export interface DynamicKeybindingService extends IKeybindingService {
182+
registerKeybindingProvider (provider: () => ResolvedKeybindingItem[]): IDisposable
183+
_getResolver(): KeybindingResolver
184+
}
185+
186+
function isDynamicKeybindingService (keybindingService: IKeybindingService) {
187+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
188+
return (keybindingService as DynamicKeybindingService).registerKeybindingProvider != null
189+
}
190+
181191
// This class use useful so editor.addAction and editor.addCommand still work
182192
// Monaco do an `instanceof` on the KeybindingService so we need it to extends `StandaloneKeybindingService`
183193
class DelegateStandaloneKeybindingService extends StandaloneKeybindingService {
184-
private _cachedOverridenResolver: KeybindingResolver | null
185-
186194
constructor (
187-
private delegate: WorkbenchKeybindingService,
195+
private delegate: DynamicKeybindingService,
188196
@IContextKeyService contextKeyService: IContextKeyService,
189197
@ICommandService commandService: ICommandService,
190198
@ITelemetryService telemetryService: ITelemetryService,
@@ -193,29 +201,12 @@ class DelegateStandaloneKeybindingService extends StandaloneKeybindingService {
193201
@ICodeEditorService codeEditorService: ICodeEditorService
194202
) {
195203
super(contextKeyService, commandService, telemetryService, notificationService, logService, codeEditorService)
196-
this._cachedOverridenResolver = null
197-
198-
this.onDidUpdateKeybindings(() => {
199-
this._cachedOverridenResolver = null
200-
})
201-
this.delegate.onDidUpdateKeybindings(() => {
202-
this._cachedOverridenResolver = null
203-
})
204+
205+
this._register(delegate.registerKeybindingProvider(() => this.getUserKeybindingItems()))
204206
}
205207

206208
protected override _getResolver (): KeybindingResolver {
207-
// Create a new resolver that uses the keybindings from WorkbenchKeybindingService, overriden by _dynamicKeybindings from StandaloneKeybindingService
208-
if (this._cachedOverridenResolver == null) {
209-
// eslint-disable-next-line dot-notation
210-
const overrides = this['_toNormalizedKeybindingItems'](this['_dynamicKeybindings'], false)
211-
this._cachedOverridenResolver = new KeybindingResolver(
212-
// eslint-disable-next-line dot-notation
213-
[...this.delegate['_getResolver']().getKeybindings()],
214-
overrides
215-
, (str) => this._log(str)
216-
)
217-
}
218-
return this._cachedOverridenResolver
209+
return this.delegate._getResolver()
219210
}
220211
}
221212

@@ -225,7 +216,7 @@ function getStandaloneEditorInstantiationService () {
225216
const serviceCollection = new ServiceCollection()
226217
serviceCollection.set(IQuickInputService, new SyncDescriptor(StandaloneQuickInputService, undefined, true))
227218
const keybindingService = StandaloneServices.get(IKeybindingService)
228-
if (keybindingService instanceof WorkbenchKeybindingService) {
219+
if (!(keybindingService instanceof StandaloneKeybindingService) && isDynamicKeybindingService(keybindingService)) {
229220
serviceCollection.set(IKeybindingService, new SyncDescriptor(DelegateStandaloneKeybindingService, [keybindingService], true))
230221
}
231222
standaloneEditorInstantiationService = StandaloneServices.get(IInstantiationService).createChild(serviceCollection)

src/service-override/keybindings.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ import { BrowserKeyboardLayoutService } from 'vs/workbench/services/keybinding/b
1010
import { IFileService } from 'vs/platform/files/common/files'
1111
import { ICommandService } from 'vs/platform/commands/common/commands'
1212
import { CommandService } from 'vs/workbench/services/commands/common/commandService'
13+
import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'
14+
import { toDisposable } from 'vs/base/common/lifecycle'
15+
import { KeybindingResolver } from 'vs/platform/keybinding/common/keybindingResolver'
1316
import getFileServiceOverride from './files'
17+
import { DynamicKeybindingService } from '../monaco'
1418
import 'vs/workbench/browser/workbench.contribution'
1519
import 'vs/workbench/contrib/keybindings/browser/keybindings.contribution'
1620

@@ -19,10 +23,35 @@ async function updateUserKeybindings (keybindingsJson: string): Promise<void> {
1923
await StandaloneServices.get(IFileService).writeFile(userDataProfilesService.defaultProfile.keybindingsResource, VSBuffer.fromString(keybindingsJson))
2024
}
2125

26+
class DynamicWorkbenchKeybindingService extends WorkbenchKeybindingService implements DynamicKeybindingService {
27+
private keybindingProviders: (() => ResolvedKeybindingItem[])[] = []
28+
29+
public registerKeybindingProvider (provider: () => ResolvedKeybindingItem[]) {
30+
this.keybindingProviders.push(provider)
31+
this.updateResolver()
32+
33+
return toDisposable(() => {
34+
const idx = this.keybindingProviders.indexOf(provider)
35+
if (idx >= 0) {
36+
this.keybindingProviders.splice(idx, 1)
37+
this.updateResolver()
38+
}
39+
})
40+
}
41+
42+
public override _getResolver (): KeybindingResolver {
43+
return super._getResolver()
44+
}
45+
46+
protected override getUserKeybindingItems () {
47+
return [...super.getUserKeybindingItems(), ...this.keybindingProviders.flatMap(provider => provider())]
48+
}
49+
}
50+
2251
export default function getServiceOverride (): IEditorOverrideServices {
2352
return {
2453
...getFileServiceOverride(),
25-
[IKeybindingService.toString()]: new SyncDescriptor(WorkbenchKeybindingService, [], false),
54+
[IKeybindingService.toString()]: new SyncDescriptor(DynamicWorkbenchKeybindingService, [], false),
2655
[IKeyboardLayoutService.toString()]: new SyncDescriptor(BrowserKeyboardLayoutService, undefined, true),
2756
[ICommandService.toString()]: new SyncDescriptor(CommandService, [], true)
2857
}

0 commit comments

Comments
 (0)