我可以有一个不显示在命令面板中的 TreeView 动作吗?

Can I have a TreeView action that doesn't show up in the command palette?

我想在我的 VS Code 扩展中有一个 TreeView,我希望能够右键单击视图中的项目并有一个包含操作的上下文菜单。 official way to do this是将其添加到清单的menus对象中:

"view/item/context": [
      {
        "command": "myExtension.myAction",
        "when": "view == myExtension",
        "group": "inline"
      }
]

命令 myExtension.myAction 现在(据我所知)必须添加到清单的 commands 部分。 这会导致它显示在命令面板中。这非常不方便。在右键单击某个项目的上下文之外,我的上下文操作毫无意义,它只会弄乱命令面板。

是否有任何方法可以将视图操作与命令挂钩而不让它们显示在命令面板中?

这不是世界上最直观的事情,但它非常简单。首先,如答案中所述,您必须在扩展清单 (package.json) 的 commands 部分中列出您的命令:

"contributes": {
    "commands": [
        {
            "command": "myExtension.myAction",
            "when": "view == myExtension",
            "group": "inline"
        }
    ]
}

现在,在 contributesmenus 部分,将命令的 when 表达式设置为 false:

"contributes": {
    "menus": {
        "commandPalette": [
            {
                "command": "myExtension.myAction",
                "when": "false"
            }
        ]
    }
}

when 表达式控制命令何时应显示在命令面板中,因此这意味着它将永久消失。参见 the documentation

在我的测试中(绝不是绝对彻底的)它也可以,更简单地说,将此启用子句添加到您的命令中:

"contributes": {
    "commands": [
        {
            "command": "myExtension.myAction",
            "when": "view == myExtension",
            "enablement": "view == <your treeview id here>"
            "group": "inline"
        }
    ]
}

当我这样做时,我的命令面板中没有显示该命令。然后你就不需要 commandPalette 菜单项了。