Sunday, August 25, 2013

redraw crashes on android

Hey guys, this is sort of an obscure problem, I'm not sure if you have any suggestions. I'm running vim 7.3.3 (locally) on an android phone, via Connectbot, and I'm getting a crash that can't be reproduced on a computer due to redr!, maybe because of memory constraints or something. For example, the following script will crash my phone after about 3 seconds

while 1
if reltime()[1]%2
exe "norm! \<c-e>"
else
exe "norm! \<c-y>"
en
redr!
endwhile

On the "verbose" error log I get an "Interrupted" message and it jumps straight into my VimLeavePre autocommmands. I'm mostly looking for a work-around or any suggestions as to how to avoid this, or whether it's possible to do a safer redraw, etc. Try / catch, for example, doesn't work.

The actual script I'm working on, if this is relevant, is a mouse panning thing, a la Adobe reader:

nn <silent> <leftmouse> :call getchar()<cr><leftmouse>:exe (MousePan()==1? "keepj norm! \<lt>leftmouse>":"")<cr>
let glidestep=[99999999]+map(range(11),'11*(11-v:val)*(11-v:val)')
fun! MousePan()
if v:mouse_lnum>line('w$') || (&wrap && v:mouse_col%winwidth(0)==1) || (!&wrap && v:mouse_col>=winwidth(0)+winsaveview().leftcol) || v:mouse_lnum==line('$')
if line('$')==line('w0') | exe "keepj norm! \<c-y>" |en
return 1 | en
exe "norm! \<leftmouse>"
let [veon,fr,tl,dvl,dhl]=[&ve==?'all',-1,repeat([reltime()],4),[0,0,0,0],[0,0,0,0]]
let v=winsaveview()
let [v.col,v.coladd]=[0,v.curswant]
while getchar()=="\<leftdrag>"
let [dV,dH,fr]=[min([v:mouse_lnum-v.lnum,v.topline-1]), min([veon*(v:mouse_col-v.coladd-1),v.leftcol]),(fr+1)%4]
let [v.topline,v.leftcol,v.lnum,v.coladd,tl[fr],dvl[fr],dhl[fr]]=[v.topline-dV,v.leftcol-dH,v:mouse_lnum-dV,v:mouse_col-1-dH,reltime(),dV,dH]
call winrestview(v)
redr!
endwhile
let [sv,sh]=[dvl[0]+dvl[1]+dvl[2]+dvl[3],dhl[0]+dhl[1]+dhl[2]+dhl[3]]
let [ctl,cln,sv]=sv>2? ['-(v.topline>1)','-(v.lnum>1)',sv+10] : sv<-2? ['v.topline<'.line('$'),'v.lnum<'.line('$'),-sv+10] : ['-(v.topline>1)','-(v.lnum>1)',0]
let [clc,cca,sh,vc,hc]=sh>2? ['-(v.leftcol>0)','-(v.coladd>0)',sh+10,0,0] : sh<-2? ['1','1',-sh+10,0,0] : ['1','1',0,0,0]
if !eval(join(reltime(tl[(fr+1)%4]),' || 20000<')) || !sv && !sh | return | en
while !getchar(1) && sv+sh>0
let [y,x,vc,hc]=[vc>get(g:glidestep,sv,1),hc>get(g:glidestep,sh,1),vc+1,hc+1]
if y+x
let [v.topline,v.lnum,sv,vc]+=y? [eval(ctl),eval(cln),-1,-vc] : [0,0,0,0]
let [v.leftcol,v.coladd,sh,hc]+=x? [eval(clc),eval(cca),-1,-hc] : [0,0,0,0]
call winrestview(v)
redr!
en
endw
endfun

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

No comments: