【问题标题】:How to create a "terminal configuration macro" in VS Code? Open and split multiple terminals easily如何在 VS Code 中创建“终端配置宏”?轻松打开和拆分多个终端
【发布时间】:2020-06-13 10:55:41
【问题描述】:

到第 1 年约 400 次:

  • 打开 VS 代码
  • 打开一个终端
  • 将终端分为两部分
  • 运行"npm run hot"(第一次拆分)
  • 将另一个拆分终端留空
  • 打开第二个终端(带有“+”按钮)
  • 将其分成 3 部分
  • 运行"php artisan websockets:serve"(第一部分)
  • 运行"php artisan queue:words"(第二部分)
  • 运行"maidev --ip=localhost"(第三部分)
  • 终于可以开始工作了

我确定我不是唯一一个遇到这个问题的人。 有没有人可以通过一个命令或配置来优化它?

感谢您的帮助!

【问题讨论】:

    标签: visual-studio-code terminal configuration macros console


    【解决方案1】:

    使用此设置:

    "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"
       }
     },
    

    但没有自动启动它们。要让它们立即启动,请将返回的 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"
    },
    

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

    【讨论】:

      【解决方案2】:

      好的,在用其他两个答案回答这个问题的第二天,我看到了这个扩展:Restore Terminals 在另一个问题https://stackoverflow.com/a/62595681/836330

      这个扩展似乎工作得很好。把它放到你的 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 将挂起并最终超时并需要重新打开。


      【讨论】:

      • 感谢您的时间标记!我肯定会选择这个解决方案! :) 再次非常感谢!
      【解决方案3】:

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

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

      "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。只需替换您的

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-26
        • 2022-01-09
        • 1970-01-01
        • 2017-09-11
        • 1970-01-01
        • 2023-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多