blob: a2b1451b025b5dbc2e6448a6e863dc8a78ba340b [file] [log] [blame]
Christian Brabandt4f174f02023-11-04 11:16:23 +01001vim9script
2
3# Vim runtime support library
4#
Luca Saccarolac729d6d2025-01-25 16:07:12 +01005# Maintainer: The Vim Project <https://github.com/vim/vim>
6# Last Change: 2025 Jan 24
Christian Brabandt4f174f02023-11-04 11:16:23 +01007
8export def IsSafeExecutable(filetype: string, executable: string): bool
Luca Saccarolac729d6d2025-01-25 16:07:12 +01009 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 != '.'))
17enddef
18
19def 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")
Christian Brabandt8e25d912024-08-17 15:52:11 +020027 endif
Luca Saccarolac729d6d2025-01-25 16:07:12 +010028 endif
29 return ''
30enddef
31
32if 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 execute 'silent !' ..
57 ((args =~? '\v<\f+\.(exe|com|bat|cmd)>') ?
58 $'cmd.exe /c start /b {args} {Redir()}' :
59 $'nohup {args} {Redir()} &')
60 | redraw!
61 enddef
62 else
63 export def Launch(args: string)
64 execute ':silent ! nohup' args Redir() (has('gui_running') ? '' : '&') | redraw!
65 enddef
66 endif
67elseif has('win32')
68 export def Launch(args: string)
69 execute 'silent !' .. (&shell =~? '\<cmd\.exe\>' ? '' : 'cmd.exe /c')
70 'start "" /b' args Redir() | redraw!
71 enddef
72else
73 export def Launch(dummy: string)
74 echom 'No common launcher found'
75 enddef
76endif
77
78var os_viewer = null_string
79# Git Bash
80if has('win32unix')
81 # (cyg)start suffices
82 os_viewer = ''
83# Windows / WSL
84elseif executable('explorer.exe')
85 os_viewer = 'explorer.exe'
86# Linux / BSD
87elseif executable('xdg-open')
88 os_viewer = 'xdg-open'
89# MacOS
90elseif executable('open')
91 os_viewer = 'open'
92endif
93
94def Viewer(): string
95 # g:Openprg could be a string of program + its arguments, test if first
96 # argument is executable
97 var user_viewer = get(g:, "Openprg", get(g:, "netrw_browsex_viewer", ""))
98
99 # Take care of an off-by-one check for "for" too
100 if executable(trim(user_viewer))
101 return user_viewer
102 endif
103
104 var args = split(user_viewer, '\s\+\zs')
105 var viewer = get(args, 0, '')
106
107 for arg in args[1 :]
108 if executable(trim(viewer))
109 return user_viewer
110 endif
111
112 viewer ..= arg
113 endfor
114
115 if os_viewer == null
116 echoerr "No program to open this path found. See :help Open for more information."
117 endif
118
119 return os_viewer
120enddef
121
122export def Open(file: string)
123 Launch($"{Viewer()} {shellescape(file, 1)}")
Christian Brabandt4f174f02023-11-04 11:16:23 +0100124enddef
125
126# Uncomment this line to check for compilation errors early
127# defcompile
Luca Saccarolac729d6d2025-01-25 16:07:12 +0100128
129# vim: ts=8 sts=2 sw=2 et