tmux 与 Zellij:终端复用器入门与开发工作区管理¶
适用场景:使用 Ghostty 和 Codex CLI,同时处理多个项目、需求或 Git worktree,希望减少终端标签混乱。
本文是概念与操作入门,不是完整的自动化环境配置手册。命令以工具已经安装为前提;示例项目名称和目录需要替换为实际值。命令依据官方文档整理,未在你的本机环境执行。
1. tmux 和 Zellij 是什么?¶
tmux 和 Zellij 都可以作为终端复用器使用:在一个终端界面中,组织多个终端程序,并支持会话的分离与重新连接。 tmux 使用“会话—窗口—面板”组织程序;Zellij 将自己定位为终端工作区,提供标签、面板和布局等能力。1 3
可以把它们理解为“终端里的工作区管理器”,而不是另一个代码编辑器。
它们主要解决两类问题:一类是同时管理多个 Shell、开发服务、日志和交互程序;另一类是暂时断开终端界面后,重新连接仍在运行的会话。1
基本分工:Ghostty 提供终端界面,tmux 或 Zellij 组织工作区,Codex CLI 等程序运行在工作区里面。1 10
2. 为什么多项目开发需要它们?¶
只依靠 Ghostty 标签管理任务时,工作环境可能逐渐变成这样:
Ghostty 标签栏
├── 项目 A:登录功能
├── 项目 A:登录功能的 Shell
├── 项目 A:支付问题修复
├── 项目 A:开发服务
├── 项目 B:代码重构
├── 项目 B:测试
└── 其他日志、临时命令……
这是一个示例:标签数量不断增长,但“项目、需求、程序”混在同一层级里,查找时需要反复辨认。
可以改为下面的组织约定:
项目 A:一个会话
├── 登录功能:一个窗口或标签
│ ├── Codex CLI
│ ├── Shell / Git 检查
│ └── 测试或开发服务
└── 支付问题修复:另一个窗口或标签
├── Codex CLI
└── Shell / Git 检查
项目 B:另一个会话
└── 代码重构:一个窗口或标签
├── Codex CLI
└── 测试
关键不是把几十个 Ghostty 标签原样搬到另一个标签栏,而是先按“项目 → 需求 → 程序”分层。
3. 先理解三层结构¶
3.1 Session、Window / Tab、Pane¶
| 层级 | tmux 中的名称 | Zellij 中的名称 | 本文建议用途 |
|---|---|---|---|
| 工作区分组 | Session,会话 | Session,会话 | 一个项目 |
| 会话内部的工作页面 | Window,窗口 | Tab,标签 | 一个需求或 worktree |
| 页面中的终端区域 | Pane,面板 | Pane,面板 | Codex、Shell、测试、日志等 |
其中,tmux 的 Window 是终端内部的逻辑窗口,不是 macOS 的独立应用窗口。1
“一个项目对应一个会话”是组织建议,不是工具强制规则。任务规模较大时,也可以让每个 worktree 单独对应一个会话。
3.2 与 Ghostty、Git worktree、Codex CLI 的关系¶
| 工具 | 主要职责 |
|---|---|
| Ghostty | 终端模拟器,提供显示和交互界面。10 |
| tmux / Zellij | 管理会话、窗口或标签、面板,以及终端程序的组织与连接。1 6 |
| Git worktree | 为同一个 Git 仓库提供多个工作目录,便于同时检出和处理不同分支。11 |
| Codex CLI | 在终端中读取、修改代码和运行开发工具的编程智能体。12 |
推荐把“物理代码目录”和“终端组织层级”分开理解:
Ghostty 中的一个终端界面
└── 连接到会话:ecommerce
├── 标签 / 窗口:feature-login
│ ├── 面板:Codex CLI
│ ├── 面板:Shell
│ └── 面板:测试
└── 标签 / 窗口:fix-payment
├── 面板:Codex CLI
└── 面板:Shell
代码目录(通过 Git worktree 另行管理)
├── ecommerce-main/
├── ecommerce-login/
└── ecommerce-payment/
给标签起名为 feature-login,不等于创建 worktree 或自动切换目录。 仍需让对应面板进入正确的工作目录,或在后续布局配置中明确设置目录。6 11
4. tmux:以命令和前缀快捷键管理终端¶
tmux 既能通过快捷键交互操作,也能通过命令和脚本管理会话、窗口与面板。1
4.1 基本会话命令¶
下面这些命令在普通终端 Shell 中执行。先任选一种方式创建或连接会话,不需要把整段逐行连续执行。1
# 创建一个名为 project-a 的新会话并进入
# 如果同名会话已经存在,改用下面的连接命令
tmux new -s project-a
# 查看已有会话
tmux ls
# 连接已有会话
tmux attach -t project-a
# 存在就连接,不存在就创建
tmux new -A -s project-a
从当前会话暂时离开,使用 Detach(分离):按下 Ctrl+b,松开,再按 d。这会返回外层 Shell,而不是结束会话内的程序。1
4.2 常用快捷键¶
以下按 tmux 默认键位整理。Ctrl+b → c 表示先按 Ctrl+b,松开后再按 c,不是同时按三个键。1
| 操作 | 默认快捷键 |
|---|---|
| 新建窗口 | Ctrl+b → c |
| 重命名当前窗口 | Ctrl+b → , |
| 下一个 / 上一个窗口 | Ctrl+b → n / Ctrl+b → p |
| 左右分屏 | Ctrl+b → % |
| 上下分屏 | Ctrl+b → " |
| 切换到相邻面板 | Ctrl+b → 方向键 |
| 放大当前面板 / 恢复布局 | Ctrl+b → z |
| 打开会话选择树 | Ctrl+b → s |
| 打开窗口选择树 | Ctrl+b → w |
| 分离当前连接 | Ctrl+b → d |
| 查看快捷键帮助 | Ctrl+b → ? |
对于“标签太多、难以查找”的问题,Ctrl+b → s 和 Ctrl+b → w 比单纯增加分屏更重要:它们提供会话、窗口的树形选择入口。1
4.3 一个工作页面的示例¶
当前会话:project-a
当前窗口:feature-login
┌───────────────────────┬───────────────────────┐
│ Codex CLI │ Shell / Git 检查 │
│ │ │
├───────────────────────┴───────────────────────┤
│ 测试 / 开发服务 / 日志 │
└───────────────────────────────────────────────┘
这是布局示意,不是执行上面的创建命令后会自动出现的配置。需要自行分屏、进入目录并启动程序。
5. Zellij:以标签、模式和布局组织终端工作区¶
Zellij 提供终端工作区、布局和插件机制;快捷键按模式组织,可以自定义。对初学者,建议先按当前界面的操作提示使用,再逐步记忆键位。3 9
不要把某张截图中的按键提示理解成所有版本都通用的快捷键。 界面提示、键位预设和自定义配置可能不同。5
5.1 基本会话命令¶
以下命令在普通终端 Shell 中执行,按当前需要选择一条。4
# 创建或连接名为 project-a 的会话
zellij attach --create project-a
# 列出会话;也可能显示可恢复的已退出会话
zellij list-sessions
# 连接指定会话
zellij attach project-a
如果连接的是已退出、但有恢复数据的会话,Zellij 可能进入“会话重建”,而不是连接原来的运行进程。7
5.2 在会话中管理标签和分屏¶
下面的命令在 Zellij 会话内的 Shell 面板中执行,不要输入到 Codex 的对话框。日常操作也可以使用界面提示对应的快捷键。6
# 新建名为 feature-login 的标签
zellij action new-tab --name feature-login
# 在当前面板右侧新增面板,形成左右分屏
zellij action new-pane --direction right
# 在当前面板下方新增面板,形成上下分屏
zellij action new-pane --direction down
# 重命名当前标签
zellij action rename-tab feature-login
# 分离当前连接,让会话继续在后台运行
zellij action detach
这些也是独立的操作示例,不要求连续执行全部命令。执行新建标签或面板后,注意当前焦点已经可能改变。6
5.3 键位和配置以本机为准¶
可以查看本机版本及其默认配置;下面的配置命令只输出文本,不会覆盖现有配置文件。4
zellij --version
zellij setup --dump-config
开始阶段,先掌握“新建标签、分屏、重命名、切换会话、Detach”即可。固定布局和插件可以放到第二阶段学习。
6. tmux 与 Zellij 怎么选?¶
下表侧重操作方式,不对稳定性、性能或插件数量做没有统一测试依据的星级排名。1 3 7
| 比较项 | tmux | Zellij |
|---|---|---|
| 基本层级 | Session → Window → Pane | Session → Tab → Pane |
| 交互方式 | 前缀快捷键、命令提示符、Shell 命令 | 模式化键位、界面操作、Shell 命令 |
| 查找工作区 | 会话与窗口选择树 | 内置会话管理器 |
| 布局组织 | 通过布局命令和脚本组织窗口与面板 | 通过布局文件组织标签与面板 |
| 临时断开与重连 | 支持 Detach / Attach | 支持 Detach / Attach |
| 退出后的恢复 | 不应将普通 Attach 当作跨重启恢复 | 内置会话重建,但不是恢复原进程内存 |
针对 Ghostty + Codex CLI + 多项目 / 多 worktree 的使用场景,建议先试 Zellij。 这是基于希望降低标签管理和入门操作负担的取舍,不是认定它在所有方面都优于 tmux。
已经习惯 tmux 的前缀键、希望用脚本精确控制终端,或工作环境已有 tmux 配置时,继续使用 tmux 同样合理。
起步阶段选择一种即可,不必同时叠加 tmux 和 Zellij。
7. 适合多 worktree 的组织方案¶
7.1 优先方案:项目对应会话,worktree 对应标签¶
会话:ecommerce
├── 标签 / 窗口:main
├── 标签 / 窗口:feature-login
│ ├── Codex
│ ├── Shell
│ └── Tests
└── 标签 / 窗口:fix-payment
├── Codex
└── Shell
会话:backend-api
├── 标签 / 窗口:main
└── 标签 / 窗口:refactor-auth
├── Codex
├── Shell
└── Tests
命名建议采用“会话写项目名,标签写任务名,面板写用途”。避免所有标签都叫 zsh、codex 或 terminal,也不要在每一层重复完整项目名。
任务非常多、需要独立开关整个任务环境时,可以改成“每个 worktree 一个会话”,例如 ecommerce-login、ecommerce-payment。两种方式都只是工作约定。
7.2 让同一任务的面板进入同一个 worktree¶
假设已经存在登录功能对应的 worktree:~/code/ecommerce-login。
在 Codex 面板中执行:12
cd "$HOME/code/ecommerce-login" && codex
另开一个 Shell 面板,明确进入相同目录,再检查代码状态:11
cd "$HOME/code/ecommerce-login" && git status
测试或开发服务面板同样先进入该目录,再运行项目实际使用的命令。服务端口、数据库等共享资源需要另行规划,worktree 不是容器,也不是完整的运行环境隔离机制。11
即使标签名称正确,也建议启动任务前核对当前路径与分支。不要仅凭标签名判断 Codex 将修改哪个目录。
7.3 保持 Ghostty 外层简单¶
建议先保留少量 Ghostty 窗口或标签,把项目和任务的日常切换交给 tmux / Zellij。两层标签都可以使用,但需要明确各层职责。
这套方案的最小组合是:
Ghostty
+ tmux 或 Zellij(二选一)
+ Git worktree
+ Codex CLI
提示符主题、目录搜索和额外插件不是建立这套组织方式的前提,先把会话命名与目录对应关系固定下来。
8. 使用前必须明确的边界¶
8.1 Detach 不等于 Quit,也不等于关闭面板¶
Detach 只是断开当前终端连接;退出会话、结束进程或关闭面板属于不同操作。 临时离开但希望任务继续运行时,优先使用明确的 Detach 操作。1
8.2 关闭 Ghostty 后,任务不是无条件保留¶
任务能否继续,取决于会话服务端和程序是否仍在运行,以及关闭操作和配置的行为。例如,Zellij 提供 on_force_close 设置,用来选择收到关闭信号时执行分离还是退出。1
建议先用一个无关紧要的测试会话确认本机行为,再依赖它保留长时间运行的任务。
8.3 跨重启恢复布局,不等于恢复原进程¶
正在运行的会话可以重新连接;机器重启后,原进程已经结束。Zellij 的会话重建可恢复标签、面板和记录下来的命令,并通过确认后重新运行命令,但不是让进程从原内存状态继续执行。1
对于 Codex 等应用,应用自身的历史记录、任务恢复机制与终端布局恢复也是两件事。不要把“界面重新出现”当成“原任务仍在执行”。
8.4 SSH 任务要在远程机器的复用器里运行¶
要保护远程任务,应先 SSH 到远程机器,再在那里启动 tmux 或 Zellij,并在其面板内运行任务。只在本地复用器中打开 SSH 客户端,并不会把远端程序自动纳入远程持久会话。1
8.5 分层工作区不等于原生二级标签或固定侧边栏¶
本文的“项目 → 任务 → 程序”是对会话、窗口或标签、面板的组织方式,并不表示 Ghostty 会出现两排原生标签。1 10
tmux 的树形选择界面和 Zellij 的会话管理器可以辅助切换;它们不能直接等同于始终固定在左侧的项目目录树。具体的侧边栏、文件浏览与布局需求,需要单独选择配置或插件方案。1 7
9. 核心结论与参考资料¶
先解决分类,再增加工具:项目用会话分组,需求或 worktree 用窗口 / 标签区分,同一任务中的程序用面板并排展示。
对当前工作流,可以先从 Zellij 的一个项目会话开始;熟悉创建、切换和分离后,再考虑可复用布局和自动化启动脚本。
以下为本文所用的官方文档,核对日期为 2026-10-13。在线文档可能包含比本机版本更新的功能,实际使用以已安装版本的帮助信息和配置为准。
| 编号 | 资料 |
|---|---|
| 1 | tmux 官方入门指南 |
| 2 | tmux 官方手册(OpenBSD) |
| 3 | Zellij 官方用户指南 |
| 4 | Zellij 会话命令与配置输出 |
| 5 | Zellij 快捷键配置 |
| 6 | Zellij CLI Actions |
| 7 | Zellij 会话重建与恢复限制 |
| 8 | Zellij 命令行配置选项 |
| 9 | Zellij 布局 |
| 10 | Ghostty 官方文档 |
| 11 | Git worktree 官方文档 |
| 12 | Codex CLI 官方文档 |