Skip to content

Commit

Permalink
Fixes for Vscode emacs extension
Browse files Browse the repository at this point in the history
  • Loading branch information
vinokurig committed Dec 2, 2019
1 parent c4b4d39 commit 0aec778
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 19 deletions.
19 changes: 10 additions & 9 deletions packages/core/src/browser/keybinding.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ describe('keybindings', () => {
expect(bindings.partial.length > 0);
});

it('should not register a shadowing keybinding', () => {
it('should register a shadowing keybinding', () => {
const validKeyBinding = 'ctrlcmd+b a';
const command = TEST_COMMAND_SHADOW.id;
const keybindingShadowing: Keybinding[] = [
Expand All @@ -270,22 +270,22 @@ describe('keybindings', () => {
keybindingRegistry.registerKeybindings(...keybindingShadowing);

const bindings = keybindingRegistry.getKeybindingsForCommand(command);
expect(bindings.length).to.be.equal(1);
expect(bindings.length).to.be.equal(2);
expect(bindings[0].keybinding).to.be.equal(validKeyBinding);
});

it('shadowed bindings should not be returned', () => {
it('shadowed bindings should also be returned', () => {
const keyCode = KeyCode.createKeyCode({ first: Key.KEY_A, modifiers: [KeyModifier.Shift] });
let bindings: Keybinding[];

const ignoredDefaultBinding: Keybinding = {
const defaultBinding: Keybinding = {
keybinding: keyCode.toString(),
command: 'test.ignored-command'
command: 'test.workspace-command'
};

const defaultBinding: Keybinding = {
const secondDefaultBinding: Keybinding = {
keybinding: keyCode.toString(),
command: 'test.workspace-command'
command: 'test.second-command'
};

const userBinding: Keybinding = {
Expand All @@ -298,7 +298,7 @@ describe('keybindings', () => {
command: 'test.workspace-command'
};

keybindingRegistry.setKeymap(KeybindingScope.DEFAULT, [defaultBinding, ignoredDefaultBinding]);
keybindingRegistry.setKeymap(KeybindingScope.DEFAULT, [defaultBinding, secondDefaultBinding]);
keybindingRegistry.setKeymap(KeybindingScope.USER, [userBinding]);
keybindingRegistry.setKeymap(KeybindingScope.WORKSPACE, [workspaceBinding]);
// now WORKSPACE bindings are overriding the other scopes
Expand All @@ -318,8 +318,9 @@ describe('keybindings', () => {
// and finally it should fallback to DEFAULT bindings.

bindings = keybindingRegistry.getKeybindingsForKeySequence([keyCode]).full;
expect(bindings).to.have.lengthOf(1);
expect(bindings).to.have.lengthOf(2);
expect(bindings[0].command).to.be.equal(defaultBinding.command);
expect(bindings[1].command).to.be.equal(secondDefaultBinding.command);

keybindingRegistry.resetKeybindingsForScope(KeybindingScope.DEFAULT);
// now the registry should be empty
Expand Down
15 changes: 7 additions & 8 deletions packages/core/src/browser/keybinding.ts
Original file line number Diff line number Diff line change
Expand Up @@ -241,9 +241,7 @@ export class KeybindingRegistry {
protected doRegisterKeybinding(binding: Keybinding, scope: KeybindingScope = KeybindingScope.DEFAULT): Disposable {
try {
this.resolveKeybinding(binding);
if (this.containsKeybinding(this.keymaps[scope], binding)) {
throw new Error(`"${binding.keybinding}" is in collision with something else [scope:${scope}]`);
}
this.containsKeybinding(this.keymaps[scope], binding);
this.keymaps[scope].push(binding);
return Disposable.create(() => {
const index = this.keymaps[scope].indexOf(binding);
Expand Down Expand Up @@ -294,19 +292,19 @@ export class KeybindingRegistry {
.filter(b => b.context === binding.context && !b.when && !binding.when);

if (collisions.full.length > 0) {
this.logger.warn('Collided keybinding is ignored; ',
this.logger.warn('Collided keybinding detected; ',
Keybinding.stringify(binding), ' collided with ',
collisions.full.map(b => Keybinding.stringify(b)).join(', '));
return true;
}
if (collisions.partial.length > 0) {
this.logger.warn('Shadowing keybinding is ignored; ',
this.logger.warn('Shadowing keybinding detected; ',
Keybinding.stringify(binding), ' shadows ',
collisions.partial.map(b => Keybinding.stringify(b)).join(', '));
return true;
}
if (collisions.shadow.length > 0) {
this.logger.warn('Shadowed keybinding is ignored; ',
this.logger.warn('Shadowed keybinding detected; ',
Keybinding.stringify(binding), ' would be shadowed by ',
collisions.shadow.map(b => Keybinding.stringify(b)).join(', '));
return true;
Expand Down Expand Up @@ -562,7 +560,8 @@ export class KeybindingRegistry {
return false;
}

for (const binding of bindings) {
for (let i = bindings.length - 1; i >= 0; i--) {
const binding = bindings[i];
if (this.isEnabled(binding, event)) {
if (this.isPseudoCommand(binding.command)) {
/* Don't do anything, let the event propagate. */
Expand Down Expand Up @@ -622,7 +621,7 @@ export class KeybindingRegistry {
this.keySequence.push(keyCode);
const bindings = this.getKeybindingsForKeySequence(this.keySequence);

if (this.tryKeybindingExecution(bindings.full, event)) {
if (bindings.partial.length === 0 && this.tryKeybindingExecution(bindings.full, event)) {

this.keySequence = [];
this.statusBar.removeElement('keybinding-status');
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/browser/keyboard/keys.ts
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ export class KeyCode {
}

const schema: KeyCodeSchema = {};
const keys = keybinding.trim().toLowerCase().split('+');
const keys = keybinding.trim().toLowerCase().split(/[-+]/g);
/* If duplicates i.e ctrl+ctrl+a or alt+alt+b or b+alt+b it is invalid */
if (keys.length !== new Set(keys).size) {
throw new Error(`Can't parse keybinding ${keybinding} Duplicate modifiers`);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,15 @@
********************************************************************************/

import { Command, CommandContribution, CommandRegistry, ResourceProvider } from '@theia/core';
import { ApplicationShell, NavigatableWidget, open, OpenerService, Saveable } from '@theia/core/lib/browser';
import {
ApplicationShell,
CommonCommands,
NavigatableWidget,
open,
OpenerService,
PrefixQuickOpenService,
Saveable
} from '@theia/core/lib/browser';
import { ContextKeyService } from '@theia/core/lib/browser/context-key-service';
import { ApplicationShellMouseTracker } from '@theia/core/lib/browser/shell/application-shell-mouse-tracker';
import { CommandService } from '@theia/core/lib/common/command';
Expand Down Expand Up @@ -63,6 +71,8 @@ export class PluginVscodeCommandsContribution implements CommandContribution {
protected readonly openerService: OpenerService;
@inject(ApplicationShellMouseTracker)
protected readonly mouseTracker: ApplicationShellMouseTracker;
@inject(PrefixQuickOpenService)
protected readonly quickOpen: PrefixQuickOpenService;

registerCommands(commands: CommandRegistry): void {
commands.registerCommand(VscodeCommands.OPEN, {
Expand Down Expand Up @@ -137,6 +147,24 @@ export class PluginVscodeCommandsContribution implements CommandContribution {
commands.registerCommand({ id: 'workbench.action.files.openFolder' }, {
execute: () => commands.executeCommand(WorkspaceCommands.OPEN_FOLDER.id)
});
commands.registerCommand({ id: 'workbench.action.gotoLine' }, {
execute: () => commands.executeCommand('editor.action.gotoLine')
});
commands.registerCommand({ id: 'actions.find' }, {
execute: () => commands.executeCommand(CommonCommands.FIND.id)
});
commands.registerCommand({ id: 'undo' }, {
execute: () => commands.executeCommand(CommonCommands.UNDO.id)
});
commands.registerCommand({ id: 'workbench.action.closeAllEditors' }, {
execute: () => commands.executeCommand(CommonCommands.CLOSE_ALL_TABS.id)
});
commands.registerCommand({ id: 'editor.action.startFindReplaceAction' }, {
execute: () => commands.executeCommand(CommonCommands.REPLACE.id)
});
commands.registerCommand({ id: 'workbench.action.quickOpen' }, {
execute: () => this.quickOpen.open('')
});
commands.registerCommand({ id: 'workbench.action.files.save', }, {
execute: (uri?: monaco.Uri) => {
if (uri) {
Expand Down
2 changes: 2 additions & 0 deletions packages/plugin-ext/src/common/known-commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -199,8 +199,10 @@ export namespace KnownCommands {
mappings['scrollPageUp'] = ['scrollPageUp', MONACO_CONVERSION_IDENTITY];
mappings['tab'] = ['tab', MONACO_CONVERSION_IDENTITY];
mappings['removeSecondaryCursors'] = ['removeSecondaryCursors', MONACO_CONVERSION_IDENTITY];
mappings['cursorWordRight'] = ['cursorWordEndRight', MONACO_CONVERSION_IDENTITY];
mappings['cursorWordEndRight'] = ['cursorWordEndRight', MONACO_CONVERSION_IDENTITY];
mappings['cursorWordEndRightSelect'] = ['cursorWordEndRightSelect', MONACO_CONVERSION_IDENTITY];
mappings['cursorWordLeft'] = ['cursorWordStartLeft', MONACO_CONVERSION_IDENTITY];
mappings['cursorWordStartLeft'] = ['cursorWordStartLeft', MONACO_CONVERSION_IDENTITY];
mappings['cursorWordStartLeftSelect'] = ['cursorWordStartLeftSelect', MONACO_CONVERSION_IDENTITY];
mappings['deleteWordLeft'] = ['deleteWordLeft', MONACO_CONVERSION_IDENTITY];
Expand Down

0 comments on commit 0aec778

Please sign in to comment.