Saturday, May 7, 2016

Re: Understanding job_start()

On 2016-05-06 21:23:30 +0000, Bram Moolenaar said:

> Nicola wrote:
>
>> On 2016-05-06 17:19:58 +0000, Nicola said:
>>
>>> Some time ago I had defined a thin wrapper around job_start() to run a LaTeX
>>> job asynchronously. Recently, it has stopped working. For some reason, with Vim
>>> 7.4.1817, when I give the following command:
>>>
>>> call job_start(['lualatex', 'foo.tex'])
>>>
>>> the job is not started any longer (or, if it is, it dies immediately).
>>> Suspecting some problem with I/O redirection, I have tried to set "out_io" and
>>> "err_io". If I use:
>>>
>>> call job_start(['lualatex', 'foo.tex'],
>>> \ {"out_io": "null", "err_io": "null"})
>>>
>>> the job is started, but the screen gets garbled with the output from lualatex,
>>> and I need to :redraw! the screen.
>>
>> To be clear, the above also happens if I close "in_io", too, as
>> explained in the
>> manual. And I've tried to add redirection in the command, too:
>>
>> call job_start(['lualatex', 'foo.tex', '>/dev/null', '2>&1'],
>> \ {"in_io": "null", "out_io": "null", "err_io": "null"})
>>
>> This still fills the screen with the output from lualatex.
>
> What system is this on? What patch level?

OS X, Vim 7.4.1817 from Homebrew, compiled --with-lua --with-luajit.

If someone with a TeX installation wants to try to reproduce, this is
the code I am using:

fun! lf_shell#async_run(cmd, ...)
let l:callback = a:0 > 0 ? a:1 : 'lf_shell#callback'
call job_start(a:cmd, {"exit_cb": l:callback, "in_io": "null",
"out_io": "null", "err_io": "null"})
endf

fun! lf_shell#callback(job, status)
if a:status == 0
echo "Success!"
else
echo "Job failed."
endif
endf

let g:latexmk = split('latexmk -lualatex -cd -pv- -synctex=1
-file-line-error -interaction=nonstopmode')

command! -nargs=0 LuaLaTeX echo "Typesetting..."<bar>
\ call lf_shell#async_run(g:latexmk+[expand('%:p')])

> You mention a callback, but your code doesn't show any callback.
> If you mean the exit_cb for the job, that is indeed called after some
> delay. You can speed it up by calling job_status(), e.g. in the channel
> close callback.

Ah, ok. As you see from the code above, I indeed use exit_cb. I will change my
code to keep track of the job status as you suggest (currently, I am discarding
job_start()'s return value).

Nicola


--
--
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/d/optout.

No comments: