如何在给定任意启动目录列表的情况下使用 N 个大小相等、垂直分割的窗格来启动 tmux?

如何在给定任意启动目录列表的情况下使用 N 个大小相等、垂直分割的窗格来启动 tmux?

我想要一个 shell 脚本,该脚本将tmux使用N大小相等、垂直分割的窗格启动,每个窗格都有自己的起始目录,其中N由指定的起始目录数决定。例如,

tmux-launch SESSION-NAME DIR1 DIR2 DIR3 ...

能够提供与每个起始目录相对应的初始命令将非常有用。例如,

tmux-launch SESSION-NAME DIR1:"CMD1" DIR2:"CMD2" DIR3:"CMD3" ...

答案1

这是我为此编写的脚本。保存为tmux-launch.sh( chmod +x tmux-launch.sh):

#!/bin/bash

if [[ -z $2 ]]; then
    current=$(tmux display -p "#S")
    cat<<EOF

USAGE: $(basename $0) SESSION DIR [DIR] ...

        [DIR]   one or more startup directories; at least one is required

EOF
    if [[ -n $current ]]; then
        echo "current session: $current"
    fi
    exit 1
else
    session="$1"
    shift
fi

# start tmux
tmux new-session -s $session -d

args=( "$@" )

i=1
for e; do

    # capture directory and optional command from $e
    d=$(echo $e | cut -d: -f1)
    c=$(echo $e | cut -d: -f2)

    if [ ! -d $d ]; then
        echo WARNING: directory does not exist, $d >&2
        continue
    fi

    # Select pane $i, set dir to $d, run pwd
    if [ $i -gt 1 ]; then
        tmux split-window
    fi
    tmux select-pane -t $i
    tmux send-keys "cd $d" C-m
    if [ -n "$c" ]; then
        # execute optional command
        tmux send-keys "$c" C-m
    fi

    # equally-spaces
    tmux select-layout even-vertical

    i=$(expr $i + 1)

done

# Finished setup, attach to the tmux session!
tmux attach-session -t $session

例如,以下用法将启动一个tmux名为“work”的会话,其中有五个窗格,每个窗格都从一个唯一的目录开始,并执行pwd每个窗格中的命令和echo tada第一个窗格中的命令(当然,此示例假设目录~/scratch*存在):

tmux-launch.sh work ~/scratch1:"pwd;echo tada" \
                    missing-directory:"echo do nothing" \
                    ~/scratch2:pwd ~/scratch3:pwd ~/scratch4:pwd ~/scratch5:pwd

该工具将跳过任何不存在的目录,并向stderr.

我已使用tmux版本2.73.1c和在 Red Hat Enterprise Linux 和 SUSE Linux Enterprise Server 发行版上对此进行了测试。3.2a3.3

编辑 2024 年 3 月 2 日:找到了上述脚本的更复杂版本这里。此扩展脚本提供了一些附加选项,包括水平分割和平铺布局。

编辑2024年3月4日:此脚本假定您的tmux配置以窗格编号 1 开始,而不是默认的 0。例如,在 my 中~/.tmux.conf

# Set the base-index to 1 rather than 0
set -g base-index 1
set-window-option -g pane-base-index 1

相关内容