E9d57735aa62ebb2bd908476b61336fa
Tmux 菜鸟扫盲

什么是 tmux

tmux 是一个终端会话复用管理工具

说人话

会话表示在 iTerm2 或者系统的终端中打开的一个个窗口,复用管理 表示通过会话共享,会话持久化保存等方式,避免重复创建会话,因此 Tmux 最大的价值就是避免重复创建会话,减少工作量。

本文主要介绍 Tmux 能做什么,以及为什么我会选择使用 Tmux,具体命令和用法可以参考文章末尾的相关教程。

为什么要用 tmux

由于 tmux 是一个会话管理工具,因此日常工作中创建的会话越多创建会话的成本越高保持会话的难度越大,对 tmux 的需求就越强烈。尤其是对于经常通过 ssh 连接远程主机的同学,恰好符合创建会话成本高,保持难度大的特征。

如果重度依赖某台服务器进行开发,往往需要创建大量的会话,一旦到这台服务器的会话断开,不仅当前的工作进度丢失,还需要重新挨个创建会话,折腾很久才进入开发状态。如果要进行远程办公,那么自己平时的 MacBook 就从客户端变成了上述的,被重度依赖的服务器,如果 MacBook 是通过 tmux 管理会话的,那么就可以远程恢复工作。

tmux 是如何工作的

tmux 工作模型

tmux 中,由大到小,共有三个概念,分别是 session,window 和 pane,如下图所示:

  • session 表示会话,可以通过 tmux 命令创建一个新的 session。
  • window 表示会话中的窗口,一个会话可以有多个窗口,并且支持切换。
  • pane 表示 window 中的分区,一个 window 可以由多个 pane 组成。

tmux 相当于用户和终端会话的一个中间层,退出 tmux 的 session 时,这个 session 中实际管理的终端会话并不会结束,下次还可以继续 attach 到这个 session 上,从而实现了会话的复用。

使用 tmux 必须配置一个 prefix 键,目的是和平时的工作按键区分开来,防止误触。所有的 tmux 操作都必须先按 prefix 键才能触发,默认的 prefix 键是 Ctrl + b,但由于相距较远,推荐修改为 Ctrl + a

我的 tmux 实践

我的主要工作场景为:

  1. 连接到各种 Mac Pro 打包机器
  2. 连接到公司各种后端机器
  3. 本地常年负责 Xcode、flutter、Node 和前端的开发

我只用一个 session 来管理所有的会话,在一个 session 中创建多个 window 来进行不同的工作。每一个 window 表示一个工作类型,当切换工作场景时,通过 prefix + w 进行切换,如下图所示:

当在某一个 pane 中工作时,可以通过 prefix + z 临时将这个 pane 全屏化,类似于监控视频中放大某一个小窗口。再次按下 prefix + z 可以恢复原来的大小。

通过插件,我实现了 session 的自动保存和恢复,虽然我的电脑上运行了 Node 服务,连接了六个远程主机,还在用 Vim 编辑文件,但任何时候都可以退出终端,并且通过 tmux a 命令瞬间恢复上次的工作场景,不仅能够记录 pane 的分割布局,还能找回 vim 的编辑状态和恢复 ssh 链接。

如果有必要,通过任何一台电脑连接到我的 MBP,都可以通过 tmux a 命令 attach 到这个工作 session 中,零成本进入工作状态。

tmux 的缺点

  1. 切换 Window 需要习惯,且速度可能略慢一点点
  2. 没有 iTerm2 那么智能的双击复制能力
  3. Prefix 键改成 Ctrl + a 后,对于习惯了 Emacs 按键的同学来说可能会误触,需要习惯 iTerm2 里面的快捷键。

附录:

保持 ssh 连接的正确姿势

tmux 本身并不能提供保持 ssh 连接的能力,可以在客户端(发起 ssh 会话的那一方)编辑 ~/.ssh/config 文件:

Host *
        ServerAliveInterval 10
        ServerAliveCountMax 99999

这表示每隔 10 秒钟发送一次心跳包,最多发送 99999 次,因此只要服务端不掉线,这个会话在 10 * 99999 / 3600 = 277.775 天内都不会被自动关闭。

tmux 插件

  1. tpm:插件管理器
  2. tmux-sensible:大量基础配置
  3. tmux-prefix-highlight:高亮提示是否按下了 prefix 键
  4. tmux-resurrect: session 持久化
  5. tmux-continuum:基于 tmux-resurrect 的 session 自动保存工具
  6. tmux-yank:复制文本
  7. tmux-copycat:更好用的智能复制工具

我的 tmux 配置

```

Bind key

set -g prefix C-a #
unbind C-b # C-b即Ctrl+b键,unbind意味着解除绑定

top Created with Sketch.