上一篇:使用Theia——创建语言支持

命令和快捷键

  Theia可以通过多种不同的方式进行扩展。命令允许packages提供可以被其它包调用的唯一命令,还可以向这些命令添加快捷键和上下文,使得它们只能在某些特定的条件下被调用(如窗口获取焦点、当前选项等)。

在Theia中添加命令

  要将命令添加到Theia,必须实现CommandContribution类,如:

java-commands.ts

@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可以获取命令列表。

添加快捷键

  默认情况下不需要给命令添加快捷键,因为它可以通过许多不同的方式来调用(通过编程方式或者用户点击)。不过,我们仍然可以将具有特定上下文的快捷键绑定到命令上以完成相同的命令功能。
  要添加快捷键,只需要注入一个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中。

将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);
});

Theia APIs——命令和快捷键的更多相关文章

  1. Theia APIs——Preferences

    上一篇:Theia APIs——命令和快捷键 Preferences Theia有一个preference service,模块可以通过它来获取preference的值,提供默认的preference ...

  2. CentOS最常用命令及快捷键整理

    CentOS最常用命令及快捷键整理  整理了Linux常用命令及快捷键. 常用命令: 文件和目录: # cd /home                        进入 '/home' 目录 # ...

  3. Linux最常用命令及快捷键整理

    最近在学Linux系统命令,在阿里云买了一台linux服务器.为方便自己也方便他人,整理了Linux常用命令及快捷键. 用命令: 文件和目录: # cd /home                   ...

  4. Linux学习新篇——常用命令和快捷键总结

    最近刚接触Linux,整理了一些常用的命令和快捷键 Tab补全命令 当命令记不清了,输入记得的前几个用Tab就可以将该命令自动补全. 启动tomcat服务用$startup.sh 停止tomcat服务 ...

  5. Linux经常用到的命令以及快捷键

    Linux常用命令和快捷键 最近一直在对CentOS系统进行各种体验,为方便自己也方便他人,整理了Linux常用命令及快捷键,不过其实大多和DOS是一样的,只是命令的表达上可能有点儿不一样. Linu ...

  6. 【转载】Linux 命令行快捷键 - 移动光标

    Linux 命令行快捷键 - 移动光标 涉及在linux命令行下进行快速移动光标.命令编辑.编辑后执行历史命令.Bang(!)命令.控制命令等.让basher更有效率. 常用 ctrl+左右键:在单词 ...

  7. Linux命令行快捷键及vim快捷方式

    Linux命令行快捷键 快捷键: tab键 自动补全路径 目录 名字, 自动不全命令 快捷键: ctrl +l(小写) 清屏 . ctrl +c 取消当前操作 快捷键: ctrl +d(小写) 退出当 ...

  8. (转帖)CentOS最常用命令及快捷键整理

    原文:http://www.centoscn.com/CentOS/help/2014/0306/2493.html 最近开始学Linux,在VMware Player中安装了CentOS 6.4.为 ...

  9. [转]Linux 命令行快捷键

    群里有人问"问个问题,Linux 命令行有没有快捷键一下从行末会到行头?经常敲了很多命令发现忘加 sudo 了,然后把命令删了重新敲一遍". 自己还真不知道怎么操作,只知道历史命令 ...

随机推荐

  1. PHP实现图片的等比缩放和Logo水印功能示例

    文章来自于:脚本之家 文章链接:https://www.jb51.net/article/112909.htm 这篇文章主要介绍了PHP实现图片的等比缩放和Logo水印功能,结合实例形式分析了php图 ...

  2. 1、Dapper介绍

    1.Dapper是一个轻量级的O/R框架,性能强劲,支持原生sql与模型对象混合写法,通过DapperExtension插件可以实现纯模型的操作(零Sql)语句. 2.创建VS 项目,添加相关的依赖包 ...

  3. SpringBoot使用logback输出日志并打印sql信息 --经典---

    最近在学习springboot以及一些springcloud插件的使用,其中发现默认的配置并不能打印一些有用的日志,所以需要自定义一些日志输出方式以便于查看日志排查问题,目前只整理了两种使用方式,如下 ...

  4. Python--day25--面向对象之多态

    多态(Python天生支持多态) 多态指的是一类事物有多种形态 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): #同一类事物 ...

  5. 如何用for..of.. 遍历一个普通的对象?

    如何用for..of.. 遍历一个普通的对象? 首先了解一下for..of..: 它是es6新增的一个遍历方法,但只限于迭代器(iterator), 所以普通的对象用for..of遍历 是会报错的.下 ...

  6. H3C RIP路由表的初始化

  7. H3C DHCP中继配置示例

  8. JSONPath-简单入门

    JSONPath - 是xpath在json的应用. xml最大的优点就有大量的工具可以分析,转换,和选择性的提取文档中的数据.XPath是这些最强大的工具之一. 如果可以使用xpath来解析json ...

  9. HTML常用布局

    一般的局部布局无非采用如下的技术: 1)div + ul(ol)-li:用于分类导航或菜单等场合     2)div + dl-dt-dd:用于图文混编场合     3)table-tr-td:用于图 ...

  10. 【t068】智慧碑

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] DIABLO魔王和Mini都有三种属性,体力点,攻击点,以及集气点. 两人的攻击方式是这样的:采用回合 ...