mirror of
https://github.com/vim/vim
synced 2025-07-16 01:01:58 +00:00
Dr. Chip retired some time ago and is no longer maintaining the netrw plugin. However as a runtime plugin distributed by Vim, it important to maintain the netrw plugin in the future and fix bugs as they are reported. So, split out the netrw plugin as an additional package, however include some stubs to make sure the plugin is still loaded by default and the documentation is accessible as well. closes: #16368 Signed-off-by: Luca Saccarola <github.e41mv@aleeas.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
223 lines
11 KiB
VimL
223 lines
11 KiB
VimL
" Maintainer: Luca Saccarola <github.e41mv@aleeas.com>
|
|
" Former Maintainer: Charles E Campbell
|
|
" Upstream: <https://github.com/saccarosium/netrw.vim>
|
|
" Copyright: Copyright (C) 1999-2021 Charles E. Campbell {{{1
|
|
" Permission is hereby granted to use and distribute this code,
|
|
" with or without modifications, provided that this copyright
|
|
" notice is copied with it. Like anything else that's free,
|
|
" netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided
|
|
" *as is* and comes with no warranty of any kind, either
|
|
" expressed or implied. By using this plugin, you agree that
|
|
" in no event will the copyright holder be liable for any damages
|
|
" resulting from the use of this software.
|
|
|
|
" Load Once: {{{1
|
|
if &cp || exists("g:loaded_netrwPlugin")
|
|
finish
|
|
endif
|
|
let g:loaded_netrwPlugin = "v174"
|
|
let s:keepcpo = &cpo
|
|
set cpo&vim
|
|
"DechoRemOn
|
|
|
|
" ---------------------------------------------------------------------
|
|
" Public Interface: {{{1
|
|
|
|
" Commands Launch/URL {{{2
|
|
command -complete=shellcmd -nargs=1 Launch call netrw#Launch(trim(<q-args>))
|
|
command -complete=file -nargs=1 Open call netrw#Open(trim(<q-args>))
|
|
" " }}}
|
|
" Local Browsing Autocmds: {{{2
|
|
augroup FileExplorer
|
|
au!
|
|
au BufLeave * if &ft != "netrw"|let w:netrw_prvfile= expand("%:p")|endif
|
|
au BufEnter * sil call s:LocalBrowse(expand("<amatch>"))
|
|
au VimEnter * sil call s:VimEnter(expand("<amatch>"))
|
|
if has("win32")
|
|
au BufEnter .* sil call s:LocalBrowse(expand("<amatch>"))
|
|
endif
|
|
augroup END
|
|
|
|
" Network Browsing Reading Writing: {{{2
|
|
augroup Network
|
|
au!
|
|
au BufReadCmd file://* call netrw#FileUrlEdit(expand("<amatch>"))
|
|
au BufReadCmd ftp://*,rcp://*,scp://*,http://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau BufReadPre ".fnameescape(expand("<amatch>"))|call netrw#Nread(2,expand("<amatch>"))|exe "sil doau BufReadPost ".fnameescape(expand("<amatch>"))
|
|
au FileReadCmd ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau FileReadPre ".fnameescape(expand("<amatch>"))|call netrw#Nread(1,expand("<amatch>"))|exe "sil doau FileReadPost ".fnameescape(expand("<amatch>"))
|
|
au BufWriteCmd ftp://*,rcp://*,scp://*,http://*,file://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau BufWritePre ".fnameescape(expand("<amatch>"))|exe 'Nwrite '.fnameescape(expand("<amatch>"))|exe "sil doau BufWritePost ".fnameescape(expand("<amatch>"))
|
|
au FileWriteCmd ftp://*,rcp://*,scp://*,http://*,file://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau FileWritePre ".fnameescape(expand("<amatch>"))|exe "'[,']".'Nwrite '.fnameescape(expand("<amatch>"))|exe "sil doau FileWritePost ".fnameescape(expand("<amatch>"))
|
|
try
|
|
au SourceCmd ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>"))
|
|
catch /^Vim\%((\a\+)\)\=:E216/
|
|
au SourcePre ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>"))
|
|
endtry
|
|
augroup END
|
|
|
|
" Commands: :Nread, :Nwrite, :NetUserPass {{{2
|
|
com! -count=1 -nargs=* Nread let s:svpos= winsaveview()<bar>call netrw#NetRead(<count>,<f-args>)<bar>call winrestview(s:svpos)
|
|
com! -range=% -nargs=* Nwrite let s:svpos= winsaveview()<bar><line1>,<line2>call netrw#NetWrite(<f-args>)<bar>call winrestview(s:svpos)
|
|
com! -nargs=* NetUserPass call NetUserPass(<f-args>)
|
|
com! -nargs=* Nsource let s:svpos= winsaveview()<bar>call netrw#NetSource(<f-args>)<bar>call winrestview(s:svpos)
|
|
com! -nargs=? Ntree call netrw#SetTreetop(1,<q-args>)
|
|
|
|
" Commands: :Explore, :Sexplore, Hexplore, Vexplore, Lexplore {{{2
|
|
com! -nargs=* -bar -bang -count=0 -complete=dir Explore call netrw#Explore(<count>,0,0+<bang>0,<q-args>)
|
|
com! -nargs=* -bar -bang -count=0 -complete=dir Sexplore call netrw#Explore(<count>,1,0+<bang>0,<q-args>)
|
|
com! -nargs=* -bar -bang -count=0 -complete=dir Hexplore call netrw#Explore(<count>,1,2+<bang>0,<q-args>)
|
|
com! -nargs=* -bar -bang -count=0 -complete=dir Vexplore call netrw#Explore(<count>,1,4+<bang>0,<q-args>)
|
|
com! -nargs=* -bar -count=0 -complete=dir Texplore call netrw#Explore(<count>,0,6 ,<q-args>)
|
|
com! -nargs=* -bar -bang Nexplore call netrw#Explore(-1,0,0,<q-args>)
|
|
com! -nargs=* -bar -bang Pexplore call netrw#Explore(-2,0,0,<q-args>)
|
|
com! -nargs=* -bar -bang -count=0 -complete=dir Lexplore call netrw#Lexplore(<count>,<bang>0,<q-args>)
|
|
|
|
" Commands: NetrwSettings {{{2
|
|
com! -nargs=0 NetrwSettings call netrwSettings#NetrwSettings()
|
|
com! -bang NetrwClean call netrw#Clean(<bang>0)
|
|
|
|
" Maps:
|
|
if !exists("g:netrw_nogx")
|
|
if maparg('gx','n') == ""
|
|
if !hasmapto('<Plug>NetrwBrowseX')
|
|
nmap <unique> gx <Plug>NetrwBrowseX
|
|
endif
|
|
nno <silent> <Plug>NetrwBrowseX :call netrw#BrowseX(netrw#GX(),netrw#CheckIfRemote(netrw#GX()))<cr>
|
|
endif
|
|
if maparg('gx','x') == ""
|
|
if !hasmapto('<Plug>NetrwBrowseXVis')
|
|
xmap <unique> gx <Plug>NetrwBrowseXVis
|
|
endif
|
|
xno <silent> <Plug>NetrwBrowseXVis :<c-u>call netrw#BrowseXVis()<cr>
|
|
endif
|
|
endif
|
|
if exists("g:netrw_usetab") && g:netrw_usetab
|
|
if maparg('<c-tab>','n') == ""
|
|
nmap <unique> <c-tab> <Plug>NetrwShrink
|
|
endif
|
|
nno <silent> <Plug>NetrwShrink :call netrw#Shrink()<cr>
|
|
endif
|
|
|
|
" ---------------------------------------------------------------------
|
|
" LocalBrowse: invokes netrw#LocalBrowseCheck() on directory buffers {{{2
|
|
fun! s:LocalBrowse(dirname)
|
|
" Unfortunate interaction -- only DechoMsg debugging calls can be safely used here.
|
|
" Otherwise, the BufEnter event gets triggered when attempts to write to
|
|
" the DBG buffer are made.
|
|
|
|
if !exists("s:vimentered")
|
|
" If s:vimentered doesn't exist, then the VimEnter event hasn't fired. It will,
|
|
" and so s:VimEnter() will then be calling this routine, but this time with s:vimentered defined.
|
|
" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered doesn't exist)")
|
|
" call Dret("s:LocalBrowse")
|
|
return
|
|
endif
|
|
|
|
" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered=".s:vimentered.")")
|
|
|
|
if has("amiga")
|
|
" The check against '' is made for the Amiga, where the empty
|
|
" string is the current directory and not checking would break
|
|
" things such as the help command.
|
|
" call Decho("(LocalBrowse) dirname<".a:dirname."> (isdirectory, amiga)")
|
|
if a:dirname != '' && isdirectory(a:dirname)
|
|
sil! call netrw#LocalBrowseCheck(a:dirname)
|
|
if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt
|
|
exe w:netrw_bannercnt
|
|
endif
|
|
endif
|
|
|
|
elseif isdirectory(a:dirname)
|
|
" call Decho("(LocalBrowse) dirname<".a:dirname."> ft=".&ft." (isdirectory, not amiga)")
|
|
" call Dredir("LocalBrowse ft last set: ","verbose set ft")
|
|
" Jul 13, 2021: for whatever reason, preceding the following call with
|
|
" a sil! causes an unbalanced if-endif vim error
|
|
call netrw#LocalBrowseCheck(a:dirname)
|
|
if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt
|
|
exe w:netrw_bannercnt
|
|
endif
|
|
|
|
else
|
|
" not a directory, ignore it
|
|
" call Decho("(LocalBrowse) dirname<".a:dirname."> not a directory, ignoring...")
|
|
endif
|
|
|
|
" call Dret("s:LocalBrowse")
|
|
endfun
|
|
|
|
" ---------------------------------------------------------------------
|
|
" s:VimEnter: after all vim startup stuff is done, this function is called. {{{2
|
|
" Its purpose: to look over all windows and run s:LocalBrowse() on
|
|
" them, which checks if they're directories and will create a directory
|
|
" listing when appropriate.
|
|
" It also sets s:vimentered, letting s:LocalBrowse() know that s:VimEnter()
|
|
" has already been called.
|
|
fun! s:VimEnter(dirname)
|
|
" call Dfunc("s:VimEnter(dirname<".a:dirname.">) expand(%)<".expand("%").">")
|
|
if has('nvim') || v:version < 802
|
|
" Johann Höchtl: reported that the call range... line causes an E488: Trailing characters
|
|
" error with neovim. I suspect its because neovim hasn't updated with recent
|
|
" vim patches. As is, this code will have problems with popup terminals
|
|
" instantiated before the VimEnter event runs.
|
|
" Ingo Karkat : E488 also in Vim 8.1.1602
|
|
let curwin = winnr()
|
|
let s:vimentered = 1
|
|
windo call s:LocalBrowse(expand("%:p"))
|
|
exe curwin."wincmd w"
|
|
else
|
|
" the following complicated expression comes courtesy of lacygoill; largely does the same thing as the windo and
|
|
" wincmd which are commented out, but avoids some side effects. Allows popup terminal before VimEnter.
|
|
let s:vimentered = 1
|
|
call range(1, winnr('$'))->map({_, v -> win_execute(win_getid(v), 'call expand("%:p")->s:LocalBrowse()')})
|
|
endif
|
|
" call Dret("s:VimEnter")
|
|
endfun
|
|
|
|
" ---------------------------------------------------------------------
|
|
" NetrwStatusLine: {{{1
|
|
fun! NetrwStatusLine()
|
|
" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".")
|
|
if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr("%") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list")
|
|
let &stl= s:netrw_explore_stl
|
|
if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
|
|
if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
|
|
return ""
|
|
else
|
|
return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
|
|
endif
|
|
endfun
|
|
|
|
" ------------------------------------------------------------------------
|
|
" NetUserPass: set username and password for subsequent ftp transfer {{{1
|
|
" Usage: :call NetUserPass() -- will prompt for userid and password
|
|
" :call NetUserPass("uid") -- will prompt for password
|
|
" :call NetUserPass("uid","password") -- sets global userid and password
|
|
fun! NetUserPass(...)
|
|
|
|
" get/set userid
|
|
if a:0 == 0
|
|
" call Dfunc("NetUserPass(a:0<".a:0.">)")
|
|
if !exists("g:netrw_uid") || g:netrw_uid == ""
|
|
" via prompt
|
|
let g:netrw_uid= input('Enter username: ')
|
|
endif
|
|
else " from command line
|
|
" call Dfunc("NetUserPass(a:1<".a:1.">) {")
|
|
let g:netrw_uid= a:1
|
|
endif
|
|
|
|
" get password
|
|
if a:0 <= 1 " via prompt
|
|
" call Decho("a:0=".a:0." case <=1:")
|
|
let g:netrw_passwd= inputsecret("Enter Password: ")
|
|
else " from command line
|
|
" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
|
|
let g:netrw_passwd=a:2
|
|
endif
|
|
" call Dret("NetUserPass")
|
|
endfun
|
|
|
|
" ------------------------------------------------------------------------
|
|
" Modelines And Restoration: {{{1
|
|
let &cpo= s:keepcpo
|
|
unlet s:keepcpo
|
|
" vim:ts=8 sts=2 sw=2 et fdm=marker
|