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

@@ -95,10 +95,19 @@ do
{ silent = true, expr = true, desc = ':help v_@-default' }
)
--- Map |gx| to call |vim.ui.open| on the identifier under the cursor
--- Map |gx| to call |vim.ui.open| on the <cfile> at cursor.
do
local function do_open(uri)
local _, err = vim.ui.open(uri)
local cmd, err = vim.ui.open(uri)
local rv = cmd and cmd:wait(1000) or nil
if cmd and rv and rv.code ~= 0 then
err = ('vim.ui.open: command %s (%d): %s'):format(
(rv.code == 124 and 'timeout' or 'failed'),
rv.code,
vim.inspect(cmd.cmd)
)
end
if err then
vim.notify(err, vim.log.levels.ERROR)
end