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