tmux 简介与使用指南

tmux-logo

tmux 是一个终端复用器(terminal multiplexer),它使你能够轻松地在多个终端程序之间来回切换,同时你还可以脱离它们(它们将在后台继续运行),然后在另一个终端窗口重新连接它们。

tmux 提升工作效率的两个主要功能:

  • 窗口分割。在一个终端窗口中,可以随意进行水平或垂直分割,让你在一个窗口中运行多个独立的终端实例,这样你就无需打开多个终端窗口了。通过简单的组合键,你可以轻松在多个独立运行的终端实例间进行切换。

  • 基于会话的访问控制。在使用 SSH 工作的情况下,tmux 能避免工作现场丢失。假设在你执行某条命令的过程中,因为某些不可抗的因素(如网络问题)导致连接断开,这时你可能很难确定刚才的命令是否执行成功;又或者当你处一个较深层次的目录位置时,若 SSH 连接断开,你不得不重新进入到之前的工作目录。如果使用了 tmux,就可以在 SSH 重新连接后,连接到 tmux 之前的 session,这样就可以回到原来的工作环境。

tmux 简介与使用指南

tmux 工作原理

本文将为您提供有关 tmux 的简要介绍,然后是安装和使用指南。

tmux 使用 C/S 模型构建,主要包含以下几个概念:

  • Server:服务器,若当前没有 Server 进程,则执行 tmux 命令时会启动一个 Server
  • Session:会话,一个 Server 可以包含多个 Session
  • Window:窗口,一个 Session 可以包含多个 Window
  • Pane:窗格,一个 Window 可以包含多个 Pane

当 tmux 启动时,它将创建一个具有单个 Window 的新 Session,这个 Window 中默认只包含一个 Pane,并将其显示在屏幕上。屏幕底部的状态栏显示了当前会话的信息,并用于输入交互式命令。

注:这里包括以下所说的屏幕指的是当前仿真终端窗口的屏幕区域,因为在执行 tmux 命令前首先需要打开一个终端模拟器。

Session 是“在 tmux 管理下的伪终端”的单个集合。每个会话都有一个或多个链接到它的 Window。Window 占据整个屏幕,并且可以分成多个矩形 Pane,每个 Pane 都是独立的伪终端。任意数量的 tmux 实例可以连接到同一个 Session,并且同一 Session 中可以存在任意数量的 Window。一旦所有的 Session 都被杀死,tmux 就会退出。

每个 Session 都是持久的,并且可以在意外断开连接(例如 ssh 连接超时)或故意断开连接(使用 C-b d 组合键)时幸免。可以使用以下方法重新连接 tmux:

1
$ tmux attach

在 tmux 中,Session 由 Client 显示在屏幕上,所有的 Session 均有单个 Server 管理。Server 和每个 Client 都是独立的进程,它们通过 /tmp 中的 socket 进行通信。

不使用 tmux 时,是这样的:

without-tmux

使用 tmux 时,是这样的:

use-tmux

安装

Ubuntu / Debian 及其衍生版只需执行以下命令即可:

1
sudo apt-get install tmux

CentOS 上安装执行:

1
sudo yum -y install tmux

如果是 Mac,则执行:

1
brew install tmux

开启你的第一个 Session

对于你的的第一个 Session,你只需要简单的启动 tmux 即可:

1
tmux

这将创建一个新的 tmux Session,底部带有一个绿色的状态栏:

first-tmux-session

状态栏是 tmux 的重要组成部分。除了当前打开的窗口(在左侧)之外,它还显示一些系统信息,例如日期和时间(在右侧),此外状态栏也可以自定义。

分割 Pane

现在,我们已经创建了第一个 Session,接着通过分屏我们可以了解 Pane。当创建新 Session 时,默认情况下,tmux 将自动为我们创建一个 Window 和 一个内部 Pane,现在我们进行分屏操作。

tmux 中的所有命令均由 前缀键+命令键 触发。默认情况下,tmux 使用 C-b 作为前缀键,C- 表示“按住Ctrl键”,C-b 表示同时按下 Ctrlb 键。

将一个 Pane 分割成左右两个 Pane 的快捷键是 C-b %,这里前缀键为 C-b,命令键为 %,这意味着你需要同时按住 Ctrlb,然后松开这两个键,最后输入 % 键,这样就可以将一个 Pane 垂直分割为两个 Pane 了。

split-pane

想要水平分割成上下两个 Pane 则使用 C-b "

在 Pane 间切换

假如我们在新的右侧的 Pane 中了,现在想回到左侧的 Pane 可以使用 C-b Left,其中 Left 为左方向键。根据 Pane 的排布,你可以输入不同的方向键去到你想去的 Pane 中,每次输入方向键前,都需要输入前缀键 C-b

关闭 Pane

关闭 Pane 输入 exit 然后回车或直接使用快捷键 C-d 就可以了。

创建 Window

tmux 中创建一个新的 Window 可以类比于创建一个新的虚拟桌面。创建一个新的 Window 很简单,只需输入 C-b c 就可以了。通过底部状态栏的星号,你就可以知道当前你所在的 Window 是哪个了。

create-window

要切换到上一个 Window (根据状态栏中的顺序),请使用 C-b p,要切换到下一个 Window,请使用 C-b n。如果创建了许多窗口,则使用 C-b <number> 会更加高效,其中 <number> 是指定要切换到的 Window 的前面的数字。

Session 管理

如果你已完成或未完成你想要进行的工作,你都可以使用 C-b d 断开 detach 你当前的 Session,这样将会断开你的连接,但是这个 Session 仍会保留在后台中以供重新连接到该 Session 继续之前的工作。

假设你已经 detach 了你的 Session,当你想要重新连接 attach 之前 Session 时,你需要先确定是哪个 Session,通过以下命令可以查看当前所有的 Session:

1
tmux ls

这将为你展示所有正在运行的会话的列表,在我们的示例中,该列表应类似于:

1
0: 2 windows (created Sun Nov 10 22:30:50 2019) [80x12]

要连接到该会话,需要再次启动tmux,但这一次告诉它要 attach 到哪个 Session:

1
tmux attach -t 0

注:-t 0 是告诉 tmux attach 到哪个会话的参数,"0" 是 tmux ls 输出的第一部分。

如果你希望为 Session 指定一个更有意义的名称(而不是以 0 开头的数字),则可以使用:

1
tmux new -s database

这将创建一个名为 "database" 的新 Session。

你还可以重命名现有会话:

1
tmux rename-session -t 0 database

下次连接到该会话时,只需使用 tmux attach -t database,如果一次使用多个 Session,这对于我们区分不同的 Session 很有帮助。

当你想关闭 Session 时:

1
tmux kill-session -t session-name

复制模式 Copy Mode

  1. 使用 C-b : 进入 tmux 末行模式,设置 Copy 模式使用按键模式为 vi 模式:

    1
    :setw -g mode-keys vi
  2. 使用 C-b [ 进入 Copy 模式
  3. Spacebar 开始选中,移动光标选择选中区域
  4. Enter 复制选中区域内容并退出 Copy 模式
  5. 将光标移动到指定位置,使用 C-b ] 粘贴

tmux 常用按键

Session

  • 创建一个新 Session

    1
    2
    3
    $ tmux
    $ tmux new
    $ tmux new-session
    1
    :new
  • 创建一个名为 "mysession" 的新 Session

    1
    $ tmux new -s mysession
    1
    :new -s mysession
  • 关闭或删除名为 "mysession" 的 Session

    1
    2
    $ tmux kill-sess -t mysession
    $ tmux kill-session -t mysession
  • 关闭或删除当前会话以外的所有 Session

    1
    $ tmux kill-session -a
  • 关闭或删除名为 "mysession" 会话以外的所有 Session

    1
    $ tmux kill-session -a -t mysession
  • 重命名 Session

    C-b $

  • Detach Session

    C-b d

  • Detach others on the Session

    通过 detach 其它 client 来最大化窗口

    1
    :attach -d
  • 查看所有 Session

    1
    2
    $ tmux ls
    $ tmux list-sessions

    C-b s

  • Attach 到最近的 Session

    1
    2
    3
    4
    $ tmux a
    $ tmux at
    $ tmux attach
    $ tmux attach-session
  • Attach 到名为 "mysession" 的 Session

    1
    2
    3
    4
    $ tmux a -t mysession
    $ tmux at -t mysession
    $ tmux attach -t mysession
    $ tmux attach-session -t mysession
  • 切换到上一个 Session

    C-b (

  • 切换到下一个 Session

    C-b )

Window

  • 创建一个名为 "mysession" 的新 Session 并指定创建 Window 的名称为 "mywindow"

    1
    $ tmux new -s mysession -n mywindow
  • 创建 Window

    C-b c

  • 重命名当前 Window

    C-b ,

  • 关闭当前 Window

    C-b &

  • 切换到上一个 Window

    C-b p

  • 切换到下一个 Window

    C-b n

  • 根据数字切换 Window

    C-b 0~9

  • 重新排序窗口,交换编号为 2 和 1 的窗口

    1
    :swap-window -s 2 -t 1
  • 将当前窗口向左移动一个位置

    1
    :swap-window -t -1

Pane

  • 切换到上一次活动的 Pane

    C-b ;

  • 垂直分割 Pane

    C-b %

  • 水平分割 Pane

    C-b "

  • 向左移动当前 Pane

    C-b {

  • 向右移动当前 Pane

    C-b }

  • 切换到箭头方向的 Pane

    C-b UP C-b DOWN C-b LEFT C-b RIGHT

  • 切换到同步 Pane(将命令发送到所有 Pane)

    1
    :setw synchronize-panes
  • 在 Pane 布局之间切换

    C-b Spacebar

  • 切换到下一个 Pane

    C-b o

  • 展示 Pane 编号

    C-b q

  • 按编号切换 Pane

    C-b q 0~9

  • 缩放当前 Pane

    C-b z

  • 将 Pane 转换成 Window

    C-b !

  • 调整当前 Pane 的高度(按住第二个键是可选的)

    C-b-UP C-b C-UP C-b-DOWN C-b C-DOWN

  • 调整当前 Pane 的宽度(按住第二个键是可选的)

    C-b-LEFT C-b C-LEFT C-b-RIGHT C-b C-RIGHT

  • 关闭当前 Pane

    C-b x

Copy Mode

  • 设置 Copy 模式下使用 vi 命令

    1
    :setw -g mode-keys vi
  • 进入 Copy 模式

    C-b [

  • 进入 Copy 模式并向上滚动一页

    C-b PgUp

  • 退出 Copy 模式

    q

  • 转到第一行

    g

  • 转到最后一行

    G

  • 向上滚动

    UP

  • 向下滚动

    DOWN

  • 向左移动光标

    h

  • 向下移动光标

    j

  • 向上移动光标

    k

  • 向右移动光标

    l

  • 一次将光标向前移动一个单词

    w

  • 一次将光标向后移动一个单词

    b

  • 向前搜索

    /

  • 向后搜索

    ?

  • 搜索结果中,跳到下一个关键字出现位置

    n

  • 搜索结果中,跳到上一个关键字出现位置

    N

  • 开始选中内容

    Spacebar

  • 清空选中内容

    Esc

  • 复制选中内容

    Enter

  • 粘贴 buffer_0 的内容

    C-b ]

  • 展示 buffer_0 的内容

    1
    :show-buffer
  • 将 Pane 中的所有可见内容复制到缓冲区

    1
    :capture-pane
  • 显示所有缓冲区

    1
    :list-buffers
  • 显示所有缓冲区并粘贴所选

    1
    :choose-buffer
  • 将缓冲区内容保存到 buf.txt

    1
    :save-buffer buf.txt
  • 删除 buffer_1

    1
    :delete-buffer -b 1

Misc

  • 进入命令模式

    C-b :

  • 为所有 Session 设置 OPTION

    1
    :set -g OPTION
  • 为所有 Window 设置 OPTION

    1
    :setw -g OPTION

Help

  • 展示快捷键帮助

    C-b ?

  • 显示当前时间

    C-b t

References

https://www.hamvocke.com/blog/a-quick-and-easy-guide-to-tmux/

https://tmuxcheatsheet.com/

https://github.com/tmux/tmux/blob/master/.github/README.md

http://man.openbsd.org/OpenBSD-current/man1/tmux.1