From cbf58ac61322a186acee84e824c61d8db1e33d23 Mon Sep 17 00:00:00 2001 From: Bruno Sutic Date: Wed, 27 Aug 2014 00:11:13 +0200 Subject: [PATCH] Restore all pane processes Close #3 --- CHANGELOG.md | 1 + README.md | 4 ++++ scripts/session_restorer.sh | 19 ++++++++++++++++--- scripts/session_saver.sh | 23 ++++++++++++++++++++++- 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3648a98..cfdf711 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ### master +- restore pane processes ### v0.0.4, 2014-08-26 - restore pane layout for each window diff --git a/README.md b/README.md index c7f806a..0b40836 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,10 @@ Enables saving and restoring of tmux sessions. +Requirements / dependencies: +- `tmux 1.9` or higher +- `pgrep` + ### Key bindings - `prefix + M-s` - save diff --git a/scripts/session_restorer.sh b/scripts/session_restorer.sh index ab08118..df5a615 100755 --- a/scripts/session_restorer.sh +++ b/scripts/session_restorer.sh @@ -75,8 +75,9 @@ new_pane() { restore_pane() { local pane="$1" echo "$pane" | - while IFS=$'\t' read line_type session_name window_number window_name window_active window_flags pane_index dir pane_active; do - window_name="$(remove_first_char $window_name)" + while IFS=$'\t' read line_type session_name window_number window_name window_active window_flags pane_index dir pane_active pane_command pane_full_command; do + window_name="$(remove_first_char "$window_name")" + pane_full_command="$(remove_first_char "$pane_full_command")" if window_exists "$session_name" "$window_number"; then new_pane "$session_name" "$window_number" "$window_name" "$dir" elif session_exists "$session_name"; then @@ -104,6 +105,16 @@ restore_all_sessions() { done < $(last_session_path) } +restore_all_pane_processes() { + local pane_full_command + awk 'BEGIN { FS="\t"; OFS="\t" } /^pane/ && $11 !~ "^:$" { print $2, $3, $7, $11; }' $(last_session_path) | + while IFS=$'\t' read session_name window_number pane_index pane_full_command; do + pane_full_command="$(remove_first_char "$pane_full_command")" + tmux switch-client -t "${session_name}:${window_number}" + tmux send-keys -t "$pane_index" "$pane_full_command" "C-m" + done +} + restore_pane_layout_for_each_window() { \grep '^window' $(last_session_path) | while IFS=$'\t' read line_type session_name window_number window_active window_flags window_layout; do @@ -139,7 +150,9 @@ main() { if supported_tmux_version_ok; then check_saved_session_exists restore_all_sessions - restore_pane_layout_for_each_window + restore_all_pane_processes + restore_pane_layout_for_each_window >/dev/null 2>&1 + # below functions restore exact cursor positions restore_active_pane_for_each_window restore_active_and_alternate_windows restore_active_and_alternate_sessions diff --git a/scripts/session_saver.sh b/scripts/session_saver.sh index 9482ade..68654e0 100755 --- a/scripts/session_saver.sh +++ b/scripts/session_saver.sh @@ -24,6 +24,10 @@ pane_format() { format+="#{pane_current_path}" format+="${delimiter}" format+="#{pane_active}" + format+="${delimiter}" + format+="#{pane_current_command}" + format+="${delimiter}" + format+="#{pane_pid}" echo "$format" } @@ -55,10 +59,27 @@ state_format() { echo "$format" } -dump_panes() { +dump_panes_raw() { tmux list-panes -a -F "$(pane_format)" } +pane_full_command() { + pane_pid="$1" + \pgrep -lf -P "$pane_pid" | + cut -d' ' -f2- +} + +# translates pane pid to process command running inside a pane +dump_panes() { + local full_command + local d=$'\t' # delimiter + dump_panes_raw | + 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}" + done +} + dump_windows() { tmux list-windows -a -F "$(window_format)" }