命令与菜单
命令是一个带唯一字符串 ID 的函数,官方也把它的函数叫 command handler。用户通过命令面板、快捷键、菜单调用它,扩展也可以用 executeCommand 调用自己的或别人的命令。
两处都要写
清单里声明给人看的信息:
{
"contributes": {
"commands": [
{
"command": "demo.hello",
"title": "Hello",
"category": "Demo"
}
]
}
}
代码里绑定实现。ID 必须和清单里的 command 一致,重复注册同一个 ID 会报错。
context.subscriptions.push(
vscode.commands.registerCommand('demo.hello', () => {
vscode.window.showInformationMessage('Hello');
})
);
registerTextEditorCommand 只在有活动文本编辑器时执行,回调里直接拿到 TextEditor 和一个只在回调期间有效的 TextEditorEdit。
谁可以调用
executeCommand 可以跑编辑器内置命令和其他扩展的命令。调编辑器命令时,参数只允许 string、boolean、number、undefined、null,以及 Position、Range、Uri、Location。调扩展自己贡献的命令时没有这个限制。
下划线开头的命令 ID 被当成内部命令。getCommands(true) 会把它们滤掉。
菜单
contributes.menus 把命令挂到具体位置,并用 when 控制是否显示。常见位置:
| 菜单 ID | 位置 |
|---|---|
commandPalette | 命令面板。默认所有贡献的命令都会出现,用 when 可以藏起来 |
editor/context | 编辑器右键 |
editor/title | 编辑器标题栏 |
explorer/context | 资源管理器右键 |
view/title | 视图标题上的按钮 |
view/item/context | 树节点右键 |
enablement 也是 when 子句,决定命令能不能点。它作用于所有菜单,也作用于注册过的快捷键。when 更偏向「出不出现」。
命令面板里不想显示、但视图按钮还要用的命令,在 menus.commandPalette 里把 when 写成 false。