@@ -212,3 +212,68 @@ function! taberian#confirm_window_close()
212212 endif
213213 close
214214endfunction
215+
216+ function ! taberian#state_export () abort
217+ let state = []
218+ for tabinfo in gettabinfo ()
219+ let tab = #{
220+ \ tabnr: tabinfo.tabnr,
221+ \ windows: [],
222+ \ }
223+ for winid in tabinfo.windows
224+ let win = gettabwinvar (tab .tabnr, winid, ' taberian' , {})- >deepcopy ()
225+ if empty (win ) || len (win .tabs ) < 2 " only save if more than 1 tab
226+ continue
227+ endif
228+
229+ " convert bufnrs to file paths:
230+ for tab in win .tabs
231+ let tab .buffer = fnamemodify (bufname (tab .bufnr ), ' :~:.' )
232+ unlet tab .bufnr
233+ endfor
234+
235+ let win .winnr = win_id2tabwin (winid)[1 ]
236+ unlet win .prev_nr
237+
238+ call add (tab .windows, win )
239+ endfor
240+ if ! empty (tab .windows)
241+ call add (state , tab )
242+ endif
243+ endfor
244+ return state
245+ endfunction
246+
247+ function ! taberian#state_import (state )
248+ for tabinfo in gettabinfo ()
249+ let tabnr = tabinfo.tabnr
250+ let tabs = a: state- >deepcopy ()- >filter ({_, val - > val.tabnr == tabnr})
251+ if empty (tabs )
252+ continue
253+ endif
254+ let tab = tabs [0 ]
255+
256+ for winid in tabinfo.windows
257+ let [_, winnr ] = win_id2tabwin (winid)
258+ let wins = tab .windows- >deepcopy ()- >filter ({_, val - > val.winnr == winnr })
259+ if empty (wins)
260+ continue
261+ endif
262+ let win = wins[0 ]
263+
264+ unlet win .winnr
265+
266+ " convert file paths to bufnrs:
267+ for tab in win .tabs
268+ execute ' badd ' . tab .buffer
269+ let tab .bufnr = bufnr (tab .buffer )
270+ unlet tab .buffer
271+ endfor
272+
273+ let old_win = gettabwinvar (tabnr, winid, ' taberian' , {})
274+ call extend (old_win, win )
275+ call settabwinvar (tabnr, winid, ' taberian' , old_win)
276+ call win_execute (winid, ' buffer ' . old_win.tabs [old_win.curr_nr].bufnr )
277+ endfor
278+ endfor
279+ endfunction
0 commit comments