all repos

tmux-stare @ e6417dc3898c1bbbe64a066f3b32068c8f42d694

session manager, but my session manager
3 files changed, 135 insertions(+), 11 deletions(-)
reuse tmux rename hook
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
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