8027 字
40 分钟

Tmux 终端复用器完全指南:从安装到自定义配置 | 2026 最新实践

你有没有遇到过这些场景:

  • SSH 连着服务器跑训练任务,网络一断——任务没了,输出日志没了,一切从头开始
  • 同时需要看日志、改代码、跑命令,开了 5 个终端窗口,Alt+Tab 切到眼花
  • 想让同事看看你在终端里的操作,只能截图或者开视频共享屏幕

Tmux 一次性解决这三个问题。它是 Linux 服务器管理的必备工具——和 SSH 一样基础,但大多数人从未用过。

本文从零开始,系统讲解 Tmux 的完整知识体系:

  • Tmux 核心概念与安装
  • 会话/窗口/窗格三级管理
  • 复制模式(鼠标选择与复制粘贴)
  • 自定义配置 .tmux.conf(从配色到快捷键)
  • 插件管理 TPM 与推荐插件
  • Tmux + SSH 工作流
  • 自动化脚本与高级技巧
  • 常见问题排查与最佳实践

1. Tmux 是什么#

1.1 核心概念#

Tmux(Terminal Multiplexer)是终端复用器,三个核心能力:

能力没有 Tmux有 Tmux
会话保持SSH 断开 → 任务中断SSH 断开 → 任务继续,重连后恢复
窗口管理开 N 个终端窗口一个终端内管理多个窗口和窗格
会话共享无法协作多人同时连接同一会话

1.2 Tmux vs Screen#

Screen 是更早的终端复用器,Tmux 是其现代替代品:

特性TmuxScreen
窗格分割✅ 水平+垂直❌ 仅窗口
状态栏✅ 原生可定制基础
复制模式✅ vi/emacs基础
配置语法直观古老
插件生态✅ TPM + 丰富插件几乎没有
鼠标支持✅ 完整有限
活跃维护✅ 活跃维护模式

💡 结论:新用户直接学 Tmux。Screen 仅在极老服务器(CentOS 6 等)上作为替代。

1.3 Tmux 三级结构#

理解 Tmux 的关键在于掌握其三级结构:

Tmux Server(服务端)
├── Session 1(会话:一个独立的工作环境)
│ ├── Window 1(窗口:类似浏览器标签页)
│ │ ├── Pane 1(窗格:窗口内的分割区域)
│ │ └── Pane 2
│ └── Window 2
│ └── Pane 1
└── Session 2
└── Window 1
└── Pane 1
  • Session(会话):最顶层,一个会话包含多个窗口。SSH 断开时会话保持
  • Window(窗口):类似浏览器的标签页,一个窗口占满整个终端区域
  • Pane(窗格):窗口内的分割区域,多个窗格共享一个窗口

2. 安装 Tmux#

2.1 各平台安装#

Terminal window
# Ubuntu / Debian
sudo apt update && sudo apt install tmux
# CentOS / RHEL / Fedora
sudo yum install tmux # CentOS 7
sudo dnf install tmux # Fedora / CentOS 8+
# macOS(推荐 Homebrew)
brew install tmux
# Arch Linux
sudo pacman -S tmux
# Windows(通过 WSL)
# 先安装 WSL,然后在 WSL 内安装 tmux
wsl --install -d Ubuntu
# 进入 WSL 后:
sudo apt install tmux

2.2 验证安装#

Terminal window
# 检查版本(建议 3.2+)
tmux -V
# tmux 3.4
# 查看帮助
tmux list-commands | head -20

💡 版本建议:Tmux 3.2+ 支持大部分常用功能,3.3+ 增加了更好的鼠标支持和弹窗功能,3.4 是当前最新稳定版。

2.3 从源码编译(需要最新版时)#

Terminal window
# 安装依赖
sudo apt install build-essential libevent-dev libncurses-dev
# 下载源码
git clone https://github.com/tmux/tmux.git
cd tmux
# 编译安装
sh autogen.sh
./configure
make -j$(nproc)
sudo make install
# 验证
/usr/local/bin/tmux -V

3. 会话管理#

会话是 Tmux 的最顶层单位。每个会话是一个独立的工作环境。

3.1 创建会话#

Terminal window
# 创建匿名会话(自动命名为 0, 1, 2...)
tmux
# 创建命名会话(推荐!方便管理)
tmux new -s myproject
# 创建会话并指定窗口名
tmux new -s deploy -n staging
# 在后台创建会话(不进入)
tmux new -s background -d

💡 始终使用命名会话tmux new -s myprojecttmux 好得多。名字让你一眼知道每个会话在做什么,避免 10 个会话都是 0/1/2/3 分不清。

3.2 分离与恢复#

Terminal window
# 分离会话(不关闭,后台运行)
# 方法一:前缀键 + d
# Ctrl+B 然后按 d
# 方法二:命令行
tmux detach
# 查看所有会话
tmux ls
# myproject: 2 windows (created Sat Jul 4 10:00:00 2026) (attached)
# deploy: 1 windows (created Sat Jul 4 11:30:00 2026)
# 恢复(连接)最近的会话
tmux attach
# 或简写:
tmux a
# 恢复指定会话
tmux attach -t myproject
tmux a -t deploy
# 如果会话已被其他客户端连接,强制分离后恢复
tmux attach -d -t myproject
# 恢复会话并切换到指定窗口
tmux attach -t myproject:2

3.3 会话操作#

Terminal window
# 在 Tmux 内部执行命令(前缀键 + : 然后输入命令)
# Ctrl+B 然后按 : 然后输入:
new-session -s newsession # 创建新会话
rename-session newname # 重命名当前会话
kill-session -t oldsession # 关闭指定会话
# 从命令行操作
# 重命名会话
tmux rename-session -t oldname newname
# 关闭指定会话
tmux kill-session -t deploy
# 关闭所有会话
tmux kill-server
# 切换会话(前缀键 + s 显示会话列表)
# Ctrl+B 然后按 s
# 使用上下键选择,回车切换

3.4 会话快捷键速查#

所有快捷键都需要先按前缀键(默认 Ctrl+B):

快捷键功能助记
d分离当前会话detach
s列出所有会话并切换sessions
$重命名当前会话-
(切换到上一个会话-
)切换到下一个会话-
L切换到上一个使用的会话Last
:进入命令模式-

3.5 实用会话管理脚本#

Terminal window
# 在 ~/.bashrc 或 ~/.zshrc 中添加别名
alias tn='tmux new -s' # tn myproject
alias ta='tmux attach -t' # ta myproject
alias tl='tmux ls' # tl
alias tk='tmux kill-session -t' # tk myproject
# 使用效果:
tn deploy # 创建名为 deploy 的会话
# ...工作...
# Ctrl+B d 分离
ta deploy # 恢复 deploy 会话
tl # 查看所有会话
tk deploy # 关闭 deploy 会话

4. 窗口管理#

窗口类似浏览器的标签页,一个会话可以包含多个窗口。

4.1 创建与切换窗口#

Terminal window
# 创建新窗口
# Ctrl+B 然后按 c
# 创建窗口并命名
# Ctrl+B 然后按 , (逗号)修改当前窗口名
# 切换到下一个窗口
# Ctrl+B 然后按 n
# 切换到上一个窗口
# Ctrl+B 然后按 p
# 按编号切换窗口
# Ctrl+B 然后按 0/1/2/3...
# 列出所有窗口并选择
# Ctrl+B 然后按 w

4.2 窗口操作#

Terminal window
# 重命名当前窗口
# Ctrl+B 然后按 ,
# 关闭当前窗口
# Ctrl+B 然后按 & (确认后关闭)
# 从命令行创建窗口到指定会话
tmux new-window -t myproject -n logs
# 从命令行切换窗口
tmux select-window -t myproject:2
# 从命令行关闭窗口
tmux kill-window -t myproject:2

4.3 窗口快捷键速查#

快捷键功能助记
c创建新窗口create
n下一个窗口next
p上一个窗口previous
0-9按编号切换-
w窗口列表选择windows
,重命名窗口-
&关闭窗口-
f按名称查找窗口find
.修改窗口编号-

4.4 窗口布局示例#

一个典型的开发会话窗口布局:

会话:myproject
├── 窗口 0: editor ← Vim 编辑代码
├── 窗口 1: server ← 运行开发服务器
├── 窗口 2: logs ← tail -f 查看日志
├── 窗口 3: db ← MySQL/Redis 客户端
└── 窗口 4: git ← Git 操作

5. 窗格管理#

窗格是 Tmux 最实用的功能——在一个窗口内分割出多个区域,同时查看多个内容。

5.1 分割窗格#

Terminal window
# 水平分割(上下分割,一条水平线)
# Ctrl+B 然后按 "
# 记忆:双引号 " 在键盘上和单引号 ' 在一起,横线 ─ 是水平的
# 垂直分割(左右分割,一条垂直线)
# Ctrl+B 然后按 %
# 记忆:% 在键盘上是 Shift+5,竖线 | 是垂直的
# 等价命令行:
tmux split-window -h # 水平分割(-h = horizontal split = 左右分割)
tmux split-window -v # 垂直分割(-v = vertical split = 上下分割)
# ⚠️ 注意:Tmux 的 -h/-v 命名与直觉相反!
# -h = horizontal split = 创建水平分割线 = 左右两个窗格
# -v = vertical split = 创建垂直分割线 = 上下两个窗格

⚠️ -h/-v 的反直觉命名:Tmux 的 -h 不是”水平排列”而是”水平线分割”——即画一条横线把窗格分成上下。但实际上 split-window -h 的效果是左右分割!这是因为 -h 表示 split horizontally(沿水平方向分割),结果是左右两个窗格。如果你觉得混乱,记住:用快捷键 "% 即可,命令行参数用得少。

5.2 切换窗格#

Terminal window
# 按方向切换
# Ctrl+B 然后按 方向键 ↑↓←→
# 顺序切换(在多个窗格间循环)
# Ctrl+B 然后按 o
# 显示窗格编号,按数字切换
# Ctrl+B 然后按 q
# 窗格上会短暂显示编号(0, 1, 2, 3)
# 在编号消失前按对应数字即可切换
# 切换到上一个活动窗格
# Ctrl+B 然后按 ;

5.3 调整窗格大小#

Terminal window
# 方法一:方向键调整(需要按住前缀键不放)
# Ctrl+B(按住不放)然后按 方向键 ↑↓←→
# 每按一次方向键移动 1 格
# 方法二:命令行精确调整
tmux resize-pane -L 10 # 向左移动 10 格(L = Left)
tmux resize-pane -R 10 # 向右移动 10 格(R = Right)
tmux resize-pane -U 5 # 向上移动 5 格(U = Up)
tmux resize-pane -D 5 # 向下移动 5 格(D = Down)
# 方法三:在 .tmux.conf 中绑定快捷键(推荐)
# 见第 8 节配置部分

5.4 窗格操作#

Terminal window
# 关闭当前窗格
# Ctrl+B 然后按 x (确认后关闭)
# 将当前窗格拆分为独立窗口
# Ctrl+B 然后按 !
# 窗格变成新的窗口
# 在新窗口中打开当前窗格(保留原窗格)
# Ctrl+B 然后按 z(再按一次恢复)
# 最大化/还原当前窗格(Zen 模式)
# 交换窗格位置
# Ctrl+B 然后按 { (与上一个窗格交换)
# Ctrl+B 然后按 } (与下一个窗格交换)
# 旋转所有窗格(改变布局方向)
# Ctrl+B 然后按 Space(空格键)
# 在多种预设布局间切换

5.5 预设布局#

Tmux 内置 5 种预设布局,按 Ctrl+B 然后按 Space 循环切换:

布局说明适用场景
even-horizontal左右均分编辑器 + 终端
even-vertical上下均分日志查看
main-horizontal主窗格在上,其他在下编辑器 + 多终端
main-vertical主窗格在左,其他在右编辑器 + 终端
tiled网格平铺监控多台服务器

5.6 窗格快捷键速查#

快捷键功能助记
"上下分割-
%左右分割-
↑↓←→切换窗格-
o顺序切换-
q显示编号-
x关闭窗格-
z最大化/还原zen
!窗格→独立窗口-
{与上一个交换-
}与下一个交换-
Space切换布局-

5.7 实用窗格布局示例#

开发布局(编辑器 + 终端 + 日志):

┌──────────────────────────────────┐
│ │
│ Vim 编辑器(主窗格) │
│ │
├──────────────┬───────────────────┤
│ 终端(命令) │ 日志(tail -f) │
└──────────────┴───────────────────┘
Terminal window
# 创建布局的命令序列:
tmux new -s dev -n editor
# Ctrl+B % (左右分割)
# Ctrl+B ← (切到左边的窗格)
# Ctrl+B " (上下分割左边)
# Ctrl+B ↑ (切到上方 = 编辑器)
# Ctrl+B → (切到右边)
# Ctrl+B " (上下分割右边)
# 调整大小...

监控布局(4 窗格同时监控):

┌──────────────┬──────────────┐
│ top/htop │ df -h │
├──────────────┼──────────────┤
│ tail -f log │ netstat │
└──────────────┴──────────────┘

6. 复制模式#

复制模式让你在 Tmux 终端内选择、复制和搜索文本——无需鼠标。

6.1 进入复制模式#

Terminal window
# 进入复制模式
# Ctrl+B 然后按 [
# 进入后左上角会显示 [copy]
# 此时光标可以自由移动(vi 模式用 hjkl,emacs 模式用 Ctrl+F/B)

6.2 Vi 模式操作(推荐)#

.tmux.conf 中设置 setw -g mode-keys vi 后:

按键功能
h/j/k/l左/下/上/右移动光标
w/b向前/后跳一个单词
0/$行首/行尾
g/G顶部/底部
/向下搜索
?向上搜索
n/N下一个/上一个搜索结果
Space开始选择
Enter复制选择并退出
Esc取消选择/退出

6.3 复制与粘贴#

Terminal window
# 1. 进入复制模式:Ctrl+B [
# 2. 移动光标到起始位置
# 3. 按 Space 开始选择
# 4. 移动光标到结束位置
# 5. 按 Enter 复制
# 粘贴
# Ctrl+B 然后按 ]
# 查看复制缓冲区列表
# Ctrl+B 然后按 # (或 = 显示缓冲区列表选择)
# 从命令行操作
tmux list-buffers # 查看所有缓冲区
tmux show-buffer # 查看最新缓冲区内容
tmux save-buffer file.txt # 保存缓冲区到文件
tmux load-buffer file.txt # 从文件加载到缓冲区

6.4 集成系统剪贴板#

Tmux 默认将复制内容存在自己的缓冲区中,不自动同步到系统剪贴板。需要额外配置:

Terminal window
# macOS:使用 pbcopy/pbpaste
# 在 .tmux.conf 中添加:
set -g default-command "reattach-to-user-namespace -l ${SHELL}"
# 或使用 tmux-macos-copy 插件
# Linux:使用 xclip
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -selection clipboard"
# Linux(Wayland):使用 wl-copy
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "wl-copy"
# macOS(推荐配置):
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy"
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "pbcopy"

💡 最简方案:如果你在 macOS 上用 iTerm2,按住 Option 键可以用鼠标选择文本直接复制到系统剪贴板——绕过 Tmux 的复制模式。


7. 鼠标支持#

Tmux 3.0+ 原生支持鼠标,可以点击切换窗格、拖动调整大小、滚轮翻页。

7.1 开启鼠标支持#

Terminal window
# 临时开启(命令模式)
# Ctrl+B 然后按 : 然后输入:
set mouse on
# 永久开启(.tmux.conf)
set -g mouse on

7.2 鼠标操作#

操作功能
点击窗格切换到该窗格
拖动分割线调整窗格大小
滚轮进入复制模式翻页
右键弹出窗格菜单(Tmux 3.3+)

7.3 鼠标模式的开与关#

Terminal window
# 有时鼠标模式会干扰终端原生选择文本
# 快速切换鼠标模式:
# 在 .tmux.conf 中绑定快捷键:
bind m set -g mouse \; display-message "Mouse: #{?mouse,ON,OFF}"
# Ctrl+B 然后按 m 切换鼠标模式
# 按住 Shift 键可以绕过 Tmux 鼠标捕获
# 在大多数终端中:Shift + 鼠标拖动 = 终端原生选择

💡 Shift 键的妙用:开启鼠标模式后,按住 Shift 键再用鼠标选择文本,会绕过 Tmux 的鼠标捕获,直接使用终端的选择功能——方便快速复制不需要进入复制模式。


8. 自定义配置 .tmux.conf#

Tmux 的配置文件是 ~/.tmux.conf,所有自定义设置都在这里。

8.1 基础配置模板#

Terminal window
# ============================================
# Tmux 配置文件 - 2026 最佳实践
# ============================================
# --- 基础设置 ---
# 修改前缀键为 Ctrl+A(更顺手)
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# 启用真彩色
set -g default-terminal "tmux-256color"
set -ag terminal-overrides ",xterm-256color:RGB,*:RGB"
# 历史记录条数
set -g history-limit 50000
# 窗口编号从 1 开始(0 太远了)
set -g base-index 1
setw -g pane-base-index 1
# 窗口关闭后自动重新编号
set -g renumber-windows on
# 减少 ESC 键延迟(避免 Vim 里按 ESC 卡顿)
set -sg escape-time 0
# 启用鼠标
set -g mouse on
# Vi 模式
setw -g mode-keys vi
# --- 快捷键 ---
# 重新加载配置
bind r source-file ~/.tmux.conf \; display-message "Config reloaded!"
# 更直观的分割键
bind | split-window -h -c "#{pane_current_path}" # | 左右分割
bind - split-window -v -c "#{pane_current_path}" # - 上下分割
unbind '"'
unbind %
# 新窗口保持当前路径
bind c new-window -c "#{pane_current_path}"
# Vim 风格切换窗格
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# Vim 风格调整窗格大小(大写 HJKL)
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5
# 复制模式 Vim 风格
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy"
# --- 状态栏 ---
set -g status-position top
set -g status-interval 5
set -g status-style "bg=default,fg=white"
# 左侧:会话名
set -g status-left "#[fg=black,bold] #S "
set -g status-left-length 30
# 右侧:日期时间
set -g status-right "#[fg=white] %Y-%m-%d %H:%M "
set -g status-right-length 30
# 窗口列表样式
setw -g window-status-format " #I:#W "
setw -g window-status-current-format "#[fg=black,bold] #I:#W "

8.2 配置参数速查#

参数说明推荐值
prefix前缀键C-a
base-index窗口起始编号1
pane-base-index窗格起始编号1
history-limit历史记录行数50000
escape-timeESC 键延迟(ms)0
mouse鼠标支持on
mode-keys复制模式按键风格vi
renumber-windows自动重编号on
status-position状态栏位置topbottom
default-terminal终端类型tmux-256color

8.3 常用配置片段#

Terminal window
# === 会话持久化 ===
# 自动恢复会话(需配合 tmux-resurrect 插件)
# === 主题配色 ===
# 深色主题
set -g status-bg "#1a1b26"
set -g status-fg "#a9b1d6"
set -g pane-active-border-style "fg=#7aa2f7"
set -g pane-border-style "fg=#3b4261"
# === 日志/监控 ===
# 状态栏显示 CPU/内存(需安装 tmux-cpu 插件或自定义脚本)
set -g status-right "CPU: #{cpu_percentage} | MEM: #{ram_percentage} | %H:%M"
# === 自动启动 ===
# SSH 登录时自动连接或创建会话
# 在 ~/.bashrc 中添加:
# if [ -z "$TMUX" ]; then
# tmux attach -t default || tmux new -s default
# fi

9. 插件管理 TPM#

Tmux Plugin Manager(TPM)让你像管理 VS Code 扩展一样管理 Tmux 插件。

9.1 安装 TPM#

Terminal window
# 克隆 TPM 仓库
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
# 在 .tmux.conf 末尾添加:
set -g @plugin 'tmux-plugins/tpm'
# 推荐插件
set -g @plugin 'tmux-plugins/tmux-sensible' # 合理的默认配置
set -g @plugin 'tmux-plugins/tmux-resurrect' # 会话保存与恢复
set -g @plugin 'tmux-plugins/tmux-continuum' # 自动保存会话
set -g @plugin 'tmux-plugins/tmux-yank' # 增强复制
set -g @plugin 'tmux-plugins/tmux-pain-control' # 窗格管理增强
# 主题插件(选一个)
set -g @plugin 'catppuccin/tmux' # Catppuccin 主题
# set -g @plugin 'dracula/tmux' # Dracula 主题
# 初始化 TPM(必须在所有插件声明之后)
run '~/.tmux/plugins/tpm/tpm'
Terminal window
# 安装插件:
# 1. 保存 .tmux.conf
# 2. 在 Tmux 中按 Ctrl+B 然后按 I(大写 I = Install)
# 3. 等待安装完成后自动刷新
# 更新插件:Ctrl+B 然后按 U(大写 U = Update)
# 卸载插件:从 .tmux.conf 删除插件行,然后 Ctrl+B 然后按 Alt+u

9.2 推荐插件#

插件功能推荐度
tmux-sensible合理默认配置⭐⭐⭐⭐⭐
tmux-resurrect保存/恢复会话⭐⭐⭐⭐⭐
tmux-continuum自动保存会话⭐⭐⭐⭐⭐
tmux-yank增强系统剪贴板集成⭐⭐⭐⭐
tmux-pain-control窗格管理增强⭐⭐⭐⭐
catppuccin/tmux美观主题⭐⭐⭐⭐
tmux-fzffzf 集成(会话/窗口搜索)⭐⭐⭐⭐
tmux-floax浮动终端⭐⭐⭐

9.3 tmux-resurrect 详解#

tmux-resurrect 是最重要的插件——它能保存整个 Tmux 会话(窗口/窗格/运行程序),即使服务器重启也能恢复。

Terminal window
# 安装后配置
set -g @plugin 'tmux-plugins/tmux-resurrect'
# 保存会话:Ctrl+B 然后按 Ctrl+s
# 恢复会话:Ctrl+B 然后按 Ctrl+r
# 进阶配置:保存更多程序状态
set -g @resurrect-capture-pane-contents 'on' # 保存窗格内容
set -g @resurrect-strategy-vim 'session' # 保存 Vim 会话
set -g @resurrect-processes 'ssh psql mysql sqlite3 "~git status->git status" "~tail->tail"'
# 指定哪些程序需要恢复
# 配合 tmux-continuum 自动保存
set -g @plugin 'tmux-plugins/tmux-continuum'
set -g @continuum-restore 'on' # 启动时自动恢复
set -g @continuum-save-interval '15' # 每 15 分钟自动保存

💡 resurrect 的局限:它能恢复窗口/窗格布局和大部分程序,但无法恢复程序的运行状态(如正在运行的训练任务的内存数据)。它主要恢复的是工作环境布局。


10. Tmux + SSH 工作流#

Tmux 最大的价值在于与 SSH 配合——解决 SSH 断开后任务丢失的问题。

10.1 标准 SSH + Tmux 工作流#

Terminal window
# === 第一次工作 ===
# 1. SSH 连接服务器
ssh user@server
# 2. 创建命名会话
tmux new -s project
# 3. 在会话中工作...
# 创建窗口、分割窗格、运行任务...
# 4. 需要离开时(不要直接关终端!)
# Ctrl+B d 分离会话
# 会话在服务器后台继续运行
# 5. 可以直接关闭 SSH 连接
exit
# 服务器上的任务不受影响!
# === 恢复工作 ===
# 1. 重新 SSH 连接
ssh user@server
# 2. 恢复会话
tmux attach -t project
# 所有窗口、窗格、运行中的任务都还在!
# 3. 或者恢复最近的会话
tmux a

10.2 自动连接 Tmux#

每次 SSH 登录后手动 tmux attach 很繁琐。可以在 Shell 配置中自动化:

Terminal window
# 在远程服务器的 ~/.bashrc 或 ~/.zshrc 中添加:
# SSH 登录时自动连接或创建 Tmux 会话
if [ -z "$TMUX" ]; then
# 检查是否有现有会话
if tmux has-session -t default 2>/dev/null; then
# 有现有会话,连接它
tmux attach -t default
else
# 没有会话,创建新会话
tmux new -s default
fi
fi
# 更高级版本:让用户选择会话
if [ -z "$TMUX" ]; then
sessions=$(tmux ls 2>/dev/null | wc -l)
if [ "$sessions" -gt 0 ]; then
tmux attach
else
tmux new -s default
fi
fi

10.3 SSH + Tmux 一键连接#

Terminal window
# 在本地 ~/.bashrc 或 ~/.zshrc 中添加:
# SSH 连接并自动 attach Tmux
ssh-tmux() {
ssh -t "$@" "tmux attach -t default 2>/dev/null || tmux new -s default"
}
# 使用:
ssh-tmux user@server
ssh-tmux admin@prod-server -p 2222
# -t 参数分配伪终端(Tmux 需要)
# 或更简洁的别名
alias ssh-prod='ssh -t admin@prod.example.com "tmux a -t default || tmux new -s default"'
alias ssh-dev='ssh -t dev@dev.example.com "tmux a -t default || tmux new -s default"'

10.4 远程协作(会话共享)#

Terminal window
# 场景:你想让同事看到你的终端操作
# 方法一:共享现有会话
# 你先连接:
tmux new -s pair-programming
# 同事 SSH 连接同一服务器后:
tmux attach -t pair-programming
# 两人同时看到同一画面,都能输入!
# 方法二:只读模式(同事只能看不能操作)
tmux attach -t pair-programming -r
# -r = read-only
# 方法三:使用 tmux-fzf 快速切换
# 安装 tmux-fzf 后:
# Ctrl+B 然后按 T(大写 T)打开 fzf 选择器

⚠️ 协作安全:共享会话时,所有参与者都能执行命令。确保只与信任的人共享。如果需要只读模式,使用 -r 参数。

10.5 SSH 断开后的恢复策略#

Terminal window
# 场景:SSH 意外断开(网络问题),Tmux 会话仍在运行
# 1. 重新 SSH 连接
ssh user@server
# 2. 查看所有会话
tmux ls
# 可能会看到:
# default: 1 windows (created Sat Jul 4 10:00:00 2026) (attached)
# 注意:可能显示 (dead) 如果会话已结束
# 3. 如果有多个客户端连接(之前没分离就断开了)
tmux attach -d -t default
# -d = 先分离其他客户端再连接
# 4. 如果会话显示为 dead
tmux kill-session -t dead_session
tmux new -s default

11. 高级技巧#

11.1 命令行批量操作#

Terminal window
# 创建预设布局的会话(一键搭建工作环境)
tmux new -d -s work
tmux new-window -t work
tmux split-window -h -t work
tmux send-keys -t work:0.0 'vim' C-m
tmux send-keys -t work:0.1 'tail -f /var/log/syslog' C-m
tmux attach -t work
# C-m = 回车键

11.2 Tmux 启动脚本#

#!/bin/bash
# ~/scripts/tmux-start.sh - 一键创建开发环境
SESSION="dev"
# 如果会话已存在,直接连接
tmux has-session -t $SESSION 2>/dev/null
if [ $? -eq 0 ]; then
echo "Session $SESSION already exists. Attaching..."
tmux attach -t $SESSION
exit 0
fi
# 创建新会话
tmux new -d -s $SESSION -n editor
tmux send-keys -t $SESSION:editor 'cd ~/projects/myapp && vim' C-m
# 创建 server 窗口
tmux new-window -t $SESSION -n server
tmux send-keys -t $SESSION:server 'cd ~/projects/myapp && npm run dev' C-m
# 创建 logs 窗口
tmux new-window -t $SESSION -n logs
tmux split-window -v -t $SESSION:logs
tmux send-keys -t $SESSION:logs.0 'tail -f ~/projects/myapp/logs/app.log' C-m
tmux send-keys -t $SESSION:logs.1 'tail -f ~/projects/myapp/logs/error.log' C-m
# 创建 db 窗口
tmux new-window -t $SESSION -n db
tmux send-keys -t $SESSION:db 'mysql -u root -p myapp' C-m
# 切换到第一个窗口
tmux select-window -t $SESSION:editor
# 连接会话
tmux attach -t $SESSION
Terminal window
# 赋予执行权限
chmod +x ~/scripts/tmux-start.sh
# 使用:
~/scripts/tmux-start.sh
# 或添加到 ~/.bashrc
alias dev='~/scripts/tmux-start.sh'

11.3 弹出式终端(Tmux 3.3+)#

Terminal window
# 创建浮动窗口(弹出式终端)
# Ctrl+B 然后按 )
# 或自定义快捷键:
bind-key Tab if-shell -F '#{==:#{window_panes},1}' \
'split-window -h -f -c "#{pane_current_path}"' \
'resize-pane -Z'
# 命令行创建弹出式窗口
tmux display-popup -E "htop"
# -E = 关闭时自动退出
# 可用于快捷运行临时命令

11.4 远程会话同步操作#

Terminal window
# 使用 synchronize-panes 在多个窗格同时输入相同命令
# Ctrl+B 然后按 : 然后输入:
setw synchronize-panes on
# 现在在任何一个窗格输入的命令会同时发送到所有窗格
# 适用场景:在多台服务器上同时执行相同操作
# 在 .tmux.conf 中绑定快捷键
bind S setw synchronize-panes \; display-message "Sync: #{?pane_synchronized,ON,OFF}"
# Ctrl+B 然后按 S 切换同步模式
# 典型用法:
# 1. 创建 4 个窗格,每个 SSH 到不同服务器
# 2. 开启 synchronize-panes
# 3. 输入 sudo apt update ——4 台同时执行!
# 4. 关闭 synchronize-panes

11.5 Tmux 命令别名#

Terminal window
# 在 ~/.bashrc 或 ~/.zshrc 中添加:
# 会话管理
alias tn='tmux new -s'
alias ta='tmux attach -t'
alias tl='tmux ls'
alias tk='tmux kill-session -t'
alias tka='tmux kill-server'
# 快捷操作
alias tns='tmux new -s $(basename $PWD)' # 用当前目录名作为会话名
# 一键 attach 或 new
function tm() {
local session=${1:-default}
tmux attach -t $session 2>/dev/null || tmux new -s $session
}
# 使用:tm(创建/连接 default 会话)
# tm myproject(创建/连接 myproject 会话)

11.6 监控与通知#

Terminal window
# 窗格活动监控(有输出时状态栏高亮)
setw -g monitor-activity on
set -g visual-activity on
# 窗格内容变化铃声
setw -g monitor-bell on
# 自定义监控:命令完成后通知
# 在 .tmux.conf 中添加:
bind-key m run-shell "tmux split-window -h 'bash -c \"echo 等待命令完成...; read -p \\\"按回车关闭\\\"\"'"

12. 主题美化#

12.1 Catppuccin 主题(推荐)#

Terminal window
# 安装 Catppuccin 主题
set -g @plugin 'catppuccin/tmux'
# 选择口味(Latte/Frappé/Macchiato/Mocha)
set -g @catppuccin_flavour 'mocha' # 深色
# 自定义状态栏模块
set -g @catppuccin_window_status_style "rounded"
# 显示内容
set -g status-right-length 100
set -g status-right ""
set -g status-right "#{E:@catppuccin_status_application}"
set -ag status-right "#{E:@catppuccin_status_session}"
set -ag status-right "#{E:@catppuccin_status_uptime}"
set -ag status-right "#{E:@catppuccin_status_date_time}"

12.2 手动美化状态栏#

Terminal window
# === 简洁状态栏 ===
set -g status-position bottom
set -g status-justify centre
set -g status-interval 5
# 配色
set -g status-bg "#1e1e2e"
set -g status-fg "#cdd6f4"
# 左侧:会话名 + 窗口信息
set -g status-left-length 40
set -g status-left "#[fg=#1e1e2e,bg=#89b4fa,bold] #S #[fg=#89b4fa,bg=#1e1e2e] "
# 右侧:日期时间
set -g status-right-length 60
set -g status-right "#[fg=#a6adc8] %Y-%m-%d #[fg=#89b4fa]%H:%M "
# 当前窗口样式
setw -g window-status-current-format "#[fg=#1e1e2e,bg=#89b4fa,bold] #I:#W "
setw -g window-status-format "#[fg=#a6adc8] #I:#W "
# 窗格边框
set -g pane-border-style "fg=#313244"
set -g pane-active-border-style "fg=#89b4fa"

13. 常见问题排查#

13.1 Tmux 命令找不到#

/usr/bin/tmux
# 检查是否安装
which tmux
# 如果未安装
sudo apt install tmux # Ubuntu/Debian
brew install tmux # macOS

13.2 配置不生效#

Terminal window
# 方法一:在 Tmux 内重新加载
# Ctrl+B 然后按 : 然后输入:
source-file ~/.tmux.conf
# 方法二:绑定快捷键(推荐在 .tmux.conf 中添加)
bind r source-file ~/.tmux.conf \; display-message "Config reloaded!"
# Ctrl+B 然后按 r 重新加载
# 方法三:完全重启 Tmux
tmux kill-server
tmux new -s default
# ⚠️ 这会关闭所有现有会话!
# 检查配置文件语法
tmux -f ~/.tmux.conf -L test new -d
# 如果没有报错说明语法正确
tmux -L test kill-server

13.3 颜色显示不正确#

Terminal window
# 问题:Tmux 内颜色异常或 Vim 颜色不对
# 解决:在 .tmux.conf 中设置正确的终端类型
set -g default-terminal "tmux-256color"
set -ag terminal-overrides ",xterm-256color:RGB,*:RGB"
# 在 ~/.bashrc 中也设置
export TERM=tmux-256color
# 如果使用 Vim/Neovim,确保配置中支持真彩色
# Neovim init.lua:
vim.o.termguicolors = true
# Vim .vimrc:
set termguicolors

13.4 Vim 中 ESC 键延迟#

Terminal window
# 问题:在 Tmux 内使用 Vim 时,按 ESC 后有明显延迟
# 原因:Tmux 默认 escape-time 为 500ms
# 解决:在 .tmux.conf 中设置
set -sg escape-time 0
# 或设为很小的值
set -sg escape-time 10

13.5 复制到系统剪贴板失败#

Terminal window
# macOS:安装 reattach-to-user-namespace
brew install reattach-to-user-namespace
# 在 .tmux.conf 中:
set -g default-command "reattach-to-user-namespace -l $SHELL"
# Linux(X11):安装 xclip
sudo apt install xclip
# 在 .tmux.conf 中:
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -selection clipboard"
# Linux(Wayland):安装 wl-clipboard
sudo apt install wl-clipboard
# 在 .tmux.conf 中:
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "wl-copy"
# 或直接使用 tmux-yank 插件(自动适配)
set -g @plugin 'tmux-plugins/tmux-yank'

13.6 鼠标模式下无法选择文本#

Terminal window
# 方法一:按住 Shift 键选择(绕过 Tmux 鼠标捕获)
Shift + 鼠标拖动
# 方法二:临时关闭鼠标模式
# Ctrl+B 然后按 : 输入:
set mouse off
# 方法三:绑定快捷键切换
bind m set -g mouse \; display-message "Mouse: #{?mouse,ON,OFF}"

13.7 窗格路径问题#

Terminal window
# 问题:新窗口/窗格不在当前目录
# 解决:在 .tmux.conf 中确保使用 pane_current_path
bind c new-window -c "#{pane_current_path}"
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"

13.8 错误排查速查表#

问题原因解决方法
配置不生效未重新加载Ctrl+B rsource-file
颜色异常终端类型错误default-terminal tmux-256color
ESC 延迟escape-time 过高escape-time 0
复制失败剪贴板未集成安装 xclip/pbcopy + 配置
无法选文本鼠标模式拦截Shift + 鼠标 或 关闭鼠标
新窗格路径不对未使用 current_path绑定 -c "#{pane_current_path}"
前缀键不好按默认 Ctrl+B 太远改为 Ctrl+A
会话丢失服务器重启使用 tmux-resurrect

14. 完整配置模板#

14.1 生产级 .tmux.conf#

Terminal window
# ============================================
# Tmux 配置 - 2026 完整版
# 作者: 971918.xyz
# ============================================
# --- 基础设置 ---
unbind C-b
set -g prefix C-a
bind C-a send-prefix
set -g default-terminal "tmux-256color"
set -ag terminal-overrides ",xterm-256color:RGB,*:RGB"
set -g history-limit 50000
set -g base-index 1
setw -g pane-base-index 1
set -g renumber-windows on
set -sg escape-time 0
set -g mouse on
setw -g mode-keys vi
set -g focus-events on
# --- 快捷键 ---
bind r source-file ~/.tmux.conf \; display-message "✅ Config reloaded!"
# 窗格分割
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
# 新窗口保持路径
bind c new-window -c "#{pane_current_path}"
# Vim 风格窗格切换
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# Vim 风格调整大小
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5
# 复制模式
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy"
# 同步输入切换
bind S setw synchronize-panes \; display-message "Sync: #{?synchronize-panes,ON,OFF}"
# 鼠标切换
bind m set -g mouse \; display-message "Mouse: #{?mouse,ON,OFF}"
# --- 状态栏 ---
set -g status-position top
set -g status-interval 5
set -g status-style "bg=#1e1e2e,fg=#cdd6f4"
set -g status-left "#[fg=#1e1e2e,bg=#89b4fa,bold] #S #[default]"
set -g status-left-length 30
set -g status-right "#[fg=#a6adc8] %Y-%m-%d #[fg=#89b4fa]%H:%M "
set -g status-right-length 50
setw -g window-status-format "#[fg=#a6adc8] #I:#W "
setw -g window-status-current-format "#[fg=#1e1e2e,bg=#89b4fa,bold] #I:#W "
set -g pane-border-style "fg=#313244"
set -g pane-active-border-style "fg=#89b4fa"
# --- 监控 ---
setw -g monitor-activity on
set -g visual-activity off
# --- 插件 ---
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
set -g @plugin 'tmux-plugins/tmux-yank'
set -g @resurrect-capture-pane-contents 'on'
set -g @continuum-restore 'on'
set -g @continuum-save-interval '15'
run '~/.tmux/plugins/tpm/tpm'

15. 速查表#

15.1 命令行速查#

Terminal window
tmux # 创建匿名会话
tmux new -s name # 创建命名会话
tmux ls # 列出所有会话
tmux a # 连接最近会话
tmux a -t name # 连接指定会话
tmux a -d -t name # 分离其他客户端后连接
tmux kill-session -t name # 关闭指定会话
tmux kill-server # 关闭所有会话
tmux source ~/.tmux.conf # 重新加载配置

15.2 快捷键速查表#

会话(前缀键 + 以下按键):

按键功能
d分离会话
s切换会话
$重命名会话
( / )上/下一个会话

窗口:

按键功能
c新建窗口
n / p下/上一个窗口
0-9按编号切换
w窗口列表
,重命名窗口
&关闭窗口

窗格:

按键功能
|左右分割
-上下分割
h/j/k/l切换窗格
H/J/K/L调整大小
x关闭窗格
z最大化/还原
!窗格→窗口
{ / }交换窗格
Space切换布局

其他:

按键功能
[进入复制模式
]粘贴
r重载配置
m切换鼠标
S切换同步输入
:命令模式

16. 最佳实践清单#

16.1 10 条核心最佳实践#

  1. ✅ 始终使用命名会话tmux new -s myprojecttmux 好得多
  2. ✅ 修改前缀键为 Ctrl+A — 比 Ctrl+B 更顺手
  3. ✅ 设置 escape-time 0 — 避免 Vim 中 ESC 延迟
  4. ✅ 启用鼠标支持 — 点击/拖动/滚轮,大幅提升体验
  5. ✅ 使用 Vim 风格快捷键 — hjkl 切换窗格,与 Vim 肌肉记忆一致
  6. ✅ 配置 .tmux.conf — 默认配置太朴素,自定义后效率翻倍
  7. ✅ 安装 tmux-resurrect — 服务器重启也能恢复工作环境
  8. ✅ SSH + Tmux 配合 — 分离而非断开,任务永不丢失
  9. ✅ 使用启动脚本 — 一键创建预设工作环境
  10. ✅ history-limit 设为 50000 — 默认 2000 行太少

16.2 不同场景推荐配置#

场景推荐配置
日常开发命名会话 + Vim 快捷键 + 鼠标 + resurrect
服务器运维SSH 自动连接 + 同步输入 + 监控布局
远程协作共享会话 + 只读模式
多服务器管理同步输入 + 4 窗格监控布局
临时任务弹出式终端 + 快速分离

总结#

Tmux 是 Linux 服务器管理的第二基石(第一是 SSH)。掌握 Tmux 后,你的终端工作效率会有质的飞跃:

能力效果
会话保持SSH 断开≠任务中断,重连即恢复
窗口管理一个终端管 N 个任务,不再窗口爆炸
窗格分割同时看日志+代码+终端,无需切换
自定义配置快捷键/配色/布局完全定制化
会话恢复服务器重启也能恢复工作现场
远程协作多人共享同一终端,结对编程利器

核心规律:

  • 分离(detach)> 断开 — 永远用 detach 代替直接关闭终端
  • 命名会话 > 匿名会话 — 一眼知道每个会话在做什么
  • Vim 快捷键 > 方向键 — hjkl 比方向键更快
  • .tmux.conf > 默认配置 — 5 分钟配置,每天省 30 分钟
  • tmux-resurrect > 手动重建 — 自动保存恢复,万无一失

推荐阅读#

Tmux 终端复用器完全指南:从安装到自定义配置 | 2026 最新实践
https://971918.xyz/posts/docs/tmux-complete-guide/
作者
九所长
发布于
2026-07-04
许可协议
CC BY-NC-SA 4.0