前言
2026 年 6 月 26 日,tmux 官方发布了 3.7 版本。这是自 3.6 版本以来最重要的一次更新,引入了诸多社区期待已久的功能。其中 浮动窗格(Floating Panes) 无疑是最引人注目的亮点,此外复制模式行号、焦点跟随鼠标、内置帮助等新特性也大幅提升了日常使用体验。
本文将从源码级别深入剖析 tmux 3.7 的每一个新特性,带你全面了解这个版本的变化。
━━━ ━━━ ━━━
一、浮动窗格(Floating Panes)1.1 概述
浮动窗格是 tmux 3.7 最重磅的新功能。简单来说,浮动窗格是悬浮在传统平铺布局之上的窗格,类似于 popup(弹出窗口)的行为,但不是模态的——你可以像操作普通窗格一样操作它,它支持完整的转义序列。
社区对此功能的呼声已持续多年。早在 2015 年就有相关讨论,但直到 3.7 版本,才由 Michael Grant 主导、Dane Jensen 协助实现并合入主线。
1.2 使用方法
创建浮动窗格的命令:
# 默认快捷键:前缀键 + *
# 或者使用命令
tmux new-pane -d -F -p 30
# -F 表示浮动模式
# -p 30 表示高度为视口的 30%
更完整的示例:
# 创建一个位于窗口中央、80% 宽度、60% 高度的浮动窗格
tmux new-pane -d -F -x 80 -y 60
# 创建一个浮动窗格并运行指定命令
tmux new-pane -d -F "htop"
# 通过 -t 指定目标窗口
tmux new-pane -d -F -t mywindow ":!git log --oneline"
1.3 限制与未来展望
作为一个早期发布(early release)的特性,浮动窗格目前还比较有限:
- ✅ 支持:鼠标拖拽移动、鼠标拖拽调整大小
- ✅ 支持:完整的转义序列支持(和普通窗格一样)
- ❌ 暂不支持:浮动窗格之间的 swap
- ❌ 暂不支持:
resize-pane命令调整浮动窗格大小 - ❌ 暂不支持:浮动窗格与平铺窗格之间的切换
- ❌ 暂不支持:自定义布局中包含浮动窗格的恢复
另外,
status-format设置为 2 时,默认的第二条状态行已更新为显示窗格列表,以便管理浮动窗格。
1.4 实现原理简析
浮动窗格在 tmux 内部被实现为一种新的窗格类型,与平铺窗格共享大部分 struct window_pane 结构体。主要差异在于:
- 定位方式:浮动窗格的坐标不受布局树约束,直接使用像素级绝对定位
- 绘制优先级:浮动窗格总是在平铺窗格的上层绘制
- 鼠标事件处理:鼠标事件先传递给浮动窗格,未被消费的才传递给下层
━━━ ━━━ ━━━
二、复制模式行号2.1 新选项
3.7 引入了 copy-mode-line-numbers 选项,支持在复制模式下显示行号。有五种模式可选:
| 模式 | 含义 |
|---|---|
off |
不显示行号 |
default |
tmux 默认编号:0 为顶部可见行 |
absolute |
历史缓冲区第一行为 1 |
relative |
相对于光标位置 |
hybrid |
当前行为 absolute,其他行为 relative |
2.2 样式定制
配套新增了两个样式选项:
copy-mode-line-number-style:行号样式(默认:fg=brightblack)copy-mode-current-line-number-style:当前行行号样式(默认:fg=yellow)
2.3 鼠标交互优化
通过鼠标进入复制模式时,行号默认保持关闭,避免干扰鼠标选择操作。这一细节体现了开发者对用户体验的用心。
2.4 实际应用
# ~/.tmux.conf
set -g copy-mode-line-numbers hybrid
set -g copy-mode-line-number-style "fg=cyan"
set -g copy-mode-current-line-number-style "fg=yellow,bold"
# 在复制模式中,也可通过 shortcut 切换
# C-b : 然后输入 set -g copy-mode-line-numbers relative
hybrid 模式特别适合大规模代码审阅或日志分析——当前行显示绝对编号方便引用,周边行显示相对编号方便快速跳转。
━━━ ━━━ ━━━
三、焦点跟随鼠标(Focus Follows Mouse)3.1 功能说明
新增 focus-follows-mouse 选项。启用后,窗格的焦点会跟随鼠标指针自动切换,无需点击。这对多窗格操作场景非常实用。
# ~/.tmux.conf
set -g focus-follows-mouse on
3.2 使用场景
- 日志监控:在多个 tail -f 窗格间快速切换
- 代码审阅:在不同源码文件窗格间移动
- 运维面板:同时监控多个系统指标
注意:该选项与传统的
mouse选项是独立的,mouse控制的是鼠标整体支持(选择、滚动等),focus-follows-mouse专门控制焦点切换行为。
━━━ ━━━ ━━━
四、剪贴板改进4.1 新增 get-clipboard 选项
3.7 新增 get-clipboard 选项(默认关闭)。启用后,当窗格请求剪贴板内容时,tmux 会向终端请求并转发给请求的窗格。
# ~/.tmux.conf
set -g get-clipboard on
4.2 OSC 52 支持增强
值得一提的是,3.7 还让 OSC 52(终端剪贴板协议)在 popup 模式下也能正常工作,解决了之前 popup 中无法访问系统剪贴板的痛点。
━━━ ━━━ ━━━
五、安全增强与漏洞修复5.1 标题/名称清理
3.7 加强了对窗格标题(pane title)、窗口名称和会话名称的清洗,防止 C0 控制字符等不可见字符引发问题。
5.2 粘贴缓冲区安全
- 粘贴缓冲区内容现在经过
vis(3)处理后再粘贴,防止缓冲区中包含括号粘贴结束序列等特殊内容 - 新增
-S标志可禁用此安全处理
5.3 MSG_COMMAND 参数限制
将 MSG_COMMAND 参数限制在 0 到 1000 之间,防止异常客户端导致服务器崩溃。
5.4 Fuzz 测试扩展
新增了针对命令解析、格式解析和样式解析的多个 fuzzer,大幅提升了代码健壮性。多个通过 fuzz 测试发现的 bug 已在此版本中修复。
5.5 只读客户端功能增强
只读客户端现在可以使用复制模式进行查看(但不能执行复制命令),这在多人共享 tmux 会话时更实用。
━━━ ━━━ ━━━
六、改进的 message-style6.1 fill 属性支持
message-style 现在支持 fill 属性。传统上,message 会占满整行,现在可以只占用部分状态栏宽度,让正常的状态栏内容在背后透出。
# 默认值已变为
set -g message-style "fill=yellow"
# 自定义
set -g message-style "fg=white,bg=red,fill=red"
6.2 message-format 选项
新增 message-format 选项,类似于 status-format,可控制消息的整体格式。这将 message 从简单的字符串升级为完整的格式模板。
来自 Conor Taylor 的贡献(issue 4861)。
━━━ ━━━ ━━━
七、内置模式帮助7.1 功能
每个模式(复制模式、树模式等)现在都内置了简短的帮助文本,可通过 C-h 快捷键查看。
这对新手友好度提升是巨大的——不再需要记忆所有快捷键或者在 tmux 手册中翻找,在模式中直接按 C-h 即可看到可用命令。
7.2 实现
基于 Patrick Motard 的代码(issue 4751),为每种模式提供了针对性的帮助内容。
━━━ ━━━ ━━━
八、list-keys 排序与自定义格式8.1 新增 -O 和 -F 标志
list-keys 命令新增了 -O(排序)和 -F(自定义格式)标志:
# 按快捷键名称排序
tmux list-keys -O
# 自定义输出格式
tmux list-keys -F "#{key} | #{command}"
8.2 统一样式
排序代码被抽取为公共模块,多个 list 类命令(list-keys、list-windows、list-panes 等)都支持了 -O 参数。
━━━ ━━━ ━━━
九、SIXEL 图像处理改进9.1 数量上限提升
最大 SIXEL 图像数量从之前的版本提升到了 20 张(bump the maximum number of SIXEL images to 20)。
9.2 尺寸计算修复
修复了缩放后 SIXEL 图像的尺寸计算问题(来自 nincsnevem662 的贡献,issue 4739)。
9.3 其他 SIXEL 相关修复
多项 SIXEL 相关的错误修复和改进已合入。
━━━ ━━━ ━━━
十、run-shell 参数扩展10.1 新功能
run-shell 现在支持在 shell 命令后传递参数,并通过 #{1}、#{2} 等格式变量来引用:
# 示例:执行 run-shell 并传递参数
tmux run-shell 'echo "参数1: #{1}, 参数2: #{2}"' "hello" "world"
10.2 空值保护
修复了 job_run 失败时 run-shell 卡住的问题(来自 Barrett Ruth 的贡献,issue 5037)。
━━━ ━━━ ━━━
十一、其他值得关注的改进11.1 paste 超时保护
对 Terminal.app 等可能在粘贴大内容时丢失结束序列的终端,新增了 5 秒的粘贴时长限制(issue 4527)。
11.2 括号粘贴检测优化
如果终端支持括号粘贴模式,tmux 会关闭\"这是否是粘贴内容\"的猜测逻辑,直接信任终端的括号粘贴标记(issue 5031)。
11.3 clock-mode 秒级显示
时钟模式新增了秒级显示选项(来自 augustus7613 和 Joao Pedro,issue 4697/4760)。
# 显示秒
tmux clock-mode -s
11.4 prompt-command-cursor-style
新增 prompt-command-cursor-style 选项,可自定义命令提示符的光标样式(来自 Joshua Cooper,issue 4765)。
11.5 command-prompt -e 标志
command-prompt 新增 -e 标志,如果输入为空则直接关闭(来自 Dane Jensen,issue 4812)。
11.6 控制范围扩展
新增了名为 control0 到 control9 的鼠标范围,用于在窗格状态行中添加鼠标可控组件(来自 Dane Jensen 和 Michael Grant)。
11.7 tree-mode 自定义
树模式的指示器现在可通过 tree-mode-preview-format 和 tree-mode-preview-style 两个新选项自定义。
11.8 remain-on-exit 的按键模式
remain-on-exit 新增键位模式:窗格保持显示直到按下任意键后再关闭(来自 Michael Grant)。
11.9 emacs 风格的 recentre-top-bottom
复制模式新增了 emacs 风格的 recentre-top-bottom 命令,方便在复制模式中快速重新定位光标(来自 sinyax75,issue 5053)。
11.10 codepoint-widths 范围支持
codepoint-widths 选项现在可以接受范围值(来自 san65384,issue 4930)。
━━━ ━━━ ━━━
十二、升级注意事项12.1 完全重启
升级到 3.7 后,必须完全重启 tmux,而不是简单地重载配置文件:
# 保存当前会话(可选)
tmux list-sessions
# 完全退出所有 tmux 会话
tmux kill-server
# 启动新会话
tmux new-session
12.2 3.7a / 3.7b 补丁版本
3.7 发布后,由于 break-pane 命令的崩溃问题,官方迅速发布了 3.7a 补丁。随后又发布了 3.7b 修复其他小问题。建议直接升级到最新的 3.7b。
12.3 配置文件兼容
大部分 3.6 的配置文件与 3.7 兼容,但如果你使用了自定义 message-style,注意默认值已改为 fill=yellow,如有需要请手动调整。
━━━ ━━━ ━━━
总结
tmux 3.7 是一个里程碑式的版本。浮动窗格填补了 tmux 长久以来在非平铺布局上的空白,复制模式行号和焦点跟随鼠标大幅提升了日常操作效率,安全增强和fuzz 测试则让代码更加健壮。
版本虽新,诚意十足。如果你还在用 3.5 或 3.6,现在就是升级的好时机。
━━━ ━━━ ━━━
后记: 本文写作时 tmux 3.7b 为最新稳定版。tmux 由 Nicholas Marriott(nicm)等核心开发者维护,项目已有 17 年历史,是 Linux/Unix 终端复用器的事实标准之一。如果你有有趣的使用技巧或发现本文遗漏的功能,欢迎留言讨论。
━━━ ━━━ ━━━
*欢迎关注 LeisureLinux,获取更多深度技术解读。*
参考文献
- tmux 官方 CHANGES 文件(3.7 版本):
- tmux 3.7 Release:
- tmux 官方仓库:
- tmux 手册(man tmux):
- tmux 社区讨论 - 3.7 Release Notes:
别再花冤枉钱了!2025 全球最强 60款免费开源神器清单,建议收藏!
【我的 oh-my-zsh 和 byobu 配置-哔哩哔哩】 https://b23.tv/xwcxghy