Jacky's blog
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)
  • shell

  • tool

    • mac 百问记录
    • mac tool
    • tmux
      • 基础概念
        • 变量
      • 优点
      • 核心概念
        • 会话(session)
        • 窗口管理(window)
        • 窗格(pane)
      • 3 操作
        • 3.1 Buffer
        • 3.1.1 buffer相关的快捷键
        • 3.1.2 编辑buffer
        • 配置文件
        • 配置鼠标获取焦点
        • 新建窗格自动继承当前目录
        • tumux中的copy问题
        • 分屏快捷键的修改
        • 其他命令
        • session window pane的布局的保存及恢复
        • tmux-resurrect 插件(最强大、跨重启)
        • tmuxp(配置文件式,适合项目化)
        • 查找快捷键的技巧
        • 查找窗口相关的快捷键
        • tmux 状态栏深度集成
      • Tmux 插件管理
        • 序列化和反序列化实操
      • 疑难杂症
        • 鼠标滚动问题
        • 鼠标选择与复制问题
      • link
    • c tool
    • platform
    • VisiData 终极生存指南(vd)
    • dev tool
    • java tool
    • IDEA
    • vscode
    • Docker 使用指南
    • unbuntuOnWindows
    • oh-my-zsh
    • github
    • lldb
    • ripgrep 高性能文本搜索工具使用指南
    • appium
    • mvn
    • ffmpeg
    • gradle
    • git 使用指南
    • jenv
    • php-fpm
    • raycast
    • Vim 编辑器入门指南
    • jadx
    • excalidraw 入门指南
    • whimsical 入门指南
    • mermaid 入门指南
  • 网络

  • compute_base

  • blog

  • growth

  • java

  • C&C++

  • ai

  • secure

  • cms

  • english

  • 生活

  • 金融学

  • more

  • other
  • tool
Jacky
2026-03-30
目录

tmux

Tmux 是一个终端复用器(terminal multiplexer),非常有用,属于常用的开发工具。

# 基础概念

tmux 的核心是三级嵌套结构:会话(Session) > 窗口(Window) > 窗格(Pane)。会话是顶层容器与持久化单元,窗口是会话内的标签页 / 工作区,窗格是窗口内的分屏。

  1. 会话(Session)

本质:tmux 最顶层的独立工作区/项目容器,是进程与状态的持久化核心载体。

核心特性:

  • 支持后台独立运行(detach 操作),关闭终端、断开 SSH 连接,均不影响会话内正在运行的任务。

  • 可随时重新接入(attach 操作),一键恢复完整工作现场,无需重新启动任务。

  • 一个会话可包含多个窗口,不同会话的运行环境完全隔离,互不干扰。

类比:一个独立的项目文件夹,或一间专属的工作房间,所有相关操作都在这个空间内完成。

  1. 窗口(Window)

本质:隶属于会话的全屏工作标签页,默认占据整个终端屏幕,是会话内的任务分类单元。

核心特性:

  • 一个会话可创建多个窗口,支持快速切换(类似浏览器标签页切换逻辑),提升同项目内多任务效率。

  • 每个窗口可进一步分割为多个窗格(Pane),实现单屏幕多终端并行操作。

  • 窗口具有强依附性,仅属于某一个会话,无法跨会话独立存在,会话关闭则其下所有窗口同步关闭。

类比:浏览器的标签页,或工作房间里的一张桌子,每张桌子(窗口)可承载不同的具体任务。

  1. 层级关系(一句话总结)

核心层级:会话(项目) → 窗口(标签页) → 窗格(分屏)

  • 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(之前复制过好几次),你可以通过交互界面进入:

  1. 按下 Prefix + # (列出所有 buffer)。
  2. 虽然这里不能直接编辑文字,但你可以按 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!"
1
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}"
1
2
3
4
5
6

# tumux中的copy问题

问题描述: 选中字符会自动取消选择.

原因分析:

  1. Buffer 机制: tmux 默认将选中内容存入内建 Buffer 栈。高亮消失意味着“复制已完成并退出模式”。
  2. 设计哲学: 鼓励全键盘操作(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
1
2
3
4
5

配置完成后记得执行 tmux source-file ~/.tmux.conf

# 分屏快捷键的修改

  1. 左右分屏 (Vertical Layout), 并保持当前路径

    • bind v split-window -h -c "#{pane_current_path}"
    • 理解:用 v 代表 Vertical 布局,对应原生的 Ctrl + b -> %。
  2. 上下分屏 (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 command
  • Ctrl + b -> m: Mark Pane

# session window pane的布局的保存及恢复

# tmux-resurrect 插件(最强大、跨重启)

实现的效果:能保存所有会话、窗口、窗格、布局、每个窗格的目录、运行程序、激活状态。重启电脑也能恢复

  1. 安装(用 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)安装
1
2
3
4
5
6
7
8
9
10
11
12
13
  1. 使用
  • 保存:Ctrl+b Ctrl+S
  • 恢复:Ctrl+b Ctrl+R
  • 保存目录:~/.tmux/resurrect/

# tmuxp(配置文件式,适合项目化)

  1. 用 YAML 定义固定工作区,每次一键加载。
pip install tmuxp
1
  1. 示例 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]
1
2
3
4
5
6
7
8
9
10
  1. 使用 tmuxp load workspace.yaml

# 查找快捷键的技巧

# 查找窗口相关的快捷键

# 查找 window 相关的快捷键,并拷贝到剪切板。 pbcopy 为mac专用
tmux list-keys | grep "bind-key.*-window" | pbcopy
1
2

# tmux 状态栏深度集成

  1. 让 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 "
1
2
3
4
5
6
7

# Tmux 插件管理

# 序列化和反序列化实操

默认情况下,Tmux 是不支持持久化(序列化到磁盘)的。Tmux 采用的是典型的 C/S(客户端/服务器)架构,所有的会话信息都保存在内存中的 tmux server 进程里。一旦电脑重启,内存清空,会话自然就丢失了。

  1. 安装 TPM 首先,你需要把 TPM 克隆到本地。这是所有插件的“管家”。

    # 在终端执行
    git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
    
    1
    2
  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
  3. 在 Tmux 中安装插件

    配置写好后,并不会立即生效。你需要按照以下步骤操作:

    1. 如果你已经在某个 Tmux session 中,按下 Ctrl + B,然后按冒号 : 进入命令模式,输入 source ~/.tmux.conf 并回车。
    2. 执行安装:按下组合键 Ctrl + B (Prefix),紧接着按大写的 I (Install)。
    3. 你会看到终端下方弹出一个提示,显示正在克隆插件。完成后,按下回车即可。
  4. 如何使用(序列化与反序列化)

    虽然你开启了 continuum-restore 'on' 会自动处理,但手动操作的快捷键必须掌握,以防万一:

    • 手动序列化 (保存布局): 按下 Prefix (Ctrl + B) + Ctrl + s。 底部状态栏会显示 "Saved !",此时所有窗口、面板的布局已写入磁盘。
    • 手动反序列化 (恢复布局): 按下 Prefix (Ctrl + B) + Ctrl + r。 Tmux 会像电影回放一样,自动根据记录的元数据重新 split 窗口并进入相应的目录。
  5. 提示:布局保存的位置

    Resurrect 会将你的布局序列化为文本文件,存储在: ~/.tmux/resurrect/

    你可以进入这个目录看到一系列 .txt 文件,里面记录的就是你要求的 session、window、pane 的坐标和当前工作路径。即使电脑彻底断电,只要这些文件在,环境就能“原地复活”。

# 疑难杂症

# 鼠标滚动问题

  1. 现象描述 在 tmux 分屏状态下,滚动鼠标会导致整个终端界面(包括分屏线和所有窗格)像网页一样整体位移,导致分屏布局错乱,无法正常查看上方历史日志。
  2. 核心原因 终端软件拦截信号:iTerm2/Terminal 默认滚动的是自身的“回滚缓冲区”,而不是将信号传递给 tmux 内部处理。
  3. 解决方案

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
1
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"
1
2

# link

  • Tmux 使用教程 (opens new window)
上次更新: 2026/05/02, 10:00:28
mac tool
c tool

← mac tool c tool→

最近更新
01
Android 端口转发(Forward & Reverse) 的实操与避坑全指南
04-29
02
VisiData 终极生存指南(vd)
04-27
03
macOS 定时任务实现:Git 仓库状态自动同步方案
04-26
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式