82 lines
2.0 KiB
Bash
82 lines
2.0 KiB
Bash
state_root="${XDG_STATE_HOME:-$HOME/.local/state}/tmux-panes"
|
|
snapshot_root="${XDG_DATA_HOME:-$HOME/.local/share}/tmux/resurrect/panes"
|
|
|
|
pane_state() {
|
|
echo "$state_root/${1#%}"
|
|
}
|
|
|
|
pane_snapshot() {
|
|
echo "$snapshot_root/${1//\//_}"
|
|
}
|
|
|
|
case "${1:-}" in
|
|
claude-session)
|
|
[ -n "${TMUX_PANE:-}" ] || exit 0
|
|
session_id="$(jq -r '.session_id')"
|
|
dir="$(pane_state "$TMUX_PANE")"
|
|
mkdir -p "$dir"
|
|
printf '%s\n%s\n' "${CLAUDE_CONFIG_DIR:-}" "$session_id" > "$dir/claude"
|
|
;;
|
|
|
|
save)
|
|
mkdir -p "$(dirname "$snapshot_root")" "$state_root"
|
|
snapshot="$(mktemp -d "$snapshot_root.XXXXXX")"
|
|
live=()
|
|
|
|
while IFS=$'\t' read -r id pos cmd; do
|
|
live+=("${id#%}")
|
|
case "$cmd" in
|
|
claude | emacs) ;;
|
|
*) continue ;;
|
|
esac
|
|
src="$(pane_state "$id")/$cmd"
|
|
[ -f "$src" ] || continue
|
|
dst="$snapshot/${pos//\//_}"
|
|
mkdir -p "$dst"
|
|
cp "$src" "$dst/$cmd"
|
|
done < <(tmux list-panes -a -F '#{pane_id} #S:#I.#P #{pane_current_command}')
|
|
|
|
rm -rf "$snapshot_root"
|
|
mv "$snapshot" "$snapshot_root"
|
|
|
|
for dir in "$state_root"/*/; do
|
|
[ -d "$dir" ] || continue
|
|
name="$(basename "$dir")"
|
|
[[ " ${live[*]} " == *" $name "* ]] || rm -rf "$dir"
|
|
done
|
|
;;
|
|
|
|
restore)
|
|
pos="$(tmux display-message -p -t "$TMUX_PANE" '#S:#I.#P')"
|
|
file="$(pane_snapshot "$pos")/${2:-}"
|
|
|
|
case "${2:-}" in
|
|
claude)
|
|
if [ ! -f "$file" ]; then
|
|
echo "tmux-panes: no saved claude session for $pos" >&2
|
|
exit 1
|
|
fi
|
|
{ read -r config_dir; read -r session_id; } < "$file"
|
|
CLAUDE_CONFIG_DIR="$config_dir" exec claude --resume "$session_id"
|
|
;;
|
|
emacs)
|
|
if [ -f "$file" ]; then
|
|
buffers="$(mktemp)"
|
|
cp "$file" "$buffers"
|
|
TMUX_PANES_RESTORE="$buffers" exec e
|
|
fi
|
|
exec e
|
|
;;
|
|
*)
|
|
echo "usage: tmux-panes restore claude|emacs" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
*)
|
|
echo "usage: tmux-panes claude-session|save|restore <claude|emacs>" >&2
|
|
exit 1
|
|
;;
|
|
esac
|