.local-bin/scripts/sessionizer.sh
2025-05-16 03:33:10 -04:00

113 lines
3.1 KiB
Bash
Executable file

#!/usr/bin/env bash
# Define constants
FZF_THEME="$HOME/.local/bin/scripts/fzf_theme"
LS_OPTS="-la --color=always"
# List of directories to include in the search
INCLUDED_DIRS=(
"$HOME/.dotfiles"
"$HOME/Documents"
"$HOME/.local/bin"
"$HOME/Google Drive/My Drive"
)
# Function to handle cleanup on keyboard interrupt or stop
cleanup() {
echo "Interrupt detected. Cleaning up..."
if pgrep -x tmux >/dev/null && [[ -n "$TMUX" ]]; then
local original_session
original_session=$(tmux list-sessions -F "#{session_name}" | tail -n 1)
tmux switch-client -t "$original_session"
elif command -v wezterm >/dev/null && wezterm --version | grep -q "wezterm"; then
local tab_id
tab_id=$(wezterm cli list | tail -n 1 | awk '{print $2}')
wezterm cli activate-tab --tab-id "$tab_id"
fi
exit 0
}
# Trap the SIGINT (Ctrl+C) and SIGTSTP (Ctrl+Z) signals to handle cleanup
trap cleanup SIGINT SIGTSTP
# Function to find and deduplicate directories
find_directories() {
local finder="$1"
local include_params=("${@:2}")
# Use a single call to find directories, optimizing the process
"$finder" -H --min-depth 1 --max-depth 3 --type d . "${include_params[@]}" | sort -u
}
# Function to search and select directories using a fuzzy finder
search_dirs() {
local finder="$1"
local fuzzy_finder="$2"
local include_params=("${INCLUDED_DIRS[@]}")
local all_dirs
all_dirs=$(find_directories "$finder" "${include_params[@]}")
local selected
selected=$(
echo "$all_dirs" | "$fuzzy_finder" "$($FZF_THEME)" --cycle \
--preview "if command -v eza >/dev/null; then eza $LS_OPTS --group-directories-first {}; else ls $LS_OPTS {}; fi"
)
if [ -n "$selected" ]; then
echo "$selected"
else
echo "No directory selected. Exiting." >&2
return 1
fi
}
# Function to handle terminal multiplexer or tab management
handle_terminal() {
local selected="$1"
local selected_name
selected_name=$(basename "$selected" | tr '.' '_')
local full_path="${selected/#\~/$HOME}"
if pgrep -x tmux >/dev/null && [[ -n "$TMUX" ]]; then
if ! tmux has-session -t="$selected_name" 2>/dev/null; then
tmux new-session -ds "$selected_name" -c "$selected"
fi
tmux switch-client -t "$selected_name"
elif command -v wezterm >/dev/null && wezterm --version | grep -q "wezterm"; then
local workspace_exists
workspace_exists=$(wezterm cli list-workspaces | grep -w "$selected_name")
if [[ -z $workspace_exists ]]; then
wezterm cli create-workspace --name "$selected_name" --cwd "$full_path" # Create a new workspace
fi
wezterm cli switch-to-workspace --name "$selected_name"
else
echo "Warning: No terminal multiplexer detected (tmux or WezTerm)." >&2
exit 1
fi
}
# Main function to coordinate the script
main() {
local selected
if command -v sk >/dev/null && sk --version >/dev/null 2>&1; then
selected=$(search_dirs "fd" "sk")
elif command -v fzf >/dev/null && fzf --version >/dev/null 2>&1; then
selected=$(search_dirs "fd" "fzf")
else
echo "Warning: No fuzzy finder program detected (fzf or sk). Install one or use command line arguments." >&2
exit 1
fi
if [[ -n "$selected" ]]; then
handle_terminal "$selected"
fi
}
# Execute the main function
main