all repos

tmux-stare @ 561d729

session manager, but my session manager

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

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
make easier to delete sessions, 6 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 \
44
    --footer="C-x: unload/kill | C-r: rename | C-o: new" \
45
    --bind "ctrl-x:execute($0 unload {})+reload($0 list)" \
46
    --bind "ctrl-r:execute($0 rename {})+reload($0 list)" \
47
    --bind "ctrl-o:execute($0 new)+reload($0 list)" \
48
    --bind "enter:accept")
49
50
  [[ -z "$selected" ]] && return 0
51
52
  local session_name="$(strip_session_name "$selected")"
53
  if tmux has-session -t "$session_name" 2>/dev/null; then
54
    tmux switch-client -t "$session_name"
55
  else
56
    restore_session "$session_name"
57
  fi
58
}
59
60
unload_or_kill() {
61
  local session_name="$(strip_session_name "$1")"
62
  if tmux has-session -t "$session_name" 2>/dev/null; then
63
    save_session "$session_name"
64
    tmux kill-session -t "$session_name"
65
  else
66
    confirm_delete "$session_name"
67
  fi
68
}
69
70
confirm_delete() {
71
  local session_name="$1"
72
  local save_dir="$(get_opt_dir)"
73
  local session_file="$save_dir/${session_name}_last"
74
75
  local result
76
  result=$(printf "Delete\nCancel" | fzf --header="Delete saved session '$session_name'?")
77
  if [[ "$result" == "Delete" ]]; then
78
    rm -f "$session_file"
79
  fi
80
}
81
82
rename() {
83
  local old_name="$(strip_session_name "$1")"
84
  local new_name=$(printf "" | fzf --prompt="Rename ""$old_name"" to " --print-query)
85
  [[ -z "$new_name" ]] && return 1
86
  rename_session "$old_name" "$new_name"
87
}
88
89
new_session() {
90
  local name=$(printf "" | fzf --prompt="New session name: " --print-query)
91
  [[ -z "$name" ]] && return 1
92
93
  if tmux has-session -t "$name" 2>/dev/null; then
94
    tmux switch-client -t "$name"
95
  else
96
    local cwd="$(tmux display-message -p "#{pane_current_path}")"
97
    tmux new-session -ds "$name" -c "$cwd"
98
    tmux switch-client -t "$name"
99
  fi
100
}
101
102
main() {
103
  case "${1:-}" in
104
  "") pick ;;
105
  unload) unload_or_kill "$2" ;;
106
  rename) rename "$2" ;;
107
  new) new_session ;;
108
  list) get_all_sessions ;;
109
  esac
110
}
111
main "$@"