Files
dotfiles/env/.local/scripts/tmux-sessionator

116 lines
2.7 KiB
Bash
Executable File

#!/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 new-window -t email -d -n iCloud neomutt
tmux send-keys -t email.1 'i2'
tmux send-keys -t email.3 'i3'
}
############################## 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"