如何在 VS Code 中创建 "terminal configuration macro"?轻松打开和拆分多个终端

How to create a "terminal configuration macro" in VS Code? Open and split multiple terminals easily

第 1 年~400 次:

我相信遇到这个问题的不止我一个人。 谁有办法用一个命令或配置来优化它?

感谢您的帮助!

因为一个版本特别长,所以我会做这两个答案。一个答案使用宏扩展来帮助解决这个问题,另一个答案仅使用任务。

对于这两种解决方案,请使用此设置:

"terminal.integrated.windowsEnableConpty": false // true 是默认值

当您尝试删除通过这些方法打开的终端时,存在影响 Winpty 和 vscode 的严重未解决错误。


使用宏扩展 multi-command。这进入你的 tasks.json:

 {
    "label": "Run 2 terminals with macro",
    "dependsOrder": "sequence", // or parallel
    "dependsOn": [
      "terminal1",
      "terminal2"
    ],
    // "runOptions": { "runOn": "folderOpen" }
  },
  {
    "label": "terminal1",
    "command": "${command:multiCommand.startFirstTerminal}"
  },
  {
    "label": "terminal2", 
    "command": "${command:multiCommand.startSecondTerminal}"
  },

宏运行这两个任务。这进入你的 settings.json:

"multiCommand.commands": [

{
  "command": "multiCommand.startFirstTerminal",
  "sequence": [
    "workbench.action.terminal.newInActiveWorkspace",
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "npm run test\u000D"
      }
    },
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "npm run hot"
      }
    },
     "workbench.action.terminal.split",
  ]
},
{
  "command": "multiCommand.startSecondTerminal",
  "sequence": [
    "workbench.action.terminal.newInActiveWorkspace",
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "websockets:serve"
      }
    },
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "ls -lrt\u000D"
      }
    },
    "workbench.action.terminal.split",
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "queue:words"
      }
    },
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "ls -lrt\u000D"
      }
    },
    "workbench.action.terminal.split",
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "maidev"
      }
    },
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "ls -lrt\u000D"
      }
    },
  ]
 }
]

我重命名了终端以匹配您的命令 - 或许您不关心这个并且可以删除 renameWithArg 部分以缩短整个内容。

我无法使用您的 php 设置进行测试,因此我在每个终端中替换为 ls -lrt\u000D 运行ning。只需替换您的

   {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "php artisan websockets:serve\u000D"
      }
    },

例如。 \u000D 是一个 return,所以命令 运行 立即生效。现在您可以使用 "runOptions": { "runOn": "folderOpen" } 选项,以便在工作区打开时主任务 运行s 或为主任务分配键绑定,例如

{
  "key": "alt+z",   // or watever you want
  "command": "workbench.action.tasks.runTask",
  "args": "Run 2 terminals with macro"
},

使用此设置:

"terminal.integrated.windowsEnableConpty": false // true 是默认值


在tasks.json中:

{
  "label": "Run 2 terminals from tasks",
  
  "dependsOrder": "sequence",  // or parallel
  
  "dependsOn": [
    "OpenTerminal1",
    "RunInTerminal1",
    "RenameTerminal1",   // if you care to rename each terminal
    "SplitTerminal1",

    "OpenTerminal2",
    "RunInTerminal2a",
    "RenameTerminal2a",   // if you care to rename each terminal

    "SplitTerminal2",
    "RunInTerminal2b",
    "RenameTerminal2b",   // if you care to rename each terminal

    "SplitTerminal2",
    "RunInTerminal2c",
    "RenameTerminal2c",   // if you care to rename each terminal
  ],
  // "runOptions": { "runOn": "folderOpen" }  // or trigger with keybinding
},

这是调用所有组成任务的“主”任务,它们是:

{
  "label": "OpenTerminal1",
  "command": "${command:workbench.action.terminal.new}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RunInTerminal1",
  "command": "${input:runTerminal1}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RenameTerminal1",
  "command": "${input:renameTerminal1}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "SplitTerminal1",
  "command": "${command:workbench.action.terminal.split}",
  "type": "shell",
  "problemMatcher": []
},
// ------------------------------------------------------------------
{
  "label": "OpenTerminal2",
  "command": "${command:workbench.action.terminal.new}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RunInTerminal2a",
  "command": "${input:runTerminal2a}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RenameTerminal2a",
  "command": "${input:renameTerminal2a}",
  "type": "shell",
  "problemMatcher": []
},
// ------------------------------------------------------------------
{
  "label": "SplitTerminal2",
  "command": "${command:workbench.action.terminal.split}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RunInTerminal2b",
  "command": "${input:runTerminal2b}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RenameTerminal2b",
  "command": "${input:renameTerminal2b}",
  "type": "shell",
  "problemMatcher": []
},
// ------------------------------------------------------------------
{
  "label": "RunInTerminal2c",
  "command": "${input:runTerminal2c}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RenameTerminal2c",
  "command": "${input:renameTerminal2c}",
  "type": "shell",
  "problemMatcher": []
},

你可能认为这就足够了,但你可以看到该任务需要 args(发送到终端的内容)所以我不得不使用这种形式:

"command": "${input:runTerminal2c}",

以便 input 可以提供所需的参数和命令。这些进入任务文件的 inputs 部分,如下所示:

"inputs": [   

 {
   "id": "openTerminal1",      
   "type": "command",
   "command": "workbench.action.terminal.new",
 },
 {
   "id": "runTerminal1",
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "npm run test\u000D"
   }
 },
 {
   "id": "renameTerminal1",      
   "type": "command",
   "command": "workbench.action.terminal.renameWithArg",
   "args": {
     "name": "npm run hot"
   }
 },

 {
   "id": "openTerminal2",      
   "type": "command",
   "command": "workbench.action.terminal.new",
 },
 {
   "id": "runTerminal2a",      
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "php artisan websockets:serve"
   }
 },
 {
   "id": "renameTerminal2a",
   "type": "command",
   "command": "workbench.action.terminal.renameWithArg",
   "args": {
     "name": "websockets:serve"
   }
 },
 {
   "id": "runTerminal2b",
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "php artisan queue:words"
   }
 },
 {
   "id": "renameTerminal2b",
   "type": "command",
   "command": "workbench.action.terminal.renameWithArg",
   "args": {
     "name": "queue:words"
   }
 },
 {
   "id": "runTerminal2c",
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "maidev"
   }
 },
 {
   "id": "renameTerminal2c",
   "type": "command",
   "command": "workbench.action.terminal.renameWithArg",
   "args": {
     "name": "maidev"
   }
 }

同样,也许您不关心所有重命名终端命令并且可以消除这些命令。在这里,我刚刚将您的命令发送到终端:

 {
   "id": "runTerminal2c",
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "maidev"
   }
 },

但没有自动启动它们。要让它们立即启动,请将 return unicode 添加到发送到终端的 text,例如:

 {
   "id": "runTerminal2c",
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "maidev --ip=localhost"
   }
 },


最后是触发主任务的键绑定(如果您不使用 运行 打开文件夹选项):

{
  "key": "alt+z",
  "command": "workbench.action.tasks.runTask",
  "args": "Run 2 terminals from tasks"
},

我更喜欢宏版本 - 它更短并且更不容易出现设置错误。两者都非常快。

好的,在用其他两个答案回答这个问题的第二天,我看到了这个扩展:Restore Terminals at this other question

这个扩展似乎工作得很好。将其放入您的 settings.json:

  "restoreTerminals.runOnStartup": false,   // true is the default
          // set to false if using a keybinding or the command palette

  "restoreTerminals.terminals": [
    {
      "splitTerminals": [
        {
          "name": "server",
          "commands": [
            "npm run test"
          ]
        },
        {
          "name": "empty",
        }
      ]
    },
    {
      "splitTerminals": [
        {
          "name": "websockets",
          "commands": [
            "ls -l"
          ]
        },
        {
          "name": "queue",
          "commands": [
            "cd zip",
            "gulp sass"
          ]
        },
        {
          "name": "maidev",
          "commands": [
            "cd zip-multiple",
            "gulp"
          ]
        }
      ]
    }
  ],

还有一个键绑定:

{
  "key": "shift+alt+t",    // whatever keybinding if you wish
  "command": "restore-terminals.restoreTerminals",
},

如果启用 Windows,我仍会使用设置:

 "terminal.integrated.windowsEnableConpty": false

因为使用此扩展作为任何其他方法快速打开和写入终端时会出现同样的问题 - 如果您随后尝试关闭终端 vscode 将挂起并最终超时,需要重新打开。