Luigit
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