命令标识为什么必须和贡献的命令一致?
结论
contributes.commands 里的 command 和 commands.registerCommand 的第一个参数必须是同一个字符串。清单负责「让用户看得见」,注册负责「点下去有函数」。两边不一致时,菜单是空的,或者点了报命令未找到。
展开
{
"contributes": {
"commands": [
{ "command": "myext.hello", "title": "问好", "category": "我的插件" }
],
"menus": {
"commandPalette": [{ "command": "myext.hello" }]
}
}
}
context.subscriptions.push(
vscode.commands.registerCommand("myext.hello", () => {
vscode.window.showInformationMessage("你好");
})
);
宿主用这串 id 把菜单、快捷键、激活事件绑到同一个处理函数上。差一个字母就对不上。
分工:
- 只有清单:命令面板能搜到,点击后没有处理函数,提示 command not found。插件如果还没激活,隐式激活也是按这个 id 去加载的。
- 只有
registerCommand:函数存在,但命令面板和右键菜单不会出现,因为界面贡献是声明式的,不扫描你的源码。 title是给人看的,command才是键。分类会显示成「我的插件: 问好」。
菜单项如果要带固定参数,写在贡献点的 arguments 里,回调按参数接收。
容易讲错的点
- id 习惯加发布者前缀或插件短名,避免和别的插件撞车。撞车后谁后注册谁覆盖,行为不稳定。
- 改名要同时改命令、菜单、快捷键、激活事件和文档,漏一处就是「有的入口能用、有的不能」。
registerTextEditorCommand只在有活动编辑器时可见可用,普通命令不要误用它。