tmux-基本使用
介绍
tmux, terminal multiplexer, 即终端复用器. 其允许一个终端中, 在多个 programs 间切换, 可以 detach (将 program 放于后台运行) 以及 reattach (放于前台).
tmux 的常见使用场景为:
- 在 tmux 中运行程序, 保护远程服务器上运行的程序免受连接中断的影响. 一般情况下, 远程操作服务器时, 通常网络中断会导致程序也中断. 但如果在 tmux 中运行, tmux 会在后台继续这些程序, 并且可以 reattach 之前的会话
- 允许从多个不同的本地计算机访问在远程服务器上运行的程序. 也就是说, 不同的本地主机可以 reattach 上同一个 tmux 会话, 控制同一程序
- 支持类似窗口管理器的窗口分割
安装
在 Archlinux 下用包管理器管理为:
1 |
|
相关文档
除 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 |
|
命令来查看.
在 tmux 会话中, 可以通过:
- 按下
Ctrl+b
(默认修饰键) - 输入
:
, 进入命令模式 - 输入
list-clients
命令
来查看有哪些 client 连接到了 server, 输出如:
1 |
|
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 |
|
new
是 new-session
的简写.
在不添加任何参数时, 会创建并 attach 到 new session 上, 此时 session 中包含一个 index 为 0 的 window 和一个运行 shell 的 pane.
默认情况下, 第一个 session 名为 0
, 然后是 1
, 以此类推. 也可以在创建时, 用 -s
(set) 选项指定名称:
1 |
|
此时会创建一个名为 mysession
的 session.
若想创建 session 的同时运行命令, 可以为:
1 |
|
或:
1 |
|
创建 session 时, 指定 window 名称, 用 -n
选项:
1 |
|
查看有哪些 sessions
1 |
|
查看一个指定 session 下有哪些 windows
1 |
|
默认 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 |
|
(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 中, 可以设置一个 keybinding 对应执行某个 command, 如 C-b c
执行 new-window
.
命令模式
在 tmux 中, 可以呼出命令提示符 :
以输入控制指令 (和 vim 的 normal 模式类似), 默认为 C-b :
.
默认情况下, 在 prompt 下使用 emacs 的编辑方式, 但如果设置了 VISUAL
或 EDITOR
环境变量的值为 vi
(或 vim
, nvi
), 则会启用 vim 的编辑模式.
当想要连续调用多个指令时, 可以用 ;
分隔.
Attaching 和 detaching
Detaching 意味着 client 退出 tmux 到 outside terminal, 与此同时, tmux session 中的程序会放于 background 运行. 默认键为 C-b d
, 当成功 detaching 时, 会得到输出:
1 |
|
若想 attach 到一个已有的 session, 用 attach-session
(attach
) 指令, 在不加参数时, 会 attach 到 most recently used session:
1 |
|
也可以用 -t
指定 session name:
1 |
|
这样连接时, 不会让其他 client 掉线, 若向让其他 client detach, 则加上 -d
参数:
1 |
|
也可以用 new-session
指令配合 -A
参数, 若指定的 session 不存在, 则创建, 若存在, 则 attach:
1 |
|
(这里也可以用 -D
参数达到 attach-session
命令的 -d
参数的效果)
完全关闭 tmux server
可以在 terminal 下运行:
1 |
|
或者在 command prompt 下运行:
1 |
|
创建 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 |
|
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 |
|
改变 current window
用一系列默认键位:
C-b 0
, change 到 window 0,C-b 1
change 的 window 1, 以此类推到 window 9C-b '
, 之后会 prompts 要求输入 indexC-b n
, 按照 index change 到 next windowC-b p
, 按照 index change 到 previous windowC-b l
, 按照 index change 到 last window
或者用 select-window
加上 index 或 window name 来改变:
1 |
|
改变 active pane
用默认键位:
C-b Up
,C-b Down
,C-b Left
,C-b Right
来将 above, below, left, right 处的 pane 为 active paneC-b q
, 会短暂的在各 pane 中央显示 pane number, 通过按下 number 来跳转 (改变 active pane), 如C-b q 1
将 avtive pane 改变为 pane 1C-b o
, 按照 pane number 跳转到 next pane,C-b C-o
还会同时交换两个 pane 的位置
也可以用 select-pane
命令, 如:
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-pane
和 swap-window
命令来 swapping. 也就是把当前 focus 的 pane 或 window 换为另一个 pane 或 window.
若当前有两个 pane, 0
和 1
, 运行 :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 |
|
如果想让 window index list 按顺序一个一个填满, 如将 0, 1, 3, 999
变为 0, 1, 2, 3
, 则给 move-window
命令加上 -r
参数:
1 |
|
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 |
|
其也可以用于创建一个 buffer, 如:
1 |
|
即创建了一个名为 foo
的 paste buffer, 内容为 bar
.
可以用 load-buffer
命令加载文件内容到一个 paste buffer 中, 同样用 -b
指定 buffer name:
1 |
|
可以用 save-buffer
命令将一个 existing buffer 的内容保存到文件中:
1 |
|
在 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 |
|
这时可用鼠标 change the active pane or window, to resize panes, to copy text, or to choose items for menus.
使用技巧
以初始配置启用 tmux
只有在 tmux server 没启用时有效:
1 |
|