tmux advance usage

tmux 高级特性

tmux 会话组

tmux grouped sessions 也就是将建立的多个会话归并到同一个组,同一个组内的多个会话拥有同样的窗口(和窗口里面的pane),但各自有着不同的当前窗口,是为了解决共享同一个会话却想拥有不同当前显示窗口的问题。

我们都知道 tmux 非常利于结对编程,因为不同的客户可以看到和控制相同的界面,但是不同客户的终端尺寸是不一样的,会话会以当前输入的客户的终端作为标准尺寸,其他客户则以空白填充剩余部分。例如,当分别有一个长的终端的客户和一个拥有宽的终端的客户同时连到同一个会话时,当长客户输入时(注意激活的光标在的位置),宽客户多余的宽被空白填充;当宽用户在输入时,长用户的多余的高被空白填充。

image-20240115235944495

image-20240116000151112

设想这样一个场景,你的老师开了一个会话,要求所有的学生都加入看他写代码,但是你觉得想自己实践一下,想切个窗口边看边写。可以按照下面的方式实现

1
2
3
4
5
6
tmux new-session -s teacher  # 老师新建一个 teacher 会话
tmux new-session -t teacher -s student # 新建一个 student 会话 并将两个会话合并到一个组中,组名为 teacher ,两个会话共享窗口,但是可以使用自己的当前窗口
tmux a -t teacher # attach 到 teacher 会话,一心一意听老师上课
tmux a -t student # attach 到 student 会话,看同班同学的骚操作
tmux kill-session -t student # 删除mirror 会话,但是 当前 teacher 组中还有 teacher 会话,所以窗口都不会销毁
tmux kill-session -t teacher # 当前组的所有会话都没有了,窗口都被销毁

image-20240116001250488

需要注意的是,由于会话组其实是共享窗口,当 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 直接划复制内容

可以打开如下配置即可:

image-20240215005210206

会话保存与恢复

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
2
3
4
5
6
7
tmuxinator new projectName   新建一个工程,并打开工程配置
tmuxinator open projectName 打开工程配置
tmuxinator projectName 按照配置打开一个tmux会话
tmuxinator doctor 检测配置文件是否有问题
tmuxinator list 查看配置文件列表
tmuxinator copy [EXT] [NEW] 复制配置
tmuxinator start [PRJ] [ARG] 开启一个tmux会话

默认配置文件会放在 ~/.config/tmuxinator 下面

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# /Users/qingfei.kang/.config/tmuxinator/test.yml

name: test
root: ~/

# on_project_start: command
# on_project_first_start: command
# on_project_restart: command
# on_project_exit: command
# on_project_stop: command
# pre_window: rbenv shell 2.0.0-p247
# tmux_options: -f ~/.tmux.mac.conf
# tmux_command: byobu
# startup_window: editor
# startup_pane: 1
# attach: false

windows:
- editor:
layout: main-vertical # main-horizontal
panes:
- git:
- cd ~/xxx
- git status
- vim:
- vim
- build:
- cd ~/xxx && go build
- ./xxx
- logs:
- cd ~/xxx
- tail -f log/errors.log

启动时打开mysql并执行查询语句

1
2
3
4
5
6
7
8
windows:
- api:
layout: main-horizontal
panes:
- test-item-db:
- mysql -hakssjf -pakfl
- use xxx_db
- select * from xx_tab limit 1 \G

传递变量

在配置文件中可以配置项目目录, 但是并不够通用, 如果项目的目录变了, 那就得重新修改项目配置文件,有如下方式可以实现变量的传递

  • 位置参数
1
2
3
$ tmuxinator project /var/www/foo
name: project
root: <%= @args[0] %> # 根目录通过 arg1 传入
  • 键值参数
1
2
3
$ tmuxinator project2 workspace=/var/www/foo2
name: project2
root: <%= @settings["workspace"] %>

参考: https://anyisalin.github.io/2017/03/06/tmuxinator/

参考文档: https://github.com/tmuxinator/tmuxinator#windows

T B
站点访问量: / , 本页阅读量:
T B