Skip to content

Commit a05f11e

Browse files
committed
Merge remote-tracking branch 'hlintala/save-options'
2 parents cff343c + f47fee6 commit a05f11e

File tree

3 files changed

+138
-1
lines changed

3 files changed

+138
-1
lines changed

scripts/helpers.sh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,17 @@ is_session_grouped() {
7878
[[ "$GROUPED_SESSIONS" == *"${d}${session_name}${d}"* ]]
7979
}
8080

81+
get_linked_windows() {
82+
local linked_windows_dump="$1"
83+
export LINKED_WINDOWS="${d}$(echo "$linked_windows_dump" | cut -f2-3 -d"$d" | tr "$d\\n" ":$d")"
84+
}
85+
86+
is_window_linked() {
87+
local session_name="$1"
88+
local window_index="$2"
89+
[[ "$LINKED_WINDOWS" = *"${d}${session_name}:${window_index}${d}"* ]]
90+
}
91+
8192
# pane content file helpers
8293

8394
pane_contents_create_archive() {

scripts/restore.sh

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,13 @@ handle_session_0() {
284284
fi
285285
}
286286

287+
restore_linked_windows() {
288+
\grep '^linked_window' $(last_resurrect_file) |
289+
while IFS=$d read line_type session window_index original_session original_window_index; do
290+
tmux link-window -s "${original_session}:${original_window_index}" -t "${session}:${window_index}"
291+
done
292+
}
293+
287294
restore_window_properties() {
288295
local window_name
289296
\grep '^window' $(last_resurrect_file) |
@@ -355,6 +362,39 @@ restore_active_and_alternate_sessions() {
355362
done < $(last_resurrect_file)
356363
}
357364

365+
restore_session_options() {
366+
\grep '^option_session' $(last_resurrect_file) |
367+
while IFS=$d read line_type session_name option value; do
368+
value=$(echo $value | sed 's/"\(.*\)"/\1/')
369+
tmux set-option -t "${session_name}:" "${option}" "${value}"
370+
done
371+
}
372+
373+
restore_window_options() {
374+
local has_automatic_rename="${d}"
375+
while IFS=$d read line_type session_name window_index option value; do
376+
value=$(echo $value | sed 's/"\(.*\)"/\1/')
377+
if [ "$option" == "automatic-rename" ]; then
378+
has_automatic_rename+="${session_name}:${window_index}${d}"
379+
fi
380+
tmux set-window-option -t "${session_name}:${window_index}" "${option}" "${value}"
381+
done <<< $(\grep '^option_window' $(last_resurrect_file))
382+
383+
get_grouped_sessions "$(\grep '^grouped_session\s' $(last_resurrect_file))"
384+
get_linked_windows "$(\grep '^linked_window\s' $(last_resurrect_file))"
385+
386+
tmux list-windows -a -F "#{session_name}${d}#{window_index}" |
387+
while IFS=$d read session_name window_index ;do
388+
if is_session_grouped "$session_name" || is_window_linked "$session_name" "$window_index"; then
389+
continue
390+
fi
391+
392+
if [[ "$has_automatic_rename" != *"$session_name:$window_index"* ]]; then
393+
tmux set-window-option -u -t "$session_name:$window_index" "automatic-rename"
394+
fi
395+
done
396+
}
397+
358398
# A cleanup that happens after 'restore_all_panes' seems to fix fish shell
359399
# users' restore problems.
360400
cleanup_restored_pane_contents() {
@@ -369,6 +409,7 @@ main() {
369409
execute_hook "pre-restore-all"
370410
restore_all_panes
371411
handle_session_0
412+
restore_linked_windows
372413
restore_window_properties >/dev/null 2>&1
373414
execute_hook "pre-restore-pane-processes"
374415
restore_all_pane_processes
@@ -378,6 +419,8 @@ main() {
378419
restore_grouped_sessions # also restores active and alt windows for grouped sessions
379420
restore_active_and_alternate_windows
380421
restore_active_and_alternate_sessions
422+
restore_session_options
423+
restore_window_options
381424
cleanup_restored_pane_contents
382425
execute_hook "post-restore-all"
383426
stop_spinner

scripts/save.sh

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,18 @@ grouped_sessions_format() {
2525
echo "$format"
2626
}
2727

28+
linked_windows_format() {
29+
local format
30+
format+="#{window_linked}"
31+
format+="${delimiter}"
32+
format+="#{window_id}"
33+
format+="${delimiter}"
34+
format+="#{session_name}"
35+
format+="${delimiter}"
36+
format+="#{window_index}"
37+
echo "$format"
38+
}
39+
2840
pane_format() {
2941
local format
3042
format+="pane"
@@ -81,6 +93,16 @@ state_format() {
8193
echo "$format"
8294
}
8395

96+
window_option_format() {
97+
local format
98+
format+="option_window"
99+
format+="${delimiter}"
100+
format+="#{session_name}"
101+
format+="${delimiter}"
102+
format+="#{window_index}"
103+
echo "$format"
104+
}
105+
84106
dump_panes_raw() {
85107
tmux list-panes -a -F "$(pane_format)"
86108
}
@@ -185,13 +207,45 @@ fetch_and_dump_grouped_sessions(){
185207
fi
186208
}
187209

210+
dump_linked_windows() {
211+
local current_window_id=""
212+
local original_session
213+
local original_window_index
214+
tmux list-windows -a -F "$(linked_windows_format)" |
215+
grep "^1" |
216+
cut -c 3- |
217+
sort |
218+
while IFS=$d read window_id session_name window_index; do
219+
if is_session_grouped "$session_name"; then
220+
continue
221+
fi
222+
if [ "$window_id" != "$current_window_id" ]; then
223+
# this window is the original/first of linked windows
224+
original_session="$session_name"
225+
original_window_index="$window_index"
226+
current_window_id="$window_id"
227+
else
228+
# this window is linked to the original window
229+
echo "linked_window${d}${session_name}${d}${window_index}${d}${original_session}${d}${original_window_index}"
230+
fi
231+
done
232+
}
233+
234+
fetch_and_dump_linked_windows() {
235+
local linked_windows_dump="$(dump_linked_windows)"
236+
get_linked_windows "$linked_windows_dump"
237+
if [ -n "$linked_windows_dump" ]; then
238+
echo "$linked_windows_dump"
239+
fi
240+
}
241+
188242
# translates pane pid to process command running inside a pane
189243
dump_panes() {
190244
local full_command
191245
dump_panes_raw |
192246
while IFS=$d read line_type session_name window_number window_active window_flags pane_index pane_title dir pane_active pane_command pane_pid history_size; do
193247
# not saving panes from grouped sessions
194-
if is_session_grouped "$session_name"; then
248+
if is_session_grouped "$session_name" || is_window_linked "$session_name" "$window_number"; then
195249
continue
196250
fi
197251
full_command="$(pane_full_command $pane_pid)"
@@ -214,6 +268,29 @@ dump_windows() {
214268
done
215269
}
216270

271+
dump_session_options() {
272+
tmux list-sessions -F "#{session_name}" |
273+
while read session_name; do
274+
tmux show-options -t "${session_name}:" |
275+
while read option value; do
276+
echo "option_session${d}${session_name}${d}${option}${d}${value}"
277+
done
278+
done
279+
}
280+
281+
dump_window_options() {
282+
tmux list-windows -a -F "$(window_option_format)" |
283+
while IFS=$d read line_type session_name window_index; do
284+
if is_session_grouped "${session_name}" || is_window_linked "$session_name" "$window_index"; then
285+
continue
286+
fi
287+
tmux show-window-options -t "${session_name}:${window_index}" | sed "s/ /$d/" |
288+
while IFS=$d read option value; do
289+
echo "${line_type}${d}${session_name}${d}${window_index}${d}${option}$d${value}"
290+
done
291+
done
292+
}
293+
217294
dump_state() {
218295
tmux display-message -p "$(state_format)"
219296
}
@@ -222,6 +299,9 @@ dump_pane_contents() {
222299
local pane_contents_area="$(get_tmux_option "$pane_contents_area_option" "$default_pane_contents_area")"
223300
dump_panes_raw |
224301
while IFS=$d read line_type session_name window_number window_active window_flags pane_index pane_title dir pane_active pane_command pane_pid history_size; do
302+
if is_session_grouped "$session_name" || is_window_linked "$session_name" "$window_number"; then
303+
continue
304+
fi
225305
capture_pane_contents "${session_name}:${window_number}.${pane_index}" "$history_size" "$pane_contents_area"
226306
done
227307
}
@@ -240,9 +320,12 @@ save_all() {
240320
local last_resurrect_file="$(last_resurrect_file)"
241321
mkdir -p "$(resurrect_dir)"
242322
fetch_and_dump_grouped_sessions > "$resurrect_file_path"
323+
fetch_and_dump_linked_windows >> "$resurrect_file_path"
243324
dump_panes >> "$resurrect_file_path"
244325
dump_windows >> "$resurrect_file_path"
245326
dump_state >> "$resurrect_file_path"
327+
dump_session_options >> "$resurrect_file_path"
328+
dump_window_options >> "$resurrect_file_path"
246329
execute_hook "post-save-layout" "$resurrect_file_path"
247330
if files_differ "$resurrect_file_path" "$last_resurrect_file"; then
248331
ln -fs "$(basename "$resurrect_file_path")" "$last_resurrect_file"

0 commit comments

Comments
 (0)