tmux-基本使用

Github 仓库中的 Wiki

介绍

tmux, terminal multiplexer, 即终端复用器. 其允许一个终端中, 在多个 programs 间切换, 可以 detach (将 program 放于后台运行) 以及 reattach (放于前台).

tmux 的常见使用场景为:

  • 在 tmux 中运行程序, 保护远程服务器上运行的程序免受连接中断的影响. 一般情况下, 远程操作服务器时, 通常网络中断会导致程序也中断. 但如果在 tmux 中运行, tmux 会在后台继续这些程序, 并且可以 reattach 之前的会话
  • 允许从多个不同的本地计算机访问在远程服务器上运行的程序. 也就是说, 不同的本地主机可以 reattach 上同一个 tmux 会话, 控制同一程序
  • 支持类似窗口管理器的窗口分割

安装

在 Archlinux 下用包管理器管理为:

1
sudo pacman -S tmux

相关文档

除 Github 上的 wiki 外, man 1 tmux 中也有大量的描述文档.

相关基本概念

tmux server 和 client

tmux 的所有状态信息都保存在 “tmux” 这一主进程下, 也就是 tmux server. 其运行在后台, 管理所有运行在 tmux 中的程序以及监视这些程序的输出.

当用户运行 tmux 时, tmux server 则会被自动启用, 而当 tmux 中所有程序都运行结束时, 其会自动 exit.

用户通过开启一个 tmux client 来连接 tmux server (client 会在本地主机的 /tmp 目录下创建一个 socket 管理通信)

tmux client 通过其启动时所在的外部终端名称来标识, 如 /dev/ttypf, 可以用:

1
2
$ tty
/dev/pts/4

命令来查看.

在 tmux 会话中, 可以通过:

  1. 按下 Ctrl+b (默认修饰键)
  2. 输入 :, 进入命令模式
  3. 输入 list-clients 命令

来查看有哪些 client 连接到了 server, 输出如:

1
/dev/pts/2: 2 [98x30 st-256color] (attached,focused,UTF-8)

Sessions, windows 和 panes

层次关系为: Session 中包含 Windows, Window 中包含 Panes, Pane 中运行 programs. 具体为:

  • 程序运行在 Panes 中, 每一个 pane 属于一个 window
  • 每一个 Window 有一个 name 和 active pane
  • 一个 Window 可以属于多个 Session
  • 每一个 Session 都有一个 windows 列表, each with an index, Session 都有一个 unique name
  • 在一个 Session 中有 current window
  • 一个 Session 可以被多个 clients attach
  • 每一个 client 都需要 attach 到一个 Session


(这里就是三个 panes, 其分布关系称为 window layout)

Tmux 的使用

创建 sessions

创建一个新的 session 如:

1
$ tmux new

newnew-session 的简写.

在不添加任何参数时, 会创建并 attach 到 new session 上, 此时 session 中包含一个 index 为 0 的 window 和一个运行 shell 的 pane.

默认情况下, 第一个 session 名为 0, 然后是 1, 以此类推. 也可以在创建时, 用 -s (set) 选项指定名称:

1
$ tmux new -smysession

此时会创建一个名为 mysession 的 session.

若想创建 session 的同时运行命令, 可以为:

1
$ tmux new 'nvim ~/.tmux.conf'

或:

1
$ tmux new -- nvim ~/.tmux.conf

创建 session 时, 指定 window 名称, 用 -n 选项:

1
$ tmux new -nmytopwindow top

查看有哪些 sessions

1
$ tmux list-sessions

查看一个指定 session 下有哪些 windows

1
$ tmux list-windows -t session-name

默认 Status line 显示解释

如图:

(官方 wiki 图)

* 标记的是 current window. 有 - 标记的是 last window.

Prefix key

若想执行控制 tmux 的指令, 需要先按下 Prefix key, 再接上相关指令.

Prefix key 默认为 C-b 即 “Ctrl + b”, M- 为 “Alt + “, S- 为 “Shift + “. 可以组合为 C-M-x 即 “Ctrl + Alt + x”.

当按下 prefix key 时, tmux 会等待任何其他键的按下, 可以描述为 C-b c, 即按下 C-b 之后 (松开 C-b 之后) 按 c.

Help keys

查看 tmux 中提供的默认 keybinding 列表, 可以按下 C-b ?.

也可以通过:

1
$ tmux lsk -N|more

(lsk, “list-keys”)
查看相同的列表.


(官方图, 右上角标有数量)

可以通过先按下 C-/, 然后按下一个键来查看其 description. 如 C-/ ?, 得到的输出为 List key bindings.

Commands 和 flags

常用 commands 如 new-window, new-session, list-keys, 都有对应的缩写, 如 neww, new, lsk. 每一个 command 都有相应的 flags 可使用.

这些 commands 可以在 shell 中运行 tmux 时使用, 也可以在 tmux 中调用. 如:

1
$ tmux new-session -d -nmysession

在 tmux 中, 可以设置一个 keybinding 对应执行某个 command, 如 C-b c 执行 new-window.

命令模式

在 tmux 中, 可以呼出命令提示符 : 以输入控制指令 (和 vim 的 normal 模式类似), 默认为 C-b :.

默认情况下, 在 prompt 下使用 emacs 的编辑方式, 但如果设置了 VISUALEDITOR 环境变量的值为 vi (或 vim, nvi), 则会启用 vim 的编辑模式.

当想要连续调用多个指令时, 可以用 ; 分隔.

Attaching 和 detaching

Detaching 意味着 client 退出 tmux 到 outside terminal, 与此同时, tmux session 中的程序会放于 background 运行. 默认键为 C-b d, 当成功 detaching 时, 会得到输出:

1
[detached (from session mysession)]

若想 attach 到一个已有的 session, 用 attach-session (attach) 指令, 在不加参数时, 会 attach 到 most recently used session:

1
$ tmux attach

也可以用 -t 指定 session name:

1
$ tmux attach -tmysession

这样连接时, 不会让其他 client 掉线, 若向让其他 client detach, 则加上 -d 参数:

1
$ tmux attach -tmysession -d

也可以用 new-session 指令配合 -A 参数, 若指定的 session 不存在, 则创建, 若存在, 则 attach:

1
$ tmux new -Amysession

(这里也可以用 -D 参数达到 attach-session 命令的 -d 参数的效果)

完全关闭 tmux server

可以在 terminal 下运行:

1
$ tmux kill-server

或者在 command prompt 下运行:

1
:kill-server

创建 new windows

默认按键 C-b c 来运行 new-window 命令. 如果当前只有 0 这一个 window, 则此时创建的 window index 为 1 且成为 current window of the session.

如果当前 window index 有 0, 2, 则新创建的 window index 为 1

new-window 命令的常用参数有:

  • -d, 创建后不设置为 current window
  • -n, 指定 window name
  • -t, 简单使用为指定 index, 还有其他特殊语法指定其他内容
    1
    tmux new-window -t 999

也可以在创建 window 时运行命令:

1
:neww top

Window 窗口 splitting

当 splitting 一个 window 时, 就会创建一个 pane.

默认的 C-b %, horizontally splits 当前 pane:

C-b " vertically splits 当前 pane:

或者用 split-window 命令:

  • -h, 表示 horizontally splits
  • -v, 表示 vertically splits
  • -d, 不将 new pane 设置为 active pane
  • -f, 让 new pane 全屏占据 window
  • -b, 将 new pane 创建在 above 或 left, 而不是 below 和 right

也可以直接跟一个命令来运行:

1
:split-window top

改变 current window

用一系列默认键位:

  • C-b 0, change 到 window 0, C-b 1 change 的 window 1, 以此类推到 window 9
  • C-b ', 之后会 prompts 要求输入 index
  • C-b n, 按照 index change 到 next window
  • C-b p, 按照 index change 到 previous window
  • C-b l, 按照 index change 到 last window

或者用 select-window 加上 index 或 window name 来改变:

1
:select-window -t <window-index|window-name>

改变 active pane

用默认键位:

  • C-b Up, C-b Down, C-b Left, C-b Right 来将 above, below, left, right 处的 pane 为 active pane
  • C-b q, 会短暂的在各 pane 中央显示 pane number, 通过按下 number 来跳转 (改变 active pane), 如 C-b q 1 将 avtive pane 改变为 pane 1
  • C-b o, 按照 pane number 跳转到 next pane, C-b C-o 还会同时交换两个 pane 的位置

也可以用 select-pane命令, 如:

1
:select-pane -t 1

-t 指定 target-pane 也就是 pane number.
(后面可以看下 display-panes 命令的用法)

在 tree mode 下选择 sessions, windows 和 panes

在 tree mode 下, 可以从树状列表中选择 sessions, windows 或 panes.

这里可以用来改变 attached session, the current window 以及 active pane, 也可以 kill sessions, windows 和 panes, 或者对多个 target 运行一个 command.

默认用 C-b s 进入 tree mode 但只显示 sessions, 此时 attached session 会被选中, 如:

C-b w 会显示 sessions expanded (也就是会显示其下的 windows), 且选中 current window, 如:

(注意前面的序号, 可以用来直接 select)

在 tree mode 下, 用 t 来选中多个 items, 用于同时执行操作, 可以用 T 来 untag 所有 tagged 的 items. 在选中一系列 items 后, 按下 X 可以将其 kill 掉, 也可以按 : 运行指令.

在 tree mode 下默认的 keybindings 有:

Detaching other clients

可以用 C-b D 查看 client list, 其显示和 tree mode 类似:

用于 navigate 和 tag 的 keybindings 与 tree mode 一致, 但其他 keybindings 不同:

Killing a session, window or pane

按下 C-b & 后, 会 prompts 出一个是否 kill current window 的确认. 也可以用 kill-window 命令.

按下 C-b x 会 kill 掉 active pane. 也可以用 kill-pane 命令.

没有 kill 掉 session 的默认 keybinding, 可以用 kill-session 命令.

重命名 sessions 和 windows

按下 C-b $ 会 prompt for 当前 attached session 的新名称. 也可以用 rename-session 命令.

按下 C-b , 会 prompt for current window 的新名称. 也可以用 rename-window 命令.

Swapping and moving

Panes 和 windows 可以通过 swap-paneswap-window 命令来 swapping. 也就是把当前 focus 的 pane 或 window 换为另一个 pane 或 window.

若当前有两个 pane, 01, 运行 :swap-pane -t 1 之前:

运行之后为:

为了便于 swap, 可以用 C-b m 来 mark 一个 pane (C-b m 可以 toggle mark, 可以用 C-b M 取消所有 mark), 默认情况下, marked pane 的边框为绿色:

之后随便到另一个 pane, 然后运行 :swap-pane 则可和这个 pane 进行 swap. 或者运行 :swap-window, 让 marked pane 所在的 window swap 为 current window.

对于 panes 而言, 可以用 C-b {C-b } 来让上下两个 panes 进行 swap.

更换 window 的 index 可用 move-window 指令或按下 C-b .. 若想替换掉已存在的 index, 则需要加上 -k 参数, 如:

1
:move-window -kt999

如果想让 window index list 按顺序一个一个填满, 如将 0, 1, 3, 999 变为 0, 1, 2, 3, 则给 move-window 命令加上 -r 参数:

1
:move-window -r

Resizing and zooming panes

默认可以用 C-b C-Left, C-b C-Right, C-b C-Up, C-b C-Down 来进行小幅度调整 pane 大小, 可以用 C-b M-Left, C-b M-Right, C-b M-Up, C-b M-Down 来大幅度调整.

也可以直接用 resize-pane 命令来调整.

可以用 C-b z 来让 active pane 扩充到整个 window (隐藏其他 pane, 可以 toggle).

选择 window layout

在一个 window 中, 所有 pane 都会以一个 named layout 的形式排列, 可以用 C-b Space 在这些 layouts 之间切换. 或者用 C-b M-1, C-b M-2 这样来选择, 可用的有:

Copy and paste

Tmux 自己有一套 copy 和 paste 的系统. 一段 copied text 被称为 a paste buffer.

C-b [ 进入 copy mode 来 copy 文本, 然后用 C-b ] 来 paste 文本.

Paste buffers 都会被自动分配名称, 如 buffer0, buffer1, 最多存储 50 个. 当超出时, 最老的会被删除. 也可以自己命名 buffer, 而这种 paste buffer 不会因为个数达到上限而被自动删除. 用 set-buffer 命令来设置, -b 参数指定存在的 buffer name, -n 指定 new name :

1
:set-buffer -bbuffer0 -nmybuffer

其也可以用于创建一个 buffer, 如:

1
:set-buffer -bfoo bar

即创建了一个名为 foo 的 paste buffer, 内容为 bar.

可以用 load-buffer 命令加载文件内容到一个 paste buffer 中, 同样用 -b 指定 buffer name:

1
:load-buffer -bbufile ~/a/file

可以用 save-buffer 命令将一个 existing buffer 的内容保存到文件中:

1
:save-buffer -bbuffer0 ~/saved_buffer

在 vi 模式下进入 copy mode, 可通过 visual mode 选中文本, 然后按下 enter 来确认.

可以用 C-b = 来查看所有的 paste buffer, 其 navigate 和 tag 的操作方式和 tree mode 类似, 但其他 keybindings 不同:

查找 windows 和 panes

按下 C-b f 之后, 会 promtps 询问 some text 用于查找 window 或 pane, pane 中显示的内容会用于进行匹配, 之后会弹出 tree mode 并选中匹配项:

启用鼠标支持

运行:

1
:set -g mouse on

这时可用鼠标 change the active pane or window, to resize panes, to copy text, or to choose items for menus.

使用技巧

以初始配置启用 tmux

只有在 tmux server 没启用时有效:

1
tmux -f ""

tmux-基本使用
http://example.com/2024/04/02/tmux-基本使用/
作者
Jie
发布于
2024年4月2日
许可协议