【问题标题】:Create multiple terminals and run commands in VSCode在 VSCode 中创建多个终端并运行命令
【发布时间】:2020-06-22 13:39:05
【问题描述】:

我在 Mac 上 ????。我正在尝试探索一种方法来创建 4 个终端,只要我 dbl 单击我的工作区文件。 我试图让一个工作,但我似乎卡住了

{
    "folders": [
        {
            "path": "/Users/bheng/Sites/laravel/project"
        }
    ],
    "settings": {
        "workbench.action.terminal.focus": true,
        "terminal.integrated.shell.osx": "ls",
        "terminal.integrated.shellArgs.osx": [
            "ls -lrt"
         ]
    },
    "extensions": {}
}

我的目标是开4个终端

  • 终端 1:运行 'npm run watch'
  • 终端 2:运行“ls -lrt”
  • Terminal3:运行“ssh_staging”
  • 终端 4:运行“mysql”

我一直在关注这个文档:https://code.visualstudio.com/docs/editor/integrated-terminal#_terminal-keybindings

有什么提示吗?

【问题讨论】:

    标签: macos visual-studio-code vscode-settings vscode-tasks


    【解决方案1】:

    我一直在玩这个似乎有效的方法。结合在文件夹打开时运行任务和使该任务依赖于其他任务的能力,我想出了以下内容。它看起来很麻烦,但实际上非常简单和重复。

    首先,您需要一个宏扩展,例如 multi-command。将其放入您的设置中:

    "multiCommand.commands": [
    
        {
          "command": "multiCommand.runInFirstTerminal",
          "sequence": [
            "workbench.action.terminal.new",
            {
              "command": "workbench.action.terminal.renameWithArg",
              "args": {
                "name": "npm watch"
              }
            },
            {
              "command": "workbench.action.terminal.sendSequence",
              "args": {
                "text": "npm run watch\u000D"  // \u000D is a return so it runs
              }
            }
          ]
        },
        {
          "command": "multiCommand.runInSecondTerminal",
          "sequence": [
            "workbench.action.terminal.new",
            {
              "command": "workbench.action.terminal.renameWithArg",
              "args": {
                "name": "ls -lrt"
              }
            },
            {
              "command": "workbench.action.terminal.sendSequence",
              "args": {
                "text": "ls -lrt\u000D"
              }
            }
          ]
        },
        {
          "command": "multiCommand.runInThirdTerminal",
          "sequence": [
            "workbench.action.terminal.new",
            {
              "command": "workbench.action.terminal.renameWithArg",
              "args": {
                "name": "ssh_staging"
              }
            },
            {
              "command": "workbench.action.terminal.sendSequence",
              "args": {
                "text": "ssh_staging\u000D"  // however you run the ssh_staging command
              }
            }
          ]
        },
        {
          "command": "multiCommand.runInFourthTerminal",
          "sequence": [
            "workbench.action.terminal.new",
            {
              "command": "workbench.action.terminal.renameWithArg",
              "args": {
                "name": "mysql"
              }
            },
            {
              "command": "workbench.action.terminal.sendSequence",
              "args": {
                "text": "mysql\u000D"  // however you run the mysql command
              }
            },
            // "workbench.action.focusActiveEditorGroup"
          ]
        }
    ]
    

    每个终端都有一个命令。但是在其中的每一个中,您都可以尽可能多地进入宏 - 这很多,特别是感谢sendSequence 命令。您可以更改目录并将另一个 sendSequence 命令发送到同一个终端实例,也可以运行所有非终端命令,在最后一个终端设置结束时将焦点更改为编辑器,等等。

    我使用命令workbench.action.terminal.renameWithArg 添加了基于您的命令命名每个终端的细节。

    在tasks.json中:

     "tasks": [
    
        {
          "label": "Run 4 terminals on startup",
          "runOptions": {"runOn": "folderOpen"},
    
          "dependsOrder": "sequence",  // or parallel
    
          "dependsOn": [
            "terminal1",
            "terminal2",
            "terminal3",
            "terminal4"
          ]
        },  
    
        {
          "label": "terminal1",
          "command": "${command:multiCommand.runInFirstTerminal}"
        },
        {
          "label": "terminal2", 
          "command": "${command:multiCommand.runInSecondTerminal}",
        },
        {
          "label": "terminal3",
          "command": "${command:multiCommand.runInThirdTerminal}"
        },
        {
          "label": "terminal4",
          "command": "${command:multiCommand.runInFourthTerminal}"
        }
     ]
    

    现在,无论何时打开(或重新加载)此 tasks.json 在四个终端中的工作区文件夹,都应该打开、命名并运行。以我的经验,在 vscode 运行任何 folderOpen 任务之前都会有短暂的延迟。


    如果您更喜欢手动触发Run 4 terminals 任务,您可以像这样设置键绑定:

    {
      "key": "alt+r",     // whatever keybinding you want
      "command": "workbench.action.tasks.runTask",
      "args": "Run 4 terminals on startup"
    },
    

    这里是一个使用keybinding运行的demo,比重新加载vscode更容易演示,但是没有区别。我为每个运行的终端添加了一个间隔延迟,仅用于演示目的 - 否则它非常快。

    我注意到,如果我不与其中一个终端交互或在全部删除之前打开另一个终端,vscode 就会冻结。


    还有一个可能感兴趣的Terminal Manager 扩展名。我没试过。

    一次设置多个终端的扩展,或者只是 运行一些命令。

    但对我来说,这个扩展是否可以配置为在 folderOpen 上运行并不明显 - 但它似乎贡献了一个 run all the terminals 命令,所以你应该能够在任务中使用它。

    【讨论】:

    • 我在执行此操作时遇到问题,VSCode 说:无法解析工作区文件夹 'file:///home/..' 中的依赖任务 'terminal1'我在settings.json 中添加了多命令行,在tasks.json 中添加了taskj,我在Linux 上工作你有什么想法吗?
    • 我无法在 linux 上测试它。我会先看看是否只有一个键绑定来运行terminal1 任务本身是否有效(我会将该任务设为echols)只是为了消除其他可能性。然后通过只有一个依赖任务的键绑定尝试Run 4 terminals 任务,您的terminal1。我假设你也安装了多命令扩展?
    【解决方案2】:

    我喜欢accepted answer。但是,我更喜欢 not 使用multi-command 扩展名,如已接受的答案所示,我认为我的方法更简单。

    请注意我的情况:

    • 我的项目只需要三个可以并行运行的任务(craft-servercraft-appcraft-site)——但这种方法应该适用于更多任务
    • 我更喜欢在三个单独的终端中查看三个任务的输出(而不是在一个终端中组合)
    • 我的任务永远不会“完成”(所有三个任务都“监视”文件更改,因此我需要终端保持打开状态)

    请参阅下面的tasks.json 文件。 您需要自己修改"label""command" 属性。请参阅下面关于重要部分的注释。

    {
        "version": "2.0.0",
        "tasks": [
            /// ...other tasks...
            {
                "label": "runDevelopment",
                "runOptions": {
                    "runOn": "folderOpen"
                },
                "dependsOrder": "parallel",
                "dependsOn": [
                    "craft-server",
                    "craft-site",
                    "craft-app"
                ]
            },
            {
                "label": "craft-server",
                "type": "shell",
                "command": "npx nodemon --watch . --ignore craft-angular/projects/craft-app/ --ignore craft-angular/projects/craft-site/ --ignore dist/ --ignore bin/ --ignore log/ --ignore cypress/ --ignore cypress.json ./bin/www",
                "presentation": {
                    "panel": "dedicated"
                }
            },
            {
                "label": "craft-site",
                "type": "shell",
                "command": "cd ./craft-angular  && node --max_old_space_size=8000 ./node_modules/@angular/cli/bin/ng build craft-site --verbose=false --progress=true --watch --output-path=\"./dist/development/craft-site\"",
                "presentation": {
                    "panel": "dedicated"
                }
            },
            {
                "label": "craft-app",
                "type": "shell",
                "command": "cd ./craft-angular  && node --max_old_space_size=8000 ./node_modules/@angular/cli/bin/ng build craft-app --verbose=false --progress=true --watch --output-path=\"./dist/development/craft-app\"",
                "presentation": {
                    "panel": "dedicated"
                }
            }
        ]
    }
    

    请注意:

    • 我只使用 VS Code tasks.json / custom tasks 功能(我不使用 VS Code 扩展)
    • 我使用"dependsOn" 方法,如已接受的答案所示,这样一个任务可以并行调用多个其他任务(注意"dependsOrder": "parallel"
    • 我使用"runOptions" 方法,如接受的答案所示,这样当我打开我的工作区时 VSCode 将运行我的“组合”任务(这是可选的;您也可以使用接受的答案所示的键绑定(@ 987654323@))
    • 我不使用 "problemMatcher" 属性(即 VS Code 功能来扫描每个终端的输出);因此,当我运行任务时,我选择“继续而不扫描任务输出
    • 我将"presentation" 属性与{"panel":"dedicated"} 一起使用,因此我的每个任务都有一个单独的终端

    runDevelopment 任务应该在我打开工作区(即包含.vscode 文件夹和.vscode/tasks.json 文件的工作区)时自动运行

    这是我手动运行任务的方式(如果需要);

    1. 我使用Ctrl+Shift+P打开命令窗口;
    2. 然后键入“运行任务”; (按 Enter
    3. 然后选择单个“组合”任务(对我来说,它被命名为runDevelopment;点击Enter
    4. 最后选择“继续不扫描任务输出”并按Enter(因为我的任务都没有"problemMatcher",我可以自己解释任务输出):

    这是任务运行后的样子;请注意,3 个单独的终端用于 3 个单独的子任务:

    【讨论】:

      【解决方案3】:

      我喜欢只使用 vscode 任务的第二个答案,但它不适用于我的要求,因为我无法在打开的终端中输入其他指令,否则它将关闭。我更喜欢在 vscode 中使用Restore Terminals

      安装扩展后,您可以在.vscode文件夹中创建一个restore-terminals.json文件:

      {
        "artificialDelayMilliseconds": 300,
        "keepExistingTerminalsOpen": false,
        "runOnStartup": true,
        "terminals": [
          {
            "splitTerminals": [
              {
                "name": "server",
                "commands": ["npm i", "npm run dev"]
              },
              {
                "name": "client",
                "commands": ["npm run dev:client"]
              },
              {
                "name": "test",
                "commands": ["jest --watch"]
              }
            ]
          },
          {
            "splitTerminals": [
              {
                "name": "build & e2e",
                "commands": ["npm run eslint", "npm run build", "npm run e2e"],
                "shouldRunCommands": false
              },
              {
                "name": "worker",
                "commands": ["npm-run-all --parallel redis tsc-watch-start worker"]
              }
            ]
          }
        ]
      }
      
      

      【讨论】:

        猜你喜欢
        • 2021-02-17
        • 2020-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-06
        • 2023-03-17
        • 1970-01-01
        相关资源
        最近更新 更多