程序员内功系列--Tmux篇

前言

自从上次埋下了《程序员内功系列–序篇》的坑过后,继续写了《程序员内功系列–iTerm与Zsh篇》,谁知突然之间懒癌又犯了,Tmux篇迟迟没动手写。今日猛然回想起来,半年又过去了,惭愧惭愧。这次还是打算一鼓作气,把剩下的坑都填了吧……

Tmux简介

言归正传,Tmux是一个老牌又经典的终端复用工具,相信命令行的程序员们以及运维同学们都对它赞不绝口。用上了Tmux,仿佛在终端世界为你打开了另外一个窗口…… 不! 其实是另外一堆窗口……好吧,这次,我们就来探究一下Tmux的神奇世界……

提到Tmux,也许不少同学会比较疑惑,跟我平时mac OS下用的iTerm2有啥区别呢?你Tmux有的多个窗口切换,我iTerm2照样有多个Tab来实现类似的功能。其实,不光是窗口,Tmux提供了基于session概念的多终端窗口管理功能。既然有了session,用户就可以随时存储和恢复终端会话。

想象一下某个场景:某个用户开了多个终端窗口SSH登录到远程的服务器上进行运维操作,下班关机回家之后,第二天必须得把所有的终端窗口再重新连接和设置一遍,才能继续昨天的工作。有了session就完全不一样了,下班的时候可以脱离当前session,第二天继续上班,用户随时可以通过命令行恢复上次的会话,这样真是太方便了。所以,使用Tmux的场景大致分为两种:

  • 在服务端运行Tmux,方便保存我们的窗口和各种会话
  • 在本地终端(例如:iTerm2)运行,方便喜欢我们日常程序开发

这样看来,使用Tmux的好处不言而喻。另外,Tmux还提供了许多强大的功能:

  • 提供基于命令行的功能强大的界面。
  • 完整的快捷键系统,可以完全脱离鼠标,通过键盘快捷键组合,完成一切你所需要的操作。
  • 基于会话的窗口管理理念,多个会话,多个窗口和panel,进行快速而又高效的切换。
  • 窗口可以纵向和横向任意分割为多个panel,并实现各种自定义布局,迎合不同用户的需要。
  • 支持 UTF-8 编码及 256 色终端。
  • 支持插件,通过配置不同插件实现界面可定制化。

其实Tmux的功能还有很多,等着你去逐步发现……

会话、窗口与窗格的概念

Tmux中的主要概念分为三个:

  • Session - Session是Tmux中最主要的概念了,默认开启Tmux的时候,就会自动新建一个会话,在这个会话中,也会给你开启一个默认的Window(也即窗口)。Tmux中可以拥有多个会话,多个会话之间可以来回无缝切换。

  • Window - 相比session,Windows是稍微小一点的单位。一个session中,可以开启多个window。这些window同属于一个Session,并由其管理。

  • Panel - Panel是比Window更小的界面元素。前面我们也提到了Tmux中可以对window进行任意分割,由window分割出来的单位就叫做panel了。在同一个window中,用户可以控制光标在分割出的panel中随意移动,用以选定当前作为激活状态的panel。

如果看了这些概念还不太明白,也许下面这个图可以清晰的表明它们之间的关系:

他们的从属关系为:Session -> Window -> Panel

安装与配置

Tmux的安装也非常方便,通常Ubuntu下安装,使用:

1
sudo apt-get install tmux

在mac OS中,推荐使用brew来安装:

1
brew install tmux

Tmux简单配置

Tmux在安装完成之后,可以立即启动,不过这还只算一个“裸奔”的Tmux,因为很多配置项都是默认值,需要我们根据自己的喜好进行一些设置。从零开始创建一个Tmux是比较费神的,建议去网上寻找其他大神的配置文件来修改,这样比较快捷一些。这里提供一个我经常使用的Tmux配置文件,可以作为模板,直接下载后按照自己的喜好来更改。

需要注意的是,tmux的配置文件本身是一个隐藏文件,也就是以 . 号开头的文件,叫做 .tmux.conf 。我们需要把这个文件放在当前用户的默认主目录下,也即 ~/.tmux.conf ,tmux启动后,会自动读取和加载里面的配置项。

配置文件就算这么搞定了,如果你是第一次接触Tmux,建议不用太纠结如何弄清楚配置文件里面的每一项是什么意思,在后续的使用中,你可能会不断去修改和调整,自然而然也就熟悉了。接下来,我们要见识一下Tmux强大的各种快捷键功能。

常用快捷键

初次使用Tmux需要明白的是,Tmux的各种快捷键功能,是需要一个<prefix> 组合键作为前缀的。也就是说,需要先按下 <prefix> 组合键,才能激活快捷键功能,然后再按对应各种功能的快捷键,才会生效。之所以这样设计,估计也是为了把快捷键的输入跟用户正常输入区分开来。

初次使用Tmux,我们要知道的是,Tmux为我们默认预备的 <prefix> 组合键,是 C-b (即Ctrl+b)。当然,根据我们自己的习惯,如果觉得 C-b 按起来不方便,可以通过修改配置文件的方式,自定义自己喜欢的 <prefix> 组合键。比如我就觉得 C-b距离有点远,于是,我的 <prefix> 是这么定义的:

1
set -g prefix C-g

嗯,我把我的 <prefix> 设置为了 Ctrl+g (参考我的配置文件),或许你也能找到自己按起来比较舒适的 <prefix> 组合键。使用Tmux的快捷键,几乎能完成大部分的功能和操作,让你双手几乎不用离开键盘,就可以完成日常的工作,感觉非常的Geek。

这里简单列举一下Tmux的部分快捷键操作,有些快捷键估计跟Tmux默认提供的不太一样,因为我根据自己的喜好进行了一些调整。

窗口(Window)操作

1
2
3
4
5
6
7
<prefix> c  创建新窗口
<prefix> w 列出所有窗口
<prefix> n 后一个窗口
<prefix> p 前一个窗口
<prefix> f 查找窗口
<prefix> , 重命名当前窗口
<prefix> & 关闭当前窗口

窗格(Panel)操作

1
2
3
4
5
6
7
8
9
10
11
<prefix> |  垂直分割
<prefix> - 水平分割
<prefix> o 交换窗格
<prefix> x 关闭窗格
<prefix> <space> 切换布局
<prefix> q 显示每个窗格是第几个,当数字出现的时候按数字几就选中第几个窗格
<prefix> { 与上一个窗格交换位置
<prefix> } 与下一个窗格交换位置
<prefix> u 切换窗格最大化
<prefix> n 切换窗格最小化
<prefix> 0-9 切换到指定编号的窗口

窗格(Panel)选择

1
2
3
4
<prefix> h 选择左边的窗格
<prefix> j 选择下面的窗格
<prefix> k 选择上面的窗格
<prefix> l 选择右边的窗格

参考这里的设置

窗格(Panel)尺寸调整

1
2
3
4
<prefix> H 当前窗格向左扩大3格
<prefix> J 当前窗格向下扩大3格
<prefix> K 当前窗格向上扩大3格
<prefix> L 当前窗格向右扩大3格

另外,打开了这个选项,还能使用鼠标来调整Panel尺寸。

会话(Session)相关

1
2
3
<prefix> :new<回车>  启动新会话
<prefix> s 列出所有会话
<prefix> $ 重命名当前会话

这里只是列出了部分Tmux常用快捷键,初学Tmux,千万别被这么多的快捷键给吓住,随着使用Tmux时间的不断增加,这些快捷键最终会变为肌肉的条件反射,所谓的“无剑胜有剑”,嘿嘿。

Tmux使用效果

嗯,待你玩熟了window与panel,Tmux里面你就可以任意创建自己喜欢的终端布局了。下面是我常用的终端布局效果,供大家围观……

  • 开发程序时的布局

  • 运维与部署程序时的布局

插件系统与常用插件介绍

TPM的安装

跟我们现在常用的很多软件类似,Tmux也支持插件系统,可以通过安装插件扩展出许多功能,让Tmux变得更加强大。在Tmux中,这款插件管理器叫做 TPM - Tmux Plugin Manager

TPM的安装也比较简单:

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

然后,修改Tmux配置文件,让其在启动时加载TPM,参考这里

TPM主要提供插件的安装,更新和移除等管理功能:

  • <prefix> I 安装插件,并更新Tmux
  • <prefix> U 更新所有已安装插件
  • <prefix> Alt U 移除所有插件列表中不存在的插件

常用插件推荐

有了TPM,我们就能够安装和使用各种插件了,这里介绍几款我比较常用的插件:

  • Tmux Resurrect 一个非常好用的保存当前Tmux窗口和Panel布局的插件。它可以帮助你持久化当前Tmux中所有的窗口和Panel布局。如果你对窗口进行了分割并且精心调整过,在退出Tmux之前可以使用快捷键对布局进行持久化。下一次启动Tmux的时候,也能非常方便的用快捷键恢复上次的窗口布局,真是非常方便。
    插件地址:https://github.com/tmux-plugins/tmux-resurrect

  • Tmux urlview 在终端界面中自动搜寻所有的URL链接地址,合并为一个可以选择的列表,然后选中直接在浏览器中打开URL。省去了用鼠标复制URL,再打开浏览器粘贴的繁琐操作,非常高效,值得推荐!
    插件地址:https://github.com/tmux-plugins/tmux-urlview

  • Tmux open 使用系统中默认文件类型对应的程序,快速打开在终端中选中的文件名。这个也非常高效,值得推荐! 插件地址:https://github.com/tmux-plugins/tmux-open

  • Tmux-Battery 和 Tmux-CPU 这两个插件也值得推荐,安装好后,能在Tmux右下角显示当前机器的电量和CPU占用百分比,能给Tmux增色不少。

插件地址: https://github.com/tmux-plugins/tmux-battery https://github.com/tmux-plugins/tmux-cpu

总结

Tmux真是终端下的利器,在macOS下,配合iTerm2和Vim,能轻松的打造出高效的开发环境。在服务端运行Tmux,也能为你日常运维工作带来许多便利。所以,将Tmux大法谨记心中,他日必能为君带来极大的便利和效率。

相关阅读

支持原创技术分享,据说打赏我的人,都找到了女朋友!