diff --git a/src/vs/platform/keybinding/common/keybindingResolver.ts b/src/vs/platform/keybinding/common/keybindingResolver.ts index c69b8b3a58713d7e195198c994d1310546fe4c34..bab229ed6427ddee4e564ac9b7d9a4d8126219c9 100644 --- a/src/vs/platform/keybinding/common/keybindingResolver.ts +++ b/src/vs/platform/keybinding/common/keybindingResolver.ts @@ -4,8 +4,10 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; +import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; +import { CommandsRegistry, ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; export interface IResolveResult { enterChord: boolean; @@ -303,4 +305,25 @@ export class KeybindingResolver { } return rules.evaluate(context); } + + public static getAllUnboundCommands(boundCommands: Map): string[] { + const commands = CommandsRegistry.getCommands(); + const unboundCommands: string[] = []; + + for (let id in commands) { + if (id[0] === '_' || id.indexOf('vscode.') === 0) { // private command + continue; + } + if (typeof commands[id].description === 'object' + && !isFalsyOrEmpty((commands[id].description).args)) { // command with args + continue; + } + if (boundCommands.get(id) === true) { + continue; + } + unboundCommands.push(id); + } + + return unboundCommands; + } } diff --git a/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts b/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts index f1daf8e240c41484e4e0d8b5a902fc3e98c84bdb..4fa4523032a65d3c0994e35719a2ab76dfd40ebf 100644 --- a/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts +++ b/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts @@ -7,12 +7,12 @@ import { localize } from 'vs/nls'; import { TPromise } from 'vs/base/common/winjs.base'; import { IMatch, IFilter, or, matchesContiguousSubString, matchesPrefix, matchesCamelCase, matchesWords } from 'vs/base/common/filters'; import { Registry } from 'vs/platform/platform'; -import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { CommonEditorRegistry, EditorAction } from 'vs/editor/common/editorCommonExtensions'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actionRegistry'; import { EditorModel } from 'vs/workbench/common/editor'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import { IKeybindingService, IKeybindingItem2, KeybindingSource } from 'vs/platform/keybinding/common/keybinding'; +import { KeybindingResolver } from 'vs/platform/keybinding/common/keybindingResolver'; export const KEYBINDING_ENTRY_TEMPLATE_ID = 'keybinding.entry.template'; export const KEYBINDING_HEADER_TEMPLATE_ID = 'keybinding.header.template'; @@ -81,20 +81,17 @@ export class KeybindingsEditorModel extends EditorModel { return editorActions; }, {}); this._keybindingItems = this.keybindingsService.getKeybindings().map(keybinding => KeybindingsEditorModel.toKeybindingEntry(keybinding, workbenchActionsRegistry, editorActions)); - const boundCommands = this._keybindingItems.reduce((boundCommands, keybinding) => { - boundCommands[keybinding.command] = true; + const boundCommands: Map = this._keybindingItems.reduce((boundCommands, keybinding) => { + boundCommands.set(keybinding.command, true); return boundCommands; - }, {}); - const commandsMap = CommandsRegistry.getCommands(); - for (const command in commandsMap) { - if (!boundCommands[command]) { - this._keybindingItems.push(KeybindingsEditorModel.toKeybindingEntry({ - keybinding: null, - command, - when: null, - source: KeybindingSource.Default - }, workbenchActionsRegistry, editorActions)); - } + }, new Map()); + for (const command of KeybindingResolver.getAllUnboundCommands(boundCommands)) { + this._keybindingItems.push(KeybindingsEditorModel.toKeybindingEntry({ + keybinding: null, + command, + when: null, + source: KeybindingSource.Default + }, workbenchActionsRegistry, editorActions)); } this._keybindingItems = this._keybindingItems.sort((a, b) => KeybindingsEditorModel.compareKeybindingData(a, b)); return this; diff --git a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts index c6d1bdd1c5c43ac76abe770645a88583b5997782..04b0dddf056d6ec81805b69133cb03ae580e12b0 100644 --- a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts @@ -17,8 +17,7 @@ import { AbstractKeybindingService } from 'vs/platform/keybinding/common/abstrac import { USLayoutResolvedKeybinding } from 'vs/platform/keybinding/common/usLayoutResolvedKeybinding'; import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; import { KeybindingResolver } from 'vs/platform/keybinding/common/keybindingResolver'; -import { isFalsyOrEmpty } from 'vs/base/common/arrays'; -import { ICommandService, CommandsRegistry, ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; +import { ICommandService } from 'vs/platform/commands/common/commands'; import { IKeybindingEvent, IKeybindingItem, IUserFriendlyKeybinding, KeybindingSource } from 'vs/platform/keybinding/common/keybinding'; import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IKeybindingRule, KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -447,25 +446,8 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { } private static _getAllCommandsAsComment(boundCommands: Map): string { - const commands = CommandsRegistry.getCommands(); - const unboundCommands: string[] = []; - - for (let id in commands) { - if (id[0] === '_' || id.indexOf('vscode.') === 0) { // private command - continue; - } - if (typeof commands[id].description === 'object' - && !isFalsyOrEmpty((commands[id].description).args)) { // command with args - continue; - } - if (boundCommands.get(id) === true) { - continue; - } - unboundCommands.push(id); - } - + const unboundCommands = KeybindingResolver.getAllUnboundCommands(boundCommands); let pretty = unboundCommands.sort().join('\n// - '); - return '// ' + nls.localize('unboundCommands', "Here are other available commands: ") + '\n// - ' + pretty; } }