]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
runtime(open): Use job_start() on Linux
authorChristian Brabandt <cb@256bit.org>
Tue, 10 Mar 2026 20:42:43 +0000 (20:42 +0000)
committerChristian Brabandt <cb@256bit.org>
Tue, 10 Mar 2026 20:42:43 +0000 (20:42 +0000)
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 <cb@256bit.org>
runtime/autoload/dist/vim9.vim

index ece21db65d3b66b7755b801b253924f7e7168817..87b3dbb872c11874848a581a4b3fc2bb6065572f 100644 (file)
@@ -3,7 +3,7 @@ vim9script
 # Vim runtime support library
 #
 # Maintainer:   The Vim Project <https://github.com/vim/vim>
-# 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