diff --git a/tmux-menu.template.sh b/tmux-menu.template.sh index 491ed9f..d6b9459 100755 --- a/tmux-menu.template.sh +++ b/tmux-menu.template.sh @@ -1,22 +1,25 @@ #!/usr/bin/env bash #=============================================================================== # -# FILE: tmux-menu.sh -# -# USAGE: ./tmux-menu.sh -# -# DESCRIPTION: A hack script I wrote to help me manage pre-defined -# tmux-sessions -# -# OPTIONS: -# REQUIREMENTS: tmux -# NOTES: the cool down arrows in line 43? -v (see: digraphs) -# AUTHOR: C Hawley -# ORGANIZATION: -# CREATED: 2015-09 -# REVISION: Mon 16 Oct 2017 05:28:00 PM EDT +# CREATED : 2026-02-21 +# UPDATED : +# USAGE : +# DESC : Hack tmux session launcher. Reads a YAML file to create a tmux # session with multiple windows and commands. +# NOTES : +# AUTHOR : chawley +# #=============================================================================== +# Path to the YAML configuration file +TMUX_CONFIG_FILE="${HOME}/.config/tmux-menu/sessions.yaml" + +# Check for yq (YAML processor) +if ! command -v yq &> /dev/null; then + echo "Error: 'yq' command not found." + echo "Please install yq (https://github.com/mikefarah/yq) to use this script." + echo "Example: 'sudo snap install yq' or 'brew install yq'" + exit 1 +fi # check for command line argument # Tips from: # http://stackoverflow.com/questions/7832080/test-if-a-variable-is-set-in-bash-when-using-set-o-nounset @@ -40,50 +43,66 @@ if [ ! -z $TMUX ]; then exit 1 fi -tcheck=$(tmux list-sessions | grep -c "${session}") # check if session is active -# if session is active, switch to it. If not active but part of the list below, -# create it. Finally, if no session or undefined session is passed, give an -# error message and list the active sessions +# if session is active, switch to it. +if tmux has-session -t "${session}" 2>/dev/null; then + echo "Session '${session}' already active. Attaching..." + tmux attach-session -t "${session}" + exit 0 +fi -# sample session definition -# -# case $session in -# analytics) # <- session name -# if [[ $tcheck == 0 ]]; then # <- check if it's already running -# tmux new-session -d -s analytics # <- if not, create it -# tmux rename-window 'localhost' # <- rename the first window (local) -# # ↓↓ define additional windows ↓↓ -# tmux new-window -t:1 -n 'lasis01' 'exec ssh lasis01' -# tmux new-window -t:2 -n 'lasis01dev' 'exec ssh lasis01dev' -# tmux new-window -t:3 -n 'ldssbox01' 'exec ssh ldssbox01' -# tmux new-window -t:4 -n 'lpdprod01' 'exec ssh lpdprod01' -# tmux new-window -t:5 -n 'ldatalake01' 'exec ssh ldatalake01' -# tmux new-window -t:6 -n 'lsandbox' 'exec ssh lsandbox' -# fi -# tmux attach-session -t analytics # <- if window active, switch to it -# ;; +# Check if the config file exists +if [ ! -f "${TMUX_CONFIG_FILE}" ]; then + echo "Error: tmux session configuration file not found at '${TMUX_CONFIG_FILE}'." + echo "Please create it with your session definitions." + exit 1 +fi +# Check if the requested session exists in the YAML file +if ! yq e ".sessions.${session}" "${TMUX_CONFIG_FILE}" &> /dev/null; then + echo "### ERROR No Such Session ###" + echo "Usage: $(basename "$0") " + echo "Available Sessions from '${TMUX_CONFIG_FILE}':" + echo "---------------------------------------" + yq e '.sessions | keys | .[]' "${TMUX_CONFIG_FILE}" 2>/dev/null || echo "No sessions defined." + echo "" + echo "Active tmux Sessions:" + echo "---------------------" + tmux list-sessions 2>/dev/null || echo "No active sessions." + exit 1 +fi -case $session in - mine) - if [[ $tcheck == 0 ]]; then - tmux new-session -d -s mine - tmux rename-window 'local(aristotle)' - tmux new-window -t 1 -n 'root@vps' 'exec ssh root@vps.example.org' - tmux new-window -t:2 -n 'chawley@phaedrus' 'exec ssh chawley@phaedrus' - tmux new-window -t:3 -n 'chawley@homer' 'exec ssh chawley@homer.simpsons.net' - fi - tmux attach-session -t mine - ;; +echo "Creating new session '${session}' from '${TMUX_CONFIG_FILE}'..." - # add more sessions here inside a case stanza. Start with a session name and end with ';;' - - *) - echo "### ERROR No Such Session ###" - echo "Usage: tm " - echo "Active Sessions:" - echo "----------------" - tmux list-sessions - ;; -esac +# Get the number of windows for the session +num_windows=$(yq e ".sessions.${session}.windows | length" "${TMUX_CONFIG_FILE}") + +if [[ "${num_windows}" -eq 0 ]]; then + echo "Error: Session '${session}' has no windows defined in '${TMUX_CONFIG_FILE}'." + exit 1 +fi + +# Create the first window (which also creates the session) +first_window_name=$(yq e ".sessions.${session}.windows[0].name" "${TMUX_CONFIG_FILE}") +first_window_command=$(yq e ".sessions.${session}.windows[0].command // \"\"" "${TMUX_CONFIG_FILE}") + +if [[ -z "${first_window_command}" ]]; then + tmux new-session -d -s "${session}" -n "${first_window_name}" +else + tmux new-session -d -s "${session}" -n "${first_window_name}" "${first_window_command}" +fi + +# Create subsequent windows +for ((i=1; i