zshrc.d/30-functions-tmux.zrc
author Mikael Berthe <mikael@lilotux.net>
Wed, 20 Feb 2019 08:59:50 +0100
changeset 39 fc97d6cf8de4
parent 33 1400f5ed243c
permissions -rw-r--r--
sss: tmux: display list of sessions if there are more than one
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
31
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     1
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     2
# sss
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     3
# Reattach a GNU Screen session, or a TMux session.
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     4
#
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     5
# For GNU Screen a custom lock tool (LOCKPRG) can be used
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     6
# if ~/bin/ttylocker exists or TTYLOCKER is set (not yet
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     7
# implemented for tmux).
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
# Mikael Berthe, 2015-08
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
function sss() {
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
    local TTYLOCKER="${TTYLOCKER:-$HOME/bin/ttylocker}"
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
    local SCREENBIN="/usr/bin/screen"
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    13
    local TMUXBIN="/usr/bin/tmux"
33
1400f5ed243c sss: Add an optional session name
Mikael Berthe <mikael@lilotux.net>
parents: 32
diff changeset
    14
    local session="$1"
31
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    16
    if [[ -x $SCREENBIN ]]; then
33
1400f5ed243c sss: Add an optional session name
Mikael Berthe <mikael@lilotux.net>
parents: 32
diff changeset
    17
        $SCREENBIN -q -list $session
31
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    18
        local r=$?
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    19
        if (( r == 11 )); then
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    20
            # There is 1 usable Screen session, let's go
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    21
            [[ -x "$TTYLOCKER" ]] && export LOCKPRG="$TTYLOCKER"
33
1400f5ed243c sss: Add an optional session name
Mikael Berthe <mikael@lilotux.net>
parents: 32
diff changeset
    22
            exec $SCREENBIN -r -x $session
31
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    23
        elif (( r > 11 )); then
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
            # There are several usable Screen sessions, heh
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    25
            echo "There are several usable Screen sessions..."
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
            return
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    27
        fi
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
    fi
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    30
    # No usable GNU/Screen session, let's try tmux then.
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    31
    if [[ -x "$TMUXBIN" ]]; then
33
1400f5ed243c sss: Add an optional session name
Mikael Berthe <mikael@lilotux.net>
parents: 32
diff changeset
    32
        if [[ -n $session ]]; then
1400f5ed243c sss: Add an optional session name
Mikael Berthe <mikael@lilotux.net>
parents: 32
diff changeset
    33
            $TMUXBIN has-session -t "$session" &&
1400f5ed243c sss: Add an optional session name
Mikael Berthe <mikael@lilotux.net>
parents: 32
diff changeset
    34
                exec $TMUXBIN attach-session -t "$1"
1400f5ed243c sss: Add an optional session name
Mikael Berthe <mikael@lilotux.net>
parents: 32
diff changeset
    35
            return # Exit function with error code
1400f5ed243c sss: Add an optional session name
Mikael Berthe <mikael@lilotux.net>
parents: 32
diff changeset
    36
        fi
31
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    37
        # Number of tmux sessions
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    38
        integer n=$($TMUXBIN list-sessions 2>/dev/null | wc -l)
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    39
        if (( n == 1 )); then
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    40
            # Attach the session
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    41
            exec $TMUXBIN attach # -t "$($TMUXBIN list-session -F '#{session_id}')"
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    42
        elif (( n > 1 )); then
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    43
            # There are several usable tmux sessions, heh
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    44
            echo "There are several usable tmux sessions..."
39
fc97d6cf8de4 sss: tmux: display list of sessions if there are more than one
Mikael Berthe <mikael@lilotux.net>
parents: 33
diff changeset
    45
            $TMUXBIN list-session
31
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    46
            return
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    47
        fi
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    48
    fi
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    49
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    50
    echo "No terminal multiplexer session found."
c293e65d905f Add function sss (reattaches screen/tmux sessions)
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    51
}
32
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    52
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    53
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    54
# From http://stackoverflow.com/questions/7814612/is-there-any-way-to-redraw-tmux-window-when-switching-smaller-monitor-to-bigger
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    55
# A big thank-you to Chris Johnsen for this one.
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    56
# (Code slightly modified - Mikael)
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    57
function tmux_takeover() {
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    58
    # create a temporary session that displays the "how to go back" message
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    59
    tmp='takeover_temp_session'
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    60
    if ! tmux has-session -t "$tmp" >/dev/null 2>&1; then
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    61
        tmux new-session -d -s "$tmp"
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    62
        tmux set-option -t "$tmp" set-remain-on-exit on >/dev/null
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    63
        tmux new-window -kt "$tmp":0 \
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    64
            'echo -e "\nUse Prefix + L (i.e. ^B L) to return to session."'
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    65
    fi
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    66
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    67
    # switch any clients attached to the target session to the temp session
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    68
    session="$1"
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    69
    for client in $(tmux list-clients -t "$session" -F '#{client_tty}'); do
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    70
        tmux switch-client -c "$client" -t "$tmp"
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    71
    done
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    72
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    73
    # attach to the target session
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    74
    tmux attach -t "$session"
0df5ad40ffb9 Add tmux_takeover (from Chris Johnsen' S.O. post)
Mikael Berthe <mikael@lilotux.net>
parents: 31
diff changeset
    75
}