File: progressbar.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 (95 lines) | stat: -rw-r--r-- 2,521 bytes parent folder | download | duplicates (2)
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
" @Author:      Tom Link (mailto: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:    86

let s:id = 0
let s:ids = []
let s:statusline = []
let s:laststatus = []
let s:max = []
let s:format = []
let s:width = []
let s:value = []
let s:timestamp = -1

" EXAMPLE: >
"     call tlib#progressbar#Init(20)
"     try
"         for i in range(20)
"             call tlib#progressbar#Display(i)
"             call DoSomethingThatTakesSomeTime(i)
"         endfor
"     finally
"         call tlib#progressbar#Restore()
"     endtry
function! tlib#progressbar#Init(max, ...) "{{{3
    TVarArg ['format', '%s'], ['width', 10]
    let s:id += 1
    call insert(s:ids, s:id)
    call insert(s:statusline, &statusline)
    call insert(s:laststatus, &laststatus)
    call insert(s:max, a:max)
    call insert(s:format, format)
    call insert(s:width, width)
    call insert(s:value, -1)
    let sl = {
                \ 'id': s:id,
                \ 'statusline': &statusline,
                \ 'laststatus': &laststatus,
                \ 'max': a:max,
                \ 'format': format,
                \ 'width': width,
                \ 'value': -1
                \ }
    let &laststatus = 2
    let s:timestamp = localtime()
    return sl
endf


function! tlib#progressbar#Restore(...) "{{{3
    if a:0 >= 1
        let sl = a:1
        let idx = index(s:ids, sl.id)
        let &statusline = sl.statusline
        let &laststatus = sl.laststatus
    else
        let idx = 0
        let &statusline = remove(s:statusline, idx)
        let &laststatus = remove(s:laststatus, idx)
    endif
    call remove(s:ids, idx)
    call remove(s:max, idx)
    call remove(s:format, idx)
    call remove(s:width, idx)
    call remove(s:value, idx)
    redrawstatus
    " redraw
    " echo
endf


function! tlib#progressbar#Display(value, ...) "{{{3
    TVarArg 'extra', ['always', 0]
    let ts = localtime()
    if !always && ts == s:timestamp
        return
    else
        let s:timestamp = ts
    endif
    let val = a:value * s:width[0] / s:max[0]
    if always || val != s:value[0]
        let s:value[0] = val
        let pbl = repeat('#', val)
        let pbr = repeat('.', s:width[0] - val)
        let txt = printf(s:format[0], '['.pbl.pbr.']') . extra
        let &statusline = txt
        " TLogDBG txt
        redrawstatus
        " redraw
        " call tlib#notify#Echo(txt)
    endif
endf