> Thanks, this is useful. Now we need to find out why we see an error or > nothing to read, while reading the pipe/socket should give us the > output. Adding some ch_logs() calls in channel_wait() could help > pinpoint it.
Sorry, I have not patched/debugged Vim, but want to add some findings while trying to make the async support for Vim work in Neomake. I think this might also be related to channels only being read from when Vim waits for user input, and that the closing callback is being invoked nonetheless - but input is discarded?! The following will not collect the line (to be run with `vim -Nu t.vim`): ``` call ch_logfile('/tmp/job.log') let g:lines = [] function Callback(channel, data) echom "CALLBACK" string(a:channel) string(a:data) echom "\n" let g:lines += [a:data] endfunction function Close_cb(channel) let g:lines += ['closed'] echom "CLOSE" string(a:channel) echom "\n" endfunction function Start(nr) return job_start(['sh', '-c', 'echo '.a:nr], { \ 'callback': 'Callback', \ 'close_cb': 'Close_cb', \ }) endfunction call Start(1) sleep 1 echom "lines" string(g:lines) ``` I can make it work when using `call input('continue?')` instead of the sleep. Is there another workaround / command that can be used to read from all channels? Callbacks are only called at a "safe" moment, usually when Vim is waiting for the user to type a character. Vim does not use multi-threading. The workaround I've found to make the tests in Neomake work is appending a "sleep .1" to the job's (shell) command: this makes it apparently stay long enough so that output gets handled. But I do not think this is a good workaround after all, and it does not work when trying to call "nonexistent". For starters: what about handling "sleep" like "call input()"? btw: I've found that `ch_read(job, {'timeout': 0})` can be used to read from the channel, but that does not trigger the callbacks, and the following will even deadlock Vim (100%), apparently in "ch_read": ``` let job = Start(1) while 1 let job_info = job_info(job) if job_info['status'] == 'dead' let data = ch_read(job, {'timeout': 0}) echom "READ DATA" string(data) endif echom string(job_info) echom "." sleep 10m endwhile echom "lines" string(g:lines) ``` The log for this is: 0.000040 : Starting job: sh -c echo 1 0.000076 on 0: Created channel 0.012068 : looking for messages on channels 0.012367 on 0: Job ended 0.012836 on 0: Blocking NL read, timeout: 0 msec 0.012994 RECV on 0: '1 ' 0.013014 on 0: Returning 1 bytes 0.023729 : looking for messages on channels 0.024069 on 0: Blocking NL read, timeout: 0 msec 0.024097 ERR on 0: channel_read_block(): Cannot read from channel, will close it soon Sorry for the unstructured comments, but it appears to be really buggy in this regard. Cheers, Daniel. -- -- 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.