Skip to content

Further Save and restore hooks #267

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 20, 2018
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -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:<br/>
`vi vim nvim emacs man less more tail top htop irssi weechat mutt`.<br/>
[Restoring programs doc](docs/restoring_programs.md) explains how to restore
39 changes: 39 additions & 0 deletions docs/hooks.md
Original file line number Diff line number Diff line change
@@ -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)'
18 changes: 18 additions & 0 deletions scripts/helpers.sh
Original file line number Diff line number Diff line change
@@ -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
}
4 changes: 4 additions & 0 deletions scripts/restore.sh
Original file line number Diff line number Diff line change
@@ -344,18 +344,22 @@ 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
restore_zoomed_windows
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
2 changes: 2 additions & 0 deletions scripts/save.sh
Original file line number Diff line number Diff line change
@@ -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() {
3 changes: 3 additions & 0 deletions scripts/variables.sh
Original file line number Diff line number Diff line change
@@ -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-"