tmux:让你的终端开挂的神器

Mistystar 发布于 21 小时前 5 次阅读


tmux:让你的终端开挂的神器

某次我在服务器上跑一个耗时很长的训练任务,SSH 连接突然断了。重新连上去一看——进程没了,几个小时白费。

那天晚上我学会了 tmux,从此再也没遇到过这个问题。今天就来聊聊这个改变了我终端使用方式的工具。

tmux 是什么?

tmux(Terminal Multiplexer),终端复用器。简单说,它做三件事:

  1. 会话保持:SSH 断了?没关系,tmux 里的程序继续跑
  2. 屏幕分割:一个终端窗口里同时看代码、跑服务、查日志
  3. 多窗口管理:像浏览器标签页一样在多个终端之间切换

如果你经常用 SSH 连服务器,或者日常开发需要同时开好几个终端,tmux 基本是必装工具。

安装

各平台安装都很简单:

# macOS
brew install tmux

# Ubuntu / Debian
sudo apt install tmux

# CentOS / RHEL
sudo yum install tmux

# Arch Linux
sudo pacman -S tmux

装完敲 tmux,看到底部出现一条绿色状态栏,就说明成功了。

三个核心概念

刚接触 tmux 的时候,我被 Session、Window、Pane 这三个概念搞晕了。后来想通了,其实很好理解:

Session(会话)
  └── Window(窗口)
        └── Pane(窗格)

用一个比喻:

  • Session = 一个项目的工作区(比如"前端开发"、"服务器运维")
  • Window = 工作区里的标签页(比如"编辑器"、"终端"、"日志")
  • Pane = 一个标签页里分割出来的小格子

我通常为每个项目开一个 Session,里面开几个 Window 分别干不同的事。

前缀键:tmux 的操作入口

tmux 的所有快捷键都需要先按一个前缀键,默认是 Ctrl + b

操作流程:先按 Ctrl + b,松手,再按功能键。

比如要新建窗口:Ctrl + b,松手,按 c

下面我用 <prefix> 表示这个前缀键。

会话管理

会话是 tmux 最核心的功能。它让你的工作环境独立于终端连接存在。

基本操作

# 新建会话(自动编号)
tmux

# 新建命名会话(推荐)
tmux new -s my-project

# 查看所有会话
tmux ls

# 连接到已有会话
tmux attach -t my-project
# 简写
tmux a -t my-project

# 销毁会话
tmux kill-session -t my-project

会话内快捷键

快捷键 功能
<prefix> d 断开当前会话(detach),会话后台继续运行
<prefix> s 列出所有会话,可以切换
<prefix> $ 重命名当前会话

我最常用的工作流:SSH 到服务器 → tmux a -t work 恢复上次的工作环境 → 干完活 <prefix> d 断开 → 关掉 SSH。下次连上来,一切还在。

窗口管理

窗口就像终端里的标签页,底部状态栏会显示所有窗口的编号和名称。

快捷键 功能
<prefix> c 新建窗口
<prefix> , 重命名当前窗口
<prefix> w 列出所有窗口(可预览和切换)
<prefix> n 切换到下一个窗口
<prefix> p 切换到上一个窗口
<prefix> 0-9 切换到指定编号的窗口
<prefix> & 关闭当前窗口(会确认)

<prefix> w 是我用得最多的,它会弹出一个可视化列表,能看到每个窗口里在跑什么,用方向键选择后回车切换。

窗格管理

窗格是 tmux 最酷的功能——把一个窗口分成多个区域,同时显示不同内容。

分割窗口

<prefix> %    # 左右分割(垂直线)
<prefix> "    # 上下分割(水平线)

我一开始老记混这两个键。后来想了个办法:% 像一条竖线把东西分成左右," 像两个点上下排列。

窗格操作

快捷键 功能
<prefix> 方向键 在窗格之间移动光标
<prefix> x 关闭当前窗格(会确认)
<prefix> z 当前窗格全屏/恢复(zoom)
<prefix> Space 切换窗格布局
<prefix> { 当前窗格向前移动
<prefix> } 当前窗格向后移动
<prefix> q 显示窗格编号,按编号可快速跳转

<prefix> z 是我的最爱。写代码的时候,日志窗格太小看不清?按一下 z 全屏查看,再按一下回到分屏。

调整窗格大小

按住 <prefix> 不放,然后按方向键可以调整窗格边界。或者用更精确的方式:

# 在 tmux 命令模式下(<prefix> : 进入)
resize-pane -D 5    # 向下扩展 5 行
resize-pane -U 5    # 向上扩展 5 行
resize-pane -L 10   # 向左扩展 10 列
resize-pane -R 10   # 向右扩展 10 列

复制模式

tmux 有自己的复制粘贴机制,刚开始我觉得很别扭,习惯之后发现比鼠标选中方便多了。

<prefix> [          # 进入复制模式
                    # 用方向键/Page Up/Page Down 浏览
Space               # 开始选择
Enter               # 复制选中内容
<prefix> ]          # 粘贴

在复制模式下可以用 vi 风格的快捷键(hjkl 移动、/ 搜索等),前提是在配置里设置了 set -g mode-keys vi

实用场景:服务器上的日志输出太快,来不及看?进入复制模式就能"暂停画面",慢慢往上翻。

我的配置推荐

tmux 的默认配置有些反人类,下面是我踩坑后总结的配置,写在 ~/.tmux.conf 里:

# 将前缀键改为 Ctrl + a(比 Ctrl + b 更顺手)
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# 用 | 和 - 分割窗口(比 % 和 " 直观)
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"

# 新窗口/窗格继承当前路径
bind c new-window -c "#{pane_current_path}"

# 用 hjkl 切换窗格(vim 风格)
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# 开启鼠标支持(可以用鼠标点击切换窗格、拖拽调整大小)
set -g mouse on

# 复制模式使用 vi 键位
setw -g mode-keys vi

# 状态栏美化
set -g status-style 'bg=#333333 fg=#ffffff'
set -g status-left '#[fg=#ffffff,bold] #S '
set -g status-right '%Y-%m-%d %H:%M '

# 窗口编号从 1 开始(0 离得太远了)
set -g base-index 1
setw -g pane-base-index 1

# 减少 ESC 延迟(对 vim 用户很重要)
set -sg escape-time 10

# 加大滚动缓冲区
set -g history-limit 50000

# 自动重新编号窗口
set -g renumber-windows on

修改后执行 tmux source-file ~/.tmux.conf 生效,或者在 tmux 内按 <prefix> : 输入 source-file ~/.tmux.conf

实战场景

场景一:远程服务器长时间任务

# SSH 到服务器
ssh user@server

# 创建会话
tmux new -s training

# 启动训练任务
python train.py --epochs 100

# 按 <prefix> d 断开,安心关掉笔记本
# 第二天回来
tmux a -t training
# 任务还在跑,输出都在

场景二:日常开发多窗格布局

tmux new -s dev

# 窗格 1:代码编辑器
vim src/app.py

# <prefix> " 上下分割
# 窗格 2:运行开发服务器
npm run dev

# <prefix> % 左右分割
# 窗格 3:Git 操作和测试
git status

最终效果:上半屏是代码编辑器,左下是开发服务器输出,右下用来跑 Git 和测试。一个终端搞定一切。

场景三:结对调试

tmux 支持多人连接同一个会话。你和同事可以同时看到、操作同一个终端:

# 你创建会话
tmux new -s debug

# 同事连接同一个会话
tmux a -t debug

# 两个人看到的是同一个画面,可以实时协作

远程结对编程的利器。

常用命令速查

# 会话
tmux new -s name        # 新建命名会话
tmux ls                 # 列出会话
tmux a -t name          # 连接会话
tmux kill-session -t name  # 销毁会话

# 在 tmux 内(都需要先按前缀键)
d                       # 断开会话
c                       # 新建窗口
,                       # 重命名窗口
n / p                   # 下/上一个窗口
%                       # 左右分割
"                       # 上下分割
方向键                   # 切换窗格
z                       # 窗格全屏/恢复
x                       # 关闭窗格
[                       # 进入复制模式

进阶:插件管理

如果你想要更丰富的功能,可以试试 TPM(Tmux Plugin Manager)

# 安装 TPM
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

~/.tmux.conf 底部添加:

# 插件列表
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-resurrect'    # 会话持久化,重启后恢复
set -g @plugin 'tmux-plugins/tmux-continuum'     # 自动保存/恢复会话
set -g @plugin 'tmux-plugins/tmux-yank'          # 系统剪贴板集成

# 初始化 TPM(放在配置文件最后)
run '~/.tmux/plugins/tpm/tpm'

tmux-resurrect 是我最推荐的插件。tmux 本身在服务器重启后会话会丢失,这个插件可以保存和恢复整个工作环境,包括窗口布局和运行的程序。

总结

tmux 的学习曲线大概长这样:

  • 第一天:觉得快捷键好多好复杂
  • 第一周:记住了 5-6 个常用操作,开始觉得方便
  • 一个月后:离不开它了

我的建议是不要试图一次学完所有快捷键。先掌握这几个就够用了:

  1. tmux new -s name / tmux a -t name — 创建和恢复会话
  2. <prefix> d — 断开会话
  3. <prefix> c / <prefix> n / <prefix> p — 窗口操作
  4. <prefix> % / <prefix> " — 分割窗格
  5. <prefix> z — 窗格全屏

用熟了这些,其他的自然会慢慢学会。


你在用 tmux 吗?有什么私藏的配置或技巧?欢迎在评论区分享。

此作者没有提供个人介绍。
最后更新于 2026-03-20