repositories / dotfiles
dotfiles
bugabingas dorkfiles
owned by admin
tmux/session.sh
Raw#!/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