From fb3f387f53b9d1e4fb10116ed8c1aa3a7cc70fce Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 13 Jan 2016 16:54:02 +0100 Subject: [PATCH] Add fuzzy search to commands in palette (fixes #1964) --- .../parts/quickopen/browser/quickOpenModel.ts | 2 +- .../quickopen/browser/commandsHandler.ts | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/vs/base/parts/quickopen/browser/quickOpenModel.ts b/src/vs/base/parts/quickopen/browser/quickOpenModel.ts index a280fc1bc37..26483377ecc 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenModel.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenModel.ts @@ -179,7 +179,7 @@ export class QuickOpenEntry { return compareAnything(nameA, nameB, lookFor); } - public static compareByScore(elementA: QuickOpenEntry, elementB: QuickOpenEntry, lookFor: string, scorerCache: { [key: string]: number }): number { + public static compareByScore(elementA: QuickOpenEntry, elementB: QuickOpenEntry, lookFor: string, scorerCache?: { [key: string]: number }): number { const labelA = elementA.getLabel(); const labelB = elementB.getLabel(); diff --git a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts index c03c0d598a3..6384b46120f 100644 --- a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts +++ b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts @@ -14,7 +14,7 @@ import strings = require('vs/base/common/strings'); import {IAction, Action} from 'vs/base/common/actions'; import {toErrorMessage} from 'vs/base/common/errors'; import {Mode, IContext, IAutoFocus} from 'vs/base/parts/quickopen/common/quickOpen'; -import {QuickOpenEntryGroup, IHighlight, QuickOpenModel} from 'vs/base/parts/quickopen/browser/quickOpenModel'; +import {QuickOpenEntryGroup, IHighlight, QuickOpenModel, QuickOpenEntry} from 'vs/base/parts/quickopen/browser/quickOpenModel'; import {SyncActionDescriptor, IActionsService} from 'vs/platform/actions/common/actions'; import {IWorkbenchActionRegistry, Extensions as ActionExtensions} from 'vs/workbench/common/actionRegistry'; import {Registry} from 'vs/platform/platform'; @@ -228,8 +228,15 @@ export class CommandsHandler extends QuickOpenHandler { // Remove duplicates entries = arrays.distinct(entries, (entry) => entry.getLabel() + entry.getGroupLabel()); - // Sort by name - entries = entries.sort(this.sort); + // Sort by name if there is no search running + if (!searchValue) { + entries = entries.sort((elementA, elementB) => strings.localeCompare(elementA.getLabel().toLowerCase(), elementB.getLabel().toLowerCase())); + } + + // Otherwise sort by score + else { + entries = entries.sort((elementA, elementB) => QuickOpenEntry.compareByScore(elementA, elementB, searchValue)); + } return TPromise.as(new QuickOpenModel(entries)); } @@ -274,7 +281,7 @@ export class CommandsHandler extends QuickOpenHandler { let keys = this.keybindingService.lookupKeybindings(editorAction.id).map(k => this.keybindingService.getLabelFor(k)); if (action.label) { - let highlights = filters.matchesFuzzy(searchValue, action.label); + let highlights = filters.matchesFuzzy(searchValue, action.label, true /* separate substring matching */); if (highlights) { entries.push(this.instantiationService.createInstance(EditorActionCommandEntry, keys.length > 0 ? keys.join(', ') : '', action.label, highlights, action)); } @@ -298,13 +305,6 @@ export class CommandsHandler extends QuickOpenHandler { return entries; } - private sort(elementA: QuickOpenEntryGroup, elementB: QuickOpenEntryGroup): number { - let elementAName = elementA.getLabel().toLowerCase(); - let elementBName = elementB.getLabel().toLowerCase(); - - return strings.localeCompare(elementAName, elementBName); - } - public getAutoFocus(searchValue: string): IAutoFocus { return { autoFocusFirstEntry: true,