1" netrwPlugin.vim: Handles file transfer and remote directory listing across a network
2"            PLUGIN SECTION
3" Date:		Jan 22, 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 = "v151"
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://*,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://*,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://*,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://*,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://*,https://*,dav://*,davs://*,rsync://*,sftp://*	exe 'Nsource '.fnameescape(expand("<amatch>"))
64 catch /^Vim\%((\a\+)\)\=:E216/
65  au SourcePre   ftp://*,rcp://*,scp://*,http://*,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       	  -complete=dir Lexplore	call netrw#Lexplore(<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") && maparg('gx','n') == ""
92 if !hasmapto('<Plug>NetrwBrowseX')
93  nmap <unique> gx <Plug>NetrwBrowseX
94 endif
95 nno <silent> <Plug>NetrwBrowseX :call netrw#NetrwBrowseX(expand("<cfile>"),0)<cr>
96endif
97
98" ---------------------------------------------------------------------
99" LocalBrowse: invokes netrw#LocalBrowseCheck() on directory buffers {{{2
100fun! s:LocalBrowse(dirname)
101  " Unfortunate interaction -- only DechoMsg debugging calls can be safely used here.
102  " Otherwise, the BufEnter event gets triggered when attempts to write to
103  " the DBG buffer are made.
104
105  if !exists("s:vimentered")
106   " If s:vimentered doesn't exist, then the VimEnter event hasn't fired.  It will,
107   " and so s:VimEnter() will then be calling this routine, but this time with s:vimentered defined.
108"   call Dfunc("s:LocalBrowse(dirname<".a:dirname.">)  (s:vimentered doesn't exist)")
109"   call Dret("s:LocalBrowse")
110   return
111  endif
112
113"  call Dfunc("s:LocalBrowse(dirname<".a:dirname.">)  (s:vimentered=".s:vimentered.")")
114
115  if has("amiga")
116   " The check against '' is made for the Amiga, where the empty
117   " string is the current directory and not checking would break
118   " things such as the help command.
119"   call Decho("(LocalBrowse) dirname<".a:dirname.">  (isdirectory, amiga)")
120   if a:dirname != '' && isdirectory(a:dirname)
121    sil! call netrw#LocalBrowseCheck(a:dirname)
122    if exists("w:netrw_bannercnt")
123     exe w:netrw_bannercnt
124    endif
125   endif
126
127  elseif isdirectory(a:dirname)
128"   call Decho("(LocalBrowse) dirname<".a:dirname."> ft=".&ft."  (isdirectory, not amiga)")
129"   call Dredir("LocalBrowse ft last set: ","verbose set ft")
130   sil! call netrw#LocalBrowseCheck(a:dirname)
131   if exists("w:netrw_bannercnt")
132    exe w:netrw_bannercnt
133   endif
134
135  else
136   " not a directory, ignore it
137"   call Decho("(LocalBrowse) dirname<".a:dirname."> not a directory, ignoring...")
138  endif
139
140"  call Dret("s:LocalBrowse")
141endfun
142
143" ---------------------------------------------------------------------
144" s:VimEnter: after all vim startup stuff is done, this function is called. {{{2
145"             Its purpose: to look over all windows and run s:LocalBrowse() on
146"             them, which checks if they're directories and will create a directory
147"             listing when appropriate.
148"             It also sets s:vimentered, letting s:LocalBrowse() know that s:VimEnter()
149"             has already been called.
150fun! s:VimEnter(dirname)
151"  call Dfunc("s:VimEnter(dirname<".a:dirname.">) expand(%)<".expand("%").">")
152  let curwin       = winnr()
153  let s:vimentered = 1
154  windo call s:LocalBrowse(expand("%:p"))
155  exe curwin."wincmd w"
156"  call Dret("s:VimEnter")
157endfun
158
159" ---------------------------------------------------------------------
160" NetrwStatusLine: {{{1
161fun! NetrwStatusLine()
162"  let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".")
163  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")
164   let &stl= s:netrw_explore_stl
165   if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
166   if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
167   return ""
168  else
169   return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
170  endif
171endfun
172
173" ------------------------------------------------------------------------
174" NetUserPass: set username and password for subsequent ftp transfer {{{1
175"   Usage:  :call NetUserPass()			-- will prompt for userid and password
176"	    :call NetUserPass("uid")		-- will prompt for password
177"	    :call NetUserPass("uid","password") -- sets global userid and password
178fun! NetUserPass(...)
179
180 " get/set userid
181 if a:0 == 0
182"  call Dfunc("NetUserPass(a:0<".a:0.">)")
183  if !exists("g:netrw_uid") || g:netrw_uid == ""
184   " via prompt
185   let g:netrw_uid= input('Enter username: ')
186  endif
187 else	" from command line
188"  call Dfunc("NetUserPass(a:1<".a:1.">) {")
189  let g:netrw_uid= a:1
190 endif
191
192 " get password
193 if a:0 <= 1 " via prompt
194"  call Decho("a:0=".a:0." case <=1:")
195  let g:netrw_passwd= inputsecret("Enter Password: ")
196 else " from command line
197"  call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
198  let g:netrw_passwd=a:2
199 endif
200"  call Dret("NetUserPass")
201endfun
202
203" ------------------------------------------------------------------------
204" Modelines And Restoration: {{{1
205let &cpo= s:keepcpo
206unlet s:keepcpo
207" vim:ts=8 fdm=marker
208