1. 概述
  2. 使用方法

1. 概述

首先说 Tmux 的应用场景:

  1. 需要运行很多终端,如果直接建立多个终端,或者多个对服务器的连接,管理起来会很乱
  2. 需要保证一个非守护进程在终端关闭之后依旧运行(不会直接随着终端停止而停止)

也就是说需要一个对终端的管理器,也就是 Tmux

类似的工具还有 screen,其也确实可以解决上述问题
但是 Tmux 支持划分一个窗口为多个 panel,使得同时处理多个终端.
而 screen 不支持(所以不够 zhuangbi).

放一张网上的效果图吧(其实并没有这么拉风哈哈哈哈)

2. 使用方法

比较好的教程

Tmux 使用手册 | 路易斯的博客(非常详细,甚至有点过于复杂,基于 github pages 搭建,需要梯子)
手把手教你使用终端复用神器 Tmux | PegasusWang | 知乎(腾讯大佬写的,比较基础,有视频教程)

网上的教程比较多,所以仅进行简单的总结,更加细节的操作可以参考其他教程(比如第一个推荐教程)和 man 手册

2.1 基本概念

Tmux 使用 C/S 模型构建,也就是说 Tmux 本身是一个本地服务器
也就是说在输入 tmux 命令之后,Tmux 会建立一个服务器

Tmux 对终端的管理分为三级:

  1. session: 一个会话就是一个连接,即一个真实终端连接的目标单位
  2. windows: 每个会话中会有很多 windows,窗口是显式的基本单位(真实终端必须显示一个且只能显示一个 windows)
  3. panel: 每个 windows 可以切分为多个 panel,panel 中为一个被管理的终端

示意图如下,图片来源: 手把手教你使用终端复用神器 Tmux

我们用可以使用 Tmux 建立 session/windows/panel 并启动不同的服务
在断开服务器或者暂时离开的时候,将其离线(detach)
此时这些服务并没有停止,通过重新连接(attach)就可以重新恢复环境
这些服务没有停止也就是说启动的服务依旧在服务器上运行

2.2 基本操作

2.2.1 基本操作

Tmux 有两种操作方式:

  1. 命令操作:
    如果能接触到 bash,可以直接输命令
    如果不能,可以先进入 tmux 命令提示符模式 (tmux-prefix+:)
    命令操作即通过标准的 Tmux 命令进行操作
  2. 快捷键:
    任何时候都能操作
    首先输入 tmux-prefix(默认为 ctrl-b),表明接下来的输入是快捷键
    然后输入快捷键

命令操作说明:

tmux 命令很长…
但是有很多命令都有别名
此外很方便的一点是,只要输入的字符足以确定是哪个命令
tmux 就可以自动执行,而不必输入完整的命令

如下 l 开头的命令有很多
其各自有自己的缩写形式

在输入部分不足以确定命令的时候会报错(有歧义的命令)
输入完整命令的一部分和缩写都可以执行命令

快捷键操作说明:

ctrl-b 表示按下 ctrl 的同时按下 b
ctrl-b d 表示按下 ctrl 的同时按下 b,然后全部松开,然后按下 d
ctrl-b ctrl-x 表示按下 ctrl 的同时按下 b,然后全部松开,然后按下 ctrl 的同时按下 x

2.2.2 session 级操作

session 是真实终端进行连接的单位,一个真实终端同一时间只能连接一个 session

  1. 建立新的 session(并连接)

    session 有具名 session 和匿名 session 两种
    匿名 session 仅可以通过其被分配的默认的编号来操作(从 0 开始)
    具名 session 可以使用其名字来操作

    1
    2
    3
    4
    5
    6
    # 建立匿名session并连接
    tmux new
    # 建立具名session并连接
    tmux new -s name
    # 建立session命令完整参数
    # 就像开头说的,具体各参数的含义可以参考man手册和其他教程,这里只做简单总结
  2. 连接已有 session

    连接 session 时基本都连具名 session,也就需要输入名字
    session 名字和命令一样,也可以只输一部分,但必须足以确认 session 是哪一个

    1
    2
    3
    4
    5
    6
    # 连接具名session
    tmux attach -t name
    # 连接匿名session
    tmux attach -t 分配的编号
    (tmux a会连到不知道哪里去,可能是最近使用的吧,懒得试了,最好 加上-t参数)
    # 完整命令见man手册
  3. 从 session 中退出来

    1
    2
    3
    4
    5
    6
    # 使用命令退出
    tmux detach
    # 使用快捷键退出(默认情况的快捷键,下面不再重复此说明)
    ctrl-b d
    # 暂时离开式退出,输入fg命令可以直接返回当前session
    ctrl-b c-z
  4. 删除 session

    1
    tmux kill-session -t name/默认分配的编号
  5. 查看所有 session

    1
    2
    3
    4
    # 使用命令
    tmux ls
    # 使用快捷键(必须已经在一个session中的终端中)
    ctrl-b s
  6. 测试是否有某个 session

    1
    tmux has -t name/默认分配的编号
  7. 在 session 中切换至其他 session

    1
    2
    3
    4
    # 使用快捷键(必须已经在一个session中的终端中)
    ctrl-b s
    # 然后使用上下方向键选中session,enter切换
    # 在选择界面,左右方向键可以展开合并该session下的windows 列表以选择进入哪一个windows

    2.2.3 windows 级操作

_windows 是真实终端显示的单位,一个真实终端同一时间必须且只能显示一个 windows_

  1. 新建 window

    1
    2
    3
    4
    5
    # 在建立新session的时候会自动创建一个windows
    # 在-n参数后面可以对其命名
    tmux new -s session -n name
    # 在session中新建windows
    ctrl-b c
  2. 关闭 windows

    1
    2
    # 需要输入y/n进行确认
    ctrl-b &
  3. 切换 window

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 切换至上一个窗口
    ctrl-b p
    # 切换至下一个窗口
    ctrl-b n
    # 切换至指定编号窗口
    ctrl-b [0-9]
    # 打开窗口列表进行选择
    ctrl-b w
    # 通过名字快速定位到指定窗口
    ctrl-b f
  4. 重命名 window

    1
    ctrl-b ,
  5. 重编号 window

    1
    ctrl-b .

    2.2.4 panel 级操作

_panel 是被控制终端的单位,每个 panel 内有一个被控制的终端_

  1. 创建 panel

    1
    2
    3
    4
    # 上下切分panel
    ctrl-b "
    # 左右切分panel
    ctrl-b %
  2. 删除 panel

    1
    ctrl-b x
  3. 布局 panel

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 最大化当前panel,重复输入后还原
    ctrl-b z
    # 把当前panel创建为新windows
    ctrl-b !
    # 向前置换panel
    ctrl-b {
    # 向后置换panel
    ctrl-b }
    # 顺时针旋转所有panel
    ctrl-b ctrl-o
    # 在自带布局中循环
    ctrl-b space
    # 以5个单元格为单位调整边框
    ctrl-b alt-方向键
    # 以一个单元格为单位 调整边框
    ctrl-b ctrl-方向键
    ```

  4. 切换 panel

    1
    2
    3
    4
    5
    6
    7
    8
    # 切换至最后使用的panel
    ctrl-b ;
    # 显示所有panel编号,在编号消失前输入编号可以切换panel
    ctrl-b q
    # 切换至下一panel
    ctrl-b o
    # 切换panel
    ctrl-b 方向键

    2.3 定制化 Tmux

2.3.1 自己配置

懒得写了,详细请参考

Tmux 使用手册 | 路易斯
的博客

tmux: Productive Mouse-Free Development

2.3.2 使用开源配置文件

或者使用大佬配置好的配置文件[.tmux | github]
但是建议先看一下自己配置的教程,了解哪些东西可以被配置,可以怎么改动

同时有一个需要注意的点:

大佬文件中把 ctrl-a 绑定为第二 prefix,这和终端中的全选冲突(可以通过设置把终端中的热键关闭)
同时如果键盘有 CapsLk-Ctrl 互换功能,那自然是极爽的,如果没有,可以手动把 CapsLk-a 作为第二 prefix

快捷键 功能
prefix e 编辑配置文件
prefix r 重新加载配置
C-l 清空屏幕和 tmux 历史
prefix C-c 创建一个新 session
prefix C-f 根据名字快速切换 session
prefix C-h 切换至左 windows
prefix C-l 切换至右 windows
prefix Tab 切换至最近使用 windows
prefix - 上下切分屏幕
prefix _ 最优切分屏幕
prefix h/j/k/l 切换 panel
prefix H/J/K/L 设置 panel 大小
prefix </> 交换 panel
prefix + 设置当前 panel 为 windows
prefix m 打开/关闭 鼠标模式
prefix Enter 进入复制模式
prefix b 列出粘贴板缓存
prefix p 粘贴粘贴板第一个缓存
prefix P 选择粘贴

粘贴模式

按键 功能
v 开始复制/可视模式
C-v 切换快可视模式与可视模式
H 跳转至行首
L 跳转至行尾
y 复制至粘贴板首
esc 放弃操作