0%

tmux 使用

tmux 是一个类似于 Linux Screen 终端会话管理工具。之前一直使用的是 Screen,但是其功能没有 tmux 丰富,所以切换到 tmux。这篇文章主要介绍 tmux 的基础使用方法。

安装

Mac 安装:

1
brew install tmux

Linux 安装:

1
apt-get install tmux

tmux 基本概念

在使用 tmux 前,首先需要理解 tmux 中的一些重要概念:

  • tmux server:tmux 所有的状态数据都保存在 tmux server 中,当运行 tmux 命令时,tmux server 会自动启动
  • tmux client:当在一个终端下 attach tmux seesion 时,就相当于创建了一个 tmux client。此时该终端会被 tmux 接管
  • pane:每一个终端都默认属于一个 pane
  • window:每个 pane 都属于某个 window,一个 window 可以分割出多个 pane。每个 window 都可以有 name
  • session:多个窗口被组织成一个 session。session 下的每个 window 都有一个索引。每个 session 也有自己的 name

一个 session 可以被多个 tmux client attach,这是就可以多个 client 在同一个窗口下执行命令、查看输出,达到远程共享终端的目的。

tmux 提供大量命令来管理 session、窗口、pane:

  • 这些命令基本都有对应的快捷键,所有快捷键都有一个前缀,默认为 ctrl-b
  • 输入 ctrl-b ? 即可获取快捷键帮助信息,输入 q 退出帮助信息
  • tmux 快捷键只在 tmux 会话中生效
  • tmux 会话中,输入 C-b : 用于开始输入 tmux 命令
  • 也可以直接从 shell 中执行 tmux 命令,此时需要首先输入 tmux,例如 tmux list-keys

会话管理

创建会话

直接执行 tmux 命令即创建了一个会话,会话名默认从 0 开始递增。如下是执行三次 tmux 命令后看到的会话列表

1
2
3
4
tmux ls
0: 3 windows (created Sun Aug 14 12:04:48 2022)
1: 1 windows (created Sun Aug 14 12:13:09 2022)
2: 2 windows (created Sun Aug 14 12:14:35 2022)

可以使用 tmux new -s $session_namme 的方式来创建会话,从而指定会话名:

1
tmux new -s test

该命令提供一个 -A 标志,当会话名已经存在时,直接 attach 到该会话而不是新创建一个会话。

tmux 启动会话后,默认是创建一个 shell。可以通过传递参数的方式,tmux 会在 shell 中执行该命令:

1
tmux new vim

查看会话

使用 tmux lstmux list-session 即可查看当前会话列表:

1
2
3
4
5
tmux ls
0: 3 windows (created Sun Aug 14 12:04:48 2022)
1: 1 windows (created Sun Aug 14 12:13:09 2022)
2: 2 windows (created Sun Aug 14 12:14:35 2022)
test: 1 windows (created Sun Aug 14 12:17:01 2022)

attach/detach 会话

  • 通过 Ctrl+b d 或者 tmux detach 将当前会话与窗口分离
  • 分离会话后,可以使用 tmux attatch -t $session_name 重新 attach 某个已经存在的会话。

其他会话管理命令

  • 使用 tmux switch -t $session_name 可以切换到指定的会话
  • 使用 tmux kill-session -t $session_name 即可关闭会话。
  • 使用 tmux rename-session -t $old_sesssion $new_session 可以重命名会话

窗口/pane 管理

执行 tmux 命令启动一个会话后,默认会创建一个 tmux 窗口,tmux 窗口会包含一个状态栏信息,用于显示当前窗口信息。在 tmux 状态栏中:

  • 最左边显示当前会话的名称
  • 之后显示一系列窗口,每个窗口都会展示索引、名称
  • 状态栏右边会显示一些系统信息

创建窗口

通过命令:new-window 可以创建窗口,该命令提供一些选项:

  • -d:创建窗口,但是新窗口并不会成为当前窗口
  • -n:创建窗口时指定名称

该命令提供快捷键 C-b c

选择窗口

当前活动的窗口会通过 * 标识出来,上一个活动窗口则通过 - 标识。通过命令 select-window 可以选择指定的窗口。该命令提供如下快捷键:

  • C-b 0:选择窗口 0,C-b 1 选择窗口 1,依此类推
  • C-b ':将窗口划分为上下两个 pane可以输入要切换的窗口索引
  • C-b n:切换到下一个窗口,C-b p 切换到上一个窗口
  • C-b l:切换到上一个 active 的窗口

划分窗口

可以将一个窗口划分为多个 pane,这是通过 split-window 命令实现的。其提供如下快捷键:

  • C-b %:将窗口划分为左右两个 pane
  • C-b ":将窗口划分为上下两个 pane

选择 pane

当窗口划分为多个 pane 后,可以选择 pane。通过 display-panes 查看 pane,通过 select-pane 选择 pane。

如下快捷键也可以选择 pane

  • C-b Up, C-b Down, C-b Left, C-b Right:上下左右选择 pane
  • C-b q:首先输出每个 pane 的编号,此时输入 pane 编号即可选中 pane(需要在编号消失前输入)
  • C-b o:切换到下一个 pane
  • C-b C-o:则将下一个 pane 与当前 pane 交换,所以该命令可以改变 pane 布局

关闭窗口/pane

  • 通过 kill-window 可以关闭当前窗口,快捷键为 C-b &
  • 通过 kill-pane 可以关闭当前 pane,快捷键为 C-b x

其他窗口/pane管理命令

  • 通过 rename-window 可以重命名窗口,快捷键为 C-b ,
  • 通过 resize-pane 命令可以对 pane 调整大小
  • 通过 C-b z 可以临时将非 active pane 隐藏(此时状态栏改窗口包含 Z 标志),再次输入则恢复原始布局
  • tmux 为窗口中的 pane 提供一些默认布局,可以通过 C-b space 在布局间选择

tree mode

tmux 提供一个 tree mode 模式,在该模式下,可以浏览所有的会话、窗口、pane 并进行选择:

  • C-b s:列出所有的 session,并选中当前 attached 的 session
  • C-b w:可以会列出的 session 进行展开,列出每个 session 下的窗口

以树形图展开会话、窗口、pane 后,可以通过 updown 进行选择,通过 right 扩展当前选中项,left 折叠当前选中项。使用 enter 选中某个列表项,通过 q 退出 tree mode

tree mode 中的所有列表项可以通过 t 进行 tagged,再次执行则取消 tagged。tagged 之后的列表项会被粗体显示,并且名称后面会添加 *。通过 tagged item,可以一次性在多个窗口执行命令、或者一次性关闭这些窗口。通过 T 可以取消所有 tagged item。

通过 C-b f 可以进入 tree mode 同时启动一个过滤窗口,因此可以快速查找窗口或 pane。
通过 choose-tree 命令也可以进入 treemode

Copy-Paste

tmux 有自己的 copy-paste 系统,通过 C-b [ 可以进入 copy 模式。进入 copy 模式后,可以通过 vi 风格的快捷键进行移动,通过 C-Space 开始选择,输入 enter 即可结束选择。之后通过 C-b ] 即可粘贴最近选中的文本。

通过 C-b = 可以列出所有的拷贝 buffer,之后既可以选择、删除这些 buffer 列表。

配置 tmux

配置 tmux 快捷键

tmux 的配置都保存在 HOME 目录的 .tmux.conf 文件中。可以在 .tmux.conf 文件中继续包含其他的配置文件。在 tmux 会话中,也可以通过 source-file $conf_file(简写形式为 source)来使配置文件生效。在配置文件中:

  • 每个命令一行,以 # 进行注释:
  • 配置文件的语法类似于 shell 语法,但本身不是 shell 脚本

可以通过 bind-key 进行快捷键绑定、unbind-key 取消快捷键的绑定。快捷键保存在四类表中:

  • root 表:包含不需要前缀的快捷键
  • prefix 表:包含需要前缀的快捷键
  • copy-mode 表:copy mode 下 emacs 风格的按键
  • copy-mode-vi 表:copy mode 下 vi 风格的按键

当通过 list-keys 命令列出快捷键时,就是以 bind-key 命令的时候展示当前的快捷键,其中 -T 表示快捷键所在的 table。当在配置文件中使用 bind-key 设置快捷键时,也是使用 -T 来指定快捷键的表,如果没有指定,默认为 prefix 表。

使用 bind 为指定命令绑定快捷键时,详细的命令语法可以参考 COMMANDS section of the manual page

使用 unbind-key 命令来移除 key 绑定。

配置选项

Tmux 提供多种类型的选项来配置 Tmux 的行为:

  • server 选项:影响整个服务器行为
  • session 选项:影响会话
  • window 选项:影响窗口
  • pane 选项:影响 Pane
  • user 选项:为指定用户提供配置

通过 show-options 命令可以显示当时配置的选项:

  • -s:显示 server 选项
  • -g:单独使用 -g,显示全局 session 选项
  • -g -w:显示全局 window 选项
  • 如果需要显示某个指定选项名称,直接在 show-option 命令后添加选项名即可

使用 set-option 命令可以改变选项的值。

保存/恢复 tmux 会话

如果系统不小心重启,或者 tmux-server 不小心被 kill 了,此时所有的 tmux 会话都会被丢失,所以我们能够保存/恢复 tmux 会话。这里会用到几个工具。

  • 安装 Tmux Plugin Manager,它是 tmux 的插件管理器
1
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

~/.tmux.conf 添加如下内容,添加完成后,通过 source-file 让配置文件重新生效:

1
2
3
4
5
6
7
8
9
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'

# other plugin


# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'
  • 安装 Tmux Resurrect,它就是用来保存/恢复会话的插件

~/.tmux.conf 添加如下如下插件:

1
set -g @plugin 'tmux-plugins/tmux-resurrect'

之后就可以通过 <prefix> + I 安装插件了。

  • 保存/恢复会话
  1. 通过 <prefix> + Ctrl+s 保存会话
  2. 通过 <prefix> + Ctrl+r 恢复会话

但是这个脚本只能恢复最新的快照,其实它是把所有的会话信息保存在 ~/.tmux/resurrect/ ,然后通过 last 指向最新的扩展,所以如果要保存多个会话,可以自己折腾这个目录下的文件。

我的 .tmux.conf

这里是我的 .tmux.conf,参考了一些 Oh My Tmux! 中的配置,但是没有那些花哨的功能。还是那句话,适合自己的才是最好的。

Reference