boss wrote:

> On Sunday, 1 May 2016 21:37:13 UTC+1, Bram Moolenaar  wrote:
> 
> > Note that adding "DETACH" was removed, so you can drop this check.
> [snip]
> > A couple of problems have been fixed.  Please give it another try and
> > report back if you still see a problem.
> [snip]
> > > I also implemented my job_start using an out_cb handler again instead
> > > of a close_cb handler.  The occasional-missing-callback problem has
> > > disappeared and it all worked perfectly.  Thanks!
> > 
> > That is the preferred way.  Reading the output in the close callback
> > might only work if there isn't much to read.
> 
> I upgraded from Vim 7.4.1795 to 7.4.1816 and found DETACH was no longer sent 
> to the `out_cb` handler to demarcate the end of my job's output on stdout.
> 
> So I added a `close_cb` handler which does what my `out_cb` handler used to 
> do on receiving DETACH: it gathers together all the preceding job output and 
> then processes it.
> 
> When I edit a file my job runs.  When I trigger a second run, Vim
> always crashes with a segfault:
> 
> Vim: Caught deadly signal SEGV
> Vim: Finished.
> Segmentation fault: 11
> 
> Here's my code:

Thanks for the description.  I'll try to reproduce.

> let job = job_start([&shell, &shellcmdflag, a:cmd], {
>       \ 'out_cb':   'OutHandler',
>       \ 'close_cb': 'CloseHandler'
>       \ })
> 
> " Channel is in NL mode.
> function! OutHandler(channel, line)
>   let channel_id = matchstr(a:channel, '\d\+')
>   call s:accumulate_job_output(channel_id, a:line)
> endfunction
> 
> function! CloseHandler(channel)
>   let channel_id = matchstr(a:channel, '\d\+')
>   call ProcessOutput(s:job_output(channel_id))
>   call s:job_finished(channel_id)
>   " redraw!
> endfunction
> 
> function! s:job_started(id)
>   let s:jobs[a:id] = 1
> endfunction
> 
> function! s:is_job_started(id)
>   return has_key(s:jobs, a:id)
> endfunction
> 
> function! s:accumulate_job_output(id, line)
>   if has_key(s:jobs, a:id)
>     let s:jobs[a:id] = add(s:jobs[a:id], a:line)
>   else
>     let s:jobs[a:id] = [a:line]
>   endif
> endfunction
> 
> " Returns a string
> function! s:job_output(id)
>   if has_key(s:jobs, a:id)
>     return join(s:jobs[a:id], "\n")."\n"
>   else
>     return ""
>   endif
> endfunction
> 
> function! s:job_finished(id)
>   if has_key(s:jobs, a:id)
>     unlet s:jobs[a:id]
>   endif
> endfunction
> 
> Regarding redrawing: adding a redraw! as the last line of my close
> handler doesn't redraw the screen.  Should I be doing this somewhere
> else?

Hmm, does it redraw the moment you type something?
It looks like the function to redraw after a callback is not invoked
after using the close_cb.  I'll make a patch for that.

-- 
No children may attend school with their breath smelling of "wild onions."
                [real standing law in West Virginia, United States of America]

 /// Bram Moolenaar -- b...@moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" 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_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui