1" netrwPlugin.vim: Handles file transfer and remote directory listing across a network 2" PLUGIN SECTION 3" Date: Feb 09, 2021 4" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM> 5" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim 6" Copyright: Copyright (C) 1999-2021 Charles E. Campbell {{{1 7" Permission is hereby granted to use and distribute this code, 8" with or without modifications, provided that this copyright 9" notice is copied with it. Like anything else that's free, 10" netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided 11" *as is* and comes with no warranty of any kind, either 12" expressed or implied. By using this plugin, you agree that 13" in no event will the copyright holder be liable for any damages 14" resulting from the use of this software. 15" 16" But be doers of the Word, and not only hearers, deluding your own selves {{{1 17" (James 1:22 RSV) 18" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 19" Load Once: {{{1 20if &cp || exists("g:loaded_netrwPlugin") 21 finish 22endif 23let g:loaded_netrwPlugin = "v171" 24let s:keepcpo = &cpo 25set cpo&vim 26"DechoRemOn 27 28" --------------------------------------------------------------------- 29" Public Interface: {{{1 30 31" Local Browsing Autocmds: {{{2 32augroup FileExplorer 33 au! 34 au BufLeave * if &ft != "netrw"|let w:netrw_prvfile= expand("%:p")|endif 35 au BufEnter * sil call s:LocalBrowse(expand("<amatch>")) 36 au VimEnter * sil call s:VimEnter(expand("<amatch>")) 37 if has("win32") || has("win95") || has("win64") || has("win16") 38 au BufEnter .* sil call s:LocalBrowse(expand("<amatch>")) 39 endif 40augroup END 41 42" Network Browsing Reading Writing: {{{2 43augroup Network 44 au! 45 au BufReadCmd file://* call netrw#FileUrlEdit(expand("<amatch>")) 46 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>")) 47 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>")) 48 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>")) 49 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>")) 50 try 51 au SourceCmd ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>")) 52 catch /^Vim\%((\a\+)\)\=:E216/ 53 au SourcePre ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>")) 54 endtry 55augroup END 56 57" Commands: :Nread, :Nwrite, :NetUserPass {{{2 58com! -count=1 -nargs=* Nread let s:svpos= winsaveview()<bar>call netrw#NetRead(<count>,<f-args>)<bar>call winrestview(s:svpos) 59com! -range=% -nargs=* Nwrite let s:svpos= winsaveview()<bar><line1>,<line2>call netrw#NetWrite(<f-args>)<bar>call winrestview(s:svpos) 60com! -nargs=* NetUserPass call NetUserPass(<f-args>) 61com! -nargs=* Nsource let s:svpos= winsaveview()<bar>call netrw#NetSource(<f-args>)<bar>call winrestview(s:svpos) 62com! -nargs=? Ntree call netrw#SetTreetop(1,<q-args>) 63 64" Commands: :Explore, :Sexplore, Hexplore, Vexplore, Lexplore {{{2 65com! -nargs=* -bar -bang -count=0 -complete=dir Explore call netrw#Explore(<count>,0,0+<bang>0,<q-args>) 66com! -nargs=* -bar -bang -count=0 -complete=dir Sexplore call netrw#Explore(<count>,1,0+<bang>0,<q-args>) 67com! -nargs=* -bar -bang -count=0 -complete=dir Hexplore call netrw#Explore(<count>,1,2+<bang>0,<q-args>) 68com! -nargs=* -bar -bang -count=0 -complete=dir Vexplore call netrw#Explore(<count>,1,4+<bang>0,<q-args>) 69com! -nargs=* -bar -count=0 -complete=dir Texplore call netrw#Explore(<count>,0,6 ,<q-args>) 70com! -nargs=* -bar -bang Nexplore call netrw#Explore(-1,0,0,<q-args>) 71com! -nargs=* -bar -bang Pexplore call netrw#Explore(-2,0,0,<q-args>) 72com! -nargs=* -bar -bang -count=0 -complete=dir Lexplore call netrw#Lexplore(<count>,<bang>0,<q-args>) 73 74" Commands: NetrwSettings {{{2 75com! -nargs=0 NetrwSettings call netrwSettings#NetrwSettings() 76com! -bang NetrwClean call netrw#Clean(<bang>0) 77 78" Maps: 79if !exists("g:netrw_nogx") 80 if maparg('gx','n') == "" 81 if !hasmapto('<Plug>NetrwBrowseX') 82 nmap <unique> gx <Plug>NetrwBrowseX 83 endif 84 nno <silent> <Plug>NetrwBrowseX :call netrw#BrowseX(netrw#GX(),netrw#CheckIfRemote(netrw#GX()))<cr> 85 endif 86 if maparg('gx','x') == "" 87 if !hasmapto('<Plug>NetrwBrowseXVis') 88 xmap <unique> gx <Plug>NetrwBrowseXVis 89 endif 90 xno <silent> <Plug>NetrwBrowseXVis :<c-u>call netrw#BrowseXVis()<cr> 91 endif 92endif 93if exists("g:netrw_usetab") && g:netrw_usetab 94 if maparg('<c-tab>','n') == "" 95 nmap <unique> <c-tab> <Plug>NetrwShrink 96 endif 97 nno <silent> <Plug>NetrwShrink :call netrw#Shrink()<cr> 98endif 99 100" --------------------------------------------------------------------- 101" LocalBrowse: invokes netrw#LocalBrowseCheck() on directory buffers {{{2 102fun! s:LocalBrowse(dirname) 103 " Unfortunate interaction -- only DechoMsg debugging calls can be safely used here. 104 " Otherwise, the BufEnter event gets triggered when attempts to write to 105 " the DBG buffer are made. 106 107 if !exists("s:vimentered") 108 " If s:vimentered doesn't exist, then the VimEnter event hasn't fired. It will, 109 " and so s:VimEnter() will then be calling this routine, but this time with s:vimentered defined. 110" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered doesn't exist)") 111" call Dret("s:LocalBrowse") 112 return 113 endif 114 115" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered=".s:vimentered.")") 116 117 if has("amiga") 118 " The check against '' is made for the Amiga, where the empty 119 " string is the current directory and not checking would break 120 " things such as the help command. 121" call Decho("(LocalBrowse) dirname<".a:dirname."> (isdirectory, amiga)") 122 if a:dirname != '' && isdirectory(a:dirname) 123 sil! call netrw#LocalBrowseCheck(a:dirname) 124 if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt 125 exe w:netrw_bannercnt 126 endif 127 endif 128 129 elseif isdirectory(a:dirname) 130" call Decho("(LocalBrowse) dirname<".a:dirname."> ft=".&ft." (isdirectory, not amiga)") 131" call Dredir("LocalBrowse ft last set: ","verbose set ft") 132 " Jul 13, 2021: for whatever reason, preceding the following call with 133 " a sil! causes an unbalanced if-endif vim error 134 call netrw#LocalBrowseCheck(a:dirname) 135 if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt 136 exe w:netrw_bannercnt 137 endif 138 139 else 140 " not a directory, ignore it 141" call Decho("(LocalBrowse) dirname<".a:dirname."> not a directory, ignoring...") 142 endif 143 144" call Dret("s:LocalBrowse") 145endfun 146 147" --------------------------------------------------------------------- 148" s:VimEnter: after all vim startup stuff is done, this function is called. {{{2 149" Its purpose: to look over all windows and run s:LocalBrowse() on 150" them, which checks if they're directories and will create a directory 151" listing when appropriate. 152" It also sets s:vimentered, letting s:LocalBrowse() know that s:VimEnter() 153" has already been called. 154fun! s:VimEnter(dirname) 155" call Dfunc("s:VimEnter(dirname<".a:dirname.">) expand(%)<".expand("%").">") 156 if has('nvim') || v:version < 802 157 " Johann Höchtl: reported that the call range... line causes an E488: Trailing characters 158 " error with neovim. I suspect its because neovim hasn't updated with recent 159 " vim patches. As is, this code will have problems with popup terminals 160 " instantiated before the VimEnter event runs. 161 " Ingo Karkat : E488 also in Vim 8.1.1602 162 let curwin = winnr() 163 let s:vimentered = 1 164 windo call s:LocalBrowse(expand("%:p")) 165 exe curwin."wincmd w" 166 else 167 " the following complicated expression comes courtesy of lacygoill; largely does the same thing as the windo and 168 " wincmd which are commented out, but avoids some side effects. Allows popup terminal before VimEnter. 169 let s:vimentered = 1 170 call range(1, winnr('$'))->map({_, v -> win_execute(win_getid(v), 'call expand("%:p")->s:LocalBrowse()')}) 171 endif 172" call Dret("s:VimEnter") 173endfun 174 175" --------------------------------------------------------------------- 176" NetrwStatusLine: {{{1 177fun! NetrwStatusLine() 178" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".") 179 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") 180 let &stl= s:netrw_explore_stl 181 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif 182 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif 183 return "" 184 else 185 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen 186 endif 187endfun 188 189" ------------------------------------------------------------------------ 190" NetUserPass: set username and password for subsequent ftp transfer {{{1 191" Usage: :call NetUserPass() -- will prompt for userid and password 192" :call NetUserPass("uid") -- will prompt for password 193" :call NetUserPass("uid","password") -- sets global userid and password 194fun! NetUserPass(...) 195 196 " get/set userid 197 if a:0 == 0 198" call Dfunc("NetUserPass(a:0<".a:0.">)") 199 if !exists("g:netrw_uid") || g:netrw_uid == "" 200 " via prompt 201 let g:netrw_uid= input('Enter username: ') 202 endif 203 else " from command line 204" call Dfunc("NetUserPass(a:1<".a:1.">) {") 205 let g:netrw_uid= a:1 206 endif 207 208 " get password 209 if a:0 <= 1 " via prompt 210" call Decho("a:0=".a:0." case <=1:") 211 let g:netrw_passwd= inputsecret("Enter Password: ") 212 else " from command line 213" call Decho("a:0=".a:0." case >1: a:2<".a:2.">") 214 let g:netrw_passwd=a:2 215 endif 216" call Dret("NetUserPass") 217endfun 218 219" ------------------------------------------------------------------------ 220" Modelines And Restoration: {{{1 221let &cpo= s:keepcpo 222unlet s:keepcpo 223" vim:ts=8 fdm=marker 224