Skip to content

Commit a2a79b7

Browse files
committed
state import / export
1 parent 3c19771 commit a2a79b7

2 files changed

Lines changed: 80 additions & 1 deletion

File tree

autoload/taberian.vim

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,3 +212,68 @@ function! taberian#confirm_window_close()
212212
endif
213213
close
214214
endfunction
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

doc/taberian.txt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
Author: Sergey Vlasov <sergey@vlasov.me>
44
Licence: Vim licence, see |license|
55
Site: https://github.com/noscript/taberian.vim
6-
Version: 0.3
6+
Version: 0.4
77

88
================================================================================
99
CONTENTS *taberian-contents*
1010

1111
Intro...................................................|taberian-intro|
1212
Mappings.............................................|taberian-mappings|
1313
Commands.............................................|taberian-commands|
14+
Functions...........................................|taberian-functions|
1415
Variables...........................................|taberian-variables|
1516

1617
================================================================================
@@ -111,6 +112,19 @@ COMMANDS *taberian-commands*
111112
are zero-based, use 0 to go to the first tab.
112113

113114
:TaberianGoToPreviousTab See |taberian-goto-previous-tab|.
115+
116+
================================================================================
117+
FUNCTIONS *taberian-functions*
118+
119+
taberian#state_export() *taberian#state_export()*
120+
Returns a serialized state of Taberian that later can be
121+
imported back using |taberian#state_import()|. Useful to
122+
restore Taberian state after VIM restart.
123+
124+
taberian#state_import({state}) *taberian#state_import()*
125+
Restores Taberian state, previously exported with
126+
|taberian#state_export()|.
127+
114128

115129
================================================================================
116130
VARIABLES *taberian-variables*

0 commit comments

Comments
 (0)