tmux 快捷键速查:窗口、分屏、会话与滚动操作

整理 tmux 的 Ctrl+b 前缀键、窗口和面板操作、会话退出与恢复、历史输出滚动方法,并补充常用命令、配置和排错步骤。

tmux 可以在一个终端中管理多个窗口和分屏,还能在 SSH 断开后继续保持任务运行。 它的默认前缀键是 Ctrl+b。大多数快捷键都要分两步按:

  1. 按下 Ctrl+b
  2. 松开两个键;
  3. 再按动作键。 例如,新建窗口不是同时按 Ctrl+b+c,而是先按 Ctrl+b,松开后再按 c

最需要记住的快捷键

1
2
3
4
5
6
Ctrl+b d       退出 tmux,但让任务继续运行
Ctrl+b %       左右分屏
Ctrl+b "       上下分屏
Ctrl+b 方向键  切换面板
Ctrl+b z       当前面板全屏或恢复
Ctrl+b [       查看和滚动历史输出

恢复刚才退出的会话:

1
tmux attach

安装并确认 tmux 可用

Debian、Ubuntu:

1
2
sudo apt update
sudo apt install tmux

Fedora:

1
sudo dnf install tmux

Arch Linux:

1
sudo pacman -S tmux

macOS 使用 Homebrew:

1
brew install tmux

安装后查看版本:

1
tmux -V

终端返回类似 tmux 3.x 的信息,说明命令已经进入当前环境的 PATH

创建、退出和恢复会话

直接启动匿名会话:

1
tmux

更推荐创建命名会话:

1
tmux new -s work

work 可以换成项目名、服务器名或任务名。 临时离开时按 Ctrl+b,松开后按 d。这个操作叫 detach,只让当前终端与会话分离。会话中的编译、下载、日志监控和脚本仍会运行。 如果在面板里执行 exit,则会关闭当前 shell。最后一个面板退出后,相应窗口和会话也可能结束。

操作 命令或快捷键
新建命名会话 tmux new -s 会话名
查看会话 tmux ls
恢复最近会话 tmux attach
恢复指定会话 tmux attach -t 会话名
临时退出 Ctrl+b,再按 d
重命名当前会话 Ctrl+b,再按 $
删除指定会话 tmux kill-session -t 会话名
存在多个会话时,tmux attach 可能提示目标不明确。先查看名称:
1
tmux ls

再恢复指定会话:

1
tmux attach -t work

简写命令也有效:

1
tmux a -t work

窗口快捷键

窗口类似浏览器标签页。一个会话可以有多个窗口,每个窗口又能包含多个面板。

操作 快捷键
新建窗口 Ctrl+b,再按 c
下一个窗口 Ctrl+b,再按 n
上一个窗口 Ctrl+b,再按 p
最近使用的窗口 Ctrl+b,再按 l
切换到窗口 0–9 Ctrl+b,再按数字键
查看窗口列表 Ctrl+b,再按 w
重命名窗口 Ctrl+b,再按 ,
关闭当前窗口 Ctrl+b,再按 &
关闭窗口时 tmux 会要求确认。输入 y 后,窗口中的所有面板和程序都会结束,不要把 & 和 detach 使用的 d 混淆。
窗口编号超过 9 时,使用 Ctrl+b w 从列表中选择。也可以按 Ctrl+b ',输入窗口编号后按 Enter。

分屏与面板操作

面板是同一个窗口中的独立终端区域。

操作 快捷键
左右分屏 Ctrl+b,再按 %
上下分屏 Ctrl+b,再按 "
切换面板 Ctrl+b,再按方向键
切换到下一个面板 Ctrl+b,再按 o
显示面板编号 Ctrl+b,再按 q
当前面板全屏或恢复 Ctrl+b,再按 z
关闭当前面板 Ctrl+b,再按 x
轮换预设布局 Ctrl+b,再按空格
Ctrl+b q 后,每个面板会短暂显示编号。编号仍在屏幕上时按对应数字,可以直接跳转。
Ctrl+b z 只改变显示范围,不会删除其他面板;再次执行即可恢复原布局。

调整面板大小

常用操作是先按 Ctrl+b,再按住 Ctrl 并连续按方向键。若终端截获组合键,可以使用 tmux 命令。 先按 Ctrl+b :,再输入:

1
2
3
4
resize-pane -L 5
resize-pane -R 5
resize-pane -U 3
resize-pane -D 3

LRUD 分别表示左、右、上、下,数字表示调整的单元数量。 按百分比设置当前面板宽度或高度:

1
2
resize-pane -x 70%
resize-pane -y 60%

滚动查看历史输出

普通终端的滚轮有时无法直接滚动 tmux 历史。先进入复制模式:

1
Ctrl+b [
操作 按键
逐行移动 方向键
向上翻页 PageUp
向下翻页 PageDown
跳到顶部 g,需使用 vi 模式
跳到底部 G,需使用 vi 模式
搜索 /,需使用 vi 模式
退出复制模式 qEsc
如果 gG/ 的行为不同,通常是当前使用 emacs 风格按键。可在 ~/.tmux.conf 中启用 vi 模式:
1
set-window-option -g mode-keys vi

复制和粘贴文本

使用 vi 模式时,常见流程如下:

  1. Ctrl+b [ 进入复制模式;
  2. 移动到起点;
  3. 按空格开始选择;
  4. 移动到终点;
  5. 按 Enter 复制到 tmux 缓冲区;
  6. Ctrl+b ] 粘贴。 不同版本或自定义配置可能使用 v 开始选择、y 完成复制。按 Ctrl+b ? 可以查看当前真实绑定。 查看和保存 tmux 缓冲区:
1
2
tmux show-buffer
tmux save-buffer ~/tmux-buffer.txt

开启鼠标操作

希望用鼠标选择面板、调整边界和滚动时,在 ~/.tmux.conf 中加入:

1
set -g mouse on

重新载入配置:

1
tmux source-file ~/.tmux.conf

开启鼠标后,滚轮通常会自动进入复制模式。某些终端中鼠标选择会被 tmux 接管;需要使用终端原生选择时,可以尝试按住 Shift 再拖动。

一份够用的基础配置

编辑 ~/.tmux.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 开启鼠标
set -g mouse on

# 增加历史输出容量
set -g history-limit 50000

# 窗口和面板编号从 1 开始
set -g base-index 1
setw -g pane-base-index 1

# 关闭窗口后自动整理编号
set -g renumber-windows on

# 使用 vi 风格复制模式
setw -g mode-keys vi

# 缩短组合键等待时间
set -sg escape-time 10

保存后执行:

1
tmux source-file ~/.tmux.conf

也可以按 Ctrl+b :,输入 source-file ~/.tmux.conf。配置有语法错误时,tmux 会指出行号;先注释最近新增的配置再重试,不必删除整个文件。

修改默认前缀键

如果 Ctrl+b 与编辑器快捷键冲突,可以改成 Ctrl+a

1
2
3
unbind C-b
set-option -g prefix C-a
bind-key C-a send-prefix

加载后,本文所有 Ctrl+b 操作都要替换为 Ctrl+a。最后一行用于把前缀发送给嵌套 tmux。

SSH 断开后恢复任务

远程运行长任务时,可以按以下流程操作:

1
2
3
ssh user@server
tmux new -s train
./run-task.sh

需要离开时按 Ctrl+b d,再退出 SSH。网络意外断开时,会话通常也会继续存在。 重新连接后执行:

1
2
tmux ls
tmux attach -t train

tmux 只能保存终端会话,不能让已经报错退出的程序自动复活。重要任务仍应保存日志:

1
./run-task.sh 2>&1 | tee -a task.log

常见错误与处理

no server running

执行 tmux ls 出现 no server running on /tmp/tmux-...,表示当前用户没有正在运行的 tmux server。重新创建会话即可:

1
tmux new -s work

sessions should be nested with care

这表示当前 shell 已在 tmux 中,又执行了 tmux。先检查:

1
echo "$TMUX"

有输出时,优先按 Ctrl+b c 新建窗口,或用以下命令切换会话:

1
tmux switch-client -t 会话名

attach 后画面尺寸不正常

同一会话连接了尺寸不同的终端时,显示区域可能受较小客户端影响。可在恢复时断开其他客户端:

1
tmux attach -d -t work

查看现有客户端:

1
tmux list-clients

快捷键没有反应

依次检查:

  1. 是否先按前缀并松开;
  2. 前缀是否已在配置中修改;
  3. 终端或远程桌面是否截获组合键;
  4. 是否处于嵌套 tmux;
  5. 当前绑定是否被插件覆盖。 显示所有真实绑定:
1
Ctrl+b ?

从 shell 查询分屏绑定:

1
tmux list-keys | grep 'split-window'

误关闭面板或会话

tmux 没有通用的撤销关闭功能。关闭前应确认没有未保存的编辑器、交互任务或未写入文件的输出。使用 tee 保存日志,可以降低误关面板后的损失。

安全关闭与清理

只结束一个会话:

1
tmux kill-session -t work

保留 work,结束其他会话:

1
tmux kill-session -a -t work

结束当前用户的整个 tmux server:

1
tmux kill-server

kill-server 会关闭该 server 管理的全部会话及其中的进程。执行前先运行 tmux ls,确认没有仍需保留的任务。

精确指定会话、窗口和面板

tmux 命令经常使用 -t 指定目标。完整目标格式是:

1
会话名:窗口编号.面板编号

例如,work:1.2 表示 work 会话中的窗口 1、面板 2。

查看当前目标:

1
tmux display-message -p '#S:#I.#P'

列出所有窗口:

1
tmux list-windows -a

列出所有面板及其当前命令:

1
tmux list-panes -a -F '#S:#I.#P #{pane_current_command}'

这种写法适合在多个会话之间排查任务位置,也适合脚本只操作指定面板,避免误关其他终端。

目标可以省略部分字段。当前会话中的窗口 2 可写成 :2,当前窗口中的面板 1 可写成 .1。自动化脚本中建议使用完整目标,减少当前焦点变化带来的歧义。

从 Shell 创建窗口和分屏

除了键盘快捷键,也可以直接调用 tmux 命令。向 work 会话新建窗口:

1
tmux new-window -t work -n logs

在窗口中建立左右分屏:

1
tmux split-window -h -t work:logs

建立上下分屏:

1
tmux split-window -v -t work:logs

创建面板时直接运行命令:

1
tmux split-window -h -t work:logs 'tail -f /var/log/syslog'

带命令的面板会在命令结束后关闭。如果希望查看最后输出,可让 shell 在命令后保留:

1
tmux split-window -h -t work:logs 'tail -n 100 /var/log/syslog; exec bash'

远程生产环境中不要把需要密码的命令直接写进 Shell 历史。使用现有认证机制,并限制日志面板只读取必要文件。

向后台会话发送命令

send-keys 可以向指定面板模拟键盘输入:

1
tmux send-keys -t work:server.0 'npm run dev' Enter

向正在运行的前台程序发送 Ctrl+c

1
tmux send-keys -t work:server.0 C-c

发送命令前先确认面板当前运行的程序:

1
tmux display-message -p -t work:server.0 '#{pane_current_command}'

如果输出是编辑器、数据库客户端或其他交互程序,直接发送文本可能造成数据修改。自动化时应为任务准备专用会话和固定窗口名,不要依赖临时编号。

创建后台会话并启动任务:

1
2
tmux new-session -d -s backup
tmux send-keys -t backup:0 'bash ~/backup.sh 2>&1 | tee -a ~/backup.log' Enter

检查会话是否存在:

1
2
tmux has-session -t backup
echo $?

返回码为 0 表示目标会话存在。它只能说明 tmux 会话还在,不能证明脚本成功,应同时检查退出状态、日志或输出文件。

捕获面板输出用于排错

不进入会话也可以读取面板历史:

1
tmux capture-pane -p -t work:server.0

只获取最近 100 行:

1
tmux capture-pane -p -S -100 -t work:server.0

保存到文件:

1
tmux capture-pane -p -S -500 -t work:server.0 > server-output.txt

capture-pane 读取的是 tmux 保存的屏幕和历史内容。若程序输出超过 history-limit,更早内容已经无法恢复。

需要长期审计的任务应让程序自身写日志,而不是只依赖 tmux 历史。日志中若包含令牌、连接字符串或用户数据,还要设置合适的文件权限和保留周期。

检查会话是否仍有客户端

下面的命令可以查看哪些终端仍连接着 tmux:

1
tmux list-clients -F '#{client_name} session=#{session_name} tty=#{client_tty}'

如果维护窗口前需要独占会话,先通知其他使用者,再决定是否使用 attach -d 断开其客户端。

客户端列表为空不代表任务已经结束,只表示当前没有终端正在显示该会话。

常见问题

detach 会停止程序吗?

不会。Ctrl+b d 只断开客户端。程序是否继续运行,还取决于服务器是否关机、重启或由其他机制终止进程。

为什么 Ctrl+b % 输入了百分号?

通常是没有触发前缀,或把按键按成了同时组合。先按 Ctrl+b 并全部松开,再输入 %;多数键盘布局需要按 Shift+5

为什么双引号不好按?

先触发前缀,再使用当前键盘布局对应的双引号组合,通常是 Shift+'。也可以在配置中重新绑定一个更方便的分屏键。

如何确认当前会话、窗口和面板?

1
tmux display-message -p '#S:#I.#P'

输出依次是会话名、窗口编号和面板编号。

快速回顾

tmux 的结构分为三层:会话保存整套工作环境,窗口区分任务,面板负责分屏。 日常流程是用 tmux new -s 名称 创建会话,通过窗口和分屏组织任务,按 Ctrl+b d 安全离开,再用 tmux attach -t 名称 恢复。 忘记快捷键时按 Ctrl+b ? 查看当前配置中的真实绑定,比死记完整列表更可靠。