fix(vim.ui): open() may wait indefinitely #28325

Problem:
vim.ui.open "locks up" Nvim if the spawned process does not terminate. #27986

Solution:
- Change `vim.ui.open()`:
    - Do not call `wait()`.
    - Return a `SystemObj`. The caller can decide if it wants to `wait()`.
- Change `gx` to `wait()` only a short time.
    - Allows `gx` to show a message if the command fails, without the
      risk of waiting forever.
This commit is contained in:
Justin M. Keyes
2024-04-15 04:33:09 -07:00
committed by GitHub
parent 4ec8fd43bf
commit 57adf8c6e0
7 changed files with 38 additions and 20 deletions

View File

@@ -18,6 +18,7 @@ local uv = vim.uv
--- @field stderr? string
--- @class vim.SystemState
--- @field cmd string[]
--- @field handle? uv.uv_process_t
--- @field timer? uv.uv_timer_t
--- @field pid? integer
@@ -56,6 +57,7 @@ local function close_handles(state)
end
--- @class vim.SystemObj
--- @field cmd string[]
--- @field pid integer
--- @field private _state vim.SystemState
--- @field wait fun(self: vim.SystemObj, timeout?: integer): vim.SystemCompleted
@@ -68,6 +70,7 @@ local SystemObj = {}
--- @return vim.SystemObj
local function new_systemobj(state)
return setmetatable({
cmd = state.cmd,
pid = state.pid,
_state = state,
}, { __index = SystemObj })