1" netrwPlugin.vim: Handles file transfer and remote directory listing across a network
2"            PLUGIN SECTION
3" Date:		Nov 07, 2014
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 = "v153"
24if v:version < 702
25 echohl WarningMsg
26 echo "***warning*** you need vim version 7.2 for this version of netrw"
27 echohl None
28 finish
29endif
30if v:version < 703 || (v:version == 703 && !has("patch465"))
31 echohl WarningMsg
32 echo "***warning*** this version of netrw needs vim 7.3.465 or later"
33 echohl Normal
34 finish
35endif
36let s:keepcpo = &cpo
37set cpo&vim
38"DechoRemOn
39
40" ---------------------------------------------------------------------
41" Public Interface: {{{1
42
43" Local Browsing Autocmds: {{{2
44augroup FileExplorer
45 au!
46 au BufLeave *  if &ft != "netrw"|let w:netrw_prvfile= expand("%:p")|endif
47 au BufEnter *	sil call s:LocalBrowse(expand("<amatch>"))
48 au VimEnter *	sil call s:VimEnter(expand("<amatch>"))
49 if has("win32") || has("win95") || has("win64") || has("win16")
50  au BufEnter .* sil call s:LocalBrowse(expand("<amatch>"))
51 endif
52augroup END
53
54" Network Browsing Reading Writing: {{{2
55augroup Network
56 au!
57 au BufReadCmd   file://*											call netrw#FileUrlRead(expand("<amatch>"))
58 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>"))
59 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>"))
60 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>"))
61 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>"))
62 try
63  au SourceCmd   ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://*	exe 'Nsource '.fnameescape(expand("<amatch>"))
64 catch /^Vim\%((\a\+)\)\=:E216/
65  au SourcePre   ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://*	exe 'Nsource '.fnameescape(expand("<amatch>"))
66 endtry
67augroup END
68
69" Commands: :Nread, :Nwrite, :NetUserPass {{{2
70com! -count=1 -nargs=*	Nread		call netrw#SavePosn()<bar>call netrw#NetRead(<count>,<f-args>)<bar>call netrw#RestorePosn()
71com! -range=% -nargs=*	Nwrite		call netrw#SavePosn()<bar><line1>,<line2>call netrw#NetWrite(<f-args>)<bar>call netrw#RestorePosn()
72com! -nargs=*		NetUserPass	call NetUserPass(<f-args>)
73com! -nargs=*	        Nsource		call netrw#SavePosn()<bar>call netrw#NetSource(<f-args>)<bar>call netrw#RestorePosn()
74com! -nargs=?		Ntree		call netrw#SetTreetop(<q-args>)
75
76" Commands: :Explore, :Sexplore, Hexplore, Vexplore, Lexplore {{{2
77com! -nargs=* -bar -bang -count=0 -complete=dir	Explore		call netrw#Explore(<count>,0,0+<bang>0,<q-args>)
78com! -nargs=* -bar -bang -count=0 -complete=dir	Sexplore	call netrw#Explore(<count>,1,0+<bang>0,<q-args>)
79com! -nargs=* -bar -bang -count=0 -complete=dir	Hexplore	call netrw#Explore(<count>,1,2+<bang>0,<q-args>)
80com! -nargs=* -bar -bang -count=0 -complete=dir	Vexplore	call netrw#Explore(<count>,1,4+<bang>0,<q-args>)
81com! -nargs=* -bar       -count=0 -complete=dir	Texplore	call netrw#Explore(<count>,0,6        ,<q-args>)
82com! -nargs=* -bar -bang			Nexplore	call netrw#Explore(-1,0,0,<q-args>)
83com! -nargs=* -bar -bang			Pexplore	call netrw#Explore(-2,0,0,<q-args>)
84com! -nargs=* -bar -bang -count=0 -complete=dir Lexplore	call netrw#Lexplore(<count>,<bang>0,<q-args>)
85
86" Commands: NetrwSettings {{{2
87com! -nargs=0	NetrwSettings	call netrwSettings#NetrwSettings()
88com! -bang	NetrwClean	call netrw#Clean(<bang>0)
89
90" Maps:
91if !exists("g:netrw_nogx")
92 if maparg('gx','n') == ""
93  if !hasmapto('<Plug>NetrwBrowseX')
94   nmap <unique> gx <Plug>NetrwBrowseX
95  endif
96  nno <silent> <Plug>NetrwBrowseX :call netrw#BrowseX(expand((exists("g:netrw_gx")? g:netrw_gx : '<cfile>')),netrw#CheckIfRemote())<cr>
97 endif
98 if maparg('gx','v') == ""
99  if !hasmapto('<Plug>NetrwBrowseXVis')
100   vmap <unique> gx <Plug>NetrwBrowseXVis
101  endif
102  vno <silent> <Plug>NetrwBrowseXVis :<c-u>call netrw#BrowseXVis()<cr>
103 endif
104endif
105
106" ---------------------------------------------------------------------
107" LocalBrowse: invokes netrw#LocalBrowseCheck() on directory buffers {{{2
108fun! s:LocalBrowse(dirname)
109  " Unfortunate interaction -- only DechoMsg debugging calls can be safely used here.
110  " Otherwise, the BufEnter event gets triggered when attempts to write to
111  " the DBG buffer are made.
112
113  if !exists("s:vimentered")
114   " If s:vimentered doesn't exist, then the VimEnter event hasn't fired.  It will,
115   " and so s:VimEnter() will then be calling this routine, but this time with s:vimentered defined.
116"   call Dfunc("s:LocalBrowse(dirname<".a:dirname.">)  (s:vimentered doesn't exist)")
117"   call Dret("s:LocalBrowse")
118   return
119  endif
120
121"  call Dfunc("s:LocalBrowse(dirname<".a:dirname.">)  (s:vimentered=".s:vimentered.")")
122
123  if has("amiga")
124   " The check against '' is made for the Amiga, where the empty
125   " string is the current directory and not checking would break
126   " things such as the help command.
127"   call Decho("(LocalBrowse) dirname<".a:dirname.">  (isdirectory, amiga)")
128   if a:dirname != '' && isdirectory(a:dirname)
129    sil! call netrw#LocalBrowseCheck(a:dirname)
130    if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt
131     exe w:netrw_bannercnt
132    endif
133   endif
134
135  elseif isdirectory(a:dirname)
136"   call Decho("(LocalBrowse) dirname<".a:dirname."> ft=".&ft."  (isdirectory, not amiga)")
137"   call Dredir("LocalBrowse ft last set: ","verbose set ft")
138   sil! call netrw#LocalBrowseCheck(a:dirname)
139   if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt
140    exe w:netrw_bannercnt
141   endif
142
143  else
144   " not a directory, ignore it
145"   call Decho("(LocalBrowse) dirname<".a:dirname."> not a directory, ignoring...")
146  endif
147
148"  call Dret("s:LocalBrowse")
149endfun
150
151" ---------------------------------------------------------------------
152" s:VimEnter: after all vim startup stuff is done, this function is called. {{{2
153"             Its purpose: to look over all windows and run s:LocalBrowse() on
154"             them, which checks if they're directories and will create a directory
155"             listing when appropriate.
156"             It also sets s:vimentered, letting s:LocalBrowse() know that s:VimEnter()
157"             has already been called.
158fun! s:VimEnter(dirname)
159"  call Dfunc("s:VimEnter(dirname<".a:dirname.">) expand(%)<".expand("%").">")
160  let curwin       = winnr()
161  let s:vimentered = 1
162  windo call s:LocalBrowse(expand("%:p"))
163  exe curwin."wincmd w"
164"  call Dret("s:VimEnter")
165endfun
166
167" ---------------------------------------------------------------------
168" NetrwStatusLine: {{{1
169fun! NetrwStatusLine()
170"  let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".")
171  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")
172   let &stl= s:netrw_explore_stl
173   if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
174   if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
175   return ""
176  else
177   return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
178  endif
179endfun
180
181" ------------------------------------------------------------------------
182" NetUserPass: set username and password for subsequent ftp transfer {{{1
183"   Usage:  :call NetUserPass()			-- will prompt for userid and password
184"	    :call NetUserPass("uid")		-- will prompt for password
185"	    :call NetUserPass("uid","password") -- sets global userid and password
186fun! NetUserPass(...)
187
188 " get/set userid
189 if a:0 == 0
190"  call Dfunc("NetUserPass(a:0<".a:0.">)")
191  if !exists("g:netrw_uid") || g:netrw_uid == ""
192   " via prompt
193   let g:netrw_uid= input('Enter username: ')
194  endif
195 else	" from command line
196"  call Dfunc("NetUserPass(a:1<".a:1.">) {")
197  let g:netrw_uid= a:1
198 endif
199
200 " get password
201 if a:0 <= 1 " via prompt
202"  call Decho("a:0=".a:0." case <=1:")
203  let g:netrw_passwd= inputsecret("Enter Password: ")
204 else " from command line
205"  call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
206  let g:netrw_passwd=a:2
207 endif
208"  call Dret("NetUserPass")
209endfun
210
211" ------------------------------------------------------------------------
212" Modelines And Restoration: {{{1
213let &cpo= s:keepcpo
214unlet s:keepcpo
215" vim:ts=8 fdm=marker
216