Dotfiles update 2025-12-25 12:04

This commit is contained in:
Aaron D. Lee
2025-12-25 12:04:56 -05:00
parent 4695b1e410
commit afb9c78c9b
71 changed files with 8163 additions and 758 deletions

View File

@@ -0,0 +1,116 @@
# ============================================================================
# Tmux Workspace Manager - Project Templates & Layouts
# ============================================================================
source "${0:A:h}/../lib/utils.zsh" 2>/dev/null || \
source "$HOME/.dotfiles/zsh/lib/utils.zsh" 2>/dev/null
typeset -g TW_TEMPLATES="${TW_TEMPLATES:-$HOME/.dotfiles/.tmux-templates}"
typeset -g TW_PREFIX="${TW_PREFIX:-work}"
typeset -g TW_DEFAULT="${TW_DEFAULT:-dev}"
_tw_check() { df_require_cmd tmux || return 1; }
_tw_init() {
df_ensure_dir "$TW_TEMPLATES"
[[ ! -f "$TW_TEMPLATES/dev.tmux" ]] && {
echo -e "# Dev layout\nsplit-window -h -p 50\nsplit-window -v -p 50\nselect-pane -t 0" > "$TW_TEMPLATES/dev.tmux"
echo -e "# Ops layout\nsplit-window -h\nsplit-window -v\nselect-pane -t 0\nsplit-window -v\nselect-pane -t 0" > "$TW_TEMPLATES/ops.tmux"
echo "# Full\n" > "$TW_TEMPLATES/full.tmux"
df_print_success "Created default templates"
}
}
tw-templates() {
_tw_init
df_print_func_name "Tmux Templates"
for t in "$TW_TEMPLATES"/*.tmux; do
[[ -f "$t" ]] && df_print_indent "$(basename "$t" .tmux)"
done
echo ""
df_print_info "Create: tw-create <name> <template>"
}
tw-create() {
local name="$1" tmpl="${2:-$TW_DEFAULT}"
[[ -z "$name" ]] && { tw-templates; return 1; }
_tw_check || return 1
_tw_init
local session="${TW_PREFIX}-${name}"
tmux has-session -t "$session" 2>/dev/null && { df_print_error "'$name' exists"; return 1; }
local tfile="$TW_TEMPLATES/${tmpl}.tmux"
[[ ! -f "$tfile" ]] && { df_print_error "Template '$tmpl' not found"; tw-templates; return 1; }
df_print_step "Creating: $name (template: $tmpl)"
tmux new-session -d -s "$session"
tmux source-file "$tfile" -t "$session"
df_in_git_repo && {
local root=$(df_git_root)
df_print_info "Git root: $root"
tmux send-keys -t "$session:0" "cd $root" C-m
}
df_print_success "Created: $name"
[[ -z "$TMUX" ]] && tmux attach -t "$session" || df_print_info "Switch: tmux switch -t $session"
}
tw-list() {
_tw_check || return 1
df_print_func_name "Tmux Workspaces"
local found=false
tmux list-sessions 2>/dev/null | while IFS=: read -r sess rest; do
[[ "$sess" == ${TW_PREFIX}-* ]] && { found=true; df_print_indent "${sess#${TW_PREFIX}-}"; }
done
[[ "$found" != true ]] && df_print_info "No workspaces. Use: tw-create <name>"
}
tw-attach() {
local name="$1"
[[ -z "$name" ]] && { tw-list; return 1; }
_tw_check || return 1
local session="${TW_PREFIX}-${name}"
tmux has-session -t "$session" 2>/dev/null || { df_print_error "'$name' not found"; return 1; }
[[ -z "$TMUX" ]] && tmux attach -t "$session" || tmux switch -t "$session"
}
tw-delete() {
[[ -z "$1" ]] && { tw-list; return 1; }
_tw_check || return 1
local session="${TW_PREFIX}-${1}"
tmux has-session -t "$session" 2>/dev/null || { df_print_error "'$1' not found"; return 1; }
tmux kill-session -t "$session"
df_print_success "Deleted: $1"
}
tw() {
local name="$1" tmpl="${2:-$TW_DEFAULT}"
[[ -z "$name" ]] && { tw-list; return; }
_tw_check || return 1
local session="${TW_PREFIX}-${name}"
tmux has-session -t "$session" 2>/dev/null && tw-attach "$name" || tw-create "$name" "$tmpl"
}
twf() {
df_require_cmd fzf || return 1
_tw_check || return 1
local sessions=()
tmux list-sessions 2>/dev/null | while IFS=: read -r sess rest; do
[[ "$sess" == ${TW_PREFIX}-* ]] && sessions+=("${sess#${TW_PREFIX}-}")
done
[[ ${#sessions[@]} -eq 0 ]] && { df_print_info "No workspaces"; return 1; }
local sel=$(printf '%s\n' "${sessions[@]}" | fzf $(df_fzf_opts) --prompt='Workspace > ')
[[ -n "$sel" ]] && tw-attach "$sel"
}
tw-sync() {
[[ -z "$TMUX" ]] && { df_print_error "Must be in tmux"; return 1; }
local cur=$(tmux show-window-option -v synchronize-panes 2>/dev/null)
[[ "$cur" == "on" ]] && { tmux set-window-option synchronize-panes off; df_print_info "Sync: OFF"; } || \
{ tmux set-window-option synchronize-panes on; df_print_info "Sync: ON"; }
}
alias twl='tw-list' twc='tw-create' twa='tw-attach' twd='tw-delete' twt='tw-templates'
_tw_init