mirror of
https://github.com/tmux-plugins/tmux-resurrect.git
synced 2024-07-01 08:20:59 +02:00
Grouped sessions are session started with the command `tmux new-session -t <existing-session-name>` Those sessions share the panes and windows with the existing, original session. We're making sure to identify and save grouped sessions. On the other hand, we don't want to save panes and windows twice
206 lines
5.8 KiB
Bash
Executable File
206 lines
5.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
|
|
source "$CURRENT_DIR/variables.sh"
|
|
source "$CURRENT_DIR/helpers.sh"
|
|
source "$CURRENT_DIR/spinner_helpers.sh"
|
|
|
|
# delimiters
|
|
d=$'\t'
|
|
delimiter=$'\t'
|
|
|
|
grouped_sessions_format() {
|
|
local format
|
|
format+="#{session_grouped}"
|
|
format+="${delimiter}"
|
|
format+="#{session_group}"
|
|
format+="${delimiter}"
|
|
format+="#{session_id}"
|
|
format+="${delimiter}"
|
|
format+="#{session_name}"
|
|
echo "$format"
|
|
}
|
|
|
|
pane_format() {
|
|
local format
|
|
format+="pane"
|
|
format+="${delimiter}"
|
|
format+="#{session_name}"
|
|
format+="${delimiter}"
|
|
format+="#{window_index}"
|
|
format+="${delimiter}"
|
|
format+=":#{window_name}"
|
|
format+="${delimiter}"
|
|
format+="#{window_active}"
|
|
format+="${delimiter}"
|
|
format+=":#{window_flags}"
|
|
format+="${delimiter}"
|
|
format+="#{pane_index}"
|
|
format+="${delimiter}"
|
|
format+=":#{pane_current_path}"
|
|
format+="${delimiter}"
|
|
format+="#{pane_active}"
|
|
format+="${delimiter}"
|
|
format+="#{pane_current_command}"
|
|
format+="${delimiter}"
|
|
format+="#{pane_pid}"
|
|
echo "$format"
|
|
}
|
|
|
|
window_format() {
|
|
local format
|
|
format+="window"
|
|
format+="${delimiter}"
|
|
format+="#{session_name}"
|
|
format+="${delimiter}"
|
|
format+="#{window_index}"
|
|
format+="${delimiter}"
|
|
format+="#{window_active}"
|
|
format+="${delimiter}"
|
|
format+=":#{window_flags}"
|
|
format+="${delimiter}"
|
|
format+="#{window_layout}"
|
|
echo "$format"
|
|
}
|
|
|
|
state_format() {
|
|
local format
|
|
format+="state"
|
|
format+="${delimiter}"
|
|
format+="#{client_session}"
|
|
format+="${delimiter}"
|
|
format+="#{client_last_session}"
|
|
echo "$format"
|
|
}
|
|
|
|
dump_panes_raw() {
|
|
tmux list-panes -a -F "$(pane_format)"
|
|
}
|
|
|
|
dump_windows_raw(){
|
|
tmux list-windows -a -F "$(window_format)"
|
|
}
|
|
|
|
_save_command_strategy_file() {
|
|
local save_command_strategy="$(get_tmux_option "$save_command_strategy_option" "$default_save_command_strategy")"
|
|
local strategy_file="$CURRENT_DIR/../save_command_strategies/${save_command_strategy}.sh"
|
|
local default_strategy_file="$CURRENT_DIR/../save_command_strategies/${default_save_command_strategy}.sh"
|
|
if [ -e "$strategy_file" ]; then # strategy file exists?
|
|
echo "$strategy_file"
|
|
else
|
|
echo "$default_strategy_file"
|
|
fi
|
|
}
|
|
|
|
pane_full_command() {
|
|
local pane_pid="$1"
|
|
local strategy_file="$(_save_command_strategy_file)"
|
|
# execute strategy script to get pane full command
|
|
$strategy_file "$pane_pid"
|
|
}
|
|
|
|
save_shell_history() {
|
|
local pane_id="$1"
|
|
local pane_command="$2"
|
|
local full_command="$3"
|
|
if [ "$pane_command" = "bash" ] && [ "$full_command" = ":" ]; 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
|
|
}
|
|
|
|
dump_grouped_sessions() {
|
|
local current_session_group=""
|
|
local original_session
|
|
tmux list-sessions -F "$(grouped_sessions_format)" |
|
|
grep "^1" |
|
|
cut -c 3- |
|
|
sort |
|
|
while IFS=$'\t' read session_group session_id session_name; do
|
|
if [ "$session_group" != "$current_session_group" ]; then
|
|
# this session is the original/first session in the group
|
|
original_session="$session_name"
|
|
current_session_group="$session_group"
|
|
else
|
|
# this session "points" to the original session
|
|
echo "grouped_session${d}${session_name}${d}${original_session}"
|
|
fi
|
|
done
|
|
}
|
|
|
|
fetch_and_dump_grouped_sessions(){
|
|
local grouped_sessions_dump="$(dump_grouped_sessions)"
|
|
get_grouped_sessions "$grouped_sessions_dump"
|
|
echo "$grouped_sessions_dump"
|
|
}
|
|
|
|
# translates pane pid to process command running inside a pane
|
|
dump_panes() {
|
|
local full_command
|
|
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
|
|
# not saving panes from grouped sessions
|
|
if is_session_grouped "$session_name"; then
|
|
continue
|
|
fi
|
|
# check if current pane is part of a maximized window and if the pane is active
|
|
if [[ "${window_flags}" == *Z* ]] && [[ ${pane_active} == 1 ]]; then
|
|
# unmaximize the pane
|
|
tmux resize-pane -Z -t "${session_name}:${window_number}"
|
|
fi
|
|
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() {
|
|
dump_windows_raw |
|
|
while IFS=$'\t' read line_type session_name window_index window_active window_flags window_layout; do
|
|
# not saving windows from grouped sessions
|
|
if is_session_grouped "$session_name"; then
|
|
continue
|
|
fi
|
|
echo "${line_type}${d}${session_name}${d}${window_index}${d}${window_active}${d}${window_flags}${d}${window_layout}"
|
|
done
|
|
}
|
|
|
|
dump_state() {
|
|
tmux display-message -p "$(state_format)"
|
|
}
|
|
|
|
dump_bash_history() {
|
|
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 full_command; do
|
|
save_shell_history "$session_name:$window_number.$pane_index" "$pane_command" "$full_command"
|
|
done
|
|
}
|
|
|
|
save_all() {
|
|
local resurrect_file_path="$(resurrect_file_path)"
|
|
mkdir -p "$(resurrect_dir)"
|
|
fetch_and_dump_grouped_sessions > "$resurrect_file_path"
|
|
dump_panes >> "$resurrect_file_path"
|
|
dump_windows >> "$resurrect_file_path"
|
|
dump_state >> "$resurrect_file_path"
|
|
ln -fs "$(basename "$resurrect_file_path")" "$(last_resurrect_file)"
|
|
if save_bash_history_option_on; then
|
|
dump_bash_history
|
|
fi
|
|
restore_zoomed_windows
|
|
}
|
|
|
|
main() {
|
|
if supported_tmux_version_ok; then
|
|
start_spinner "Saving..." "Tmux environment saved!"
|
|
save_all
|
|
stop_spinner
|
|
display_message "Tmux environment saved!"
|
|
fi
|
|
}
|
|
main
|