12k
All articles

AI时代的tmux开发者指南

面向AI编码代理的 tmux 指南:会话、窗格、最小配置、tmux-resurrect,以及何时在 SSH 工作流中优于 Zellij 或 Warp。

OpenReplay Team
OpenReplay Team
AI时代的tmux开发者指南

tmux是一款终端复用器:它在你的机器上运行一个持久化的服务器进程,使会话(session)、窗口(window)和面板(pane)在终端断开连接后依然存活——你可以从会话中分离,合上笔记本,从另一台机器SSH连接回来,重新附着到会话后,每个进程都会原封不动地等着你。正是这一特性,使得tmux在今天比十年前更加重要:开发者越来越多地运行长期驻留的进程——开发服务器、构建监视器,以及像Claude Codeaider这样的自主AI编程智能体——这些进程需要在不稳定的SSH连接或合上的笔记本盖子之后继续运行。

本指南首先建立核心心智模型(会话、窗口、面板、前缀键),提供一份粘贴一次就无需再改的最简配置,然后重点讲解其他tmux指南从未涉及的部分:将tmux作为AI编程智能体的持久化宿主。最后,本文将客观比较何时应该选择tmux,何时选择ZellijWarp这类现代终端才是更好的方案。

核心要点

  • tmux能够在SSH断开后继续存活,原因在于tmux服务器进程独立于任何客户端连接运行;你的终端只是一个观察会话的视图,无论你是否附着,会话都会持续运行。
  • 一份最简tmux配置只需要四样东西:重映射前缀键(Ctrl+a)、鼠标支持(set -g mouse on)、vi复制模式,以及直观的分割绑定——其余都是外观装饰。
  • tmux是运行长期AI编程智能体的天然宿主:分离一个Claude Code或aider会话,之后在任意机器上用tmux attach -t agent重新附着,智能体的进程和完整输出历史都会在那里等你。
  • tmux-resurrect可自动恢复会话布局(窗口、面板、工作目录);恢复正在运行的程序需要通过白名单显式启用,tmux-continuum则默认每15分钟自动保存一次。
  • 如果你只在本地工作,从不SSH到远程机器,也不运行长期驻留的进程,那么现代终端能以更好的默认配置提供复用功能,且无需学习前缀键。

tmux是什么,它解决了什么问题

tmux是一款终端复用器,让一个终端窗口能够承载多个持久化的会话、窗口和面板。其持久性背后的机制是客户端-服务器架构:当你运行tmux时,它会启动一个长期运行的服务器进程来管理你的会话,而你的终端则作为客户端连接到该服务器。当你的SSH连接断开时,tmux会话不会中断——因为服务器进程独立于任何客户端连接运行。你的终端只是一个视图;无论你是否附着,会话都会持续运行。

tmux同时解决了两个问题。第一是持久性:一个耗时40分钟的构建任务、一个开发服务器,或者一个正在执行任务的AI智能体,在你的ssh会话断开后都会继续运行。你重新连接后再附着回来即可。第二是布局管理:无需在多个终端标签页之间来回切换,你可以将一个窗口分割成多个面板——左边是编辑器,右边是服务器日志,底部是一个Shell——所有内容一目了然,布局可随时复现。

tmux由Nicholas Marriott于2007年创建,是GNU screen的ISC许可证替代品。本指南中的示例使用tmux 3.6b。通过包管理器安装:

# macOS
brew install tmux

# Debian / Ubuntu / WSL
sudo apt install tmux

# Fedora / RHEL
sudo dnf install tmux

tmux -V   # 确认版本

会话、窗口与面板的层级结构

tmux将工作组织为三个层级:**会话(session)**是一个具名的持久化工作区(通常每个项目对应一个);**窗口(window)**是会话内的标签页;**面板(pane)**是窗口内的分割区域。前缀键——默认为Ctrl+b,通常重映射为Ctrl+a——是所有tmux命令的入口。你按下前缀键,松开,再按命令键。

最直观的类比是你已经熟悉的编辑器:会话相当于一个项目的完整编辑器窗口,窗口相当于其中的标签页,面板相当于标签页内的分割视图。你可能有一个frontend会话和一个backend会话;在backend内,一个窗口用于应用,一个窗口用于数据库;在应用窗口内,一个面板运行服务器,另一个用于临时命令。

层级含义生命周期
会话(Session)具名工作区,通常每个项目一个持续存在,直到被终止或机器重启
窗口(Window)会话内的标签页随会话存在
面板(Pane)窗口内的分割区域随窗口存在

由于所有命令都需要通过前缀键触发,以下所有快捷键均假设你先按下前缀键。默认前缀键为Ctrl+b;下一节的配置将其重映射为Ctrl+a,按起来更顺手。

核心命令集

以下命令涵盖了日常tmux使用的90%:创建和命名会话、分离与重新附着、分割和导航面板,以及向上滚动查看历史输出。会话级别的命令在Shell中执行;面板和窗口命令则在tmux内通过前缀键执行。

在Shell中进行会话管理:

tmux new -s project       # 创建一个具名会话
tmux ls                   # 列出正在运行的会话
tmux attach -t project    # 重新附着到某个会话
tmux kill-session -t project

在会话内部,使用前缀键(此处显示为重映射后的Ctrl+a):

  • prefix d — 分离;会话在后台继续运行。
  • prefix c — 创建新窗口。
  • prefix n / prefix p — 切换到下一个/上一个窗口。
  • prefix % — 垂直分割当前面板(左/右)。
  • prefix " — 水平分割(上/下)。
  • prefix + 方向键 — 在面板之间移动。
  • prefix z — 将当前面板放大到全屏;再次按下恢复。
  • prefix [ — 进入复制模式以滚动和搜索;在vi模式下,/用于搜索,n/N在匹配项之间跳转,q退出。

分离/重新附着的循环是核心工作流:用prefix d分离,切换到另一台机器,用tmux attach -t project-name重新附着,从上次离开的地方继续。完整的快捷键参考,可查阅tmux速查表——没必要把整个man手册都背下来。

一份粘贴一次就够用的最简~/.tmux.conf

一份最简tmux配置只需要四样东西:重映射前缀键(Ctrl+aCtrl+b更符合人体工程学)、鼠标支持(set -g mouse on)、vi复制模式,以及直观的分割绑定——其余都是外观装饰,可以等之后再加。以下是完整配置,每一行都附有注释说明其存在的原因。将其粘贴到~/.tmux.conf,然后用tmux source-file ~/.tmux.conf重新加载。

# --- 前缀键 -------------------------------------------------
unbind C-b                 # 取消默认前缀键
set -g prefix C-a          # Ctrl+a 更靠近主键区
bind C-a send-prefix       # 连按两次 Ctrl+a 可发送字面量 Ctrl+a

# --- 可用性 -------------------------------------------------
set -g mouse on            # 点击面板、拖动边框、原生滚动
set -g history-limit 10000 # 保留比默认2000更多的滚动历史
set -g base-index 1        # 窗口从1开始编号,而非0
setw -g pane-base-index 1  # 面板也从1开始编号

# --- 复制模式 -----------------------------------------------
setw -g mode-keys vi       # 复制模式中使用vi键位
bind v copy-mode           # prefix v 快速进入复制模式

# --- 更直观的分割 -------------------------------------------
bind | split-window -h -c "#{pane_current_path}"  # | 左右分割
bind - split-window -v -c "#{pane_current_path}"  # - 上下分割
# 两者都在当前面板的目录中打开

# --- 重新加载 -----------------------------------------------
bind r source-file ~/.tmux.conf \; display "reloaded"

关于语法和版本的几点说明。set -g mouse ontmux 2.1及以后版本正确的单选项写法;tmux 2.1(2015年)将四个旧选项(mode-mousemouse-select-panemouse-resize-panemouse-select-window)合并为一个。如果你看到旧配置中使用mode-mouse on,这就是原因。-c "#{pane_current_path}"标志使新分割继承当前目录——这个小细节一旦缺失,你会立刻感受到不便。

这就是完整的配置。第一天先别急着添加状态栏主题。如果之后确实想要,Catppuccin tmux插件(当前标签v2.3.0)需要tmux 3.2+,其README建议通过手动克隆而非插件管理器安装,以避免命名冲突。

现代工作流:将tmux作为AI编程智能体的宿主

tmux是运行长期AI编程智能体的天然宿主。在合上笔记本前分离Claude Code或aider会话,之后在任意机器上用tmux attach -t agent重新附着,智能体的进程及其完整输出历史都会在那里等你。Claude Codeaider都是终端CLI工具,因此这并非什么特殊集成:这是任何在tmux会话中运行的前台进程的标准行为,只是被应用到了一个可以无人值守运行数分钟的工具上。

智能体编程会话正是tmux被设计来保护的那类工作负载。一个正在重构大型代码库或运行长时间测试循环的智能体,是你绝不希望与SSH连接生命周期绑定在一起的进程。在tmux内启动它,它就能在连接断开后继续存活。

在工作的同时监控智能体

最实用的布局是将智能体放在一个面板,编辑器放在另一个面板,并排显示。创建一个会话,分割它,在一侧运行智能体:

tmux new -s agent
# 在会话内部:
#   prefix |   -> 左右分割
#   左侧面板:  claude   (或:aider)
#   右侧面板:  nvim .

你可以在左侧观察智能体的推理过程和差异对比,同时在右侧审查或编辑代码,全部在一个窗口内,全部在断开连接后继续存活。

使用同步面板监督多个智能体

当你并行运行多个智能体时——例如在不同分支上执行相同任务——同步面板可以让你统一操控它们。启用setw -g synchronize-panes on后,你输入的每一个按键都会同时发送到窗口中的所有面板,适用于向多个智能体会话发出相同提示,或同时重置一组并行进程。当你只想与单个面板交互时,用同样的方式关闭它(synchronize-panes off)。我们在使用同步面板时遇到的一个常见问题是忘记同步仍然开启,结果将一条破坏性命令广播到了每个面板——建议将其绑定到一个带有可见状态指示器的快捷键,使其状态始终清晰可见。

脚本化的智能体布局

要获得一个可复现的三面板监督布局——左侧是智能体,右上是编辑器,右下是日志——无需任何额外依赖,只需将以下脚本放入~/bin/tmux-agent.sh

#!/usr/bin/env bash
set -euo pipefail
SESSION="agent"

# 第一个面板:智能体(左侧)。-d 以分离状态创建会话。
tmux new-session -d -s "$SESSION" -x "$(tput cols)" -y "$(tput lines)"
tmux send-keys -t "$SESSION" "claude" C-m          # 智能体,左侧

# 向右分割出编辑器面板;新面板成为活动面板。
tmux split-window -h -t "$SESSION"
tmux send-keys -t "$SESSION" "nvim ." C-m          # 编辑器,右上

# 分割右侧面板用于日志;新面板成为活动面板。
tmux split-window -v -t "$SESSION"
tmux send-keys -t "$SESSION" "tail -f dev.log" C-m # 日志,右下

# 聚焦到智能体面板并附着。使用方向定位(-L)而非硬编码面板索引,
# 无论 base-index 如何设置都能保持正确。
tmux select-pane -t "$SESSION" -L
tmux attach -t "$SESSION"

执行一次chmod +x ~/bin/tmux-agent.sh,之后每次开始工作时运行tmux-agent.sh即可。分离后智能体继续运行;可从任何地方重新附着。

持久化与插件

tmux会话能在断开连接后存活,但无法在机器重启后自动恢复——为此你需要能够序列化和恢复状态的插件。标准组合是Tmux插件管理器(TPM)加上tmux-resurrecttmux-continuum。安装TPM:

git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

然后将插件配置行添加到~/.tmux.conf底部,并按prefix + I安装:

set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
run '~/.tmux/plugins/tpm/tpm'   # 保持此行在最后

理解每个插件的实际作用至关重要。tmux-resurrect会自动保存和恢复你的会话布局——包括窗口、面板和工作目录。恢复正在运行的程序是可选功能,且仅限于配置白名单中的程序(@resurrect-processes),编辑器会话通过@resurrect-strategy-vim/nvim处理,面板文本内容仅在设置@resurrect-capture-pane-contents 'on'时才会保留。不要假设你的智能体会在恢复时自动重启——除非你已将其加入白名单,否则它不会。

tmux-continuum默认每15分钟自动保存一次(可通过@continuum-save-interval配置),仅在启用@continuum-restore 'on'时才会在tmux服务器启动时自动恢复。两者结合意味着重启后你只需重新加载布局,而不必从头重建一切。

使用tmuxp进行声明式布局管理

对于需要反复启动的布局,可以用tmuxp(仓库:tmux-python/tmuxp)或基于Ruby的Tmuxinator通过YAML一次性定义。tmuxp从XDG目录~/.config/tmuxp/读取配置(旧路径~/.tmuxp/仍然有效)。以下是上述智能体监督布局的~/.config/tmuxp/agent.yaml

session_name: agent
windows:
  - window_name: supervise
    layout: main-vertical
    shell_command_before:
      - cd ~/code/project
    panes:
      - claude
      - nvim .
      - tail -f dev.log

tmuxp load agent加载。这里的键——session_namewindowswindow_namelayoutshell_command_beforepanes——在tmuxp 1.70.x中均为当前有效配置。这是上述bash脚本的声明式等价方案:一条命令,每次都是相同的可复现布局。

何时不该使用tmux

如果你只在本地工作,从不SSH到远程机器,也不运行长期驻留的后台进程,那么Zellij或Warp这类现代终端能以更好的默认配置提供复用功能,且无需学习前缀键;tmux的优势具体体现在其服务器端持久性以及通过SSH进行脚本化操作的能力上。如果你的终端原生标签页就能满足需求,强行使用tmux只会增加不必要的复杂性。

需求tmuxZellijWarp原生标签页
SSH会话持久化
脚本化布局是(bash/tmuxp)是(layouts)有限
学习曲线前缀键模型模式化,易于发现GUI原生
插件生态庞大,成熟持续增长内置功能
AI集成可承载任意CLI智能体可承载任意CLI智能体AI原生建议取决于终端
平台支持macOS、Linux、WSLmacOS、LinuxmacOS、Linux、Windows取决于操作系统

几点重要说明。Zellij是一款基于Rust的终端复用器,采用模式化系统而非单一前缀键,内置会话持久化和序列化功能,并提供可选的tmux风格前缀键预设;它仍在积极开发中,目前尚未发布1.0版本。Warp是一款跨平台终端——支持macOS、Linux和Windows——内置AI命令建议,其客户端于2026年4月以MIT + AGPL v3协议开源,因此它在Linux上也是可行的选择,并非仅限于macOS。当你需要SSH到远程机器、运行长期驻留的进程(构建监视器、开发服务器、AI智能体),或者需要脚本化的可复现布局时,选择tmux。当你希望以更少的繁琐配置获得这些功能,且不需要tmux的脚本深度或插件广度时,选择现代终端。

结语

tmux能在以智能体为核心的工作流中占有一席之地,原因与多年前它在SSH场景中站稳脚跟的原因相同:它将运行中的进程与观察它的终端解耦。下次运行长时间的智能体任务时,在tmux new -s agent内启动它,离开时分离,从任何地方重新附着——工作会在没有你的情况下继续进行。粘贴上面的最简配置,当重启开始让你丢失布局时再添加tmux-resurrect,并将智能体布局脚本化一次,从此无需手动重建。

常见问题

当tmux服务器被终止或机器重启时,在tmux中运行的进程会发生什么?

进程会被终止。tmux的持久性只能防止客户端断开连接,而无法应对服务器关闭的情况,因此用tmux kill-server终止服务器或重启机器会结束所有正在运行的进程,并丢弃所有会话。要在重启后存活,你需要tmux-resurrect来保存布局,以及tmux-continuum在服务器启动时恢复布局,但即便如此,恢复的是布局而非正在运行的程序,除非你通过resurrect-processes选项将特定进程加入白名单。

tmux窗口和面板有什么区别?

窗口是会话内的全屏标签页,面板是单个窗口内的分割区域。切换窗口会用prefix n或prefix p将整个屏幕替换为另一个标签页,而面板则将一个可见窗口划分为并排或堆叠的区域,通过prefix加方向键导航。使用窗口来分隔不同的任务,例如应用和数据库;使用面板来同时查看相关进程,例如编辑器旁边的实时日志。

我需要将前缀键从Ctrl+b重映射到Ctrl+a吗?

不需要,重映射是可选的,纯粹是人体工程学的考量。默认前缀键Ctrl+b无需任何配置即可用于所有tmux命令。许多用户将其重映射为Ctrl+a,因为这两个键在键盘上距离更近,但这会与GNU screen中的相同绑定以及将光标移到行首的readline快捷键产生冲突。如果你重映射为Ctrl+a,请添加bind C-a send-prefix,这样连按两次仍然可以向Shell发送字面量Ctrl+a。

在SSH上运行编程智能体时,应该选择tmux还是Zellij?

两者都可以,因为它们都在远程主机上运行服务器,使会话在断开连接后继续存活,因此选择取决于默认配置和生态系统。当你需要庞大成熟的插件生态、通过bash或tmuxp进行深度脚本化,以及大多数服务器上已预装的键位绑定时,选择tmux。当你更喜欢可发现的模式化控制而非前缀键模型,并希望无需配置插件即可获得会话序列化功能时,选择Zellij。Zellij目前仍处于1.0之前的版本,因此对于长期运行的环境,tmux是更为稳妥的选择。

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — self-hosted, with full data ownership.

Star on GitHub

We use cookies to improve your experience. By using our site, you accept cookies.