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