blob: be6bb41dd993d6fec64cc89b19f2b4fac13536f9 [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaar269ec652004-07-29 08:43:53 +00002" Last Change: Jul 26, 2004
Bram Moolenaar071d4272004-06-13 20:20:40 +00003" Maintainer: Charles E. Campbell, Jr. PhD <drchipNOSPAM at campbellfamily.biz>
Bram Moolenaar269ec652004-07-29 08:43:53 +00004" Version: 47m
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 Moolenaar269ec652004-07-29 08:43:53 +000015let loaded_netrw = "v47m"
Bram Moolenaar8299df92004-07-10 09:47:34 +000016let 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
Bram Moolenaar269ec652004-07-29 08:43:53 +000082 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -lk"
Bram Moolenaar8299df92004-07-10 09:47:34 +000083endif
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
Bram Moolenaar269ec652004-07-29 08:43:53 +0000103if !exists("g:netrw_hide")
104 let g:netrw_hide= 1
105endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000106
107" BufEnter event ignored by decho when following variable is true
108" Has a side effect that doau BufReadPost doesn't work, so
109" files read by network transfer aren't appropriately highlighted.
110"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000111
112" ---------------------------------------------------------------------
113" Default values for global protocol variables {{{1
114if !exists("g:netrw_rcp_cmd")
115 let g:netrw_rcp_cmd = "rcp"
116endif
117if !exists("g:netrw_ftp_cmd")
118 let g:netrw_ftp_cmd = "ftp"
119endif
120if !exists("g:netrw_scp_cmd")
121 let g:netrw_scp_cmd = "scp -q"
122endif
123if !exists("g:netrw_sftp_cmd")
124 let g:netrw_sftp_cmd = "sftp"
125endif
126if !exists("g:netrw_http_cmd")
127 if executable("wget")
128 let g:netrw_http_cmd = "wget -q -O"
129 elseif executable("fetch")
130 let g:netrw_http_cmd = "fetch -o"
131 else
132 let g:netrw_http_cmd = ""
133 endif
134endif
135if !exists("g:netrw_dav_cmd")
136 let g:netrw_dav_cmd = "cadaver"
137endif
138if !exists("g:netrw_rsync_cmd")
139 let g:netrw_rsync_cmd = "rsync"
140endif
141if !exists("g:netrw_fetch_cmd")
142 if executable("fetch")
143 let g:netrw_fetch_cmd = "fetch -o"
144 else
145 let g:netrw_fetch_cmd = ""
146 endif
147endif
148
149if has("win32")
150 \ && exists("g:netrw_use_nt_rcp")
151 \ && g:netrw_use_nt_rcp
152 \ && executable( $SystemRoot .'/system32/rcp.exe')
153 let s:netrw_has_nt_rcp = 1
154 let s:netrw_rcpmode = '-b'
155 else
156 let s:netrw_has_nt_rcp = 0
157 let s:netrw_rcpmode = ''
158endif
159
160" ---------------------------------------------------------------------
161" Transparency Support: {{{1
Bram Moolenaar8299df92004-07-10 09:47:34 +0000162 " File Explorer: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000163if version >= 600
Bram Moolenaar8299df92004-07-10 09:47:34 +0000164 augroup FileExplorer
165 au!
166 au BufEnter * call <SID>LocalBrowse(expand("<afile>"))
167 augroup END
168 " Network Handler: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000169 augroup Network
170 au!
171 if has("win32")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000172 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 +0000173 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000174 au BufReadCmd file:///* exe "silent doau BufReadPre ".expand("<afile>")|exe 'e /'.substitute(expand("<afile>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<afile>")
175 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 +0000176 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000177 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>")
178 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 Moolenaar269ec652004-07-29 08:43:53 +0000179 au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("<afile>")|exe "Nwrite " .expand("<afile>")|exe "silent doau BufWritePost ".expand("<afile>")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000180 augroup END
181endif
182
183" ------------------------------------------------------------------------
184" Commands: :Nread, :Nwrite, and :NetUserPass {{{1
185com! -nargs=* Nread call <SID>NetSavePosn()<bar>call <SID>NetRead(<f-args>)<bar>call <SID>NetRestorePosn()
186com! -range=% -nargs=* Nwrite call <SID>NetSavePosn()<bar><line1>,<line2>call <SID>NetWrite(<f-args>)<bar>call <SID>NetRestorePosn()
187com! -nargs=* NetUserPass call NetUserPass(<f-args>)
188
189" ------------------------------------------------------------------------
190" NetSavePosn: saves position of cursor on screen {{{1
191fun! s:NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000192" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000193 " Save current line and column
194 let s:netrw_winnr= winnr()
195 let s:netrw_line = line(".")
196 let s:netrw_col = virtcol(".")
197
198 " Save top-of-screen line
199 norm! H0
200 let s:netrw_hline= line(".")
201
202 call s:NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000203" 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 +0000204endfun
205
206" ------------------------------------------------------------------------
207" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
208fun! <SID>NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000209" 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 +0000210
211 exe "silent! ".s:netrw_winnr."wincmd w"
212 if v:shell_error == 0
213 " as suggested by Bram M: redraw on no error
214 " allows protocol error messages to remain visible
215 redraw!
216 endif
217 " restore top-of-screen line
218 exe "norm! ".s:netrw_hline."G0z\<CR>"
219 " restore position
220 exe "norm! ".s:netrw_line."G0".s:netrw_col."\<bar>"
221
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000222" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000223endfun
224
225" ------------------------------------------------------------------------
226" NetRead: responsible for reading a file over the net {{{1
227fun! s:NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000228" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000229
230 " save options
231 call s:NetOptionSave()
232
233 " Special Exception: if a file is named "0r", then
234 " "0r" will be used to read the
235 " following files instead of "r"
236 if a:0 == 0
237 let readcmd= "r"
238 let ichoice= 0
239 elseif a:1 == "0r"
240 let readcmd = "0r"
241 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000242 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000243 let readcmd = "r"
244 let ichoice = 1
245 endif
246
247 " get name of a temporary file
248 let tmpfile= tempname()
249
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000250" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000251 while ichoice <= a:0
252
253 " attempt to repeat with previous host-file-etc
254 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000255" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000256 let choice = b:netrw_lastfile
257 let ichoice= ichoice + 1
258
259 else
260 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000261" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000262
263 " Reconstruct Choice if choice starts with '"'
264 if match(choice,"?") == 0
265 echo 'NetRead Usage:'
266 echo ':Nread machine:path uses rcp'
267 echo ':Nread "machine path" uses ftp with <.netrc>'
268 echo ':Nread "machine id password path" uses ftp'
269 echo ':Nread dav://machine[:port]/path uses cadaver'
270 echo ':Nread fetch://machine/path uses fetch'
271 echo ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
272 echo ':Nread http://[user@]machine/path uses http wget'
273 echo ':Nread rcp://[user@]machine/path uses rcp'
274 echo ':Nread rsync://machine[:port]/path uses rsync'
275 echo ':Nread scp://[user@]machine[[:#]port]/path uses scp'
276 echo ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
277 break
278 elseif match(choice,"^\"") != -1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000279" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000280 if match(choice,"\"$") != -1
281 " case "..."
282 let choice=strpart(choice,1,strlen(choice)-2)
283 else
284 " case "... ... ..."
285 let choice = strpart(choice,1,strlen(choice)-1)
286 let wholechoice = ""
287
288 while match(choice,"\"$") == -1
289 let wholechoice = wholechoice . " " . choice
290 let ichoice = ichoice + 1
291 if ichoice > a:0
292 echoerr "Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000293" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000294 return
295 endif
296 let choice= a:{ichoice}
297 endwhile
298 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
299 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000300 endif
301 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000302
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000303" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000304 let ichoice= ichoice + 1
305
306 " fix up windows urls
307 if has("win32")
308 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000309" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000310
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000311 exe 'lcd ' . fnamemodify(tmpfile,':h')
312 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000313 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000314
315 " Determine method of read (ftp, rcp, etc)
316 call s:NetMethod(choice)
317
Bram Moolenaar843ee412004-06-30 16:16:41 +0000318 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000319" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000320 if choice =~ "^.*/$"
321 if strlen(g:netrw_list_cmd) > 0
Bram Moolenaar843ee412004-06-30 16:16:41 +0000322 keepjumps call s:NetBrowse(choice)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000323" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000324 else
325 echoerr "sorry, can't do a remote listing; ssh isn't executable"
326 endif
327 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000328 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000329
330 " ============
331 " Perform Read
332 " ============
333
334 ".........................................
335 " rcp: NetRead Method #1
336 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000337" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000338 " ER: noting done with g:netrw_uid yet?
339 " ER: on Win2K" rcp machine[.user]:file tmpfile
340 " ER: if machine contains '.' adding .user is required (use $USERNAME)
341 " ER: the tmpfile is full path: rcp sees C:\... as host C
342 if s:netrw_has_nt_rcp == 1
343 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
344 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
345 else
346 " Any way needed it machine contains a '.'
347 let uid_machine = g:netrw_machine .'.'. $USERNAME
348 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000349 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000350 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
351 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
352 else
353 let uid_machine = g:netrw_machine
354 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000355 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000356" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000357 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
358 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
359 let b:netrw_lastfile = choice
360
361 ".........................................
362 " ftp + <.netrc>: NetRead Method #2
363 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000364" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000365 let netrw_fname= b:netrw_fname
366 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000367 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000368 exe "put ='".g:netrw_ftpmode."'"
369 exe "put ='get ".netrw_fname." ".tmpfile."'"
370 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000371" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000372 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
373 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000374" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000375 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
376 endif
377 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
378 if getline(1) !~ "^$"
379 echoerr getline(1)
380 endif
381 bd!
382 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
383 let b:netrw_lastfile = choice
384
385 ".........................................
386 " ftp + machine,id,passwd,filename: NetRead Method #3
387 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
388 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000389" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000390 let netrw_fname= b:netrw_fname
391 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000392 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000393 if exists("g:netrw_port") && g:netrw_port != ""
394 put ='open '.g:netrw_machine.' '.g:netrw_port
395 else
396 put ='open '.g:netrw_machine
397 endif
398
399 if exists("g:netrw_ftp") && g:netrw_ftp == 1
400 put =g:netrw_uid
401 put =g:netrw_passwd
402 else
403 put ='user '.g:netrw_uid.' '.g:netrw_passwd
404 endif
405
406 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
407 put =g:netrw_ftpmode
408 endif
409 put ='get '.netrw_fname.' '.tmpfile
410
411 " perform ftp:
412 " -i : turns off interactive prompting from ftp
413 " -n unix : DON'T use <.netrc>, even though it exists
414 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000415" call Decho('performing ftp -i -n')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000416 norm 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000417" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000418 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
419 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
420 if getline(1) !~ "^$"
421 echoerr getline(1)
422 endif
423 bd!
424 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
425 let b:netrw_lastfile = choice
426
427 ".........................................
428 " scp: NetRead Method #4
429 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000430" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000431 if exists("g:netrw_port") && g:netrw_port != ""
432 let useport= " -P ".g:netrw_port
433 else
434 let useport= ""
435 endif
436 if g:netrw_cygwin == 1
437 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000438" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000439 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
440 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000441" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000442 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
443 endif
444 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
445 let b:netrw_lastfile = choice
446
447 ".........................................
448 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000449" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000450 if g:netrw_http_cmd == ""
451 echoerr "neither wget nor fetch command is available"
452 exit
453 endif
454
455 if match(b:netrw_fname,"#") == -1
456 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000457" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000458 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
459 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
460
461 else
462 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
463 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
464 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000465" call Decho("netrw_html<".netrw_html.">")
466" call Decho("netrw_tag <".netrw_tag.">")
467" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000468 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
469 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000470" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000471 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
472 endif
473 let b:netrw_lastfile = choice
474
475 ".........................................
476 " cadaver: NetRead Method #6
477 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000478" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000479
480 " Construct execution string (four lines) which will be passed through filter
481 let netrw_fname= b:netrw_fname
482 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000483 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000484 if exists("g:netrw_port") && g:netrw_port != ""
485 put ='open '.g:netrw_machine.' '.g:netrw_port
486 else
487 put ='open '.g:netrw_machine
488 endif
489 put ='user '.g:netrw_uid.' '.g:netrw_passwd
490
491 if g:netrw_cygwin == 1
492 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
493 put ='get '.netrw_fname.' '.cygtmpfile
494 else
495 put ='get '.netrw_fname.' '.tmpfile
496 endif
497
498 " perform cadaver operation:
499 norm 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000500" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000501 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
502 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000503 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000504 let b:netrw_lastfile = choice
505
506 ".........................................
507 " rsync: NetRead Method #7
508 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000509" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000510 if g:netrw_cygwin == 1
511 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000512" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000513 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
514 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000515" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000516 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
517 endif
518 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
519 let b:netrw_lastfile = choice
520
521 ".........................................
522 " fetch: NetRead Method #8
523 " fetch://[user@]host[:http]/path
524 elseif b:netrw_method == 8 " read with fetch
525 if g:netrw_fetch_cmd == ""
526 echoerr "fetch command not available"
527 exit
528 endif
529 if exists("g:netrw_option") && g:netrw_option == ":http"
530 let netrw_option= "http"
531 else
532 let netrw_option= "ftp"
533 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000534" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000535
536 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000537" 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 +0000538 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
539 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000540" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000541 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
542 endif
543
544 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
545 let b:netrw_lastfile = choice
546
547 ".........................................
548 " sftp: NetRead Method #9
549 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000550" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000551 if g:netrw_cygwin == 1
552 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000553" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
554" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000555 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
556 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000557" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000558 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
559 endif
560 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
561 let b:netrw_lastfile = choice
562
563 ".........................................
564 else " Complain
565 echo "***warning*** unable to comply with your request<" . choice . ">"
566 endif
567 endwhile
568
569 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000570" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000571 if exists("b:netrw_method")
572 unlet b:netrw_method
573 unlet g:netrw_machine
574 unlet b:netrw_fname
575 endif
576 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000577
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000578" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000579endfun
580" end of NetRead
581
582" ------------------------------------------------------------------------
583" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
584fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000585" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000586
587 if exists("*NetReadFixup")
588 " for the use of NetReadFixup (not otherwise used internally)
589 let line2= line("$")
590 endif
591
592 " transform paths from / to \ for Windows, unless the shell is bash
593 if &term == "win32"
594 if &shell == "bash"
595 let fname=a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000596" call Decho("(win32 && bash) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000597 else
598 let fname=substitute(a:fname,'/','\\\\','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000599" call Decho("(win32 && !bash) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000600 endif
601 else
602 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000603" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000604 endif
605
606 " get the file, but disable undo when reading a new buffer
607 if a:readcmd[0] == '0'
608 let use_e_cmd = 0 " 1 when using ':edit'
609 let delline = 0 " 1 when have to delete empty last line
610 if line("$") == 1 && getline(1) == ""
611 " Now being asked to 0r a file into an empty file.
612 " Safe to :e it instead, unless there is another window on the same buffer.
613 let curbufnr = bufnr("%")
614 let use_e_cmd = 1
615 let delline = 1
616 " Loop over all windows,
617 " reset use_e_cmd when another one is editing the current buffer.
618 let i = 1
619 while 1
620 if i != winnr() && winbufnr(i) == curbufnr
621 let use_e_cmd = 0
622 break
623 endif
624 let i = i + 1
625 if winbufnr(i) < 0
626 break
627 endif
628 endwhile
629 endif
630
631 if use_e_cmd > 0
632 " ':edit' the temp file, wipe out the old buffer and rename the buffer
633 let curfilename = expand("%")
634
635 let binlocal = &l:bin
636 let binglobal = &g:bin
637 if binlocal
638 setglobal bin " Need to set 'bin' globally for ":e" command.
639 endif
640 silent exe "e! ".v:cmdarg." ".fname
641 if binlocal && !binglobal
642 setglobal nobin
643 setlocal bin
644 endif
645
646 exe curbufnr . "bwipe!"
647 exe "f ".curfilename
648 " the ":f newname" apparently leaves the temporary file as the alternate
649 " file in the buffer list (see :ls!). The following command wipes it out.
650 exe bufnr("#")."bwipe!"
651 else
652 let oldul= &ul
Bram Moolenaar8299df92004-07-10 09:47:34 +0000653 setlocal ul=-1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000654 exe a:readcmd." ".v:cmdarg." ".fname
655 if delline > 0
656 " wipe out last line, which should be a blank line anyway
657 $del
658 endif
659 let &ul= oldul
660 endif
661 elseif filereadable(fname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000662" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000663 exe a:readcmd." ".v:cmdarg." ".fname
664 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000665" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000666 return
667 endif
668
669 " User-provided (ie. optional) fix-it-up command
670 if exists("*NetReadFixup")
671 let line1= line(".")
672 if a:readcmd == "r"
673 let line2= line("$") - line2 + line1
674 else
675 let line2= line("$") - line2
676 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000677" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000678 call NetReadFixup(a:method, line1, line2)
679 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000680
681 " update the Buffers menu
682 if has("gui") && has("gui_running")
683 silent! emenu Buffers.Refresh\ menu
684 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000685
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000686" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000687
688 " insure that we have the right filetype and that its being displayed
689 filetype detect
690 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000691" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000692endfun
693
694" ------------------------------------------------------------------------
695" NetWrite: responsible for writing a file over the net {{{1
696fun! s:NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000697" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000698
699 " option handling
700 let mod= 0
701 call s:NetOptionSave()
702
703 " Get Temporary Filename
704 let tmpfile= tempname()
705
706 if a:0 == 0
707 let ichoice = 0
708 else
709 let ichoice = 1
710 endif
711
712 " write (selected portion of) file to temporary
713 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
714
715 while ichoice <= a:0
716
717 " attempt to repeat with previous host-file-etc
718 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000719" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000720 let choice = b:netrw_lastfile
721 let ichoice= ichoice + 1
722 else
723 exe "let choice= a:" . ichoice
724
725 " Reconstruct Choice if choice starts with '"'
726 if match(choice,"?") == 0
727 echo 'NetWrite Usage:"'
728 echo ':Nwrite machine:path uses rcp'
729 echo ':Nwrite "machine path" uses ftp with <.netrc>'
730 echo ':Nwrite "machine id password path" uses ftp'
731 echo ':Nwrite dav://[user@]machine/path uses cadaver'
732 echo ':Nwrite fetch://[user@]machine/path uses fetch'
733 echo ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
734 echo ':Nwrite rcp://machine/path uses rcp'
735 echo ':Nwrite rsync://[user@]machine/path uses rsync'
736 echo ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
737 echo ':Nwrite sftp://[user@]machine/path uses sftp'
738 break
739
740 elseif match(choice,"^\"") != -1
741 if match(choice,"\"$") != -1
742 " case "..."
743 let choice=strpart(choice,1,strlen(choice)-2)
744 else
745 " case "... ... ..."
746 let choice = strpart(choice,1,strlen(choice)-1)
747 let wholechoice = ""
748
749 while match(choice,"\"$") == -1
750 let wholechoice= wholechoice . " " . choice
751 let ichoice = ichoice + 1
752 if choice > a:0
753 echoerr "Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000754" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000755 return
756 endif
757 let choice= a:{ichoice}
758 endwhile
759 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
760 endif
761 endif
762 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000763" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000764 let ichoice= ichoice + 1
765
766 " fix up windows urls
767 if has("win32")
768 let choice= substitute(choice,'\\','/','ge')
769 "ER: see NetRead()
770 exe 'lcd ' . fnamemodify(tmpfile,':h')
771 let tmpfile = fnamemodify(tmpfile,':t')
772 endif
773
774 " Determine method of read (ftp, rcp, etc)
775 call s:NetMethod(choice)
776
777 " =============
778 " Perform Write
779 " =============
780
781 ".........................................
782 " rcp: NetWrite Method #1
783 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000784" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000785 if s:netrw_has_nt_rcp == 1
786 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
787 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
788 else
789 let uid_machine = g:netrw_machine .'.'. $USERNAME
790 endif
791 else
792 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
793 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
794 else
795 let uid_machine = g:netrw_machine
796 endif
797 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000798" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000799 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
800 let b:netrw_lastfile = choice
801
802 ".........................................
803 " ftp + <.netrc>: NetWrite Method #2
804 elseif b:netrw_method == 2 " write with ftp + <.netrc>
805 let netrw_fname = b:netrw_fname
806 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000807 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000808 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000809" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000810 exe "put ='put ".tmpfile." ".netrw_fname."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000811" call Decho("put ='put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000812 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000813" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000814 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000815 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000816" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000817 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000818 endif
819 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
820 if getline(1) !~ "^$"
821 echoerr getline(1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000822 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000823 endif
824 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000825 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000826
827 ".........................................
828 " ftp + machine, id, passwd, filename: NetWrite Method #3
829 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
830 let netrw_fname= b:netrw_fname
831 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000832 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000833 if exists("g:netrw_port") && g:netrw_port != ""
834 put ='open '.g:netrw_machine.' '.g:netrw_port
835 else
836 put ='open '.g:netrw_machine
837 endif
838 if exists("g:netrw_ftp") && g:netrw_ftp == 1
839 put =g:netrw_uid
840 put =g:netrw_passwd
841 else
842 put ='user '.g:netrw_uid.' '.g:netrw_passwd
843 endif
844 put ='put '.tmpfile.' '.netrw_fname
845 " save choice/id/password for future use
846 let b:netrw_lastfile = choice
847
848 " perform ftp:
849 " -i : turns off interactive prompting from ftp
850 " -n unix : DON'T use <.netrc>, even though it exists
851 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000852" call Decho('performing ftp -i -n')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000853 norm 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000854" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000855 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
856 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
857 if getline(1) !~ "^$"
858 echoerr getline(1)
859 let mod=1
860 endif
861 bd!
862
863 ".........................................
864 " scp: NetWrite Method #4
865 elseif b:netrw_method == 4 " write with scp
866 if exists("g:netrw_port") && g:netrw_port != ""
867 let useport= " -P ".g:netrw_port
868 else
869 let useport= ""
870 endif
871 if g:netrw_cygwin == 1
872 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000873" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000874 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
875 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000876" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000877 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
878 endif
879 let b:netrw_lastfile = choice
880
881 ".........................................
882 " http: NetWrite Method #5
883 elseif b:netrw_method == 5
884 echoerr "***warning*** currently <netrw.vim> does not support writing using http:"
885
886 ".........................................
887 " dav: NetWrite Method #6
888 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000889" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000890
891 " Construct execution string (four lines) which will be passed through filter
892 let netrw_fname= b:netrw_fname
893 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000894 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000895 if exists("g:netrw_port") && g:netrw_port != ""
896 put ='open '.g:netrw_machine.' '.g:netrw_port
897 else
898 put ='open '.g:netrw_machine
899 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000900 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000901
902 if g:netrw_cygwin == 1
903 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
904 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000905 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000906 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000907 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000908
909 " perform cadaver operation:
910 norm 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000911" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000912 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
913 bd!
914 let b:netrw_lastfile = choice
915
916 ".........................................
917 " rsync: NetWrite Method #7
918 elseif b:netrw_method == 7 " write with rsync
919 if g:netrw_cygwin == 1
920 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000921" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000922 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000923 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000924" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000925 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000926 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000927 let b:netrw_lastfile = choice
928
929 ".........................................
930 " scp: NetWrite Method #9
931 elseif b:netrw_method == 9 " write with sftp
932 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000933 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
934 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
935 else
936 let uid_machine = g:netrw_machine
937 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000938 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000939 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000940 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000941 norm 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000942" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000943 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
944 bd!
945 let b:netrw_lastfile= choice
946
947 ".........................................
948 else " Complain
949 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000950 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000951 endwhile
952
953 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000954" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000955 let result=delete(tmpfile)
956 call s:NetOptionRestore()
957
958 if a:firstline == 1 && a:lastline == line("$")
959 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +0000960 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000961
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000962" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000963endfun
964" end of NetWrite
965
966" ------------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000967" Browsing Support For Remote Directories And Files: {{{1
Bram Moolenaar843ee412004-06-30 16:16:41 +0000968" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000969" of the contents of a remote directory. It is assumed that the
970" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
971" with the requested remote hostname first.
Bram Moolenaar843ee412004-06-30 16:16:41 +0000972fun! <SID>NetBrowse(dirname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000973" call Dfunc("NetBrowse(dirname<".a:dirname.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +0000974
975 " sanity check
976 if !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
977 echoerr "***netrw*** this system doesn't support remote directory listing"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000978" call Dret("NetBrowse 0")
Bram Moolenaar843ee412004-06-30 16:16:41 +0000979 return 0
980 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000981
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000982 " make this buffer modifiable
983 setlocal ma
984
985 " analyze a:dirname and g:netrw_list_cmd
986 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
987 if a:dirname !~ dirpat
Bram Moolenaar843ee412004-06-30 16:16:41 +0000988 echoerr "NetBrowse: I don't understand your dirname<".a:dirname.">"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000989" call Dret("NetBrowse 0 : badly formatted dirname")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000990 return 0
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000991 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +0000992
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000993 let method = substitute(a:dirname,dirpat,'\1','')
994 let user = substitute(a:dirname,dirpat,'\2','')
995 let machine = substitute(a:dirname,dirpat,'\3','')
996 let path = substitute(a:dirname,dirpat,'\4','')
997 let fname = substitute(a:dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000998" call Decho("set up method <".method .">")
999" call Decho("set up user <".user .">")
1000" call Decho("set up machine<".machine.">")
1001" call Decho("set up path <".path .">")
1002" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001003
Bram Moolenaar8299df92004-07-10 09:47:34 +00001004 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001005
Bram Moolenaar8299df92004-07-10 09:47:34 +00001006 " optionally sort by time (-t) or by size (-S)
1007 if g:netrw_sort_by =~ "^t"
1008 let listcmd= listcmd."t"
1009 elseif g:netrw_sort_by =~ "^s"
1010 let listcmd= listcmd."S"
1011 endif
1012 " optionally sort in reverse
1013 if g:netrw_sort_direction =~ "^r"
1014 let listcmd= listcmd."r"
1015 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001016
1017" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001018
1019 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001020" call Decho("attempt transfer of symlink as file")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001021 call s:NetBrowse(substitute(a:dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001022 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001023" call Dret("NetBrowse 0 : symlink")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001024 return 0
1025
1026 elseif fname !~ '/$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001027 " looks like a regular file, attempt transfer
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001028" call Decho("attempt transfer as regular file<".a:dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001029
1030 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001031 " "this is a directory" indicator (/). There shouldn't be one of those,
1032 " anyway.
1033 let path= substitute(path,'[*=@|]$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001034" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001035
1036 " remote-read the requested file into current buffer
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001037 enew!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001038 exe "file ".method."://".user.machine."/".escape(path,' ')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001039 exe "silent doau BufReadPre ".fname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001040 silent call s:NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001041 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001042 keepjumps 1d
1043 setlocal nomod
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001044
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001045" call Dret("NetBrowse 0 : file<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001046 return 0
1047 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001048
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001049 " ---------------------------------------------------------------------
1050 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001051" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001052 " set up new buffer and map
1053 let bufname = method.'://'.user.machine.'/'.path
1054 let bufnamenr = bufnr(bufname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001055" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001056 if bufnamenr != -1
1057 " buffer already exists, switch to it!
1058 exe "b ".bufnamenr
1059 if line("$") >= 5
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001060" call Dret("NetBrowse 1")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001061 return 1
1062 endif
1063 else
1064 enew!
1065 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001066 setlocal ts=32 bt=nofile bh=wipe nobl
1067 exe 'file '.escape(bufname,' ')
Bram Moolenaar269ec652004-07-29 08:43:53 +00001068" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001069 setlocal bt=nowrite bh=hide nobl
1070 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetDir()))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001071 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
1072 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaar269ec652004-07-29 08:43:53 +00001073 nnoremap <buffer> <silent> a :let g:netrw_hide=!g:netrw_hide<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
1074 nnoremap <buffer> <silent> <Leader>h :call <SID>NetHideEdit(0)<cr>
1075 nnoremap <buffer> <silent> i :call <SID>NetSavePosn()<bar>call <SID>NetLongList(0)<bar>call <SID>NetRestorePosn()<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00001076 nnoremap <buffer> <silent> o :exe g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetDir()))<cr>
1077 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 +00001078 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 +00001079 nnoremap <buffer> <silent> v :exe g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetDir()))<cr>
1080 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetDir()),1)<cr>
1081 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 +00001082 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1083 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1084 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1085 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1086 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001087 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
1088 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001089 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001090 setlocal ma
1091
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001092 " Set up the banner
1093" call Decho("executing: r! ".listcmd." '".path."'")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001094 keepjumps put ='\" =============================='
1095 keepjumps put ='\" Netrw Remote Directory Listing'
1096 keepjumps put ='\" '.bufname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001097 let g:netrw_bannercnt= 6
1098 if g:netrw_sort_by =~ "^n"
1099 " sorted by name
1100 let g:netrw_bannercnt= g:netrw_bannercnt + 1
1101 keepjumps put ='\" Sorted by '.g:netrw_sort_by
1102 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1103 else
1104 " sorted by size or date
1105 keepjumps put ='\" Sorted by '.g:netrw_sort_by
1106 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001107 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaar843ee412004-06-30 16:16:41 +00001108 keepjumps put ='\" Hiding: '.g:netrw_list_hide
1109 let g:netrw_bannercnt= g:netrw_bannercnt + 1
1110 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001111 keepjumps put ='\" =============================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001112
1113 " remote read the requested directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001114 exe "silent r! ".listcmd." '".path."'"
1115 keepjumps 1d
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001116
1117 " manipulate the directory listing (hide, sort)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001118 setlocal ft=netrwlist
Bram Moolenaar843ee412004-06-30 16:16:41 +00001119 if line("$") >= g:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001120 if g:netrw_hide && g:netrw_list_hide != ""
1121 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001122 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001123 if g:netrw_longlist
1124 " do a long listing; these substitutions need to be done prior to sorting
1125 keepjumps silent /^total\s*\d\+$/d
1126 exe 'keepjumps silent '.g:netrw_bannercnt.',$s/ -> .*$//e'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001127 exe 'keepjumps silent '.g:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001128 exe g:netrw_bannercnt
1129 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001130 if g:netrw_sort_by =~ "^n"
1131 call s:SetSort()
1132 exe 'keepjumps silent '.g:netrw_bannercnt.',$call s:NetSort()'
1133 exe 'keepjumps silent '.g:netrw_bannercnt.',$s/^\d\{3}\///e'
1134 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001135 if g:netrw_longlist
1136 " shorten the list to keep its width <= 80 characters
1137 exe "keepjumps silent ".g:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
1138 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001139 endif
1140
1141 setlocal noma nomod
1142
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001143" call Dret("NetBrowse 1")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001144 return 1
1145endfun
1146
1147" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001148" NetBrowseChgDir: {{{2
1149fun! <SID>NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001150" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001151
1152 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001153 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001154
1155 if newdir !~ '/$'
1156 " handling a file
1157 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001158" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001159
1160 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001161 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001162" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001163 setlocal ma
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001164 %d
1165
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001166 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001167 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001168 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001169
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001170 if trailer =~ '^\%(\.\./\)*$'
1171 " tack on a ../"
1172 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001173
1174 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001175 " strip off a directory name from dirname
1176 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001177 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001178" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001179
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001180 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001181 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001182 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001183" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001184 endif
1185
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001186" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001187 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001188endfun
1189
Bram Moolenaar843ee412004-06-30 16:16:41 +00001190" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001191" NetGetDir: it gets the directory named under the cursor
1192fun! <SID>NetGetDir()
Bram Moolenaar269ec652004-07-29 08:43:53 +00001193" call Dfunc("NetGetDir() line#".line("."))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001194 let dirname= getline(".")
1195 if dirname =~ '\t'
1196 let dirname= substitute(dirname,'\t.*$','','e')
1197 endif
1198" call Dret("NetGetDir <".dirname.">")
1199 return dirname
1200endfun
1201
1202" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001203" NetBrowseRm: remove a remote file or directory {{{2
1204fun! <SID>NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001205" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1206" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001207
1208 " preparation for removing multiple files/directories
1209 let ctr= a:firstline
1210
1211 " remove multiple files and directories
1212 while ctr <= a:lastline
1213 exe ctr
1214
1215 norm! 0
Bram Moolenaar269ec652004-07-29 08:43:53 +00001216 let rmfile= a:path.s:NetGetDir()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001217" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001218
1219 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '/$')
1220 " attempt to remove file
1221 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' '.rmfile
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001222" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001223 call inputsave()
1224 let ok= input("Confirm deletion of file<".rmfile."> ","y")
1225 call inputrestore()
1226 if ok == "y"
1227 let ret= system(netrw_rm_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001228" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001229 endif
1230
1231 else
1232 " attempt to remove directory
1233 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '.rmfile
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001234" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001235 call inputsave()
1236 let ok= input("Confirm deletion of directory<".rmfile."> ","y")
1237 call inputrestore()
1238
1239 if ok == "y"
1240 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001241" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001242
1243 if v:shell_error != 0
1244 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'/$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001245" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001246 let ret= system(netrw_rmf_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001247" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001248
1249 if v:shell_error != 0
1250 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
1251 endif
1252 endif
1253 endif
1254 endif
1255
1256 let ctr= ctr + 1
1257 endwhile
1258
1259 " refresh the directory
1260 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001261" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001262 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1263 exe curline
1264
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001265" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001266endfun
1267
1268" ---------------------------------------------------------------------
1269" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00001270fun! <SID>NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001271" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001272
1273 " preparation for removing multiple files/directories
1274 let ctr = a:firstline
1275 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1276
1277 " attempt to rename files/directories
1278 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001279 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001280
1281 norm! 0
Bram Moolenaar269ec652004-07-29 08:43:53 +00001282 let oldname= a:path.s:NetGetDir()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001283" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001284
1285 call inputsave()
1286 let newname= input("Moving ".a:usrhost."'s ".oldname." to : ",oldname)
1287 call inputrestore()
1288
1289 let ret= system(rename_cmd." ".oldname." ".newname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001290" call Decho("executing system(".rename_cmd." ".oldname." ".newname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001291
1292 let ctr= ctr + 1
1293 endwhile
1294
1295 " refresh the directory
1296 let curline= line(".")
1297 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001298 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001299" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001300endfun
1301
1302" ---------------------------------------------------------------------
1303" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001304" files given their extension. Passes 0=local, 1=remote
1305fun! <SID>NetBrowseX(fname,remote)
1306" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001307
1308 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001309" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar843ee412004-06-30 16:16:41 +00001310 if exten != "" && exists("*NetrwFileHandler_".exten)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001311
1312 let fname= a:fname
1313 if a:remote == 1
1314 " create a local copy
1315 let fname= tempname().".".exten
1316" call Decho("create a local copy of <".a:fname."> as <".fname.">")
1317 exe "keepjumps silent bot 1new ".a:fname
1318 let eikeep= &ei
1319 set ei=all bh=delete
1320 exe "w! ".fname
1321 let &ei= eikeep
1322 q
1323 endif
1324
1325 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
1326 redraw!
1327
1328 " cleanup: remove temporary file,
1329 " delete current buffer if success with handler,
1330 " return to prior buffer (directory listing)
1331 if a:remote == 1 && fname != a:fname
1332" call Decho("deleting temporary file<".fname.">")
1333 call delete(fname)
1334 endif
1335 if ret != 0
1336 let eikeep= &ei
1337 set ei=all bh=delete bt=nofile
1338 exe "norm! \<c-o>"
1339 let &ei= eikeep
1340 redraw!
1341 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001342 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001343
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001344" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001345endfun
1346
1347" ---------------------------------------------------------------------
1348" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1349" separated patterns given in g:netrw_list_hide
1350fun! <SID>NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001351" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001352
1353 let listhide= g:netrw_list_hide
1354 while listhide != ""
1355 if listhide =~ ','
1356 let hide = substitute(listhide,',.*$','','e')
1357 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1358 else
1359 let hide = listhide
1360 let listhide= ""
1361 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001362" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001363 exe 'keepjumps silent '.g:netrw_bannercnt.',$g~'.hide.'~d'
1364 endwhile
1365
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001366" call Dret("NetrwListHide")
1367endfun
1368
1369" ---------------------------------------------------------------------
1370" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar8299df92004-07-10 09:47:34 +00001371fun! <SID>NetHideEdit(mode)
1372" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001373
1374 call inputsave()
1375 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1376 call inputrestore()
1377
1378 " refresh the listing
1379 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001380 if a:mode == 0
1381 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1382 else
1383 silent call s:LocalBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1384 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001385
1386" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001387endfun
1388
Bram Moolenaar8299df92004-07-10 09:47:34 +00001389" ---------------------------------------------------------------------
1390" NetLongList: {{{2
1391fun! <SID>NetLongList(mode)
1392" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".g:netrw_longlist)
1393
1394 if g:netrw_longlist != 0
1395 " turn long listing off
1396 let g:netrw_longlist = 0
1397 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1398
1399 else
1400 " turn long listing on
1401 let g:netrw_longlist = 1
1402 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
1403 endif
1404
1405 " refresh the listing
1406 if a:mode == 0
1407 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1408 else
1409 silent call <SID>LocalBrowse(<SID>LocalBrowseChgDir(expand("%"),"./"))
1410 endif
1411
1412" call Dret("NetLongList : g:netrw_longlist=".g:netrw_longlist)
1413endfun
1414
1415" ---------------------------------------------------------------------
1416" NetMakeDir: this function makes a directory (both local and remote)
1417fun! <SID>NetMakeDir(usrhost)
1418" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
1419
1420 " get name of new directory from user. A bare <CR> will skip.
1421 " if its currently a directory, also request will be skipped, but with
1422 " a message.
1423 call inputsave()
1424 let newdirname= input("Please give directory name: ")
1425 call inputrestore()
1426
1427 if newdirname == ""
1428" call Dret("NetMakeDir : user aborted with bare <cr>")
1429 return
1430 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001431 let newdirname= escape(newdirname,' ')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001432
1433 if a:usrhost == ""
1434
1435 " Local mkdir:
1436 " sanity checks
1437 if isdirectory(newdirname)
1438 echoerr "***warning*** <".newdirname."> is already a directory!"
1439" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
1440 return
1441 endif
1442 if filereadable(newdirname)
1443 echoerr "***warning*** <".newdirname."> is already a file!"
1444" call Dret("NetMakeDir : file<".newdirname."> exists previously")
1445 return
1446 endif
1447 exe "silent! !".g:netrw_local_mkdir." ".newdirname
1448 if v:shell_error == 0
1449 " refresh listing
1450 call s:LocalBrowse(".")
1451 else
1452 echoerr "***warning*** unable to make directory<".newdirname.">"
1453 endif
1454 redraw!
1455
1456 else
1457 " Remote mkdir:
1458 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
1459 let newdirname= substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
1460" call Decho("exe silent! !".mkdircmd." ".newdirname)
1461 exe "silent! !".mkdircmd." ".newdirname
1462 if v:shell_error == 0
1463 " refresh listing
1464 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1465 else
1466 echoerr "***warning*** unable to make directory<".newdirname.">"
1467 endif
1468 redraw!
1469 endif
1470
1471" call Dret("NetMakeDir")
1472endfun
1473
1474" ---------------------------------------------------------------------
1475" Browsing Support For Local Directories And Files: {{{1
1476
1477" ---------------------------------------------------------------------
1478" LocalBrowse: supports local file/directory browsing {{{2
1479fun! <SID>LocalBrowse(dirname)
1480
1481" let dirname= (a:dirname == "")? expand("%:p") : a:dirname
1482 if !isdirectory(a:dirname)
1483 " not a directory, ignore it
1484 return
1485 endif
1486
1487" " unfortunate interaction -- when putting Dfunc/Dret above
1488 " one can no longer enter the DBG buffer.
1489" call Dfunc("LocalBrowse(dirname<".a:dirname.">)")
1490
Bram Moolenaar269ec652004-07-29 08:43:53 +00001491 exe 'cd '.escape(substitute(a:dirname,'\\','/','ge'),' ')
1492 let dirname= substitute(getcwd(),'\\','/','ge')."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00001493" call Decho("dirname<".dirname.">")
1494
1495 " make this buffer modifiable
1496 setlocal ma
1497
1498 " ---------------------------------------------------------------------
1499 " Perform Directory Listing:
1500" call Decho("Perform directory listing...")
1501 " set up new buffer and map
1502 let dirnamenr = bufnr(dirname)
1503 if dirnamenr != -1 && bufname(dirnamenr) != dirname
1504 " try removing the trailing "/"
1505 let dirnamenr= bufnr(substitute(dirname,'/$','','e'))
1506 endif
1507" call Decho("bufnr(dirname<".dirname.">)=".dirnamenr)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001508" call Dredir("file")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001509
1510 if dirnamenr != -1 && bufexists(dirname)
1511 " buffer already exists (hidden), so switch to it!
Bram Moolenaar269ec652004-07-29 08:43:53 +00001512" call Dredir("file")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001513 exe "b ".dirnamenr
Bram Moolenaar269ec652004-07-29 08:43:53 +00001514" call Dredir("file")
1515 exe 'cd '.escape(substitute(a:dirname,'\\','/','ge'),' ')
1516" call Dredir("file")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001517" call Decho("changed directory to<".dirname.">")
Bram Moolenaar269ec652004-07-29 08:43:53 +00001518" call Dredir("file")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001519 if a:dirname != "." && line("$") >= 5
1520" call Dret("LocalBrowse : buffer already exists with info")
1521 return
1522 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001523" call Dredir("file")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001524" call Decho("buffer already exists, but needs listing (buf#".dirnamenr.")")
1525 keepjumps %d
Bram Moolenaar269ec652004-07-29 08:43:53 +00001526" call Dredir("file")
1527 if expand("%:p") != escape(dirname,' ')
1528 exe 'silent! file '.escape(dirname,' ')
1529" call Decho("renamed file to<".escape(dirname,' ').">")
1530 endif
1531" call Dredir("file")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001532 else
1533" call Dredir("ls!")
Bram Moolenaar269ec652004-07-29 08:43:53 +00001534" call Decho("generate new buffer named<".escape(dirname,' ').">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001535 silent! enew!
1536 exe 'silent! file '.escape(dirname,' ')
Bram Moolenaar269ec652004-07-29 08:43:53 +00001537" call Decho("renamed file to<".escape(dirname,' ').">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001538 endif
1539 " set standard browser options on buffer
1540 setlocal ts=32 bt=nowrite bh=hide nobl
1541
1542 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00001543" call Decho("Setting up local browser maps")
1544 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(getcwd(),<SID>NetGetDir()))<cr>
1545 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(getcwd(),'./'))<cr>
1546 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(getcwd(),'../'))<cr>
1547 nnoremap <buffer> <silent> a :let g:netrw_hide=!g:netrw_hide<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(getcwd(),'./'))<cr>
1548 nnoremap <buffer> <silent> <Leader>h :call <SID>NetHideEdit(1)<cr>
1549 nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00001550 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaar269ec652004-07-29 08:43:53 +00001551 nnoremap <buffer> <silent> o :exe g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(getcwd(),<SID>NetGetDir()))<cr>
1552 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(getcwd(),<SID>NetGetDir()))<cr>
1553 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(getcwd(),'./'))<cr>
1554 nnoremap <buffer> <silent> v :exe g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(getcwd(),<SID>NetGetDir()))<cr>
1555 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>LocalBrowseChgDir(getcwd(),<SID>NetGetDir()),0)<cr>
1556 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(getcwd(),<SID>NetGetDir()))<cr>
1557 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.getcwd().'/")<cr>'
1558 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.getcwd().'/")<cr>'
1559 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.getcwd().'/")<cr>'
1560 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.getcwd().'/")<cr>'
1561 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.getcwd().'/")<cr>'
1562 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.getcwd().'/")<cr>'
1563 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001564 nnoremap <buffer> ? :he netrw-dir<cr>
1565
1566 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00001567" call Decho("set up banner")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001568 keepjumps put ='\" ================='
1569 keepjumps 1d
1570 keepjumps put ='\" Directory Listing'
1571 keepjumps put ='\" '.dirname
1572 let g:netrw_bannercnt= 6
Bram Moolenaar269ec652004-07-29 08:43:53 +00001573
Bram Moolenaar8299df92004-07-10 09:47:34 +00001574 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00001575" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001576 " sorted by name
1577 let g:netrw_bannercnt= g:netrw_bannercnt + 1
1578 keepjumps put ='\" Sorted by '.g:netrw_sort_by
1579 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1580 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00001581" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001582 " sorted by size or date
1583 keepjumps put ='\" Sorted by '.g:netrw_sort_by
1584 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001585 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001586 keepjumps put ='\" Hiding: '.g:netrw_list_hide
1587 let g:netrw_bannercnt= g:netrw_bannercnt + 1
1588 endif
1589 keepjumps put ='\" ================='
1590
1591 " generate the requested directory listing
1592 call LocalBrowseList(dirname)
1593
1594 " manipulate the directory listing (hide, sort)
1595 setlocal ft=netrwlist
1596 if line("$") >= g:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001597 if g:netrw_hide && g:netrw_list_hide != ""
1598 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001599 endif
1600 if g:netrw_sort_by =~ "^n"
1601 call s:SetSort()
1602 exe 'keepjumps silent '.g:netrw_bannercnt.',$call s:NetSort()'
1603 exe 'keepjumps silent '.g:netrw_bannercnt.',$s/^\d\{3}\///e'
1604 else
1605 exe 'keepjumps silent '.g:netrw_bannercnt.',$call s:NetSort()'
1606 exe 'keepjumps silent '.g:netrw_bannercnt.',$s/^\d\{-}\///e'
1607 endif
1608 endif
1609 exe g:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001610
1611 setlocal noma nomod
1612
Bram Moolenaar269ec652004-07-29 08:43:53 +00001613" call Dret("LocalBrowse : file<".expand("%:p").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001614endfun
1615
1616" ---------------------------------------------------------------------
1617" LocalBrowseList: does the job of "ls" for local directories {{{2
1618fun! LocalBrowseList(dirname)
1619" call Dfunc("LocalBrowseList(dirname<".a:dirname.">)")
1620
1621 let dirnamelen = strlen(a:dirname)
1622 let filelist = glob(a:dirname."*")."\n".glob(a:dirname.".*")
1623" call Decho("filelist<".filelist.">")
1624
1625 while filelist != ""
1626 if filelist =~ '\n'
1627 let file = substitute(filelist,'\n.*$','','e')
1628 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
1629 else
1630 let file = filelist
1631 let filelist= ""
1632 endif
1633 let pfile= file
1634 if isdirectory(file)
1635 let pfile= file."/"
1636 endif
1637 let pfile= strpart(pfile,dirnamelen)
1638 if g:netrw_longlist
Bram Moolenaar269ec652004-07-29 08:43:53 +00001639 let sz = getfsize(file)
1640 let fsz = strpart(" ",1,15-strlen(sz)).sz
1641 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(file))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001642 endif
1643 if g:netrw_sort_by =~ "^t"
1644 " sort by time (handles time up to 1 quintillion seconds, US)
1645" call Decho("getftime(".file.")=".getftime(file))
1646 let t = getftime(file)
1647 let ft = strpart("000000000000000000",1,18-strlen(t)).t
1648" call Decho("exe keepjumps put ='".ft.'/'.file."'")
1649 exe "keepjumps put ='".ft.'/'.pfile."'"
1650 elseif g:netrw_sort_by =~ "^s"
1651 " sort by size (handles file sizes up to 1 quintillion bytes, US)
1652" call Decho("getfsize(".file.")=".getfsize(file))
1653 let sz = getfsize(file)
1654 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
1655" call Decho("exe keepjumps put ='".fsz.'/'.file."'")
1656 exe "keepjumps put ='".fsz.'/'.pfile."'"
1657 else
1658 " sort by name
1659" call Decho("exe keepjumps put ='".file."'")
1660 exe "keepjumps put ='".pfile."'"
1661 endif
1662 endwhile
1663
1664" call Dret("LocalBrowseList")
1665endfun
1666
1667" ---------------------------------------------------------------------
1668" LocalBrowseChgDir: constructs a new directory based on the current {{{2
1669" directory and a new directory name
1670fun! <SID>LocalBrowseChgDir(dirname,newdir)
1671" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
1672
Bram Moolenaar269ec652004-07-29 08:43:53 +00001673 let dirname= substitute(a:dirname,'\\','/','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001674 let newdir = a:newdir
1675
1676 if dirname !~ '/$'
1677 " apparently vim is "recognizing" that it is in the home directory and
1678 " is removing the "/". Bad idea, so I have to put it back.
1679 let dirname= dirname.'/'
1680" call Decho("adjusting dirname<".dirname.">")
1681 endif
1682
1683 if newdir !~ '/$'
1684 " handling a file
1685 let dirname= dirname.newdir
1686" call Decho("handling a file: dirname<".dirname.">")
1687 exe "e ".dirname
1688
1689 elseif newdir == './'
1690 " refresh the directory list
1691" call Decho("refresh directory listing")
1692 setlocal ma
1693 %d
1694
1695 elseif newdir == '../'
1696 " go up one directory
1697 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+/$\)','\1','e')
1698" call Decho("go up one dir: dirname<".dirname.">")
1699
1700 else
1701 " go down one directory
1702 let dirname= dirname.newdir
1703" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
1704 endif
1705
1706" call Dret("LocalBrowseChgDir <".dirname.">")
1707 return dirname
1708endfun
1709
1710" ---------------------------------------------------------------------
1711" LocalBrowseRm:
1712fun! <SID>LocalBrowseRm(path) range
1713" call Dfunc("LocalBrowseRm(path<".a:path.">)")
1714" call Decho("firstline=".a:firstline." lastline=".a:lastline)
1715
1716 " preparation for removing multiple files/directories
1717 let ctr= a:firstline
1718
1719 " remove multiple files and directories
1720 while ctr <= a:lastline
1721 exe ctr
1722
1723 norm! 0
Bram Moolenaar269ec652004-07-29 08:43:53 +00001724 let rmfile= a:path.s:NetGetDir()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001725" call Decho("rmfile<".rmfile.">")
1726
1727 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '/$')
1728 " attempt to remove file
1729 call inputsave()
1730 let ok= input("Confirm deletion of file<".rmfile."> ","y")
1731 call inputrestore()
1732 if ok == "y"
1733 call delete(rmfile)
1734" call Decho("errcode=".v:shell_error)
1735 endif
1736
1737 else
1738 " attempt to remove directory
1739 call inputsave()
1740 let ok= input("Confirm deletion of directory<".rmfile."> ","y")
1741 call inputrestore()
Bram Moolenaar269ec652004-07-29 08:43:53 +00001742 let rmfile= escape(substitute(rmfile,'/$','','e'),' ')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001743
1744 if ok == "y"
1745 call system(g:netrw_local_rmdir." ".rmfile)
1746" call Decho("v:shell_error=".v:shell_error)
1747
1748 if v:shell_error != 0
1749" call Decho("2nd attempt to remove directory<".rmfile.">")
1750 let errcode= delete(rmfile)
1751" call Decho("errcode=".errcode)
1752
1753 if errcode != 0
1754 if has("unix")
1755" call Decho("3rd attempt to remove directory<".rmfile.">")
1756 call system("rm ".rmfile)
1757 if v:shell_error != 0
1758 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
1759 endif
1760 else
1761 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
1762 endif
1763 endif
1764 endif
1765 endif
1766 endif
1767
1768 let ctr= ctr + 1
1769 endwhile
1770
1771 " refresh the directory
1772 let curline= line(".")-1
1773" call Decho("refresh the directory")
1774 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(expand("%"),'./'))
1775 exe curline
1776
1777" call Dret("LocalBrowseRm")
1778endfun
1779
1780" ---------------------------------------------------------------------
1781" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00001782fun! <SID>LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00001783" call Dfunc("LocalBrowseRename(path<".a:path.">)")
1784
1785 " preparation for removing multiple files/directories
1786 let ctr= a:firstline
1787
1788 " attempt to rename files/directories
1789 while ctr <= a:lastline
1790 exe "keepjumps ".ctr
1791
1792 norm! 0
Bram Moolenaar269ec652004-07-29 08:43:53 +00001793 let oldname= a:path.s:NetGetDir()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001794" call Decho("oldname<".oldname.">")
1795
1796 call inputsave()
1797 let newname= input("Moving ".oldname." to : ",oldname)
1798 call inputrestore()
1799
1800 let ret= system(g:netrw_local_rename." ".oldname." ".newname)
1801" call Decho("executing system(".g:netrw_local_rename." ".oldname." ".newname)
1802
1803 let ctr= ctr + 1
1804 endwhile
1805
1806 " refresh the directory
1807 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00001808" call Decho("refresh the directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001809 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(expand("%"),'./'))
1810 exe "keepjumps ".curline
1811" call Dret("LocalBrowseRename")
1812endfun
1813
1814" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00001815" NetMethod: determine method of transfer {{{1
1816" method == 1: rcp
1817" 2: ftp + <.netrc>
1818" 3: ftp + machine, id, password, and [path]filename
1819" 4: scp
1820" 5: http (wget)
1821" 6: cadaver
1822" 7: rsync
1823" 8: fetch
1824" 9: sftp
1825fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001826" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001827
1828 " initialization
1829 let b:netrw_method = 0
1830 let g:netrw_machine = ""
1831 let b:netrw_fname = ""
1832 let g:netrw_port = ""
1833
1834 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001835 " mipf : a:machine a:id password filename Use ftp
1836 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001837 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001838 " rcpurm : rcp://[user@]host/filename Use rcp
1839 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001840 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001841 " httpurm : http://[user@]host/filename Use wget
1842 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001843 " rsyncurm : rsync://host[:port]/path Use rsync
1844 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
1845 " sftpurm : sftp://[user@]host/filename Use scp
1846 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
1847 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
1848 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
1849 let rcpurm = '^rcp://\(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
1850 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
1851 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
1852 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001853 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001854 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
1855 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1856 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
1857
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001858" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001859 " Determine Method
1860 " rcp://user@hostname/...path-to-file
1861 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001862" call Decho("rcp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001863 let b:netrw_method = 1
1864 let userid = substitute(a:choice,rcpurm,'\2',"")
1865 let g:netrw_machine= substitute(a:choice,rcpurm,'\3',"")
1866 let b:netrw_fname = substitute(a:choice,rcpurm,'\4',"")
1867 if userid != ""
1868 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00001869 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001870
1871 " scp://user@hostname/...path-to-file
1872 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001873" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001874 let b:netrw_method = 4
1875 let g:netrw_machine= substitute(a:choice,scpurm,'\1',"")
1876 let b:netrw_port = substitute(a:choice,scpurm,'\2',"")
1877 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
1878
1879 " http://user@hostname/...path-to-file
1880 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001881" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001882 let b:netrw_method = 5
1883 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
1884 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
1885
1886 " dav://hostname[:port]/..path-to-file..
1887 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001888" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001889 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001890 if a:choice =~ '^s'
1891 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
1892 else
1893 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
1894 endif
1895 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001896
1897 " rsync://user@hostname/...path-to-file
1898 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001899" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001900 let b:netrw_method = 7
1901 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
1902 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
1903
1904 " ftp://[user@]hostname[[:#]port]/...path-to-file
1905 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001906" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001907 let userid = substitute(a:choice,ftpurm,'\2',"")
1908 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
1909 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
1910 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
1911 if g:netrw_port != ""
1912 let g:netrw_port = substitute(g:netrw_port,"[#:]","","")
1913 endif
1914 if userid != ""
1915 let g:netrw_uid= userid
1916 endif
1917 if exists("g:netrw_uid") && exists("g:netrw_passwd")
1918 let b:netrw_method = 3
1919 else
1920 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
1921 let b:netrw_method= 2
1922 else
1923 if !exists("g:netrw_uid") || g:netrw_uid == ""
1924 call NetUserPass()
1925 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
1926 call NetUserPass(g:netrw_uid)
1927 " else just use current g:netrw_uid and g:netrw_passwd
1928 endif
1929 let b:netrw_method= 3
1930 endif
1931 endif
1932
1933 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001934" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001935 let b:netrw_method = 8
1936 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
1937 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
1938 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
1939 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
1940
1941 " Issue an ftp : "machine id password [path/]filename"
1942 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001943" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001944 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001945 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
1946 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
1947 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
1948 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
1949
1950 " Issue an ftp: "hostname [path/]filename"
1951 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001952" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001953 if exists("g:netrw_uid") && exists("g:netrw_passwd")
1954 let b:netrw_method = 3
1955 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1956 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1957
1958 elseif filereadable(expand("$HOME/.netrc"))
1959 let b:netrw_method = 2
1960 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1961 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
1962 endif
1963
1964 " sftp://user@hostname/...path-to-file
1965 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001966" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001967 let b:netrw_method = 9
1968 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
1969 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
1970
1971 " Issue an rcp: hostname:filename" (this one should be last)
1972 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001973" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001974 let b:netrw_method = 1
1975 let userid = substitute(a:choice,rcphf,'\2',"")
1976 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
1977 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001978" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1979" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1980" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1981" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001982 if userid != ""
1983 let g:netrw_uid= userid
1984 endif
1985 if has("win32")
1986 " don't let PCs try <.netrc>
1987 let b:netrw_method = 3
1988 endif
1989
1990 else
1991 echoerr "***error*** cannot determine method"
1992 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001993 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001994
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001995" call Decho("a:choice <".a:choice.">")
1996" call Decho("b:netrw_method <".b:netrw_method.">")
1997" call Decho("g:netrw_machine<".g:netrw_machine.">")
1998" call Decho("g:netrw_port <".g:netrw_port.">")
1999" if exists("g:netrw_uid") "Decho
2000" call Decho("g:netrw_uid <".g:netrw_uid.">")
2001" endif "Decho
2002" if exists("g:netrw_passwd") "Decho
2003" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
2004" endif "Decho
2005" call Decho("b:netrw_fname <".b:netrw_fname.">")
2006" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002007endfun
2008" end of NetMethod
2009
2010" ------------------------------------------------------------------------
2011" NetUserPass: set username and password for subsequent ftp transfer {{{1
2012" Usage: :call NetUserPass() -- will prompt for userid and password
2013" :call NetUserPass("uid") -- will prompt for password
2014" :call NetUserPass("uid","password") -- sets global userid and password
2015fun! NetUserPass(...)
2016
2017 " get/set userid
2018 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002019" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002020 if !exists("g:netrw_uid") || g:netrw_uid == ""
2021 " via prompt
2022 let g:netrw_uid= input('Enter username: ')
2023 endif
2024 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002025" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002026 let g:netrw_uid= a:1
2027 endif
2028
2029 " get password
2030 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002031" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002032 let g:netrw_passwd= inputsecret("Enter Password: ")
2033 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002034" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002035 let g:netrw_passwd=a:2
2036 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002037" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002038endfun
2039" end NetUserPass
2040
2041" ------------------------------------------------------------------------
2042" NetOptionSave: save options and set to "standard" form {{{1
2043fun!s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002044" call Dfunc("NetOptionSave()")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002045
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002046 " Get Temporary Filename
2047 let s:aikeep = &ai
2048 let s:cinkeep = &cin
2049 let s:cinokeep = &cino
2050 let s:comkeep = &com
2051 let s:cpokeep = &cpo
2052 let s:dirkeep = getcwd()
2053 let s:gdkeep = &gd
2054 let s:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00002055 setlocal cino =
2056 setlocal com =
2057 setlocal cpo -=aA
2058 setlocal nocin noai
2059 setlocal tw =0
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002060 if has("win32") && !has("win95")
2061 let s:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00002062 setlocal noswf
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002063" call Decho("setting s:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002064 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002065
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002066" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002067endfun
2068
2069" ------------------------------------------------------------------------
2070" NetOptionRestore: restore options {{{1
2071fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002072" call Dfunc("NetOptionRestore()")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002073
2074 let &ai = s:aikeep
2075 let &cin = s:cinkeep
2076 let &cino = s:cinokeep
2077 let &com = s:comkeep
2078 let &cpo = s:cpokeep
2079 exe "lcd ".s:dirkeep
2080 let &gd = s:gdkeep
2081 let &tw = s:twkeep
2082 if exists("s:swfkeep")
2083 let &swf= s:swfkeep
2084 unlet s:swfkeep
2085 endif
2086 unlet s:aikeep
2087 unlet s:cinkeep
2088 unlet s:cinokeep
2089 unlet s:comkeep
2090 unlet s:cpokeep
2091 unlet s:gdkeep
2092 unlet s:twkeep
2093 unlet s:dirkeep
2094
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002095" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002096endfun
2097
2098" ------------------------------------------------------------------------
2099" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002100" to handle extra junk that their system's ftp dumps
2101" into the transfer. This function is provided as an
2102" example and as a fix for a Windows 95 problem: in my
2103" experience, win95's ftp always dumped four blank lines
2104" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002105if has("win95") && g:netrw_win95ftp
2106 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002107" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002108 if method == 3 " ftp (no <.netrc>)
2109 let fourblanklines= line2 - 3
2110 silent fourblanklines.",".line2."g/^\s*/d"
2111 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002112" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002113 endfun
2114endif
2115
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002116" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002117" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002118fun! <SID>NetSort() range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002119" call Dfunc("NetSort()")
2120
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002121 let i = a:firstline + 1
2122 while i <= a:lastline
2123 " find insertion point via binary search
2124 let i_val = getline(i)
2125 let lo = a:firstline
2126 let hi = i
2127 while lo < hi
2128 let mid = (lo + hi) / 2
2129 let mid_val = getline(mid)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002130 if g:netrw_sort_direction =~ '^n'
2131 " normal sorting order
2132 if i_val < mid_val
2133 let hi = mid
2134 else
2135 let lo = mid + 1
2136 if i_val == mid_val | break | endif
2137 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002138 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002139 " reverse sorting order
2140 if i_val > mid_val
2141 let hi = mid
2142 else
2143 let lo = mid + 1
2144 if i_val == mid_val | break | endif
2145 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002146 endif
2147 endwhile
2148 " do insert
2149 if lo < i
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002150 exe 'keepjumps '.i.'d_'
2151 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002152 endif
2153 let i = i + 1
2154 endwhile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002155
2156" call Dret("NetSort")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002157endfun
2158
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002159" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002160" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
2161" What this function does is to compute a priority for the patterns
2162" in the g:netrw_sort_sequence. It applies a substitute to any
2163" "files" that satisfy each pattern, putting the priority / in
2164" front. An "*" pattern handles the default priority.
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002165fun! <SID>SetSort()
2166" call Dfunc("SetSort() bannercnt=".g:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002167 if g:netrw_longlist
2168 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
2169 else
2170 let seqlist = g:netrw_sort_sequence
2171 endif
2172 " sanity check -- insure that * appears somewhere
2173 if seqlist == ""
2174 let seqlist= '*'
2175 elseif seqlist !~ '\*'
2176 let seqlist= seqlist.',*'
2177 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002178 let priority = 1
2179 while seqlist != ""
2180 if seqlist =~ ','
2181 let seq = substitute(seqlist,',.*$','','e')
2182 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
2183 else
2184 let seq = seqlist
2185 let seqlist = ""
2186 endif
2187 let eseq= escape(seq,'/')
2188 if priority < 10
2189 let spriority= "00".priority.'\/'
2190 elseif priority < 100
2191 let spriority= "0".priority.'\/'
2192 else
2193 let spriority= priority.'\/'
2194 endif
2195" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
2196
2197 if seq == '*'
2198 exe 'keepjumps silent '.g:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
2199 else
2200 exe 'keepjumps silent '.g:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
2201 endif
2202 let priority = priority + 1
2203 endwhile
2204
2205 exe 'keepjumps silent '.g:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
2206
2207" call Dret("SetSort")
2208endfun
2209
Bram Moolenaar071d4272004-06-13 20:20:40 +00002210" ------------------------------------------------------------------------
2211" Restore {{{1
2212let &cpo= s:save_cpo
2213unlet s:save_cpo
2214" vim:ts=8 fdm=marker