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

@@ -114,14 +114,19 @@ end
--- Examples:
---
--- ```lua
--- -- Asynchronous.
--- vim.ui.open("https://neovim.io/")
--- vim.ui.open("~/path/to/file")
--- vim.ui.open("$VIMRUNTIME")
--- -- Synchronous (wait until the process exits).
--- local cmd, err = vim.ui.open("$VIMRUNTIME")
--- if cmd then
--- cmd:wait()
--- end
--- ```
---
---@param path string Path or URL to open
---
---@return vim.SystemCompleted|nil # Command result, or nil if not found.
---@return vim.SystemObj|nil # Command object, or nil if not found.
---@return string|nil # Error message on failure
---
---@see |vim.system()|
@@ -152,13 +157,7 @@ function M.open(path)
return nil, 'vim.ui.open: no handler found (tried: explorer.exe, xdg-open)'
end
local rv = vim.system(cmd, { text = true, detach = true }):wait()
if rv.code ~= 0 then
local msg = ('vim.ui.open: command failed (%d): %s'):format(rv.code, vim.inspect(cmd))
return rv, msg
end
return rv, nil
return vim.system(cmd, { text = true, detach = true }), nil
end
return M