@@ -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+
2840pane_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+
84106dump_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
189243dump_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+
217294dump_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