pinwheel: Restore claude and emacs panes with tmux-resurrect

This commit is contained in:
Alexander Heldt committed 2026-11-03 14:22:55 +01:00
1 parent 65c16f2ea6
commit 44afaf3936
5 files changed
+140 -1

No files matched your search

+13
View File
@@ -2,9 +2,20 @@
let
colors = config.lib.colors.terminal;
dim = builtins.elemAt colors.bright 0;
tmuxPanes = pkgs.writeShellApplication {
name = "tmux-panes";
runtimeInputs = [
pkgs.jq
pkgs.tmux
];
text = builtins.readFile ./panes.sh;
};
in
{
home-manager.users.alex = {
home.packages = [ tmuxPanes ];
programs.tmux = {
enable = true;
@@ -20,6 +31,8 @@ in
plugin = pkgs.tmuxPlugins.resurrect;
extraConfig = ''
set -g @resurrect-capture-pane-contents 'on'
set -g @resurrect-processes '"~bin/claude->${tmuxPanes}/bin/tmux-panes restore claude" "~bin/emacs -nw->${tmuxPanes}/bin/tmux-panes restore emacs"'
set -g @resurrect-hook-post-save-all '${tmuxPanes}/bin/tmux-panes save'
'';
}
{
+81
View File
@@ -0,0 +1,81 @@
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