在同一个会话中分出更多会话或窗口,并且能让会话结束后终端继续运行。可以用于:构建便捷的多窗口终端工作台、在SSH或终端关闭后依然持续运行某些服务或程序。
只需要一个终端窗口,就可以通过随意切换干所有事情。

会话与窗口的关系:
架构:Server → Session → Window → Pane
-
会话 (Session):
-
定义:它是状态和进程的容器。
-
作用:它负责保持后台运行。当你断开连接时,只要会话还在,里面的所有程序(无论在哪个窗口或窗格)都在运行。
-
关系:一个会话可以包含 N 个 窗口。
-
-
窗口 (Window):
-
定义:它是视觉呈现的容器。
-
作用:它相当于一个满屏的工作台。就像浏览器的一个标签页,或者操作系统的一个虚拟桌面。
-
关系:一个窗口占满整个终端屏幕,它可以被进一步切分成多个窗格(Pane)。
-
切换会话:相当于切换了整个工作环境(比如从“后端开发环境”切换到“服务器运维环境”)。
切换窗口:相当于在同一个环境里切换视图(比如从“代码编辑界面”切换到“日志查看界面”)。
会话管理
# 1. 新建会话
tmux # 新建一个无名会话(默认编号 0, 1, 2...)
tmux new -s mocha_server # 新建一个名为 mocha_server 的会话(推荐使用 -s 指定名称,方便管理)
tmux new -s demo -n main # 新建会话 demo,并同时将第一个窗口命名为 main (-n 参数)
# 2. 查看会话列表
tmux ls # 列出当前所有运行中的 tmux 会话,前面没标代表会话编号为 0
tmux list-sessions # 同上,完整命令形式
# 查看当前所有会话的所有窗口
tmux list-windows -a
# 查看指定会话(例如会话 0)下的所有窗口
# -t 表示 target (目标会话)
tmux list-windows -t 0
tmux list-windows -t mocha_server
# 例子:把编号为 0 的会话改名为 "backend"
tmux rename-session -t 0 backend
# 例子:把名为 "demo" 的会话改名为 "production"
tmux rename-session -t demo production
# 3. 进入/恢复会话 (Attach)
tmux a # 默认恢复最近一次活跃的会话 (a 是 attach 的缩写)
tmux a -t mocha_server # 恢复挂载名为 mocha_server 的会话 (-t target,指定目标)
tmux attach -t 0 # 恢复编号为 0 的会话
tmux a -d -t mocha_server # 恢复会话,并强制让其他正在连接该会话的客户端断开 (-d detach other clients)
# 4. 关闭/销毁会话
tmux kill-session -t demo # 销毁名为 demo 的会话
tmux kill-server # 销毁所有会话并停止 tmux 服务窗口操作
这些操作使用快捷键即可。
- 分裂窗格
# 左右分割 (对应快捷键 %)
# -h 表示 horizontal(水平方向布局,即左右排列)
tmux split-window -h
# 上下分割 (对应快捷键 ")
# -v 表示 vertical(垂直方向布局,即上下排列)
tmux split-window -v
# 进阶用法:指定在某个具体目录打开新窗格
# -c 指定工作目录
tmux split-window -h -c /var/www/html- 切换窗格
# 切换焦点到指定方向的窗格
tmux select-pane -U # Up (上)
tmux select-pane -D # Down (下)
tmux select-pane -L # Left (左)
tmux select-pane -R # Right (右)
# 指定编号切换 (配合 -t target)
tmux select-pane -t 1 # 切换到编号为 1 的窗格- 调整大小
# 向指定方向扩展尺寸
# 最后的数字表示调整的单元格数量 (cells)
tmux resize-pane -U 10 # 向上扩大 10 行
tmux resize-pane -D 10 # 向下扩大 10 行
tmux resize-pane -L 20 # 向左扩大 20 列
tmux resize-pane -R 20 # 向右扩大 20 列
# 缩放/最大化当前窗格 (对应快捷键 z)
tmux resize-pane -Z- 关闭窗格
# 关闭当前窗格 (对应快捷键 x)
tmux kill-pane
# 关闭指定编号的窗格
tmux kill-pane -t 2
# 交换窗格位置 (对应快捷键 { 或 })
tmux swap-pane -U # 与上一个窗格交换
tmux swap-pane -D # 与下一个窗格交换快捷键操作
Pane(窗格) 控制
用于在一个视口中分割出多个终端。
# 以下指令需先按 Ctrl+b
% # 左右分割窗格 (Vertical Split)
" # 上下分割窗格 (Horizontal Split)
x # 关闭当前窗格 (会有确认提示 y/n)
z # 最大化/恢复当前窗格 (Zoom,用于临时全屏查看日志或代码)
; # 切换到上一个激活的窗格
o # 轮询切换到下一个窗格
q # 显示窗格编号(此时按对应数字可直接切换过去)
{ # 将当前窗格与上一个窗格交换位置
} # 将当前窗格与下一个窗格交换位置
Space # (空格键) 在预置的窗格布局中循环切换
! # 将当前窗格拆分为一个新的独立窗口 (Break pane)窗口控制
当一个屏幕放不下太多窗格时,我们需要新建窗口。
# 以下指令需先按 Ctrl+b
c # 创建新窗口 (Create)
w # 以列表形式显示所有会话和窗口,可上下选择并回车切换 (这是最直观的切换方式)
n # 切换到下一个窗口 (Next)
p # 切换到上一个窗口 (Previous)
0~9 # 直接切换到指定编号的窗口
, # 重命名当前窗口 (方便记忆窗口用途)
. # 修改当前窗口的编号
& # 关闭当前窗口 (会有确认提示)
f # 在所有窗口中查找文本 (Find)会话控制
# 以下指令需先按 Ctrl+b
d # 分离当前会话 (Detach),回到原本的 Shell,但 tmux 会话在后台继续运行
s # 显示会话列表树,支持在不同会话间快速切换
$ # 重命名当前会话
( # 切换到上一个会话
) # 切换到下一个会话调整窗格大小
# 以下指令需先按 Ctrl+b
Alt + 方向键 # (按住 Alt) 以 5 个单元格为单位快速调整窗格边界
Ctrl + 方向键 # (按住 Ctrl) 以 1 个单元格为单位微调窗格边界复制相关问题
鼠标左键拖动后会自动复制到缓冲区中。
默认用的是 Emacs 模式,这个模式下,进入自由光标模式是 Ctrl + [,开始复制选择是 Ctrl + 空格,而复制不是 Enter,而是 Alt + W。
我通过修改配置将他变成了 vim 快捷键模式:
# 开启鼠标支持(允许点击切换窗格、拖拽调整大小、鼠标滚轮查看历史)
set -g mouse on
# 将前缀键修改为 Ctrl+a (更符合 screen 习惯,也就是 CapsLock 位置,比 Ctrl+b 更好按)
# unbind C-b
# set -g prefix C-a
# bind C-a send-prefix
# 开启 Vi 风格的按键模式 (Command mode & Copy mode)
setw -g mode-keys vi
# 绑定 v 进入选择模式 (Visual mode),绑定 y 进行复制 (Yank)
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel
# 使用 Vim 风格的快捷键在窗格间移动
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# 增加历史回滚行数
set -g history-limit 10000
# 禁用局部滚动
set -ga terminal-overrides ',*:csr@:indn@:rin@:ri@'
# 禁用背景颜色擦除以及行擦除特性,强制 tmux 手动填充覆盖
set -ga terminal-overrides ',*:bce@:el@:el1@'
# 禁用替代字符集与左右边界特性,强制使用纯文本画框并进行基础重绘
set -ga terminal-overrides ',*:enacs@:smacs@:rmacs@:acsc@:smglr@:rmglr@'
# 禁用行插入与行删除特性,防止动画或滚动导致整行错乱
set -ga terminal-overrides ',*:il@:il1@:dl@:dl1@'
# 禁用字符级别的插入与删除特性,解决实时文字被遮盖或消失的问题
set -ga terminal-overrides ',*:ich@:ich1@:dch@:dch1@'
# 禁用清除到屏幕末尾特性,解决翻页触底时下方行直接消失的问题
set -ga terminal-overrides ',*:ed@'
tmux source-file ~/.tmux.confTmux 默认只会复制到自己的 Buffer 中,不会复制到系统或宿主的剪贴板中。
可以通过 Ctrl + B, : 输入 show-buffer 查看缓冲区;或者通过快捷键 Ctrl + B, # 查看缓冲区记录、通过快捷键 Ctrl + B, = 查看显示方式更好的缓冲区列表;通过 save-buffer 目标 将缓冲保存为文件。
缓冲区交互界面操作
有关
Ctrl + B, =之后的操作说明:
- 查看:光标上下移动,选中某个缓冲区会自动显示内容预览,如果想看完整内容,可以直接按
e键,会使用默认文本编辑器来查看整个内容。- 复制:按下回车键,tmux 会立刻将该缓冲区的内容粘贴到之前光标所在位置。
- 复制到宿主机(输出到文件):利用列表前面显示的缓冲区名称,使用
save-buffer -b buffer0000 /路径/想要的文件名.txt保存文件到本地。另外,在列表中按下
d键可以删除选中的缓冲区记录。
同时有一种快捷操作,按住 Shift 键后左键拖动,可以直接让宿主进行选择和复制。
疑难问题解决
HexHub中滚轮滚动无法完整显示历史文本

如图
图中右侧出现重复覆盖行数显示,左侧也显示不全,只有进入复制模式时才能显示出来。
在 .tmux.conf 中加入这些配置:
# 禁用局部滚动
set -ga terminal-overrides ',*:csr@:indn@:rin@:ri@'
# 禁用背景颜色擦除以及行擦除特性,强制 tmux 手动填充覆盖
set -ga terminal-overrides ',*:bce@:el@:el1@'
# 禁用替代字符集与左右边界特性,强制使用纯文本画框并进行基础重绘
set -ga terminal-overrides ',*:enacs@:smacs@:rmacs@:acsc@:smglr@:rmglr@'
# 禁用行插入与行删除特性,防止动画或滚动导致整行错乱
set -ga terminal-overrides ',*:il@:il1@:dl@:dl1@'
# 禁用字符级别的插入与删除特性,解决实时文字被遮盖或消失的问题
set -ga terminal-overrides ',*:ich@:ich1@:dch@:dch1@'
# 禁用清除到屏幕末尾特性,解决翻页触底时下方行直接消失的问题
set -ga terminal-overrides ',*:ed@'