On Thu 9-Nov-06 5:27pm -0600, Yakov Lerner wrote: > I filed another change at > http://www.vim.org/tips/tip.php?tip_id=1379 > to this piece that makes it safe when two or more scripts use > this same technique simultaneously (otheriwse, &ut restoration > can go wrong, order of autocommands triggering is unpredictable).
> Bill, do you think the "if s:Pecho!=''|' check in autocommand is necessary ? No I do not - it was just there from your original. > " further improvement in restoration of the &updatetime. To make this > " usable in the plugins, we want it to be safe for the case when > " two plugins use same this same technique. Two independent > " restorations of &ut can run in unpredictable order. In order to > " make it safe, we add additional check in &ut restoration. > let s:Pecho='' > fu! s:Pecho(msg) > let s:hold_ut=&ut | if &ut>1|let &ut=1|en > let s:Pecho=a:msg > aug Pecho > au CursorHold * if s:Pecho!=''|echo s:Pecho > \|let s:Pecho=''|if s:hold_ut > &ut |let &ut=s:hold_ut|en|en > \|aug Pecho|exe 'au!'|aug END|aug! Pecho > aug END > endf > In this form, I think it's safe for use in plugins. I don't see the protection from collision. I haven't updated the tip yet, but the following code appears to solve the potential problem and removes unnecessary logic: " This update eliminates all "if" statements and introduces " a locked variable to prevent collisions. Should a call to " Pecho occur before the CursorHold is triggered, that call " will wait for the triggering to unlock. let g:PechoLock = 0 fu! s:Pecho(msg) wh islocked("g:PechoLock")|sl|endw lockv g:PechoLock|let s:hold_ut=&ut|let &ut=1 let s:Pecho=a:msg aug Pecho au CursorHold * ec s:Pecho \|let &ut=s:hold_ut|unlo g:PechoLock \|aug Pecho|exe 'au!'|aug END|aug! Pecho aug END endf -- Best regards, Bill