tmux最佳实践

介绍

背景

有时候, 你正在愉快的coding. 突然产品过来跟你沟通需求, 你离开了你的vim, 跟他扯淡扯了一个小时, 等你回来, WTF! ssh自动断开了. 或者你必须离开工位, 把你的电脑锁屏,等你回来你的iterm2上面所有的服务器连接全都这样了, 每一次你都要重新连接一遍,是不是很闹心.

tmux 是一款终端复用命令行工具,一般用于 Terminal 的窗口管理。在 macOS 下,使用 iTerm2 能应付绝大多数需求。

你可以建立多个标签页, 每个标签页又可以分离出若干个窗格. 但是它解决不了前面所说的问题. 超时断开的问题.

tmux可以在终端重启之后通过命令行恢复上次的 session, 而其他的终端软件不行.

tmux设计非常简单优雅, 一切可以通过快捷键(默认是ctrl+b)再加上一个键来触发. 熟悉之后如行云流水.逼格很高, 又解决了效率问题.

安装

(方法一)手动安装和配置

mac安装

brew install tmux

centos安装

不要直接yum install tmux这样安装的是1.8很低的版本,不支持鼠标操作。 要安装最新版

sudo yum install http://galaxy4.net/repo/galaxy4-release-7-current.noarch.rpm
sudo yum install tmux

linux上非root用户离线安装

下载源码包

wget https://github.com/tmux/tmux/releases/download/2.2/tmux-2.2.tar.gz
wget https://github.com/libevent/libevent/releases/download/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz
wget http://ftp.gnu.org/gnu/ncurses/ncurses-6.0.tar.gz

解压

tar -zxvf libevent-2.0.22-stable.tar.gz
tar -zxvf ncurses-6.0.tar.gz
tar -zxvf tmux-2.2.tar.gz

安装

#libevent
cd libevent-2.0.22-stable
./configure --prefix=$HOME/.local --disable-shared
make
make install
cd ..

#ncurses
cd ncurses-6.0
./configure --prefix=$HOME/.local
make
make install
cd ..

#tmux
cd tmux-2.2
./configure CFLAGS="-I$HOME/.local/include -I$HOME/.local/include/ncurses" LDFLAGS="-L$HOME/.local/lib -L$HOME/.local/include/ncurses -L$HOME/.local/include" --prefix=$HOME/.local
make
cp tmux $HOME/.local/bin
cd ..

配置环境变量

#环境变量设置
#将下面的语句添加到.bashrc中
export PATH="$HOME/.local/bin:$PATH"
#重载环境
source .bashrc

配置

配置文件~/.tmux.conf

set -g allow-rename off
setw -g mouse on
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-sidebar'
run '~/.tmux/plugins/tpm/tpm'

安装插件管理器

git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

如果特殊时期访问不了,可以换gitee的

git clone https://gitee.com/guanvi/tpm  ~/.tmux/plugins/tpm

(方法二)自动安装和配置

运行下面的自动安装配置脚本

sudo yum install -y http://galaxy4.net/repo/galaxy4-release-7-current.noarch.rpm
sudo yum install -y tmux
cat > /root/.tmux.conf <<EOF
set -g allow-rename off
setw -g mouse on
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect'
# 文件目录树
# 切换到侧栏的目录树: <prefix+Tab>
# 光标移动到侧边栏上: <prefix+Backspace>
set -g @plugin 'tmux-plugins/tmux-sidebar'
run '~/.tmux/plugins/tpm/tpm'
EOF
yum install -y git
git clone https://gitee.com/guanvi/tpm  ~/.tmux/plugins/tpm

tmux安装插件

上面的手动安装配置之后需要安装插件,自动安装配置运行之后也需要安装插件 进入 Tmux 后加载上述配置,并安装插件:

:source-file ~/.tmux.conf
<prefix> + I

I 是 Install 的简写,用来安装前述 @plugin 声明的插件。安装成功后你会看到 Tmux 的成功提示。

使用介绍

快捷键

一般情况下 tmux 中所有的快捷键都需要和前缀快捷键 ⌃b 来组合使用(注:⌃ 为 Mac 的 control 键)

tmux把所有操作分作三个概念session window pane

pane操作

pane就是同一个标签页下面的不同的窗格

  • % 左右平分出两个窗格

  • " 上下平分出两个窗格

  • x 关闭当前窗格

  • { 当前窗格前移

  • } 当前窗格后移

  • ; 选择上次使用的窗格

  • o 选择下一个窗格,也可以使用上下左右方向键来选择

  • space 切换窗格布局,tmux 内置了五种窗格布局,也可以通过 ⌥1⌥5来切换

  • z 最大化当前窗格,再次执行可恢复原来大小

  • q 显示所有窗格的序号,在序号出现期间按下对应的数字,即可跳转至对应的窗格

    如图所示, 在一个窗口下划分出了多个窗格

window操作

tmux 除了窗格以外,还有窗口(window) 的概念。依次使用以下快捷键来熟悉 tmux 的窗口操作:

  • c 新建窗口,此时当前窗口会切换至新窗口,不影响原有窗口的状态
  • p 切换至上一窗口
  • n 切换至下一窗口
  • w 窗口列表选择,注意 macOS 下使用 ⌃p⌃n 进行上下选择
  • & 关闭当前窗口
  • , 重命名窗口,可以使用中文,重命名后能在 tmux 状态栏更快速的识别窗口 id
  • 0 切换至 0 号窗口,使用其他数字 id 切换至对应窗口
  • f 根据窗口名搜索选择窗口,可模糊匹配

会话操作

如果运行了多次 tmux 命令则会开启多个 tmux 会话(session)。在 tmux 会话中,使用前缀快捷键 ⌃b 配合以下快捷键可操作会话:

  • $ 重命名当前会话
  • s 选择会话列表
  • d detach 当前会话,运行后将会退出 tmux 进程,返回至 shell 主进程

在 shell 主进程下运行以下命令可以操作 tmux 会话:

tmux new -s foo # 新建名称为 foo 的会话
tmux ls # 列出所有 tmux 会话
tmux a # 恢复至上一次的会话
tmux a -t foo # 恢复名称为 foo 的会话,会话默认名称为数字
tmux kill-session -t foo # 删除名称为 foo 的会话
tmux kill-server # 删除所有的会话

最佳实践

  • mac本地: tmux创建并打开一个新的tmux session. 然后进入经常进入的文件夹, 以文件夹名字命名window, 保存多个window. 如iblog文件夹, 进入之后^b + ,重命名为iblog. 然后^b+c新建一个window 进入Downloads文件夹, 按^b+,重命名为Downloads. 以后关掉终端之后直接按tmux a直接进入之前的环境

  • tmux默认在进入一个文件夹之后会自动重新命名window. 为了防止这个行为可以在.tmux.conf当中加入set allow-rename off.然后再命令行中执行tmux source-file ~/.tmux.conf来让配置文件生效. 这样就不会在自动重命名window了.或者可以在tmux窗口下按:进入命令行模式执行source-file ~/.tmux.conf也可以.

  • jump跳板机: tmux创建并打开一个新的tmux session. 然后ssh连接对应的服务器, 使用^b+,重命名为服务器的简称,使用^b+c新建window, 再做用样的操作即可. 可以通过^b + $ 重命名session为server, 以后也是通过tmux a直接进入环境

    mac本地:

    跳板机:

  • 切换window用^b + 数字, 使用多window比多pane好, 因为好复制. 想在所有window中切换或者查看有哪些用^b + w, 关闭当前window用^b + &

  • 如果需要用pane, 一般用^b + %左右分, 用^b + "上下分, ^b + x关闭当前窗格. ^b + o 切换窗格, ^b + z最大化窗格和恢复窗格.

  • 还有一个问题, 就是在tmux下默认鼠标滚轮滚动不再是屏幕滚动而是历史命令切换. 解决办法^b + :然后输入set-window-option -g mouse on, 如果不想每次都是用可以写到配置文件`.tmux.conf

想在本地mac上运行, 但每次tmux server自动关闭,想恢复

保存和恢复

安装完成后,在 Tmux 中可以随时保存状态,快捷键:

<prefix> Ctrl+s

下次打开 Tmux 后可以一键恢复:

<prefix> Ctrl+r

这样所有的 Session,Window,Pane 都会恢复到上次保存的状态,关键在于关机前一定要记住保存。

使用后果

想要盒上mac的盖子? 想要锁屏? 随便! 重新解锁之后, ssh jump 登录到跳板机, 执行tmux a之后即可回到你之前的工作状态. 我连接了所有的服务器, 保存成了不同的window. 这样可以一直在跳板机上一直连着, 再也不用重新连接登录了.