5 if ! [[ -z "$TMUX" ]]; then
6 printf >&2 'Already in tmux, unset TMUX to force nesting\n'
11 if [[ $name == "" ]]; then
12 printf >&2 'Usage: %s NAME\n' "$0"
18 # duplicate stderr to fd 3
20 # kill stderr to hide noclobber errors
23 function sessionname {
25 printf >&3 'sessionname requires exactly two arguments\n'
28 if [[ "$1" < "$2" ]]; then
35 if printf '%s\n' "$name" > .join/join1; then
38 trap 'rm -f .join/join1' EXIT
40 printf 'Waiting for second client...\n'
41 while ! [[ -f .join/join2 ]]; do
44 read -r name2 < .join/join2
45 trap "echo false >| .join/$name1-$name2; rm -f .join/join1" EXIT
46 read -p "Do you want to collaborate with $name2? [Y/n] " -r response 2>&3
47 if [[ "$response" =~ ^[Nn] ]]; then
48 echo false >| .join/"$name1-$name2"
52 if ! tmux has-session -t "$(sessionname "$name1" "$name2")" &> /dev/null; then
53 tmux new-session -s "$(sessionname "$name1" "$name2")" -d
54 tmux set-hook -t "$(sessionname "$name1" "$name2")" client-detached "run 'tmux detach-client -s $(sessionname "$name1" "$name2"); true'"
56 echo true >| .join/"$name1-$name2"
58 rm -f .join/join1 .join/join2
61 read -r name1 < .join/join1
62 read -p "Do you want to collaborate with $name1? [Y/n] " -r response 2>&3
63 if [[ "$response" =~ ^[Nn] ]]; then
66 if printf '%s\n' "$name" > .join/join2; then
68 trap 'rm -f .join/join2' EXIT
69 read -r name1 < .join/join1
71 if [[ "$name1" == "$name2" ]]; then
72 printf >&3 'same client twice not allowed, exiting\n'
75 # wait for first to acknowledge collaboration
76 while ! [[ -f .join/"$name1-$name2" ]]; do
77 if ! read -r name1_ < .join/join1 || ! [[ "$name1_" == "$name1" ]]; then
78 printf >&3 '%s has aborted collaboration.\n' "$name1"
83 read -r ack < ".join/$name1-$name2"
84 rm -f ".join/$name1-$name2"
85 if [[ $ack != true ]]; then
86 printf >&3 '%s does not want to collaborate with you\n' "$name1"
90 # we're the third one, nope
91 printf >&3 'two clients already connected, exiting\n'
95 if [[ "$name1" == "$name2" ]]; then
96 printf >&3 'same client twice not allowed, exiting\n'
100 while tmux has-session -t "$(sessionname "$name1" "$name2")"; do
102 [[ -f .join/"$name1-$name2" ]] && rm -f ".join/$name1-$name2"
103 if (($(tmux list-clients -t "$(sessionname "$name1" "$name2")" | wc -l)!=2)); then
104 tmux detach-client -s "$(sessionname "$name1" "$name2")"
109 exec tmux attach -t "$(sessionname "$name1" "$name2")"