all repos

tmux-stare @ dee3c286ea1c0049f78c76de25cbbe37a3c2211c

session manager, but my session manager

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

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
update spinner, and picker style, 3 days ago
1
#!/usr/bin/env bash
2
CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
3
source "$CURRENT_DIR/helpers.sh"
4
source "$CURRENT_DIR/sessions.sh"
5
6
get_all_sessions() {
7
  local current_session="$(get_current_session_name)"
8
  local save_dir="$(get_opt_dir)"
9
  local -A seen
10
11
  for file in "$save_dir"/*_last; do
12
    [[ -e "$file" ]] || continue
13
    local name="$(basename "${file%%_last}")"
14
    seen["$name"]="stored"
15
  done
16
17
  while IFS= read -r session; do
18
    seen["$session"]="loaded"
19
  done < <(tmux list-sessions -F "#{session_name}")
20
21
  for name in "${!seen[@]}"; do
22
    [[ "${seen[$name]}" == "loaded" ]] || continue
23
    if [[ "$name" == "$current_session" ]]; then
24
      printf "● %s (active)\n" "$name"
25
    else
26
      printf "● %s\n" "$name"
27
    fi
28
  done
29
30
  for name in "${!seen[@]}"; do
31
    [[ "${seen[$name]}" == "stored" ]] && printf "○ %s\n" "$name"
32
  done
33
}
34
35
strip_session_name() {
36
  local name="${1#● }"
37
  name="${name#○ }"
38
  name="${name% (active)}"
39
  echo "$name"
40
}
41
42
pick() {
43
  local selected=$(get_all_sessions | fzf --reverse \
44
    --bind "ctrl-x:execute($0 unload {})+reload($0 list)" \
45
    --bind "ctrl-r:execute($0 rename {})+reload($0 list)" \
46
    --bind "ctrl-o:execute($0 new)+reload($0 list)" \
47
    --bind "enter:accept")
48
49
  [[ -z "$selected" ]] && return 0
50
51
  local session_name="$(strip_session_name "$selected")"
52
  if tmux has-session -t "$session_name" 2>/dev/null; then
53
    tmux switch-client -t "$session_name"
54
  else
55
    restore_session "$session_name"
56
  fi
57
}
58
59
unload_or_kill() {
60
  local session_name="$(strip_session_name "$1")"
61
  if tmux has-session -t "$session_name" 2>/dev/null; then
62
    save_session "$session_name"
63
    tmux kill-session -t "$session_name"
64
  else
65
    confirm_delete "$session_name"
66
  fi
67
}
68
69
confirm_delete() {
70
  local session_name="$1"
71
  local save_dir="$(get_opt_dir)"
72
  local session_file="$save_dir/${session_name}_last"
73
74
  local result
75
  result=$(printf "Delete\nCancel" | fzf --header="Delete saved session '$session_name'?")
76
  if [[ "$result" == "Delete" ]]; then
77
    rm -f "$session_file"
78
  fi
79
}
80
81
rename() {
82
  local old_name="$(strip_session_name "$1")"
83
  local new_name=$(printf "" | fzf --prompt="Rename ""$old_name"" to " --print-query)
84
  [[ -z "$new_name" ]] && return 1
85
  rename_session "$old_name" "$new_name"
86
}
87
88
new_session() {
89
  local name=$(printf "" | fzf --prompt="New session name: " --print-query)
90
  [[ -z "$name" ]] && return 1
91
92
  if tmux has-session -t "$name" 2>/dev/null; then
93
    tmux switch-client -t "$name"
94
  else
95
    local cwd="$(tmux display-message -p "#{pane_current_path}")"
96
    tmux new-session -ds "$name" -c "$cwd"
97
    tmux switch-client -t "$name"
98
  fi
99
}
100
101
main() {
102
  case "${1:-}" in
103
  "") pick ;;
104
  unload) unload_or_kill "$2" ;;
105
  rename) rename "$2" ;;
106
  new) new_session ;;
107
  list) get_all_sessions ;;
108
  esac
109
}
110
main "$@"