2727" 2024 Sep 19 by Vim Project: mf-selection highlight uses wrong pattern (#15700)
2828" 2024 Sep 21 by Vim Project: remove extraneous closing bracket (#15718)
2929" 2024 Oct 21 by Vim Project: remove netrwFileHandlers (#15895)
30+ " 2024 Oct 27 by Vim Project: clean up gx mapping (#15721)
3031" }}}
3132" Former Maintainer: Charles E Campbell
3233" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
@@ -538,7 +539,6 @@ if !exists("g:netrw_sort_sequence")
538539endif
539540call s:NetrwInit("g:netrw_special_syntax" , 0)
540541call s:NetrwInit("g:netrw_ssh_browse_reject", '^total\s\+\d\+$')
541- call s:NetrwInit("g:netrw_suppress_gx_mesg", 1)
542542call s:NetrwInit("g:netrw_use_noswf" , 1)
543543call s:NetrwInit("g:netrw_sizestyle" ,"b")
544544" Default values - t-w ---------- {{{3
@@ -5406,25 +5406,6 @@ fun! netrw#BrowseX(fname,remote)
54065406" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
54075407" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten),'~'.expand("<slnum>"))
54085408
5409- " set up redirection (avoids browser messages)
5410- " by default, g:netrw_suppress_gx_mesg is true
5411- if g:netrw_suppress_gx_mesg
5412- if &srr =~ "%s"
5413- if has("win32")
5414- let redir= substitute(&srr,"%s","nul","")
5415- else
5416- let redir= substitute(&srr,"%s","/dev/null","")
5417- endif
5418- elseif has("win32")
5419- let redir= &srr . "nul"
5420- else
5421- let redir= &srr . "/dev/null"
5422- endif
5423- else
5424- let redir= ""
5425- endif
5426- " call Decho("set up redirection: redir{".redir."} srr{".&srr."}",'~'.expand("<slnum>"))
5427-
54285409 " extract any viewing options. Assumes that they're set apart by spaces.
54295410 if exists("g:netrw_browsex_viewer")
54305411" call Decho("extract any viewing options from g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">",'~'.expand("<slnum>"))
@@ -5447,86 +5428,14 @@ fun! netrw#BrowseX(fname,remote)
54475428" call Decho("viewer<".viewer."> viewopt<".viewopt.">",'~'.expand("<slnum>"))
54485429 endif
54495430
5450- " execute the file handler
5451- " call Decho("execute the file handler (if any)",'~'.expand("<slnum>"))
54525431 if exists("g:netrw_browsex_viewer") && executable(viewer)
54535432" call Decho("(netrw#BrowseX) g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">",'~'.expand("<slnum>"))
5454- call s:NetrwExe("sil !".viewer." ".viewopt.s:ShellEscape(fname,1).redir)
5455- let ret= v:shell_error
5456-
5457- elseif has("win32")
5458- " call Decho("(netrw#BrowseX) win".(has("win32")? "32" : "64"),'~'.expand("<slnum>"))
5459- if executable("start")
5460- call s:NetrwExe('sil! !start rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(fname,1))
5461- elseif executable("rundll32")
5462- call s:NetrwExe('sil! !rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(fname,1))
5463- else
5464- call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
5465- endif
5466- let ret= v:shell_error
5467-
5468- elseif has("win32unix")
5469- let winfname= 'c:\cygwin'.substitute(fname,'/','\\','g')
5470- " call Decho("(netrw#BrowseX) cygwin: winfname<".s:ShellEscape(winfname,1).">",'~'.expand("<slnum>"))
5471- if executable("start")
5472- " call Decho("(netrw#BrowseX) win32unix+start",'~'.expand("<slnum>"))
5473- call s:NetrwExe('sil !start rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(winfname,1))
5474- elseif executable("rundll32")
5475- " call Decho("(netrw#BrowseX) win32unix+rundll32",'~'.expand("<slnum>"))
5476- call s:NetrwExe('sil !rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(winfname,1))
5477- elseif executable("cygstart")
5478- " call Decho("(netrw#BrowseX) win32unix+cygstart",'~'.expand("<slnum>"))
5479- call s:NetrwExe('sil !cygstart '.s:ShellEscape(fname,1))
5480- else
5481- call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
5482- endif
5483- let ret= v:shell_error
5484-
5485- elseif has("unix") && $DESKTOP_SESSION == "mate" && executable("atril")
5486- " call Decho("(netrw#BrowseX) unix and atril",'~'.expand("<slnum>"))
5487- if a:fname =~ '^https\=://'
5488- " atril does not appear to understand how to handle html -- so use gvim to edit the document
5489- let use_ctrlo= 0
5490- " call Decho("fname<".fname.">")
5491- " call Decho("a:fname<".a:fname.">")
5492- call s:NetrwExe("sil! !gvim ".fname.' -c "keepj keepalt file '.fnameescape(a:fname).'"')
5493-
5494- else
5495- call s:NetrwExe("sil !atril ".s:ShellEscape(fname,1).redir)
5496- endif
5497- let ret= v:shell_error
5498-
5499- elseif has("unix") && executable("kfmclient") && s:CheckIfKde()
5500- " call Decho("(netrw#BrowseX) unix and kfmclient",'~'.expand("<slnum>"))
5501- call s:NetrwExe("sil !kfmclient exec ".s:ShellEscape(fname,1)." ".redir)
5502- let ret= v:shell_error
5503-
5504- elseif has("unix") && executable("exo-open") && executable("xdg-open") && executable("setsid")
5505- " call Decho("(netrw#BrowseX) unix, exo-open, xdg-open",'~'.expand("<slnum>"))
5506- call s:NetrwExe("sil !setsid xdg-open ".s:ShellEscape(fname,1).redir.'&')
5507- let ret= v:shell_error
5508-
5509- elseif has("unix") && executable("xdg-open")
5510- " call Decho("(netrw#BrowseX) unix and xdg-open",'~'.expand("<slnum>"))
5511- call s:NetrwExe("sil !xdg-open ".s:ShellEscape(fname,1).redir.'&')
5512- let ret= v:shell_error
5513-
5514- elseif has("macunix") && executable("open")
5515- " call Decho("(netrw#BrowseX) macunix and open",'~'.expand("<slnum>"))
5516- call s:NetrwExe("sil !open ".s:ShellEscape(fname,1)." ".redir)
5517- let ret= v:shell_error
5433+ exe 'Launch' viewer viewopt shellescape(fname, 1)
55185434 else
5519- call netrw#ErrorMsg(s:ERROR, "Couldn't find a program to open '".a:fname."'", 0)
5520- let ret=0
5521- endif
5522-
5523- if ret
5524- call netrw#ErrorMsg(s:ERROR, "Failed to open '".a:fname."'", 0)
5435+ " though shellescape(..., 1) is used in Open, it's insufficient
5436+ exe 'Open' escape(fname, '#%')
55255437 endif
55265438
5527- " restoring redraw! after external file handlers
5528- redraw!
5529-
55305439 " cleanup: remove temporary file,
55315440 " delete current buffer if success with handler,
55325441 " return to prior buffer (directory listing)
@@ -5563,12 +5472,37 @@ fun! netrw#GX()
55635472 if &ft == "netrw"
55645473 let fname= s:NetrwGetWord()
55655474 else
5566- let fname= expand(( exists("g:netrw_gx")? g:netrw_gx : '<cfile>') )
5475+ let fname= exists("g:netrw_gx")? expand( g:netrw_gx) : s:GetURL( )
55675476 endif
55685477" call Dret("netrw#GX <".fname.">")
55695478 return fname
55705479endfun
55715480
5481+ fun! s:GetURL() abort
5482+ let URL = ''
5483+ if exists('*Netrw_get_URL_' .. &filetype)
5484+ let URL = call('Netrw_get_URL_' .. &filetype, [])
5485+ endif
5486+ if !empty(URL) | return URL | endif
5487+ " URLs end in letter, digit or forward slash
5488+ let URL = matchstr(expand("<cWORD>"), '\<' .. g:netrw_regex_url .. '\ze[^A-Za-z0-9/]*$')
5489+ if !empty(URL) | return URL | endif
5490+
5491+ " Is it a file in the current work dir ...
5492+ let file = expand("<cfile>")
5493+ if filereadable(file) | return file | endif
5494+ " ... or in that of the current buffer?
5495+ let path = fnamemodify(expand('%'), ':p')
5496+ if isdirectory(path)
5497+ let dir = path
5498+ elseif filereadable(path)
5499+ let dir = fnamemodify(path, ':h')
5500+ endif
5501+ if exists('dir') && filereadable(dir..'/'..file) | return dir..'/'..file | endif
5502+
5503+ return ''
5504+ endf
5505+
55725506" ---------------------------------------------------------------------
55735507" netrw#BrowseXVis: used by gx in visual mode to select a file for browsing {{{2
55745508fun! netrw#BrowseXVis()
@@ -6733,6 +6667,7 @@ fun! s:NetrwMaps(islocal)
67336667 nnoremap <buffer> <silent> <nowait> U :<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
67346668 nnoremap <buffer> <silent> <nowait> v :call <SID>NetrwSplit(2)<cr>
67356669 nnoremap <buffer> <silent> <nowait> x :<c-u>call netrw#BrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
6670+ nmap <buffer> <nowait> gx x
67366671 if !hasmapto('<Plug>NetrwHideEdit')
67376672 nmap <buffer> <c-h> <Plug>NetrwHideEdit
67386673 endif
@@ -12156,13 +12091,16 @@ endfun
1215612091" s:NetrwExe: executes a string using "!" {{{2
1215712092fun! s:NetrwExe(cmd)
1215812093" call Dfunc("s:NetrwExe(a:cmd<".a:cmd.">)")
12159- if has("win32") && &shell !~? 'cmd\|pwsh\|powershell' && !g:netrw_cygwin
12094+ if has("win32")
1216012095" call Decho("using win32:",expand("<slnum>"))
1216112096 let savedShell=[&shell,&shellcmdflag,&shellxquote,&shellxescape,&shellquote,&shellpipe,&shellredir,&shellslash]
1216212097 set shell& shellcmdflag& shellxquote& shellxescape&
1216312098 set shellquote& shellpipe& shellredir& shellslash&
12164- exe a:cmd
12165- let [&shell,&shellcmdflag,&shellxquote,&shellxescape,&shellquote,&shellpipe,&shellredir,&shellslash] = savedShell
12099+ try
12100+ exe a:cmd
12101+ finally
12102+ let [&shell,&shellcmdflag,&shellxquote,&shellxescape,&shellquote,&shellpipe,&shellredir,&shellslash] = savedShell
12103+ endtry
1216612104 else
1216712105" call Decho("exe ".a:cmd,'~'.expand("<slnum>"))
1216812106 exe a:cmd
0 commit comments