Tmux是什么
终端复用工具:在一个终端窗口下打开多个终端
为什么要用Tmux
- ssh/telnet登录远程计算机时,如果在前台终端执行一些脚本任务,当网络出现中断时,终端连接断开,则任务自动终止;
- 用不同终端进入不同目录,执行不同任务。我是一周开关机一次,每次要干很多事,省去重复的cd操作,能省下不少时间
- 登录远程计算机时,提供一种轻量级的多窗口打开方式。如果你直接使用类似ubuntu桌面系统,那你已经可以很方便的通过建立多窗口和选项卡了。原生的终端,只是比tmux少了一个多pane的拆分。
安装
$ sudo apt-get install tmux
Tmux概念
会话(session)、窗口(window)、窗格(pane)
从这张图上就能比较清楚的看出窗口和pane的关系了,说白了就是一个大窗口下的多个小窗口。
对于session和window的关系,按照以下步骤操作以后,也就很好理解了。
配置文件
$ vim ~/.tmux.conf
添加以下两行配置,分别配置纵向、横向分割窗口的快捷键。
bind | split-window -h
bind - split-window -v
工作流
1. 新建会话,同时给会话命名
$ tmux new -s work ## 新建会话work
得到以下窗口:
创建会话时,同时创建了一个默认窗口0,bash显示当前终端执行的程序。
然后我们觉得bash这种毫无意义的命名令人费解,我们来改掉它。
这里提一句:“tmux的所有快捷键都以ctrl + b开始。”
1.1 给默认创建的窗口0改名
ctrl+b , # 同时按下ctrl+b,之后松开按键,再按`,`
这里我将该窗口改名为’tmp’,并将当前窗口的工作目录也cd到/tmp目录。
个人习惯将窗口名称改成工作目录名称,表示我要在这个窗口下操作/tmp目录下的文件。
2. 当前会话中新建窗口,并改名
接下来我们来看下tmux的“复用能力”
ctrl+b c # 同时按下ctrl+b,之后松开按键,再按`c`
我们在当前的会话[work]下,得到了一个新的窗口:“1:bash”
同样的,这个新建的窗口一般也需要改名,这里我将它改成work,并切换工作目录:
3. 当前窗口中新建pane
会话中建多个窗口,属于session级别的终端复用,同样的,我们也可以在一个窗口中建立多个pane,进行终端的复用。
这个特性在一些应用场景可能非常有用,如:
- socket调试,左边的pane运行server,右边的pane运行client
- 代码编译,上边的窗口执行编译操作,下边的窗口查看编译生成文件
- 临时帮同事找点东西。。。
- 。。。。
3.1 横向分割
ctrl+b - #得益于上面给出的配置文件,这里可以直接用'-',进行横向的窗口切分
3.2 纵向分割
ctrl+b | # 纵向切分窗口
我们在3.1执行的基础上,直接执行纵向切分的操作,得到以下窗格:
3.3 pane之间的切换
ctrl+b o # 切换到下一个pane
ctrl+b 方向键 # 切换的指定方向的pane
ctrl+b q # 该组合按键,会在当前窗口的所有pane上显示pane编号,在编号消失之前,按下对应编号,即可直接跳到对应的pane
3.4 pane的窗口独占
pane的优势时对比查看不同目录下的内容,缺点是好好的一个大屏幕被切小了,再执行grep等搜索命令时,非常不友好,此时需要一个将当前pane独占整个窗口的功能,当然这是临时的,因为我们并不想要退出其他pane。
ctrl+b z
如下图,当我们看到窗口名称后面有’Z’符号时,就表明这个窗口中,有其他的pane被隐藏了。
之后你可以通过同样的操作退出pane的窗口独占,或者直接使用3.3介绍的命令,进行pane的切换。
4. 窗口之间的切换
我们在"1:work"窗口下已经干了很多事了,现在想要回到“0:tmp”下:
ctrl+b 0 # 0为切换目的窗口的编号
ctrl+b p # 切换到previous窗口
ctrl+b n # 切换到next窗口
我们在work窗口下执行以上任意一个操作,都会跳到0窗口。
5. TMUX翻页
翻页操作是很多人拒绝使用tmux的原因,因为它默认不支持鼠标翻页的。
在我们使用grep搜索代码时(特别是linux内核这种大工程),搜索结果可能有很多页,这时翻页的体验比较重要。但是到这时,我已经觉得tmux真香了,实在不愿意因为这种原因而放弃它。
于是我开始反过来思考:
1. 为什么搜索结果会有这么多页?
2.grep
的时候是不是要使用-w
参数?
3. 我是不是一定要在根目录下执行搜索?
4. 我是不是直接搜索某单一文件、文件夹就可以
5.grep -rni
搜索出来的结果,我会不会一行一行的仔细看完基于以上思考,我认为如果搜索结果太多,那就想办法减少一些,让搜索结果更有针对性。
ctrl+b pageup/pagedown
6. 把tmux会话扔回后台
6.1 detach当前会话
ctrl+b d # detach
6.2 查看后台会话
$ tmux ls
6.3 重新连接后台会话
$ tmux attach -t work # work为后台会话名称。
# 这里有一个助记技巧,来自油管上一个哥们录制tmux教程的语音
# “tmux attach to”,所以就是tmux attach -t,‘-t’对应to
6.4 杀掉后台会话
$ tmux kill -session -t session-name
7. TMUX常用操作总结
Ctrl-b $ # 重命名当前session
Ctrl-b c # 创建新窗口
Ctrl-b d # session detach
Ctrl-b l # 跳转到上一个(刚才操作的)活动窗口
Ctrl-b n # 跳转到下一个窗口
Ctrl-b p # 跳转到前一个窗口(窗口编号概念上的前后)
Ctrl-b w # 列出当前会话的所有窗口
Ctrl-b & # 干掉当前窗口,如果你当前窗口只有一个pane的话,你也可以直接执行exit命令
Ctrl-b , # 重命名当前窗口
Ctrl-b q # 显示当前窗口的pane编号
Ctrl-b o # 切换到下一个pane
Ctrl-b ? # 列出所有按键绑定
Ctrl+b f # 在多个window里搜索关键字
Ctrl-b % # 垂直分割窗口,我们已经在配置文件里改成'|'了
CTRL-b " # 水平分割窗口,我们已经在配置文件里改成'-' 了
Ctrl+b :kill-session # 干掉当前session
Ctrl+b :kill-server # 干掉所有session,
# 这两个命令我是现查的,因为周五下班的时候,
# 我就直接关机了,一般不需要kill session
Ctrl+b x # 退出当前pane,执行exit的作用是一样的
Ctrl+b ( # 切换到前一个session
Ctrl+b ) # 切换到后一个session
8. 命令操作
Ctrl + b :
# 进入命令行模式
move-window -t 0 # 当前窗口移动到0号窗口位置,要求0号窗口未被占用
swap-window -t 0 # 当前窗口与0号窗口交换
9. TMUX鼠标操作
TMUX是支持鼠标操作的,喜欢的同学可以在网上找到一些文章。
个人用下来不是很习惯,就不给各位留传送门了。