深色模式
tmux 使用入门
概述
tmux 是终端复用工具,可以在一个终端中管理多个会话、窗口和面板。它采用客户端与服务端结构,因此关闭终端或断开 SSH 后,已经启动的 shell 和其他命令行进程仍可继续运行。
与终端的关系
tmux 本身既不是终端模拟器,也不是 shell。终端模拟器负责显示文字和接收按键,shell 负责解释并执行命令;tmux 位于两者之间,负责转发输入输出并管理多个 shell 或命令行进程。
终端断开时,客户端连接随之结束,但 tmux 服务和它管理的进程仍在后台运行。再次执行 tmux attach 会创建新的客户端连接,并恢复原来的终端界面。
安装
使用 Homebrew 安装:
sh
brew install tmux安装后查看版本:
sh
tmux -V结构
一个 tmux 服务可以管理多个会话;每个会话包含多个窗口,每个窗口又可以拆分为多个面板。
Server:tmux后台服务,负责保存所有会话状态。Session:会话,通常对应一个项目、一次远程登录或一组长期任务。Window:窗口,类似终端里的标签页。Pane:面板,一个窗口里的分屏区域。
一个常见安排是:一个项目对应一个 session,里面开几个 window,每个 window 再按需要拆成多个 pane。例如 dev 会话里放 editor、server、logs 三个窗口,server 窗口再分出前端服务和后端服务两个面板。
通用
tmux 默认前缀键是 Ctrl + b,下文用 Prefix 表示。以 Prefix + d 为例,需要先按下 Ctrl + b,松开后再按 d,并非同时按下三个键。
查看与控制
快捷键列表用于检查当前绑定,命令输入栏则可以直接执行 tmux 命令。通过 Prefix + : 执行命令时,需要去掉开头的 tmux。
| 快捷键 | 作用 |
|---|---|
Prefix + ? | 打开快捷键列表 |
Prefix + : | 打开命令输入栏 |
Prefix + t | 显示时钟 |
kill-server 会关闭整个服务并结束所有会话里的进程,执行前要确认没有正在运行的任务。
查看与控制命令
| 命令 | 作用 |
|---|---|
tmux list-keys | 查看当前快捷键绑定 |
tmux show-options -g | 查看全局选项 |
tmux show-window-options -g | 查看全局窗口选项 |
tmux source-file ~/.tmux.conf | 重新加载配置文件 |
tmux kill-server | 关闭整个服务和所有会话 |
复制与粘贴
终端里的复制有两套体系:终端模拟器自己的复制,以及 tmux 的复制模式。远程服务器、滚屏历史和鼠标操作混在一起时,tmux 的复制模式更稳定。
| 快捷键 | 作用 |
|---|---|
Prefix + [ | 进入复制模式 |
Prefix + ] | 粘贴 tmux 缓冲区的内容 |
复制模式中按 q | 退出复制模式 |
复制模式中按 g | 跳到历史开头,需开启 vi 模式 |
复制模式中按 G | 跳到历史末尾,需开启 vi 模式 |
复制模式中按 / | 向后搜索,需开启 vi 模式 |
复制模式中按 ? | 向前搜索,需开启 vi 模式 |
复制模式中按 Space | 开始选择文本,需开启 vi 模式 |
复制模式中按 Enter | 复制选中的文本,需开启 vi 模式 |
只想查看历史输出时,按 Prefix + [ 进入复制模式,然后用方向键、PageUp、PageDown 滚动;按 q 回到普通终端。
复制模式配置
开启 vi 风格复制模式需要在 ~/.tmux.conf 中加入:
text
setw -g mode-keys vi会话(Session)
会话通常对应一个项目、一次远程登录或一组长期任务。会话可以与当前终端分离,其中的进程仍会继续运行。
创建与命名
会话通常在普通终端中创建,没有默认的 Prefix 快捷键。进入会话后,可以用 Prefix + $ 修改当前会话名称。
| 快捷键 | 作用 |
|---|---|
Prefix + $ | 重命名当前会话 |
创建与命名命令
| 命令 | 作用 |
|---|---|
tmux | 创建并进入一个默认会话 |
tmux new -s dev | 创建并进入名为 dev 的会话 |
tmux new -s dev -d | 在后台创建名为 dev 的会话 |
tmux rename-session -t dev api | 把 dev 会话改名为 api |
创建会话时,可以同时指定初始窗口和要执行的命令:
sh
tmux new -s blog -n server 'pnpm run dev'这个命令会创建 blog 会话和名为 server 的窗口,并在窗口中执行 pnpm run dev。
进入与切换
Prefix + s 打开树形选择器,适合按名称或预览定位会话;前后切换则可以直接使用 Prefix + ( 和 Prefix + )。会话不能像窗口一样移动到固定位置,选择器中的 O 和 r 只改变显示顺序。
| 快捷键 | 作用 |
|---|---|
Prefix + s | 打开会话选择器 |
Prefix + ( | 切换到上一个会话 |
Prefix + ) | 切换到下一个会话 |
Prefix + L | 切换到上次使用的会话 |
Prefix + s,然后按 O | 切换会话选择器的排序方式 |
Prefix + s,然后按 r | 反转会话选择器的当前顺序 |
进入与切换命令
| 命令 | 作用 |
|---|---|
tmux ls | 查看所有会话 |
tmux attach -t dev | 进入 dev 会话 |
tmux a -t dev | attach 的简写形式 |
tmux switch-client -t dev | 在 tmux 内切换到 dev 会话 |
tmux ls -O name | 按名称列出会话 |
tmux ls -O creation | 按创建时间列出会话 |
tmux ls -O activity | 按最近活动时间列出会话 |
tmux ls -O name -r | 按名称倒序列出会话 |
tmux switch-client -n -O name | 按名称切换到下一个会话 |
tmux switch-client -p -O activity | 按活动时间切换到上一个会话 |
list-sessions -O 支持 index、name、creation 和 activity,-r 用于反转列表顺序。这些参数只影响当前命令的结果。
分离与关闭
分离会话只会断开当前客户端,其中的进程仍会继续运行。关闭会话会结束其中的所有窗口和进程,操作前需要确认目标无误。
| 快捷键 | 作用 |
|---|---|
Prefix + d | 分离当前会话 |
Prefix + s,选中会话后按 x | 关闭选中的会话 |
退出当前 shell 会结束对应面板。只想离开 tmux 并保留进程,应使用 Prefix + d。
分离与关闭命令
| 命令 | 作用 |
|---|---|
tmux detach-client | 分离当前客户端 |
tmux kill-session -t dev | 关闭 dev 会话 |
窗口(Window)
窗口适合按任务拆分,例如编辑、服务、日志和数据库控制台。相关命令通常在 tmux 会话内执行;如果在会话外执行,涉及当前对象的命令需要用 -t 指定目标。
创建与重命名
新窗口会在当前会话中创建,窗口名称可以随时修改。状态栏空间有限,名称保持简短更容易辨认。
| 快捷键 | 作用 |
|---|---|
Prefix + c | 创建新窗口 |
Prefix + , | 重命名当前窗口 |
创建与重命名命令
| 命令 | 作用 |
|---|---|
tmux new-window -n logs | 新建名为 logs 的窗口 |
tmux rename-window api | 把当前窗口重命名为 api |
切换与排序
编号明确时可以直接跳转,不确定目标编号时则使用窗口选择器。选择器中的 O 和 r 只改变列表的显示顺序,不会移动窗口。
| 快捷键 | 作用 |
|---|---|
Prefix + w | 打开窗口选择器 |
Prefix + 0 到 Prefix + 9 | 切换到指定编号的窗口 |
Prefix + n | 切换到下一个窗口 |
Prefix + p | 切换到上一个窗口 |
Prefix + l | 切换到上次使用的窗口 |
Prefix + w,然后按 O | 切换窗口选择器的排序方式 |
Prefix + w,然后按 r | 反转窗口选择器的当前顺序 |
切换与排序命令
| 命令 | 作用 |
|---|---|
tmux list-windows | 查看当前会话的窗口 |
tmux select-window -t 1 | 切换到编号为 1 的窗口 |
tmux list-windows -O name | 按名称列出窗口 |
tmux list-windows -O activity | 按最近活动时间列出窗口 |
list-windows -O 只改变命令输出,可以使用 index、name、size、creation 或 activity 作为排序依据。
移动与重编号
窗口在状态栏中的实际顺序由编号决定。按 Prefix + . 会打开编号输入栏,输入空闲编号并按 Enter 即可移动当前窗口;目标编号已被占用时会出现 index in use。
| 快捷键 | 作用 |
|---|---|
Prefix + . | 输入新编号并移动当前窗口 |
移动与重编号命令
| 命令 | 作用 |
|---|---|
tmux move-window -t :3 | 把当前窗口移动到空闲的 3 号位置 |
tmux move-window -s :5 -t :3 | 把 5 号窗口移动到空闲的 3 号位置 |
tmux swap-window -t :3 | 交换当前窗口与 3 号窗口 |
tmux swap-window -s :2 -t :5 | 交换 2 号与 5 号窗口 |
tmux swap-window -t :- | 与前一个编号的窗口交换 |
tmux swap-window -t :+ | 与后一个编号的窗口交换 |
tmux move-window -b -t :3 | 把当前窗口插入 3 号窗口之前 |
tmux move-window -a -t :3 | 把当前窗口插入 3 号窗口之后 |
tmux move-window -r | 从 base-index 开始连续重编号 |
也可以在 ~/.tmux.conf 中开启自动重编号,让窗口关闭后立即整理编号:
text
set -g renumber-windows onmove-window -r 和 renumber-windows 只消除编号空缺,不会按窗口名称、创建时间或活跃时间重排。
关闭
Prefix + & 关闭当前窗口。需要关闭其他窗口时,可以在选择器中定位目标后按 x。
| 快捷键 | 作用 |
|---|---|
Prefix + & | 关闭当前窗口 |
Prefix + w,选中窗口后按 x | 关闭选中的窗口 |
关闭窗口命令
| 命令 | 作用 |
|---|---|
tmux kill-window | 关闭当前窗口 |
面板(Pane)
面板用于在同一个窗口内分屏。开发服务、日志输出、临时命令可以放在同一屏里观察。面板操作通常在 tmux 会话内完成。
分割
左右分屏使用 %,上下分屏使用 "。这两个按键都需要先按 Prefix。
| 快捷键 | 作用 |
|---|---|
Prefix + % | 左右分割当前面板 |
Prefix + " | 上下分割当前面板 |
分割面板命令
| 命令 | 作用 |
|---|---|
tmux split-window -h | 左右分屏 |
tmux split-window -v | 上下分屏 |
tmux split-window -h -p 30 | 在右侧分出约 30% 宽度的面板 |
-h 和 -v 容易记反:-h 表示水平排列面板,所以看到的是左右分屏;-v 表示垂直排列面板,所以看到的是上下分屏。
切换与查看
方向明确时可以直接切换到相邻面板。面板较多时,先显示编号或暂时放大当前面板更容易定位内容。
| 快捷键 | 作用 |
|---|---|
Prefix + 方向键 | 切换到相邻面板 |
Prefix + o | 切换到下一个面板 |
Prefix + ; | 切换到上次使用的面板 |
Prefix + q | 显示各面板的编号 |
Prefix + z | 最大化或还原当前面板 |
Prefix + w,展开窗口后按 O | 切换面板列表的排序方式 |
Prefix + w,展开窗口后按 r | 反转面板列表的当前顺序 |
树形选择器中的 O 和 r 只改变面板列表的显示顺序,不会改变面板布局。
切换与查看命令
| 命令 | 作用 |
|---|---|
tmux select-pane -L | 聚焦左侧面板 |
tmux select-pane -R | 聚焦右侧面板 |
tmux select-pane -U | 聚焦上方面板 |
tmux select-pane -D | 聚焦下方面板 |
tmux resize-pane -Z | 最大化或还原当前面板 |
尺寸与布局
面板可以按方向调整尺寸,也可以在预设布局间切换。交换操作会改变面板位置,Prefix + ! 则会把当前面板移出原窗口并创建新窗口。
| 快捷键 | 作用 |
|---|---|
Prefix + Ctrl + 方向键 | 按方向调整 1 行或 1 列 |
Prefix + Option + 方向键 | 按方向调整 5 行或 5 列 |
Prefix + Space | 切换当前窗口的面板布局 |
Prefix + { | 向前交换当前面板 |
Prefix + } | 向后交换当前面板 |
Prefix + ! | 将当前面板移至新窗口 |
在 macOS 上,Ctrl + 方向键 可能先被 Mission Control 用于切换桌面或显示窗口,终端和 tmux 因此收不到按键。Option + 方向键 是否能被识别为上述快捷键,也取决于终端如何发送 Option 键。
想保留 macOS 的系统快捷键,可以在 ~/.tmux.conf 中改用 Shift + 方向键:
text
bind -r S-Left resize-pane -L 5
bind -r S-Down resize-pane -D 5
bind -r S-Up resize-pane -U 5
bind -r S-Right resize-pane -R 5重新加载配置后,先按 Prefix,再按 Shift + 方向键 即可调整面板大小。-r 允许在短时间内连续按 Shift + 方向键,不必每次都重新输入 Prefix。
尺寸与布局命令
| 命令 | 作用 |
|---|---|
tmux resize-pane -L 5 | 当前面板向左调整 5 列 |
tmux resize-pane -D 5 | 当前面板向下调整 5 行 |
tmux select-layout tiled | 把当前窗口切换为平铺布局 |
tmux swap-pane -U | 与前一个面板交换位置 |
tmux swap-pane -D | 与后一个面板交换位置 |
tmux break-pane | 将当前面板移至新窗口 |
关闭
Prefix + x 关闭当前面板。需要关闭其他面板时,可以在树形选择器中展开窗口,选中目标后按 x。
| 快捷键 | 作用 |
|---|---|
Prefix + x | 关闭当前面板 |
Prefix + w,展开窗口并选中面板后按 x | 关闭选中的面板 |
关闭面板命令
| 命令 | 作用 |
|---|---|
tmux kill-pane | 关闭当前面板 |
基础配置
tmux 默认读取用户目录下的 ~/.tmux.conf。下面是一份偏日常使用的基础配置:
text
# 把前缀键从 Ctrl+b 改成 Ctrl+a
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# 从 1 开始编号,和多数人的视觉习惯一致
set -g base-index 1
setw -g pane-base-index 1
# 开启鼠标选择窗口、面板和滚动
set -g mouse on
# 复制模式使用 vi 按键
setw -g mode-keys vi
# 更顺手的分屏快捷键
bind | split-window -h
bind - split-window -v
# 快速重载配置
bind r source-file ~/.tmux.conf \; display-message "tmux.conf reloaded"保存后,在已运行的 tmux 会话里执行:
sh
tmux source-file ~/.tmux.conf如果已经配置了 bind r ...,后续可以直接按 Prefix + r 重新加载配置。注意:如果前缀键改成了 Ctrl + a,下文里的 Prefix 就表示 Ctrl + a。
