tmux + Ghostty 工作流 (终端复用器与终端模拟器)

如果你只记住一句话:Ghostty 是”装终端的窗口”,tmux 是窗口里再套一层”多任务管理器”。 两者分工不同、互补不冲突。

1. 定义

要从”你每次敲命令时电脑里发生了什么”说起,否则这两个工具很容易混淆。

当你在 macOS 上打开一个黑底绿字的窗口敲命令,背后其实有三层东西:

┌─────────────────────────────────────────────────────────┐
│ ① 终端模拟器 (Terminal Emulator) —— 比如 Ghostty、iTerm  │
│    "画界面的窗口",负责显示字符、接收按键、渲染字体/颜色   │
│                                                           │
│   ┌───────────────────────────────────────────────────┐ │
│   │ ② Shell —— 比如 zsh、bash                          │ │
│   │    "翻译官",把你敲的命令变成系统调用                │ │
│   │                                                     │ │
│   │   ┌─────────────────────────────────────────────┐ │ │
│   │   │ ③ 程序 —— 比如 python、vim、node            │ │ │
│   │   │    真正干活的东西                            │ │ │
│   │   └─────────────────────────────────────────────┘ │ │
│   └───────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
  • 终端模拟器(Terminal Emulator):一个 GUI 程序,本质是”假装自己是老式物理终端机的软件”。它给你一个能打字、能看输出的窗口。Ghostty、iTerm2、macOS 自带”终端”都属这一类。
  • 终端复用器(Terminal Multiplexer):一个在 Shell 层面运行的命令行程序(tmux)。它在一个终端窗口里,再虚拟出多个”会话 / 窗口 / 面板”,而且——关键点——关掉外层窗口,里面的程序还在后台跑

类比:终端模拟器像”浏览器这个 App”;tmux 像”浏览器里开的一个网页应用,它能开很多标签页,而且你关掉浏览器再打开,那些标签页(会话)还活着”。

2. 核心概念

Ghostty 管什么(本地体验层)

概念是什么默认快捷键(macOS)
窗口 Window一个独立的 Ghostty 程序窗口Cmd+N
标签页 Tab窗口内的多个标签页Cmd+T
原生分屏 Split一个标签页里左右/上下拆成几块Cmd+D(右)、Cmd+Shift+D(下)
主题/字体/模糊纯界面渲染效果写在 ~/.config/ghostty/config

Ghostty 的原生分屏/标签页只是显示层的切割,关掉窗口,里面的进程就死了。它不负责”持久化”。

tmux 管什么(持久化层)

概念是什么说明
Session 会话一个独立工作环境可后台保留,断线不丢
Window 窗口会话里的”标签页”,可多个前缀 + c 新建
Pane 面板窗口里再左右/上下分屏前缀 + | 竖、前缀 + -

tmux 的”前缀键”(prefix)默认是 Ctrl+b。所有 tmux 快捷键都要先按 Ctrl+b 松开,再按功能键。例如 Ctrl+b 然后按 %(旧默认横分)或我们配的 \|

一句话:Ghostty 用 Cmd 系快捷键,tmux 用 Ctrl+b 系快捷键。所以两者叠在一起用不会冲突——这正是它们能配合的原因。

3. 在系统中的位置(为什么需要两个)

Ghostty 窗口 (本地 macOS)
 ├─ Tab 1: 本地 shell          (随便用,关了就关了)
 ├─ Tab 2: tt  →  tmux session "main"   (持久化!)
 │              ├─ pane: 写代码 (vim)
 │              └─ pane: 跑测试
 └─ Tab 3: sshx server  →  远程机器上的 tmux session   (SSH 断了也继续跑)
                ├─ pane: 训练任务
                └─ pane: 看日志
  • 只装 Ghostty,不装 tmux:能分屏、能多标签,但 SSH 到服务器跑训练,一断网,训练就死了。
  • 只装 tmux,不装 Ghostty:功能上够用,但本地分屏的观感、字体渲染、模糊质感不如现代模拟器(iTerm/Ghostty/Kitty 这类)。
  • 两者一起:本地顺手(Ghostty 原生分屏)+ 远程不断线(tmux 持久化)。互补。

4. 基本用法

Ghostty(几乎不用记命令,都是界面操作)

# 安装(你已经是 brew 装的)
brew install --cask ghostty
# 配置文件位置
~/.config/ghostty/config
# 常用界面操作
#   Cmd+T          新标签页
#   Cmd+D          向右分屏   Cmd+Shift+D  向下分屏
#   Cmd+[ / Cmd+]  在分屏间切换

tmux(核心命令,前缀键 = Ctrl+b)

# --- 会话 ---
tmux new -s work        # 新建名为 work 的会话
tmux attach -t work     # 重新接入(断线后重连就靠它)
tmux ls                 # 列出所有会话
tmux kill-session -t work
 
# --- 进入 tmux 后的快捷键(先按 Ctrl+b 松开,再按)---
#   c      新建窗口        n / p   下一个/上一个窗口
#   %      竖分屏(默认)    |       竖分屏(我们配的,更直观)
#   "      横分屏(默认)    -       横分屏(我们配的)
#   h/j/k/l 在面板间移动(vim 风格,我们配的)
#   d      脱离会话(detach,程序继续跑)
#   r      重载 tmux 配置(我们配的)
#   z      当前面板最大化/还原
#   [      进入滚动/复制模式(配合 vim 键位)

5. 对比辨析表

维度Ghostty(终端模拟器)tmux(终端复用器)
是什么GUI 程序,画窗口Shell 里跑的命令行程序
运行在哪直接是那个”终端窗口”在终端窗口里面
关掉窗口里面进程死掉会话继续后台跑(可重连)
分屏/标签原生支持,渲染好也支持,但观感朴素
远程服务器服务器上没有 GhosttySSH 上去就能用,不可替代
脚本化主要是交互,配置靠 config 文件可被脚本精确控制
快捷键前缀CmdCtrl+b

易混点:“分屏” Ghostty 能做,tmux 也能做。本地临时看两个东西,用 Ghostty 原生分屏更顺;远程持久化、断线恢复,只能用 tmux 分屏。

6. 典型工作流(本机已配好)

我们已在你机器上配好一套”本地 Ghostty + 持久化 tmux”工作流,核心是两个 zsh 函数(写在 ~/.zshrc):

# tt  —— 本地接入/新建 tmux 会话(默认叫 main)
tt            # 接入 main;没有就新建
tt dev        # 接入名为 dev 的会话
# 脱离:前缀 + d ;下次直接再敲 tt 就回来了
 
# sshx —— SSH 到远程并接入/新建 tmux(断网也不丢)
sshx myserver           # SSH 进去进 main 会话
sshx myserver train     # 指定会话名

日常组合方式:

  1. 开一个 Ghostty 窗口,Cmd+T 开多个标签页。
  2. 需要本地持久化的标签页,敲 tt 进入 tmux。
  3. 需要连服务器的标签页,敲 sshx myserver
  4. 会话内部用 tmux 分屏(前缀+\| 竖、前缀+- 横)同时看代码和日志。
  5. 下班/断网:直接关 Ghostty。程序都还在——本地在 tmux 里、远程在服务器的 tmux 里。下次打开再 tt / sshx 即可恢复。

配套配置(已写入,无需手敲):

  • ~/.config/ghostty/configterm = xterm-256color(让 tmux 真彩色生效)+ 主题/原生分屏保持原样。
  • ~/.tmux.conf:真彩色、鼠标支持、vim 风格 h/j/k/l 导航、直观分屏键、Catppuccin Mocha 状态栏、前缀+r 重载配置。

一个版本坑(已规避):当前 Ghostty 的 new_tab 动作不接受命令参数,所以没法把”按一个键自动开标签页并跑 tmux”绑成快捷键(会报 InvalidFormat)。因此我们用终端里的 tt / sshx 命令接入——版本无关、最稳。若你硬想让”每个新标签页都进 tmux”,可在 ~/.config/ghostty/config 末尾取消注释 command = tmux attach ...(但通常不推荐,会连原生分屏也套上 tmux)。

7. 常见误区

  • “Ghostty 和 tmux 是一个东西,装一个就行。” → 不是。Ghostty 是窗口,tmux 是窗口里的持久化管理器。前者管显示,后者管会话存活。

  • “tmux 的分屏和 Ghostty 的分屏重复了,二选一。” → 功能重叠但目的不同:Ghostty 分屏为了本地看得爽,tmux 分屏为了远程断线不丢。可以一层套一层(Ghostty 分屏里再跑 tmux)。

  • “关掉终端窗口,tmux 里的程序就停了。” → 错。tmux 的精髓就是关窗不断线。要停程序得 tmux kill-session 或在会话里 Ctrl+C 退出进程。

  • “SSH 上去跑训练,挂着不关就没事。” → 只要 SSH 连接断开(网络抖、合盖、睡眠),没用 tmux 包裹的进程基本会被杀掉。远程长任务务必 sshx 进 tmux 再跑。

  • “tmux 前缀键 Ctrl+b 和 Ghostty 快捷键会打架。” → 不会。Ghostty 用 Cmd 系,tmux 用 Ctrl+b 系,修饰键完全不同。

8. 延伸阅读 / 关联概念

  • tmux 官方文档:https://github.com/tmux/tmux/wiki
  • Ghostty 配置文档:https://ghostty.org/docs/config
  • 同仓库相关:command/brew.md(装软件,含 Ghostty 的 brew install --cask ghostty
  • 进阶:tmux 插件管理器 tpm、状态栏主题 catppuccin/tmux、Ghostty 的 shell-integration 与 OSC 52 剪贴板同步