tmux session layout自动化

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

你可能感兴趣的:(tmux)