#!/usr/bin/env bash set -euo pipefail # tmux sessionizer for bugabinga dotfiles. # Prefix+d opens this in a popup. # Pick an existing tmux session or a project dir; tmux switches there. current="${1:-$PWD}" items() { tmux list-sessions -F 'session #{session_name}' 2>/dev/null || true printf 'dir %s ' "$current" printf 'dir %s ' "$HOME/Workspace/dotfiles" printf 'dir %s ' "$HOME/Notes" if command -v zoxide >/dev/null 2>&1; then zoxide query -l 2>/dev/null | sed 's#/$##' | sed 's#^#dir\t#' fi if command -v fd >/dev/null 2>&1; then fd . "$HOME/Workspace" "$HOME/Notes" "$HOME/.config" \ --type d \ --max-depth 2 \ --hidden \ --exclude .git \ --exclude node_modules \ --exclude target \ --exclude .cache \ --color never 2>/dev/null \ | sed 's#/$##' \ | sed 's#^#dir\t#' fi } if ! command -v fzf >/dev/null 2>&1; then printf 'fzf is required for tmux project/session switching.\n' >&2 exit 1 fi choice="$({ items | awk '!seen[$0]++'; } | fzf \ --prompt='tmux › ' \ --height=100% \ --layout=reverse \ --border=rounded \ --delimiter='\t' \ --with-nth='1,2' \ --preview='case {1} in session) tmux list-windows -t {2}; ;; dir) printf "%s\n" {2}; fd . {2} --max-depth 1 --hidden --exclude .git --color always 2>/dev/null | head -80; ;; esac' \ --preview-window='right,55%,border-left' \ )" || exit 0 kind="${choice%%$'\t'*}" value="${choice#*$'\t'}" case "$kind" in session) tmux switch-client -t "$value" ;; dir) name="$(basename "$value" | tr '.: ' '___')" tmux new-session -d -s "$name" -c "$value" 2>/dev/null || true tmux switch-client -t "$name" ;; esac