mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-24 09:50:04 +08:00
118 lines
2.9 KiB
VimL
118 lines
2.9 KiB
VimL
" vim match-up - even better matching
|
|
"
|
|
" Maintainer: Andy Massimino
|
|
" Email: a@normed.space
|
|
"
|
|
|
|
let s:save_cpo = &cpo
|
|
set cpo&vim
|
|
|
|
let s:time_start = {}
|
|
let s:alpha = 2.0/(10+1)
|
|
|
|
let g:matchup#perf#times = {}
|
|
|
|
function! matchup#perf#tic(context)
|
|
let s:time_start[a:context] = reltime()
|
|
endfunction
|
|
|
|
function! matchup#perf#toc(context, state)
|
|
let l:elapsed = s:reltimefloat(reltime(s:time_start[a:context]))
|
|
|
|
let l:key = a:context.'#'.a:state
|
|
if has_key(g:matchup#perf#times, l:key)
|
|
if l:elapsed > g:matchup#perf#times[l:key].maximum
|
|
let g:matchup#perf#times[l:key].maximum = l:elapsed
|
|
endif
|
|
let g:matchup#perf#times[l:key].last = l:elapsed
|
|
let g:matchup#perf#times[l:key].emavg = s:alpha*l:elapsed
|
|
\ + (1-s:alpha)*g:matchup#perf#times[l:key].emavg
|
|
else
|
|
let g:matchup#perf#times[l:key] = {
|
|
\ 'maximum' : l:elapsed,
|
|
\ 'emavg' : l:elapsed,
|
|
\ 'last' : l:elapsed,
|
|
\}
|
|
endif
|
|
endfunction
|
|
|
|
function! s:sort_by_last(a, b)
|
|
let l:a = g:matchup#perf#times[a:a].last
|
|
let l:b = g:matchup#perf#times[a:b].last
|
|
return l:a == l:b ? 0 : l:a > l:b ? 1 : -1
|
|
endfunction
|
|
|
|
function! matchup#perf#show_times()
|
|
let l:keys = keys(g:matchup#perf#times)
|
|
let l:contexts = uniq(sort(map(copy(l:keys), 'split(v:val, "#")[0]')))
|
|
if empty(l:contexts)
|
|
echo 'no times'
|
|
return
|
|
end
|
|
|
|
echohl Title
|
|
echo printf("%42s%11s%17s", 'average', 'last', 'maximum')
|
|
echohl None
|
|
for l:c in l:contexts
|
|
echohl Special
|
|
echo '['.l:c.']'
|
|
echohl None
|
|
let l:states = filter(copy(l:keys), 'v:val =~# "^\\V'.l:c.'#"')
|
|
call sort(l:states, 's:sort_by_last')
|
|
for l:s in l:states
|
|
echo printf(" %-25s%12.2gms%12.2gms%12.2gms",
|
|
\ join(split(l:s,'#')[1:],'#'),
|
|
\ 1000*g:matchup#perf#times[l:s].emavg,
|
|
\ 1000*g:matchup#perf#times[l:s].last,
|
|
\ 1000*g:matchup#perf#times[l:s].maximum)
|
|
endfor
|
|
endfor
|
|
endfunction
|
|
|
|
command! MatchupShowTimes call matchup#perf#show_times()
|
|
command! MatchupClearTimes let g:matchup#perf#times = {}
|
|
|
|
let s:timeout = 0
|
|
let s:timeout_enabled = 0
|
|
let s:timeout_pulse_time = reltime()
|
|
|
|
function! matchup#perf#timeout() " {{{1
|
|
return float2nr(s:timeout)
|
|
endfunction
|
|
|
|
"}}}1
|
|
function! matchup#perf#timeout_start(timeout) " {{{1
|
|
let s:timeout = a:timeout
|
|
let s:timeout_enabled = (a:timeout == 0) ? 0 : 1
|
|
let s:timeout_pulse_time = reltime()
|
|
endfunction
|
|
|
|
" }}}1
|
|
function! matchup#perf#timeout_check() " {{{1
|
|
if !s:timeout_enabled | return 0 | endif
|
|
let l:elapsed = 1000.0 * s:reltimefloat(reltime(s:timeout_pulse_time))
|
|
let s:timeout -= l:elapsed
|
|
let s:timeout_pulse_time = reltime()
|
|
return s:timeout <= 0.0
|
|
endfunction
|
|
|
|
" }}}1
|
|
|
|
" function! s:reltimefloat(time) {{{1
|
|
if exists('*reltimefloat')
|
|
function! s:reltimefloat(time)
|
|
return reltimefloat(a:time)
|
|
endfunction
|
|
else
|
|
function! s:reltimefloat(time)
|
|
return str2float(reltimestr(a:time))
|
|
endfunction
|
|
endif
|
|
|
|
" }}}1
|
|
|
|
let &cpo = s:save_cpo
|
|
|
|
" vim: fdm=marker sw=2
|
|
|