在 VsCode 中的按键上执行 bat 文件

Execute a bat file on keypress in VsCode

我正在为 vulkan 编写着色器,必须将其编译到 spir-v 中。我有一个非常好的批处理文件,它将使用 GLSlangvalidator 为我构建着色器。我正在尝试按下 运行 我在 VsCode 中的批处理文件,这样我就可以检查我的代码是否有错误,以便构建它。我有以下内容:

    {
    "key": "f5",
    "label": "build",
    "type": "shell",
    "command": "workbench.action.terminal.sendSequence",
    "args" : {"text": ".\compile.bat"},
    "presentation" : {
        "reveal": "always"
    }

这几乎可以工作 - 但我仍然必须专注于内置终端面板并按 Enter 键。肯定有一种方法可以执行命令,而不是只输入字符串吗? 谢谢!

tasks.json中,创建一个任务到运行 .bat。像这样:

{
    "label": "MY_TASK",
    "type": "shell",
    "command": "MY_BAT_FILE.bat",
    "presentation": {"echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true},
    "group": {"kind": "build", "isDefault": true},
},

然后,使用 Tasks: Run Build Task 热键 (CtrlShiftB默认)。


您可以有多个这样的任务。

最多一个任务可以有"isDefault": trueCtrlShiftB 应该 运行.

您可以为这些任务分配自定义热键,方法是在您的 keybindings.json 中添加以下内容:

{"key": "f5", "command": "workbench.action.tasks.runTask", "args": "MY_TASK"},
//       ^~ key                                                     ^~~~~~~ task name
{
  "key": "alt+5",
  // "label": "build",               // no effect in a keybinding
  // "type": "shell",                // no effect in a keybinding
  "command": "workbench.action.terminal.sendSequence",
  "args": {
    "text": ".//test.bat\u000D"
  // },
  // "presentation": {              // no effect in a keybinding
    // "reveal": "always"
  // },
},

我注释掉的那些键和值在这个键绑定中没有作用。他们会去完成一项任务。如果这些对您很重要,那么您应该采用其他答案中的任务方法。如果你想用 presentation 做的只是确保终端打开,你可以在宏键绑定中将 sendSequence 调用与 terminal.focus 结合起来,如:

{
  "key": "alt+3",
  "command": "extension.multiCommand.execute",
  "args": {
    "sequence": [
      "terminal.focus",
      {
        "command": "workbench.action.terminal.sendSequence",
        "args": {
          "text": ".//test.bat\u000D"
        }
      }
    ]
  },
}

否则你已经非常接近你的初始键绑定了。使用unicode字符\u000D在发送到终端的文本末尾添加一个return,它会立即运行。

因此,如果您在触发键绑定之前或之后手动打开终端,这就足够了:

  {
    "key": "alt+5",
    "command": "workbench.action.terminal.sendSequence",
    "args": {
      "text": ".//test.bat\u000D"   // these path separators work for me on Windows
    }
  }