ランダム起動ディレクトリのリストが与えられたら、同じサイズの垂直分割Nウィンドウでtmuxを起動する方法は?

ランダム起動ディレクトリのリストが与えられたら、同じサイズの垂直分割Nウィンドウでtmuxを起動する方法は?

私は、指定された開始ディレクトリの数によって決まる自己起動ディレクトリを持つ同じサイズの垂直ペインtmuxで始まるシェルスクリプトが欲しいです。例えば、NN

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

各起動ディレクトリに対応する初期コマンドを提供できれば便利です。例えば、

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

答え1

ここに私が書いたスクリプトがあります。別の名前で保存tmux-launch.shchmod +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それぞれ独自のディレクトリから始まる5つのウィンドウで構成される「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

Red Hat Enterprise LinuxおよびSUSE Linux Enterprise Serverディストリビューションでtmuxこれをテストしました2.73.1c3.2a3.3

2024年3月2日修正:上記のスクリプトのより複雑なバージョンが見つかりました。ここ。この拡張スクリプトは、水平分割やタイルレイアウトなど、いくつかの追加オプションを提供します。

2024年3月4日修正:このスクリプトは、設定tmuxがデフォルト値 0 ではなくウィンドウ番号 1 で始まると仮定します。たとえば、私~/.tmux.conf

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

関連情報