blob: 9f4f91b5afe236acb6285129dea0be968b643bd7 [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002" Last Change: Jun 30, 2004
Bram Moolenaar071d4272004-06-13 20:20:40 +00003" Maintainer: Charles E. Campbell, Jr. PhD <drchipNOSPAM at campbellfamily.biz>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00004" Version: 47g ASTRO-ONLY
Bram Moolenaar071d4272004-06-13 20:20:40 +00005" License: Vim License (see vim's :help license)
6"
7" But be doers of the word, and not only hearers, deluding your own selves
8" (James 1:22 RSV)
9" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
10
Bram Moolenaarf4b8e572004-06-24 15:53:16 +000011" Exit quickly when already loaded or when 'compatible' is set. {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000012if exists("loaded_netrw") || &cp
13 finish
14endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000015let loaded_netrw = "v47g ASTRO-ONLY"
Bram Moolenaar071d4272004-06-13 20:20:40 +000016let s:save_cpo = &cpo
17set cpo&vim
18
19" ---------------------------------------------------------------------
20" Default values for global netrw variables {{{1
21if !exists("g:netrw_ftpmode")
22 let g:netrw_ftpmode= "binary"
23endif
24if !exists("g:netrw_win95ftp")
25 let g:netrw_win95ftp= 1
26endif
27if !exists("g:netrw_cygwin")
28 if has("win32")
29 let g:netrw_cygwin= 1
30 else
31 let g:netrw_cygwin= 0
32 endif
33endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000034if !exists("g:netrw_list_cmd")
35 if executable("ssh")
36 " provide a default listing command
37 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
38 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000039" call Decho("ssh is not executable, can't do remote directory exploring")
Bram Moolenaar843ee412004-06-30 16:16:41 +000040 let g:netrw_list_cmd= ""
41 endif
42endif
43if !exists("g:netrw_rm_cmd")
44 let g:netrw_rm_cmd = "ssh HOSTNAME rm"
45endif
46if !exists("g:netrw_rmf_cmd")
47 let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
48endif
49if !exists("g:netrw_rmdir_cmd")
50 let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
51endif
52if !exists("g:netrw_rename_cmd")
53 let g:netrw_rename_cmd= "ssh HOSTNAME mv"
54endif
55if exists("g:netrw_silent") && g:netrw_silent != 0
56 let g:netrw_silentxfer= "silent "
57else
58 let g:netrw_silentxfer= ""
59endif
60if !exists("g:netrw_winsize")
61 let g:netrw_winsize= ""
62endif
63if !exists("g:netrw_list_hide")
64 let g:netrw_list_hide= ""
65endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000066if !exists("g:netrw_sort_by")
67 " alternatives: date size
68 let g:netrw_sort_by= "name"
69endif
70if !exists("g:netrw_sort_sequence")
71 let g:netrw_sort_sequence= '/$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
72endif
73if !exists("g:netrw_sort_direction")
74 " alternative: reverse (z y x ...)
75 let g:netrw_sort_direction= "normal"
76endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000077
78" ---------------------------------------------------------------------
79" Default values for global protocol variables {{{1
80if !exists("g:netrw_rcp_cmd")
81 let g:netrw_rcp_cmd = "rcp"
82endif
83if !exists("g:netrw_ftp_cmd")
84 let g:netrw_ftp_cmd = "ftp"
85endif
86if !exists("g:netrw_scp_cmd")
87 let g:netrw_scp_cmd = "scp -q"
88endif
89if !exists("g:netrw_sftp_cmd")
90 let g:netrw_sftp_cmd = "sftp"
91endif
92if !exists("g:netrw_http_cmd")
93 if executable("wget")
94 let g:netrw_http_cmd = "wget -q -O"
95 elseif executable("fetch")
96 let g:netrw_http_cmd = "fetch -o"
97 else
98 let g:netrw_http_cmd = ""
99 endif
100endif
101if !exists("g:netrw_dav_cmd")
102 let g:netrw_dav_cmd = "cadaver"
103endif
104if !exists("g:netrw_rsync_cmd")
105 let g:netrw_rsync_cmd = "rsync"
106endif
107if !exists("g:netrw_fetch_cmd")
108 if executable("fetch")
109 let g:netrw_fetch_cmd = "fetch -o"
110 else
111 let g:netrw_fetch_cmd = ""
112 endif
113endif
114
115if has("win32")
116 \ && exists("g:netrw_use_nt_rcp")
117 \ && g:netrw_use_nt_rcp
118 \ && executable( $SystemRoot .'/system32/rcp.exe')
119 let s:netrw_has_nt_rcp = 1
120 let s:netrw_rcpmode = '-b'
121 else
122 let s:netrw_has_nt_rcp = 0
123 let s:netrw_rcpmode = ''
124endif
125
126" ---------------------------------------------------------------------
127" Transparency Support: {{{1
128" Auto-detection for ftp://*, rcp://*, scp://*, sftp://*, http://*, dav://*,
129" and rsync://*
130" Should make file transfers across networks transparent. Currently I haven't
131" supported appends. Hey, gotta leave something for a future <netrw.vim>!
132if version >= 600
133 augroup Network
134 au!
135 if has("win32")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000136 au BufReadCmd file://* exe "silent doau BufReadPre ".expand("<afile>")|exe 'e '.substitute(expand("<afile>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<afile>")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000137 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000138 au BufReadCmd file:///* exe "silent doau BufReadPre ".expand("<afile>")|exe 'e /'.substitute(expand("<afile>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<afile>")
139 au BufReadCmd file://localhost/* exe "silent doau BufReadPre ".expand("<afile>")|exe 'e /'.substitute(expand("<afile>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<afile>")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000140 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000141 au BufReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau BufReadPre ".expand("<afile>")|exe "Nread 0r ".expand("<afile>")|exe "silent doau BufReadPost ".expand("<afile>")
142 au FileReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau BufReadPre ".expand("<afile>")|exe "Nread " .expand("<afile>")|exe "silent doau BufReadPost ".expand("<afile>")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000143 au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "Nwrite " .expand("<afile>")|call <SID>NetRestorePosn()
Bram Moolenaar071d4272004-06-13 20:20:40 +0000144 augroup END
145endif
146
147" ------------------------------------------------------------------------
148" Commands: :Nread, :Nwrite, and :NetUserPass {{{1
149com! -nargs=* Nread call <SID>NetSavePosn()<bar>call <SID>NetRead(<f-args>)<bar>call <SID>NetRestorePosn()
150com! -range=% -nargs=* Nwrite call <SID>NetSavePosn()<bar><line1>,<line2>call <SID>NetWrite(<f-args>)<bar>call <SID>NetRestorePosn()
151com! -nargs=* NetUserPass call NetUserPass(<f-args>)
152
153" ------------------------------------------------------------------------
154" NetSavePosn: saves position of cursor on screen {{{1
155fun! s:NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000156" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000157 " Save current line and column
158 let s:netrw_winnr= winnr()
159 let s:netrw_line = line(".")
160 let s:netrw_col = virtcol(".")
161
162 " Save top-of-screen line
163 norm! H0
164 let s:netrw_hline= line(".")
165
166 call s:NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000167" call Dret("NetSavePosn : winnr=".s:netrw_winnr." line=".s:netrw_line." col=".s:netrw_col." hline=".s:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000168endfun
169
170" ------------------------------------------------------------------------
171" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
172fun! <SID>NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000173" call Dfunc("NetRestorePosn() winnr=".s:netrw_winnr." line=".s:netrw_line." col=".s:netrw_col." hline=".s:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000174
175 exe "silent! ".s:netrw_winnr."wincmd w"
176 if v:shell_error == 0
177 " as suggested by Bram M: redraw on no error
178 " allows protocol error messages to remain visible
179 redraw!
180 endif
181 " restore top-of-screen line
182 exe "norm! ".s:netrw_hline."G0z\<CR>"
183 " restore position
184 exe "norm! ".s:netrw_line."G0".s:netrw_col."\<bar>"
185
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000186" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000187endfun
188
189" ------------------------------------------------------------------------
190" NetRead: responsible for reading a file over the net {{{1
191fun! s:NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000192" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000193
194 " save options
195 call s:NetOptionSave()
196
197 " Special Exception: if a file is named "0r", then
198 " "0r" will be used to read the
199 " following files instead of "r"
200 if a:0 == 0
201 let readcmd= "r"
202 let ichoice= 0
203 elseif a:1 == "0r"
204 let readcmd = "0r"
205 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000206 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000207 let readcmd = "r"
208 let ichoice = 1
209 endif
210
211 " get name of a temporary file
212 let tmpfile= tempname()
213
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000214" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000215 while ichoice <= a:0
216
217 " attempt to repeat with previous host-file-etc
218 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000219" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000220 let choice = b:netrw_lastfile
221 let ichoice= ichoice + 1
222
223 else
224 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000225" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000226
227 " Reconstruct Choice if choice starts with '"'
228 if match(choice,"?") == 0
229 echo 'NetRead Usage:'
230 echo ':Nread machine:path uses rcp'
231 echo ':Nread "machine path" uses ftp with <.netrc>'
232 echo ':Nread "machine id password path" uses ftp'
233 echo ':Nread dav://machine[:port]/path uses cadaver'
234 echo ':Nread fetch://machine/path uses fetch'
235 echo ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
236 echo ':Nread http://[user@]machine/path uses http wget'
237 echo ':Nread rcp://[user@]machine/path uses rcp'
238 echo ':Nread rsync://machine[:port]/path uses rsync'
239 echo ':Nread scp://[user@]machine[[:#]port]/path uses scp'
240 echo ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
241 break
242 elseif match(choice,"^\"") != -1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000243" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000244 if match(choice,"\"$") != -1
245 " case "..."
246 let choice=strpart(choice,1,strlen(choice)-2)
247 else
248 " case "... ... ..."
249 let choice = strpart(choice,1,strlen(choice)-1)
250 let wholechoice = ""
251
252 while match(choice,"\"$") == -1
253 let wholechoice = wholechoice . " " . choice
254 let ichoice = ichoice + 1
255 if ichoice > a:0
256 echoerr "Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000257" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000258 return
259 endif
260 let choice= a:{ichoice}
261 endwhile
262 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
263 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000264 endif
265 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000266
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000267" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000268 let ichoice= ichoice + 1
269
270 " fix up windows urls
271 if has("win32")
272 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000273" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000274
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000275 exe 'lcd ' . fnamemodify(tmpfile,':h')
276 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000277 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000278
279 " Determine method of read (ftp, rcp, etc)
280 call s:NetMethod(choice)
281
Bram Moolenaar843ee412004-06-30 16:16:41 +0000282 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000283" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000284 if choice =~ "^.*/$"
285 if strlen(g:netrw_list_cmd) > 0
Bram Moolenaar843ee412004-06-30 16:16:41 +0000286 keepjumps call s:NetBrowse(choice)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000287" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000288 else
289 echoerr "sorry, can't do a remote listing; ssh isn't executable"
290 endif
291 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000292 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000293
294 " ============
295 " Perform Read
296 " ============
297
298 ".........................................
299 " rcp: NetRead Method #1
300 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000301" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000302 " ER: noting done with g:netrw_uid yet?
303 " ER: on Win2K" rcp machine[.user]:file tmpfile
304 " ER: if machine contains '.' adding .user is required (use $USERNAME)
305 " ER: the tmpfile is full path: rcp sees C:\... as host C
306 if s:netrw_has_nt_rcp == 1
307 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
308 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
309 else
310 " Any way needed it machine contains a '.'
311 let uid_machine = g:netrw_machine .'.'. $USERNAME
312 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000313 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000314 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
315 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
316 else
317 let uid_machine = g:netrw_machine
318 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000319 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000320" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000321 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
322 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
323 let b:netrw_lastfile = choice
324
325 ".........................................
326 " ftp + <.netrc>: NetRead Method #2
327 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000328" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000329 let netrw_fname= b:netrw_fname
330 new
331 set ff=unix
332 exe "put ='".g:netrw_ftpmode."'"
333 exe "put ='get ".netrw_fname." ".tmpfile."'"
334 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000335" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000336 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
337 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000338" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000339 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
340 endif
341 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
342 if getline(1) !~ "^$"
343 echoerr getline(1)
344 endif
345 bd!
346 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
347 let b:netrw_lastfile = choice
348
349 ".........................................
350 " ftp + machine,id,passwd,filename: NetRead Method #3
351 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
352 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000353" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000354 let netrw_fname= b:netrw_fname
355 new
356 set ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000357 if exists("g:netrw_port") && g:netrw_port != ""
358 put ='open '.g:netrw_machine.' '.g:netrw_port
359 else
360 put ='open '.g:netrw_machine
361 endif
362
363 if exists("g:netrw_ftp") && g:netrw_ftp == 1
364 put =g:netrw_uid
365 put =g:netrw_passwd
366 else
367 put ='user '.g:netrw_uid.' '.g:netrw_passwd
368 endif
369
370 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
371 put =g:netrw_ftpmode
372 endif
373 put ='get '.netrw_fname.' '.tmpfile
374
375 " perform ftp:
376 " -i : turns off interactive prompting from ftp
377 " -n unix : DON'T use <.netrc>, even though it exists
378 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000379" call Decho('performing ftp -i -n')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000380 norm 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000381" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000382 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
383 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
384 if getline(1) !~ "^$"
385 echoerr getline(1)
386 endif
387 bd!
388 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
389 let b:netrw_lastfile = choice
390
391 ".........................................
392 " scp: NetRead Method #4
393 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000394" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000395 if exists("g:netrw_port") && g:netrw_port != ""
396 let useport= " -P ".g:netrw_port
397 else
398 let useport= ""
399 endif
400 if g:netrw_cygwin == 1
401 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000402" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000403 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
404 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000405" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000406 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
407 endif
408 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
409 let b:netrw_lastfile = choice
410
411 ".........................................
412 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000413" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000414 if g:netrw_http_cmd == ""
415 echoerr "neither wget nor fetch command is available"
416 exit
417 endif
418
419 if match(b:netrw_fname,"#") == -1
420 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000421" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000422 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
423 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
424
425 else
426 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
427 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
428 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000429" call Decho("netrw_html<".netrw_html.">")
430" call Decho("netrw_tag <".netrw_tag.">")
431" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000432 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
433 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000434" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000435 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
436 endif
437 let b:netrw_lastfile = choice
438
439 ".........................................
440 " cadaver: NetRead Method #6
441 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000442" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000443
444 " Construct execution string (four lines) which will be passed through filter
445 let netrw_fname= b:netrw_fname
446 new
447 set ff=unix
448 if exists("g:netrw_port") && g:netrw_port != ""
449 put ='open '.g:netrw_machine.' '.g:netrw_port
450 else
451 put ='open '.g:netrw_machine
452 endif
453 put ='user '.g:netrw_uid.' '.g:netrw_passwd
454
455 if g:netrw_cygwin == 1
456 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
457 put ='get '.netrw_fname.' '.cygtmpfile
458 else
459 put ='get '.netrw_fname.' '.tmpfile
460 endif
461
462 " perform cadaver operation:
463 norm 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000464" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000465 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
466 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000467 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000468 let b:netrw_lastfile = choice
469
470 ".........................................
471 " rsync: NetRead Method #7
472 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000473" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000474 if g:netrw_cygwin == 1
475 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000476" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000477 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
478 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000479" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000480 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
481 endif
482 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
483 let b:netrw_lastfile = choice
484
485 ".........................................
486 " fetch: NetRead Method #8
487 " fetch://[user@]host[:http]/path
488 elseif b:netrw_method == 8 " read with fetch
489 if g:netrw_fetch_cmd == ""
490 echoerr "fetch command not available"
491 exit
492 endif
493 if exists("g:netrw_option") && g:netrw_option == ":http"
494 let netrw_option= "http"
495 else
496 let netrw_option= "ftp"
497 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000498" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000499
500 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000501" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000502 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
503 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000504" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000505 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
506 endif
507
508 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
509 let b:netrw_lastfile = choice
510
511 ".........................................
512 " sftp: NetRead Method #9
513 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000514" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000515 if g:netrw_cygwin == 1
516 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000517" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
518" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000519 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
520 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000521" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000522 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
523 endif
524 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
525 let b:netrw_lastfile = choice
526
527 ".........................................
528 else " Complain
529 echo "***warning*** unable to comply with your request<" . choice . ">"
530 endif
531 endwhile
532
533 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000534" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000535 if exists("b:netrw_method")
536 unlet b:netrw_method
537 unlet g:netrw_machine
538 unlet b:netrw_fname
539 endif
540 call s:NetOptionRestore()
541
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000542" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000543endfun
544" end of NetRead
545
546" ------------------------------------------------------------------------
547" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
548fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000549" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000550
551 if exists("*NetReadFixup")
552 " for the use of NetReadFixup (not otherwise used internally)
553 let line2= line("$")
554 endif
555
556 " transform paths from / to \ for Windows, unless the shell is bash
557 if &term == "win32"
558 if &shell == "bash"
559 let fname=a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000560" call Decho("(win32 && bash) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000561 else
562 let fname=substitute(a:fname,'/','\\\\','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000563" call Decho("(win32 && !bash) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000564 endif
565 else
566 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000567" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000568 endif
569
570 " get the file, but disable undo when reading a new buffer
571 if a:readcmd[0] == '0'
572 let use_e_cmd = 0 " 1 when using ':edit'
573 let delline = 0 " 1 when have to delete empty last line
574 if line("$") == 1 && getline(1) == ""
575 " Now being asked to 0r a file into an empty file.
576 " Safe to :e it instead, unless there is another window on the same buffer.
577 let curbufnr = bufnr("%")
578 let use_e_cmd = 1
579 let delline = 1
580 " Loop over all windows,
581 " reset use_e_cmd when another one is editing the current buffer.
582 let i = 1
583 while 1
584 if i != winnr() && winbufnr(i) == curbufnr
585 let use_e_cmd = 0
586 break
587 endif
588 let i = i + 1
589 if winbufnr(i) < 0
590 break
591 endif
592 endwhile
593 endif
594
595 if use_e_cmd > 0
596 " ':edit' the temp file, wipe out the old buffer and rename the buffer
597 let curfilename = expand("%")
598
599 let binlocal = &l:bin
600 let binglobal = &g:bin
601 if binlocal
602 setglobal bin " Need to set 'bin' globally for ":e" command.
603 endif
604 silent exe "e! ".v:cmdarg." ".fname
605 if binlocal && !binglobal
606 setglobal nobin
607 setlocal bin
608 endif
609
610 exe curbufnr . "bwipe!"
611 exe "f ".curfilename
612 " the ":f newname" apparently leaves the temporary file as the alternate
613 " file in the buffer list (see :ls!). The following command wipes it out.
614 exe bufnr("#")."bwipe!"
615 else
616 let oldul= &ul
617 set ul=-1
618 exe a:readcmd." ".v:cmdarg." ".fname
619 if delline > 0
620 " wipe out last line, which should be a blank line anyway
621 $del
622 endif
623 let &ul= oldul
624 endif
625 elseif filereadable(fname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000626" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000627 exe a:readcmd." ".v:cmdarg." ".fname
628 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000629" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000630 return
631 endif
632
633 " User-provided (ie. optional) fix-it-up command
634 if exists("*NetReadFixup")
635 let line1= line(".")
636 if a:readcmd == "r"
637 let line2= line("$") - line2 + line1
638 else
639 let line2= line("$") - line2
640 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000641" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000642 call NetReadFixup(a:method, line1, line2)
643 endif
644
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000645" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000646
647 " insure that we have the right filetype and that its being displayed
648 filetype detect
649 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000650" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000651endfun
652
653" ------------------------------------------------------------------------
654" NetWrite: responsible for writing a file over the net {{{1
655fun! s:NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000656" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000657
658 " option handling
659 let mod= 0
660 call s:NetOptionSave()
661
662 " Get Temporary Filename
663 let tmpfile= tempname()
664
665 if a:0 == 0
666 let ichoice = 0
667 else
668 let ichoice = 1
669 endif
670
671 " write (selected portion of) file to temporary
672 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
673
674 while ichoice <= a:0
675
676 " attempt to repeat with previous host-file-etc
677 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000678" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000679 let choice = b:netrw_lastfile
680 let ichoice= ichoice + 1
681 else
682 exe "let choice= a:" . ichoice
683
684 " Reconstruct Choice if choice starts with '"'
685 if match(choice,"?") == 0
686 echo 'NetWrite Usage:"'
687 echo ':Nwrite machine:path uses rcp'
688 echo ':Nwrite "machine path" uses ftp with <.netrc>'
689 echo ':Nwrite "machine id password path" uses ftp'
690 echo ':Nwrite dav://[user@]machine/path uses cadaver'
691 echo ':Nwrite fetch://[user@]machine/path uses fetch'
692 echo ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
693 echo ':Nwrite rcp://machine/path uses rcp'
694 echo ':Nwrite rsync://[user@]machine/path uses rsync'
695 echo ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
696 echo ':Nwrite sftp://[user@]machine/path uses sftp'
697 break
698
699 elseif match(choice,"^\"") != -1
700 if match(choice,"\"$") != -1
701 " case "..."
702 let choice=strpart(choice,1,strlen(choice)-2)
703 else
704 " case "... ... ..."
705 let choice = strpart(choice,1,strlen(choice)-1)
706 let wholechoice = ""
707
708 while match(choice,"\"$") == -1
709 let wholechoice= wholechoice . " " . choice
710 let ichoice = ichoice + 1
711 if choice > a:0
712 echoerr "Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000713" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000714 return
715 endif
716 let choice= a:{ichoice}
717 endwhile
718 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
719 endif
720 endif
721 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000722" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000723 let ichoice= ichoice + 1
724
725 " fix up windows urls
726 if has("win32")
727 let choice= substitute(choice,'\\','/','ge')
728 "ER: see NetRead()
729 exe 'lcd ' . fnamemodify(tmpfile,':h')
730 let tmpfile = fnamemodify(tmpfile,':t')
731 endif
732
733 " Determine method of read (ftp, rcp, etc)
734 call s:NetMethod(choice)
735
736 " =============
737 " Perform Write
738 " =============
739
740 ".........................................
741 " rcp: NetWrite Method #1
742 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000743" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000744 if s:netrw_has_nt_rcp == 1
745 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
746 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
747 else
748 let uid_machine = g:netrw_machine .'.'. $USERNAME
749 endif
750 else
751 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
752 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
753 else
754 let uid_machine = g:netrw_machine
755 endif
756 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000757" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000758 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
759 let b:netrw_lastfile = choice
760
761 ".........................................
762 " ftp + <.netrc>: NetWrite Method #2
763 elseif b:netrw_method == 2 " write with ftp + <.netrc>
764 let netrw_fname = b:netrw_fname
765 new
766 set ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000767 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000768" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000769 exe "put ='put ".tmpfile." ".netrw_fname."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000770" call Decho("put ='put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000771 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000772" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000773 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000774 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000775" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000776 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000777 endif
778 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
779 if getline(1) !~ "^$"
780 echoerr getline(1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000781 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000782 endif
783 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000784 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000785
786 ".........................................
787 " ftp + machine, id, passwd, filename: NetWrite Method #3
788 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
789 let netrw_fname= b:netrw_fname
790 new
791 set ff=unix
792 if exists("g:netrw_port") && g:netrw_port != ""
793 put ='open '.g:netrw_machine.' '.g:netrw_port
794 else
795 put ='open '.g:netrw_machine
796 endif
797 if exists("g:netrw_ftp") && g:netrw_ftp == 1
798 put =g:netrw_uid
799 put =g:netrw_passwd
800 else
801 put ='user '.g:netrw_uid.' '.g:netrw_passwd
802 endif
803 put ='put '.tmpfile.' '.netrw_fname
804 " save choice/id/password for future use
805 let b:netrw_lastfile = choice
806
807 " perform ftp:
808 " -i : turns off interactive prompting from ftp
809 " -n unix : DON'T use <.netrc>, even though it exists
810 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000811" call Decho('performing ftp -i -n')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000812 norm 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000813" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000814 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
815 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
816 if getline(1) !~ "^$"
817 echoerr getline(1)
818 let mod=1
819 endif
820 bd!
821
822 ".........................................
823 " scp: NetWrite Method #4
824 elseif b:netrw_method == 4 " write with scp
825 if exists("g:netrw_port") && g:netrw_port != ""
826 let useport= " -P ".g:netrw_port
827 else
828 let useport= ""
829 endif
830 if g:netrw_cygwin == 1
831 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000832" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000833 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
834 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000835" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000836 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
837 endif
838 let b:netrw_lastfile = choice
839
840 ".........................................
841 " http: NetWrite Method #5
842 elseif b:netrw_method == 5
843 echoerr "***warning*** currently <netrw.vim> does not support writing using http:"
844
845 ".........................................
846 " dav: NetWrite Method #6
847 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000848" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000849
850 " Construct execution string (four lines) which will be passed through filter
851 let netrw_fname= b:netrw_fname
852 new
853 set ff=unix
854 if exists("g:netrw_port") && g:netrw_port != ""
855 put ='open '.g:netrw_machine.' '.g:netrw_port
856 else
857 put ='open '.g:netrw_machine
858 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000859 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000860
861 if g:netrw_cygwin == 1
862 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
863 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000864 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000865 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000866 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000867
868 " perform cadaver operation:
869 norm 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000870" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000871 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
872 bd!
873 let b:netrw_lastfile = choice
874
875 ".........................................
876 " rsync: NetWrite Method #7
877 elseif b:netrw_method == 7 " write with rsync
878 if g:netrw_cygwin == 1
879 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000880" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000881 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000882 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000883" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000884 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000885 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000886 let b:netrw_lastfile = choice
887
888 ".........................................
889 " scp: NetWrite Method #9
890 elseif b:netrw_method == 9 " write with sftp
891 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000892 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
893 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
894 else
895 let uid_machine = g:netrw_machine
896 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000897 new
898 set ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000899 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000900 norm 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000901" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000902 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
903 bd!
904 let b:netrw_lastfile= choice
905
906 ".........................................
907 else " Complain
908 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000909 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000910 endwhile
911
912 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000913" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000914 let result=delete(tmpfile)
915 call s:NetOptionRestore()
916
917 if a:firstline == 1 && a:lastline == line("$")
918 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +0000919 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000920
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000921" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000922endfun
923" end of NetWrite
924
925" ------------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000926" Browsing Support For Remote Directories And Files: {{{1
Bram Moolenaar843ee412004-06-30 16:16:41 +0000927" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000928" of the contents of a remote directory. It is assumed that the
929" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
930" with the requested remote hostname first.
Bram Moolenaar843ee412004-06-30 16:16:41 +0000931fun! <SID>NetBrowse(dirname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000932" call Dfunc("NetBrowse(dirname<".a:dirname.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +0000933
934 " sanity check
935 if !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
936 echoerr "***netrw*** this system doesn't support remote directory listing"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000937" call Dret("NetBrowse 0")
Bram Moolenaar843ee412004-06-30 16:16:41 +0000938 return 0
939 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000940
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000941 " make this buffer modifiable
942 setlocal ma
943
944 " analyze a:dirname and g:netrw_list_cmd
945 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
946 if a:dirname !~ dirpat
Bram Moolenaar843ee412004-06-30 16:16:41 +0000947 echoerr "NetBrowse: I don't understand your dirname<".a:dirname.">"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000948" call Dret("NetBrowse 0 : badly formatted dirname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000949 return 0
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000950 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000951 let method = substitute(a:dirname,dirpat,'\1','')
952 let user = substitute(a:dirname,dirpat,'\2','')
953 let machine = substitute(a:dirname,dirpat,'\3','')
954 let path = substitute(a:dirname,dirpat,'\4','')
955 let fname = substitute(a:dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000956" call Decho("set up method <".method .">")
957" call Decho("set up user <".user .">")
958" call Decho("set up machine<".machine.">")
959" call Decho("set up path <".path .">")
960" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000961
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000962 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
963
964 " optionally sort by time (-t) or by size (-S)
965 if g:netrw_sort_by =~ "^t"
966 let listcmd= listcmd."t"
967 elseif g:netrw_sort_by =~ "^s"
968 let listcmd= listcmd."S"
969 endif
970 " optionally sort in reverse
971 if g:netrw_sort_direction =~ "^r"
972 let listcmd= listcmd."r"
973 endif
974
975" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000976
977 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000978" call Decho("attempt transfer of symlink as file")
Bram Moolenaar843ee412004-06-30 16:16:41 +0000979 call s:NetBrowse(substitute(a:dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000980 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000981" call Dret("NetBrowse 0 : symlink")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000982 return 0
983
984 elseif fname !~ '/$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000985 " looks like a regular file, attempt transfer
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000986" call Decho("attempt transfer as regular file<".a:dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000987
988 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000989 " "this is a directory" indicator (/). There shouldn't be one of those,
990 " anyway.
991 let path= substitute(path,'[*=@|]$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000992" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000993
994 " remote-read the requested file into current buffer
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000995 enew!
Bram Moolenaar843ee412004-06-30 16:16:41 +0000996 exe "file ".method."://".user.machine."/".path
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000997 exe "silent doau BufReadPre ".fname
Bram Moolenaar843ee412004-06-30 16:16:41 +0000998 silent call s:NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000999 exe "silent doau BufReadPost ".fname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001000 1d
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001001 set nomod
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001002
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001003" call Dret("NetBrowse 0 : file<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001004 return 0
1005 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001006
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001007 " ---------------------------------------------------------------------
1008 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001009" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001010 " set up new buffer and map
1011 let bufname = method.'://'.user.machine.'/'.path
1012 let bufnamenr = bufnr(bufname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001013" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001014 if bufnamenr != -1
1015 " buffer already exists, switch to it!
1016 exe "b ".bufnamenr
1017 if line("$") >= 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001018" call Dret("NetBrowse 1")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001019 return 1
1020 endif
1021 else
1022 enew!
1023 endif
1024 setlocal bt=nofile bh=wipe nobl
1025 exe 'file '.bufname
1026 set bt=nowrite bh=hide nobl
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001027 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),expand("<cWORD>")))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001028 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
1029 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
1030 nnoremap <buffer> <silent> a :let g:netrw_list_showall=1<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001031 nnoremap <buffer> <silent> h :call <SID>NetHideEdit()<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001032 nnoremap <buffer> <silent> o :exe g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),expand("<cWORD>")))<cr>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001033 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),expand("<cWORD>")))<cr>
1034 nnoremap <buffer> <silent> s :let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name'<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001035 nnoremap <buffer> <silent> v :exe g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),expand("<cWORD>")))<cr>
1036 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),expand("<cWORD>")))<cr>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001037 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),expand("<cWORD>")))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001038 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1039 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1040 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1041 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1042 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
1043 nnoremap <buffer> ? :he netrw-dir<cr>
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001044 setlocal ma
1045
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001046 " Set up the banner
1047" call Decho("executing: r! ".listcmd." '".path."'")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001048 keepjumps put ='\" =============================='
1049 keepjumps put ='\" Netrw Remote Directory Listing'
1050 keepjumps put ='\" '.bufname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001051 let g:netrw_bannercnt= 6
1052 if g:netrw_sort_by =~ "^n"
1053 " sorted by name
1054 let g:netrw_bannercnt= g:netrw_bannercnt + 1
1055 keepjumps put ='\" Sorted by '.g:netrw_sort_by
1056 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1057 else
1058 " sorted by size or date
1059 keepjumps put ='\" Sorted by '.g:netrw_sort_by
1060 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001061 if g:netrw_list_hide != "" && !exists("g:netrw_list_showall")
1062 keepjumps put ='\" Hiding: '.g:netrw_list_hide
1063 let g:netrw_bannercnt= g:netrw_bannercnt + 1
1064 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001065 keepjumps put ='\" =============================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001066
1067 " remote read the requested directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001068 exe "silent r! ".listcmd." '".path."'"
1069 keepjumps 1d
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001070
1071 " manipulate the directory listing (hide, sort)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001072 set ft=netrwlist
Bram Moolenaar843ee412004-06-30 16:16:41 +00001073 if line("$") >= g:netrw_bannercnt
1074 if !exists("g:netrw_list_showall")
1075 if g:netrw_list_hide != ""
1076 call s:NetrwListHide()
1077 endif
1078 else
1079 unlet g:netrw_list_showall
1080 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001081 if g:netrw_sort_by =~ "^n"
1082 call s:SetSort()
1083 exe 'keepjumps silent '.g:netrw_bannercnt.',$call s:NetSort()'
1084 exe 'keepjumps silent '.g:netrw_bannercnt.',$s/^\d\{3}\///e'
1085 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001086 endif
1087 let prvbuf= bufnr(bufname)
1088 if prvbuf != -1
1089 exe "silent! b ".prvbuf
1090 endif
1091
1092 setlocal noma nomod
1093
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001094" call Dret("NetBrowse 1")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001095 return 1
1096endfun
1097
1098" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001099" NetBrowseChgDir: {{{2
1100fun! <SID>NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001101" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001102
1103 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001104 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001105
1106 if newdir !~ '/$'
1107 " handling a file
1108 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001109" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001110
1111 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001112 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001113" call Decho("refresh directory listing")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001114 set ma
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001115 %d
1116
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001117 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001118 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001119 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001120
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001121 if trailer =~ '^\%(\.\./\)*$'
1122 " tack on a ../"
1123 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001124
1125 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001126 " strip off a directory name from dirname
1127 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001128 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001129" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001130
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001131 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001132 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001133 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001134" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001135 endif
1136
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001137" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001138 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001139endfun
1140
Bram Moolenaar843ee412004-06-30 16:16:41 +00001141" ---------------------------------------------------------------------
1142" NetBrowseRm: remove a remote file or directory {{{2
1143fun! <SID>NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001144" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1145" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001146
1147 " preparation for removing multiple files/directories
1148 let ctr= a:firstline
1149
1150 " remove multiple files and directories
1151 while ctr <= a:lastline
1152 exe ctr
1153
1154 norm! 0
1155 let rmfile= a:path.expand("<cWORD>")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001156" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001157
1158 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '/$')
1159 " attempt to remove file
1160 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' '.rmfile
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001161" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001162 call inputsave()
1163 let ok= input("Confirm deletion of file<".rmfile."> ","y")
1164 call inputrestore()
1165 if ok == "y"
1166 let ret= system(netrw_rm_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001167" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001168 endif
1169
1170 else
1171 " attempt to remove directory
1172 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '.rmfile
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001173" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001174 call inputsave()
1175 let ok= input("Confirm deletion of directory<".rmfile."> ","y")
1176 call inputrestore()
1177
1178 if ok == "y"
1179 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001180" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001181
1182 if v:shell_error != 0
1183 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'/$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001184" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001185 let ret= system(netrw_rmf_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001186" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001187
1188 if v:shell_error != 0
1189 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
1190 endif
1191 endif
1192 endif
1193 endif
1194
1195 let ctr= ctr + 1
1196 endwhile
1197
1198 " refresh the directory
1199 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001200" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001201 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1202 exe curline
1203
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001204" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001205endfun
1206
1207" ---------------------------------------------------------------------
1208" NetBrowseRename: rename a remote file or directory {{{2
1209fun! <SID>NetBrowseRename(usrhost,path)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001210" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001211
1212 " preparation for removing multiple files/directories
1213 let ctr = a:firstline
1214 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1215
1216 " attempt to rename files/directories
1217 while ctr <= a:lastline
1218 exe ctr
1219
1220 norm! 0
1221 let oldname= a:path.expand("<cWORD>")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001222" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001223
1224 call inputsave()
1225 let newname= input("Moving ".a:usrhost."'s ".oldname." to : ",oldname)
1226 call inputrestore()
1227
1228 let ret= system(rename_cmd." ".oldname." ".newname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001229" call Decho("executing system(".rename_cmd." ".oldname." ".newname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001230
1231 let ctr= ctr + 1
1232 endwhile
1233
1234 " refresh the directory
1235 let curline= line(".")
1236 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1237 exe curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001238" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001239endfun
1240
1241" ---------------------------------------------------------------------
1242" NetBrowseX: allows users to write custom functions to operate on {{{2
1243" files given their extension
1244fun! <SID>NetBrowseX(fname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001245" call Dfunc("NetBrowseX(".a:fname.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001246
1247 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001248" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar843ee412004-06-30 16:16:41 +00001249 if exten != "" && exists("*NetrwFileHandler_".exten)
1250 exe "call NetrwFileHandler_".exten.'("'.a:fname.'")'
1251 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001252" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001253endfun
1254
1255" ---------------------------------------------------------------------
1256" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1257" separated patterns given in g:netrw_list_hide
1258fun! <SID>NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001259" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001260
1261 let listhide= g:netrw_list_hide
1262 while listhide != ""
1263 if listhide =~ ','
1264 let hide = substitute(listhide,',.*$','','e')
1265 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1266 else
1267 let hide = listhide
1268 let listhide= ""
1269 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001270" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001271 exe 'keepjumps silent '.g:netrw_bannercnt.',$g~'.hide.'~d'
1272 endwhile
1273
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001274" call Dret("NetrwListHide")
1275endfun
1276
1277" ---------------------------------------------------------------------
1278" NetHideEdit: allows user to edit the file/directory hiding list
1279fun! <SID>NetHideEdit()
1280" call Dfunc("NetHideEdit()")
1281
1282 call inputsave()
1283 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1284 call inputrestore()
1285
1286 " refresh the listing
1287 let g:netrw_list_hide= newhide
1288 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1289
1290" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001291endfun
1292
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001293" ------------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00001294" NetMethod: determine method of transfer {{{1
1295" method == 1: rcp
1296" 2: ftp + <.netrc>
1297" 3: ftp + machine, id, password, and [path]filename
1298" 4: scp
1299" 5: http (wget)
1300" 6: cadaver
1301" 7: rsync
1302" 8: fetch
1303" 9: sftp
1304fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001305" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001306
1307 " initialization
1308 let b:netrw_method = 0
1309 let g:netrw_machine = ""
1310 let b:netrw_fname = ""
1311 let g:netrw_port = ""
1312
1313 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001314 " mipf : a:machine a:id password filename Use ftp
1315 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001316 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001317 " rcpurm : rcp://[user@]host/filename Use rcp
1318 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001319 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001320 " httpurm : http://[user@]host/filename Use wget
1321 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001322 " rsyncurm : rsync://host[:port]/path Use rsync
1323 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
1324 " sftpurm : sftp://[user@]host/filename Use scp
1325 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
1326 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
1327 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
1328 let rcpurm = '^rcp://\(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
1329 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
1330 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
1331 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001332 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001333 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
1334 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1335 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
1336
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001337" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001338 " Determine Method
1339 " rcp://user@hostname/...path-to-file
1340 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001341" call Decho("rcp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001342 let b:netrw_method = 1
1343 let userid = substitute(a:choice,rcpurm,'\2',"")
1344 let g:netrw_machine= substitute(a:choice,rcpurm,'\3',"")
1345 let b:netrw_fname = substitute(a:choice,rcpurm,'\4',"")
1346 if userid != ""
1347 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00001348 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001349
1350 " scp://user@hostname/...path-to-file
1351 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001352" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001353 let b:netrw_method = 4
1354 let g:netrw_machine= substitute(a:choice,scpurm,'\1',"")
1355 let b:netrw_port = substitute(a:choice,scpurm,'\2',"")
1356 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
1357
1358 " http://user@hostname/...path-to-file
1359 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001360" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001361 let b:netrw_method = 5
1362 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
1363 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
1364
1365 " dav://hostname[:port]/..path-to-file..
1366 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001367" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001368 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001369 if a:choice =~ '^s'
1370 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
1371 else
1372 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
1373 endif
1374 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001375
1376 " rsync://user@hostname/...path-to-file
1377 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001378" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001379 let b:netrw_method = 7
1380 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
1381 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
1382
1383 " ftp://[user@]hostname[[:#]port]/...path-to-file
1384 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001385" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001386 let userid = substitute(a:choice,ftpurm,'\2',"")
1387 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
1388 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
1389 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
1390 if g:netrw_port != ""
1391 let g:netrw_port = substitute(g:netrw_port,"[#:]","","")
1392 endif
1393 if userid != ""
1394 let g:netrw_uid= userid
1395 endif
1396 if exists("g:netrw_uid") && exists("g:netrw_passwd")
1397 let b:netrw_method = 3
1398 else
1399 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
1400 let b:netrw_method= 2
1401 else
1402 if !exists("g:netrw_uid") || g:netrw_uid == ""
1403 call NetUserPass()
1404 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
1405 call NetUserPass(g:netrw_uid)
1406 " else just use current g:netrw_uid and g:netrw_passwd
1407 endif
1408 let b:netrw_method= 3
1409 endif
1410 endif
1411
1412 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001413" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001414 let b:netrw_method = 8
1415 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
1416 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
1417 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
1418 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
1419
1420 " Issue an ftp : "machine id password [path/]filename"
1421 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001422" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001423 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001424 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
1425 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
1426 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
1427 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
1428
1429 " Issue an ftp: "hostname [path/]filename"
1430 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001431" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001432 if exists("g:netrw_uid") && exists("g:netrw_passwd")
1433 let b:netrw_method = 3
1434 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1435 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1436
1437 elseif filereadable(expand("$HOME/.netrc"))
1438 let b:netrw_method = 2
1439 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1440 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1441 endif
1442
1443 " sftp://user@hostname/...path-to-file
1444 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001445" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001446 let b:netrw_method = 9
1447 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
1448 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
1449
1450 " Issue an rcp: hostname:filename" (this one should be last)
1451 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001452" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001453 let b:netrw_method = 1
1454 let userid = substitute(a:choice,rcphf,'\2',"")
1455 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
1456 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001457" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1458" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1459" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1460" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001461 if userid != ""
1462 let g:netrw_uid= userid
1463 endif
1464 if has("win32")
1465 " don't let PCs try <.netrc>
1466 let b:netrw_method = 3
1467 endif
1468
1469 else
1470 echoerr "***error*** cannot determine method"
1471 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001472 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001473
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001474" call Decho("a:choice <".a:choice.">")
1475" call Decho("b:netrw_method <".b:netrw_method.">")
1476" call Decho("g:netrw_machine<".g:netrw_machine.">")
1477" call Decho("g:netrw_port <".g:netrw_port.">")
1478" if exists("g:netrw_uid") "Decho
1479" call Decho("g:netrw_uid <".g:netrw_uid.">")
1480" endif "Decho
1481" if exists("g:netrw_passwd") "Decho
1482" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
1483" endif "Decho
1484" call Decho("b:netrw_fname <".b:netrw_fname.">")
1485" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001486endfun
1487" end of NetMethod
1488
1489" ------------------------------------------------------------------------
1490" NetUserPass: set username and password for subsequent ftp transfer {{{1
1491" Usage: :call NetUserPass() -- will prompt for userid and password
1492" :call NetUserPass("uid") -- will prompt for password
1493" :call NetUserPass("uid","password") -- sets global userid and password
1494fun! NetUserPass(...)
1495
1496 " get/set userid
1497 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001498" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001499 if !exists("g:netrw_uid") || g:netrw_uid == ""
1500 " via prompt
1501 let g:netrw_uid= input('Enter username: ')
1502 endif
1503 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001504" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001505 let g:netrw_uid= a:1
1506 endif
1507
1508 " get password
1509 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001510" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001511 let g:netrw_passwd= inputsecret("Enter Password: ")
1512 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001513" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001514 let g:netrw_passwd=a:2
1515 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001516" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001517endfun
1518" end NetUserPass
1519
1520" ------------------------------------------------------------------------
1521" NetOptionSave: save options and set to "standard" form {{{1
1522fun!s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001523" call Dfunc("NetOptionSave()")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001524
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001525 " Get Temporary Filename
1526 let s:aikeep = &ai
1527 let s:cinkeep = &cin
1528 let s:cinokeep = &cino
1529 let s:comkeep = &com
1530 let s:cpokeep = &cpo
1531 let s:dirkeep = getcwd()
1532 let s:gdkeep = &gd
1533 let s:twkeep = &tw
1534 set cino =
1535 set com =
1536 set cpo -=aA
1537 set nocin noai
1538 set tw =0
1539 if has("win32") && !has("win95")
1540 let s:swfkeep= &swf
1541 set noswf
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001542" call Decho("setting s:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001543 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001544
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001545" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001546endfun
1547
1548" ------------------------------------------------------------------------
1549" NetOptionRestore: restore options {{{1
1550fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001551" call Dfunc("NetOptionRestore()")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001552
1553 let &ai = s:aikeep
1554 let &cin = s:cinkeep
1555 let &cino = s:cinokeep
1556 let &com = s:comkeep
1557 let &cpo = s:cpokeep
1558 exe "lcd ".s:dirkeep
1559 let &gd = s:gdkeep
1560 let &tw = s:twkeep
1561 if exists("s:swfkeep")
1562 let &swf= s:swfkeep
1563 unlet s:swfkeep
1564 endif
1565 unlet s:aikeep
1566 unlet s:cinkeep
1567 unlet s:cinokeep
1568 unlet s:comkeep
1569 unlet s:cpokeep
1570 unlet s:gdkeep
1571 unlet s:twkeep
1572 unlet s:dirkeep
1573
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001574" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001575endfun
1576
1577" ------------------------------------------------------------------------
1578" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001579" to handle extra junk that their system's ftp dumps
1580" into the transfer. This function is provided as an
1581" example and as a fix for a Windows 95 problem: in my
1582" experience, win95's ftp always dumped four blank lines
1583" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001584if has("win95") && g:netrw_win95ftp
1585 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001586" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001587 if method == 3 " ftp (no <.netrc>)
1588 let fourblanklines= line2 - 3
1589 silent fourblanklines.",".line2."g/^\s*/d"
1590 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001591" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001592 endfun
1593endif
1594
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001595" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001596" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001597fun! <SID>NetSort() range
1598 let i = a:firstline + 1
1599 while i <= a:lastline
1600 " find insertion point via binary search
1601 let i_val = getline(i)
1602 let lo = a:firstline
1603 let hi = i
1604 while lo < hi
1605 let mid = (lo + hi) / 2
1606 let mid_val = getline(mid)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001607 if g:netrw_sort_direction =~ '^n'
1608 " normal sorting order
1609 if i_val < mid_val
1610 let hi = mid
1611 else
1612 let lo = mid + 1
1613 if i_val == mid_val | break | endif
1614 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001615 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001616 " reverse sorting order
1617 if i_val > mid_val
1618 let hi = mid
1619 else
1620 let lo = mid + 1
1621 if i_val == mid_val | break | endif
1622 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001623 endif
1624 endwhile
1625 " do insert
1626 if lo < i
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001627 exe 'keepjumps '.i.'d_'
1628 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001629 endif
1630 let i = i + 1
1631 endwhile
1632endfun
1633
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001634" ---------------------------------------------------------------------
1635" SetSort: sets up the sort based on the g:netrw_sort_sequence
1636fun! <SID>SetSort()
1637" call Dfunc("SetSort() bannercnt=".g:netrw_bannercnt)
1638 let seqlist = g:netrw_sort_sequence
1639 let priority = 1
1640 while seqlist != ""
1641 if seqlist =~ ','
1642 let seq = substitute(seqlist,',.*$','','e')
1643 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
1644 else
1645 let seq = seqlist
1646 let seqlist = ""
1647 endif
1648 let eseq= escape(seq,'/')
1649 if priority < 10
1650 let spriority= "00".priority.'\/'
1651 elseif priority < 100
1652 let spriority= "0".priority.'\/'
1653 else
1654 let spriority= priority.'\/'
1655 endif
1656" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
1657
1658 if seq == '*'
1659 exe 'keepjumps silent '.g:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
1660 else
1661 exe 'keepjumps silent '.g:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
1662 endif
1663 let priority = priority + 1
1664 endwhile
1665
1666 exe 'keepjumps silent '.g:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
1667
1668" call Dret("SetSort")
1669endfun
1670
Bram Moolenaar071d4272004-06-13 20:20:40 +00001671" ------------------------------------------------------------------------
1672" Restore {{{1
1673let &cpo= s:save_cpo
1674unlet s:save_cpo
1675" vim:ts=8 fdm=marker