File: win.vim

package info (click to toggle)
vim-tlib 1.28-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, sid, trixie
  • size: 752 kB
  • sloc: ruby: 61; makefile: 5
file content (201 lines) | stat: -rw-r--r-- 5,745 bytes parent folder | download
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