1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
|
" @Author: Tom Link (micathom AT gmail com?subject=[vim])
" @Website: http://www.vim.org/account/profile.php?user_id=4037
" @License: GPL (see http://www.gnu.org/licenses/gpl.txt)
" @Revision: 84
if !exists('g:tlib#win#use_winid')
let g:tlib#win#use_winid = exists('*win_gotoid') && exists('*win_getid') "{{{2
endif
" Return vim code to jump back to the original window.
function! tlib#win#Set(winnr) "{{{3
if a:winnr > 0
" TLogVAR a:winnr
" TLogDBG winnr()
" TLogDBG string(tlib#win#List())
if winnr() != a:winnr && winbufnr(a:winnr) != -1
let rv = winnr().'wincmd w'
exec a:winnr .'wincmd w'
" TLogVAR rv
" TLogDBG string(tlib#win#List())
return rv
endif
endif
return ''
endf
if g:tlib#win#use_winid
let g:tlib#win#null_id = -1
function! tlib#win#GetID() abort "{{{3
return win_getid()
endf
function! tlib#win#GotoID(win_id) abort "{{{3
call win_gotoid(a:win_id)
endf
else
let s:win_id = 0
let g:tlib#win#null_id = {}
function! tlib#win#GetID() abort "{{{3
if !exists('w:tlib_win_id')
let s:win_id += 1
let w:tlib_win_id = s:win_id
endif
return {'tabpagenr': tabpagenr(), 'bufnr': bufnr('%'), 'winnr': winnr(), 'win_id': w:tlib_win_id}
endf
function! tlib#win#GotoID(win_id) abort "{{{3
Tlibtrace 'tlib', a:win_id
if tabpagenr() != a:win_id.tabpagenr
exec 'tabnext' a:win_id.tabpagenr
endif
for wnr in range(1, winnr('$'))
let win_id = getwinvar(wnr, 'tlib_win_id', -1)
Tlibtrace 'tlib', wnr, win_id
if win_id == a:win_id.win_id
Tlibtrace 'tlib', wnr
exec wnr 'wincmd w'
return
endif
endfor
" Was the window closed? What should we do now?
if winnr() != a:win_id.winnr
exec a:win_id.winnr 'wincmd w'
endif
if bufnr('%') != a:win_id.bufnr
exec 'hide buffer' a:win_id.bufnr
endif
endf
endif
" Return vim code to jump back to the original window.
function! tlib#win#SetById(win_id) "{{{3
if a:win_id != g:tlib#win#null_id
if g:tlib#win#use_winid
let win_id = tlib#win#GetID()
else
let win_id = tlib#win#GetID().win_id
endif
call tlib#win#GotoID(a:win_id)
return printf('call tlib#win#GotoID(%s)', win_id)
" " TLogVAR a:winnr
" " TLogDBG winnr()
" " TLogDBG string(tlib#win#List())
" if winnr() != a:winnr && winbufnr(a:winnr) != -1
" let rv = winnr().'wincmd w'
" exec a:winnr .'wincmd w'
" " TLogVAR rv
" " TLogDBG string(tlib#win#List())
" return rv
" endif
endif
return ''
endf
" :def: function! tlib#win#GetLayout(?save_view=0)
function! tlib#win#GetLayout(...) "{{{3
TVarArg ['save_view', 0]
let views = {}
if save_view
let winnr = winnr()
windo let views[winnr()] = winsaveview()
" for w in range(1, winnr('$'))
" call tlib#win#Set(w)
" let views[w] = winsaveview()
" endfor
call tlib#win#Set(winnr)
endif
return {'winnr': winnr('$'), 'winrestcmd': winrestcmd(), 'views': views, 'cmdheight': &cmdheight, 'guioptions': &guioptions, 'tabpagenr': tabpagenr()}
endf
function! tlib#win#SetLayout(layout) "{{{3
if a:layout.tabpagenr == tabpagenr() && a:layout.winnr == winnr('$')
" TLogVAR a:layout.winrestcmd
" TLogDBG string(tlib#win#List())
exec a:layout.winrestcmd
if !empty(a:layout.views)
let winnr = winnr()
" TLogVAR winnr
for [w, v] in items(a:layout.views)
" TLogVAR w, v
call tlib#win#Set(w)
call winrestview(v)
endfor
call tlib#win#Set(winnr)
endif
if a:layout.cmdheight != &cmdheight
let &cmdheight = a:layout.cmdheight
endif
" TLogDBG string(tlib#win#List())
return 1
endif
return 0
endf
function! tlib#win#List() "{{{3
let wl = {}
for wn in range(1, winnr('$'))
let wl[wn] = bufname(winbufnr(wn))
endfor
return wl
endf
" " :def: function! tlib#win#GetLayout1(?save_view=0)
" " Contrary to |tlib#win#GetLayout|, this version doesn't use
" " |winrestcmd()|. It can also save windows views.
" function! tlib#win#GetLayout1(...) "{{{3
" TVarArg ['save_view', 0]
" let winnr = winnr()
" let acc = {}
" for w in range(1, winnr('$'))
" let def = {'h': winheight(w), 'w': winwidth(w)}
" if save_view
" call tlib#win#Set(w)
" let def.view = winsaveview()
" endif
" let acc[w] = def
" endfor
" call tlib#win#Set(winnr)
" return acc
" endf
"
"
" " Reset layout from the value of |tlib#win#GetLayout1|.
" function! tlib#win#SetLayout1(layout) "{{{3
" if len(a:layout) != winnr('$')
" return 0
" endif
" let winnr = winnr()
" for [w, def] in items(a:layout)
" if tlib#win#Set(w)
" exec 'resize '. def.h
" exec 'vertical resize '. def.w
" if has_key(def, 'view')
" call winrestview(def.view)
" endif
" else
" break
" endif
" endfor
" call tlib#win#Set(winnr)
" return 1
" endf
function! tlib#win#Width(wnr) "{{{3
return winwidth(a:wnr) - &fdc
endf
function! tlib#win#WinDo(ex) "{{{3
let w = winnr()
exec 'windo '. a:ex
exec w .'wincmd w'
endf
|