1" netrwPlugin.vim: Handles file transfer and remote directory listing across a network
2"            PLUGIN SECTION
3" Date:		Feb 08, 2016
4" Maintainer:	Charles E Campbell <[email protected]>
5" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
6" Copyright:    Copyright (C) 1999-2013 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 = "v167"
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','v') == ""
87  if !hasmapto('<Plug>NetrwBrowseXVis')
88   vmap <unique> gx <Plug>NetrwBrowseXVis
89  endif
90  vno <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   sil! call netrw#LocalBrowseCheck(a:dirname)
133   if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt
134    exe w:netrw_bannercnt
135   endif
136
137  else
138   " not a directory, ignore it
139"   call Decho("(LocalBrowse) dirname<".a:dirname."> not a directory, ignoring...")
140  endif
141
142"  call Dret("s:LocalBrowse")
143endfun
144
145" ---------------------------------------------------------------------
146" s:VimEnter: after all vim startup stuff is done, this function is called. {{{2
147"             Its purpose: to look over all windows and run s:LocalBrowse() on
148"             them, which checks if they're directories and will create a directory
149"             listing when appropriate.
150"             It also sets s:vimentered, letting s:LocalBrowse() know that s:VimEnter()
151"             has already been called.
152fun! s:VimEnter(dirname)
153"  call Dfunc("s:VimEnter(dirname<".a:dirname.">) expand(%)<".expand("%").">")
154  let curwin       = winnr()
155  let s:vimentered = 1
156  windo call s:LocalBrowse(expand("%:p"))
157  exe curwin."wincmd w"
158"  call Dret("s:VimEnter")
159endfun
160
161" ---------------------------------------------------------------------
162" NetrwStatusLine: {{{1
163fun! NetrwStatusLine()
164"  let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".")
165  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")
166   let &stl= s:netrw_explore_stl
167   if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
168   if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
169   return ""
170  else
171   return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
172  endif
173endfun
174
175" ------------------------------------------------------------------------
176" NetUserPass: set username and password for subsequent ftp transfer {{{1
177"   Usage:  :call NetUserPass()			-- will prompt for userid and password
178"	    :call NetUserPass("uid")		-- will prompt for password
179"	    :call NetUserPass("uid","password") -- sets global userid and password
180fun! NetUserPass(...)
181
182 " get/set userid
183 if a:0 == 0
184"  call Dfunc("NetUserPass(a:0<".a:0.">)")
185  if !exists("g:netrw_uid") || g:netrw_uid == ""
186   " via prompt
187   let g:netrw_uid= input('Enter username: ')
188  endif
189 else	" from command line
190"  call Dfunc("NetUserPass(a:1<".a:1.">) {")
191  let g:netrw_uid= a:1
192 endif
193
194 " get password
195 if a:0 <= 1 " via prompt
196"  call Decho("a:0=".a:0." case <=1:")
197  let g:netrw_passwd= inputsecret("Enter Password: ")
198 else " from command line
199"  call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
200  let g:netrw_passwd=a:2
201 endif
202"  call Dret("NetUserPass")
203endfun
204
205" ------------------------------------------------------------------------
206" Modelines And Restoration: {{{1
207let &cpo= s:keepcpo
208unlet s:keepcpo
209" vim:ts=8 fdm=marker
210