跳到主要内容

命令与菜单

命令是一个带唯一字符串 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。

参考​