许多开发环境都需要在终端窗口中运行程序。例如 npm run start
等等。我知道我最大的项目需要我在一个终端中运行一个大型复杂的基于 Docker 的程序,在另一个终端中运行 Ruby on Rails,在另一个终端中运行 webpack。我参与的其他项目也需要多个终端窗口,而且我不认为这是很罕见的情况。我听说过其他几位开发者也遇到过这种情况。这并不是一个糟糕的情况,只是有点麻烦和令人恼火。我必须记住所有命令,并以一种舒适的方式设置我的命令行应用程序。对我来说,分割面板比选项卡更好,尽管对于不同的项目使用选项卡似乎也可以。
当然,我在 Twitter 上提出了这个问题。我想在这里整理一下可用的选项。
- tmux 是最受欢迎的答案。我非常确定我不了解它所有的功能,但我认为我理解它是在一个终端会话中创建“伪”窗格,模拟多个窗格。因此,这些多个窗格可以被配置为同时打开和运行不同的命令。我发现这一点很有趣,因为就在几天前,我的 CodePen 联合创始人告诉我们他一直在开发的新开发环境将使用 tmux。
- 这是一个 tmux 配置示例。
- tmuxinator 提升了配置能力,我想是这样吧?更好的配置。
- 一位朋友向我推荐了 kitty,他告诉我 kitty 感觉就像一个成熟版的 tmux。它可以配置成具有在启动时运行的命令的布局。
- 所有平台都有原生应用程序可以运行多个面板。
- macOS:我一直使用 iTerm,它可以很好地分割面板。它还可以记住窗口布局,我之前也用过,但我没有看到任何用于在该布局中触发命令的内置选项。原生终端也可以进行选项卡和分割,但感觉非常有限。
- Linux:Terminator
- Windows:默认终端 具有窗格功能。
- 有一些 npm 工具可以运行多个脚本,例如 concurrently 和 npm-run-all,但(我认为?)它们仅限于运行 npm 脚本,而不是任何终端命令。也许你可以为那些其他命令创建 npm 脚本?但即使那样,我认为你也看不到不同面板中的输出,所以它可能最适合运行一次就完成的脚本,而不是持续运行的脚本。
作为一名 Mac 用户,我对适用于 iTerm 的解决方案最感兴趣,因为我一直在使用它。由于没有 iTerm 的内置解决方案,我了解到它“可脚本化”。显然,他们正在停止对 AppleScript 的支持,转而支持 Python,但,嘿,目前看来它运行良好。
它基本上是这样的

代码
tell application "iTerm"
tell current window
create window with default profile
tell current session of current tab
set name to "run.sh"
write text "cd '/Users/chriscoyier/GitHub/CPOR'"
write text "./run.sh"
end tell
create tab with default profile
tell current session of current tab
set name to "Rails"
write text "cd '/Users/chriscoyier/GitHub/CPOR'"
write text "nvm use"
write text "yarn"
write text "bundle install"
write text "yarn run rails"
end tell
create tab with default profile
tell current session of current tab
set name to "webpack"
write text "cd '/Users/chriscoyier/GitHub/CPOR'"
write text "nvm use"
write text "yarn"
write text "yarn run dev"
end tell
# split vertically
# tell application "System Events" to keystroke "d" using command down
# delay 1
# split horizontally
# tell application "System Events" to keystroke "d" using {shift down, command down}
# delay 1
# moving... (requires permission)
# tell application "System Events" to keystroke "]" using command down
end tell
end tell
我只是打开该脚本,点击运行,它就完成了工作。我保留了注释,因为我想弄清楚如何让它以我想要的方式进行分屏,而不是使用选项卡,但我完成了这个工作然后又变得懒惰了。使用按键来完成它感觉很奇怪,所以我想如果我要深入研究,我会弄清楚他们更新的 Python 是否更直接地支持它或者是什么。我也觉得奇怪的是我不能把它编译成一个小型的应用程序或类似的东西。Automator 不能做到吗?耸耸肩。
我得到的另一个针对 Mac 用户的流行答案是,他们让 Alfred 来完成这项工作。我从未使用过 Alfred,但显然你可以用它做 很酷的事情。
我认为 ttab 包 (https://npmjs.net.cn/package/ttab) 其他人 提到过,更接近你所要求的,并且使用你已经知道的工具。
如果你还没有尝试,我建议你试一试。
在 MacOS 中,我开始使用 iTemocil 来设置各种 iTerm 布局配置。
https://github.com/TomAnthony/itermocil
我有一个用于 Angular/Rails 应用程序的 3 个垂直窗格设置。顶部窗格包含
ng serve
,中间窗格包含rails s
,底部窗格包含rails c
或一个用于 Rails 单元测试的普通终端。有用的文章!
请注意,Windows Terminal 不是默认终端。它由微软开发,但默认情况下未安装,需要从 Microsoft Store 下载。
https://www.microsoft.com/en-gb/p/windows-terminal/9n0dx20hk701
如果使用 **VS Code** 作为 IDE,补充一些管理多个并发终端运行的方法。
可以通过声明
dependsOn
属性并将其想要同时运行的任务放在列表中来设置同时运行的 任务,诀窍在于在每个依赖任务上设置presentation
属性以利用相同的group
属性。以下是一个打开两个终端并在每个终端中运行其命令的示例
我设置了 iTerm,其中一组窗格并排启动一个命令,该命令打印一条消息,说明如果我按下 Enter 键将打开什么。当我启动 iterm 时,它会重新加载设置并等待我在窗格中按下 Enter 键。
我之前让它一开始就运行代码,但我觉得我宁愿自己触发命令,而不是每次都自动运行它们。
我认为我遵循此指南进行了操作:https://webstudiya.com/develop-faster-with-iterm-profiles-and-window-arrangements/
我认为这几乎就是你所要求的。
iTerm 的 Python API 非常简单(即使对于新手,比如我)。
我保存了一个布局,并通过 API 加载它。然后我在每个窗格中运行一个命令
在第一个窗格中运行
docker-compose up
在第二个窗格中运行
npm start
在第三个窗格中加载 Python 虚拟环境
需要一些学习,就像 API 一样,但它运行良好,并且代码量很少。
这是我的脚本
如果你实际上不需要单独的终端,我发现 foreman (http://blog.daviddollar.org/2011/05/06/introducing-foreman.html) 非常有效。它也很容易设置,因为它只需要一个文本文件来列出要运行的命令。