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