Add more hook points

And make the hook calling simpler at the call site.
This commit is contained in:
Ash Berlin-Taylor 2018-08-17 20:38:33 +01:00
parent 0133c7a96a
commit 8aa999c591
5 changed files with 53 additions and 24 deletions

View File

@ -1,14 +1,39 @@
# Save & Restore Hooks # Save & Restore Hooks
Hooks allow to set custom commands that will be executed during session save and restore. 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: Currently the following hooks are supported:
- `@resurrect-save-hook` - executed after session save - `@resurrect-hook-post-save-layout`
- `@resurrect-restore-hook` - executed before session restore
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. Here is an example how to save and restore window geometry for most terminals in X11.
Add this to `.tmux.conf`: Add this to `.tmux.conf`:
set -g @resurrect-save-hook 'eval $(xdotool getwindowgeometry --shell $WINDOWID); echo 0,$X,$Y,$WIDTH,$HEIGHT > $HOME/.tmux/resurrect/geometry' 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-restore-hook 'wmctrl -i -r $WINDOWID -e $(cat $HOME/.tmux/resurrect/geometry)' set -g @resurrect-hook-pre-restore-all 'wmctrl -i -r $WINDOWID -e $(cat $HOME/.tmux/resurrect/geometry)'

View File

@ -149,13 +149,20 @@ resurrect_history_file() {
echo "$(resurrect_dir)/${shell_name}_history-${pane_id}" echo "$(resurrect_dir)/${shell_name}_history-${pane_id}"
} }
# hook helpers execute_hook() {
local kind="$1"
shift
local args="" hook=""
save_hook() { hook=$(get_tmux_option "$hook_prefix$kind" "")
get_tmux_option "$save_hook_option" "$save_hook_default"
# 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
} }
restore_hook() {
get_tmux_option "$restore_hook_option" "$restore_hook_default"
}

View File

@ -344,14 +344,14 @@ restore_active_and_alternate_sessions() {
main() { main() {
if supported_tmux_version_ok && check_saved_session_exists; then if supported_tmux_version_ok && check_saved_session_exists; then
start_spinner "Restoring..." "Tmux restore complete!" start_spinner "Restoring..." "Tmux restore complete!"
if [ -n "$(restore_hook)" ]; then execute_hook "pre-restore-all"
eval "$(restore_hook)"
fi
restore_all_panes restore_all_panes
restore_pane_layout_for_each_window >/dev/null 2>&1 restore_pane_layout_for_each_window >/dev/null 2>&1
execute_hook "pre-restore-history"
if save_shell_history_option_on; then if save_shell_history_option_on; then
restore_shell_history restore_shell_history
fi fi
execute_hook "pre-restore-pane-processes"
restore_all_pane_processes restore_all_pane_processes
# below functions restore exact cursor positions # below functions restore exact cursor positions
restore_active_pane_for_each_window restore_active_pane_for_each_window
@ -359,6 +359,7 @@ main() {
restore_grouped_sessions # also restores active and alt windows for grouped sessions restore_grouped_sessions # also restores active and alt windows for grouped sessions
restore_active_and_alternate_windows restore_active_and_alternate_windows
restore_active_and_alternate_sessions restore_active_and_alternate_sessions
execute_hook "post-restore-all"
stop_spinner stop_spinner
display_message "Tmux restore complete!" display_message "Tmux restore complete!"
fi fi

View File

@ -283,6 +283,7 @@ save_all() {
dump_panes >> "$resurrect_file_path" dump_panes >> "$resurrect_file_path"
dump_windows >> "$resurrect_file_path" dump_windows >> "$resurrect_file_path"
dump_state >> "$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 if files_differ "$resurrect_file_path" "$last_resurrect_file"; then
ln -fs "$(basename "$resurrect_file_path")" "$last_resurrect_file" ln -fs "$(basename "$resurrect_file_path")" "$last_resurrect_file"
else else
@ -298,6 +299,7 @@ save_all() {
dump_shell_history dump_shell_history
fi fi
remove_old_backups remove_old_backups
execute_hook "post-save-all"
} }
show_output() { show_output() {
@ -314,9 +316,6 @@ main() {
stop_spinner stop_spinner
display_message "Tmux environment saved!" display_message "Tmux environment saved!"
fi fi
if [ -n "$(save_hook)" ]; then
eval "$(save_hook)"
fi
fi fi
} }
main main

View File

@ -43,8 +43,5 @@ shell_history_option="@resurrect-save-shell-history"
# set to 'on' to ensure panes are never ever overwritten # set to 'on' to ensure panes are never ever overwritten
overwrite_option="@resurrect-never-overwrite" overwrite_option="@resurrect-never-overwrite"
# Hooks # Hooks are set via ${hook_prefix}${name}, i.e. "@resurrect-hook-post-save-all"
restore_hook_default="" hook_prefix="@resurrect-hook-"
restore_hook_option="@resurrect-restore-hook"
save_hook_default=""
save_hook_option="@resurrect-save-hook"