给定一系列要运行的命令,其中每个后续命令都取决于前一个命令的完成,如何通过 Neovim 的
job
控制功能在 Lua 中顺序执行这些命令?
举个例子,在编译
.tex
文件时,通常需要运行 pdflatex
两次,然后运行 biber
,最后运行 pdflatex
才能解析其中的所有引用/超链接文件。
当尝试使用多个
jobstart
调用来执行此操作(如下所示)时,这些调用是在单独的生成作业中进行的,这意味着(实际上)它们“同时”发生,从而导致编译错误:
local pdflatex_cmd = "pdflatex file.tex"
local biber_cmd = "biber file.tex"
vim.fn.jobstart(pdflatex_cmd)
vim.fn.jobstart(pdflatex_cmd)
vim.fn.jobstart(biber_cmd)
vim.fn.jobstart(pdflatex_cmd)
尝试在每个
job_running = vim.fn.jobwait({job_id}, 0)[0] == -1
调用之间使用 vim.fn.jobstart()
和相应的作业 ID 来迭代检查作业的状态(即等待)失败。
有没有办法确保使用
jobstart
发出的上一个命令已完成,无论是使用 vim.fn.jobwait()
还是通过其他方式?
无需尝试单独运行多个命令,而是可以使用
;
作为分隔符将它们连接起来,并将结果传递给 jobstart
。例如:
local pdflatex_cmd = "pdflatex file.tex"
local biber_cmd = "biber file.tex"
local multiple_cmds = pdflatex_cmd .. "; " .. pdflatex_cmd .. "; " .. biber_cmd .. "; " .. pdflatex_cmd
vim.fn.jobstart(multiple_cmds)
在 Linux 上,用
;
分隔命令(例如 cmd2; cmd2; cmd3
)允许用户在前一个命令之后运行每个命令,无论前一个命令是否成功执行或有错误。为了完整起见:
&&
。例如,当发出cmd1 && cmd2 && cmd3
时,如果cmd1
失败,则cmd2
不会被执行。使用此选项非常适合编译 .tex
文档,因为如果前一个命令失败,则不需要运行后续命令。||
。例如,当发出cmd1 || cmd2 || cmd3
时,如果cmd1
失败,cmd2
将被执行。