@@ -25,6 +25,18 @@ grouped_sessions_format() {
25
25
echo " $format "
26
26
}
27
27
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
+
28
40
pane_format () {
29
41
local format
30
42
format+=" pane"
@@ -81,6 +93,16 @@ state_format() {
81
93
echo " $format "
82
94
}
83
95
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
+
84
106
dump_panes_raw () {
85
107
tmux list-panes -a -F " $( pane_format) "
86
108
}
@@ -185,13 +207,45 @@ fetch_and_dump_grouped_sessions(){
185
207
fi
186
208
}
187
209
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
+
188
242
# translates pane pid to process command running inside a pane
189
243
dump_panes () {
190
244
local full_command
191
245
dump_panes_raw |
192
246
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
193
247
# 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
195
249
continue
196
250
fi
197
251
full_command=" $( pane_full_command $pane_pid ) "
@@ -214,6 +268,29 @@ dump_windows() {
214
268
done
215
269
}
216
270
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
+
217
294
dump_state () {
218
295
tmux display-message -p " $( state_format) "
219
296
}
@@ -222,6 +299,9 @@ dump_pane_contents() {
222
299
local pane_contents_area=" $( get_tmux_option " $pane_contents_area_option " " $default_pane_contents_area " ) "
223
300
dump_panes_raw |
224
301
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
225
305
capture_pane_contents " ${session_name} :${window_number} .${pane_index} " " $history_size " " $pane_contents_area "
226
306
done
227
307
}
@@ -240,9 +320,12 @@ save_all() {
240
320
local last_resurrect_file=" $( last_resurrect_file) "
241
321
mkdir -p " $( resurrect_dir) "
242
322
fetch_and_dump_grouped_sessions > " $resurrect_file_path "
323
+ fetch_and_dump_linked_windows >> " $resurrect_file_path "
243
324
dump_panes >> " $resurrect_file_path "
244
325
dump_windows >> " $resurrect_file_path "
245
326
dump_state >> " $resurrect_file_path "
327
+ dump_session_options >> " $resurrect_file_path "
328
+ dump_window_options >> " $resurrect_file_path "
246
329
execute_hook " post-save-layout" " $resurrect_file_path "
247
330
if files_differ " $resurrect_file_path " " $last_resurrect_file " ; then
248
331
ln -fs " $( basename " $resurrect_file_path " ) " " $last_resurrect_file "
0 commit comments