runtime(netrw): upstream snapshot of v176

relevant commits:
- deprecate!: netrw#Launch, netrw#Open and gx mappings
- refactor: move some utility functions in a private file
- feat: add function to deprecate features
- refactor!: remove NetrwClean command and function
- refactor: use appropriate directories to store temporary files
- refactor: better way to call vim.ui.open
- refactor(Open): prefer lua wrapper function instead of cmdline
- refactor!: drop vim 7 checks
- refactor: use vim.ui.open when using neovim
- refactor: remove s:CheckIfKde
- refactor: balloon functionality
- refactor!: remove netrw#Access function

closes: #16519

Signed-off-by: Luca Saccarola <github.e41mv@aleeas.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Luca Saccarola
2025-01-29 18:39:30 +01:00
committed by Christian Brabandt
parent 766801295d
commit ec961b05dc
8 changed files with 173 additions and 416 deletions

View File

@ -812,6 +812,7 @@ RT_ALL = \
runtime/pack/dist/opt/netrw/LICENSE.txt \ runtime/pack/dist/opt/netrw/LICENSE.txt \
runtime/pack/dist/opt/netrw/README.md \ runtime/pack/dist/opt/netrw/README.md \
runtime/pack/dist/opt/netrw/autoload/netrw.vim \ runtime/pack/dist/opt/netrw/autoload/netrw.vim \
runtime/pack/dist/opt/netrw/autoload/netrw/own.vim \
runtime/pack/dist/opt/netrw/autoload/netrwSettings.vim \ runtime/pack/dist/opt/netrw/autoload/netrwSettings.vim \
runtime/pack/dist/opt/netrw/autoload/netrw_gitignore.vim \ runtime/pack/dist/opt/netrw/autoload/netrw_gitignore.vim \
runtime/pack/dist/opt/netrw/doc/netrw.txt \ runtime/pack/dist/opt/netrw/doc/netrw.txt \

View File

@ -2140,7 +2140,6 @@ $quote eval.txt /*$quote*
:Man filetype.txt /*:Man* :Man filetype.txt /*:Man*
:MkVimball pi_vimball.txt /*:MkVimball* :MkVimball pi_vimball.txt /*:MkVimball*
:N editing.txt /*:N* :N editing.txt /*:N*
:NetrwClean pi_netrw.txt /*:NetrwClean*
:Nexplore pi_netrw.txt /*:Nexplore* :Nexplore pi_netrw.txt /*:Nexplore*
:Next editing.txt /*:Next* :Next editing.txt /*:Next*
:NoMatchParen pi_paren.txt /*:NoMatchParen* :NoMatchParen pi_paren.txt /*:NoMatchParen*
@ -7711,7 +7710,6 @@ g:netrw_special_syntax pi_netrw.txt /*g:netrw_special_syntax*
g:netrw_ssh_browse_reject pi_netrw.txt /*g:netrw_ssh_browse_reject* g:netrw_ssh_browse_reject pi_netrw.txt /*g:netrw_ssh_browse_reject*
g:netrw_ssh_cmd pi_netrw.txt /*g:netrw_ssh_cmd* g:netrw_ssh_cmd pi_netrw.txt /*g:netrw_ssh_cmd*
g:netrw_sshport pi_netrw.txt /*g:netrw_sshport* g:netrw_sshport pi_netrw.txt /*g:netrw_sshport*
g:netrw_suppress_gx_mesg pi_netrw.txt /*g:netrw_suppress_gx_mesg*
g:netrw_timefmt pi_netrw.txt /*g:netrw_timefmt* g:netrw_timefmt pi_netrw.txt /*g:netrw_timefmt*
g:netrw_tmpfile_escape pi_netrw.txt /*g:netrw_tmpfile_escape* g:netrw_tmpfile_escape pi_netrw.txt /*g:netrw_tmpfile_escape*
g:netrw_uid pi_netrw.txt /*g:netrw_uid* g:netrw_uid pi_netrw.txt /*g:netrw_uid*
@ -8992,7 +8990,6 @@ netrw-call pi_netrw.txt /*netrw-call*
netrw-cb pi_netrw.txt /*netrw-cb* netrw-cb pi_netrw.txt /*netrw-cb*
netrw-cd pi_netrw.txt /*netrw-cd* netrw-cd pi_netrw.txt /*netrw-cd*
netrw-chgup pi_netrw.txt /*netrw-chgup* netrw-chgup pi_netrw.txt /*netrw-chgup*
netrw-clean pi_netrw.txt /*netrw-clean*
netrw-contents pi_netrw.txt /*netrw-contents* netrw-contents pi_netrw.txt /*netrw-contents*
netrw-copyright pi_netrw.txt /*netrw-copyright* netrw-copyright pi_netrw.txt /*netrw-copyright*
netrw-cr pi_netrw.txt /*netrw-cr* netrw-cr pi_netrw.txt /*netrw-cr*
@ -9002,7 +8999,6 @@ netrw-ctrl-h pi_netrw.txt /*netrw-ctrl-h*
netrw-ctrl-l pi_netrw.txt /*netrw-ctrl-l* netrw-ctrl-l pi_netrw.txt /*netrw-ctrl-l*
netrw-ctrl-r pi_netrw.txt /*netrw-ctrl-r* netrw-ctrl-r pi_netrw.txt /*netrw-ctrl-r*
netrw-ctrl_l pi_netrw.txt /*netrw-ctrl_l* netrw-ctrl_l pi_netrw.txt /*netrw-ctrl_l*
netrw-curdir pi_netrw.txt /*netrw-curdir*
netrw-d pi_netrw.txt /*netrw-d* netrw-d pi_netrw.txt /*netrw-d*
netrw-del pi_netrw.txt /*netrw-del* netrw-del pi_netrw.txt /*netrw-del*
netrw-delete pi_netrw.txt /*netrw-delete* netrw-delete pi_netrw.txt /*netrw-delete*

View File

@ -19,23 +19,7 @@ if &cp || exists("g:loaded_netrw")
finish finish
endif endif
" Check that vim has patches that netrw requires. let g:loaded_netrw = "v176"
" Patches needed for v7.4: 1557, and 213.
" (netrw will benefit from vim's having patch#656, too)
let s:needspatches=[1557,213]
if exists("s:needspatches")
for ptch in s:needspatches
if v:version < 704 || (v:version == 704 && !has("patch".ptch))
if !exists("s:needpatch{ptch}")
unsilent echomsg "***sorry*** this version of netrw requires vim v7.4 with patch#".ptch
endif
let s:needpatch{ptch}= 1
finish
endif
endfor
endif
let g:loaded_netrw = "v175"
let s:keepcpo= &cpo let s:keepcpo= &cpo
setl cpo&vim setl cpo&vim
@ -194,6 +178,12 @@ let s:WARNING = 1
let s:ERROR = 2 let s:ERROR = 2
call s:NetrwInit("g:netrw_errorlvl", s:NOTE) call s:NetrwInit("g:netrw_errorlvl", s:NOTE)
let s:has_balloon = !has('nvim') &&
\ has("balloon_eval") &&
\ has("syntax") &&
\ exists("g:syntax_on") &&
\ !exists("g:netrw_nobeval")
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" Default option values: {{{2 " Default option values: {{{2
let g:netrw_localcopycmdopt = "" let g:netrw_localcopycmdopt = ""
@ -456,10 +446,12 @@ else
call s:NetrwInit("g:netrw_localmkdir","mkdir") call s:NetrwInit("g:netrw_localmkdir","mkdir")
endif endif
call s:NetrwInit("g:netrw_remote_mkdir","mkdir") call s:NetrwInit("g:netrw_remote_mkdir","mkdir")
if exists("g:netrw_local_movecmd") if exists("g:netrw_local_movecmd")
let g:netrw_localmovecmd= g:netrw_local_movecmd let g:netrw_localmovecmd= g:netrw_local_movecmd
call netrw#ErrorMsg(s:NOTE,"g:netrw_local_movecmd is deprecated in favor of g:netrw_localmovecmd",88) call netrw#ErrorMsg(s:NOTE,"g:netrw_local_movecmd is deprecated in favor of g:netrw_localmovecmd",88)
endif endif
if !exists("g:netrw_localmovecmd") if !exists("g:netrw_localmovecmd")
if has("win32") if has("win32")
if g:netrw_cygwin if g:netrw_cygwin
@ -474,9 +466,7 @@ if !exists("g:netrw_localmovecmd")
let g:netrw_localmovecmd= "" let g:netrw_localmovecmd= ""
endif endif
endif endif
" following serves as an example for how to insert a version&patch specific test
"if v:version < 704 || (v:version == 704 && !has("patch1107"))
"endif
call s:NetrwInit("g:netrw_liststyle" , s:THINLIST) call s:NetrwInit("g:netrw_liststyle" , s:THINLIST)
" sanity checks " sanity checks
if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
@ -581,22 +571,14 @@ call s:NetrwInit("s:netrw_posn",'{}')
" ====================== " ======================
" Netrw Initialization: {{{1 " Netrw Initialization: {{{1
" ====================== " ======================
if v:version >= 700 && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on") if s:has_balloon
" call Decho("installed beval events",'~'.expand("<slnum>"))
let &l:bexpr = "netrw#BalloonHelp()" let &l:bexpr = "netrw#BalloonHelp()"
" call Decho("&l:bexpr<".&l:bexpr."> buf#".bufnr()) au FileType netrw setl beval
au FileType netrw setl beval au WinLeave * if &ft == "netrw" && exists("s:initbeval") | let &beval = s:initbeval | endif
au WinLeave * if &ft == "netrw" && exists("s:initbeval")|let &beval= s:initbeval|endif au VimEnter * let s:initbeval = &beval
au VimEnter * let s:initbeval= &beval
"else " Decho
" if v:version < 700 | call Decho("did not install beval events: v:version=".v:version." < 700","~".expand("<slnum>")) | endif
" if !has("balloon_eval") | call Decho("did not install beval events: does not have balloon_eval","~".expand("<slnum>")) | endif
" if exists("s:initbeval") | call Decho("did not install beval events: s:initbeval exists","~".expand("<slnum>")) | endif
" if exists("g:netrw_nobeval") | call Decho("did not install beval events: g:netrw_nobeval exists","~".expand("<slnum>")) | endif
" if !has("syntax") | call Decho("did not install beval events: does not have syntax highlighting","~".expand("<slnum>")) | endif
" if exists("g:syntax_on") | call Decho("did not install beval events: g:syntax_on exists","~".expand("<slnum>")) | endif
endif endif
au WinEnter * if &ft == "netrw"|call s:NetrwInsureWinVars()|endif
au WinEnter * if &ft == "netrw" | call s:NetrwInsureWinVars() | endif
if g:netrw_keepj =~# "keepj" if g:netrw_keepj =~# "keepj"
com! -nargs=* NetrwKeepj keepj <args> com! -nargs=* NetrwKeepj keepj <args>
@ -611,50 +593,46 @@ endif
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" netrw#BalloonHelp: {{{2 " netrw#BalloonHelp: {{{2
if v:version >= 700 && has("balloon_eval") && has("syntax") && exists("g:syntax_on") && !exists("g:netrw_nobeval")
" call Decho("loading netrw#BalloonHelp()",'~'.expand("<slnum>")) if s:has_balloon
fun! netrw#BalloonHelp() function! netrw#BalloonHelp()
if &ft != "netrw" " popup error window is still showing
return "" " s:pouperr_id and s:popuperr_text are set up in netrw#ErrorMsg()
endif if exists("s:popuperr_id") && popup_getpos(s:popuperr_id) != {}
if exists("s:popuperr_id") && popup_getpos(s:popuperr_id) != {} if exists("s:popuperr_text") && s:popuperr_text != "" && v:beval_text != s:popuperr_text
" popup error window is still showing " text under mouse hasn't changed; only close window when it changes
" s:pouperr_id and s:popuperr_text are set up in netrw#ErrorMsg() call popup_close(s:popuperr_id)
if exists("s:popuperr_text") && s:popuperr_text != "" && v:beval_text != s:popuperr_text unlet s:popuperr_text
" text under mouse hasn't changed; only close window when it changes else
call popup_close(s:popuperr_id) let s:popuperr_text= v:beval_text
unlet s:popuperr_text endif
else return ""
let s:popuperr_text= v:beval_text
endif elseif v:beval_text == "Netrw" || v:beval_text == "Directory" || v:beval_text == "Listing"
let mesg= "" return "i: thin-long-wide-tree gh: quick hide/unhide of dot-files qf: quick file info %:open new file"
elseif !exists("w:netrw_bannercnt") || v:beval_lnum >= w:netrw_bannercnt || (exists("g:netrw_nobeval") && g:netrw_nobeval)
let mesg= "" elseif getline(v:beval_lnum) =~ '^"\s*/'
elseif v:beval_text == "Netrw" || v:beval_text == "Directory" || v:beval_text == "Listing" return "<cr>: edit/enter o: edit/enter in horiz window t: edit/enter in new tab v:edit/enter in vert window"
let mesg = "i: thin-long-wide-tree gh: quick hide/unhide of dot-files qf: quick file info %:open new file"
elseif getline(v:beval_lnum) =~ '^"\s*/' elseif v:beval_text == "Sorted" || v:beval_text == "by"
let mesg = "<cr>: edit/enter o: edit/enter in horiz window t: edit/enter in new tab v:edit/enter in vert window" return 's: sort by name, time, file size, extension r: reverse sorting order mt: mark target'
elseif v:beval_text == "Sorted" || v:beval_text == "by"
let mesg = 's: sort by name, time, file size, extension r: reverse sorting order mt: mark target' elseif v:beval_text == "Sort" || v:beval_text == "sequence"
elseif v:beval_text == "Sort" || v:beval_text == "sequence" return "S: edit sorting sequence"
let mesg = "S: edit sorting sequence"
elseif v:beval_text == "Hiding" || v:beval_text == "Showing" elseif v:beval_text == "Hiding" || v:beval_text == "Showing"
let mesg = "a: hiding-showing-all ctrl-h: editing hiding list mh: hide/show by suffix" return "a: hiding-showing-all ctrl-h: editing hiding list mh: hide/show by suffix"
elseif v:beval_text == "Quick" || v:beval_text == "Help"
let mesg = "Help: press <F1>" elseif v:beval_text == "Quick" || v:beval_text == "Help"
elseif v:beval_text == "Copy/Move" || v:beval_text == "Tgt" return "Help: press <F1>"
let mesg = "mt: mark target mc: copy marked file to target mm: move marked file to target"
else elseif v:beval_text == "Copy/Move" || v:beval_text == "Tgt"
let mesg= "" return "mt: mark target mc: copy marked file to target mm: move marked file to target"
endif
return mesg endif
endfun
"else " Decho return ""
" if v:version < 700 |call Decho("did not load netrw#BalloonHelp(): vim version ".v:version." < 700 -","~".expand("<slnum>"))|endif endfunction
" if !has("balloon_eval") |call Decho("did not load netrw#BalloonHelp(): does not have balloon eval","~".expand("<slnum>")) |endif
" if !has("syntax") |call Decho("did not load netrw#BalloonHelp(): syntax disabled","~".expand("<slnum>")) |endif
" if !exists("g:syntax_on") |call Decho("did not load netrw#BalloonHelp(): g:syntax_on n/a","~".expand("<slnum>")) |endif
" if exists("g:netrw_nobeval") |call Decho("did not load netrw#BalloonHelp(): g:netrw_nobeval exists","~".expand("<slnum>")) |endif
endif endif
" ------------------------------------------------------------------------ " ------------------------------------------------------------------------
@ -1175,52 +1153,6 @@ fun! netrw#Lexplore(count,rightside,...)
endfun endfun
" ---------------------------------------------------------------------
" netrw#Clean: remove netrw {{{2
" supports :NetrwClean -- remove netrw from first directory on runtimepath
" :NetrwClean! -- remove netrw from all directories on runtimepath
fun! netrw#Clean(sys)
" call Dfunc("netrw#Clean(sys=".a:sys.")")
if a:sys
let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
else
let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
endif
" call Decho("choice=".choice,'~'.expand("<slnum>"))
let diddel= 0
let diddir= ""
if choice == 1
for dir in split(&rtp,',')
if filereadable(dir."/plugin/netrwPlugin.vim")
" call Decho("removing netrw-related files from ".dir,'~'.expand("<slnum>"))
if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif
if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif
if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif
if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif
if s:NetrwDelete(dir."/syntax/netrwlist.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrwlist.vim",55) |endif
let diddir= dir
let diddel= diddel + 1
if !a:sys|break|endif
endif
endfor
endif
echohl WarningMsg
if diddel == 0
echomsg "netrw is either not installed or not removable"
elseif diddel == 1
echomsg "removed one copy of netrw from <".diddir.">"
else
echomsg "removed ".diddel." copies of netrw"
endif
echohl None
" call Dret("netrw#Clean")
endfun
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" netrw#MakeTgt: make a target out of the directory name provided {{{2 " netrw#MakeTgt: make a target out of the directory name provided {{{2
fun! netrw#MakeTgt(dname) fun! netrw#MakeTgt(dname)
@ -3830,7 +3762,8 @@ fun! s:NetrwBrowse(islocal,dirname)
else else
NetrwKeepj call s:SetRexDir(a:islocal,b:netrw_curdir) NetrwKeepj call s:SetRexDir(a:islocal,b:netrw_curdir)
endif endif
if v:version >= 700 && has("balloon_eval") && &beval == 0 && &l:bexpr == "" && !exists("g:netrw_nobeval")
if s:has_balloon && &beval == 0 && &l:bexpr == ""
let &l:bexpr= "netrw#BalloonHelp()" let &l:bexpr= "netrw#BalloonHelp()"
setl beval setl beval
endif endif
@ -4467,16 +4400,16 @@ fun! s:NetrwBookmark(del,...)
let i = 1 let i = 1
while i <= a:0 while i <= a:0
if islocal if islocal
if v:version > 704 || (v:version == 704 && has("patch656")) let mbfiles = glob(fnameescape(a:{i}), 0, 1, 1)
let mbfiles= glob(fnameescape(a:{i}),0,1,1)
else
let mbfiles= glob(fnameescape(a:{i}),0,1)
endif
else else
let mbfiles= [a:{i}] let mbfiles = [a:{i}]
endif endif
for mbfile in mbfiles for mbfile in mbfiles
if a:del|call s:DeleteBookmark(mbfile)|else|call s:MakeBookmark(mbfile)|endif if a:del
call s:DeleteBookmark(mbfile)
else
call s:MakeBookmark(mbfile)
endif
endfor endfor
let i= i + 1 let i= i + 1
endwhile endwhile
@ -4954,122 +4887,6 @@ fun! s:NetrwBrowseUpDir(islocal)
endif endif
endfun endfun
func s:redir()
" set up redirection (avoids browser messages)
" by default if not set, g:netrw_suppress_gx_mesg is true
if get(g:, 'netrw_suppress_gx_mesg', 1)
if &srr =~# "%s"
return printf(&srr, has("win32") ? "nul" : "/dev/null")
else
return &srr .. (has("win32") ? "nul" : "/dev/null")
endif
endif
return ''
endfunc
if has('unix')
if has('win32unix')
" Cygwin provides cygstart
if executable('cygstart')
fun! netrw#Launch(args)
exe 'silent ! cygstart --hide' a:args s:redir() | redraw!
endfun
elseif !empty($MSYSTEM) && executable('start')
" MSYS2/Git Bash comes by default without cygstart; see
" https://www.msys2.org/wiki/How-does-MSYS2-differ-from-Cygwin
" Instead it provides /usr/bin/start script running `cmd.exe //c start`
" Adding "" //b` sets void title, hides cmd window and blocks path conversion
" of /b to \b\ " by MSYS2; see https://www.msys2.org/docs/filesystem-paths/
fun! netrw#Launch(args)
exe 'silent !start "" //b' a:args s:redir() | redraw!
endfun
else
" imitate /usr/bin/start script for other environments and hope for the best
fun! netrw#Launch(args)
exe 'silent !cmd //c start "" //b' a:args s:redir() | redraw!
endfun
endif
elseif exists('$WSL_DISTRO_NAME') " use cmd.exe to start GUI apps in WSL
fun! netrw#Launch(args)
let args = a:args
exe 'silent !' ..
\ ((args =~? '\v<\f+\.(exe|com|bat|cmd)>') ?
\ 'cmd.exe /c start /b ' .. args :
\ 'nohup ' .. args .. ' ' .. s:redir() .. ' &')
\ | redraw!
endfun
else
fun! netrw#Launch(args)
exe ':silent ! nohup' a:args s:redir() (has('gui_running') ? '' : '&') | redraw!
endfun
endif
elseif has('win32')
fun! netrw#Launch(args)
exe 'silent !' .. (&shell =~? '\<cmd\.exe\>' ? '' : 'cmd.exe /c')
\ 'start "" /b' a:args s:redir() | redraw!
endfun
else
fun! netrw#Launch(dummy)
echom 'No common launcher found'
endfun
endif
" Git Bash
if has('win32unix')
" (cyg)start suffices
let s:os_viewer = ''
" Windows / WSL
elseif executable('explorer.exe')
let s:os_viewer = 'explorer.exe'
" Linux / BSD
elseif executable('xdg-open')
let s:os_viewer = 'xdg-open'
" MacOS
elseif executable('open')
let s:os_viewer = 'open'
endif
fun! s:viewer()
" g:netrw_browsex_viewer could be a string of program + its arguments,
" test if first argument is executable
if exists('g:netrw_browsex_viewer') && executable(split(g:netrw_browsex_viewer)[0])
" extract any viewing options. Assumes that they're set apart by spaces.
" call Decho("extract any viewing options from g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">",'~'.expand("<slnum>"))
if g:netrw_browsex_viewer =~ '\s'
let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
let oviewer = ''
let cnt = 1
while !executable(viewer) && viewer != oviewer
let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
let cnt = cnt + 1
let oviewer = viewer
" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">",'~'.expand("<slnum>"))
endwhile
else
let viewer = g:netrw_browsex_viewer
let viewopt = ""
endif
" call Decho("viewer<".viewer."> viewopt<".viewopt.">",'~'.expand("<slnum>"))
return viewer .. ' ' .. viewopt
else
if !exists('s:os_viewer')
call netrw#ErrorMsg(s:ERROR,"No program to open this path found. See :help Open for more information.",106)
else
return s:os_viewer
endif
endif
endfun
fun! netrw#Open(file) abort
call netrw#Launch(s:viewer() .. ' ' .. shellescape(a:file, 1))
endfun
if !exists('g:netrw_regex_url')
let g:netrw_regex_url = '\%(\%(http\|ftp\|irc\)s\?\|file\)://\S\{-}'
endif
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" netrw#BrowseX: (implements "x" and "gx") executes a special "viewer" script or program for the {{{2 " netrw#BrowseX: (implements "x" and "gx") executes a special "viewer" script or program for the {{{2
" given filename; typically this means given their extension. " given filename; typically this means given their extension.
@ -5150,7 +4967,7 @@ fun! netrw#BrowseX(fname,remote)
endif endif
endif endif
call netrw#Open(fname) call netrw#own#Open(fname)
" cleanup: remove temporary file, " cleanup: remove temporary file,
" delete current buffer if success with handler, " delete current buffer if success with handler,
@ -5173,46 +4990,6 @@ fun! netrw#BrowseX(fname,remote)
let &aw= awkeep let &aw= awkeep
endfun endfun
" ---------------------------------------------------------------------
" netrw#GX: gets word under cursor for gx support {{{2
" See also: netrw#BrowseXVis
" netrw#BrowseX
fun! netrw#GX()
" call Dfunc("netrw#GX()")
if &ft == "netrw"
let fname= s:NetrwGetWord()
else
let fname= exists("g:netrw_gx")? expand(g:netrw_gx) : s:GetURL()
endif
" call Dret("netrw#GX <".fname.">")
return fname
endfun
fun! s:GetURL() abort
let URL = ''
if exists('*Netrw_get_URL_' .. &filetype)
let URL = call('Netrw_get_URL_' .. &filetype, [])
endif
if !empty(URL) | return URL | endif
" URLs end in letter, digit or forward slash
let URL = matchstr(expand("<cWORD>"), '\<' .. g:netrw_regex_url .. '\ze[^A-Za-z0-9/]*$')
if !empty(URL) | return URL | endif
" Is it a file in the current work dir ...
let file = expand("<cfile>")
if filereadable(file) | return file | endif
" ... or in that of the current buffer?
let path = fnamemodify(expand('%'), ':p')
if isdirectory(path)
let dir = path
elseif filereadable(path)
let dir = fnamemodify(path, ':h')
endif
if exists('dir') && filereadable(dir..'/'..file) | return dir..'/'..file | endif
return ''
endf
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" netrw#BrowseXVis: used by gx in visual mode to select a file for browsing {{{2 " netrw#BrowseXVis: used by gx in visual mode to select a file for browsing {{{2
fun! netrw#BrowseXVis() fun! netrw#BrowseXVis()
@ -5298,31 +5075,6 @@ fun! s:NetrwChgPerm(islocal,curdir)
let @@= ykeep let @@= ykeep
endfun endfun
" ---------------------------------------------------------------------
" s:CheckIfKde: checks if kdeinit is running {{{2
" Returns 0: kdeinit not running
" 1: kdeinit is running
fun! s:CheckIfKde()
" call Dfunc("s:CheckIfKde()")
" seems kde systems often have gnome-open due to dependencies, even though
" gnome-open's subsidiary display tools are largely absent. Kde systems
" usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
if !exists("s:haskdeinit")
if has("unix") && executable("ps") && !has("win32unix")
let s:haskdeinit= system("ps -e") =~ '\<kdeinit'
if v:shell_error
let s:haskdeinit = 0
endif
else
let s:haskdeinit= 0
endif
" call Decho("setting s:haskdeinit=".s:haskdeinit,'~'.expand("<slnum>"))
endif
" call Dret("s:CheckIfKde ".s:haskdeinit)
return s:haskdeinit
endfun
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" s:NetrwClearExplore: clear explore variables (if any) {{{2 " s:NetrwClearExplore: clear explore variables (if any) {{{2
fun! s:NetrwClearExplore() fun! s:NetrwClearExplore()
@ -5437,11 +5189,7 @@ fun! s:NetrwGlob(direntry,expr,pare)
" escape [ so it is not detected as wildcard character, see :h wildcard " escape [ so it is not detected as wildcard character, see :h wildcard
let path= substitute(path, '[', '[[]', 'g') let path= substitute(path, '[', '[[]', 'g')
endif endif
if v:version > 704 || (v:version == 704 && has("patch656")) let filelist = glob(path, 0, 1, 1)
let filelist= glob(path,0,1,1)
else
let filelist= glob(path,0,1)
endif
if a:pare if a:pare
let filelist= map(filelist,'substitute(v:val, "^.*/", "", "")') let filelist= map(filelist,'substitute(v:val, "^.*/", "", "")')
endif endif
@ -5561,41 +5309,32 @@ endfun
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2 " s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2
fun! s:NetrwHome() function! s:NetrwHome()
if exists("g:netrw_home") if has('nvim')
let home= expand(g:netrw_home) let home = netrw#own#JoinPath(stdpath('state'), 'netrw')
elseif exists("g:netrw_home")
let home = expand(g:netrw_home)
else else
" go to vim plugin home let home = expand("$MYVIMDIR")->substitute("/$", "", "")
for home in split(&rtp,',') + ['']
if isdirectory(s:NetrwFile(home)) && filewritable(s:NetrwFile(home)) | break | endif
let basehome= substitute(home,'[/\\]\.vim$','','')
if isdirectory(s:NetrwFile(basehome)) && filewritable(s:NetrwFile(basehome))
let home= basehome."/.vim"
break
endif
endfor
if home == ""
" just pick the first directory
let home= substitute(&rtp,',.*$','','')
endif
if has("win32")
let home= substitute(home,'/','\\','g')
endif
endif endif
" insure that the home directory exists " insure that the home directory exists
if g:netrw_dirhistmax > 0 && !isdirectory(s:NetrwFile(home)) if g:netrw_dirhistmax > 0 && !isdirectory(s:NetrwFile(home))
" call Decho("insure that the home<".home."> directory exists")
if exists("g:netrw_mkdir") if exists("g:netrw_mkdir")
" call Decho("call system(".g:netrw_mkdir." ".s:ShellEscape(s:NetrwFile(home)).")")
call system(g:netrw_mkdir." ".s:ShellEscape(s:NetrwFile(home))) call system(g:netrw_mkdir." ".s:ShellEscape(s:NetrwFile(home)))
else else
" call Decho("mkdir(".home.")")
call mkdir(home) call mkdir(home)
endif endif
endif endif
let g:netrw_home= home
" Normalize directory if on Windows
if has("win32")
let home = substitute(home, '/', '\\', 'g')
endif
let g:netrw_home = home
return home return home
endfun endfunction
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2 " s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
@ -6297,11 +6036,7 @@ fun! s:NetrwMarkFiles(islocal,...)
let i = 1 let i = 1
while i <= a:0 while i <= a:0
if a:islocal if a:islocal
if v:version > 704 || (v:version == 704 && has("patch656")) let mffiles= glob(a:{i}, 0, 1, 1)
let mffiles= glob(a:{i},0,1,1)
else
let mffiles= glob(a:{i},0,1)
endif
else else
let mffiles= [a:{i}] let mffiles= [a:{i}]
endif endif
@ -7407,12 +7142,7 @@ fun! s:NetrwMarkFileRegexp(islocal)
" get the matching list of files using local glob() " get the matching list of files using local glob()
" call Decho("handle local regexp",'~'.expand("<slnum>")) " call Decho("handle local regexp",'~'.expand("<slnum>"))
let dirname = escape(b:netrw_curdir,g:netrw_glob_escape) let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
if v:version > 704 || (v:version == 704 && has("patch656")) let filelist= glob(s:ComposePath(dirname,regexp),0,1,1)
let filelist= glob(s:ComposePath(dirname,regexp),0,1,1)
else
let files = glob(s:ComposePath(dirname,regexp),0,0)
let filelist= split(files,"\n")
endif
" call Decho("files<".string(filelist).">",'~'.expand("<slnum>")) " call Decho("files<".string(filelist).">",'~'.expand("<slnum>"))
" mark the list of files " mark the list of files
@ -10631,22 +10361,6 @@ endfun
" ===================================================================== " =====================================================================
" Support Functions: {{{1 " Support Functions: {{{1
" ---------------------------------------------------------------------
" netrw#Access: intended to provide access to variable values for netrw's test suite {{{2
" 0: marked file list of current buffer
" 1: marked file target
fun! netrw#Access(ilist)
if a:ilist == 0
if exists("s:netrwmarkfilelist_".bufnr('%'))
return s:netrwmarkfilelist_{bufnr('%')}
else
return "no-list-buf#".bufnr('%')
endif
elseif a:ilist == 1
return s:netrwmftgt
endif
endfun
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" netrw#Call: allows user-specified mappings to call internal netrw functions {{{2 " netrw#Call: allows user-specified mappings to call internal netrw functions {{{2
fun! netrw#Call(funcname,...) fun! netrw#Call(funcname,...)
@ -11275,7 +10989,8 @@ fun! s:NetrwEnew(...)
endif endif
endif endif
endif endif
if v:version >= 700 && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on")
if s:has_balloon
let &l:bexpr = "netrw#BalloonHelp()" let &l:bexpr = "netrw#BalloonHelp()"
endif endif
@ -11774,8 +11489,8 @@ endfun
fun! s:Strlen(x) fun! s:Strlen(x)
" "" call Dfunc("s:Strlen(x<".a:x."> g:Align_xstrlen=".g:Align_xstrlen.")") " "" call Dfunc("s:Strlen(x<".a:x."> g:Align_xstrlen=".g:Align_xstrlen.")")
if v:version >= 703 && exists("*strdisplaywidth") if exists("*strdisplaywidth")
let ret= strdisplaywidth(a:x) let ret = strdisplaywidth(a:x)
elseif type(g:Align_xstrlen) == 1 elseif type(g:Align_xstrlen) == 1
" allow user to specify a function to compute the string length (ie. let g:Align_xstrlen="mystrlenfunc") " allow user to specify a function to compute the string length (ie. let g:Align_xstrlen="mystrlenfunc")
@ -11784,13 +11499,13 @@ fun! s:Strlen(x)
elseif g:Align_xstrlen == 1 elseif g:Align_xstrlen == 1
" number of codepoints (Latin a + combining circumflex is two codepoints) " number of codepoints (Latin a + combining circumflex is two codepoints)
" (comment from TM, solution from NW) " (comment from TM, solution from NW)
let ret= strlen(substitute(a:x,'.','c','g')) let ret = strlen(substitute(a:x,'.','c','g'))
elseif g:Align_xstrlen == 2 elseif g:Align_xstrlen == 2
" number of spacing codepoints (Latin a + combining circumflex is one spacing " number of spacing codepoints (Latin a + combining circumflex is one spacing
" codepoint; a hard tab is one; wide and narrow CJK are one each; etc.) " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
" (comment from TM, solution from TM) " (comment from TM, solution from TM)
let ret=strlen(substitute(a:x, '.\Z', 'x', 'g')) let ret = strlen(substitute(a:x, '.\Z', 'x', 'g'))
elseif g:Align_xstrlen == 3 elseif g:Align_xstrlen == 3
" virtual length (counting, for instance, tabs as anything between 1 and " virtual length (counting, for instance, tabs as anything between 1 and
@ -11800,14 +11515,14 @@ fun! s:Strlen(x)
let modkeep= &l:mod let modkeep= &l:mod
exe "norm! o\<esc>" exe "norm! o\<esc>"
call setline(line("."),a:x) call setline(line("."),a:x)
let ret= virtcol("$") - 1 let ret = virtcol("$") - 1
d d
NetrwKeepj norm! k NetrwKeepj norm! k
let &l:mod= modkeep let &l:mod = modkeep
else else
" at least give a decent default " at least give a decent default
let ret= strlen(a:x) let ret = strlen(a:x)
endif endif
" "" call Dret("s:Strlen ".ret) " "" call Dret("s:Strlen ".ret)
return ret return ret
@ -11930,6 +11645,21 @@ fun! s:UserMaps(islocal,funcname)
endif endif
endfun endfun
" Deprecated: {{{
function! netrw#Launch(args)
call netrw#own#Deprecate('netrw#Launch', 'v180', {'vim': 'dist#vim9#Launch', 'nvim': 'vim.system'})
if !has('nvim')
call dist#vim9#Launch(args)
endif
endfunction
function! netrw#Open(file)
call netrw#own#Deprecate('netrw#Open', 'v180', {'vim': 'dist#vim9#Open', 'nvim': 'vim.ui.open'})
call netrw#own#Open(a:file)
endfunction
" }}}
" ========================== " ==========================
" Settings Restoration: {{{1 " Settings Restoration: {{{1
" ========================== " ==========================
@ -11939,4 +11669,5 @@ unlet s:keepcpo
" =============== " ===============
" Modelines: {{{1 " Modelines: {{{1
" =============== " ===============
" vim:ts=8 sts=2 sw=2 et fdm=marker
" vim:ts=8 sts=4 sw=4 et fdm=marker

View File

@ -0,0 +1,53 @@
" FUNCTIONS IN THIS FILES ARE MENT TO BE USE BY NETRW.VIM AND NETRW.VIM ONLY.
" THIS FUNCTIONS DON'T COMMIT TO ANY BACKWARDS COMPATABILITY. SO CHANGES AND
" BREAKAGES IF USED OUTSIDE OF NETRW.VIM ARE EXPECTED.
let s:deprecation_msgs = []
function! netrw#own#Deprecate(name, version, alternatives)
" If running on neovim use vim.deprecate
if has('nvim')
let s:alternative = a:alternatives->get('nvim', v:null)
call luaeval('vim.deprecate(unpack(_A)) and nil', [a:name, s:alternative, a:version, "netrw", v:false])
return
endif
" If we did notify for something only do it once
if s:deprecation_msgs->index(a:name) >= 0
return
endif
let s:alternative = a:alternatives->get('vim', v:null)
echohl WarningMsg
echomsg s:alternative != v:null
\ ? printf('%s is deprecated, use %s instead.', a:name, s:alternative)
\ : printf('%s is deprecated.', a:name)
echomsg printf('Feature will be removed in netrw %s', a:version)
echohl None
call add(s:deprecation_msgs, a:name)
endfunction
let s:slash = &shellslash ? '/' : '\'
function! netrw#own#JoinPath(...)
let path = ""
for arg in a:000
if empty(path)
let path = arg
else
let path .= s:slash . arg
endif
endfor
return path
endfunction
function! netrw#own#Open(file) abort
if has('nvim')
call luaeval('vim.ui.open(_A[1]) and nil', [a:file])
else
call dist#vim9#Open(a:file)
endif
endfunction
" vim:ts=8 sts=4 sw=4 et fdm=marker

View File

@ -15,13 +15,7 @@ if &cp || exists("g:loaded_netrwSettings")
finish finish
endif endif
let g:loaded_netrwSettings = "v175" let g:loaded_netrwSettings = "v176"
if v:version < 700
echohl WarningMsg
echo "***warning*** this version of netrwSettings needs vim 7.0"
echohl Normal
finish
endif
" NetrwSettings: {{{ " NetrwSettings: {{{

View File

@ -59,7 +59,6 @@ Copyright: Copyright (C) 2017 Charles E Campbell *netrw-copyright*
Changing local-only File Permission.................|netrw-gp| Changing local-only File Permission.................|netrw-gp|
Changing To A Predecessor Directory.................|netrw-u| Changing To A Predecessor Directory.................|netrw-u|
Changing To A Successor Directory...................|netrw-U| Changing To A Successor Directory...................|netrw-U|
Customizing Browsing With A Special Handler.........|netrw-x|
Deleting Bookmarks..................................|netrw-mB| Deleting Bookmarks..................................|netrw-mB|
Deleting Files Or Directories.......................|netrw-D| Deleting Files Or Directories.......................|netrw-D|
Directory Exploring Commands........................|netrw-explore| Directory Exploring Commands........................|netrw-explore|
@ -1110,7 +1109,7 @@ QUICK REFERENCE: MAPS *netrw-browse-maps* {{{2
U Change to subsequently-visited directory |netrw-U| U Change to subsequently-visited directory |netrw-U|
v Enter the file/directory under the cursor in a new |netrw-v| v Enter the file/directory under the cursor in a new |netrw-v|
browser window. A vertical split is used. browser window. A vertical split is used.
x View file with an associated program. (see |:Open|) x View file with an associated program |:Open|
X Execute filename under cursor via |system()| |netrw-X| X Execute filename under cursor via |system()| |netrw-X|
% Open a new file in netrw's current directory |netrw-%| % Open a new file in netrw's current directory |netrw-%|
@ -1137,7 +1136,6 @@ QUICK REFERENCE: MAPS *netrw-browse-maps* {{{2
*netrw-quickcom* *netrw-quickcoms* *netrw-quickcom* *netrw-quickcoms*
QUICK REFERENCE: COMMANDS *netrw-explore-cmds* *netrw-browse-cmds* {{{2 QUICK REFERENCE: COMMANDS *netrw-explore-cmds* *netrw-browse-cmds* {{{2
:NetrwClean[!]............................................|netrw-clean|
:NetrwSettings............................................|netrw-settings| :NetrwSettings............................................|netrw-settings|
:Ntree....................................................|netrw-ntree| :Ntree....................................................|netrw-ntree|
:Explore[!] [dir] Explore directory of current file......|netrw-explore| :Explore[!] [dir] Explore directory of current file......|netrw-explore|
@ -1450,20 +1448,6 @@ The "gn" map will take the word below the cursor and use that for
changing the top of the tree listing. changing the top of the tree listing.
NETRW CLEAN *netrw-clean* *:NetrwClean* {{{2
With :NetrwClean one may easily remove netrw from one's home directory;
more precisely, from the first directory on your |'runtimepath'|.
With :NetrwClean!, netrw will attempt to remove netrw from all directories on
your |'runtimepath'|. Of course, you have to have write/delete permissions
correct to do this.
With either form of the command, netrw will first ask for confirmation
that the removal is in fact what you want to do. If netrw doesn't have
permission to remove a file, it will issue an error message.
*netrw-curdir*
DELETING BOOKMARKS *netrw-mB* {{{2 DELETING BOOKMARKS *netrw-mB* {{{2
To delete a bookmark, use > To delete a bookmark, use >
@ -2510,6 +2494,7 @@ your browsing preferences. (see also: |netrw-settings|)
(the capital g:Netrw... is required its (the capital g:Netrw... is required its
holding a function reference) holding a function reference)
*g:netrw_ctags* ="ctags" *g:netrw_ctags* ="ctags"
The default external program used to create The default external program used to create
tags tags
@ -2913,14 +2898,6 @@ your browsing preferences. (see also: |netrw-settings|)
such as listing, file removal, etc. such as listing, file removal, etc.
default: ssh default: ssh
*g:netrw_suppress_gx_mesg* =1 : browsers sometimes produce messages
which are normally unwanted intermixed
with the page.
However, when using links, for example,
those messages are what the browser produces.
By setting this option to 0, netrw will not
suppress browser messages.
*g:netrw_tmpfile_escape* =' &;' *g:netrw_tmpfile_escape* =' &;'
escape() is applied to all temporary files escape() is applied to all temporary files
to escape these characters. to escape these characters.

View File

@ -15,7 +15,7 @@ if &cp || exists("g:loaded_netrwPlugin")
finish finish
endif endif
let g:loaded_netrwPlugin = "v175" let g:loaded_netrwPlugin = "v176"
let s:keepcpo = &cpo let s:keepcpo = &cpo
set cpo&vim set cpo&vim

View File

@ -1,5 +1,10 @@
" Load the netrw package. " Load the netrw package.
if !has("patch-9.1.1054") || !has('nvim')
echoerr 'netrw needs vim v9.1.1054'
finish
endif
if &cp || exists("g:loaded_netrw") || exists("g:loaded_netrwPlugin") if &cp || exists("g:loaded_netrw") || exists("g:loaded_netrwPlugin")
finish finish
endif endif