#!/usr/bin/env zsh # Adapted from: https://github.com/ThePrimeagen/.dotfiles/blob/master/bin/.local/scripts/tmux-sessionizer debug="${DEBUG}" #################### Options #################### declare -a paths=() declare chooseOpt= declare emailOpt= declare -a directory=() zparseopts -D -- \ {c,-choose}=chooseOpt \ {d,-directory}:=directory \ {e,-email}=emailOpt #################### Helpers #################### function debug_print { if [ -n "$debug" ]; then echo "DEBUG: $1" fi } function path_prepend() { declare arg for arg in "$@"; do debug_print "arg: $arg" [ -d $arg ] && debug_print "arg is a directory" && paths=($arg $paths) \ || debug_print "arg is not a directory" done } function setup_fuzzy_find_paths() { local path="$TMUX_SESSIONATOR_PATH" debug_print "path: $path" for arg in ${(s[:])path}; do path_prepend "$arg" done debug_print "paths: $paths" } function create_session() { local selected_name=$1 local selected=$2 tmux new-session -ds "$selected_name" -c "$selected" -n "editor" tmux send-keys -t "$selected_name.1" 'n' Enter tmux new-window -t "$selected_name" -d -n "terminal" -c "$selected" } function create_email_session() { tmux new-session -ds email -n work neomutt tmux new-window -t email -d -n personal neomutt tmux send-keys -t email.1 'i2' } ############################## MAIN ############################## declare choose="${chooseOpt[-1]}" declare selected= if [[ -n $choose ]] && [[ $# -eq 0 ]]; then debug_print "Choose from existing." selected=$( tmux list-sessions -F \#S | gum filter \ --placeholder "Pick a session..." ) elif [[ -n $emailOpt ]]; then debug_print "Email option." selected="email" elif [ ${#directory} -gt 0 ]; then debug_print "Using directory option." selected=${directory[-1]} if [ "$selected" = "." ] || [ "$selected" = "" ]; then selected="${PWD}" fi debug_print "Directory: $selected" elif [[ "$#" -eq 1 ]]; then debug_print "Using existing session: $1" selected=$1 else setup_fuzzy_find_paths debug_print "fuzzy find paths: ${paths}" if [ -n "$DEBUG" ]; then debug_print "Exiting because in debug mode." exit 0 fi selected=$(find ${paths} -mindepth 1 -maxdepth 1 -type d | fzf) fi if [[ -z $selected ]]; then exit 0 fi selected_name=$(basename "$selected" | tr . _) tmux_running=$(pgrep tmux) if [[ -z $TMUX ]] && [[ -z $tmux_running ]] || ! tmux has-session -t "$selected_name" &>/dev/null; then if [[ -n $emailOpt ]]; then create_email_session else create_session "$selected_name" "$selected" fi fi [ -z $TMUX ] && tmux attach -t "$selected_name" \ || tmux switch-client -t "$selected_name"