|
if !has('clientserver') |
|
finish |
|
endif |
|
|
|
command! -nargs=* Animate call Animate_start(<f-args>) |
|
|
|
function! Animate_cursor(cols, rows) |
|
silent! execute 'normal! '.a:rows.'G'.a:cols.'|' |
|
endfunction |
|
|
|
function! Animate_put(data, cols, rows) |
|
let remain = a:data |
|
let cols = a:cols < 0 ? 1 : a:cols + 1 |
|
let rows = a:rows + 1 |
|
while remain != '' && rows <= line('$') |
|
let str = matchstr(remain, "^[^\<NL>]*") |
|
let len = strlen(str) |
|
let remain = strpart(remain, len + 1) |
|
if rows >= 1 |
|
if a:cols < 0 |
|
let str = strpart(str, - a:cols) |
|
endif |
|
call Animate_cursor(cols, rows) |
|
silent! execute 'normal! gR'.str |
|
endif |
|
let rows = rows + 1 |
|
endwhile |
|
endfunction |
|
|
|
function! Animate_clear() |
|
silent! %s/^.*$// |
|
let @/ = '' |
|
endfunction |
|
|
|
function! Animate_start(wait, proc) |
|
let rows = 20 |
|
|
|
" Delete old buffer |
|
while 1 |
|
let nr = bufwinnr('Animate') |
|
if nr <= 0 |
|
break |
|
endif |
|
silent! execute nr.' wincmd w' |
|
bwipeout! |
|
endwhile |
|
|
|
" Initialize animation buffer |
|
silent! execute rows. ' new' |
|
setlocal nowrap buftype=nofile noswapfile |
|
silent! file Animate |
|
let i = rows |
|
while i > 1 |
|
call append('$', '') |
|
let i = i - 1 |
|
endwhile |
|
let b:animate = 1 |
|
let b:animate_frame = 0 |
|
let b:animate_rows = rows |
|
let b:animate_proc = a:proc |
|
|
|
let b:animate_save_updatetime = &updatetime |
|
let &updatetime = a:wait < 10 ? 10 : a:wait |
|
let b:animate_save_undolevels = &undolevels |
|
set undolevels=-1 |
|
let b:animate_save_hlsearch = &hlsearch |
|
set nohlsearch |
|
let b:animate_save_virtualedit = &virtualedit |
|
set virtualedit=all |
|
let b:animate_save_lazyredraw = &lazyredraw |
|
set nolazyredraw |
|
|
|
" Setup timer and procedure function |
|
let @a = 'load' |
|
augroup Animate |
|
autocmd! |
|
autocmd CursorHold Animate call s:Proc() |
|
autocmd BufLeave Animate call Animate_stop() |
|
augroup END |
|
endfunction |
|
|
|
function! Animate_stop() |
|
augroup Animate |
|
au! |
|
augroup END |
|
if exists('b:animate_save_updatetime') |
|
let &updatetime = b:animate_save_updatetime |
|
unlet b:animate_save_updatetime |
|
endif |
|
if exists('b:animate_save_undolevels') |
|
let &undolevels = b:animate_save_undolevels |
|
unlet b:animate_save_undolevels |
|
endif |
|
if exists('b:animate_save_hlsearch') |
|
let &hlsearch = b:animate_save_hlsearch |
|
unlet b:animate_save_hlsearch |
|
endif |
|
if exists('b:animate_save_virtualedit') |
|
let &virtualedit = b:animate_save_virtualedit |
|
unlet b:animate_save_virtualedit |
|
endif |
|
if exists('b:animate_save_lazyredraw') |
|
let &lazyredraw = b:animate_save_lazyredraw |
|
unlet b:animate_save_lazyredraw |
|
endif |
|
endfunction |
|
|
|
function! s:Proc() |
|
if b:animate_proc != '' |
|
if {b:animate_proc}(b:animate_frame) == 0 |
|
call Animate_stop() |
|
endif |
|
else |
|
call setline(1, b:animate_frame) |
|
endif |
|
|
|
" Count up frame number |
|
let b:animate_frame = b:animate_frame + 1 |
|
" Update screen |
|
normal! gg0 |
|
redraw |
|
call remote_send(v:servername, '0') |
|
endfunction |