1482aaeb0SBram Moolenaar" netrwPlugin.vim: Handles file transfer and remote directory listing across a network 2dd2a3cdaSBram Moolenaar" PLUGIN SECTION 3*89a9c159SBram Moolenaar" Date: Feb 09, 2021 42963456fSBram Moolenaar" Maintainer: Charles E Campbell <[email protected]> 5482aaeb0SBram Moolenaar" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim 6*89a9c159SBram Moolenaar" Copyright: Copyright (C) 1999-2021 Charles E. Campbell {{{1 7482aaeb0SBram Moolenaar" Permission is hereby granted to use and distribute this code, 8482aaeb0SBram Moolenaar" with or without modifications, provided that this copyright 9482aaeb0SBram Moolenaar" notice is copied with it. Like anything else that's free, 10482aaeb0SBram Moolenaar" netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided 11482aaeb0SBram Moolenaar" *as is* and comes with no warranty of any kind, either 12482aaeb0SBram Moolenaar" expressed or implied. By using this plugin, you agree that 13482aaeb0SBram Moolenaar" in no event will the copyright holder be liable for any damages 14482aaeb0SBram Moolenaar" resulting from the use of this software. 15482aaeb0SBram Moolenaar" 16482aaeb0SBram Moolenaar" But be doers of the Word, and not only hearers, deluding your own selves {{{1 17482aaeb0SBram Moolenaar" (James 1:22 RSV) 18482aaeb0SBram Moolenaar" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 19482aaeb0SBram Moolenaar" Load Once: {{{1 20dd2a3cdaSBram Moolenaarif &cp || exists("g:loaded_netrwPlugin") 21482aaeb0SBram Moolenaar finish 22482aaeb0SBram Moolenaarendif 23*89a9c159SBram Moolenaarlet g:loaded_netrwPlugin = "v171" 24482aaeb0SBram Moolenaarlet s:keepcpo = &cpo 25482aaeb0SBram Moolenaarset cpo&vim 268d043171SBram Moolenaar"DechoRemOn 27482aaeb0SBram Moolenaar 28482aaeb0SBram Moolenaar" --------------------------------------------------------------------- 29482aaeb0SBram Moolenaar" Public Interface: {{{1 30482aaeb0SBram Moolenaar 318d043171SBram Moolenaar" Local Browsing Autocmds: {{{2 32482aaeb0SBram Moolenaaraugroup FileExplorer 33482aaeb0SBram Moolenaar au! 34a6878375SBram Moolenaar au BufLeave * if &ft != "netrw"|let w:netrw_prvfile= expand("%:p")|endif 358d043171SBram Moolenaar au BufEnter * sil call s:LocalBrowse(expand("<amatch>")) 368d043171SBram Moolenaar au VimEnter * sil call s:VimEnter(expand("<amatch>")) 37dd2a3cdaSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 388d043171SBram Moolenaar au BufEnter .* sil call s:LocalBrowse(expand("<amatch>")) 39dd2a3cdaSBram Moolenaar endif 40482aaeb0SBram Moolenaaraugroup END 41482aaeb0SBram Moolenaar 42482aaeb0SBram Moolenaar" Network Browsing Reading Writing: {{{2 43482aaeb0SBram Moolenaaraugroup Network 44482aaeb0SBram Moolenaar au! 4585850f3aSBram Moolenaar au BufReadCmd file://* call netrw#FileUrlEdit(expand("<amatch>")) 4685850f3aSBram Moolenaar 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>")) 478feef4ffSBram Moolenaar 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>")) 488feef4ffSBram Moolenaar 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>")) 498feef4ffSBram Moolenaar 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>")) 50dd2a3cdaSBram Moolenaar try 518feef4ffSBram Moolenaar au SourceCmd ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>")) 52dd2a3cdaSBram Moolenaar catch /^Vim\%((\a\+)\)\=:E216/ 538feef4ffSBram Moolenaar au SourcePre ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>")) 54dd2a3cdaSBram Moolenaar endtry 55482aaeb0SBram Moolenaaraugroup END 56482aaeb0SBram Moolenaar 57482aaeb0SBram Moolenaar" Commands: :Nread, :Nwrite, :NetUserPass {{{2 58e0fa3742SBram Moolenaarcom! -count=1 -nargs=* Nread let s:svpos= winsaveview()<bar>call netrw#NetRead(<count>,<f-args>)<bar>call winrestview(s:svpos) 59e0fa3742SBram Moolenaarcom! -range=% -nargs=* Nwrite let s:svpos= winsaveview()<bar><line1>,<line2>call netrw#NetWrite(<f-args>)<bar>call winrestview(s:svpos) 60482aaeb0SBram Moolenaarcom! -nargs=* NetUserPass call NetUserPass(<f-args>) 61e0fa3742SBram Moolenaarcom! -nargs=* Nsource let s:svpos= winsaveview()<bar>call netrw#NetSource(<f-args>)<bar>call winrestview(s:svpos) 6285850f3aSBram Moolenaarcom! -nargs=? Ntree call netrw#SetTreetop(1,<q-args>) 63482aaeb0SBram Moolenaar 648d043171SBram Moolenaar" Commands: :Explore, :Sexplore, Hexplore, Vexplore, Lexplore {{{2 65dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir Explore call netrw#Explore(<count>,0,0+<bang>0,<q-args>) 66dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir Sexplore call netrw#Explore(<count>,1,0+<bang>0,<q-args>) 67dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir Hexplore call netrw#Explore(<count>,1,2+<bang>0,<q-args>) 68dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir Vexplore call netrw#Explore(<count>,1,4+<bang>0,<q-args>) 69dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -count=0 -complete=dir Texplore call netrw#Explore(<count>,0,6 ,<q-args>) 70dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang Nexplore call netrw#Explore(-1,0,0,<q-args>) 71dd2a3cdaSBram Moolenaarcom! -nargs=* -bar -bang Pexplore call netrw#Explore(-2,0,0,<q-args>) 728feef4ffSBram Moolenaarcom! -nargs=* -bar -bang -count=0 -complete=dir Lexplore call netrw#Lexplore(<count>,<bang>0,<q-args>) 73482aaeb0SBram Moolenaar 74482aaeb0SBram Moolenaar" Commands: NetrwSettings {{{2 75f233048aSBram Moolenaarcom! -nargs=0 NetrwSettings call netrwSettings#NetrwSettings() 76a6878375SBram Moolenaarcom! -bang NetrwClean call netrw#Clean(<bang>0) 77482aaeb0SBram Moolenaar 78b8a7b560SBram Moolenaar" Maps: 798feef4ffSBram Moolenaarif !exists("g:netrw_nogx") 808feef4ffSBram Moolenaar if maparg('gx','n') == "" 81b8a7b560SBram Moolenaar if !hasmapto('<Plug>NetrwBrowseX') 82b8a7b560SBram Moolenaar nmap <unique> gx <Plug>NetrwBrowseX 83b8a7b560SBram Moolenaar endif 845ef1c6a4SBram Moolenaar nno <silent> <Plug>NetrwBrowseX :call netrw#BrowseX(netrw#GX(),netrw#CheckIfRemote(netrw#GX()))<cr> 858feef4ffSBram Moolenaar endif 86*89a9c159SBram Moolenaar if maparg('gx','x') == "" 878feef4ffSBram Moolenaar if !hasmapto('<Plug>NetrwBrowseXVis') 88*89a9c159SBram Moolenaar xmap <unique> gx <Plug>NetrwBrowseXVis 898feef4ffSBram Moolenaar endif 90*89a9c159SBram Moolenaar xno <silent> <Plug>NetrwBrowseXVis :<c-u>call netrw#BrowseXVis()<cr> 918feef4ffSBram Moolenaar endif 92dd2a3cdaSBram Moolenaarendif 93a0f849eeSBram Moolenaarif exists("g:netrw_usetab") && g:netrw_usetab 94a0f849eeSBram Moolenaar if maparg('<c-tab>','n') == "" 95a0f849eeSBram Moolenaar nmap <unique> <c-tab> <Plug>NetrwShrink 96a0f849eeSBram Moolenaar endif 97a0f849eeSBram Moolenaar nno <silent> <Plug>NetrwShrink :call netrw#Shrink()<cr> 98a0f849eeSBram Moolenaarendif 99b8a7b560SBram Moolenaar 100482aaeb0SBram Moolenaar" --------------------------------------------------------------------- 1018d043171SBram Moolenaar" LocalBrowse: invokes netrw#LocalBrowseCheck() on directory buffers {{{2 102482aaeb0SBram Moolenaarfun! s:LocalBrowse(dirname) 1038d043171SBram Moolenaar " Unfortunate interaction -- only DechoMsg debugging calls can be safely used here. 1048d043171SBram Moolenaar " Otherwise, the BufEnter event gets triggered when attempts to write to 105482aaeb0SBram Moolenaar " the DBG buffer are made. 1068d043171SBram Moolenaar 107e6ae6225SBram Moolenaar if !exists("s:vimentered") 1088d043171SBram Moolenaar " If s:vimentered doesn't exist, then the VimEnter event hasn't fired. It will, 1098d043171SBram Moolenaar " and so s:VimEnter() will then be calling this routine, but this time with s:vimentered defined. 1108d043171SBram Moolenaar" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered doesn't exist)") 1118d043171SBram Moolenaar" call Dret("s:LocalBrowse") 112e6ae6225SBram Moolenaar return 113e6ae6225SBram Moolenaar endif 1148d043171SBram Moolenaar 1158d043171SBram Moolenaar" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered=".s:vimentered.")") 1168d043171SBram Moolenaar 117dd2a3cdaSBram Moolenaar if has("amiga") 118dd2a3cdaSBram Moolenaar " The check against '' is made for the Amiga, where the empty 119dd2a3cdaSBram Moolenaar " string is the current directory and not checking would break 120dd2a3cdaSBram Moolenaar " things such as the help command. 1218d043171SBram Moolenaar" call Decho("(LocalBrowse) dirname<".a:dirname."> (isdirectory, amiga)") 122dd2a3cdaSBram Moolenaar if a:dirname != '' && isdirectory(a:dirname) 123adc2182cSBram Moolenaar sil! call netrw#LocalBrowseCheck(a:dirname) 1248feef4ffSBram Moolenaar if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt 125a6878375SBram Moolenaar exe w:netrw_bannercnt 126a6878375SBram Moolenaar endif 127dd2a3cdaSBram Moolenaar endif 1288d043171SBram Moolenaar 129dd2a3cdaSBram Moolenaar elseif isdirectory(a:dirname) 130a6878375SBram Moolenaar" call Decho("(LocalBrowse) dirname<".a:dirname."> ft=".&ft." (isdirectory, not amiga)") 131a6878375SBram Moolenaar" call Dredir("LocalBrowse ft last set: ","verbose set ft") 132*89a9c159SBram Moolenaar " Jul 13, 2021: for whatever reason, preceding the following call with 133*89a9c159SBram Moolenaar " a sil! causes an unbalanced if-endif vim error 134*89a9c159SBram Moolenaar call netrw#LocalBrowseCheck(a:dirname) 1358feef4ffSBram Moolenaar if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt 136a6878375SBram Moolenaar exe w:netrw_bannercnt 137a6878375SBram Moolenaar endif 1388d043171SBram Moolenaar 1398d043171SBram Moolenaar else 140482aaeb0SBram Moolenaar " not a directory, ignore it 1418d043171SBram Moolenaar" call Decho("(LocalBrowse) dirname<".a:dirname."> not a directory, ignoring...") 1428d043171SBram Moolenaar endif 1438d043171SBram Moolenaar 1448d043171SBram Moolenaar" call Dret("s:LocalBrowse") 145482aaeb0SBram Moolenaarendfun 146482aaeb0SBram Moolenaar 147482aaeb0SBram Moolenaar" --------------------------------------------------------------------- 1488d043171SBram Moolenaar" s:VimEnter: after all vim startup stuff is done, this function is called. {{{2 1498d043171SBram Moolenaar" Its purpose: to look over all windows and run s:LocalBrowse() on 1508d043171SBram Moolenaar" them, which checks if they're directories and will create a directory 1518d043171SBram Moolenaar" listing when appropriate. 1528d043171SBram Moolenaar" It also sets s:vimentered, letting s:LocalBrowse() know that s:VimEnter() 1538d043171SBram Moolenaar" has already been called. 15400a927d6SBram Moolenaarfun! s:VimEnter(dirname) 1558d043171SBram Moolenaar" call Dfunc("s:VimEnter(dirname<".a:dirname.">) expand(%)<".expand("%").">") 156*89a9c159SBram Moolenaar if has('nvim') || v:version < 802 157*89a9c159SBram Moolenaar " Johann Höchtl: reported that the call range... line causes an E488: Trailing characters 158*89a9c159SBram Moolenaar " error with neovim. I suspect its because neovim hasn't updated with recent 159*89a9c159SBram Moolenaar " vim patches. As is, this code will have problems with popup terminals 160*89a9c159SBram Moolenaar " instantiated before the VimEnter event runs. 161*89a9c159SBram Moolenaar " Ingo Karkat : E488 also in Vim 8.1.1602 162477db060SBram Moolenaar let curwin = winnr() 163e6ae6225SBram Moolenaar let s:vimentered = 1 1648d043171SBram Moolenaar windo call s:LocalBrowse(expand("%:p")) 165477db060SBram Moolenaar exe curwin."wincmd w" 166*89a9c159SBram Moolenaar else 167*89a9c159SBram Moolenaar " the following complicated expression comes courtesy of lacygoill; largely does the same thing as the windo and 168*89a9c159SBram Moolenaar " wincmd which are commented out, but avoids some side effects. Allows popup terminal before VimEnter. 169*89a9c159SBram Moolenaar let s:vimentered = 1 170*89a9c159SBram Moolenaar call range(1, winnr('$'))->map({_, v -> win_execute(win_getid(v), 'call expand("%:p")->s:LocalBrowse()')}) 171*89a9c159SBram Moolenaar endif 1728d043171SBram Moolenaar" call Dret("s:VimEnter") 17300a927d6SBram Moolenaarendfun 17400a927d6SBram Moolenaar 17500a927d6SBram Moolenaar" --------------------------------------------------------------------- 176482aaeb0SBram Moolenaar" NetrwStatusLine: {{{1 177482aaeb0SBram Moolenaarfun! NetrwStatusLine() 178af48b092SBram Moolenaar" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".") 179af48b092SBram Moolenaar 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") 180482aaeb0SBram Moolenaar let &stl= s:netrw_explore_stl 181482aaeb0SBram Moolenaar if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif 182482aaeb0SBram Moolenaar if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif 183482aaeb0SBram Moolenaar return "" 184482aaeb0SBram Moolenaar else 185482aaeb0SBram Moolenaar return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen 186482aaeb0SBram Moolenaar endif 187482aaeb0SBram Moolenaarendfun 188482aaeb0SBram Moolenaar 189482aaeb0SBram Moolenaar" ------------------------------------------------------------------------ 190482aaeb0SBram Moolenaar" NetUserPass: set username and password for subsequent ftp transfer {{{1 191482aaeb0SBram Moolenaar" Usage: :call NetUserPass() -- will prompt for userid and password 192482aaeb0SBram Moolenaar" :call NetUserPass("uid") -- will prompt for password 193482aaeb0SBram Moolenaar" :call NetUserPass("uid","password") -- sets global userid and password 194482aaeb0SBram Moolenaarfun! NetUserPass(...) 195482aaeb0SBram Moolenaar 196482aaeb0SBram Moolenaar " get/set userid 197482aaeb0SBram Moolenaar if a:0 == 0 198482aaeb0SBram Moolenaar" call Dfunc("NetUserPass(a:0<".a:0.">)") 199482aaeb0SBram Moolenaar if !exists("g:netrw_uid") || g:netrw_uid == "" 200482aaeb0SBram Moolenaar " via prompt 201482aaeb0SBram Moolenaar let g:netrw_uid= input('Enter username: ') 202482aaeb0SBram Moolenaar endif 203482aaeb0SBram Moolenaar else " from command line 204482aaeb0SBram Moolenaar" call Dfunc("NetUserPass(a:1<".a:1.">) {") 205482aaeb0SBram Moolenaar let g:netrw_uid= a:1 206482aaeb0SBram Moolenaar endif 207482aaeb0SBram Moolenaar 208482aaeb0SBram Moolenaar " get password 209482aaeb0SBram Moolenaar if a:0 <= 1 " via prompt 210482aaeb0SBram Moolenaar" call Decho("a:0=".a:0." case <=1:") 211482aaeb0SBram Moolenaar let g:netrw_passwd= inputsecret("Enter Password: ") 212482aaeb0SBram Moolenaar else " from command line 213482aaeb0SBram Moolenaar" call Decho("a:0=".a:0." case >1: a:2<".a:2.">") 214482aaeb0SBram Moolenaar let g:netrw_passwd=a:2 215482aaeb0SBram Moolenaar endif 216482aaeb0SBram Moolenaar" call Dret("NetUserPass") 217482aaeb0SBram Moolenaarendfun 218482aaeb0SBram Moolenaar 219482aaeb0SBram Moolenaar" ------------------------------------------------------------------------ 220482aaeb0SBram Moolenaar" Modelines And Restoration: {{{1 221482aaeb0SBram Moolenaarlet &cpo= s:keepcpo 222482aaeb0SBram Moolenaarunlet s:keepcpo 223482aaeb0SBram Moolenaar" vim:ts=8 fdm=marker 224