tmux session layout自动化
目的为尽量自动化创建所需layout的session,包括window、pane等。本文包含两种方法,分别由对应的优缺点。日常建议第一种方法,使用比较方便。
通过shell脚本
- 原理:
创建session,在session detach的状态下操作,通过tmux在session中创建window、pane,发送key等。最终实现需要的layout。 - 优缺点:
优点是使用简单,封装好后,只需要跑一个shell脚本即可一键完成。缺点是由于session是在detach的状态下进行操作,tmux可能无法精确得到terminal的信息,在一些split等操作时,可能出现pane尺寸设置不合理。但大部分layout不会有此问题,这种方法在适应的场景下还是推荐使用,毕竟使用方便。 问题示例:
通过horizontal、vertical split等方式对window进行拆分为pane的操作。最终得到的layout中,可能会出现pane 0远大于pane 1。虽然可以再调整pane大小,但是不同的terminal,调整幅度不同,难以自动化实现。0 --->> 0 | 1 -->> 0 | 2 1 | --->> 0 | 1 | 3 2 |
实际得到的layout,pane 1的尺寸都被pane 0挤占了。
0 | 1 | 3 2 |
脚本示例:
myproj.sh#!/bin/bash tmux kill-session -t myproj 2>/dev/null tmux new-session -d -s myproj # Set aggressive-resize to on tmux set-option aggressive-resize on # 0 | 1 # horizontal split, pane 1 is active tmux split-window -h -t myproj:0 ###tmux resize-pane -t myproj:0.0 -x 60% # select pane 0 tmux select-pane -t myproj:0.0 # 0 | 2 # 1 | # vertical split, pane 1 is active tmux split-window -v -t myproj:0 # select pane 0 tmux select-pane -t myproj:0.0 # 0|1 | 3 # 2 | # horizontal split, pane 3 is active ## tmux split-window -h -t myproj:0 # psql session tmux send-keys -t myproj:0.0 "cd ~/ && source envv && gpstate -Q || gpstart -a && psql -d dw1" C-m # clear session tmux send-keys -t myproj:0.1 "cd /home/gpadmin/myproj/prototype/client/clear && pwd" C-m # post session tmux send-keys -t myproj:0.2 "cd /home/gpadmin/myproj/prototype/client/post && pwd" C-m # myproj session tmux send-keys -t myproj:0.3 "cd /home/gpadmin/myproj/prototype/myproj && pwd" C-m # Set the layout to even-horizontal which will make all horizontal panes of equal width ###tmux select-layout -t myproj even-horizontal # select pane 3 tmux select-pane -t myproj:0.3 # force 256 color tmux -2 attach-session -t myproj #tmux -2 attach -t myproj
用法:
./myproj.sh
通过tmux脚本
- 原理:
创建session,并attach到sessin中。在session中,通过tmux脚本直接操作当前session,进行创建window、pane,发送key等操作。最终实现需要的layout。 - 优缺点:
优点是直接在attach的session进行操作,tmux可以获得terminal的信息,对于split等操作,可以更合理的设置pane尺寸。缺点是需要首先创建session,然后在session中进行创建window、pane等操作,自动化程度更弱。推荐在方法1不适用的场景下作为备选方案使用。 脚本示例:
myproj.tmux# Set aggressive-resize to on set-option aggressive-resize on # Split horizontally # 0 | 1 split-window -h # Select pane 0 select-pane -t 0 # Split vertically # 0 | 2 # 1 split-window -v # Select pane 0 select-pane -t 0 # Split horizontally again # 0 | 1 | 3 # 2 | split-window -h # Send commands to each pane send-keys -t 0 "cd ~/ && source hgdw_env && gpstate -Q || gpstart -a && psql -d dw1" C-m send-keys -t 1 "cd /home/gpadmin/myproj/prototype/client/clear && pwd" C-m send-keys -t 2 "cd /home/gpadmin/myproj/prototype/client/post && pwd" C-m send-keys -t 3 "cd /home/gpadmin/myproj/prototype/myproj && pwd" C-m
用法:
# 新建session tmux new -s my_session # 或者直接tmux 进入刚创建的tmux后,source 上面的tmux脚本 tmux source-file myproj.tmux
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。