mirror of
				https://github.com/tmux-plugins/tmux-resurrect.git
				synced 2025-11-04 08:56:03 +00:00 
			
		
		
		
	Add bash history saving and restoring (first version).
This does not yet have flag to turn the feature off.
This commit is contained in:
		
				
					committed by
					
						
						Bruno Sutic
					
				
			
			
				
	
			
			
			
						parent
						
							a73c465e47
						
					
				
				
					commit
					81982b5114
				
			@@ -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}"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user