diff --git a/scripts/helpers.sh b/scripts/helpers.sh index d4e0e24..16d8090 100644 --- a/scripts/helpers.sh +++ b/scripts/helpers.sh @@ -63,3 +63,8 @@ resurrect_file_path() { last_resurrect_file() { echo "$(resurrect_dir)/last" } + +resurrect_history_file() { + local pane_id="$1" + echo "$(resurrect_dir)/bash_history-${pane_id}" +} diff --git a/scripts/restore.sh b/scripts/restore.sh index 77d1f35..5c714ca 100755 --- a/scripts/restore.sh +++ b/scripts/restore.sh @@ -141,6 +141,21 @@ restore_all_panes() { done < $(last_resurrect_file) } +restore_shell_history() { + awk 'BEGIN { FS="\t"; OFS="\t" } /^pane/ { print $2, $3, $7, $10; }' $(last_resurrect_file) | + while IFS=$'\t' read session_name window_number pane_index pane_command; do + 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. + # However, appending 'clear' to the command seems to work more reliably. + local read_command="history -r '$(resurrect_history_file "$pane_id")'; clear" + tmux send-keys -t "$pane_id" "$read_command" C-m + fi + fi + done +} + restore_all_pane_processes() { if restore_pane_processes_enabled; then local pane_full_command @@ -196,6 +211,7 @@ main() { start_spinner "Restoring..." "Tmux restore complete!" restore_all_panes restore_pane_layout_for_each_window >/dev/null 2>&1 + restore_shell_history restore_all_pane_processes # below functions restore exact cursor positions restore_active_pane_for_each_window diff --git a/scripts/save.sh b/scripts/save.sh index b8a7131..486bede 100755 --- a/scripts/save.sh +++ b/scripts/save.sh @@ -83,6 +83,19 @@ pane_full_command() { $strategy_file "$pane_pid" } +save_shell_history() { + local pane_id="$1" + local pane_command="$2" + if [ "$pane_command" = "bash" ]; then + # leading space prevents the command from being saved to history + # (assuming default HISTCONTROL settings) + local write_command=" history -w '$(resurrect_history_file "$pane_id")'" + # C-e C-u is a Bash shortcut sequence to clear whole line. It is necessary to + # delete any pending input so it does not interfere with our history command. + tmux send-keys -t "$pane_id" C-e C-u "$write_command" C-m + fi +} + # translates pane pid to process command running inside a pane dump_panes() { local full_command @@ -91,6 +104,7 @@ dump_panes() { while IFS=$'\t' read line_type session_name window_number window_name window_active window_flags pane_index dir pane_active pane_command pane_pid; do full_command="$(pane_full_command $pane_pid)" echo "${line_type}${d}${session_name}${d}${window_number}${d}${window_name}${d}${window_active}${d}${window_flags}${d}${pane_index}${d}${dir}${d}${pane_active}${d}${pane_command}${d}:${full_command}" + save_shell_history "$session_name:$window_number.$pane_index" "$pane_command" done }