Theia APIs——命令和快捷鍵

上一篇:使用Theia——建立語言支持html

命令和快捷鍵

  Theia能夠經過多種不一樣的方式進行擴展。命令容許packages提供能夠被其它包調用的惟一命令,還能夠向這些命令添加快捷鍵和上下文,使得它們只能在某些特定的條件下被調用(如窗口獲取焦點、當前選項等)。java

在Theia中添加命令

  要將命令添加到Theia,必須實現CommandContribution類,如:編程

java-commands.tsapi

@injectable()
export class JavaCommandContribution implements CommandContribution {
...
    registerCommands(commands: CommandRegistry): void {
        commands.registerCommand(SHOW_JAVA_REFERENCES, {
            execute: (uri: string, position: Position, locations: Location[]) =>
                commands.executeCommand(SHOW_REFERENCES.id, uri, position, locations)
        });
        commands.registerCommand(APPLY_WORKSPACE_EDIT, {
            execute: (changes: WorkspaceEdit) =>
                !!this.workspace.applyEdit && this.workspace.applyEdit(changes)
        });
    }
}
  每個contribution須要提供一個惟一的命令id,以及一個命令處理程序(由回調函數執行)。
  將contribution綁定到CommandContribution。
  而後將contribution的類注入到適當的模塊中(確保類被標記爲@injectable()),像這樣:
java-frontend-module.ts
export default new ContainerModule(bind => {
    bind(CommandContribution).to(JavaCommandContribution).inSingletonScope();
    ...
});

  負責註冊和執行命令的類是CommandRegistry,經過get commandIds() api能夠獲取命令列表。app

添加快捷鍵

  默認狀況下不須要給命令添加快捷鍵,由於它能夠經過許多不一樣的方式來調用(經過編程方式或者用戶點擊)。不過,咱們仍然能夠將具備特定上下文的快捷鍵綁定到命令上以完成相同的命令功能。
  要添加快捷鍵,只須要注入一個 KeybindingContribution的實現。
editor-keybinding.ts
@injectable()
export class EditorKeybindingContribution implements KeybindingContribution {

    constructor(
        @inject(EditorKeybindingContext) protected readonly editorKeybindingContext: EditorKeybindingContext
    ) { }

    registerKeybindings(registry: KeybindingRegistry): void {
        [
            {
                command: 'editor.close',
                context: this.editorKeybindingContext,
                keybinding: "alt+w"
            },
            {
                command: 'editor.close.all',
                context: this.editorKeybindingContext,
                keybinding: "alt+shift+w"
            }
        ].forEach(binding => {
            registry.registerKeybinding(binding);
        });
    }
}
   commandId必須是預先註冊好的命令,並且必須惟一。 context是一個簡單的類,用於確保命令和快捷鍵的綁定組合在特定條件下是可用的。對於編輯器而言,它看起來是這樣的:
editor-keybinding.ts
@injectable()
export class EditorKeybindingContext implements KeybindingContext {
    constructor( @inject(EditorManager) protected readonly editorService: EditorManager) { }

    id = 'editor.keybinding.context';

    isEnabled(arg?: Keybinding) {
        return this.editorService && !!this.editorService.activeEditor;
    }
}
  context也有一個惟一的id,用於在上下文中將快捷鍵註冊到命令中。 isEnabled()方法會根據給定的條件返回true或false。請注意,context是一個可選參數,若是沒有提供,則默認爲 NOOP_CONTEXT。使用該context註冊的快捷鍵將始終保持開啓狀態,能夠在應用程序的任何地方使用。
  對於 id而言,參數 keycode是必須的,它是一個包含實際快捷鍵綁定的結構。下面是一個正確的結構:
keys.ts
export declare type Keystroke = { first: Key, modifiers?: Modifier[] };

  Modifier是平臺無關的,因此Modifier.M1在OS X上是Command而在Windows/Linux上是CTRL。Key字符串常量定義在keys.ts中。frontend

將contribution綁定到KeybindingContribution

  與綁定命令contribution同樣,快捷鍵contribution也須要按模塊進行綁定,像這樣:
editor-frontend-module.ts
export default new ContainerModule(bind => {
    ...
    bind(CommandContribution).to(EditorCommandHandlers);
    bind(EditorKeybindingContext).toSelf().inSingletonScope();
    bind(KeybindingContext).toDynamicValue(context => context.container.get(EditorKeybindingContext));
    bind(KeybindingContribution).to(EditorKeybindingContribution);
});
相關文章
相關標籤/搜索