如何在Lua中通过Neovim的jobstart顺序运行命令?

问题描述 投票:0回答:1

给定一系列要运行的命令,其中每个后续命令都取决于前一个命令的完成,如何通过 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()
还是通过其他方式?

lua editor neovim
1个回答
0
投票

无需尝试单独运行多个命令,而是可以使用

; 
作为分隔符将它们连接起来,并将结果传递给
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
    将被执行。
© www.soinside.com 2019 - 2024. All rights reserved.