在 VSCode 中创建多个终端并运行命令

Posted

技术标签:

【中文标题】在 VSCode 中创建多个终端并运行命令【英文标题】:Create multiple terminals and run commands in 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

有什么提示吗?

【问题讨论】:

【参考方案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 文件的工作区)时自动运行

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

    我使用Ctrl+Shift+P打开命令窗口; 然后键入“运行任务”; (按 Enter) 然后选择单个“组合”任务(对我来说,它被命名为runDevelopment;点击Enter) 最后选择“继续不扫描任务输出”并按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"]
        
      ]
    
  ]


【讨论】:

以上是关于在 VSCode 中创建多个终端并运行命令的主要内容,如果未能解决你的问题,请参考以下文章

怎么在vscode中运行html文件

vscode 在终端输入命令直接打开文件

无法在 VS Code 终端中创建 C# 控制台应用程序

如何使用单个工匠命令在 Laravel 8 中创建多个模型?

vscode怎么运行代码

vscode怎么运行代码 怎么操作