tmux 高级特性
tmux 会话组
tmux grouped sessions 也就是将建立的多个会话归并到同一个组,同一个组内的多个会话拥有同样的窗口(和窗口里面的pane),但各自有着不同的当前窗口,是为了解决共享同一个会话却想拥有不同当前显示窗口的问题。
我们都知道 tmux 非常利于结对编程,因为不同的客户可以看到和控制相同的界面,但是不同客户的终端尺寸是不一样的,会话会以当前输入的客户的终端作为标准尺寸,其他客户则以空白填充剩余部分。例如,当分别有一个长的终端的客户和一个拥有宽的终端的客户同时连到同一个会话时,当长客户输入时(注意激活的光标在的位置),宽客户多余的宽被空白填充;当宽用户在输入时,长用户的多余的高被空白填充。
设想这样一个场景,你的老师开了一个会话,要求所有的学生都加入看他写代码,但是你觉得想自己实践一下,想切个窗口边看边写。可以按照下面的方式实现
1 | tmux new-session -s teacher # 老师新建一个 teacher 会话 |
需要注意的是,由于会话组其实是共享窗口,当 student 会话切到自己窗口的时候,也会影响teacher-win窗口的内容和大小。这个可以通过 set aggressive-resize off
来解决,但是如果student 也切到 teacher-win 时,还是会互相影响,这个无解。简单来说,配置之后,当前窗口不同则各自最大化,当前窗口相同则缩小到公共部分大小。
问题解决
控制字符
tmux终端意外出现控制字符,表现为 tmux 命令行提示符错位,出现敲了5个字 tab 出现6个字删也删不掉的情况。例如 敲了 cd
结果出现 ccd
然后c
怎么也删不掉。
这个其实是zsh的问题,具体原因是:zsh需要知道命令行的宽度,才能知道哪些命令的字符被替换。它假设每个字符占据一个字符位置,除非另有说明。所以造成这个“tab补全命令出现重复字符”的主要原因是zsh错误计算了命令行的宽度。如下可能性会造成这个情况:
shell和terminal的编码不一致,导致它们对相同字符的宽度识别不一致
可以将#export LANG=en.UTF-8
改为 export LANG=en_US.UTF-8
解决这个问题
参考: https://www.cnblogs.com/fzzfsec/p/14491567.html
iterm2 直接划复制内容
可以打开如下配置即可:
会话保存与恢复
tmux-resurrect
tmux-resurrect 可以用来保存和恢复当前的会话,窗口,窗格的信息及布局。
安装: git clone https://github.com/tmux-plugins/tmux-resurrect.git ~/tools/
如果会话记录被覆盖可以按照如下方式将历史备份进行恢复
$ cd ~/.tmux/resurrect/ 找到想要的时间戳 ln -sf <file_name> last
如果想保留保留vim 会话,可以添加如下配置:
set -g @resurrect-strategy-vim 'session'
如果想保留窗格内容,可以添加如下配置:
set -g @resurrect-capture-pane-contents 'on'
tmuxinator
tmuninator 是一个通过配置文件来对窗口,窗格的布局和内容进行编排的工具。tmux-resurrect 更适合做工作现场的备份,在机器重启后快速恢复原工作环境。而tmuxinator 适合做标准化工作环境的初始化,并且适合在多台机器之间分发。
主要命令
1 | tmuxinator new projectName 新建一个工程,并打开工程配置 |
默认配置文件会放在 ~/.config/tmuxinator
下面
配置文件
1 | # /Users/qingfei.kang/.config/tmuxinator/test.yml |
启动时打开mysql并执行查询语句
1 | windows: |
传递变量
在配置文件中可以配置项目目录, 但是并不够通用, 如果项目的目录变了, 那就得重新修改项目配置文件,有如下方式可以实现变量的传递
- 位置参数
1 | $ tmuxinator project /var/www/foo |
- 键值参数
1 | $ tmuxinator project2 workspace=/var/www/foo2 |