tmux
Tmux 是一个终端复用器(terminal multiplexer),非常有用,属于常用的开发工具。
# 基础概念
tmux 的核心是三级嵌套结构:会话(Session) > 窗口(Window) > 窗格(Pane)。会话是顶层容器与持久化单元,窗口是会话内的标签页 / 工作区,窗格是窗口内的分屏。
- 会话(Session)
本质:tmux 最顶层的独立工作区/项目容器,是进程与状态的持久化核心载体。
核心特性:
支持后台独立运行(detach 操作),关闭终端、断开 SSH 连接,均不影响会话内正在运行的任务。
可随时重新接入(attach 操作),一键恢复完整工作现场,无需重新启动任务。
一个会话可包含多个窗口,不同会话的运行环境完全隔离,互不干扰。
类比:一个独立的项目文件夹,或一间专属的工作房间,所有相关操作都在这个空间内完成。
- 窗口(Window)
本质:隶属于会话的全屏工作标签页,默认占据整个终端屏幕,是会话内的任务分类单元。
核心特性:
一个会话可创建多个窗口,支持快速切换(类似浏览器标签页切换逻辑),提升同项目内多任务效率。
每个窗口可进一步分割为多个窗格(Pane),实现单屏幕多终端并行操作。
窗口具有强依附性,仅属于某一个会话,无法跨会话独立存在,会话关闭则其下所有窗口同步关闭。
类比:浏览器的标签页,或工作房间里的一张桌子,每张桌子(窗口)可承载不同的具体任务。
- 层级关系(一句话总结)
核心层级:会话(项目) → 窗口(标签页) → 窗格(分屏)
1 个会话 = N 个窗口(一个项目可包含多个任务标签)
1 个窗口 = N 个窗格(一个任务标签可拆分多个并行终端)
窗格是 tmux 最小的执行单元,每个窗格对应一个独立的伪终端,可独立执行命令。
# 变量
在 tmux 的配置语境中,这些是以 # 开头的特殊占位符(也叫 Format Variables),用来动态提取当前会话或窗口的信息。 可以使用 man tmux 搜索 /FORMATS查找。
也可以在网站 GitHub Wiki: tmux/tmux Wiki - Formats (opens new window)
# 优点
- 保持会话不中断:即使 SSH 断开,任务也能继续运行,重连后可恢复。
- 多任务并行更高效:一个终端里可同时管理多个窗口和窗格。
- 远程开发更稳定:特别适合服务器运维、日志观察和长任务执行。
- 键盘操作流畅:减少鼠标切换成本,提升终端操作效率。
# 核心概念
# 会话(session)
- 会话管理
tmux ls: 查看当前所有的 Tmux 会话tmux new -s <session-name>: 新建会话,为会话起名tmux detach: 分离会话tmux attach -t <session-name>: 接入会话tmux kill-session -t <session-name>: 杀死某个会话tmux switch -t <session-name>: 切换会话tmux rename-session -t 0 <new-name>: 重命名会话
- 会话快捷键
Ctrl + b -> d: 退出(离开)当前 session(后台保留,最常用)Ctrl + b -> s: 列出所有会话,选择进入. 弹出会话列表 → 用上下方向键选 → 按回车进入Ctrl + b -> L: 直接切换到上一个会话(超快).在最近两个会话之间来回切Ctrl + b -> $: 重命名当前会话
# 窗口管理(window)
tmux new-window -n <window-name>: 新建一个指定名称的窗口- 切换窗口
tmux select-window -t <window-number>: 切换到指定编号的窗口tmux select-window -t <window-name>: 切换到指定名称的窗口
tmux rename-window <new-name>: 重命名窗口- 窗口快捷键
Ctrl + b c: 创建一个新窗口,状态栏会显示多个窗口的信息Ctrl + b p: 切换到上一个窗口(按照状态栏上的顺序)Ctrl + b n: 切换到下一个窗口。Ctrl + b <number>: 切换到指定编号的窗口,其中的<number>是状态栏上的窗口编号Ctrl + b w: 从列表中选择窗口Ctrl + b &: 移除窗口Ctrl + b ,: 窗口重命名
# 窗格(pane)
tmux split-window: 划分上下两个窗格tmux split-window -h: 划分左右两个窗格tmux select-pane: 移动光标- 交换窗格位置
tmux swap-pane -U: 当前窗格上移tmux swap-pane -D: 当前窗格下移
- 快捷键
Ctrl + b %: 左右分屏Ctrl + b ": 上下分屏Ctrl + d或exit: 关闭当前窗格- 当一个窗口里最后一个窗格被关掉时,这个窗口也会被关掉。
- 当一个会话里最后一个窗口被关掉时,这个会话也会被关掉
Ctrl + b z: 在当前网格与最大化当前网格切换Ctrl + b o: 在窗格间切换焦点
# 3 操作
# 3.1 Buffer
当你有多次复制记录时,tmux 会按时间顺序堆叠它们(buffer0 为最新)。C-b ?,搜索 buffer 查看
# 3.1.1 buffer相关的快捷键
C-b =: Choose a paste buffer from a list (预览并选择粘贴)C-b #: List all paste buffers (查看简易 Buffer 列表)C-b ]: Paste the most recent paste buffer (粘贴最近一次缓存)C-b :list-buffers: List all paste buffers with details (查看详细缓存列表)C-b :paste-buffer -b 0: Paste a specific buffer by index (粘贴指定编号的缓存)C-b :show-buffer -b 0: Display the content of a specific buffer (查看指定编号的详细内容)C-b :delete-buffer -b 0: Delete a specific paste buffer (删除指定编号的缓存)
# 3.1.2 编辑buffer
这里利用 choose-buffer 进行简单交互
如果你已经有多个 Buffer(之前复制过好几次),你可以通过交互界面进入:
- 按下
Prefix + #(列出所有 buffer)。 - 虽然这里不能直接编辑文字,但你可以按
e(在某些 tmux 版本下支持)或者配合插件进入编辑模式。
# 配置文件
使用 tmux source ~/.tmux.conf 生效
setw -g mode-keys vi: 设置在 copy-mode 和选择 buffer 时使用 vi 键位- 绑定为交互式选择 Buffer 模式
bind-key" "#" choose-buffer: 注意这里需要在 # 加上引号,否则被 tmux 解释为“注释”开始的标志bind-key "#" choose-buffer -Z: -Z 为全屏的标识
# 配置鼠标获取焦点
# 开启鼠标全能支持(点击、滚动、拖拽)
set -g mouse on
# 支持滚轮滚动
set -g history-limit 50000
# 启用256色
set -g default-terminal "screen-256color"
# 窗口从1开始编号(更顺手)
set -g base-index 1
set -g pane-base-index 1
# 快速重载配置:Ctrl+b r
bind r source-file ~/.tmux.conf \; display "Config Reloaded!"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 新建窗格自动继承当前目录
# 垂直分屏:继承当前目录
bind '"' split-window -v -c "#{pane_current_path}"
# 水平分屏:继承当前目录
bind % split-window -h -c "#{pane_current_path}"
# 新建窗口:也继承当前目录(可选)
bind c new-window -c "#{pane_current_path}"
2
3
4
5
6
# tumux中的copy问题
问题描述: 选中字符会自动取消选择.
原因分析:
- Buffer 机制: tmux 默认将选中内容存入内建 Buffer 栈。高亮消失意味着“复制已完成并退出模式”。
- 设计哲学: 鼓励全键盘操作(
Ctrl-b + [进入 Copy Mode),实现跨会话、跨服务器的文本持久化。
禁用选择更新tmux buffer也有两种方式,如下:
方式1: 临时绕过法
- macOS (iTerm2/Terminal): 按住
Option (⌥)键的同时进行选择。 - Linux/Windows: 按住
Shift键的同时进行选择。
方式2: 修改配置(保留高亮且停留在复制模式)
# 开启鼠标支持
set -g mouse on
# 解决松开鼠标自动取消选中的问题:即取消“鼠标拖动结束时退出复制模式”的默认行为
unbind -T copy-mode-vi MouseDragEnd1Pane
2
3
4
5
配置完成后记得执行 tmux source-file ~/.tmux.conf
# 分屏快捷键的修改
左右分屏 (Vertical Layout), 并保持当前路径
bind v split-window -h -c "#{pane_current_path}"- 理解:用 v 代表 Vertical 布局,对应原生的
Ctrl + b -> %。
上下分屏 (Horizontal Layout), 并保持当前路径
bind h split-window -v -c "#{pane_current_path}"- 理解:用 h 代表 Horizontal 布局,对应原生的
Ctrl + b -> "。
# 其他命令
man tmux: 帮助文档tmux list-keys: 列出所有快捷键,及其对应的 Tmux 命令tmux list-commands: 列出所有 Tmux 命令及其参数tmux info: 列出当前所有 Tmux 会话的信息tmux source-file ~/.tmux.conf: 重新加载当前的 Tmux 配置Ctrl + b:choose-buffer: 强制进入“交互选择模式”
Ctrl + b -> ?: 搜索查找快捷键Ctrl + b -> :: Prompt for a commandCtrl + b -> m: Mark Pane
# session window pane的布局的保存及恢复
# tmux-resurrect 插件(最强大、跨重启)
实现的效果:能保存所有会话、窗口、窗格、布局、每个窗格的目录、运行程序、激活状态。重启电脑也能恢复
- 安装(用 TPM 插件管理器)
# 1. 安装 TPM
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
# 2. 加到 ~/.tmux.conf 底部
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'
# 3. 安装插件
tmux source ~/.tmux.conf
# 按 Ctrl+b I (大写i)安装
2
3
4
5
6
7
8
9
10
11
12
13
- 使用
- 保存:
Ctrl+b Ctrl+S - 恢复:
Ctrl+b Ctrl+R - 保存目录:
~/.tmux/resurrect/
# tmuxp(配置文件式,适合项目化)
- 用 YAML 定义固定工作区,每次一键加载。
pip install tmuxp
- 示例 workspace.yaml:
session_name: dev
windows:
- window_name: editor
layout: main-horizontal
panes:
- shell_command: [cd ~/code, vim]
- shell_command: [cd ~/code, npm run dev]
- window_name: logs
panes:
- shell_command: [tail -f /var/log/syslog]
2
3
4
5
6
7
8
9
10
- 使用
tmuxp load workspace.yaml
# 查找快捷键的技巧
# 查找窗口相关的快捷键
# 查找 window 相关的快捷键,并拷贝到剪切板。 pbcopy 为mac专用
tmux list-keys | grep "bind-key.*-window" | pbcopy
2
# tmux 状态栏深度集成
- 让 tmux 状态栏实时显示 AI 总结的任务提醒、甚至是你关注的能源市场实时行情. 例子如下
# 设置状态栏更新频率(秒)
set -g status-interval 60
# 定制右侧状态栏
# #[fg=cyan] 是颜色标签,#(python3 ~/.tmux/energy_monitor.py) 是执行脚本
set -g status-right-length 150
set -g status-right "#[fg=black] 🔋 AI Task: Coding... #[fg=yellow] | #(python3 ~/.tmux/energy_monitor.py) #[fg=white] | %H:%M "
2
3
4
5
6
7
# Tmux 插件管理
# 序列化和反序列化实操
默认情况下,Tmux 是不支持持久化(序列化到磁盘)的。Tmux 采用的是典型的 C/S(客户端/服务器)架构,所有的会话信息都保存在内存中的 tmux server 进程里。一旦电脑重启,内存清空,会话自然就丢失了。
安装 TPM 首先,你需要把 TPM 克隆到本地。这是所有插件的“管家”。
# 在终端执行 git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm1
2配置
.tmux.conf你需要编辑 Tmux 的配置文件(通常是
~/.tmux.conf,如果没有就创建一个)。将以下内容粘贴到文件末尾:# --- 插件管理配置 --- # 1. 声明插件管理器本身 set -g @plugin 'tmux-plugins/tpm' # 2. 添加 Resurrect 插件:核心功能是手动保存/恢复 set -g @plugin 'tmux-plugins/tmux-resurrect' # 3. 添加 Continuum 插件:核心功能是自动备份和开机自启恢复 set -g @plugin 'tmux-plugins/tmux-continuum' # --- 插件自定义设置 --- # 启用自动恢复功能(重启后第一次打开 tmux 自动加载上次保存的布局) set -g @continuum-restore 'on' # (可选) 如果你只想保存布局,不希望恢复上次运行的命令,可以确保不开启高级程序恢复 # 默认情况下,它只会记录窗口、面板的比例、路径和布局位置 # 初始化 TPM (这行必须放在配置文件的最底部) run '~/.tmux/plugins/tpm/tpm'1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21在 Tmux 中安装插件
配置写好后,并不会立即生效。你需要按照以下步骤操作:
- 如果你已经在某个 Tmux session 中,按下
Ctrl + B,然后按冒号:进入命令模式,输入source ~/.tmux.conf并回车。 - 执行安装:按下组合键
Ctrl + B(Prefix),紧接着按大写的I(Install)。 - 你会看到终端下方弹出一个提示,显示正在克隆插件。完成后,按下回车即可。
- 如果你已经在某个 Tmux session 中,按下
如何使用(序列化与反序列化)
虽然你开启了
continuum-restore 'on'会自动处理,但手动操作的快捷键必须掌握,以防万一:- 手动序列化 (保存布局):
按下
Prefix(Ctrl + B) +Ctrl + s。 底部状态栏会显示 "Saved !",此时所有窗口、面板的布局已写入磁盘。 - 手动反序列化 (恢复布局):
按下
Prefix(Ctrl + B) +Ctrl + r。 Tmux 会像电影回放一样,自动根据记录的元数据重新 split 窗口并进入相应的目录。
- 手动序列化 (保存布局):
按下
提示:布局保存的位置
Resurrect 会将你的布局序列化为文本文件,存储在:
~/.tmux/resurrect/你可以进入这个目录看到一系列
.txt文件,里面记录的就是你要求的 session、window、pane 的坐标和当前工作路径。即使电脑彻底断电,只要这些文件在,环境就能“原地复活”。
# 疑难杂症
# 鼠标滚动问题
- 现象描述 在 tmux 分屏状态下,滚动鼠标会导致整个终端界面(包括分屏线和所有窗格)像网页一样整体位移,导致分屏布局错乱,无法正常查看上方历史日志。
- 核心原因 终端软件拦截信号:iTerm2/Terminal 默认滚动的是自身的“回滚缓冲区”,而不是将信号传递给 tmux 内部处理。
- 解决方案
3.1 修改 ~/.tmux.conf 配置
添加以下代码,强制让 tmux 捕获鼠标信号并精准分发给当前光标下的窗格:
# 1. 开启鼠标模式(点击、滚动、调整大小的总开关)
set -g mouse on
# 2. 拦截滚轮信号:确保滚动只触发“进入复制模式并翻页”,而不移动整个终端界面
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -F '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"
# 3. 禁用鼠标拖拽调整分屏大小,防止滚动时误触导致分屏线移位
unbind -n MouseDrag1Border
unbind -n MouseDrag1Pane
2
3
4
5
6
7
8
9
3.2 配置 iTerm2 进阶设置 (macOS)
- 打开 iTerm2 Settings -> Advanced。
- 搜索 Scroll。
- 找到 "Scroll wheel sends arrow keys in alternate screen mode",将其设置为 Yes
3.3 生效验证
- 生效: 执行
tmux source ~/.tmux.conf并重启 iTerm2。 - 验证: 滚动鼠标时,观察窗口右侧系统滚动条是否不动,且当前窗格右上角出现 [0/xxx] 翻页字样。
3.4 常用技巧
- 退出滚动模式:按 q 或 Enter 回到实时终端。
- 强制滚动终端:若需滚动终端本身的缓冲区,可按住 Option (或 Shift) 键再滚动。
# 鼠标选择与复制问题
- 现象:开启鼠标模式后,无法直接用鼠标选择文字进行系统复制,或者选择后黄色高亮立即消失。
- 临时方案:按住
Option键不放,再用鼠标划选(强制使用终端原生选择)。 - 永久方案:在
.tmux.conf中配置MouseDragEnd1Pane调用pbcopy。
# 鼠标拖拽选择松开后,自动同步到系统剪贴板
bind -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "pbcopy"
2
# link
- 02
- VisiData 终极生存指南(vd)04-27
- 03
- macOS 定时任务实现:Git 仓库状态自动同步方案04-26