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 = "v156"
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#FileUrlRead(expand("<amatch>"))
46 au BufReadCmd   ftp://*,rcp://*,scp://*,http://*,file://*,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(<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(expand((exists("g:netrw_gx")? g:netrw_gx : '<cfile>')),netrw#CheckIfRemote())<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"   call Decho("(s:LocalBrowse) COMBAK#23: buf#".bufnr("%")." file<".expand("%")."> line#".line(".")." col#".col("."))
133   sil! call netrw#LocalBrowseCheck(a:dirname)
134"   call Decho("(s:LocalBrowse) COMBAK#24: buf#".bufnr("%")." file<".expand("%")."> line#".line(".")." col#".col("."))
135   if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt
136    exe w:netrw_bannercnt
137"    call Decho("(s:LocalBrowse) COMBAK#25: buf#".bufnr("%")." file<".expand("%")."> line#".line(".")." col#".col("."))
138   endif
139
140  else
141   " not a directory, ignore it
142"   call Decho("(LocalBrowse) dirname<".a:dirname."> not a directory, ignoring...")
143  endif
144"  call Decho("(s:LocalBrowse) COMBAK#26: buf#".bufnr("%")." file<".expand("%")."> line#".line(".")." col#".col("."))
145
146"  call Dret("s:LocalBrowse")
147endfun
148
149" ---------------------------------------------------------------------
150" s:VimEnter: after all vim startup stuff is done, this function is called. {{{2
151"             Its purpose: to look over all windows and run s:LocalBrowse() on
152"             them, which checks if they're directories and will create a directory
153"             listing when appropriate.
154"             It also sets s:vimentered, letting s:LocalBrowse() know that s:VimEnter()
155"             has already been called.
156fun! s:VimEnter(dirname)
157"  call Dfunc("s:VimEnter(dirname<".a:dirname.">) expand(%)<".expand("%").">")
158  let curwin       = winnr()
159  let s:vimentered = 1
160  windo call s:LocalBrowse(expand("%:p"))
161  exe curwin."wincmd w"
162"  call Dret("s:VimEnter")
163endfun
164
165" ---------------------------------------------------------------------
166" NetrwStatusLine: {{{1
167fun! NetrwStatusLine()
168"  let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".")
169  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")
170   let &stl= s:netrw_explore_stl
171   if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
172   if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
173   return ""
174  else
175   return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
176  endif
177endfun
178
179" ------------------------------------------------------------------------
180" NetUserPass: set username and password for subsequent ftp transfer {{{1
181"   Usage:  :call NetUserPass()			-- will prompt for userid and password
182"	    :call NetUserPass("uid")		-- will prompt for password
183"	    :call NetUserPass("uid","password") -- sets global userid and password
184fun! NetUserPass(...)
185
186 " get/set userid
187 if a:0 == 0
188"  call Dfunc("NetUserPass(a:0<".a:0.">)")
189  if !exists("g:netrw_uid") || g:netrw_uid == ""
190   " via prompt
191   let g:netrw_uid= input('Enter username: ')
192  endif
193 else	" from command line
194"  call Dfunc("NetUserPass(a:1<".a:1.">) {")
195  let g:netrw_uid= a:1
196 endif
197
198 " get password
199 if a:0 <= 1 " via prompt
200"  call Decho("a:0=".a:0." case <=1:")
201  let g:netrw_passwd= inputsecret("Enter Password: ")
202 else " from command line
203"  call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
204  let g:netrw_passwd=a:2
205 endif
206"  call Dret("NetUserPass")
207endfun
208
209" ------------------------------------------------------------------------
210" Modelines And Restoration: {{{1
211let &cpo= s:keepcpo
212unlet s:keepcpo
213" vim:ts=8 fdm=marker
214