Andrew Stewart wrote:

> > On 25 Apr 2016, at 10:06 pm, Bram Moolenaar <[email protected]> wrote:
> > The exit callback is only invoked once Vim detects the job is gone.  By
> > then it's too late to read the output.  This is documented.  
> > 
> > There is also the close_cb for the channel, which gets called much
> > sooner than the exit_cb.  Actually, it's called before the out_cb
> > function, should probably change that.
> 
> Good to know, thanks.
> 
> > Perhaps, when there is a close_cb, the DETACH message should not be
> > added.  That simplifies how it works.
> 
> If I read a job's stdout with an "out_cb" handler, and the output has
> multiple lines, what's the right way to know that the job has finished
> and no more output is coming?
> 
> In NL mode I suppose I could keep accumulating the output via the
> handler, one line at a time, stopping when the message is "DETACH".
> 
> In RAW mode I get all the output at once – is that the recommended way
> for my situation?
> 
> Initially I tried to start a job without any handlers because I read
> this in the documentation:
> 
>     Without the handler you need to read the output with ch_read() or
>     ch_readraw().
> 
> Where would such a call go if it's not in a callback?

So far the scripts I have seen called ch_read() to wait for something to
read.  That doesn't work asynchronously though.

It should be possible to use ch_read() in the close callback.  Currently
that doesn't work, since the channel is considered already closed.  And
the readahead is discarded, because there is no callback to pass it to.

I'll fix this.  I'll also add another state to ch_status() to indicate
that the channel has readahead but is closed (can't send).  Then this
works:

        func! CloseHandler(channel)
          while ch_status(a:channel) == 'buffered'
            echomsg ch_read(a:channel)
          endwhile
        endfunc

        call ch_logfile('channellog', 'w')
        let cmd = 'diff -u /tmp/a /tmp/b'
        let job = job_start(cmd, {'close_cb': 'CloseHandler'})


> When I start two jobs with similar commands I only seem to get the
> output for the second.  Here's a demo:
> 
> $ cat demo.vim
> call ch_logfile('channellog', 'w')
> 
> function! OutHandler(channel, msg)
>   echom 'OutHandler'
>   echom '    '.a:channel
>   echom '    '.a:msg
> endfunction
> 
> let job = job_start('ls',    {'mode': 'raw', 'out_cb': 'OutHandler'})
> let job = job_start('ls -l', {'mode': 'raw', 'out_cb': 'OutHandler'})
> 
> $ vim -u NONE -N -S demo.vim
> 
> $ cat channellog 
> ==== start log session ====
>   0.000033 : Starting job: ls
>   0.000071 on 0: Created channel
>   0.000543 : Starting job: ls  -l
>   0.000599 on 1: Created channel
>   0.001033 : looking for messages on channels
>   0.003977 RECV on 0: 'andanother
> channellog
> demo.vim
> otherfile
> somefile
> '
>   0.003998 on 0: Closing channel
>   0.004103 on 0: Clearing channel
>   0.004113 on 0: Freeing channel
>   0.004120 : looking for messages on channels
>   0.005818 RECV on 1: 'total 16
> -rw-r--r--  1 andy  staff    0 26 Apr 11:16 andanother
> -rw-r--r--  1 andy  staff  204 26 Apr 11:17 channellog
> -rw-r--r--  1 andy  staff  289 26 Apr 11:17 demo.vim
> -rw-r--r--  1 andy  staff    0 26 Apr 11:16 otherfile
> -rw-r--r--  1 andy  staff    0 26 Apr 11:16 somefile
> '
>   0.005835 on 1: Invoking channel callback OutHandler
>   0.006085 ERR on 1: channel_select_check(): Cannot read from channel
>   0.006097 PUT on 1: 'DETACH
> '
>   0.006100 on 1: Closing channel
>   0.006170 : looking for messages on channels
>   0.006177 on 1: Invoking channel callback OutHandler
>   1.338691 : looking for messages on channels
> 
> You can see the OutHandler callback is not invoked on channel 0.
> 
> However if the second job's command is, say, 'cal' instead of 'ls -l',
> the callback is invoked for both jobs as expected.

With the current Vim it works for me, but only when using "job1" and
"job2".  Apparently overwriting the variable makes Vim think there is no
longer a reference to the job and discards the channel.  I'll fix that.

> I also noticed that the job's command in sensitive to whitespace.  A
> job command of ' ls' instead of 'ls' produces no output:
>
> $ cat channellog 
> ==== start log session ====
>   0.000032 : Starting job:   ls
>   0.000070 on 0: Created channel
>   0.000600 : looking for messages on channels
>   0.001676 ERR on 0: channel_select_check(): Cannot read from channel
>   0.001685 PUT on 0: 'DETACH
> '
>   0.001686 on 0: Closing channel
>   0.001715 : looking for messages on channels
>   0.001721 on 0: Invoking channel callback OutHandler
>   0.001829 : looking for messages on channels
> 
> I would expect leading / trailing whitespace not to affect anything.

I can make it skip over leading white space.


-- 
TALL KNIGHT: When you have found the shrubbery, then you must cut down the
             mightiest tree in the forest ... with a herring.
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- [email protected] -- 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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui