Featured image of post Tmux 使用指南

Tmux 使用指南

Tmux 是一个强大的终端复用器 (Terminal Multiplexer), 可以在一个终端窗口中管理多个会话、窗口和窗格。它广泛用于服务器开发、远程调试和多任务处理场景。

Tmux 概念和使用

为什么要使用 tmux ?

  1. 多窗口管理: 在一个终端中打开多个窗口, 无需频繁切换标签或新建终端
  2. 会话持久化: 即使网络连接断开, Tmux 会话仍然保持, 重新连接后可以继续工作
  3. 分屏操作: 支持在一个窗口中分割多个区域, 每个区域独立运行命令
  4. 快捷键高效操作: 丰富的快捷键大幅提升工作效率
  5. 可定制性强: 通过配置文件 (如 ~/.tmux.conf) 调整功能和键位

核心概念

  1. 会话 (Session)

    • 一个 Tmux 会话包含多个窗口
    • 会话可以长期存在, 即使与服务器的连接断开, 会话依然会在后台运行
    • 可以随时分离会话, 并在以后通过 tmux attach 命令重新连接, 恢复工作区的状态
    • 支持同时管理多个会话, 可以轻松切换和重命名会话
  2. 窗口 (Window)

    • 每个会话可以包含多个窗口, 类似于标签页
  3. 窗格 (Pane)

    • 窗口内可以划分为多个窗格, 每个窗格独立运行各种命令

Sessions_windows_panes.png

查看 tmux 版本

CentOS 7 中版本是 1.8

$ tmux -V
tmux 1.8

前缀键

Tmux 中有大量的快捷键, 这些快捷键都需要通过前缀键唤起。默认的前缀键是 Ctrl+b, 即按下 Ctrl+b 后, 接着按下相应的快捷键才能执行操作。

举例来说, 帮助命令的快捷键是 Ctrl+b ?。它的用法是, 在 Tmux 窗口中, 先按下 Ctrl+b , 再按下 ? , 就会显示帮助信息。然后, 按下 ESC 键或 q 键, 就可以退出帮助。

如果你更喜欢使用 Ctrl+a 作为前缀键, 可以通过修改 ~/.tmux.conf 配置文件来实现

# remap prefix to Control + a
set -g prefix C-a
# bind 'C-a C-a' to type 'C-a'
bind C-a send-prefix
unbind C-b

常用快捷键

快捷键 功能
Ctrl+b c 新建窗口
Ctrl+b % 窗口左右分割
Ctrl+b " 窗口上下分割
Ctrl+b d 分离当前会话
Ctrl+b s 列出所有会话
Ctrl+b w 列出所有窗口
Ctrl+b [方向键] 在窗格间切换
Ctrl+b x 关闭当前窗格
Ctrl+b z 当前窗格全屏/恢复
Ctrl+b ? 查看所有快捷键

tmux Common commands

会话管理

新建会话

在 Tmux 中, 第一个启动的会话编号为 0, 第二个为 1, 以此类推。

使用编号区分会话, 不太直观, 为了更方便区分不同的会话, 可以为会话指定名称。

tmux

# 新建一个指定名称的会话
tmux new -s <session-name>

# 启动新会话
Ctrl+b :new<回车>

列出所有会话

快捷键

  • Ctrl+b s: 列出所有会话

查看当前所有的 Tmux 会话

tmux ls

# or
tmux list-session

分离会话

快捷键

  • Ctrl+b d: 分离当前会话

或者输入 tmux detach 命令, 就会将当前会话与窗口分离。分离后, 当前 Tmux 窗口会退出, 但会话和其中的进程仍然在后台运行。

tmux detach

恢复会话

tmux attach 命令用于重新接入某个已存在的会话。你可以通过会话编号或会话名称来恢复会话。

# 使用会话编号
tmux attach -t 0

# 使用会话名称
tmux attach -t <session-name>

# 简写方式
tmux a -t <session-name>

结束会话

tmux kill-session 命令用于结束某个会话。你可以使用会话编号或会话名称来指定需要结束的会话。

# 使用会话编号
tmux kill-session -t 0

# 使用会话名称
tmux kill-session -t <session-name>

# 关闭所有会话
tmux ls | grep : | cut -d. -f1 | awk '{print substr($1, 0, length($1)-1)}' | xargs kill

切换会话

快捷键

  • Ctrl+b (: 切换到上一个会话
  • Ctrl+b ) : 切换到下一个会话
  • Ctrl+b L : 切换到上一次使用过的会话
  • Ctrl+b s: 从会话列表中选择会话

tmux switch 命令用于切换会话

# 使用会话编号
tmux switch -t 0

# 使用会话名称
tmux switch -t <session-name>

重命名会话

快捷键

  • Ctrl+b $: 重命名当前会话

tmux rename-session 命令用于重命名会话。

tmux rename-session -t 0 <new-name>

上面的命令将 0 号会话重命名为 <new-name>

窗口管理

Tmux 允许在每个会话中创建多个窗口 (window)

新建窗口

快捷键

  • Ctrl+b c: 创建一个新窗口, 状态栏会显示多个窗口的信息

tmux new-window 命令用来创建新窗口

tmux new-window

# 新建一个指定名称的窗口
tmux new-window -n <window-name>

切换窗口

快捷键

  • Ctrl+b w: 从列表中选择窗口
  • Ctrl+b p: 切换到上一个窗口 (按照状态栏上的顺序)
  • Ctrl+b n: 切换到下一个窗口
  • Ctrl+b l: 切换到上一次使用过的窗口
  • Ctrl+b <number>: 切换到指定编号的窗口 (<number> 是状态栏上的窗口编号)
    • Ctrl+b 0
    • Ctrl+b 9

tmux select-window 命令用来切换窗口

# 切换到指定编号的窗口
tmux select-window -t <window-number>

# 切换到指定名称的窗口
tmux select-window -t <window-name>

重命名窗口

快捷键

  • Ctrl+b ,: 重命名当前窗口

tmux rename-window 命令用于为当前窗口命名或重命名

tmux rename-window <new-name>

窗口快捷键

下面是一些窗口操作的快捷键

  • Ctrl+b f: 查找窗口
  • Ctrl+b &: 关闭当前窗口

调整窗口排序

按下 Tmux 前缀 Ctrl+b 后, 再输入 :, 可以使用以下命令来调整窗口顺序

swap-window -s 3 -t 1   # 交换 3 号和 1 号窗口
swap-window -t 1        # 交换当前和 1 号窗口
move-window -t 1        # 将当前窗口移动到 1 号位置

窗格操作

Tmux 可以将窗口划分为多个窗格 (pane), 每个窗格可以独立运行不同的命令。以下是一些常见的窗格操作。

划分窗格

快捷键

  • Ctrl+b %: 垂直划分窗格, 左右分割
  • Ctrl+b ": 水平划分窗格, 上下分割

tmux split-window 命令用于划分窗格

# 划分上下两个窗格
tmux split-window
tmux split-window -v

# 划分左右两个窗格
tmux split-window -h

移动光标

快捷键

  • Ctrl+b ↑: 将光标切换到上方窗格
  • Ctrl+b ↓: 将光标切换到下方窗格
  • Ctrl+b ←: 将光标切换到左边窗格
  • Ctrl+b →: 将光标切换到右边窗格
  • Ctrl+b ;: 切换到上一个窗格
  • Ctrl+b o: 切换到下一个窗格

tmux select-pane 命令用于移动光标位置

# 光标切换到上方窗格
tmux select-pane -U

# 光标切换到下方窗格
tmux select-pane -D

# 光标切换到左边窗格
tmux select-pane -L

# 光标切换到右边窗格
tmux select-pane -R

交换窗格位置

快捷键

  • Ctrl+b {: 将当前窗格与上一个窗格交换位置
  • Ctrl+b }: 将当前窗格与下一个窗格交换位置
  • Ctrl+b Ctrl+o: 将所有窗格向前移动一个位置, 第一个窗格变成最后一个窗格
  • Ctrl+b Alt+o: 将所有窗格向后移动一个位置, 最后一个窗格变成第一个窗格

tmux swap-pane 命令用于交换窗格位置

# 当前窗格上移
tmux swap-pane -U

# 当前窗格下移
tmux swap-pane -D

调整窗格尺寸

以下快捷键可用于调整窗格大小

Ctrl+b :resize-pane -U           # 当前窗格向上扩大 1 格
Ctrl+b :resize-pane -L           # 当前窗格向左扩大 1 格
Ctrl+b :resize-pane -R           # 当前窗格向右扩大 1 格
Ctrl+b :resize-pane -D 20        # 当前窗格向下扩大 20 格
Ctrl+b :resize-pane -t 2 -L 20   # 编号为 2 的窗格向左扩大 20 格

Ctrl+b Alt+ ↑                    # 向上扩大窗格
Ctrl+b Alt+ ↓                    # 向下扩大窗格
Ctrl+b Alt+ ←                    # 向左扩大窗格
Ctrl+b Alt+ →                    # 向右扩大窗格
Ctrl+b Alt+ → → →                # 连续向右扩大窗格

翻页及内容搜索

快捷键

  • Ctrl+b [: 进入滚动模式 (scrollback mode) 模式, 使用 方向键进行单行滚动
  • Ctrl+b PgUp: 向上翻页
  • Ctrl+b PgDn: 向下翻页
  • 在滚动模式中, 按下 q 退出滚动模式

此外, 还可以使用 Ctrl+s 进行内容搜索, 搜索到多个内容时使用 nN 跳转到下一个或上一个匹配项。

在启用 emacs bindings 时, 使用 Ctrl+s 进行搜索
如果启用了 vim bindings, 则需要进入 copy mode, 然后使用 / (slash) 进行搜索

使用预设布局

Tmux 提供了几种常见的布局, 快捷键如下

Ctrl+b M-1    # 切换到水平均分布局 even-horizontal
Ctrl+b M-2    # 切换到垂直均分布局 even-vertical
Ctrl+b M-3    # 切换到主窗口水平布局 main-horizontal
Ctrl+b M-4    # 切换到主窗口垂直布局 main-vertical
Ctrl+b M-5    # 切换到平铺布局
Ctrl+b 空格    # 切换到下一个布局

窗格快捷键

以下是一些常用的窗格操作快捷键

  • Ctrl+b x: 关闭当前窗格
  • Ctrl+b !: 将当前窗格拆分为一个独立窗口
  • Ctrl+b z: 当前窗格全屏显示, 再次使用会恢复原来大小
  • Ctrl+b t: 在当前窗格中显示一个数字时钟
  • Ctrl+b q: 显示窗格编号

其他命令

以下是一些 Tmux 的常用命令

# 列出所有快捷键及其对应的 Tmux 命令
tmux list-keys

# 列出所有 Tmux 命令及其参数
tmux list-commands

# 列出当前所有 Tmux 会话的信息
tmux info

# 重新加载当前的 Tmux 配置
tmux source-file ~/.tmux.conf

列出所有快捷键

[root@centos ~]# tmux -V
tmux 1.8
[root@centos ~]# tmux list-keys
bind-key        C-b send-prefix
bind-key        C-o rotate-window
bind-key        C-z suspend-client
bind-key      Space next-layout
bind-key          ! break-pane
bind-key          " split-window
bind-key          # list-buffers
bind-key          $ command-prompt -I #S "rename-session '%%'"
bind-key          % split-window -h
bind-key          & confirm-before -p "kill-window #W? (y/n)" kill-window
bind-key          ' command-prompt -p index "select-window -t ':%%'"
bind-key          ( switch-client -p
bind-key          ) switch-client -n
bind-key          , command-prompt -I #W "rename-window '%%'"
bind-key          - delete-buffer
bind-key          . command-prompt "move-window -t '%%'"
bind-key          0 select-window -t :0
bind-key          1 select-window -t :1
bind-key          2 select-window -t :2
bind-key          3 select-window -t :3
bind-key          4 select-window -t :4
bind-key          5 select-window -t :5
bind-key          6 select-window -t :6
bind-key          7 select-window -t :7
bind-key          8 select-window -t :8
bind-key          9 select-window -t :9
bind-key          : command-prompt
bind-key          ; last-pane
bind-key          = choose-buffer
bind-key          ? list-keys
bind-key          D choose-client
bind-key          L switch-client -l
bind-key          [ copy-mode
bind-key          ] paste-buffer
bind-key          c new-window
bind-key          d detach-client
bind-key          f command-prompt "find-window '%%'"
bind-key          i display-message
bind-key          l last-window
bind-key          n next-window
bind-key          o select-pane -t :.+
bind-key          p previous-window
bind-key          q display-panes
bind-key          r refresh-client
bind-key          s choose-tree
bind-key          t clock-mode
bind-key          w choose-window
bind-key          x confirm-before -p "kill-pane #P? (y/n)" kill-pane
bind-key          z resize-pane -Z
bind-key          { swap-pane -U
bind-key          } swap-pane -D
bind-key          ~ show-messages
bind-key      PPage copy-mode -u
bind-key -r      Up select-pane -U
bind-key -r    Down select-pane -D
bind-key -r    Left select-pane -L
bind-key -r   Right select-pane -R
bind-key        M-1 select-layout even-horizontal
bind-key        M-2 select-layout even-vertical
bind-key        M-3 select-layout main-horizontal
bind-key        M-4 select-layout main-vertical
bind-key        M-5 select-layout tiled
bind-key        M-n next-window -a
bind-key        M-o rotate-window -D
bind-key        M-p previous-window -a
bind-key -r    M-Up resize-pane -U 5
bind-key -r  M-Down resize-pane -D 5
bind-key -r  M-Left resize-pane -L 5
bind-key -r M-Right resize-pane -R 5
bind-key -r    C-Up resize-pane -U
bind-key -r  C-Down resize-pane -D
bind-key -r  C-Left resize-pane -L
bind-key -r C-Right resize-pane -R

Tmux 命令中的 M 按键是什么

在 Tmux 命令中, M 按键代表的是 meta 键。例如, M-1 就是 meta-1, 类似于 C-1control-1

如果你使用的是普通的 PC 键盘, 可能会注意到没有明确标记为 meta 的键。根据你的键盘布局, meta 键通常是 Alt 键或 Windows 键 (徽标键)

Symbolics keyboard.jpg

一般可以在 SSH 客户端里设置 meta 按键映射

Snipaste_2022-03-05_22-49-02.png

例如, 以下命令中的 M-1M-2 等就是通过 meta 键配合数字键执行的操作

bind-key        M-1 select-layout even-horizontal
bind-key        M-2 select-layout even-vertical
bind-key        M-3 select-layout main-horizontal
bind-key        M-4 select-layout main-vertical
bind-key        M-5 select-layout tiled
bind-key        M-n next-window -a
bind-key        M-o rotate-window -D
bind-key        M-p previous-window -a

原文

tmux cheat sheet
Tmux 快捷键 & 速查表 & 简明教程
Tmux 使用教程
How do I resize tmux pane by holding down prefix and arrow key for a while?
How do I scroll in tmux?
Tmux commands: What is M-whatever

其他

What do the keys on this Symbolics Space Cadet keyboard do?
tmux终端复用/tmate终端共享/screen
GNU Screen splitting
.tmux.conf 配置文件

最后更新于 2022-03-06
使用 Hugo 构建
主题 StackJimmy 设计