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 | tmux ls |
可以使用 tmux new -s $session_namme
的方式来创建会话,从而指定会话名:
1 | tmux new -s test |
该命令提供一个 -A
标志,当会话名已经存在时,直接 attach 到该会话而不是新创建一个会话。
tmux 启动会话后,默认是创建一个 shell。可以通过传递参数的方式,tmux 会在 shell 中执行该命令:
1 | tmux new vim |
查看会话
使用 tmux ls
或 tmux list-session
即可查看当前会话列表:
1 | tmux ls |
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 %
:将窗口划分为左右两个 paneC-b "
:将窗口划分为上下两个 pane
选择 pane
当窗口划分为多个 pane 后,可以选择 pane。通过 display-panes
查看 pane,通过 select-pane
选择 pane。
如下快捷键也可以选择 pane
C-b Up
,C-b Down
,C-b Left
,C-b Right
:上下左右选择 paneC-b q
:首先输出每个 pane 的编号,此时输入 pane 编号即可选中 pane(需要在编号消失前输入)C-b o
:切换到下一个 paneC-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 的 sessionC-b w
:可以会列出的 session 进行展开,列出每个 session 下的窗口
以树形图展开会话、窗口、pane 后,可以通过 up
、down
进行选择,通过 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 | # List of plugins |
- 安装
Tmux Resurrect
,它就是用来保存/恢复会话的插件
在 ~/.tmux.conf
添加如下如下插件:
1 | set -g @plugin 'tmux-plugins/tmux-resurrect' |
之后就可以通过 <prefix> + I
安装插件了。
- 保存/恢复会话
- 通过
<prefix> + Ctrl+s
保存会话 - 通过
<prefix> + Ctrl+r
恢复会话
但是这个脚本只能恢复最新的快照,其实它是把所有的会话信息保存在 ~/.tmux/resurrect/
,然后通过 last
指向最新的扩展,所以如果要保存多个会话,可以自己折腾这个目录下的文件。
我的 .tmux.conf
这里是我的 .tmux.conf
,参考了一些 Oh My Tmux!
中的配置,但是没有那些花哨的功能。还是那句话,适合自己的才是最好的。