From 71fd19d7ac9e83bf63d7bad337f43cd830a5b5bd Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Tue, 10 Mar 2026 20:42:43 +0000 Subject: [PATCH] runtime(open): Use job_start() on Linux Problem: With zsh, executing :!nohup xdg-open url >/dev/null 2>&1 & does not launch the browser. This occurs presumably because gvim/zsh cleans up background processes in a non-interactive session too quickly. Solution: Use job_start() with "stoponexit" set to an empty string. This bypasses the shell entirely (fixing the zsh issue) and ensures the browser process is not killed when Vim exits. On Linux, shellescape() is removed as job_start() in list mode handles special characters natively. fixes: #19594 Signed-off-by: Christian Brabandt --- runtime/autoload/dist/vim9.vim | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/runtime/autoload/dist/vim9.vim b/runtime/autoload/dist/vim9.vim index ece21db65d..87b3dbb872 100644 --- a/runtime/autoload/dist/vim9.vim +++ b/runtime/autoload/dist/vim9.vim @@ -3,7 +3,7 @@ vim9script # Vim runtime support library # # Maintainer: The Vim Project -# Last Change: 2026 Jan 31 +# Last Change: 2026 Mar 10 export def IsSafeExecutable(filetype: string, executable: string): bool if empty(exepath(executable)) @@ -60,7 +60,9 @@ if has('unix') enddef else export def Launch(args: string) - execute $':silent ! nohup {args} {Redir()} &' | redraw! + # Use job_start, because using !xdg-open is known not to work with zsh + # ignore signals on exit + job_start(split(args), {'stoponexit': ''}) enddef endif elseif has('win32') @@ -137,7 +139,13 @@ export def Open(file: string) setlocal shell& defer setbufvar('%', '&shell', shell) endif - Launch($"{Viewer()} {shellescape(file, 1)}") + if has('unix') && !has('win32unix') && !exists('$WSL_DISTRO_NAME') + # Linux: using job_start, so do not use shellescape. + Launch($"{Viewer()} {file}") + else + # Windows/WSL/Cygwin: NEEDS shellescape because Launch uses '!' + Launch($"{Viewer()} {shellescape(file, 1)}") + endif enddef # Uncomment this line to check for compilation errors early