一个操作,多个终端窗口运行程序

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

许多开发环境都需要在终端窗口中运行程序。例如 npm run start 等等。我知道我最大的项目需要我在一个终端中运行一个大型复杂的基于 Docker 的程序,在另一个终端中运行 Ruby on Rails,在另一个终端中运行 webpack。我参与的其他项目也需要多个终端窗口,而且我不认为这是很罕见的情况。我听说过其他几位开发者也遇到过这种情况。这并不是一个糟糕的情况,只是有点麻烦和令人恼火。我必须记住所有命令,并以一种舒适的方式设置我的命令行应用程序。对我来说,分割面板比选项卡更好,尽管对于不同的项目使用选项卡似乎也可以。

当然,我在 Twitter 上提出了这个问题。我想在这里整理一下可用的选项。

  • tmux 是最受欢迎的答案。我非常确定我不了解它所有的功能,但我认为我理解它是在一个终端会话中创建“伪”窗格,模拟多个窗格。因此,这些多个窗格可以被配置为同时打开和运行不同的命令。我发现这一点很有趣,因为就在几天前,我的 CodePen 联合创始人告诉我们他一直在开发的新开发环境将使用 tmux。
  • 一位朋友向我推荐了 kitty,他告诉我 kitty 感觉就像一个成熟版的 tmux。它可以配置成具有在启动时运行的命令的布局。
  • 所有平台都有原生应用程序可以运行多个面板。
    • macOS:我一直使用 iTerm,它可以很好地分割面板。它还可以记住窗口布局,我之前也用过,但我没有看到任何用于在该布局中触发命令的内置选项。原生终端也可以进行选项卡和分割,但感觉非常有限。
    • Linux:Terminator
    • Windows:默认终端 具有窗格功能
  • 有一些 npm 工具可以运行多个脚本,例如 concurrentlynpm-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,但显然你可以用它做 很酷的事情