前言

tmux是程序员们必备的一款神器,有了它,就可以轻松地在服务器上开启多个shell来进行工作。这些shell会很好地运行着,在下一次连接到服务器上的时候,可以接着上次的工作继续进行下去。

简介

tmux 是一个优秀的终端复用器类自由软件,功能类似 GNU Screen,但使用 BSD 许可发布。用户可以通过 tmux 在一个终端内管理多个分离的会话,窗口及面板,对于同时使用多个命令行,或多个任务时非常方便。功能很多,总而言之,入坑就对了。

  • 一个虚拟终端可以管理多个会话,窗口和面板
  • 支持分屏,同时处理多个操作
  • 窗口、面板可以在会话间自由移动,切换
  • 丰富灵活的状态行展示
  • 支持自定义快捷键,依照个人习惯配置令操作更高效
  • 不受断网影响,避免丢失重要工作进度
  • 结对编程,方便演示与协作
  • 自带复制粘贴缓冲区管理
  • 脚本化配置,可配置多种操作环境

层次结构

tmux的主要元素分为三层:

  • Session,一组窗口的集合。通常用来概括同一个任务。session可以有自己的名字便于任务之间的切换。
  • Window,单个可见窗口。Windows有自己的编号,也可以认为和ITerm2中的Tab类似。
  • Pane,窗格。被划分成小块的窗口,类似于Vim中 C-w +v 后的效果。
    tmux

安装

1
sudo apt-get install tmux

使用

  1. 查询Session,tmux ls
  2. 创建Session,tmux new -s session-name
  3. 断开Session,tmux detach
  4. 重新连接Session,tmux a -t session-name
  5. 关闭Session,tmux kill-session -t session-name

默认快捷键

系统指令
Ctrl+b ? 显示快捷键帮助文档
Ctrl+b d 断开当前会话
Ctrl+b D 选择要断开的会话
Ctrl+b Ctrl+z 挂起当前会话
Ctrl+b r 强制重载当前会话
Ctrl+b s 显示会话列表用于选择并切换
Ctrl+b : 进入命令行模式,此时可直接输入ls等命令
Ctrl+b [ 进入复制模式,按q退出
Ctrl+b ] 粘贴复制模式中复制的文本
Ctrl+b ~ 列出提示信息缓存
窗口指令
Ctrl+b c 新建窗口
Ctrl+b & 关闭当前窗口(关闭前需输入y or n确认)
Ctrl+b 0~9 切换到指定窗口
Ctrl+b p 切换到上一窗口
Ctrl+b n 切换到下一窗口
Ctrl+b w 打开窗口列表,用于且切换窗口
Ctrl+b , 重命名当前窗口
Ctrl+b . 修改当前窗口编号(适用于窗口重新排序)
Ctrl+b f 快速定位到窗口(输入关键字匹配窗口名称)
窗格指令
Ctrl+b 当前面板上下一分为二,下侧新建面板
Ctrl+b % 当前面板左右一分为二,右侧新建面板
Ctrl+b x 关闭当前面板(关闭前需输入y or n确认)
Ctrl+b z 最大化当前面板,再重复一次按键后恢复正常(v1.8版本新增)
Ctrl+b ! 将当前面板移动到新的窗口打开(原窗口中存在两个及以上面板有效)
Ctrl+b ; 切换到最后一次使用的面板
Ctrl+b q 显示面板编号,在编号消失前输入对应的数字可切换到相应的面板
Ctrl+b { 向前置换当前面板
Ctrl+b } 向后置换当前面板
Ctrl+b Ctrl+o 顺时针旋转当前窗口中的所有面板
Ctrl+b 方向键 移动光标切换面板
Ctrl+b o 选择下一面板
Ctrl+b 空格键 在自带的面板布局中循环切换
Ctrl+b Alt+方向键 以5个单元格为单位调整当前面板边缘
Ctrl+b Ctrl+方向键 以1个单元格为单位调整当前面板边缘(Mac下被系统快捷键覆盖)
Ctrl+b t 显示时钟

配置文件

tmux 中的很多操作都是通过快捷键去实现的 ,每次基本都要先执行prefix(默认是Ctrl+b),这个前缀键对我是十分不友好的,所以我通过配置文件修改成Ctrl+a
通常配置文件路径为~/.tmux.conf,根目录没有就新建一个。以下是我的配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Send prefix,设置Ctrl+a为前缀键
set-option -g prefix C-a
unbind-key C-a
bind-key C-a send-prefix

# Mouse mode,设置可以鼠标点击不同窗格
set -g mouse on

# Set easier window split keys,设置‘=’为向右新开窗格,‘-’为向下新开窗格
bind-key = split-window -h
bind-key - split-window -v

# tmux插件,用于备份session,免得电脑重启需要重新打命令
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'

set -g @continuum-save-interval '60'
set -g @continuum-restore 'on'
set -g @resurrect-capture-pane-contents 'on'

run-shell ~/.tmux/plugins/tmux-resurrect/resurrect.tmux
run-shell ~/.tmux/plugins/tmux-continuum/continuum.tmux

修改完配置需要source配置文件才能完成

1
tmux source ~/.tmux.conf

自动备份

到这里是不是跃跃欲试了,稍等,有些特殊bug我们需要注意。当机器需要重启或者意外断电等导致关机,这个时候tmux的session就全部丢失了。作为tmux的重度用户,有时候会有上百个session,有些session中保存了历史命令有可能已经记不清了,session的丢失无疑是个重大的损失。
好在开源社区早已经有了解决方案,只需要简单地配置就可以实现session的会话的自动保存和加载。

原理

整个解决方案由三个tmux插件组成。

  • tpm:tmux plugin manager
    • 这个是用来管理tmux插件的。有了它之后,就可以很轻松地安装和写在tmux插件
  • tmux-resurrect
    • 这个是主角,提供了保存tmux会话到磁盘,以及从磁盘上加载保存的会话的功能。但是只能在需要的时候手动操作
  • tmux-continuum
    • 提供了定时保存,自动加载,以及开机设置自动启动tmux的功能。需要tmux-resurrect来完成具体的工作

安装配置

1
2
3
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
git clone https://github.com/tmux-plugins/tmux-resurrect.git ~/.tmux/plugins/tmux-resurrect
git clone https://github.com/tmux-plugins/tmux-continuum.git ~/.tmux/plugins/tmux-continuum

然后,在~/.tmux.conf中配置:

1
2
3
4
5
6
7
8
9
10
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'

set -g @continuum-save-interval '60'
set -g @continuum-restore 'on'
set -g @resurrect-capture-pane-contents 'on'

run-shell ~/.tmux/plugins/tmux-resurrect/resurrect.tmux
run-shell ~/.tmux/plugins/tmux-continuum/continuum.tmux

最后使配置文件生效tmux source ~/.tmux.conf
这样每隔60分钟就会自动备份一波,你也可以手动备份,快捷键是prefix + Ctrl+s,下次重启后想要恢复,先执行tmux进入,然后prefix + Ctrl+r即可恢复先来的窗口,美滋滋。
另外,如果不小心手动备份一个错误的tmux,想要回滚,可以进入.tmux/resurrect,使用ln -slast链接到指定的tmux_resurrect_xxx.txt文件即可

参考

题外话

oh-my-zsh与tmux搭配更丝滑哦


©2018 - Felicx 使用 Stellar 创建
总访问 113701 次 | 本页访问 326
共发表 83 篇Blog · 总计 127.5k 字