diff --git a/README.md b/README.md
index 63042f5..6564135 100644
--- a/README.md
+++ b/README.md
@@ -90,6 +90,7 @@ You should now be able to use the plugin.
**Configuration**
- [Changing the default key bindings](docs/custom_key_bindings.md).
+- [Setting up hooks on save & restore](docs/hooks.md).
- Only a conservative list of programs is restored by default:
`vi vim nvim emacs man less more tail top htop irssi weechat mutt`.
[Restoring programs doc](docs/restoring_programs.md) explains how to restore
diff --git a/docs/hooks.md b/docs/hooks.md
new file mode 100644
index 0000000..cb4e7a3
--- /dev/null
+++ b/docs/hooks.md
@@ -0,0 +1,39 @@
+# Save & Restore Hooks
+
+Hooks allow to set custom commands that will be executed during session save
+and restore. Most hooks are called with zero arguments, unless explicitly
+stated otherwise.
+
+Currently the following hooks are supported:
+
+- `@resurrect-hook-post-save-layout`
+
+ Called after all sessions, panes and windows have been saved.
+
+ Passed single argument of the state file.
+
+- `@resurrect-hook-post-save-all`
+
+ Called at end of save process right before the spinner is turned off.
+
+- `@resurrect-hook-pre-restore-all`
+
+ Called before any tmux state is altered.
+
+- `@resurrect-hook-pre-restore-history`
+
+ Called after panes and layout have been restores, but before bash history is
+ restored (if it is enabled) -- the hook is always called even if history
+ saving is disabled.
+
+- `@resurrect-hook-pre-restore-pane-processes`
+
+ Called after history is restored, but before running processes are restored.
+
+### Examples
+
+Here is an example how to save and restore window geometry for most terminals in X11.
+Add this to `.tmux.conf`:
+
+ set -g @resurrect-hook-post-save-all 'eval $(xdotool getwindowgeometry --shell $WINDOWID); echo 0,$X,$Y,$WIDTH,$HEIGHT > $HOME/.tmux/resurrect/geometry'
+ set -g @resurrect-hook-pre-restore-all 'wmctrl -i -r $WINDOWID -e $(cat $HOME/.tmux/resurrect/geometry)'
diff --git a/scripts/helpers.sh b/scripts/helpers.sh
index 41fc7ce..8c2d6a7 100644
--- a/scripts/helpers.sh
+++ b/scripts/helpers.sh
@@ -148,3 +148,21 @@ resurrect_history_file() {
local shell_name="$2"
echo "$(resurrect_dir)/${shell_name}_history-${pane_id}"
}
+
+execute_hook() {
+ local kind="$1"
+ shift
+ local args="" hook=""
+
+ hook=$(get_tmux_option "$hook_prefix$kind" "")
+
+ # If there are any args, pass them to the hook (in a way that preserves/copes
+ # with spaces and unusual characters.
+ if [ "$#" -gt 0 ]; then
+ printf -v args "%q " "$@"
+ fi
+
+ if [ -n "$hook" ]; then
+ eval "$hook $args"
+ fi
+}
diff --git a/scripts/restore.sh b/scripts/restore.sh
index 9fd03a9..6fdfc2f 100755
--- a/scripts/restore.sh
+++ b/scripts/restore.sh
@@ -344,11 +344,14 @@ restore_active_and_alternate_sessions() {
main() {
if supported_tmux_version_ok && check_saved_session_exists; then
start_spinner "Restoring..." "Tmux restore complete!"
+ execute_hook "pre-restore-all"
restore_all_panes
restore_pane_layout_for_each_window >/dev/null 2>&1
+ execute_hook "pre-restore-history"
if save_shell_history_option_on; then
restore_shell_history
fi
+ execute_hook "pre-restore-pane-processes"
restore_all_pane_processes
# below functions restore exact cursor positions
restore_active_pane_for_each_window
@@ -356,6 +359,7 @@ main() {
restore_grouped_sessions # also restores active and alt windows for grouped sessions
restore_active_and_alternate_windows
restore_active_and_alternate_sessions
+ execute_hook "post-restore-all"
stop_spinner
display_message "Tmux restore complete!"
fi
diff --git a/scripts/save.sh b/scripts/save.sh
index f7508e8..ae1141d 100755
--- a/scripts/save.sh
+++ b/scripts/save.sh
@@ -283,6 +283,7 @@ save_all() {
dump_panes >> "$resurrect_file_path"
dump_windows >> "$resurrect_file_path"
dump_state >> "$resurrect_file_path"
+ execute_hook "post-save-layout" "$resurrect_file_path"
if files_differ "$resurrect_file_path" "$last_resurrect_file"; then
ln -fs "$(basename "$resurrect_file_path")" "$last_resurrect_file"
else
@@ -298,6 +299,7 @@ save_all() {
dump_shell_history
fi
remove_old_backups
+ execute_hook "post-save-all"
}
show_output() {
diff --git a/scripts/variables.sh b/scripts/variables.sh
index 9cfda0c..9436957 100644
--- a/scripts/variables.sh
+++ b/scripts/variables.sh
@@ -42,3 +42,6 @@ shell_history_option="@resurrect-save-shell-history"
# set to 'on' to ensure panes are never ever overwritten
overwrite_option="@resurrect-never-overwrite"
+
+# Hooks are set via ${hook_prefix}${name}, i.e. "@resurrect-hook-post-save-all"
+hook_prefix="@resurrect-hook-"