在 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
任务本身是否有效(我会将该任务设为echo
或ls
)只是为了消除其他可能性。然后通过只有一个依赖任务的键绑定尝试Run 4 terminals
任务,您的terminal1
。我假设你也安装了多命令扩展?【参考方案2】:
我喜欢accepted answer。但是,我更喜欢 not 使用multi-command
扩展名,如已接受的答案所示,我认为我的方法更简单。
请注意我的情况:
我的项目只需要三个可以并行运行的任务(craft-server
、craft-app
和 craft-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 Codetasks.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 中创建多个终端并运行命令的主要内容,如果未能解决你的问题,请参考以下文章