tmux
Posted 只缘心高嫌地窄
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tmux相关的知识,希望对你有一定的参考价值。
原理
- 你可以随时退出或者进入任何一个Session。每个Session有若干个Window,每个Window又可以分成多个窗格(Pane)
- Session可以完全恢复!但是关机就不可以了,不过你可以写脚本来恢复
- tmux -> session -> window -> pane
- 一个会话(Session)可以包含多个窗口,一个窗口(Window)可以包含多个窗格(Pane)
安装 Tmux
- apt-get install tmux
- sudo port install tmux
- sudo brew install tmux
- sudo yum install tmux
- 其他系统直接安装 Tmux 的 tar 包,Tmux 依赖于 libevent 和 libevent-devel 包.
- 配置 Tmux 安装完 Tmux 默认没有配置文件,需手动生成。/etc/tmux.conf 全局文件,~/.tmux.conf 用户环境文件
# vim ~/.tmux.conf
set -g prefix ^g # <prefix> 激活控制台,(默认Ctrl+b)
unbind ^b # 解绑 Ctrl+b
set-option -g status-utf8 on # 开启状态栏的UTF-8支持
# cp mode
set-window-option -g mode-keys vi # 复制模式中的默认键盘布局使用 vi
bind h select-pane -L # h 等于向左移动光标
bind j select-pane -D # j 向下移动光标
bind k select-pane -U # k 向上移动光标
bind l select-pane -R # l 向右移动光标
- tmux 默认使用的是Ctrl+b,之所以改成Ctrl+g是因为Ctrl+b在 Bash 环境里是向左移动光标. 现在 tmux 和 vim 操作一样了,复制时候也可以用 h、j、k、l 来移动光标。
- 使用 Tmux Tmux 完全依靠快捷键来使用它的功能,而刚才设置的Ctrl+g是这些功能的前提,例如打开一个时钟:Ctrl + g + t 按键的时候要先按Ctrl+g后松开Ctrl和g键后,快速按出t 打开 Tmux:
- Ctrl+g 后松开在按 t 会在终端里出现一个数字时钟
- 说的是 tmux 的功能无非就是 Ctrl + g + 一些功能的键而已,所有的按键方式和上面的时钟例子一样。
- 获取 Tmux 帮助 按 Ctrl + g + ? (问号等于:Shift + /)会出现 Tmux 的帮助信息, 信息中 ‘bind-key’ 说的就是 Ctrl + g, 或者直接 man tmux。
命令
- tmux new -s myname 可以指定Session名
- [PREFIX-:] new -s 在tmux中创建一个会话
- tmux attach-session -t myname 重新连接此会话
- tmux attach
- tmux attach -t basic
- tmux a -t basic
- tmux list-session
- tmux ls
- [PREFIX-s] 在tmux中查看会话列表并切换
- tmux new-session <会话名>
- tmux attach-session -t <会话名>
- tmux rename-session -t <会话名>
- tmux choose-session -t <会话名>
- tmux kill-session -t <会话名>
当你临时断开多个 tmux 会话时候,可以指定恢复某个会话:
# tmux ls #查看所有会话
0: 4 windows (created Tue Jan 22 00:42:16 2013) [177x48]
1: 1 windows (created Tue Jan 22 00:51:30 2013) [177x48]
- tmux a -t 0 恢复第一个会话
快捷键
- + $ 重命名当前Session
- d detach 分离会话
- t big clock
- ? list shortcuts
- : prompt
Tmux 常用功能 分割终端窗口
- + ” 在光标当前所在窗口,横向分割出一个窗口
- + % 在光标当前所在窗口,竖向分割出一个窗口
- + h ………… ,跳转光标到左边的窗口
- + j ………… ,跳转光标到下边的窗口
- + k ………… ,跳转光标到上边的窗口
- + j ………… ,跳转光标到右边的窗口
- + ! 关闭所有分割出来的窗口
- + x 关闭光标当前所在窗口。(或直接Ctrl+d)
- + 向前置换当前面板
- + 向后置换当前面板
- + q 查询面板编号
使用不同的窗口工作
- 一个终端里开了多个小窗口,还是不够用?
- + c 创建一个新的窗口
- + p 切换到上一个窗口
- + n 切换到下一个窗口
- + f 列出所有窗口
- + w 列出目前所创建的窗口,能看到窗口编号,在按编号直接切换窗口,见图2
- + 0-9 直接切换到指定编号的窗口
- + , 修改当前窗口名字,见图3
- + d 临时断开所有的会话,用命令# tmux attach 恢复会话
- + & 关闭窗口之前,你需要确认一下
把窗口分成许多面板
- 有时候你在编辑器工作的同时,需要查看日志文件。在编辑的同时追踪日志真的很有帮助。Tmux可以让我们把窗口分成许多面板。举个例子,我们可以创建一个控制台监测我们的服务器,同时用编辑器构造复杂的开发环境,这样就能同时进行编译和调试了。
- tmux new -s panes
- + ” 水平分割一个窗口 原来的
- + % 再竖直分割 原来的
- + 方向键 在他们之间移动
- 按住不放,再按方向键,可以实现panes之间大小的改变
- o swap panes
- q show pane numbers
- x kill pane
- break pane into window (e.g. to select text by mouse to copy)
- restore pane from window
- ⍽ space - toggle between layouts
- q (Show pane numbers, when the numbers show up type the key to goto that pane)
- (Move the current pane left)
- (Move the current pane right)
- z toggle pane zoom
分割 原先未修改键位的分割方式是[PREFIX-%]和[PREFIX-“] 重新映射为
- [PREFIX-] / [PREFIX–]
关闭一个面板, 要确认
- [PREFIX-x]
- 或者
- exit [面板里执行]
切换
- [PREFIX-hjkl] pane之间移动
- [Ctrl-hjkl] pane之间移动
- [Ctrl-] 最近使用两个窗口之间切换
- [PREFIX-q] 展示窗口数字并选择跳转
- [PREFIX-o] 循环切换
大小调整
- [Ctrl-HJKL] pane大小调整
- [PREFIX-z] trigger暂时把窗口变大
关闭及移动
- [PREFIX-x] 关闭当前pane, 需确认
- [PREFIX-] 当前pane移到左边
- [PREFIX-] 当前pane移到右边
其他
- [PREFIX-!] 当前pane在新的window中打开
- [PREFIX-space] 会自动切换依次使用这些布局(几种窗口布局轮流切换)
复制粘贴
- [PREFIX-[] 进入复制模式
- => 可以进行的操作
- space/v 开始选择
- Ctrl-v 整块选择
- hjkl 方向键移动
- w/b 向前向后移动一个单词
- fx/Fx 行内移动到下一个字符位置
- ctrl-b/f 在缓冲区里面翻页
- g/G 到缓冲区最顶/底端
- / ? 向下, 向上查找
- n/N 查找后下一个, 上一个
- Enter/y 复制
- [PREFIX-]] 粘贴
其他增强:
# 复制整个pane可见区域
[PREFIX-:] capture-pane
# 查看缓冲区内容
[PREFIX-:] show-buffer
# 列出缓冲区列表
[PREFIX-:] list-buffers
# 从缓冲区列表选择并插入到当期面板
[PREFIX-:] choose-buffer => 回车
其他
获得快捷键列表
[PREFIX-?]
进入命令模式
[PREFIX-:]
一些命令模式下的命令
# 新建窗口
new-window -n console
# 新建并执行命令
new-window -n processes "top"
Tmuxinator
- Tmuxinator 是一个 Ruby 的 gem 包,可用于创建 Tmux 的会话。它的工作方式是先在配置文件中定义会话中的细节,然后用 1 条命令创建出这些会话
gem install tmuxinator
tmuxinator new project_a => ~/.tmuxinator/project_a.yml => 配置
启动: tmuxinator start project_a
可以别名: mux start project_a
vim插件
- christoomey/vim-tmux-navigator, 安装更便捷的导航跳转
看窗口历史记录 在小窗口做一些操作时候,输出内容太多,如何回滚呢?
- + PgUP 向上回滚
- + PgDn 向下翻滚
在终端窗口里复制 在一个终端里分割了多个小窗口,你可能会在一个小窗口里复制一些代码或命令行到另外一个小窗口,这时你用小红点、鼠标、触摸板是无法胜任的。它把整个终端窗口当作是复制区域对象,而不隔离小窗口复制
- [ 进入复制模式,移动光标到要复制文本区域后,按空格键开始选择要复制的内容, 利用h、j、k、l、$、0等(和vim中操作一样),按回车确认选中的内容。
- ] 粘贴
- 上面所介绍的是一些比较实用的功能,使用熟练在于 vim 的熟练应用. (控制键的快捷键按键组合方式:Ctrl+b前面也说过弊处,后来换成Ctrl+n发现在终端中不能向下翻命令,在改成Ctrl+m后,发现回车也用不了了。直接算了
- tmux clear-history
github tmux tmux的一些个性化配置
- 默认的tmux风格比较朴素甚至有些丑陋。如果希望做一些美化和个性化配置的话,建议使用gpakosz的tmux配置。它的本质是一个tmux配置文件,实现了以下功能:
- 基于powerline的美化
- 显示笔记本电池电量
- 和Mac互通的剪切板
- 和vim更相近的快捷键
- Ctrl + A 是备用的前缀,按两次可以实现跳到行首
cd
rm -rf .tmux
git clone https://github.com/gpakosz/.tmux.git
ln -s .tmux/.tmux.conf
cp .tmux/.tmux.conf.local .
会话,窗口,面板
- 根据tmux的定义,在开启了tmux服务器后,会首先创建一个会话,而这个会话则会首先创建一个窗口,其中仅包含一个面板;也就是说,这里看到的所谓终端控制台应该称作tmux的一个面板,虽然其使用方法与终端控制台完全相同。
- tmux使用C/S模型构建,主要包括以下单元模块:
- server服务器。输入tmux命令时就开启了一个服务器。
- session会话。一个服务器可以包含多个会话
- window窗口。一个会话可以包含多个窗口。
- pane面板。一个窗口可以包含多个面板。
配置
- 我们先来看一下几个配置,这些配置才是我离不开tmux的原因:-)。tmux的配置文件是~/.tmux.conf,这个文件可能不存在,你可以自己新建。下面开始配置,首先,有没有觉得tmux的前缀按起来太不方便了,ctrl与b键隔得太远,很多人把它映射成C+a,也就是在配置文件(~/.tmux.conf)中加入下面这条语句:
- 设置前缀为Ctrl + a
set -g prefix C-a
- 与此同时,取消默认的前缀按键:
- 解除Ctrl+b 与前缀的对应关系
unbind C-b
- 配置完以后,重启tmux起效,或者先按C+b,然后输入:,进入命令行模式,在命令行模式下输入:
- source-file ~/.tmux.conf
- 你也可以跟我一样,在配置文件中加入下面这句话,以后改了只需要按前缀+r了。
- 将r 设置为加载配置文件,并显示”reloaded!”信息
bind r source-file ~/.tmux.conf \\; display "Reloaded!"
- 关于前缀,很多人都喜欢改成Ctrl+a,不过我个人更喜欢Ctrl+x,如果你是vim用户,你一定懂的。还有就是面板的切换很不方便,需要先按前缀,再按方向键,还记得vim里面怎么切换各个面板的吗?tmux也可以,因为它支持映射。把前缀映射改成Ctrl+x,再加入如下几条语句,现在切换窗口就和vim一摸一样了,顿时觉得亲切了很多。
upbind-key k select-pane -U#downbind-key j select-pane -D#leftbind-key h select-pane -L#rightbind-key l select-pane -R
- 上面的最后一条语句会更改C-x l的功能,我挺喜欢这个功能的,因为我们很时候都是在两个窗口或这两个面板中切换,所以我又加入如下语句
- select last window
bind-key C-l select-window -l
- 现在我的l键可不能随便按了,Ctrl+x l是切换面板,Ctrl+x Ctrl+l切换窗口,Ctrl+l清屏。
复制模式copy-mode
- 前缀 [ 进入复制模式
- 按 space 开始复制,移动光标选择复制区域
- 按 Enter 复制并退出copy-mode。
- 将光标移动到指定位置,按 PREIFX ] 粘贴
- 如果把tmux比作vim的话,那么我们大部分时间都是处于编辑模式,我们复制的时候可不可以像vim一样移动呢?只需要在配置文件(~/.tmux.conf)中加入如下行即可。
- copy-mode 将快捷键设置为vi 模式
setw -g mode-keys vi
会话
- C-x s 以菜单的方式查看并选择会话
- C-x :new-session 新建一个会话
- C-x d 退出并保存会话
- 终端运行 tmux attach 返回会话
- 命名会话
- tmux new -s session
- tmux new -s session -d #在后台建立会话tmux ls #列出会话tmux attach -t session #进入某个会话
使当前pane 最大化
- 从我用vim开始,就相信这世界上有些人比你自己还了解你自己想要什么,所以乔老爷子才能做出让世人尖叫的产品,所以我经常浏览高手的.vimrc 文件,我用了tmux不到3天就发现,它怎么不能最大化当前pane?就像vim里的ZommWinPlugin.vim插件一样,你按下某键,当前窗口 就最大化了,获得最大可视界面。当目前为止,就还没有发现我有需求而别人没有的,同样,已有前人找到的解决办法,方法如下:
- # zoom pane <-> window#http://tmux.svn.sourceforge.net/viewvc/tmux/trunk/examples/tmux-zoom.shbind ^z run “tmux-zoom”##
滚屏
- 滚屏要进入copy-mode,即前缀+[,然后就可以用上下键来滚动屏幕,配置了vi快捷键模式,就可以像操作vi一样来滚动屏幕,非常的方便。退出直接按‘q’键即可。
以上是关于tmux的主要内容,如果未能解决你的问题,请参考以下文章