blob: e6af41b17f10cc0b3d1cc33e5e082223f6ad201a [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaar8299df92004-07-10 09:47:34 +00002" Last Change: Jul 08, 2004
Bram Moolenaar071d4272004-06-13 20:20:40 +00003" Maintainer: Charles E. Campbell, Jr. PhD <drchipNOSPAM at campbellfamily.biz>
Bram Moolenaar8299df92004-07-10 09:47:34 +00004" Version: 47l 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 Moolenaar8299df92004-07-10 09:47:34 +000015let loaded_netrw = "v47l ASTRO-ONLY"
16let s:save_cpo = &cpo
17let loaded_explorer = 1
Bram Moolenaar071d4272004-06-13 20:20:40 +000018set cpo&vim
19
20" ---------------------------------------------------------------------
21" Default values for global netrw variables {{{1
22if !exists("g:netrw_ftpmode")
23 let g:netrw_ftpmode= "binary"
24endif
25if !exists("g:netrw_win95ftp")
26 let g:netrw_win95ftp= 1
27endif
28if !exists("g:netrw_cygwin")
29 if has("win32")
30 let g:netrw_cygwin= 1
31 else
32 let g:netrw_cygwin= 0
33 endif
34endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000035if !exists("g:netrw_list_cmd")
36 if executable("ssh")
37 " provide a default listing command
38 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
39 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000040" call Decho("ssh is not executable, can't do remote directory exploring")
Bram Moolenaar843ee412004-06-30 16:16:41 +000041 let g:netrw_list_cmd= ""
42 endif
43endif
44if !exists("g:netrw_rm_cmd")
45 let g:netrw_rm_cmd = "ssh HOSTNAME rm"
46endif
47if !exists("g:netrw_rmf_cmd")
48 let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
49endif
50if !exists("g:netrw_rmdir_cmd")
51 let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
52endif
53if !exists("g:netrw_rename_cmd")
54 let g:netrw_rename_cmd= "ssh HOSTNAME mv"
55endif
56if exists("g:netrw_silent") && g:netrw_silent != 0
57 let g:netrw_silentxfer= "silent "
58else
59 let g:netrw_silentxfer= ""
60endif
61if !exists("g:netrw_winsize")
62 let g:netrw_winsize= ""
63endif
64if !exists("g:netrw_list_hide")
65 let g:netrw_list_hide= ""
66endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000067if !exists("g:netrw_sort_by")
68 " alternatives: date size
69 let g:netrw_sort_by= "name"
70endif
71if !exists("g:netrw_sort_sequence")
72 let g:netrw_sort_sequence= '/$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
73endif
74if !exists("g:netrw_sort_direction")
75 " alternative: reverse (z y x ...)
76 let g:netrw_sort_direction= "normal"
77endif
Bram Moolenaar8299df92004-07-10 09:47:34 +000078if !exists("g:netrw_longlist") || g:netrw_longlist == 0
79 let g:netrw_longlist= 0
80else
81 let g:netrw_longlist= 1
82 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -l"
83endif
84if !exists("g:netrw_timefmt")
85 let g:netrw_timefmt= "%c"
86endif
87if !exists("g:netrw_local_rmdir")
88 let g:netrw_local_rmdir= "rmdir"
89endif
90if !exists("g:netrw_local_rename")
91 if has("win32")
92 let g:netrw_local_rename= "ren"
93 elseif has("unix")
94 let g:netrw_local_rename= "mv"
95 endif
96endif
97if !exists("g:netrw_local_mkdir")
98 let g:netrw_local_mkdir= "mkdir"
99endif
100if !exists("g:netrw_mkdir_cmd")
101 let g:netrw_mkdir_cmd= "ssh HOSTNAME mkdir"
102endif
103
104" BufEnter event ignored by decho when following variable is true
105" Has a side effect that doau BufReadPost doesn't work, so
106" files read by network transfer aren't appropriately highlighted.
107"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000108
109" ---------------------------------------------------------------------
110" Default values for global protocol variables {{{1
111if !exists("g:netrw_rcp_cmd")
112 let g:netrw_rcp_cmd = "rcp"
113endif
114if !exists("g:netrw_ftp_cmd")
115 let g:netrw_ftp_cmd = "ftp"
116endif
117if !exists("g:netrw_scp_cmd")
118 let g:netrw_scp_cmd = "scp -q"
119endif
120if !exists("g:netrw_sftp_cmd")
121 let g:netrw_sftp_cmd = "sftp"
122endif
123if !exists("g:netrw_http_cmd")
124 if executable("wget")
125 let g:netrw_http_cmd = "wget -q -O"
126 elseif executable("fetch")
127 let g:netrw_http_cmd = "fetch -o"
128 else
129 let g:netrw_http_cmd = ""
130 endif
131endif
132if !exists("g:netrw_dav_cmd")
133 let g:netrw_dav_cmd = "cadaver"
134endif
135if !exists("g:netrw_rsync_cmd")
136 let g:netrw_rsync_cmd = "rsync"
137endif
138if !exists("g:netrw_fetch_cmd")
139 if executable("fetch")
140 let g:netrw_fetch_cmd = "fetch -o"
141 else
142 let g:netrw_fetch_cmd = ""
143 endif
144endif
145
146if has("win32")
147 \ && exists("g:netrw_use_nt_rcp")
148 \ && g:netrw_use_nt_rcp
149 \ && executable( $SystemRoot .'/system32/rcp.exe')
150 let s:netrw_has_nt_rcp = 1
151 let s:netrw_rcpmode = '-b'
152 else
153 let s:netrw_has_nt_rcp = 0
154 let s:netrw_rcpmode = ''
155endif
156
157" ---------------------------------------------------------------------
158" Transparency Support: {{{1
Bram Moolenaar8299df92004-07-10 09:47:34 +0000159 " File Explorer: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000160if version >= 600
Bram Moolenaar8299df92004-07-10 09:47:34 +0000161 augroup FileExplorer
162 au!
163 au BufEnter * call <SID>LocalBrowse(expand("<afile>"))
164 augroup END
165 " Network Handler: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000166 augroup Network
167 au!
168 if has("win32")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000169 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 +0000170 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000171 au BufReadCmd file:///* exe "silent doau BufReadPre ".expand("<afile>")|exe 'e /'.substitute(expand("<afile>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<afile>")
172 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 +0000173 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000174 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>")
175 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 +0000176 au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "Nwrite " .expand("<afile>")|call <SID>NetRestorePosn()
Bram Moolenaar071d4272004-06-13 20:20:40 +0000177 augroup END
178endif
179
180" ------------------------------------------------------------------------
181" Commands: :Nread, :Nwrite, and :NetUserPass {{{1
182com! -nargs=* Nread call <SID>NetSavePosn()<bar>call <SID>NetRead(<f-args>)<bar>call <SID>NetRestorePosn()
183com! -range=% -nargs=* Nwrite call <SID>NetSavePosn()<bar><line1>,<line2>call <SID>NetWrite(<f-args>)<bar>call <SID>NetRestorePosn()
184com! -nargs=* NetUserPass call NetUserPass(<f-args>)
185
186" ------------------------------------------------------------------------
187" NetSavePosn: saves position of cursor on screen {{{1
188fun! s:NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000189" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000190 " Save current line and column
191 let s:netrw_winnr= winnr()
192 let s:netrw_line = line(".")
193 let s:netrw_col = virtcol(".")
194
195 " Save top-of-screen line
196 norm! H0
197 let s:netrw_hline= line(".")
198
199 call s:NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000200" 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 +0000201endfun
202
203" ------------------------------------------------------------------------
204" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
205fun! <SID>NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000206" 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 +0000207
208 exe "silent! ".s:netrw_winnr."wincmd w"
209 if v:shell_error == 0
210 " as suggested by Bram M: redraw on no error
211 " allows protocol error messages to remain visible
212 redraw!
213 endif
214 " restore top-of-screen line
215 exe "norm! ".s:netrw_hline."G0z\<CR>"
216 " restore position
217 exe "norm! ".s:netrw_line."G0".s:netrw_col."\<bar>"
218
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000219" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000220endfun
221
222" ------------------------------------------------------------------------
223" NetRead: responsible for reading a file over the net {{{1
224fun! s:NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000225" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000226
227 " save options
228 call s:NetOptionSave()
229
230 " Special Exception: if a file is named "0r", then
231 " "0r" will be used to read the
232 " following files instead of "r"
233 if a:0 == 0
234 let readcmd= "r"
235 let ichoice= 0
236 elseif a:1 == "0r"
237 let readcmd = "0r"
238 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000239 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000240 let readcmd = "r"
241 let ichoice = 1
242 endif
243
244 " get name of a temporary file
245 let tmpfile= tempname()
246
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000247" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000248 while ichoice <= a:0
249
250 " attempt to repeat with previous host-file-etc
251 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000252" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000253 let choice = b:netrw_lastfile
254 let ichoice= ichoice + 1
255
256 else
257 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000258" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000259
260 " Reconstruct Choice if choice starts with '"'
261 if match(choice,"?") == 0
262 echo 'NetRead Usage:'
263 echo ':Nread machine:path uses rcp'
264 echo ':Nread "machine path" uses ftp with <.netrc>'
265 echo ':Nread "machine id password path" uses ftp'
266 echo ':Nread dav://machine[:port]/path uses cadaver'
267 echo ':Nread fetch://machine/path uses fetch'
268 echo ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
269 echo ':Nread http://[user@]machine/path uses http wget'
270 echo ':Nread rcp://[user@]machine/path uses rcp'
271 echo ':Nread rsync://machine[:port]/path uses rsync'
272 echo ':Nread scp://[user@]machine[[:#]port]/path uses scp'
273 echo ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
274 break
275 elseif match(choice,"^\"") != -1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000276" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000277 if match(choice,"\"$") != -1
278 " case "..."
279 let choice=strpart(choice,1,strlen(choice)-2)
280 else
281 " case "... ... ..."
282 let choice = strpart(choice,1,strlen(choice)-1)
283 let wholechoice = ""
284
285 while match(choice,"\"$") == -1
286 let wholechoice = wholechoice . " " . choice
287 let ichoice = ichoice + 1
288 if ichoice > a:0
289 echoerr "Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000290" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000291 return
292 endif
293 let choice= a:{ichoice}
294 endwhile
295 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
296 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000297 endif
298 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000299
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000300" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000301 let ichoice= ichoice + 1
302
303 " fix up windows urls
304 if has("win32")
305 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000306" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000307
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000308 exe 'lcd ' . fnamemodify(tmpfile,':h')
309 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000310 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000311
312 " Determine method of read (ftp, rcp, etc)
313 call s:NetMethod(choice)
314
Bram Moolenaar843ee412004-06-30 16:16:41 +0000315 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000316" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000317 if choice =~ "^.*/$"
318 if strlen(g:netrw_list_cmd) > 0
Bram Moolenaar843ee412004-06-30 16:16:41 +0000319 keepjumps call s:NetBrowse(choice)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000320" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000321 else
322 echoerr "sorry, can't do a remote listing; ssh isn't executable"
323 endif
324 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000325 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000326
327 " ============
328 " Perform Read
329 " ============
330
331 ".........................................
332 " rcp: NetRead Method #1
333 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000334" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000335 " ER: noting done with g:netrw_uid yet?
336 " ER: on Win2K" rcp machine[.user]:file tmpfile
337 " ER: if machine contains '.' adding .user is required (use $USERNAME)
338 " ER: the tmpfile is full path: rcp sees C:\... as host C
339 if s:netrw_has_nt_rcp == 1
340 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
341 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
342 else
343 " Any way needed it machine contains a '.'
344 let uid_machine = g:netrw_machine .'.'. $USERNAME
345 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000346 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000347 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
348 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
349 else
350 let uid_machine = g:netrw_machine
351 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000352 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000353" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000354 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
355 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
356 let b:netrw_lastfile = choice
357
358 ".........................................
359 " ftp + <.netrc>: NetRead Method #2
360 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000361" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000362 let netrw_fname= b:netrw_fname
363 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000364 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000365 exe "put ='".g:netrw_ftpmode."'"
366 exe "put ='get ".netrw_fname." ".tmpfile."'"
367 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000368" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000369 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
370 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000371" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000372 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
373 endif
374 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
375 if getline(1) !~ "^$"
376 echoerr getline(1)
377 endif
378 bd!
379 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
380 let b:netrw_lastfile = choice
381
382 ".........................................
383 " ftp + machine,id,passwd,filename: NetRead Method #3
384 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
385 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000386" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000387 let netrw_fname= b:netrw_fname
388 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000389 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000390 if exists("g:netrw_port") && g:netrw_port != ""
391 put ='open '.g:netrw_machine.' '.g:netrw_port
392 else
393 put ='open '.g:netrw_machine
394 endif
395
396 if exists("g:netrw_ftp") && g:netrw_ftp == 1
397 put =g:netrw_uid
398 put =g:netrw_passwd
399 else
400 put ='user '.g:netrw_uid.' '.g:netrw_passwd
401 endif
402
403 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
404 put =g:netrw_ftpmode
405 endif
406 put ='get '.netrw_fname.' '.tmpfile
407
408 " perform ftp:
409 " -i : turns off interactive prompting from ftp
410 " -n unix : DON'T use <.netrc>, even though it exists
411 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000412" call Decho('performing ftp -i -n')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000413 norm 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000414" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000415 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
416 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
417 if getline(1) !~ "^$"
418 echoerr getline(1)
419 endif
420 bd!
421 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
422 let b:netrw_lastfile = choice
423
424 ".........................................
425 " scp: NetRead Method #4
426 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000427" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000428 if exists("g:netrw_port") && g:netrw_port != ""
429 let useport= " -P ".g:netrw_port
430 else
431 let useport= ""
432 endif
433 if g:netrw_cygwin == 1
434 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000435" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000436 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
437 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000438" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000439 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
440 endif
441 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
442 let b:netrw_lastfile = choice
443
444 ".........................................
445 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000446" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000447 if g:netrw_http_cmd == ""
448 echoerr "neither wget nor fetch command is available"
449 exit
450 endif
451
452 if match(b:netrw_fname,"#") == -1
453 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000454" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000455 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
456 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
457
458 else
459 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
460 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
461 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000462" call Decho("netrw_html<".netrw_html.">")
463" call Decho("netrw_tag <".netrw_tag.">")
464" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000465 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
466 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000467" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000468 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
469 endif
470 let b:netrw_lastfile = choice
471
472 ".........................................
473 " cadaver: NetRead Method #6
474 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000475" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000476
477 " Construct execution string (four lines) which will be passed through filter
478 let netrw_fname= b:netrw_fname
479 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000480 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000481 if exists("g:netrw_port") && g:netrw_port != ""
482 put ='open '.g:netrw_machine.' '.g:netrw_port
483 else
484 put ='open '.g:netrw_machine
485 endif
486 put ='user '.g:netrw_uid.' '.g:netrw_passwd
487
488 if g:netrw_cygwin == 1
489 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
490 put ='get '.netrw_fname.' '.cygtmpfile
491 else
492 put ='get '.netrw_fname.' '.tmpfile
493 endif
494
495 " perform cadaver operation:
496 norm 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000497" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000498 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
499 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000500 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000501 let b:netrw_lastfile = choice
502
503 ".........................................
504 " rsync: NetRead Method #7
505 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000506" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000507 if g:netrw_cygwin == 1
508 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000509" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000510 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
511 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000512" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000513 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
514 endif
515 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
516 let b:netrw_lastfile = choice
517
518 ".........................................
519 " fetch: NetRead Method #8
520 " fetch://[user@]host[:http]/path
521 elseif b:netrw_method == 8 " read with fetch
522 if g:netrw_fetch_cmd == ""
523 echoerr "fetch command not available"
524 exit
525 endif
526 if exists("g:netrw_option") && g:netrw_option == ":http"
527 let netrw_option= "http"
528 else
529 let netrw_option= "ftp"
530 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000531" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000532
533 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000534" 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 +0000535 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
536 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000537" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000538 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
539 endif
540
541 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
542 let b:netrw_lastfile = choice
543
544 ".........................................
545 " sftp: NetRead Method #9
546 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000547" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000548 if g:netrw_cygwin == 1
549 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000550" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
551" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000552 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
553 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000554" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000555 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
556 endif
557 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
558 let b:netrw_lastfile = choice
559
560 ".........................................
561 else " Complain
562 echo "***warning*** unable to comply with your request<" . choice . ">"
563 endif
564 endwhile
565
566 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000567" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000568 if exists("b:netrw_method")
569 unlet b:netrw_method
570 unlet g:netrw_machine
571 unlet b:netrw_fname
572 endif
573 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000574
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000575" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000576endfun
577" end of NetRead
578
579" ------------------------------------------------------------------------
580" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
581fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000582" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000583
584 if exists("*NetReadFixup")
585 " for the use of NetReadFixup (not otherwise used internally)
586 let line2= line("$")
587 endif
588
589 " transform paths from / to \ for Windows, unless the shell is bash
590 if &term == "win32"
591 if &shell == "bash"
592 let fname=a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000593" call Decho("(win32 && bash) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000594 else
595 let fname=substitute(a:fname,'/','\\\\','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000596" call Decho("(win32 && !bash) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000597 endif
598 else
599 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000600" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000601 endif
602
603 " get the file, but disable undo when reading a new buffer
604 if a:readcmd[0] == '0'
605 let use_e_cmd = 0 " 1 when using ':edit'
606 let delline = 0 " 1 when have to delete empty last line
607 if line("$") == 1 && getline(1) == ""
608 " Now being asked to 0r a file into an empty file.
609 " Safe to :e it instead, unless there is another window on the same buffer.
610 let curbufnr = bufnr("%")
611 let use_e_cmd = 1
612 let delline = 1
613 " Loop over all windows,
614 " reset use_e_cmd when another one is editing the current buffer.
615 let i = 1
616 while 1
617 if i != winnr() && winbufnr(i) == curbufnr
618 let use_e_cmd = 0
619 break
620 endif
621 let i = i + 1
622 if winbufnr(i) < 0
623 break
624 endif
625 endwhile
626 endif
627
628 if use_e_cmd > 0
629 " ':edit' the temp file, wipe out the old buffer and rename the buffer
630 let curfilename = expand("%")
631
632 let binlocal = &l:bin
633 let binglobal = &g:bin
634 if binlocal
635 setglobal bin " Need to set 'bin' globally for ":e" command.
636 endif
637 silent exe "e! ".v:cmdarg." ".fname
638 if binlocal && !binglobal
639 setglobal nobin
640 setlocal bin
641 endif
642
643 exe curbufnr . "bwipe!"
644 exe "f ".curfilename
645 " the ":f newname" apparently leaves the temporary file as the alternate
646 " file in the buffer list (see :ls!). The following command wipes it out.
647 exe bufnr("#")."bwipe!"
648 else
649 let oldul= &ul
Bram Moolenaar8299df92004-07-10 09:47:34 +0000650 setlocal ul=-1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000651 exe a:readcmd." ".v:cmdarg." ".fname
652 if delline > 0
653 " wipe out last line, which should be a blank line anyway
654 $del
655 endif
656 let &ul= oldul
657 endif
658 elseif filereadable(fname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000659" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000660 exe a:readcmd." ".v:cmdarg." ".fname
661 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000662" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000663 return
664 endif
665
666 " User-provided (ie. optional) fix-it-up command
667 if exists("*NetReadFixup")
668 let line1= line(".")
669 if a:readcmd == "r"
670 let line2= line("$") - line2 + line1
671 else
672 let line2= line("$") - line2
673 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000674" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000675 call NetReadFixup(a:method, line1, line2)
676 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000677
678 " update the Buffers menu
679 if has("gui") && has("gui_running")
680 silent! emenu Buffers.Refresh\ menu
681 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000682
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000683" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000684
685 " insure that we have the right filetype and that its being displayed
686 filetype detect
687 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000688" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000689endfun
690
691" ------------------------------------------------------------------------
692" NetWrite: responsible for writing a file over the net {{{1
693fun! s:NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000694" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000695
696 " option handling
697 let mod= 0
698 call s:NetOptionSave()
699
700 " Get Temporary Filename
701 let tmpfile= tempname()
702
703 if a:0 == 0
704 let ichoice = 0
705 else
706 let ichoice = 1
707 endif
708
709 " write (selected portion of) file to temporary
710 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
711
712 while ichoice <= a:0
713
714 " attempt to repeat with previous host-file-etc
715 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000716" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000717 let choice = b:netrw_lastfile
718 let ichoice= ichoice + 1
719 else
720 exe "let choice= a:" . ichoice
721
722 " Reconstruct Choice if choice starts with '"'
723 if match(choice,"?") == 0
724 echo 'NetWrite Usage:"'
725 echo ':Nwrite machine:path uses rcp'
726 echo ':Nwrite "machine path" uses ftp with <.netrc>'
727 echo ':Nwrite "machine id password path" uses ftp'
728 echo ':Nwrite dav://[user@]machine/path uses cadaver'
729 echo ':Nwrite fetch://[user@]machine/path uses fetch'
730 echo ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
731 echo ':Nwrite rcp://machine/path uses rcp'
732 echo ':Nwrite rsync://[user@]machine/path uses rsync'
733 echo ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
734 echo ':Nwrite sftp://[user@]machine/path uses sftp'
735 break
736
737 elseif match(choice,"^\"") != -1
738 if match(choice,"\"$") != -1
739 " case "..."
740 let choice=strpart(choice,1,strlen(choice)-2)
741 else
742 " case "... ... ..."
743 let choice = strpart(choice,1,strlen(choice)-1)
744 let wholechoice = ""
745
746 while match(choice,"\"$") == -1
747 let wholechoice= wholechoice . " " . choice
748 let ichoice = ichoice + 1
749 if choice > a:0
750 echoerr "Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000751" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000752 return
753 endif
754 let choice= a:{ichoice}
755 endwhile
756 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
757 endif
758 endif
759 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000760" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000761 let ichoice= ichoice + 1
762
763 " fix up windows urls
764 if has("win32")
765 let choice= substitute(choice,'\\','/','ge')
766 "ER: see NetRead()
767 exe 'lcd ' . fnamemodify(tmpfile,':h')
768 let tmpfile = fnamemodify(tmpfile,':t')
769 endif
770
771 " Determine method of read (ftp, rcp, etc)
772 call s:NetMethod(choice)
773
774 " =============
775 " Perform Write
776 " =============
777
778 ".........................................
779 " rcp: NetWrite Method #1
780 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000781" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000782 if s:netrw_has_nt_rcp == 1
783 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
784 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
785 else
786 let uid_machine = g:netrw_machine .'.'. $USERNAME
787 endif
788 else
789 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
790 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
791 else
792 let uid_machine = g:netrw_machine
793 endif
794 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000795" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000796 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
797 let b:netrw_lastfile = choice
798
799 ".........................................
800 " ftp + <.netrc>: NetWrite Method #2
801 elseif b:netrw_method == 2 " write with ftp + <.netrc>
802 let netrw_fname = b:netrw_fname
803 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000804 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000805 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000806" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000807 exe "put ='put ".tmpfile." ".netrw_fname."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000808" call Decho("put ='put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000809 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000810" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000811 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000812 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000813" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000814 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000815 endif
816 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
817 if getline(1) !~ "^$"
818 echoerr getline(1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000819 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000820 endif
821 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000822 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000823
824 ".........................................
825 " ftp + machine, id, passwd, filename: NetWrite Method #3
826 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
827 let netrw_fname= b:netrw_fname
828 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000829 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000830 if exists("g:netrw_port") && g:netrw_port != ""
831 put ='open '.g:netrw_machine.' '.g:netrw_port
832 else
833 put ='open '.g:netrw_machine
834 endif
835 if exists("g:netrw_ftp") && g:netrw_ftp == 1
836 put =g:netrw_uid
837 put =g:netrw_passwd
838 else
839 put ='user '.g:netrw_uid.' '.g:netrw_passwd
840 endif
841 put ='put '.tmpfile.' '.netrw_fname
842 " save choice/id/password for future use
843 let b:netrw_lastfile = choice
844
845 " perform ftp:
846 " -i : turns off interactive prompting from ftp
847 " -n unix : DON'T use <.netrc>, even though it exists
848 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000849" call Decho('performing ftp -i -n')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000850 norm 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000851" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000852 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
853 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
854 if getline(1) !~ "^$"
855 echoerr getline(1)
856 let mod=1
857 endif
858 bd!
859
860 ".........................................
861 " scp: NetWrite Method #4
862 elseif b:netrw_method == 4 " write with scp
863 if exists("g:netrw_port") && g:netrw_port != ""
864 let useport= " -P ".g:netrw_port
865 else
866 let useport= ""
867 endif
868 if g:netrw_cygwin == 1
869 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000870" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000871 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
872 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000873" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000874 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
875 endif
876 let b:netrw_lastfile = choice
877
878 ".........................................
879 " http: NetWrite Method #5
880 elseif b:netrw_method == 5
881 echoerr "***warning*** currently <netrw.vim> does not support writing using http:"
882
883 ".........................................
884 " dav: NetWrite Method #6
885 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000886" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000887
888 " Construct execution string (four lines) which will be passed through filter
889 let netrw_fname= b:netrw_fname
890 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000891 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000892 if exists("g:netrw_port") && g:netrw_port != ""
893 put ='open '.g:netrw_machine.' '.g:netrw_port
894 else
895 put ='open '.g:netrw_machine
896 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000897 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000898
899 if g:netrw_cygwin == 1
900 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
901 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000902 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000903 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000904 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000905
906 " perform cadaver operation:
907 norm 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000908" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000909 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
910 bd!
911 let b:netrw_lastfile = choice
912
913 ".........................................
914 " rsync: NetWrite Method #7
915 elseif b:netrw_method == 7 " write with rsync
916 if g:netrw_cygwin == 1
917 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000918" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000919 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000920 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000921" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000922 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000923 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000924 let b:netrw_lastfile = choice
925
926 ".........................................
927 " scp: NetWrite Method #9
928 elseif b:netrw_method == 9 " write with sftp
929 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000930 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
931 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
932 else
933 let uid_machine = g:netrw_machine
934 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000935 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000936 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000937 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000938 norm 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000939" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000940 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
941 bd!
942 let b:netrw_lastfile= choice
943
944 ".........................................
945 else " Complain
946 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000947 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000948 endwhile
949
950 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000951" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000952 let result=delete(tmpfile)
953 call s:NetOptionRestore()
954
955 if a:firstline == 1 && a:lastline == line("$")
956 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +0000957 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000958
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000959" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000960endfun
961" end of NetWrite
962
963" ------------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000964" Browsing Support For Remote Directories And Files: {{{1
Bram Moolenaar843ee412004-06-30 16:16:41 +0000965" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000966" of the contents of a remote directory. It is assumed that the
967" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
968" with the requested remote hostname first.
Bram Moolenaar843ee412004-06-30 16:16:41 +0000969fun! <SID>NetBrowse(dirname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000970" call Dfunc("NetBrowse(dirname<".a:dirname.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +0000971
972 " sanity check
973 if !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
974 echoerr "***netrw*** this system doesn't support remote directory listing"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000975" call Dret("NetBrowse 0")
Bram Moolenaar843ee412004-06-30 16:16:41 +0000976 return 0
977 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000978
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000979 " make this buffer modifiable
980 setlocal ma
981
982 " analyze a:dirname and g:netrw_list_cmd
983 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
984 if a:dirname !~ dirpat
Bram Moolenaar843ee412004-06-30 16:16:41 +0000985 echoerr "NetBrowse: I don't understand your dirname<".a:dirname.">"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000986" call Dret("NetBrowse 0 : badly formatted dirname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000987 return 0
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000988 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000989 let method = substitute(a:dirname,dirpat,'\1','')
990 let user = substitute(a:dirname,dirpat,'\2','')
991 let machine = substitute(a:dirname,dirpat,'\3','')
992 let path = substitute(a:dirname,dirpat,'\4','')
993 let fname = substitute(a:dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000994" call Decho("set up method <".method .">")
995" call Decho("set up user <".user .">")
996" call Decho("set up machine<".machine.">")
997" call Decho("set up path <".path .">")
998" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000999
Bram Moolenaar8299df92004-07-10 09:47:34 +00001000 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001001
Bram Moolenaar8299df92004-07-10 09:47:34 +00001002 " optionally sort by time (-t) or by size (-S)
1003 if g:netrw_sort_by =~ "^t"
1004 let listcmd= listcmd."t"
1005 elseif g:netrw_sort_by =~ "^s"
1006 let listcmd= listcmd."S"
1007 endif
1008 " optionally sort in reverse
1009 if g:netrw_sort_direction =~ "^r"
1010 let listcmd= listcmd."r"
1011 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001012
1013" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001014
1015 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001016" call Decho("attempt transfer of symlink as file")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001017 call s:NetBrowse(substitute(a:dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001018 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001019" call Dret("NetBrowse 0 : symlink")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001020 return 0
1021
1022 elseif fname !~ '/$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001023 " looks like a regular file, attempt transfer
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001024" call Decho("attempt transfer as regular file<".a:dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001025
1026 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001027 " "this is a directory" indicator (/). There shouldn't be one of those,
1028 " anyway.
1029 let path= substitute(path,'[*=@|]$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001030" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001031
1032 " remote-read the requested file into current buffer
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001033 enew!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001034 exe "file ".method."://".user.machine."/".escape(path,' ')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001035 exe "silent doau BufReadPre ".fname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001036 silent call s:NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001037 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001038 keepjumps 1d
1039 setlocal nomod
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001040
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001041" call Dret("NetBrowse 0 : file<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001042 return 0
1043 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001044
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001045 " ---------------------------------------------------------------------
1046 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001047" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001048 " set up new buffer and map
1049 let bufname = method.'://'.user.machine.'/'.path
1050 let bufnamenr = bufnr(bufname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001051" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001052 if bufnamenr != -1
1053 " buffer already exists, switch to it!
1054 exe "b ".bufnamenr
1055 if line("$") >= 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001056" call Dret("NetBrowse 1")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001057 return 1
1058 endif
1059 else
1060 enew!
1061 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001062 setlocal ts=32 bt=nofile bh=wipe nobl
1063 exe 'file '.escape(bufname,' ')
1064 setlocal bt=nowrite bh=hide nobl
1065 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetDir()))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001066 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
1067 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
1068 nnoremap <buffer> <silent> a :let g:netrw_list_showall=1<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00001069 nnoremap <buffer> <silent> <Leader>H :call <SID>NetHideEdit(0)<cr>
1070 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
1071 nnoremap <buffer> <silent> o :exe g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetDir()))<cr>
1072 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("%"),<SID>NetGetDir()))<cr>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001073 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 Moolenaar8299df92004-07-10 09:47:34 +00001074 nnoremap <buffer> <silent> v :exe g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetDir()))<cr>
1075 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetDir()),1)<cr>
1076 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetDir()))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001077 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1078 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1079 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1080 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1081 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001082 exe 'nnoremap <buffer> <silent> <Leader>M :call <SID>NetMakeDir("'.user.machine.'")<cr>'
1083 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001084 setlocal ma
1085
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001086 " Set up the banner
1087" call Decho("executing: r! ".listcmd." '".path."'")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001088 keepjumps put ='\" =============================='
1089 keepjumps put ='\" Netrw Remote Directory Listing'
1090 keepjumps put ='\" '.bufname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001091 let g:netrw_bannercnt= 6
1092 if g:netrw_sort_by =~ "^n"
1093 " sorted by name
1094 let g:netrw_bannercnt= g:netrw_bannercnt + 1
1095 keepjumps put ='\" Sorted by '.g:netrw_sort_by
1096 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1097 else
1098 " sorted by size or date
1099 keepjumps put ='\" Sorted by '.g:netrw_sort_by
1100 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001101 if g:netrw_list_hide != "" && !exists("g:netrw_list_showall")
1102 keepjumps put ='\" Hiding: '.g:netrw_list_hide
1103 let g:netrw_bannercnt= g:netrw_bannercnt + 1
1104 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001105 keepjumps put ='\" =============================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001106
1107 " remote read the requested directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001108 exe "silent r! ".listcmd." '".path."'"
1109 keepjumps 1d
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001110
1111 " manipulate the directory listing (hide, sort)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001112 setlocal ft=netrwlist
Bram Moolenaar843ee412004-06-30 16:16:41 +00001113 if line("$") >= g:netrw_bannercnt
1114 if !exists("g:netrw_list_showall")
1115 if g:netrw_list_hide != ""
1116 call s:NetrwListHide()
1117 endif
1118 else
1119 unlet g:netrw_list_showall
1120 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001121 if g:netrw_longlist
1122 " do a long listing; these substitutions need to be done prior to sorting
1123 keepjumps silent /^total\s*\d\+$/d
1124 exe 'keepjumps silent '.g:netrw_bannercnt.',$s/ -> .*$//e'
1125 exe 'keepjumps silent '.g:netrw_bannercnt.',$s/\(\S\+\s\+\S\+\s\+\S\+\s\+\S\+\s\+\S\+\s\+\S\+\s\+\S\+\s\+\S\+\)\s\+\(\S\+\)$/\2\t\1/e'
1126 exe g:netrw_bannercnt
1127 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001128 if g:netrw_sort_by =~ "^n"
1129 call s:SetSort()
1130 exe 'keepjumps silent '.g:netrw_bannercnt.',$call s:NetSort()'
1131 exe 'keepjumps silent '.g:netrw_bannercnt.',$s/^\d\{3}\///e'
1132 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001133 endif
1134 let prvbuf= bufnr(bufname)
1135 if prvbuf != -1
1136 exe "silent! b ".prvbuf
1137 endif
1138
1139 setlocal noma nomod
1140
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001141" call Dret("NetBrowse 1")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001142 return 1
1143endfun
1144
1145" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001146" NetBrowseChgDir: {{{2
1147fun! <SID>NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001148" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001149
1150 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001151 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001152
1153 if newdir !~ '/$'
1154 " handling a file
1155 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001156" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001157
1158 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001159 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001160" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001161 setlocal ma
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001162 %d
1163
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001164 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001165 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001166 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001167
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001168 if trailer =~ '^\%(\.\./\)*$'
1169 " tack on a ../"
1170 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001171
1172 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001173 " strip off a directory name from dirname
1174 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001175 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001176" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001177
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001178 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001179 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001180 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001181" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001182 endif
1183
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001184" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001185 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001186endfun
1187
Bram Moolenaar843ee412004-06-30 16:16:41 +00001188" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001189" NetGetDir: it gets the directory named under the cursor
1190fun! <SID>NetGetDir()
1191" call Dfunc("NetGetDir()")
1192 let dirname= getline(".")
1193 if dirname =~ '\t'
1194 let dirname= substitute(dirname,'\t.*$','','e')
1195 endif
1196" call Dret("NetGetDir <".dirname.">")
1197 return dirname
1198endfun
1199
1200" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001201" NetBrowseRm: remove a remote file or directory {{{2
1202fun! <SID>NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001203" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1204" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001205
1206 " preparation for removing multiple files/directories
1207 let ctr= a:firstline
1208
1209 " remove multiple files and directories
1210 while ctr <= a:lastline
1211 exe ctr
1212
1213 norm! 0
1214 let rmfile= a:path.expand("<cWORD>")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001215" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001216
1217 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '/$')
1218 " attempt to remove file
1219 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' '.rmfile
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001220" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001221 call inputsave()
1222 let ok= input("Confirm deletion of file<".rmfile."> ","y")
1223 call inputrestore()
1224 if ok == "y"
1225 let ret= system(netrw_rm_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001226" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001227 endif
1228
1229 else
1230 " attempt to remove directory
1231 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '.rmfile
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001232" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001233 call inputsave()
1234 let ok= input("Confirm deletion of directory<".rmfile."> ","y")
1235 call inputrestore()
1236
1237 if ok == "y"
1238 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001239" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001240
1241 if v:shell_error != 0
1242 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'/$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001243" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001244 let ret= system(netrw_rmf_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001245" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001246
1247 if v:shell_error != 0
1248 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
1249 endif
1250 endif
1251 endif
1252 endif
1253
1254 let ctr= ctr + 1
1255 endwhile
1256
1257 " refresh the directory
1258 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001259" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001260 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1261 exe curline
1262
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001263" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001264endfun
1265
1266" ---------------------------------------------------------------------
1267" NetBrowseRename: rename a remote file or directory {{{2
1268fun! <SID>NetBrowseRename(usrhost,path)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001269" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001270
1271 " preparation for removing multiple files/directories
1272 let ctr = a:firstline
1273 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1274
1275 " attempt to rename files/directories
1276 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001277 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001278
1279 norm! 0
1280 let oldname= a:path.expand("<cWORD>")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001281" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001282
1283 call inputsave()
1284 let newname= input("Moving ".a:usrhost."'s ".oldname." to : ",oldname)
1285 call inputrestore()
1286
1287 let ret= system(rename_cmd." ".oldname." ".newname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001288" call Decho("executing system(".rename_cmd." ".oldname." ".newname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001289
1290 let ctr= ctr + 1
1291 endwhile
1292
1293 " refresh the directory
1294 let curline= line(".")
1295 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001296 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001297" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001298endfun
1299
1300" ---------------------------------------------------------------------
1301" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001302" files given their extension. Passes 0=local, 1=remote
1303fun! <SID>NetBrowseX(fname,remote)
1304" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001305
1306 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001307" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar843ee412004-06-30 16:16:41 +00001308 if exten != "" && exists("*NetrwFileHandler_".exten)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001309
1310 let fname= a:fname
1311 if a:remote == 1
1312 " create a local copy
1313 let fname= tempname().".".exten
1314" call Decho("create a local copy of <".a:fname."> as <".fname.">")
1315 exe "keepjumps silent bot 1new ".a:fname
1316 let eikeep= &ei
1317 set ei=all bh=delete
1318 exe "w! ".fname
1319 let &ei= eikeep
1320 q
1321 endif
1322
1323 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
1324 redraw!
1325
1326 " cleanup: remove temporary file,
1327 " delete current buffer if success with handler,
1328 " return to prior buffer (directory listing)
1329 if a:remote == 1 && fname != a:fname
1330" call Decho("deleting temporary file<".fname.">")
1331 call delete(fname)
1332 endif
1333 if ret != 0
1334 let eikeep= &ei
1335 set ei=all bh=delete bt=nofile
1336 exe "norm! \<c-o>"
1337 let &ei= eikeep
1338 redraw!
1339 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001340 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001341
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001342" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001343endfun
1344
1345" ---------------------------------------------------------------------
1346" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1347" separated patterns given in g:netrw_list_hide
1348fun! <SID>NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001349" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001350
1351 let listhide= g:netrw_list_hide
1352 while listhide != ""
1353 if listhide =~ ','
1354 let hide = substitute(listhide,',.*$','','e')
1355 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1356 else
1357 let hide = listhide
1358 let listhide= ""
1359 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001360" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001361 exe 'keepjumps silent '.g:netrw_bannercnt.',$g~'.hide.'~d'
1362 endwhile
1363
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001364" call Dret("NetrwListHide")
1365endfun
1366
1367" ---------------------------------------------------------------------
1368" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar8299df92004-07-10 09:47:34 +00001369fun! <SID>NetHideEdit(mode)
1370" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001371
1372 call inputsave()
1373 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1374 call inputrestore()
1375
1376 " refresh the listing
1377 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001378 if a:mode == 0
1379 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1380 else
1381 silent call s:LocalBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1382 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001383
1384" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001385endfun
1386
Bram Moolenaar8299df92004-07-10 09:47:34 +00001387" ---------------------------------------------------------------------
1388" NetLongList: {{{2
1389fun! <SID>NetLongList(mode)
1390" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".g:netrw_longlist)
1391
1392 if g:netrw_longlist != 0
1393 " turn long listing off
1394 let g:netrw_longlist = 0
1395 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1396
1397 else
1398 " turn long listing on
1399 let g:netrw_longlist = 1
1400 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
1401 endif
1402
1403 " refresh the listing
1404 if a:mode == 0
1405 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1406 else
1407 silent call <SID>LocalBrowse(<SID>LocalBrowseChgDir(expand("%"),"./"))
1408 endif
1409
1410" call Dret("NetLongList : g:netrw_longlist=".g:netrw_longlist)
1411endfun
1412
1413" ---------------------------------------------------------------------
1414" NetMakeDir: this function makes a directory (both local and remote)
1415fun! <SID>NetMakeDir(usrhost)
1416" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
1417
1418 " get name of new directory from user. A bare <CR> will skip.
1419 " if its currently a directory, also request will be skipped, but with
1420 " a message.
1421 call inputsave()
1422 let newdirname= input("Please give directory name: ")
1423 call inputrestore()
1424
1425 if newdirname == ""
1426" call Dret("NetMakeDir : user aborted with bare <cr>")
1427 return
1428 endif
1429
1430 if a:usrhost == ""
1431
1432 " Local mkdir:
1433 " sanity checks
1434 if isdirectory(newdirname)
1435 echoerr "***warning*** <".newdirname."> is already a directory!"
1436" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
1437 return
1438 endif
1439 if filereadable(newdirname)
1440 echoerr "***warning*** <".newdirname."> is already a file!"
1441" call Dret("NetMakeDir : file<".newdirname."> exists previously")
1442 return
1443 endif
1444 exe "silent! !".g:netrw_local_mkdir." ".newdirname
1445 if v:shell_error == 0
1446 " refresh listing
1447 call s:LocalBrowse(".")
1448 else
1449 echoerr "***warning*** unable to make directory<".newdirname.">"
1450 endif
1451 redraw!
1452
1453 else
1454 " Remote mkdir:
1455 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
1456 let newdirname= substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
1457" call Decho("exe silent! !".mkdircmd." ".newdirname)
1458 exe "silent! !".mkdircmd." ".newdirname
1459 if v:shell_error == 0
1460 " refresh listing
1461 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1462 else
1463 echoerr "***warning*** unable to make directory<".newdirname.">"
1464 endif
1465 redraw!
1466 endif
1467
1468" call Dret("NetMakeDir")
1469endfun
1470
1471" ---------------------------------------------------------------------
1472" Browsing Support For Local Directories And Files: {{{1
1473
1474" ---------------------------------------------------------------------
1475" LocalBrowse: supports local file/directory browsing {{{2
1476fun! <SID>LocalBrowse(dirname)
1477
1478" let dirname= (a:dirname == "")? expand("%:p") : a:dirname
1479 if !isdirectory(a:dirname)
1480 " not a directory, ignore it
1481 return
1482 endif
1483
1484" " unfortunate interaction -- when putting Dfunc/Dret above
1485 " one can no longer enter the DBG buffer.
1486" call Dfunc("LocalBrowse(dirname<".a:dirname.">)")
1487
1488 exe 'cd '.escape(a:dirname,' ')
1489 let dirname= getcwd()."/"
1490" call Decho("dirname<".dirname.">")
1491
1492 " make this buffer modifiable
1493 setlocal ma
1494
1495 " ---------------------------------------------------------------------
1496 " Perform Directory Listing:
1497" call Decho("Perform directory listing...")
1498 " set up new buffer and map
1499 let dirnamenr = bufnr(dirname)
1500 if dirnamenr != -1 && bufname(dirnamenr) != dirname
1501 " try removing the trailing "/"
1502 let dirnamenr= bufnr(substitute(dirname,'/$','','e'))
1503 endif
1504" call Decho("bufnr(dirname<".dirname.">)=".dirnamenr)
1505
1506 if dirnamenr != -1 && bufexists(dirname)
1507 " buffer already exists (hidden), so switch to it!
1508 exe "b ".dirnamenr
1509 exe 'cd '.escape(dirname,' ')
1510" call Decho("changed directory to<".dirname.">")
1511 if a:dirname != "." && line("$") >= 5
1512" call Dret("LocalBrowse : buffer already exists with info")
1513 return
1514 endif
1515" call Decho("buffer already exists, but needs listing (buf#".dirnamenr.")")
1516 keepjumps %d
1517 else
1518" call Dredir("ls!")
1519" call Decho("generate new buffer named<".dirname.">")
1520 silent! enew!
1521 exe 'silent! file '.escape(dirname,' ')
1522 endif
1523 " set standard browser options on buffer
1524 setlocal ts=32 bt=nowrite bh=hide nobl
1525
1526 " set up all the maps
1527 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(expand("%:p"),<SID>NetGetDir()))<cr>
1528 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(expand("%:p"),'./'))<cr>
1529 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(expand("%:p"),'../'))<cr>
1530 nnoremap <buffer> <silent> a :let g:netrw_list_showall=1<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(expand("%:p"),'./'))<cr>
1531 nnoremap <buffer> <silent> <Leader>H :call <SID>NetHideEdit(1)<cr>
1532 nnoremap <buffer> <silent> <Leader>M :call <SID>NetMakeDir("")<cr>
1533 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
1534 nnoremap <buffer> <silent> o :exe g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(expand("%:p"),<SID>NetGetDir()))<cr>
1535 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(expand("%:p"),<SID>NetGetDir()))<cr>
1536 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>LocalBrowse(<SID>LocalBrowseChgDir(expand("%:p"),'./'))<cr>
1537 nnoremap <buffer> <silent> v :exe g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(expand("%:p"),<SID>NetGetDir()))<cr>
1538 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>LocalBrowseChgDir(expand("%:p"),<SID>NetGetDir()),0)<cr>
1539 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(expand("%:p"),<SID>NetGetDir()))<cr>
1540 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.expand("%:p").<SID>NetGetDir().'")<cr>'
1541 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.expand("%:p").<SID>NetGetDir().'")<cr>'
1542 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.expand("%:p").<SID>NetGetDir().'")<cr>'
1543 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.expand("%:p").<SID>NetGetDir().'")<cr>'
1544 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.expand("%:p").<SID>NetGetDir().'")<cr>'
1545 nnoremap <buffer> ? :he netrw-dir<cr>
1546
1547 " Set up the banner
1548 keepjumps put ='\" ================='
1549 keepjumps 1d
1550 keepjumps put ='\" Directory Listing'
1551 keepjumps put ='\" '.dirname
1552 let g:netrw_bannercnt= 6
1553 if g:netrw_sort_by =~ "^n"
1554 " sorted by name
1555 let g:netrw_bannercnt= g:netrw_bannercnt + 1
1556 keepjumps put ='\" Sorted by '.g:netrw_sort_by
1557 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1558 else
1559 " sorted by size or date
1560 keepjumps put ='\" Sorted by '.g:netrw_sort_by
1561 endif
1562 if g:netrw_list_hide != "" && !exists("g:netrw_list_showall")
1563 keepjumps put ='\" Hiding: '.g:netrw_list_hide
1564 let g:netrw_bannercnt= g:netrw_bannercnt + 1
1565 endif
1566 keepjumps put ='\" ================='
1567
1568 " generate the requested directory listing
1569 call LocalBrowseList(dirname)
1570
1571 " manipulate the directory listing (hide, sort)
1572 setlocal ft=netrwlist
1573 if line("$") >= g:netrw_bannercnt
1574 if !exists("g:netrw_list_showall")
1575 if g:netrw_list_hide != ""
1576 call s:NetrwListHide()
1577 endif
1578 else
1579 unlet g:netrw_list_showall
1580 endif
1581 if g:netrw_sort_by =~ "^n"
1582 call s:SetSort()
1583 exe 'keepjumps silent '.g:netrw_bannercnt.',$call s:NetSort()'
1584 exe 'keepjumps silent '.g:netrw_bannercnt.',$s/^\d\{3}\///e'
1585 else
1586 exe 'keepjumps silent '.g:netrw_bannercnt.',$call s:NetSort()'
1587 exe 'keepjumps silent '.g:netrw_bannercnt.',$s/^\d\{-}\///e'
1588 endif
1589 endif
1590 exe g:netrw_bannercnt
1591 try
1592 exe 'cd '.escape(substitute(dirname,'/$','','e'),' ')
1593" call Decho("changed directory to<".dirname.">")
1594 catch
1595 echoerr "Not a directory: <".dirname.">"
1596 endtry
1597
1598 setlocal noma nomod
1599
1600" call Dret("LocalBrowse")
1601endfun
1602
1603" ---------------------------------------------------------------------
1604" LocalBrowseList: does the job of "ls" for local directories {{{2
1605fun! LocalBrowseList(dirname)
1606" call Dfunc("LocalBrowseList(dirname<".a:dirname.">)")
1607
1608 let dirnamelen = strlen(a:dirname)
1609 let filelist = glob(a:dirname."*")."\n".glob(a:dirname.".*")
1610" call Decho("filelist<".filelist.">")
1611
1612 while filelist != ""
1613 if filelist =~ '\n'
1614 let file = substitute(filelist,'\n.*$','','e')
1615 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
1616 else
1617 let file = filelist
1618 let filelist= ""
1619 endif
1620 let pfile= file
1621 if isdirectory(file)
1622 let pfile= file."/"
1623 endif
1624 let pfile= strpart(pfile,dirnamelen)
1625 if g:netrw_longlist
1626 let pfile= pfile."\t".getfsize(file)."\t".strftime(g:netrw_timefmt,getftime(file))
1627 endif
1628 if g:netrw_sort_by =~ "^t"
1629 " sort by time (handles time up to 1 quintillion seconds, US)
1630" call Decho("getftime(".file.")=".getftime(file))
1631 let t = getftime(file)
1632 let ft = strpart("000000000000000000",1,18-strlen(t)).t
1633" call Decho("exe keepjumps put ='".ft.'/'.file."'")
1634 exe "keepjumps put ='".ft.'/'.pfile."'"
1635 elseif g:netrw_sort_by =~ "^s"
1636 " sort by size (handles file sizes up to 1 quintillion bytes, US)
1637" call Decho("getfsize(".file.")=".getfsize(file))
1638 let sz = getfsize(file)
1639 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
1640" call Decho("exe keepjumps put ='".fsz.'/'.file."'")
1641 exe "keepjumps put ='".fsz.'/'.pfile."'"
1642 else
1643 " sort by name
1644" call Decho("exe keepjumps put ='".file."'")
1645 exe "keepjumps put ='".pfile."'"
1646 endif
1647 endwhile
1648
1649" call Dret("LocalBrowseList")
1650endfun
1651
1652" ---------------------------------------------------------------------
1653" LocalBrowseChgDir: constructs a new directory based on the current {{{2
1654" directory and a new directory name
1655fun! <SID>LocalBrowseChgDir(dirname,newdir)
1656" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
1657
1658 let dirname= a:dirname
1659 let newdir = a:newdir
1660
1661 if dirname !~ '/$'
1662 " apparently vim is "recognizing" that it is in the home directory and
1663 " is removing the "/". Bad idea, so I have to put it back.
1664 let dirname= dirname.'/'
1665" call Decho("adjusting dirname<".dirname.">")
1666 endif
1667
1668 if newdir !~ '/$'
1669 " handling a file
1670 let dirname= dirname.newdir
1671" call Decho("handling a file: dirname<".dirname.">")
1672 exe "e ".dirname
1673
1674 elseif newdir == './'
1675 " refresh the directory list
1676" call Decho("refresh directory listing")
1677 setlocal ma
1678 %d
1679
1680 elseif newdir == '../'
1681 " go up one directory
1682 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+/$\)','\1','e')
1683" call Decho("go up one dir: dirname<".dirname.">")
1684
1685 else
1686 " go down one directory
1687 let dirname= dirname.newdir
1688" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
1689 endif
1690
1691" call Dret("LocalBrowseChgDir <".dirname.">")
1692 return dirname
1693endfun
1694
1695" ---------------------------------------------------------------------
1696" LocalBrowseRm:
1697fun! <SID>LocalBrowseRm(path) range
1698" call Dfunc("LocalBrowseRm(path<".a:path.">)")
1699" call Decho("firstline=".a:firstline." lastline=".a:lastline)
1700
1701 " preparation for removing multiple files/directories
1702 let ctr= a:firstline
1703
1704 " remove multiple files and directories
1705 while ctr <= a:lastline
1706 exe ctr
1707
1708 norm! 0
1709 let rmfile= a:path.expand("<cWORD>")
1710" call Decho("rmfile<".rmfile.">")
1711
1712 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '/$')
1713 " attempt to remove file
1714 call inputsave()
1715 let ok= input("Confirm deletion of file<".rmfile."> ","y")
1716 call inputrestore()
1717 if ok == "y"
1718 call delete(rmfile)
1719" call Decho("errcode=".v:shell_error)
1720 endif
1721
1722 else
1723 " attempt to remove directory
1724 call inputsave()
1725 let ok= input("Confirm deletion of directory<".rmfile."> ","y")
1726 call inputrestore()
1727 let rmfile= substitute(rmfile,'/$','','e')
1728
1729 if ok == "y"
1730 call system(g:netrw_local_rmdir." ".rmfile)
1731" call Decho("v:shell_error=".v:shell_error)
1732
1733 if v:shell_error != 0
1734" call Decho("2nd attempt to remove directory<".rmfile.">")
1735 let errcode= delete(rmfile)
1736" call Decho("errcode=".errcode)
1737
1738 if errcode != 0
1739 if has("unix")
1740" call Decho("3rd attempt to remove directory<".rmfile.">")
1741 call system("rm ".rmfile)
1742 if v:shell_error != 0
1743 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
1744 endif
1745 else
1746 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
1747 endif
1748 endif
1749 endif
1750 endif
1751 endif
1752
1753 let ctr= ctr + 1
1754 endwhile
1755
1756 " refresh the directory
1757 let curline= line(".")-1
1758" call Decho("refresh the directory")
1759 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(expand("%"),'./'))
1760 exe curline
1761
1762" call Dret("LocalBrowseRm")
1763endfun
1764
1765" ---------------------------------------------------------------------
1766" LocalBrowseRename: rename a remote file or directory {{{2
1767fun! <SID>LocalBrowseRename(path)
1768" call Dfunc("LocalBrowseRename(path<".a:path.">)")
1769
1770 " preparation for removing multiple files/directories
1771 let ctr= a:firstline
1772
1773 " attempt to rename files/directories
1774 while ctr <= a:lastline
1775 exe "keepjumps ".ctr
1776
1777 norm! 0
1778 let oldname= a:path.expand("<cWORD>")
1779" call Decho("oldname<".oldname.">")
1780
1781 call inputsave()
1782 let newname= input("Moving ".oldname." to : ",oldname)
1783 call inputrestore()
1784
1785 let ret= system(g:netrw_local_rename." ".oldname." ".newname)
1786" call Decho("executing system(".g:netrw_local_rename." ".oldname." ".newname)
1787
1788 let ctr= ctr + 1
1789 endwhile
1790
1791 " refresh the directory
1792 let curline= line(".")
1793 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(expand("%"),'./'))
1794 exe "keepjumps ".curline
1795" call Dret("LocalBrowseRename")
1796endfun
1797
1798" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00001799" NetMethod: determine method of transfer {{{1
1800" method == 1: rcp
1801" 2: ftp + <.netrc>
1802" 3: ftp + machine, id, password, and [path]filename
1803" 4: scp
1804" 5: http (wget)
1805" 6: cadaver
1806" 7: rsync
1807" 8: fetch
1808" 9: sftp
1809fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001810" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001811
1812 " initialization
1813 let b:netrw_method = 0
1814 let g:netrw_machine = ""
1815 let b:netrw_fname = ""
1816 let g:netrw_port = ""
1817
1818 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001819 " mipf : a:machine a:id password filename Use ftp
1820 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001821 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001822 " rcpurm : rcp://[user@]host/filename Use rcp
1823 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001824 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001825 " httpurm : http://[user@]host/filename Use wget
1826 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001827 " rsyncurm : rsync://host[:port]/path Use rsync
1828 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
1829 " sftpurm : sftp://[user@]host/filename Use scp
1830 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
1831 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
1832 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
1833 let rcpurm = '^rcp://\(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
1834 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
1835 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
1836 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001837 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001838 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
1839 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1840 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
1841
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001842" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001843 " Determine Method
1844 " rcp://user@hostname/...path-to-file
1845 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001846" call Decho("rcp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001847 let b:netrw_method = 1
1848 let userid = substitute(a:choice,rcpurm,'\2',"")
1849 let g:netrw_machine= substitute(a:choice,rcpurm,'\3',"")
1850 let b:netrw_fname = substitute(a:choice,rcpurm,'\4',"")
1851 if userid != ""
1852 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00001853 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001854
1855 " scp://user@hostname/...path-to-file
1856 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001857" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001858 let b:netrw_method = 4
1859 let g:netrw_machine= substitute(a:choice,scpurm,'\1',"")
1860 let b:netrw_port = substitute(a:choice,scpurm,'\2',"")
1861 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
1862
1863 " http://user@hostname/...path-to-file
1864 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001865" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001866 let b:netrw_method = 5
1867 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
1868 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
1869
1870 " dav://hostname[:port]/..path-to-file..
1871 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001872" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001873 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001874 if a:choice =~ '^s'
1875 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
1876 else
1877 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
1878 endif
1879 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001880
1881 " rsync://user@hostname/...path-to-file
1882 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001883" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001884 let b:netrw_method = 7
1885 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
1886 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
1887
1888 " ftp://[user@]hostname[[:#]port]/...path-to-file
1889 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001890" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001891 let userid = substitute(a:choice,ftpurm,'\2',"")
1892 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
1893 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
1894 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
1895 if g:netrw_port != ""
1896 let g:netrw_port = substitute(g:netrw_port,"[#:]","","")
1897 endif
1898 if userid != ""
1899 let g:netrw_uid= userid
1900 endif
1901 if exists("g:netrw_uid") && exists("g:netrw_passwd")
1902 let b:netrw_method = 3
1903 else
1904 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
1905 let b:netrw_method= 2
1906 else
1907 if !exists("g:netrw_uid") || g:netrw_uid == ""
1908 call NetUserPass()
1909 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
1910 call NetUserPass(g:netrw_uid)
1911 " else just use current g:netrw_uid and g:netrw_passwd
1912 endif
1913 let b:netrw_method= 3
1914 endif
1915 endif
1916
1917 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001918" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001919 let b:netrw_method = 8
1920 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
1921 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
1922 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
1923 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
1924
1925 " Issue an ftp : "machine id password [path/]filename"
1926 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001927" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001928 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001929 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
1930 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
1931 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
1932 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
1933
1934 " Issue an ftp: "hostname [path/]filename"
1935 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001936" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001937 if exists("g:netrw_uid") && exists("g:netrw_passwd")
1938 let b:netrw_method = 3
1939 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1940 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1941
1942 elseif filereadable(expand("$HOME/.netrc"))
1943 let b:netrw_method = 2
1944 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1945 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1946 endif
1947
1948 " sftp://user@hostname/...path-to-file
1949 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001950" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001951 let b:netrw_method = 9
1952 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
1953 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
1954
1955 " Issue an rcp: hostname:filename" (this one should be last)
1956 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001957" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001958 let b:netrw_method = 1
1959 let userid = substitute(a:choice,rcphf,'\2',"")
1960 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
1961 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001962" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1963" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1964" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1965" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001966 if userid != ""
1967 let g:netrw_uid= userid
1968 endif
1969 if has("win32")
1970 " don't let PCs try <.netrc>
1971 let b:netrw_method = 3
1972 endif
1973
1974 else
1975 echoerr "***error*** cannot determine method"
1976 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001977 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001978
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001979" call Decho("a:choice <".a:choice.">")
1980" call Decho("b:netrw_method <".b:netrw_method.">")
1981" call Decho("g:netrw_machine<".g:netrw_machine.">")
1982" call Decho("g:netrw_port <".g:netrw_port.">")
1983" if exists("g:netrw_uid") "Decho
1984" call Decho("g:netrw_uid <".g:netrw_uid.">")
1985" endif "Decho
1986" if exists("g:netrw_passwd") "Decho
1987" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
1988" endif "Decho
1989" call Decho("b:netrw_fname <".b:netrw_fname.">")
1990" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001991endfun
1992" end of NetMethod
1993
1994" ------------------------------------------------------------------------
1995" NetUserPass: set username and password for subsequent ftp transfer {{{1
1996" Usage: :call NetUserPass() -- will prompt for userid and password
1997" :call NetUserPass("uid") -- will prompt for password
1998" :call NetUserPass("uid","password") -- sets global userid and password
1999fun! NetUserPass(...)
2000
2001 " get/set userid
2002 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002003" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002004 if !exists("g:netrw_uid") || g:netrw_uid == ""
2005 " via prompt
2006 let g:netrw_uid= input('Enter username: ')
2007 endif
2008 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002009" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002010 let g:netrw_uid= a:1
2011 endif
2012
2013 " get password
2014 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002015" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002016 let g:netrw_passwd= inputsecret("Enter Password: ")
2017 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002018" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002019 let g:netrw_passwd=a:2
2020 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002021" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002022endfun
2023" end NetUserPass
2024
2025" ------------------------------------------------------------------------
2026" NetOptionSave: save options and set to "standard" form {{{1
2027fun!s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002028" call Dfunc("NetOptionSave()")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002029
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002030 " Get Temporary Filename
2031 let s:aikeep = &ai
2032 let s:cinkeep = &cin
2033 let s:cinokeep = &cino
2034 let s:comkeep = &com
2035 let s:cpokeep = &cpo
2036 let s:dirkeep = getcwd()
2037 let s:gdkeep = &gd
2038 let s:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00002039 setlocal cino =
2040 setlocal com =
2041 setlocal cpo -=aA
2042 setlocal nocin noai
2043 setlocal tw =0
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002044 if has("win32") && !has("win95")
2045 let s:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00002046 setlocal noswf
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002047" call Decho("setting s:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002048 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002049
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002050" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002051endfun
2052
2053" ------------------------------------------------------------------------
2054" NetOptionRestore: restore options {{{1
2055fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002056" call Dfunc("NetOptionRestore()")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002057
2058 let &ai = s:aikeep
2059 let &cin = s:cinkeep
2060 let &cino = s:cinokeep
2061 let &com = s:comkeep
2062 let &cpo = s:cpokeep
2063 exe "lcd ".s:dirkeep
2064 let &gd = s:gdkeep
2065 let &tw = s:twkeep
2066 if exists("s:swfkeep")
2067 let &swf= s:swfkeep
2068 unlet s:swfkeep
2069 endif
2070 unlet s:aikeep
2071 unlet s:cinkeep
2072 unlet s:cinokeep
2073 unlet s:comkeep
2074 unlet s:cpokeep
2075 unlet s:gdkeep
2076 unlet s:twkeep
2077 unlet s:dirkeep
2078
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002079" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002080endfun
2081
2082" ------------------------------------------------------------------------
2083" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002084" to handle extra junk that their system's ftp dumps
2085" into the transfer. This function is provided as an
2086" example and as a fix for a Windows 95 problem: in my
2087" experience, win95's ftp always dumped four blank lines
2088" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002089if has("win95") && g:netrw_win95ftp
2090 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002091" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002092 if method == 3 " ftp (no <.netrc>)
2093 let fourblanklines= line2 - 3
2094 silent fourblanklines.",".line2."g/^\s*/d"
2095 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002096" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002097 endfun
2098endif
2099
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002100" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002101" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002102fun! <SID>NetSort() range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002103" call Dfunc("NetSort()")
2104
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002105 let i = a:firstline + 1
2106 while i <= a:lastline
2107 " find insertion point via binary search
2108 let i_val = getline(i)
2109 let lo = a:firstline
2110 let hi = i
2111 while lo < hi
2112 let mid = (lo + hi) / 2
2113 let mid_val = getline(mid)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002114 if g:netrw_sort_direction =~ '^n'
2115 " normal sorting order
2116 if i_val < mid_val
2117 let hi = mid
2118 else
2119 let lo = mid + 1
2120 if i_val == mid_val | break | endif
2121 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002122 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002123 " reverse sorting order
2124 if i_val > mid_val
2125 let hi = mid
2126 else
2127 let lo = mid + 1
2128 if i_val == mid_val | break | endif
2129 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002130 endif
2131 endwhile
2132 " do insert
2133 if lo < i
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002134 exe 'keepjumps '.i.'d_'
2135 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002136 endif
2137 let i = i + 1
2138 endwhile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002139
2140" call Dret("NetSort")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002141endfun
2142
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002143" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002144" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
2145" What this function does is to compute a priority for the patterns
2146" in the g:netrw_sort_sequence. It applies a substitute to any
2147" "files" that satisfy each pattern, putting the priority / in
2148" front. An "*" pattern handles the default priority.
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002149fun! <SID>SetSort()
2150" call Dfunc("SetSort() bannercnt=".g:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002151 if g:netrw_longlist
2152 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
2153 else
2154 let seqlist = g:netrw_sort_sequence
2155 endif
2156 " sanity check -- insure that * appears somewhere
2157 if seqlist == ""
2158 let seqlist= '*'
2159 elseif seqlist !~ '\*'
2160 let seqlist= seqlist.',*'
2161 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002162 let priority = 1
2163 while seqlist != ""
2164 if seqlist =~ ','
2165 let seq = substitute(seqlist,',.*$','','e')
2166 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
2167 else
2168 let seq = seqlist
2169 let seqlist = ""
2170 endif
2171 let eseq= escape(seq,'/')
2172 if priority < 10
2173 let spriority= "00".priority.'\/'
2174 elseif priority < 100
2175 let spriority= "0".priority.'\/'
2176 else
2177 let spriority= priority.'\/'
2178 endif
2179" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
2180
2181 if seq == '*'
2182 exe 'keepjumps silent '.g:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
2183 else
2184 exe 'keepjumps silent '.g:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
2185 endif
2186 let priority = priority + 1
2187 endwhile
2188
2189 exe 'keepjumps silent '.g:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
2190
2191" call Dret("SetSort")
2192endfun
2193
Bram Moolenaar071d4272004-06-13 20:20:40 +00002194" ------------------------------------------------------------------------
2195" Restore {{{1
2196let &cpo= s:save_cpo
2197unlet s:save_cpo
2198" vim:ts=8 fdm=marker