用了 tmux 有一段时间了,特别的喜欢这个软件。平时工作中不仅会用它来进行大量的分屏操作,远程连接时意外断开,还能保持原有的工作不被打算。会话的快速切换也能在需要管理多个项目时让整个流程变得非常的顺畅。在快速切换这方面 tmux 就像是终端中的窗口管理软件,对应到图形界面好比 macOS 下的窗口切换软件 Context。(稍微改造一番后,甚至连操作都很像)

那么,什么是 tmux 呢?

tmux-sample.jpg

tmux is a terminal multiplexer: it enables a number of terminals to be created, accessed, and controlled from a single screen. tmux may be detached from a screen and continue running in the background, then later reattached.

tmux 主要提供两个功能:会话管理(Session Management)窗口管理(Window Management)

会话管理 可以让你管理多个 ttytmux 会让这些 tty 始终保持运行,直到被手动关闭或 tmux server 被 kill。在 ssh 一台远程机器的时候极为有用,ssh 连接意外断开时,tmux 中的 tty 不会受到影响而停止当前工作,当重新 ssh 连接上来时,还能继续工作。

窗口管理 可以让你以多种方式显示 tty ,比如每个窗口都有不同的 tty ,切换窗口的时候显示的 tty 也会一起切换。

如果你熟悉 Screen 的话,你可以把 tmux 当成是 Screen 的加强版(至少我是这么认为的 hhhh)。

概念

先介绍几个小概念可以方便我们理解 tmuxsession, window, pane

  • session: 是一堆 tty 的集合。一个 session 下可以有多个 window
  • window: 会占据一整个终端显示。而一个 window 可以被切分为多个 pane
  • pane: 每个 pane 都是一个 tty
tmux session

tmux session

然后,每个 tmux 都可以连接到同一个 session ,甚至可以同时操作。(在同一开发机上的话,简直是结对编程神器呀)

开始吧

安装

我会用一些比较新的功能,用的版本是 tmux 2.8(其实 2.6 以上即可),所以虽然 tmux 可以从包管理工具里面直接安装,但我一般选择自己编译。

# Install compile tmux dependencies
sudo apt install -y autotools-dev automake libevent-dev ncurses-dev
# Install tmux 2.8
TMUX_VERSION='2.8'

cd /tmp
curl -L  https://github.com/tmux/tmux/releases/download/$TMUX_VERSION/tmux-$TMUX_VERSION.tar.gz -o tmux-$TMUX_VERSION.tar.gz
tar zxvf tmux-$TMUX_VERSION.tar.gz
cd tmux-$TMUX_VERSION
./configure && make
sudo make install

这样,就安装好了,试着输入 tmux -V 看看版本吧。

玩耍时间!

创建 session

首先,让我们先创建一个新的 session ,直接输入 tmux 即可快速的创建一个 session 。在出现的界面下方会出现一个状态栏,会有当前时间,hostname,当前窗口之类的信息(具体显示什么信息是可以配置的,tmux 很灵活,完全可以根据自己的喜好来设置)

创建 pane

然后我们可以试着切分出一个 pane ,按下 prefix key (默认设置下,tmux 绑定 Ctrl + b 作为 prefix key),松开按键后,按下 会在下方竖直切分出一个新的 pane 。现在我们就有两个 pane 啦。

切换 pane

现在的话我们的光标在刚刚新创建的 pane 里,想回到之前的 pane 里的话,就需要能在不同的 pane 之前切换的快捷键,按下 prefix key + arrow key 即可,在现在这个情况呢,就是按 prefix key + 方向上键

退出 pane

退出 pane 的方法很简单,相当于关闭一个 tty ,输入 exit 或者 prefix key + x,按 y 确认即可。

创建 window

接下来我们创用 prefix key + c 建一个新的 window 。状态栏中也会显示新的 window

tmux new window

切换 window

prefix key + n/p 即可切换到 左/右 边的 window 。如果 window 数量比较多呢,那就多按几次(误) 那就按 prefix key + number key 来快速切换,window 的下标会在状态栏中标出。

detach session

逛了一圈之后想退出 tmux ?按 prefix key + d 即可 detach 当前 sessionsession detach 会继续在后台执行,当你需要的时候重新 attach 上去,就可以继续工作啦。

tmux cheatsheet

整理了 tmux 常用的一些快捷键,以便快速查阅:(为方便阅读,以下快捷键均忽略 prefix key

  • session
    • s 列出所有的 session 并能用方向键选择进行切换。
    • $ 重命名当前 session
    • $ detach 当前 session
  • window
    • c 创建新的 window
    • n 切换到右边的 window (next)
    • p 切换到左边的 window (previous)
    • number key 切换到指定的 window
    • & 关闭当前 window
  • pane
    • 竖直切分出新的 pane
    • % 水平切分出新的 pane
    • x 关闭当前 pane
    • arrow key 切换到周围的 pane
    • arrow key 当前的 pane 进入全屏模式,再按一次时,退出全屏
    • meta + arrow key 更改当前 pane 大小 (meta key 也可以当做 option key)
  • : 调出 tmux 命令行(就像 vim 一样),可以输入 tmux 的命令,比如创建一个新的 session

常用的 tmux 命令。

# 列出所有的 session
tmux ls
# 创建新的 session 并指定名字
tmux new -s <session-name>
# attach 到指定的 session 上
tmux attach -t <session-name>
tmux a -t <session-name>
# kill session
tmux kill-session -t <session-name>
# 列出当前 tmux 所有的快捷键
tmux list-keys

最后

tmux 在默认设置下其实挺够用的了,不过还不是特别的方便。

比如不能像前面提到的 Context 一样可以根据名字快速切换 session ,这在 session 多的时候感受尤为明显。执行程序久了,要怎么知道现在执行的是什么程序呢?这些都需要对 tmux 进行额外的配置。

所以下一篇会介绍如何配置 tmux ,以及我的解决方案,并附上 tmux 的一些坑点。

Ref