@@ -2,19 +2,129 @@ vim9script
22
33# Vim runtime support library
44#
5- # Maintainer: The Vim Project <https://github.com/vim/vim>
6- # Last Change: 2023 Oct 25
5+ # Maintainer: The Vim Project <https://github.com/vim/vim>
6+ # Last Change: 2025 Jan 29
77
88export def IsSafeExecutable (filetype : string , executable : string ): bool
9- if empty (exepath (executable ))
10- return v: false
9+ if empty (exepath (executable ))
10+ return v: false
11+ endif
12+ var cwd = getcwd ()
13+ return get (g: , filetype .. ' _exec' , get (g: , ' plugin_exec' , 0 ))
14+ && (fnamemodify (exepath (executable ), ' :p:h' ) !=# cwd
15+ || (split ($PATH , has (' win32' ) ? ' ;' : ' :' )- >index (cwd) != -1
16+ && cwd != ' .' ))
17+ enddef
18+
19+ def Redir (): string
20+ if get (g: , ' netrw_suppress_gx_mesg' , true)
21+ if &srr = ~# " %s"
22+ return printf (&srr , has (" win32" ) ? " nul" : " /dev/null" )
23+ elseif &srr = ~# ' >&\?$'
24+ return &srr .. (has (" win32" ) ? " nul" : " /dev/null" )
25+ else
26+ return &srr .. (has (" win32" ) ? " > nul" : " > /dev/null" )
1127 endif
12- var cwd = getcwd ()
13- return get (g: , filetype .. ' _exec' , get (g: , ' plugin_exec' , 0 ))
14- && (fnamemodify (exepath (executable ), ' :p:h' ) !=# cwd
15- || (split ($PATH , has (' win32' ) ? ' ;' : ' :' )- >index (cwd) != -1
16- && cwd != ' .' ))
28+ endif
29+ return ' '
30+ enddef
31+
32+ if has (' unix' )
33+ if has (' win32unix' )
34+ # Cygwin provides cygstart
35+ if executable (' cygstart' )
36+ export def Launch (args : string )
37+ execute $ ' silent ! cygstart --hide {args} {Redir()}' | redraw !
38+ enddef
39+ elseif ! empty ($MSYSTEM ) && executable (' start' )
40+ # MSYS2/Git Bash comes by default without cygstart; see
41+ # https: // www.msys2.org/wiki/ How- does- MSYS2- differ- from- Cygwin
42+ # Instead it provides /usr/ bin /start script running `cmd.exe / /c start `
43+ # Adding " " // b ` sets void title , hides cmd window and blocks path conversion
44+ # of /b to \b\ " by MSYS2; see https://www.msys2.org/ docs/filesystem-paths/
45+ export def Launch (args : string )
46+ execute $ ' silent !start "" //b {args} {Redir()}' | redraw !
47+ enddef
48+ else
49+ # imitate /usr/ bin /start script for other environments and hope for the best
50+ export def Launch (args : string )
51+ execute $ ' silent !cmd /c start "" /b {args} {Redir()}' | redraw !
52+ enddef
53+ endif
54+ elseif exists (' $WSL_DISTRO_NAME' ) # use cmd.exe to start GUI apps in WSL
55+ export def Launch (args : string )
56+ const command = (args = ~? ' \v<\f+\.(exe|com|bat|cmd)>' )
57+ ? $ ' cmd.exe /c start /b {args} {Redir()}'
58+ : $ ' nohup {args} {Redir()} &'
59+ execute $ ' silent ! {command}' | redraw !
60+ enddef
61+ else
62+ export def Launch (args : string )
63+ const fork = has (' gui_running' ) ? ' ' : ' &'
64+ execute $ ' :silent ! nohup {args} {Redir()} {fork}' | redraw !
65+ enddef
66+ endif
67+ elseif has (' win32' )
68+ export def Launch (args : string )
69+ const shell = (&shell = ~? ' \<cmd\.exe\>' ) ? ' ' : ' cmd.exe /c'
70+ const quotes = empty (shell ) ? ' ' : ' ""'
71+ execute $ ' silent ! {shell} start {quotes} /b {args} {Redir()}' | redraw !
72+ enddef
73+ else
74+ export def Launch (dummy: string )
75+ echom ' No common launcher found'
76+ enddef
77+ endif
78+
79+ var os_viewer = null_string
80+ # Git Bash
81+ if has (' win32unix' )
82+ # (cyg)start suffices
83+ os_viewer = ' '
84+ # Windows / WSL
85+ elseif executable (' explorer.exe' )
86+ os_viewer = ' explorer.exe'
87+ # Linux / BSD
88+ elseif executable (' xdg-open' )
89+ os_viewer = ' xdg-open'
90+ # MacOS
91+ elseif executable (' open' )
92+ os_viewer = ' open'
93+ endif
94+
95+ def Viewer (): string
96+ # g: Openprg could be a string of program + its arguments, test if first
97+ # argument is executable
98+ var user_viewer = get (g: , " Openprg" , get (g: , " netrw_browsex_viewer" , " " ))
99+
100+ # Take care of an off - by- one check for " for" too
101+ if executable (trim (user_viewer))
102+ return user_viewer
103+ endif
104+
105+ var args = split (user_viewer, ' \s\+\zs' )
106+ var viewer = get (args , 0 , ' ' )
107+
108+ for arg in args [1 :]
109+ if executable (trim (viewer))
110+ return user_viewer
111+ endif
112+
113+ viewer ..= arg
114+ endfor
115+
116+ if os_viewer == null
117+ echoerr " No program to open this path found. See :help Open for more information."
118+ endif
119+
120+ return os_viewer
121+ enddef
122+
123+ export def Open (file : string )
124+ Launch ($ " {Viewer()} {shellescape(file, 1)}" )
17125enddef
18126
19127# Uncomment this line to check for compilation errors early
20128# defcompile
129+
130+ # vim: ts = 8 sts = 2 sw = 2 et
0 commit comments