all repos

tmux-stare @ c6e7776

session manager, but my session manager
2 files changed, 88 insertions(+), 13 deletions(-)
update picker
Author: Oleksandr Smirnov olexsmir@gmail.com
Committed at: 2026-02-09 02:08:42 +0200
Change ID: lvxxlykuymptqvzmqvzzstutqyqpwsnz
Parent: 0a4900f
M scripts/pick.sh

@@ -32,16 +32,24 @@ [[ "${seen[$name]}" == "stored" ]] && printf "○ %s\n" "$name"

done } +strip_session_name() { + local name="${1#● }" + name="${name#○ }" + name="${name% (active)}" + echo "$name" +} + pick() { - local current_session="$(get_current_session_name)" - local selected="$(get_all_sessions "$current_session" | fzf)" + local selected=$(get_all_sessions "$(get_current_session_name)" | fzf \ + --footer="C-x: unload/kill | C-r: rename | C-n: new" \ + --bind "ctrl-x:execute($0 unload {})+reload($0 list)" \ + --bind "ctrl-r:execute($0 rename {})+reload($0 list)" \ + --bind "ctrl-n:execute($0 new)+reload($0 list)" \ + --bind "enter:accept") + [[ -z "$selected" ]] && return 0 - local session_name - session_name=${selected#● } - session_name=${session_name#○ } - session_name=${session_name% (active)} - + local session_name="$(strip_session_name "$selected")" if tmux has-session -t "$session_name" 2>/dev/null; then tmux switch-client -t "$session_name" else

@@ -49,13 +57,55 @@ restore_session "$session_name"

fi } -# TODO: unload session (save before killing) -# TODO: remove unload session -# TODO: rename session (rename old saves too to remove the duplicates) -# TODO: create new session +unload_or_kill() { + local session_name="$(strip_session_name "$1")" + if tmux has-session -t "$session_name" 2>/dev/null; then + save_session "$session_name" + tmux kill-session -t "$session_name" + else + confirm_delete "$session_name" + fi +} + +confirm_delete() { + local session_name="$1" + local save_dir="$(get_opt_dir)" + local session_file="$save_dir/${session_name}_last" + + local result + result=$(printf "Delete\nCancel" | fzf --header="Delete saved session '$session_name'?") + if [[ "$result" == "Delete" ]]; then + rm -f "$session_file" + fi +} + +rename() { + local old_name="$(strip_session_name "$1")" + local new_name=$(printf "" | fzf --prompt="Rename ""$old_name"" to " --print-query) + [[ -z "$new_name" ]] && return 1 + rename_session "$old_name" "$new_name" +} + +new_session() { + local name=$(printf "" | fzf --prompt="New session name: " --print-query) + [[ -z "$name" ]] && return 1 + + if tmux has-session -t "$name" 2>/dev/null; then + tmux switch-client -t "$name" + else + local cwd="$(tmux display-message -p "#{pane_current_path}")" + tmux new-session -ds "$name" -c "$cwd" + tmux switch-client -t "$name" + fi +} + main() { case "${1:-}" in "") pick ;; + unload) unload_or_kill "$2" ;; + rename) rename "$2" ;; + new) new_session ;; + list) get_all_sessions "$(get_current_session_name)" ;; esac } -main +main "$@"
M scripts/sessions.sh

@@ -4,7 +4,26 @@ source "$CURRENT_DIR/helpers.sh"

declare S=$'\t' -# === common +rename_session() { + local old="$1" + local new="$2" + local dir="$(get_opt_dir)" + + [[ -z "$new" || "$old" == "$new" ]] && return 1 + [[ -e "${dir}/${new}_last" ]] && return 1 + + tmux has-session -t "$new" 2>/dev/null && return 1 + tmux rename-session -t "$old" "$new" 2>/dev/null + + local old_last="${dir}/${old}_last" + [[ -L "$old_last" ]] && { + local actual="$(readlink "$old_last")" + local new_actual="${dir}/${new}_$(basename "$actual" | cut -d_ -f2-)" + mv "$actual" "$new_actual" + ln -sf "$new_actual" "${dir}/${new}_last" + rm "$old_last" + } +} # === save save_cwd() {

@@ -81,6 +100,12 @@ save_all_sessions() {

tmux list-sessions -F "#{session_name}" | while read -r session; do save_session "$session" done +} + +unload_session() { + local session_name="$1" + save_session "$session_name" + tmux kill-session -t "$session_name" } # === restore