all repos

tmux-stare @ 0ef3399

session manager, but my session manager

tmux-stare/scripts/save.sh(view raw)

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env bash
CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$CURRENT_DIR/helpers.sh"

declare S=$'\t'

save_cwd() {
  local save_file="$1"
  tmux -c pwd >>"$save_file"
}

save_windows() {
  local save_file="$1"
  local format="window$S#{window_index}$S#{window_name}$S#{window_layout}$S#{window_active}"
  tmux list-windows -F "$format" >>"$save_file"
}

save_panes() {
  local save_file="$1"
  local format="pane$S#{pane_index}$S#{pane_current_path}$S#{pane_active}$S#{window_index}$S#{pane_pid}"
  tmux list-panes -s -F "$format" |
    while IFS="$S" read -r line; do
      pids=$(ps -ao "ppid,pid" |
        sed "s/^ *//" |
        grep "^$(cut -f6 <<<"$line")" |
        rev |
        cut -d' ' -f1 |
        rev)

      command="$(
        for pid in $pids; do
          while read -r arg; do
            echo -n "'$arg' "
          done <<<"$(xargs -0L1 </proc/"$pid"/cmdline)"
        done
      )"

      awk -v command="$command" \
        'BEGIN {FS=OFS="\t"} {$6=command; print}' \
        <<<"$line" >>"$save_file"
    done
}

link_session_last() {
  local save_file="$1"
  local last_file="$2"
  if ! cmp -s "$save_file" "$last_file"; then
    ln -sf "$save_file" "$last_file"
  else
    rm "$save_file"
  fi
}

link_last() {
  local save_file="$1"
  local save_dir="$2"
  ln -sf "$save_file" "$save_dir"/last
}

# TODO: add interval saves (tmux-continuum like)
# TODO: save all loaded sessions not only current
# TODO: link last session saved as last
main() {
  start_spinner "Saving current session"
  local save_dir="$(get_opt_dir)"
  local save_file="${save_dir}/$(get_current_session_name)_$(get_time)"
  local last_file="${save_dir}/$(get_current_session_name)_last"
  save_cwd "$save_file"
  save_windows "$save_file"
  save_panes "$save_file"
  link_session_last "$save_file" "$last_file"
  link_last "$last_file" "$save_dir"
  stop_spinner "Session saved"
}
main