多终端管理器tmux
程序员利器
多终端管理器tmux
tmux
为什么要用tmux
tmux是什么?tmux是linux中一种管理窗口的程序。那么问题来了:Mac自带的Iterm2很好用啊。既支持多标签,也支持窗体内部Panel的分割,为什么还要用tmux?其实,多标签和分割窗体只是tmux的部分功能。用tmux的主要原因是它提供了一个窗体组随时存储和恢复的功能。看看以下的使用场景是否适合你:
- 公司台式机开了一堆vim和log打印窗口下班了。到家后灵感突发,想要继续coding,登陆VPN,SSH连上台式后发现又要重新打开各种窗口,瞬间没心情了。。。FML!这个时候你就可以在你的公司台式机上装个tmux。同一组工作环境,在多处共享。
- 公司服务器上调试程序,开了一堆窗口。出去吃了个饭,发现SSH超时了,
broken pipe
。重头开始。。。FML!如果你之前使用了tmux就不会有这样的问题,attach就能找回原来打开的那些窗口。
tmux的基本概念
我们先来理解下tmux的几个元素。tmux的主要元素分为三层:
- Session 一组窗口的集合,通常用来概括同一个任务。session可以有自己的名字便于任务之间的切换。
- Window 单个可见窗口。Windows有自己的编号,也可以认为和ITerm2中的Tab类似。
- Pane 窗格,被划分成小块的窗口,类似于Vim中 C-w +v 后的效果。
为了更好的理解,下面是三个元素在tmux中的具体展现。
可以看到Session总在tmux的左下角显示,通常会为他命名。例如我正在写博客,开了很多窗口那么我就会把这组窗口命名为blog
方便之后的重连和切换。而Window也会在最下方以一种Tab的形式展现。每个window都有自己的需要,也会以当前活动进程的名字命名。而Pane就比较好理解,即把单个窗口分割成若干个小块后的元素。
tmux的基本操作
Prefix-Command
前置操作:所有下面介绍的快捷键,都必须以前置操作开始。tmux默认的前置操作是CTRL+b
。例如,我们想要新建一个窗体,就需要先在键盘上摁下CTRL+b
,松开后再摁下n
键。
下面所有的prefix
均代表CTRL+b
Session相关操作
操作|快捷键 -|- 查看/切换session| prefix s 离开Session| prefix d 重命名当前Session| prefix $
Window相关操作
操作|快捷键 -|- 新建窗口|prefix c 切换到上一个活动的窗口|prefix n 关闭一个窗口|prefix & 使用窗口号切换|prefix 窗口号 name window|prefix , find window|prefix f
Pane相关操作
操作|快捷键 -|- 切换到下一个窗格|prefix o 查看所有窗格的编号|prefix q 垂直拆分出一个新窗格|prefix “ 水平拆分出一个新窗格|prefix % 暂时把一个窗体放到最大|prefix z
tmux常用功能
竖直方向分割屏幕结合使用 Vim,而在另一边查看代码运行结果.
从图中可以看出:
- 左侧:Vim(左上方是一个 Ruby 的类文件,左下方是针对这类编写的测试文件)
- 右侧:一个 Bash 的会话
要创建一个竖直放置的窗格很容易,待开启了一个 Tmux 会话之后,只需再按下 Ctrl-b % ,一个竖直窗格就出现了。另外,若要把屏幕沿水平方向分割,则只需要按下 Ctrl-b “。在 Tmux 的窗格间移动光标也很简单,只需要先按下 Tmux 的快捷键前缀,然后再按下对应的方向键就可以让光标进入到目标窗格了。
窗口间的文本复制粘贴
把 Tmux 设为 vi 模式,使其与 Vim 的操作更加接近。为此,需要将以下配置加入到文件 ~/.tmux.conf 中。
# Use vim keybindings in copy mode
setw -g mode-keys vi
首先按下 Ctrl-b [ 进入复制模式,然后可以看到一小段高亮的文本出现在了屏幕的右上角 (“[0/0]”)(如下图所示)
接下来就可以像在 Vim 中一样用 j、k、l 和 h 等键在文本间移动光标了。把光标移动到想复制的文本上后再按下空格键就可以开始选择文本了(这和在 Vim 中复制文本的步骤一模一样)。选择完要复制的文本后再按下回车键。这样 IP 地址就复制下来并可以粘贴到任何地方了。我们还可以通过修改tmux配置让上述选择/拷贝/粘贴的快捷键更符合Vi风格
# 按下<Escape>进入拷贝模式,v进行选择,y拷贝所选内容,p进行粘贴
bind Escape copy-mode
bind -t vi-copy v begin-selection
bind -t vi-copy y copy-pipe "xclip -sel clip -i"
unbind p
bind p pasteb
开启批量执行
例如模拟一个多终端的并发测试,多开几个pane,Ctrl+b后输入:set synchronize-panes ,输入:set sync [TAB]键可自动补齐,批量执行任意一个pane输入的指令