Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/preferences/browser/preferencesActions.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { Action } from '../../../../base/common/actions.js';
7
import { URI } from '../../../../base/common/uri.js';
8
import { getIconClasses } from '../../../../editor/common/services/getIconClasses.js';
9
import { IModelService } from '../../../../editor/common/services/model.js';
10
import { ILanguageService } from '../../../../editor/common/languages/language.js';
11
import * as nls from '../../../../nls.js';
12
import { IQuickInputService, IQuickPickItem } from '../../../../platform/quickinput/common/quickInput.js';
13
import { IPreferencesService } from '../../../services/preferences/common/preferences.js';
14
import { CommandsRegistry } from '../../../../platform/commands/common/commands.js';
15
import { Registry } from '../../../../platform/registry/common/platform.js';
16
import { Extensions, IConfigurationRegistry } from '../../../../platform/configuration/common/configurationRegistry.js';
17
import { EditorExtensionsRegistry } from '../../../../editor/browser/editorExtensions.js';
18
import { MenuId, MenuRegistry, isIMenuItem } from '../../../../platform/actions/common/actions.js';
19
import { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';
20
import { isLocalizedString } from '../../../../platform/action/common/action.js';
21
import { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';
22
23
export class ConfigureLanguageBasedSettingsAction extends Action {
24
25
static readonly ID = 'workbench.action.configureLanguageBasedSettings';
26
static readonly LABEL = nls.localize2('configureLanguageBasedSettings', "Configure Language Specific Settings...");
27
28
constructor(
29
id: string,
30
label: string,
31
@IModelService private readonly modelService: IModelService,
32
@ILanguageService private readonly languageService: ILanguageService,
33
@IQuickInputService private readonly quickInputService: IQuickInputService,
34
@IPreferencesService private readonly preferencesService: IPreferencesService
35
) {
36
super(id, label);
37
}
38
39
override async run(): Promise<void> {
40
const languages = this.languageService.getSortedRegisteredLanguageNames();
41
const picks: IQuickPickItem[] = languages.map(({ languageName, languageId }): IQuickPickItem => {
42
const description: string = nls.localize('languageDescriptionConfigured', "({0})", languageId);
43
// construct a fake resource to be able to show nice icons if any
44
let fakeResource: URI | undefined;
45
const extensions = this.languageService.getExtensions(languageId);
46
if (extensions.length) {
47
fakeResource = URI.file(extensions[0]);
48
} else {
49
const filenames = this.languageService.getFilenames(languageId);
50
if (filenames.length) {
51
fakeResource = URI.file(filenames[0]);
52
}
53
}
54
return {
55
label: languageName,
56
iconClasses: getIconClasses(this.modelService, this.languageService, fakeResource),
57
description
58
};
59
});
60
61
await this.quickInputService.pick(picks, { placeHolder: nls.localize('pickLanguage', "Select Language") })
62
.then(pick => {
63
if (pick) {
64
const languageId = this.languageService.getLanguageIdByLanguageName(pick.label);
65
if (typeof languageId === 'string') {
66
return this.preferencesService.openLanguageSpecificSettings(languageId);
67
}
68
}
69
return undefined;
70
});
71
72
}
73
}
74
75
// Register a command that gets all settings
76
CommandsRegistry.registerCommand({
77
id: '_getAllSettings',
78
handler: () => {
79
const configRegistry = Registry.as<IConfigurationRegistry>(Extensions.Configuration);
80
const allSettings = configRegistry.getConfigurationProperties();
81
return allSettings;
82
}
83
});
84
85
//#region --- Register a command to get all actions from the command palette
86
CommandsRegistry.registerCommand('_getAllCommands', function (accessor, filterByPrecondition?: boolean) {
87
const keybindingService = accessor.get(IKeybindingService);
88
const contextKeyService = accessor.get(IContextKeyService);
89
const actions: { command: string; label: string; keybinding: string; description?: string; precondition?: string }[] = [];
90
for (const editorAction of EditorExtensionsRegistry.getEditorActions()) {
91
const keybinding = keybindingService.lookupKeybinding(editorAction.id);
92
if (filterByPrecondition && !contextKeyService.contextMatchesRules(editorAction.precondition)) {
93
continue;
94
}
95
actions.push({
96
command: editorAction.id,
97
label: editorAction.label,
98
description: isLocalizedString(editorAction.metadata?.description) ? editorAction.metadata.description.value : editorAction.metadata?.description,
99
precondition: editorAction.precondition?.serialize(),
100
keybinding: keybinding?.getLabel() ?? 'Not set'
101
});
102
}
103
for (const menuItem of MenuRegistry.getMenuItems(MenuId.CommandPalette)) {
104
if (isIMenuItem(menuItem)) {
105
if (filterByPrecondition && !contextKeyService.contextMatchesRules(menuItem.when)) {
106
continue;
107
}
108
const title = typeof menuItem.command.title === 'string' ? menuItem.command.title : menuItem.command.title.value;
109
const category = menuItem.command.category ? typeof menuItem.command.category === 'string' ? menuItem.command.category : menuItem.command.category.value : undefined;
110
const label = category ? `${category}: ${title}` : title;
111
const description = isLocalizedString(menuItem.command.metadata?.description) ? menuItem.command.metadata.description.value : menuItem.command.metadata?.description;
112
const keybinding = keybindingService.lookupKeybinding(menuItem.command.id);
113
actions.push({
114
command: menuItem.command.id,
115
label,
116
description,
117
precondition: menuItem.when?.serialize(),
118
keybinding: keybinding?.getLabel() ?? 'Not set'
119
});
120
}
121
}
122
123
return actions;
124
});
125
//#endregion
126
127