summaryrefslogtreecommitdiff
path: root/dot/local/bin/tmux-log-everything
blob: 7a7911b9bcbef238a26ea88736f05513b7b9e3c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/sh

# Inspired by https://github.com/tmux-plugins/tmux-logging via
# https://unix.stackexchange.com/questions/623054/how-to-automatically-log-all-my-tmux-sessions-to-a-file-in-directory-accordin
# but massively simplified.

# The tmux-logging plugin usees a different global variable for each pane (named
# after the pane number) to check whether it is already logging. When the pane
# is destroyed, the variable stays set. When a new pane is opened, it can
# recycle the same pane number as before. The plugin will not log to any pane
# with a recycled pane number!
#
# Luckily, tmux supports pane-local variables, which are automatically destroyed
# when the pane is destroyed! So here we just use one of those.

tmux_log_everything()
{
    if ! [ "$TMUX_PANE" ]
    then
        return # We are not in tmux
    fi

    local LOGDIR LOGFILE
    LOGDIR=$HOME/.tmux-log-everything
    if ! [ -d "$LOGDIR" ]
    then
        return # User has not "requested" logging by creating log dir
    fi

    if [ "$(tmux show-option -pqv @pane-is-logging)" ]
    then
        return
    fi

    LOGFILE=$LOGDIR/$(date -Is).$$.log.gz
    tmux set-option -pq @pane-is-logging y
    tmux pipe-pane "exec gzip -c > $LOGFILE"
}

tmux_log_everything