Path: blob/main/src/vs/workbench/browser/actions/quickAccessActions.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 { localize, localize2 } from '../../../nls.js';6import { MenuId, Action2, registerAction2 } from '../../../platform/actions/common/actions.js';7import { KeyMod, KeyCode } from '../../../base/common/keyCodes.js';8import { KeybindingsRegistry, KeybindingWeight, IKeybindingRule } from '../../../platform/keybinding/common/keybindingsRegistry.js';9import { IQuickInputService, ItemActivation } from '../../../platform/quickinput/common/quickInput.js';10import { IKeybindingService } from '../../../platform/keybinding/common/keybinding.js';11import { CommandsRegistry } from '../../../platform/commands/common/commands.js';12import { ServicesAccessor } from '../../../platform/instantiation/common/instantiation.js';13import { inQuickPickContext, defaultQuickAccessContext, getQuickNavigateHandler } from '../quickaccess.js';14import { ILocalizedString } from '../../../platform/action/common/action.js';15import { AnythingQuickAccessProviderRunOptions } from '../../../platform/quickinput/common/quickAccess.js';16import { Codicon } from '../../../base/common/codicons.js';1718//#region Quick access management commands and keys1920const globalQuickAccessKeybinding = {21primary: KeyMod.CtrlCmd | KeyCode.KeyP,22secondary: [KeyMod.CtrlCmd | KeyCode.KeyE],23mac: { primary: KeyMod.CtrlCmd | KeyCode.KeyP, secondary: undefined }24};2526KeybindingsRegistry.registerCommandAndKeybindingRule({27id: 'workbench.action.closeQuickOpen',28weight: KeybindingWeight.WorkbenchContrib,29when: inQuickPickContext,30primary: KeyCode.Escape, secondary: [KeyMod.Shift | KeyCode.Escape],31handler: accessor => {32const quickInputService = accessor.get(IQuickInputService);33return quickInputService.cancel();34}35});3637KeybindingsRegistry.registerCommandAndKeybindingRule({38id: 'workbench.action.acceptSelectedQuickOpenItem',39weight: KeybindingWeight.WorkbenchContrib,40when: inQuickPickContext,41primary: 0,42handler: accessor => {43const quickInputService = accessor.get(IQuickInputService);44return quickInputService.accept();45}46});4748KeybindingsRegistry.registerCommandAndKeybindingRule({49id: 'workbench.action.alternativeAcceptSelectedQuickOpenItem',50weight: KeybindingWeight.WorkbenchContrib,51when: inQuickPickContext,52primary: 0,53handler: accessor => {54const quickInputService = accessor.get(IQuickInputService);55return quickInputService.accept({ ctrlCmd: true, alt: false });56}57});5859KeybindingsRegistry.registerCommandAndKeybindingRule({60id: 'workbench.action.focusQuickOpen',61weight: KeybindingWeight.WorkbenchContrib,62when: inQuickPickContext,63primary: 0,64handler: accessor => {65const quickInputService = accessor.get(IQuickInputService);66quickInputService.focus();67}68});6970const quickAccessNavigateNextInFilePickerId = 'workbench.action.quickOpenNavigateNextInFilePicker';71KeybindingsRegistry.registerCommandAndKeybindingRule({72id: quickAccessNavigateNextInFilePickerId,73weight: KeybindingWeight.WorkbenchContrib + 50,74handler: getQuickNavigateHandler(quickAccessNavigateNextInFilePickerId, true),75when: defaultQuickAccessContext,76primary: globalQuickAccessKeybinding.primary,77secondary: globalQuickAccessKeybinding.secondary,78mac: globalQuickAccessKeybinding.mac79});8081const quickAccessNavigatePreviousInFilePickerId = 'workbench.action.quickOpenNavigatePreviousInFilePicker';82KeybindingsRegistry.registerCommandAndKeybindingRule({83id: quickAccessNavigatePreviousInFilePickerId,84weight: KeybindingWeight.WorkbenchContrib + 50,85handler: getQuickNavigateHandler(quickAccessNavigatePreviousInFilePickerId, false),86when: defaultQuickAccessContext,87primary: globalQuickAccessKeybinding.primary | KeyMod.Shift,88secondary: [globalQuickAccessKeybinding.secondary[0] | KeyMod.Shift],89mac: {90primary: globalQuickAccessKeybinding.mac.primary | KeyMod.Shift,91secondary: undefined92}93});9495KeybindingsRegistry.registerCommandAndKeybindingRule({96id: 'workbench.action.quickPickManyToggle',97weight: KeybindingWeight.WorkbenchContrib,98when: inQuickPickContext,99primary: 0,100handler: accessor => {101const quickInputService = accessor.get(IQuickInputService);102quickInputService.toggle();103}104});105106KeybindingsRegistry.registerCommandAndKeybindingRule({107id: 'workbench.action.quickInputBack',108weight: KeybindingWeight.WorkbenchContrib + 50,109when: inQuickPickContext,110primary: 0,111win: { primary: KeyMod.Alt | KeyCode.LeftArrow },112mac: { primary: KeyMod.WinCtrl | KeyCode.Minus },113linux: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.Minus },114handler: accessor => {115const quickInputService = accessor.get(IQuickInputService);116quickInputService.back();117}118});119120registerAction2(class QuickAccessAction extends Action2 {121constructor() {122super({123id: 'workbench.action.quickOpen',124title: localize2('quickOpen', "Go to File..."),125metadata: {126description: `Quick access`,127args: [{128name: 'prefix',129schema: {130'type': 'string'131}132}]133},134keybinding: {135weight: KeybindingWeight.WorkbenchContrib,136primary: globalQuickAccessKeybinding.primary,137secondary: globalQuickAccessKeybinding.secondary,138mac: globalQuickAccessKeybinding.mac139},140f1: true141});142}143144run(accessor: ServicesAccessor, prefix: undefined): void {145const quickInputService = accessor.get(IQuickInputService);146quickInputService.quickAccess.show(typeof prefix === 'string' ? prefix : undefined, { preserveValue: typeof prefix === 'string' /* preserve as is if provided */ });147}148});149150registerAction2(class QuickAccessAction extends Action2 {151constructor() {152super({153id: 'workbench.action.quickOpenWithModes',154title: localize('quickOpenWithModes', "Quick Open"),155icon: Codicon.search,156menu: {157id: MenuId.CommandCenterCenter,158order: 100159}160});161}162163run(accessor: ServicesAccessor): void {164const quickInputService = accessor.get(IQuickInputService);165const providerOptions: AnythingQuickAccessProviderRunOptions = {166includeHelp: true,167from: 'commandCenter',168};169quickInputService.quickAccess.show(undefined, {170preserveValue: true,171providerOptions172});173}174});175176CommandsRegistry.registerCommand('workbench.action.quickOpenPreviousEditor', async accessor => {177const quickInputService = accessor.get(IQuickInputService);178179quickInputService.quickAccess.show('', { itemActivation: ItemActivation.SECOND });180});181182//#endregion183184//#region Workbench actions185186class BaseQuickAccessNavigateAction extends Action2 {187188constructor(189private id: string,190title: ILocalizedString,191private next: boolean,192private quickNavigate: boolean,193keybinding?: Omit<IKeybindingRule, 'id'>194) {195super({ id, title, f1: true, keybinding });196}197198async run(accessor: ServicesAccessor): Promise<void> {199const keybindingService = accessor.get(IKeybindingService);200const quickInputService = accessor.get(IQuickInputService);201202const keys = keybindingService.lookupKeybindings(this.id);203const quickNavigate = this.quickNavigate ? { keybindings: keys } : undefined;204205quickInputService.navigate(this.next, quickNavigate);206}207}208209class QuickAccessNavigateNextAction extends BaseQuickAccessNavigateAction {210211constructor() {212super('workbench.action.quickOpenNavigateNext', localize2('quickNavigateNext', 'Navigate Next in Quick Open'), true, true);213}214}215216class QuickAccessNavigatePreviousAction extends BaseQuickAccessNavigateAction {217218constructor() {219super('workbench.action.quickOpenNavigatePrevious', localize2('quickNavigatePrevious', 'Navigate Previous in Quick Open'), false, true);220}221}222223class QuickAccessSelectNextAction extends BaseQuickAccessNavigateAction {224225constructor() {226super(227'workbench.action.quickOpenSelectNext',228localize2('quickSelectNext', 'Select Next in Quick Open'),229true,230false,231{232weight: KeybindingWeight.WorkbenchContrib + 50,233when: inQuickPickContext,234primary: 0,235mac: { primary: KeyMod.WinCtrl | KeyCode.KeyN }236}237);238}239}240241class QuickAccessSelectPreviousAction extends BaseQuickAccessNavigateAction {242243constructor() {244super(245'workbench.action.quickOpenSelectPrevious',246localize2('quickSelectPrevious', 'Select Previous in Quick Open'),247false,248false,249{250weight: KeybindingWeight.WorkbenchContrib + 50,251when: inQuickPickContext,252primary: 0,253mac: { primary: KeyMod.WinCtrl | KeyCode.KeyP }254}255);256}257}258259registerAction2(QuickAccessSelectNextAction);260registerAction2(QuickAccessSelectPreviousAction);261registerAction2(QuickAccessNavigateNextAction);262registerAction2(QuickAccessNavigatePreviousAction);263264//#endregion265266267