3 files changed,
135 insertions(+),
11 deletions(-)
Author:
Oleksandr Smirnov
olexsmir@gmail.com
Committed at:
2026-04-14 17:46:49 +0300
Authored at:
2026-04-14 17:19:22 +0300
Change ID:
xqvyqwtuzxuwxrvqqsltuywzmrzyktur
Parent:
a51b035
jump to
| A | scripts/_session_renamed.sh |
| M | scripts/sessions.sh |
| M | stare.tmux |
A
scripts/_session_renamed.sh
··· 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 +main() { 7 + if [[ "${1:-}" == "sync" ]]; then 8 + sync_session_id_map 9 + return 0 10 + fi 11 + 12 + local session_id="$1" 13 + local new_name="$2" 14 + handle_session_renamed_hook "$session_id" "$new_name" 15 +} 16 +main "$@"
M
scripts/sessions.sh
··· 13 13 fi 14 14 } 15 15 16 +session_id_map_file() { echo "$(get_opt_dir)/.session_ids" } 17 +sync_session_id_map() { 18 + local map_file="$(session_id_map_file)" 19 + tmux list-sessions -F "#{session_id}${S}#{session_name}" >"$map_file" 20 +} 21 + 22 +get_session_id_by_name() { 23 + local session_name="$1" 24 + tmux display-message -p -t "$session_name" "#{session_id}" 2>/dev/null 25 +} 26 + 27 +get_session_name_by_id() { 28 + local session_id="$1" 29 + local map_file="$(session_id_map_file)" 30 + [[ -f "$map_file" ]] || return 1 31 + awk -F"$S" -v session_id="$session_id" '$1 == session_id { print $2; exit }' "$map_file" 32 +} 33 + 34 +upsert_session_id_entry() { 35 + local session_id="$1" 36 + local session_name="$2" 37 + local map_file="$(session_id_map_file)" 38 + local tmp_file="${map_file}.tmp" 39 + 40 + [[ -z "$session_id" || -z "$session_name" ]] && return 1 41 + [[ -f "$map_file" ]] || : >"$map_file" 42 + 43 + awk -F"$S" -v OFS="$S" -v session_id="$session_id" -v session_name="$session_name" ' 44 + $1 == session_id { 45 + $2 = session_name 46 + found = 1 47 + } 48 + { print } 49 + END { 50 + if (!found) print session_id, session_name 51 + } 52 + ' "$map_file" >"$tmp_file" && mv "$tmp_file" "$map_file" 53 +} 54 + 55 +remember_session_identity() { 56 + local session_name="$1" 57 + local session_id 58 + session_id="$(get_session_id_by_name "$session_name")" 59 + [[ -n "$session_id" ]] && upsert_session_id_entry "$session_id" "$session_name" 60 +} 61 + 62 +rename_session_files() { 63 + local old="$1" 64 + local new="$2" 65 + local dir="$(get_opt_dir)" 66 + local old_last="${dir}/${old}_last" 67 + local new_last="${dir}/${new}_last" 68 + local global_last="${dir}/last" 69 + 70 + [[ -z "$old" || -z "$new" || "$old" == "$new" ]] && return 1 71 + [[ -e "$old_last" ]] || return 0 72 + [[ -e "$new_last" ]] && return 1 73 + 74 + if [[ -L "$old_last" ]]; then 75 + local actual="$(readlink "$old_last")" 76 + local actual_name 77 + local new_actual 78 + [[ "$actual" != /* ]] && actual="${dir}/${actual}" 79 + 80 + actual_name="$(basename "$actual")" 81 + if [[ "$actual_name" == "${old}_"* && -e "$actual" ]]; then 82 + new_actual="${dir}/${new}_${actual_name#${old}_}" 83 + mv "$actual" "$new_actual" 84 + ln -sf "$new_actual" "$new_last" 85 + rm -f "$old_last" 86 + else 87 + mv "$old_last" "$new_last" 88 + fi 89 + else 90 + mv "$old_last" "$new_last" 91 + fi 92 + 93 + if [[ -L "$global_last" ]]; then 94 + local global_target="$(readlink "$global_last")" 95 + local global_target_name="$(basename "$global_target")" 96 + if [[ "$global_target_name" == "${old}_last" ]]; then 97 + ln -sf "$new_last" "$global_last" 98 + fi 99 + fi 100 +} 101 + 102 +apply_session_rename() { 103 + local session_id="$1" 104 + local new_name="$2" 105 + local old_name="${3:-}" 106 + 107 + [[ -z "$session_id" || -z "$new_name" ]] && return 1 108 + [[ -n "$old_name" ]] || old_name="$(get_session_name_by_id "$session_id" || true)" 109 + 110 + if [[ -n "$old_name" && "$old_name" != "$new_name" ]]; then 111 + rename_session_files "$old_name" "$new_name" 112 + fi 113 + 114 + upsert_session_id_entry "$session_id" "$new_name" 115 +} 116 + 16 117 rename_session() { 17 118 local old="$1" 18 119 local new="$2" 19 - local dir="$(get_opt_dir)" 120 + local session_id 20 121 21 122 [[ -z "$new" || "$old" == "$new" ]] && return 1 22 - [[ -e "${dir}/${new}_last" ]] && return 1 123 + [[ -e "$(get_opt_dir)/${new}_last" ]] && return 1 23 124 24 125 tmux has-session -t "$new" 2>/dev/null && return 1 25 - tmux rename-session -t "$old" "$new" 2>/dev/null 126 + session_id="$(get_session_id_by_name "$old")" 127 + [[ -n "$session_id" ]] || return 1 128 + tmux rename-session -t "$old" "$new" 2>/dev/null || return 1 129 + apply_session_rename "$session_id" "$new" "$old" 130 +} 26 131 27 - local old_last="${dir}/${old}_last" 28 - [[ -L "$old_last" ]] && { 29 - local actual="$(readlink "$old_last")" 30 - local new_actual="${dir}/${new}_$(basename "$actual" | cut -d_ -f2-)" 31 - mv "$actual" "$new_actual" 32 - ln -sf "$new_actual" "${dir}/${new}_last" 33 - rm "$old_last" 34 - } 132 +handle_session_renamed_hook() { 133 + local session_id="$1" 134 + local new_name="$2" 135 + 136 + [[ -z "$session_id" || -z "$new_name" ]] && return 1 137 + apply_session_rename "$session_id" "$new_name" 35 138 } 36 139 37 140 # === save ··· 165 268 save_panes "$session_name" "$save_file" 166 269 link_session_last "$save_file" "$last_file" 167 270 link_last "$last_file" "$save_dir" 271 + remember_session_identity "$session_name" 168 272 } 169 273 170 274 save_all_sessions() {
M
stare.tmux
··· 31 31 set_opt_initialized "1" 32 32 fi 33 33 34 + # rename hook 35 + tmux set-hook -g session-renamed "run-shell \"bash '$CURRENT_DIR/scripts/_session_renamed.sh' #{q:hook_session} #{q:hook_session_name}\"" 36 + tmux run-shell "bash '$CURRENT_DIR/scripts/_session_renamed.sh' sync" 37 + 34 38 add_save_interpolation 35 39 } 36 40 main