Save and restore tmux pane contents

This feature is controlled by the '@resurrect-capture-pane-contents'
option.
Currently only the visible area of each pane is saved and restored.
pull/79/head
quentin 2015-03-17 03:17:37 +01:00
parent 9c63ea625b
commit b22b2a7203
4 changed files with 40 additions and 1 deletions

View File

@ -51,6 +51,11 @@ remove_first_char() {
echo "$1" | cut -c2-
}
capture_pane_contents_option_on() {
local option="$(get_tmux_option "$pane_contents_option" "off")"
[ "$option" == "on" ]
}
save_bash_history_option_on() {
local option="$(get_tmux_option "$bash_history_option" "off")"
[ "$option" == "on" ]
@ -81,6 +86,11 @@ last_resurrect_file() {
echo "$(resurrect_dir)/last"
}
resurrect_pane_file() {
local pane_id="$1"
echo "$(resurrect_dir)/pane_contents-${pane_id}"
}
resurrect_history_file() {
local pane_id="$1"
echo "$(resurrect_dir)/bash_history-${pane_id}"

View File

@ -210,10 +210,20 @@ restore_pane_layout_for_each_window() {
done
}
restore_pane_contents() {
awk 'BEGIN { FS="\t"; OFS="\t" } /^pane/ { print $2, $3, $7, $10; }' $(last_resurrect_file) |
while IFS=$d read session_name window_number pane_index pane_command; do
if ! is_pane_registered_as_existing "$session_name" "$window_number" "$pane_index"; then
local pane_id="$session_name:$window_number.$pane_index"
local read_command=" cat '$(resurrect_pane_file "$pane_id")'"
tmux send-keys -t "$pane_id" "$read_command" C-m
fi
done
}
restore_shell_history() {
awk 'BEGIN { FS="\t"; OFS="\t" } /^pane/ { print $2, $3, $7, $10; }' $(last_resurrect_file) |
while IFS=$d read session_name window_number pane_index pane_command; do
if ! is_pane_registered_as_existing "$session_name" "$window_number" "$pane_index"; then
if ! is_pane_registered_as_existing "$session_name" "$window_number" "$pane_index"; then
if [ "$pane_command" = "bash" ]; then
local pane_id="$session_name:$window_number.$pane_index"
# tmux send-keys has -R option that should reset the terminal.
@ -285,6 +295,9 @@ main() {
if save_bash_history_option_on; then
restore_shell_history
fi
if capture_pane_contents_option_on; then
restore_pane_contents
fi
restore_all_pane_processes
# below functions restore exact cursor positions
restore_active_pane_for_each_window

View File

@ -108,6 +108,11 @@ pane_full_command() {
$strategy_file "$pane_pid"
}
capture_pane_contents() {
local pane_id="$1"
tmux capture-pane -ep -t "$pane_id" > "$(resurrect_pane_file "$pane_id")"
}
save_shell_history() {
local pane_id="$1"
local pane_command="$2"
@ -201,6 +206,13 @@ dump_state() {
tmux display-message -p "$(state_format)"
}
dump_pane_contents() {
dump_panes |
while IFS=$d read line_type session_name window_number window_name window_active window_flags pane_index dir pane_active pane_command full_command; do
capture_pane_contents "$session_name:$window_number.$pane_index"
done
}
dump_bash_history() {
dump_panes |
while IFS=$d read line_type session_name window_number window_name window_active window_flags pane_index dir pane_active pane_command full_command; do
@ -216,6 +228,9 @@ save_all() {
dump_windows >> "$resurrect_file_path"
dump_state >> "$resurrect_file_path"
ln -fs "$(basename "$resurrect_file_path")" "$(last_resurrect_file)"
if capture_pane_contents_option_on; then
dump_pane_contents
fi
if save_bash_history_option_on; then
dump_bash_history
fi

View File

@ -29,6 +29,7 @@ inline_strategy_token="->"
save_command_strategy_option="@resurrect-save-command-strategy"
default_save_command_strategy="ps"
pane_contents_option="@resurrect-capture-pane-contents"
bash_history_option="@resurrect-save-bash-history"
# set to 'on' to ensure panes are never ever overwritten