diff --git a/zsh/multiplexer.zsh b/zsh/multiplexer.zsh new file mode 100644 index 0000000..83907d3 --- /dev/null +++ b/zsh/multiplexer.zsh @@ -0,0 +1,41 @@ +zshrc_use_multiplexer=tmux + +# Make sure the set multiplexer is available. Otherwise using exec will +# terminate our session. +if [[ -n $zshrc_use_multiplexer ]]; then + if ! (( $+commands[$zshrc_use_multiplexer] )); then + echo "Multiplexer '$zshrc_use_multiplexer' not found." >&2 + zshrc_use_multiplexer= + fi +fi + +# If not already in screen or tmux, reattach to a running session or create a +# new one when connecting through ssh. +if [[ $TERM != dumb && $TERM != dialup && $TERM != linux + && -z $STY && -z $TMUX ]]; then + # Get running detached sessions. + if [[ $zshrc_use_multiplexer = screen ]]; then + session=$(screen -list | grep 'Detached' | awk '{ print $1; exit }') + elif [[ $zshrc_use_multiplexer = tmux ]]; then + session=$(tmux list-sessions 2>/dev/null \ + | sed '/(attached)$/ d; s/^\([0-9]\{1,\}\).*$/\1/; q') + fi + + # Create a new remote session if none is running. + if [[ -n $SSH_CONNECTION && -z $session ]]; then + if [[ $zshrc_use_multiplexer = screen ]]; then + exec screen + elif [[ $zshrc_use_multiplexer = tmux ]]; then + exec tmux + fi + fi + + # Reattach to a running session. + if [[ -v $session ]]; then + if [[ $zshrc_use_multiplexer = screen ]]; then + exec screen -r $session + elif [[ $zshrc_use_multiplexer = tmux ]]; then + exec tmux attach-session -t $session + fi + fi +fi