Tmux Docs
Tmux Docs
Tmux 是什么?
命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称 " 窗口 "),在里面输入命令。用户与计算机的这种临时的交互,称为一次 " 会话 "(session) 。
会话的一个重要特点是,窗口与其中启动的进程是连在一起的:
- 打开窗口,会话开始;
- 关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完。
一个典型的例子就是,SSH 登录远程计算机,打开一个远程窗口执行命令。这时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的。因为上一次 SSH 会话已经终止了,里面的进程也随之消失了。
为了解决这个问题,会话与窗口可以 " 解绑 ":窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候,再让会话 " 绑定 " 其他窗口。
Tmux 就是会话与窗口的 " 解绑 " 工具,将它们彻底分离。
Tmux 的标准定义是:
1 | 一个在 Unix 和类 Unix 系统上运行的终端复用器(terminal multiplexer)。它允许用户在单个终端窗口中同时访问多个终端会话。使用 Tmux,您可以创建、管理和控制多个终端会话,这些会话可以在后台运行,即使您断开了与服务器的连接也可以保持运行。这使得在服务器上同时运行多个终端会话变得更加高效和方便。 |
Tmux 基本组件概念
Tmux 的核心组件分为三个:
- 会话 session
- 窗口 window
- 窗格 pane
下图是一个布局示意图
通常来说,一个用户只需要创建一个 session 即可。不同的任务可以在不同的 window 下完成。每个 window 可以按需要划分为若干个 pane 来辅助完成任务。
部署 Tmux
最简单的当然是 apt install tmux
,不过这样安装的版本并不是最新版(但是完全不影响使用)。我个人喜欢手动编译,反正要不了多久。
首先准备编译环境:
1 | sudo apt update |
Tmux wiki 中没有提到 automake
,但不排除有的机器,例如容器环境,没有该工具,所以多装一个保险。
然后编译构建:
1 | git clone https://github.com/tmux/tmux.git |
这里是 git clone 的源码,而不是 release 发布的
tmux-xx.tar.gz
,否则找不到autogen.sh
如何使用 Tmux
关于快捷键
Tmux 有大量的快捷键。所有快捷键都要通过前缀键唤起。默认的前缀键是 Ctrl + b
,即先按下 Ctrl + b
,快捷键才会生效。
举例来说,帮助命令的快捷键是 Ctrl + b + ?
。它的用法是,在 Tmux 窗口中,先按下 Ctrl+b
,再按下 ?
,就会显示帮助信息。
然后,按下 ESC
键或 q
键,就可以退出帮助。
由于快捷键的数量太多,全部记住未必就真的“快捷”,个人认为部分指令的缩写也足够简洁明了(除非英语不太行),所以下文只会提到常用的快捷键。
一些 Reference:
会话
创建会话
1 | # 创建一个名为 wym 会话 |
执行后,会自动进入 wym session,并在终端下方进行亮绿色显示 [wym]
。
在这个 session 中执行的命令,产生的任何输出都不会随着 ssh 连接的断开而丢失,即直接关闭终端程序或者网络突然断开,都不会影响当前的会话。
连接会话
当我们登录服务器并需要重新连接到之前的会话时,可以通过如下方式:
1 | # 查看当前正在运行的会话 |
可以看见,当前有两个 tmux 会话,一个叫 wym
,一个叫 yzh
。我们需要重新连接到 wym
以继续之前的工作,执行:
1 | # tmux attach (附上) -t (target, 目标) session_name |
- 如果退出会话前,有进程正在输出,则你会看到输出仍在进行或者已停止
- 之前执行的指令记录仍然存在
退出会话
其实“退出”叫做“分离/卸载”更合适,因为关键字是
detach
退出会话有两种方式:快捷键和指令
1 | # 指令 |
综上,一般的工作流程是:创建会话摸摸鱼,然后退出会话恰个饭,接着连接会话继续摸。。。
杀死会话
除非你确定这个 session 已经没用了,否则不要轻易这么做。
1 | tmux kill-session -t <session-name> |
窗口
多个不同的任务,可以分别在不同的窗口内执行。例如 Window1 用来跑模型,Window2 用来看日志。
创建窗口
输入 tmux new
后按 Tab
,就可以得到相应的提示信息。
1 | # 指令(可以指定窗口的名称) |
快捷键创建的窗口会使用当前的 shell
作为名称,例如 bash
,zsh
等,无法自定义名称。
切换窗口
1 | # 查看当前开启的窗口 |
可以看见终端下方的高亮提示条内,其实是有相关辅助信息的,例如:
1 | [wym] 0:zsh 1:zsh- 2:zsh* |
其中,[wym]
是当前的 session 名称,0,1,2 是三个 window 的编号。*
表示当前所处的时候 2 号 window,这和 tmux lsw
输出中的 active
所在行是对应的。-
表示上一个 window。
如果要切换窗口,也有两种方式:
1 | # 指令:切换到0 |
杀死窗口
杀死的命令其实都差不多的,可以
tmux kill
然后按Tab
提示。
1 | # 指令 |
窗格
创建窗格
窗格其实就是把一个窗口(window)分割为多个小块,每个块就是一个 pane。
屏幕够大的话,非常 nice👍
那么怎么分割呢?很显然,水平方向可以分成左右两块,垂直方向可以分成上下两块。如果要分多块,就是在每个 pane 里继续上下左右分割,行成不规则形状。
1 | # 水平分割 |
例如先后执行上面两句指令的话,你会得到这样一个布局:
切换窗格
显然,屏幕上有这么多块,需要来回切换。这里有若干种方式:
- 参见文末的开启鼠标控制一节。开启后,就可以进行符合直觉的鼠标点击切换了。
- 指令
- 快捷键
下面针对 2,3 两点进行介绍。
指令切换
1 | # 查看当前 pane |
快捷键
1 | ctrl + b + % 垂直分割 |
杀死窗格
1 | # 指令 |
配置 Tmux
开启鼠标控制
1 | # 创建Tmux配置文件 |
即时生效,无需重启 Tmux
中文显示异常
当 Tmux 的中文显示异常时(例如全部变为了下划线 _
),可以尝试如下方式:
1 | vim ~/.bashrc # 或者 vim ~/.zshrc |
这个选项
.zshrc
默认就有,只不过被注释掉了
也可以采用 -u
参数强制 Tmux 使用 utf8:
1 | # 使用 tmux 时添加 -u 参数 |
或者干脆使用 alias:
1 | alias tmux='tmux -u' |