blob: 84cda93c49d547cb9ffa535d438ad34891959dd4 [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002" Last Change: Aug 27, 2004
Bram Moolenaar071d4272004-06-13 20:20:40 +00003" Maintainer: Charles E. Campbell, Jr. PhD <drchipNOSPAM at campbellfamily.biz>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00004" Version: 47
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" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bram Moolenaard4755bb2004-09-02 19:12:26 +000010" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000011
Bram Moolenaard4755bb2004-09-02 19:12:26 +000012" ---------------------------------------------------------------------
13" Prevent Reloading: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000014if exists("loaded_netrw") || &cp
15 finish
16endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +000017let loaded_netrw = "v47"
Bram Moolenaar8299df92004-07-10 09:47:34 +000018let s:save_cpo = &cpo
19let loaded_explorer = 1
Bram Moolenaar071d4272004-06-13 20:20:40 +000020set cpo&vim
21
22" ---------------------------------------------------------------------
23" Default values for global netrw variables {{{1
24if !exists("g:netrw_ftpmode")
25 let g:netrw_ftpmode= "binary"
26endif
27if !exists("g:netrw_win95ftp")
28 let g:netrw_win95ftp= 1
29endif
30if !exists("g:netrw_cygwin")
Bram Moolenaard4755bb2004-09-02 19:12:26 +000031 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar071d4272004-06-13 20:20:40 +000032 let g:netrw_cygwin= 1
33 else
34 let g:netrw_cygwin= 0
35 endif
36endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000037if !exists("g:netrw_list_cmd")
38 if executable("ssh")
39 " provide a default listing command
40 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
41 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000042" call Decho("ssh is not executable, can't do remote directory exploring")
Bram Moolenaar843ee412004-06-30 16:16:41 +000043 let g:netrw_list_cmd= ""
44 endif
45endif
46if !exists("g:netrw_rm_cmd")
47 let g:netrw_rm_cmd = "ssh HOSTNAME rm"
48endif
49if !exists("g:netrw_rmf_cmd")
50 let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
51endif
52if !exists("g:netrw_rmdir_cmd")
53 let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
54endif
55if !exists("g:netrw_rename_cmd")
56 let g:netrw_rename_cmd= "ssh HOSTNAME mv"
57endif
58if exists("g:netrw_silent") && g:netrw_silent != 0
59 let g:netrw_silentxfer= "silent "
60else
61 let g:netrw_silentxfer= ""
62endif
63if !exists("g:netrw_winsize")
64 let g:netrw_winsize= ""
65endif
66if !exists("g:netrw_list_hide")
67 let g:netrw_list_hide= ""
68endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000069if !exists("g:netrw_sort_by")
70 " alternatives: date size
71 let g:netrw_sort_by= "name"
72endif
73if !exists("g:netrw_sort_sequence")
74 let g:netrw_sort_sequence= '/$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
75endif
76if !exists("g:netrw_sort_direction")
77 " alternative: reverse (z y x ...)
78 let g:netrw_sort_direction= "normal"
79endif
Bram Moolenaar8299df92004-07-10 09:47:34 +000080if !exists("g:netrw_longlist") || g:netrw_longlist == 0
81 let g:netrw_longlist= 0
82else
83 let g:netrw_longlist= 1
Bram Moolenaar269ec652004-07-29 08:43:53 +000084 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -lk"
Bram Moolenaar8299df92004-07-10 09:47:34 +000085endif
86if !exists("g:netrw_timefmt")
87 let g:netrw_timefmt= "%c"
88endif
89if !exists("g:netrw_local_rmdir")
90 let g:netrw_local_rmdir= "rmdir"
91endif
92if !exists("g:netrw_local_rename")
Bram Moolenaard4755bb2004-09-02 19:12:26 +000093 if g:netrw_cygwin
94 let g:netrw_local_rename= "mv"
95 elseif has("win32") || has("win95") || has("win64") || has("win16")
96 let g:netrw_local_rename= "rename"
Bram Moolenaar8299df92004-07-10 09:47:34 +000097 elseif has("unix")
98 let g:netrw_local_rename= "mv"
99 endif
100endif
101if !exists("g:netrw_local_mkdir")
102 let g:netrw_local_mkdir= "mkdir"
103endif
104if !exists("g:netrw_mkdir_cmd")
105 let g:netrw_mkdir_cmd= "ssh HOSTNAME mkdir"
106endif
Bram Moolenaar269ec652004-07-29 08:43:53 +0000107if !exists("g:netrw_hide")
108 let g:netrw_hide= 1
109endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000110if !exists("g:netrw_ftp_browse_reject")
111 let g:netrw_ftp_browse_reject='^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not'
112endif
113if !exists("g:netrw_keepdir")
114 let g:netrw_keepdir= 0
115endif
116if !exists("s:netrw_cd_escape")
117 if has("win32") || has("win95") || has("win64") || has("win16")
118 let s:netrw_cd_escape="#% "
119 else
120 let s:netrw_cd_escape="*$%'\" ?`"
121 endif
122endif
123if !exists("s:netrw_glob_escape")
124 if has("win32") || has("win95") || has("win64") || has("win16")
125 let s:netrw_glob_escape= ""
126 else
127 let s:netrw_glob_escape= '[]*?`{~'
128 endif
129endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000130
131" BufEnter event ignored by decho when following variable is true
132" Has a side effect that doau BufReadPost doesn't work, so
133" files read by network transfer aren't appropriately highlighted.
134"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000135
136" ---------------------------------------------------------------------
137" Default values for global protocol variables {{{1
138if !exists("g:netrw_rcp_cmd")
139 let g:netrw_rcp_cmd = "rcp"
140endif
141if !exists("g:netrw_ftp_cmd")
142 let g:netrw_ftp_cmd = "ftp"
143endif
144if !exists("g:netrw_scp_cmd")
145 let g:netrw_scp_cmd = "scp -q"
146endif
147if !exists("g:netrw_sftp_cmd")
148 let g:netrw_sftp_cmd = "sftp"
149endif
150if !exists("g:netrw_http_cmd")
151 if executable("wget")
152 let g:netrw_http_cmd = "wget -q -O"
153 elseif executable("fetch")
154 let g:netrw_http_cmd = "fetch -o"
155 else
156 let g:netrw_http_cmd = ""
157 endif
158endif
159if !exists("g:netrw_dav_cmd")
160 let g:netrw_dav_cmd = "cadaver"
161endif
162if !exists("g:netrw_rsync_cmd")
163 let g:netrw_rsync_cmd = "rsync"
164endif
165if !exists("g:netrw_fetch_cmd")
166 if executable("fetch")
167 let g:netrw_fetch_cmd = "fetch -o"
168 else
169 let g:netrw_fetch_cmd = ""
170 endif
171endif
172
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000173if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000174 \ && exists("g:netrw_use_nt_rcp")
175 \ && g:netrw_use_nt_rcp
176 \ && executable( $SystemRoot .'/system32/rcp.exe')
177 let s:netrw_has_nt_rcp = 1
178 let s:netrw_rcpmode = '-b'
179 else
180 let s:netrw_has_nt_rcp = 0
181 let s:netrw_rcpmode = ''
182endif
183
184" ---------------------------------------------------------------------
185" Transparency Support: {{{1
Bram Moolenaar8299df92004-07-10 09:47:34 +0000186 " File Explorer: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000187if version >= 600
Bram Moolenaar8299df92004-07-10 09:47:34 +0000188 augroup FileExplorer
189 au!
190 au BufEnter * call <SID>LocalBrowse(expand("<afile>"))
191 augroup END
192 " Network Handler: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000193 augroup Network
194 au!
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000195 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000196 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 +0000197 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000198 au BufReadCmd file:///* exe "silent doau BufReadPre ".expand("<afile>")|exe 'e /'.substitute(expand("<afile>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<afile>")
199 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 +0000200 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000201 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>")
202 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 +0000203 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 +0000204 augroup END
205endif
206
207" ------------------------------------------------------------------------
208" Commands: :Nread, :Nwrite, and :NetUserPass {{{1
209com! -nargs=* Nread call <SID>NetSavePosn()<bar>call <SID>NetRead(<f-args>)<bar>call <SID>NetRestorePosn()
210com! -range=% -nargs=* Nwrite call <SID>NetSavePosn()<bar><line1>,<line2>call <SID>NetWrite(<f-args>)<bar>call <SID>NetRestorePosn()
211com! -nargs=* NetUserPass call NetUserPass(<f-args>)
212
213" ------------------------------------------------------------------------
214" NetSavePosn: saves position of cursor on screen {{{1
215fun! s:NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000216" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000217 " Save current line and column
218 let s:netrw_winnr= winnr()
219 let s:netrw_line = line(".")
220 let s:netrw_col = virtcol(".")
221
222 " Save top-of-screen line
223 norm! H0
224 let s:netrw_hline= line(".")
225
226 call s:NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000227" 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 +0000228endfun
229
230" ------------------------------------------------------------------------
231" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
232fun! <SID>NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000233" 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 +0000234
235 exe "silent! ".s:netrw_winnr."wincmd w"
236 if v:shell_error == 0
237 " as suggested by Bram M: redraw on no error
238 " allows protocol error messages to remain visible
239 redraw!
240 endif
241 " restore top-of-screen line
242 exe "norm! ".s:netrw_hline."G0z\<CR>"
243 " restore position
244 exe "norm! ".s:netrw_line."G0".s:netrw_col."\<bar>"
245
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000246" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000247endfun
248
249" ------------------------------------------------------------------------
250" NetRead: responsible for reading a file over the net {{{1
251fun! s:NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000252" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000253
254 " save options
255 call s:NetOptionSave()
256
257 " Special Exception: if a file is named "0r", then
258 " "0r" will be used to read the
259 " following files instead of "r"
260 if a:0 == 0
261 let readcmd= "r"
262 let ichoice= 0
263 elseif a:1 == "0r"
264 let readcmd = "0r"
265 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000266 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000267 let readcmd = "r"
268 let ichoice = 1
269 endif
270
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000271 " get name of a temporary file and set up shell-quoting character
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000272 let tmpfile= tempname()
273
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000274" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000275 while ichoice <= a:0
276
277 " attempt to repeat with previous host-file-etc
278 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000279" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000280 let choice = b:netrw_lastfile
281 let ichoice= ichoice + 1
282
283 else
284 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000285" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000286
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000287 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000288 " give help
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000289 echo 'NetRead Usage:'
290 echo ':Nread machine:path uses rcp'
291 echo ':Nread "machine path" uses ftp with <.netrc>'
292 echo ':Nread "machine id password path" uses ftp'
293 echo ':Nread dav://machine[:port]/path uses cadaver'
294 echo ':Nread fetch://machine/path uses fetch'
295 echo ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
296 echo ':Nread http://[user@]machine/path uses http wget'
297 echo ':Nread rcp://[user@]machine/path uses rcp'
298 echo ':Nread rsync://machine[:port]/path uses rsync'
299 echo ':Nread scp://[user@]machine[[:#]port]/path uses scp'
300 echo ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
301 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000302
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000303 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000304 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000305" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000306 if match(choice,"\"$") != -1
307 " case "..."
308 let choice=strpart(choice,1,strlen(choice)-2)
309 else
310 " case "... ... ..."
311 let choice = strpart(choice,1,strlen(choice)-1)
312 let wholechoice = ""
313
314 while match(choice,"\"$") == -1
315 let wholechoice = wholechoice . " " . choice
316 let ichoice = ichoice + 1
317 if ichoice > a:0
318 echoerr "Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000319" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000320 return
321 endif
322 let choice= a:{ichoice}
323 endwhile
324 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
325 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000326 endif
327 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000328
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000329" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000330 let ichoice= ichoice + 1
331
332 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000333 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000334 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000335" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000336
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000337 exe 'lcd ' . fnamemodify(tmpfile,':h')
338 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000339 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000340
341 " Determine method of read (ftp, rcp, etc)
342 call s:NetMethod(choice)
343
Bram Moolenaar843ee412004-06-30 16:16:41 +0000344 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000345" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000346 if choice =~ "^.*/$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000347 keepjumps call s:NetBrowse(choice)
348" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000349 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000350 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000351
352 " ============
353 " Perform Read
354 " ============
355
356 ".........................................
357 " rcp: NetRead Method #1
358 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000359" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000360 " ER: noting done with g:netrw_uid yet?
361 " ER: on Win2K" rcp machine[.user]:file tmpfile
362 " ER: if machine contains '.' adding .user is required (use $USERNAME)
363 " ER: the tmpfile is full path: rcp sees C:\... as host C
364 if s:netrw_has_nt_rcp == 1
365 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
366 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
367 else
368 " Any way needed it machine contains a '.'
369 let uid_machine = g:netrw_machine .'.'. $USERNAME
370 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000371 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000372 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
373 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
374 else
375 let uid_machine = g:netrw_machine
376 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000377 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000378" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000379 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
380 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
381 let b:netrw_lastfile = choice
382
383 ".........................................
384 " ftp + <.netrc>: NetRead Method #2
385 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000386" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000387 let netrw_fname= b:netrw_fname
388 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000389 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000390 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000391 exe "put ='"."get ".netrw_fname." ".tmpfile."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000392 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000393" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000394 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
395 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000396" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000397 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
398 endif
399 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
400 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000401 let debugkeep= &debug
402 set debug=msg
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000403 echoerr getline(1)
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000404 exe "echomsg '".getline(1)."'"
405 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000406 endif
407 bd!
408 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
409 let b:netrw_lastfile = choice
410
411 ".........................................
412 " ftp + machine,id,passwd,filename: NetRead Method #3
413 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
414 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000415" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000416 let netrw_fname= b:netrw_fname
417 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000418 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000419 if exists("g:netrw_port") && g:netrw_port != ""
420 put ='open '.g:netrw_machine.' '.g:netrw_port
421 else
422 put ='open '.g:netrw_machine
423 endif
424
425 if exists("g:netrw_ftp") && g:netrw_ftp == 1
426 put =g:netrw_uid
427 put =g:netrw_passwd
428 else
429 put ='user '.g:netrw_uid.' '.g:netrw_passwd
430 endif
431
432 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
433 put =g:netrw_ftpmode
434 endif
435 put ='get '.netrw_fname.' '.tmpfile
436
437 " perform ftp:
438 " -i : turns off interactive prompting from ftp
439 " -n unix : DON'T use <.netrc>, even though it exists
440 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000441" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000442 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000443" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000444 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
445 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
446 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000447" call Decho("error<".getline(1).">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000448 echoerr getline(1)
449 endif
450 bd!
451 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
452 let b:netrw_lastfile = choice
453
454 ".........................................
455 " scp: NetRead Method #4
456 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000457" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000458 if exists("g:netrw_port") && g:netrw_port != ""
459 let useport= " -P ".g:netrw_port
460 else
461 let useport= ""
462 endif
463 if g:netrw_cygwin == 1
464 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000465" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000466 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
467 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000468" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000469 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
470 endif
471 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
472 let b:netrw_lastfile = choice
473
474 ".........................................
475 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000476" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000477 if g:netrw_http_cmd == ""
478 echoerr "neither wget nor fetch command is available"
479 exit
480 endif
481
482 if match(b:netrw_fname,"#") == -1
483 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000484" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000485 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
486 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
487
488 else
489 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
490 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
491 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000492" call Decho("netrw_html<".netrw_html.">")
493" call Decho("netrw_tag <".netrw_tag.">")
494" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000495 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
496 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000497" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000498 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
499 endif
500 let b:netrw_lastfile = choice
501
502 ".........................................
503 " cadaver: NetRead Method #6
504 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000505" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000506
507 " Construct execution string (four lines) which will be passed through filter
508 let netrw_fname= b:netrw_fname
509 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000510 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000511 if exists("g:netrw_port") && g:netrw_port != ""
512 put ='open '.g:netrw_machine.' '.g:netrw_port
513 else
514 put ='open '.g:netrw_machine
515 endif
516 put ='user '.g:netrw_uid.' '.g:netrw_passwd
517
518 if g:netrw_cygwin == 1
519 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
520 put ='get '.netrw_fname.' '.cygtmpfile
521 else
522 put ='get '.netrw_fname.' '.tmpfile
523 endif
524
525 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000526 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000527" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000528 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
529 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000530 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000531 let b:netrw_lastfile = choice
532
533 ".........................................
534 " rsync: NetRead Method #7
535 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000536" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000537 if g:netrw_cygwin == 1
538 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000539" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000540 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
541 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000542" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000543 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
544 endif
545 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
546 let b:netrw_lastfile = choice
547
548 ".........................................
549 " fetch: NetRead Method #8
550 " fetch://[user@]host[:http]/path
551 elseif b:netrw_method == 8 " read with fetch
552 if g:netrw_fetch_cmd == ""
553 echoerr "fetch command not available"
554 exit
555 endif
556 if exists("g:netrw_option") && g:netrw_option == ":http"
557 let netrw_option= "http"
558 else
559 let netrw_option= "ftp"
560 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000561" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000562
563 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000564" 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 +0000565 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
566 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000567" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000568 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
569 endif
570
571 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
572 let b:netrw_lastfile = choice
573
574 ".........................................
575 " sftp: NetRead Method #9
576 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000577" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000578 if g:netrw_cygwin == 1
579 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000580" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
581" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000582 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
583 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000584" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000585 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
586 endif
587 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
588 let b:netrw_lastfile = choice
589
590 ".........................................
591 else " Complain
592 echo "***warning*** unable to comply with your request<" . choice . ">"
593 endif
594 endwhile
595
596 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000597" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000598 if exists("b:netrw_method")
599 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000600 unlet b:netrw_fname
601 endif
602 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000603
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000604" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000605endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000606
607" ------------------------------------------------------------------------
608" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
609fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000610" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000611
612 if exists("*NetReadFixup")
613 " for the use of NetReadFixup (not otherwise used internally)
614 let line2= line("$")
615 endif
616
617 " transform paths from / to \ for Windows, unless the shell is bash
618 if &term == "win32"
619 if &shell == "bash"
620 let fname=a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000621" call Decho("(win32 && bash) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000622 else
623 let fname=substitute(a:fname,'/','\\\\','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000624" call Decho("(win32 && !bash) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000625 endif
626 else
627 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000628" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000629 endif
630
631 " get the file, but disable undo when reading a new buffer
632 if a:readcmd[0] == '0'
633 let use_e_cmd = 0 " 1 when using ':edit'
634 let delline = 0 " 1 when have to delete empty last line
635 if line("$") == 1 && getline(1) == ""
636 " Now being asked to 0r a file into an empty file.
637 " Safe to :e it instead, unless there is another window on the same buffer.
638 let curbufnr = bufnr("%")
639 let use_e_cmd = 1
640 let delline = 1
641 " Loop over all windows,
642 " reset use_e_cmd when another one is editing the current buffer.
643 let i = 1
644 while 1
645 if i != winnr() && winbufnr(i) == curbufnr
646 let use_e_cmd = 0
647 break
648 endif
649 let i = i + 1
650 if winbufnr(i) < 0
651 break
652 endif
653 endwhile
654 endif
655
656 if use_e_cmd > 0
657 " ':edit' the temp file, wipe out the old buffer and rename the buffer
658 let curfilename = expand("%")
659
660 let binlocal = &l:bin
661 let binglobal = &g:bin
662 if binlocal
663 setglobal bin " Need to set 'bin' globally for ":e" command.
664 endif
665 silent exe "e! ".v:cmdarg." ".fname
666 if binlocal && !binglobal
667 setglobal nobin
668 setlocal bin
669 endif
670
671 exe curbufnr . "bwipe!"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000672 exe "f ".escape(curfilename," ")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000673 " the ":f newname" apparently leaves the temporary file as the alternate
674 " file in the buffer list (see :ls!). The following command wipes it out.
675 exe bufnr("#")."bwipe!"
676 else
677 let oldul= &ul
Bram Moolenaar8299df92004-07-10 09:47:34 +0000678 setlocal ul=-1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000679 exe a:readcmd." ".v:cmdarg." ".escape(fname," ")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000680 if delline > 0
681 " wipe out last line, which should be a blank line anyway
682 $del
683 endif
684 let &ul= oldul
685 endif
686 elseif filereadable(fname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000687" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000688 exe a:readcmd." ".v:cmdarg." ".fname
689 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000690" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000691 return
692 endif
693
694 " User-provided (ie. optional) fix-it-up command
695 if exists("*NetReadFixup")
696 let line1= line(".")
697 if a:readcmd == "r"
698 let line2= line("$") - line2 + line1
699 else
700 let line2= line("$") - line2
701 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000702" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000703 call NetReadFixup(a:method, line1, line2)
704 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000705
706 " update the Buffers menu
707 if has("gui") && has("gui_running")
708 silent! emenu Buffers.Refresh\ menu
709 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000710
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000711" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000712
713 " insure that we have the right filetype and that its being displayed
714 filetype detect
715 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000716" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000717endfun
718
719" ------------------------------------------------------------------------
720" NetWrite: responsible for writing a file over the net {{{1
721fun! s:NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000722" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000723
724 " option handling
725 let mod= 0
726 call s:NetOptionSave()
727
728 " Get Temporary Filename
729 let tmpfile= tempname()
730
731 if a:0 == 0
732 let ichoice = 0
733 else
734 let ichoice = 1
735 endif
736
737 " write (selected portion of) file to temporary
738 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
739
740 while ichoice <= a:0
741
742 " attempt to repeat with previous host-file-etc
743 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000744" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000745 let choice = b:netrw_lastfile
746 let ichoice= ichoice + 1
747 else
748 exe "let choice= a:" . ichoice
749
750 " Reconstruct Choice if choice starts with '"'
751 if match(choice,"?") == 0
752 echo 'NetWrite Usage:"'
753 echo ':Nwrite machine:path uses rcp'
754 echo ':Nwrite "machine path" uses ftp with <.netrc>'
755 echo ':Nwrite "machine id password path" uses ftp'
756 echo ':Nwrite dav://[user@]machine/path uses cadaver'
757 echo ':Nwrite fetch://[user@]machine/path uses fetch'
758 echo ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
759 echo ':Nwrite rcp://machine/path uses rcp'
760 echo ':Nwrite rsync://[user@]machine/path uses rsync'
761 echo ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
762 echo ':Nwrite sftp://[user@]machine/path uses sftp'
763 break
764
765 elseif match(choice,"^\"") != -1
766 if match(choice,"\"$") != -1
767 " case "..."
768 let choice=strpart(choice,1,strlen(choice)-2)
769 else
770 " case "... ... ..."
771 let choice = strpart(choice,1,strlen(choice)-1)
772 let wholechoice = ""
773
774 while match(choice,"\"$") == -1
775 let wholechoice= wholechoice . " " . choice
776 let ichoice = ichoice + 1
777 if choice > a:0
778 echoerr "Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000779" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000780 return
781 endif
782 let choice= a:{ichoice}
783 endwhile
784 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
785 endif
786 endif
787 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000788" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000789 let ichoice= ichoice + 1
790
791 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000792 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000793 let choice= substitute(choice,'\\','/','ge')
794 "ER: see NetRead()
795 exe 'lcd ' . fnamemodify(tmpfile,':h')
796 let tmpfile = fnamemodify(tmpfile,':t')
797 endif
798
799 " Determine method of read (ftp, rcp, etc)
800 call s:NetMethod(choice)
801
802 " =============
803 " Perform Write
804 " =============
805
806 ".........................................
807 " rcp: NetWrite Method #1
808 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000809" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000810 if s:netrw_has_nt_rcp == 1
811 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
812 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
813 else
814 let uid_machine = g:netrw_machine .'.'. $USERNAME
815 endif
816 else
817 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
818 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
819 else
820 let uid_machine = g:netrw_machine
821 endif
822 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000823" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000824 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
825 let b:netrw_lastfile = choice
826
827 ".........................................
828 " ftp + <.netrc>: NetWrite Method #2
829 elseif b:netrw_method == 2 " write with ftp + <.netrc>
830 let netrw_fname = b:netrw_fname
831 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000832 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000833 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000834" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000835 exe "put ='"."put ".tmpfile." ".netrw_fname."'"
836" call Decho("put ='"."put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000837 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000838" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000839 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000840 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000841" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000842 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000843 endif
844 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
845 if getline(1) !~ "^$"
846 echoerr getline(1)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000847 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000848 endif
849 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000850 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000851
852 ".........................................
853 " ftp + machine, id, passwd, filename: NetWrite Method #3
854 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
855 let netrw_fname= b:netrw_fname
856 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000857 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000858 if exists("g:netrw_port") && g:netrw_port != ""
859 put ='open '.g:netrw_machine.' '.g:netrw_port
860 else
861 put ='open '.g:netrw_machine
862 endif
863 if exists("g:netrw_ftp") && g:netrw_ftp == 1
864 put =g:netrw_uid
865 put =g:netrw_passwd
866 else
867 put ='user '.g:netrw_uid.' '.g:netrw_passwd
868 endif
869 put ='put '.tmpfile.' '.netrw_fname
870 " save choice/id/password for future use
871 let b:netrw_lastfile = choice
872
873 " perform ftp:
874 " -i : turns off interactive prompting from ftp
875 " -n unix : DON'T use <.netrc>, even though it exists
876 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000877" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000878 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000879" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000880 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
881 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
882 if getline(1) !~ "^$"
883 echoerr getline(1)
884 let mod=1
885 endif
886 bd!
887
888 ".........................................
889 " scp: NetWrite Method #4
890 elseif b:netrw_method == 4 " write with scp
891 if exists("g:netrw_port") && g:netrw_port != ""
892 let useport= " -P ".g:netrw_port
893 else
894 let useport= ""
895 endif
896 if g:netrw_cygwin == 1
897 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000898" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000899 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
900 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000901" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000902 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
903 endif
904 let b:netrw_lastfile = choice
905
906 ".........................................
907 " http: NetWrite Method #5
908 elseif b:netrw_method == 5
909 echoerr "***warning*** currently <netrw.vim> does not support writing using http:"
910
911 ".........................................
912 " dav: NetWrite Method #6
913 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000914" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000915
916 " Construct execution string (four lines) which will be passed through filter
917 let netrw_fname= b:netrw_fname
918 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000919 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000920 if exists("g:netrw_port") && g:netrw_port != ""
921 put ='open '.g:netrw_machine.' '.g:netrw_port
922 else
923 put ='open '.g:netrw_machine
924 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000925 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000926
927 if g:netrw_cygwin == 1
928 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
929 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000930 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000931 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000932 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000933
934 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000935 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000936" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000937 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
938 bd!
939 let b:netrw_lastfile = choice
940
941 ".........................................
942 " rsync: NetWrite Method #7
943 elseif b:netrw_method == 7 " write with rsync
944 if g:netrw_cygwin == 1
945 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000946" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000947 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000948 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000949" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000950 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000951 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000952 let b:netrw_lastfile = choice
953
954 ".........................................
955 " scp: NetWrite Method #9
956 elseif b:netrw_method == 9 " write with sftp
957 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000958 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
959 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
960 else
961 let uid_machine = g:netrw_machine
962 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000963 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000964 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000965 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000966 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000967" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000968 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
969 bd!
970 let b:netrw_lastfile= choice
971
972 ".........................................
973 else " Complain
974 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000975 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000976 endwhile
977
978 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000979" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000980 let result=delete(tmpfile)
981 call s:NetOptionRestore()
982
983 if a:firstline == 1 && a:lastline == line("$")
984 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +0000985 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000986
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000987" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000988endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +0000989
990" ------------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000991" Browsing Support For Remote Directories And Files: {{{1
Bram Moolenaar843ee412004-06-30 16:16:41 +0000992" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000993" of the contents of a remote directory. It is assumed that the
994" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
995" with the requested remote hostname first.
Bram Moolenaar843ee412004-06-30 16:16:41 +0000996fun! <SID>NetBrowse(dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000997" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".g:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +0000998
999 " sanity check
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001000 if exists("b:netrw_method") && (b:netrw_method =~ '[23]' && !executable("ftp"))
1001 echoerr "***netrw*** this system doesn't support remote directory listing via ftp"
1002" call Dret("NetBrowse")
1003 return
1004 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
1005 echoerr "***netrw*** this system doesn't support remote directory listing via ssh"
1006" call Dret("NetBrowse")
1007 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001008 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001009
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001010 " make this buffer modifiable
1011 setlocal ma
1012
1013 " analyze a:dirname and g:netrw_list_cmd
1014 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001015" call Decho("dirpat<".dirpat.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001016 if a:dirname !~ dirpat
Bram Moolenaar843ee412004-06-30 16:16:41 +00001017 echoerr "NetBrowse: I don't understand your dirname<".a:dirname.">"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001018" call Dret("NetBrowse : badly formatted dirname<".a:dirname.">")
1019 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001020 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001021
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001022 let method = substitute(a:dirname,dirpat,'\1','')
1023 let user = substitute(a:dirname,dirpat,'\2','')
1024 let machine = substitute(a:dirname,dirpat,'\3','')
1025 let path = substitute(a:dirname,dirpat,'\4','')
1026 let fname = substitute(a:dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001027" call Decho("set up method <".method .">")
1028" call Decho("set up user <".user .">")
1029" call Decho("set up machine<".machine.">")
1030" call Decho("set up path <".path .">")
1031" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001032
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001033 if method == "ftp"
1034 let listcmd = "-lF"
1035 else
1036 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1037 endif
1038 if exists("b:netrw_method")
1039" call Decho("setting s:netrw_method<".b:netrw_method.">")
1040 let s:netrw_method= b:netrw_method
1041 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001042
Bram Moolenaar8299df92004-07-10 09:47:34 +00001043 " optionally sort by time (-t) or by size (-S)
1044 if g:netrw_sort_by =~ "^t"
1045 let listcmd= listcmd."t"
1046 elseif g:netrw_sort_by =~ "^s"
1047 let listcmd= listcmd."S"
1048 endif
1049 " optionally sort in reverse
1050 if g:netrw_sort_direction =~ "^r"
1051 let listcmd= listcmd."r"
1052 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001053
1054" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001055 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001056" call Decho("attempt transfer of symlink as file")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001057 call s:NetBrowse(substitute(a:dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001058 redraw!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001059" call Dret("NetBrowse : symlink")
1060 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001061
1062 elseif fname !~ '/$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001063 " looks like a regular file, attempt transfer
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001064" call Decho("attempt transfer as regular file<".a:dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001065
1066 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001067 " "this is a directory" indicator (/). There shouldn't be one of those,
1068 " anyway.
1069 let path= substitute(path,'[*=@|]$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001070" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001071
1072 " remote-read the requested file into current buffer
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001073 enew!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001074 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001075 exe "silent doau BufReadPre ".fname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001076 silent call s:NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001077 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001078 keepjumps 1d
1079 setlocal nomod
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001080
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001081" call Dret("NetBrowse : file<".fname.">")
1082 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001083 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001084
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001085 " ---------------------------------------------------------------------
1086 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001087" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001088 " set up new buffer and map
1089 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001090 let bufnamenr = bufexists(bufname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001091" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001092 if bufnamenr != 0
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001093 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001094" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001095 exe "b ".bufnamenr
1096 if line("$") >= 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001097" call Dret("NetBrowse")
1098 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001099 endif
1100 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001101" call Decho("generate a new buffer")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001102 enew!
1103 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001104
1105 " rename file to reflect where its from
Bram Moolenaar8299df92004-07-10 09:47:34 +00001106 setlocal ts=32 bt=nofile bh=wipe nobl
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001107 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001108" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001109 setlocal bt=nowrite bh=hide nobl
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001110
1111 " set up buffer-local mappings
1112" call Decho("set up buffer-local mappings")
1113 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001114 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
1115 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaar269ec652004-07-29 08:43:53 +00001116 nnoremap <buffer> <silent> a :let g:netrw_hide=!g:netrw_hide<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001117 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1118 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1119 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1120 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
1121 nnoremap <buffer> <silent> o :exe g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
1122 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1123 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("%"),'./'))<cr>
1124 nnoremap <buffer> <silent> s :call <SID>NetSaveWordPosn()<bar>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("%"),'./'))<bar>call <SID>NetRestoreWordPosn()<cr>
1125 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
1126 nnoremap <buffer> <silent> v :exe g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
1127 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
1128 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001129 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1130 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001131 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001132 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1133 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1134 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001135 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001136 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001137 setlocal ma
1138
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001139 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001140" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1141 keepjumps put ='\" ==========================================================================='
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001142 keepjumps put ='\" Netrw Remote Directory Listing'
1143 keepjumps put ='\" '.bufname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001144 let s:netrw_bannercnt= 7
1145 let sortby= g:netrw_sort_by
1146 if g:netrw_sort_direction =~ "^r"
1147 let sortby= sortby." reversed"
1148 endif
1149
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001150 if g:netrw_sort_by =~ "^n"
1151 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001152 let s:netrw_bannercnt= s:netrw_bannercnt + 1
1153 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001154 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1155 else
1156 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001157 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001158 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001159 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaar843ee412004-06-30 16:16:41 +00001160 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001161 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001162 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001163 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1164 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001165
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001166 " remote read the requested directory listing
1167 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1168 " Note that not all ftp servers honor the options for ls
1169 if method == "ftp"
1170 call NetBrowseFtpCmd(path,"ls ".listcmd)
1171 keepjumps 1d
1172
1173 if !g:netrw_longlist
1174" call Decho("generate short listing")
1175 " shorten the listing
1176 exe "keepjumps ".s:netrw_bannercnt
1177 " cleanup
1178 while getline(".") =~ g:netrw_ftp_browse_reject
1179 keepjumps d
1180 endwhile
1181 keepjumps put='../'
1182 keepjumps put='./'
1183 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1184 exe "keepjumps silent ".s:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#'
1185 exe "keepjumps silent ".s:netrw_bannercnt.',$g/ -> /s# -> .*$#/#'
1186 endif
1187
1188 else
1189" call Decho("use ssh")
1190 let shq= &shq? &shq : ( &sxq? &sxq : "'")
1191" call Decho("exe silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq)
1192 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1193 keepjumps 1d
1194 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001195
1196 " manipulate the directory listing (hide, sort)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001197 setlocal ft=netrwlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001198 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001199 if g:netrw_hide && g:netrw_list_hide != ""
1200 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001201 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001202
Bram Moolenaar8299df92004-07-10 09:47:34 +00001203 if g:netrw_longlist
1204 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001205" call Decho("manipulate long listing")
1206
1207 if method == "ftp"
1208 " cleanup
1209 exe "keepjumps ".s:netrw_bannercnt
1210 while getline(".") =~ '^total\s\+\d\+$' || getline(".") =~ 'Trying\s\+\d\+.*$'
1211 keepjumps d
1212 endwhile
1213 exe 'keepjumps '.s:netrw_bannercnt."put='./'"
1214 exe 'keepjumps '.s:netrw_bannercnt."put='../'"
1215 endif
1216
1217 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/ -> .*$//e'
1218 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1219 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001220 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001221
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001222 if g:netrw_sort_by =~ "^n"
1223 call s:SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001224 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
1225 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001226 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001227 if g:netrw_longlist
1228 " shorten the list to keep its width <= 80 characters
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001229 exe "keepjumps silent ".s:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001230 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001231 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001232 setlocal nomod
1233 setlocal noma
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001234
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001235" call Dret("NetBrowse")
1236 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001237endfun
1238
1239" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001240" NetBrowseChgDir: {{{2
1241fun! <SID>NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001242" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001243
1244 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001245 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001246
1247 if newdir !~ '/$'
1248 " handling a file
1249 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001250" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001251
1252 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001253 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001254" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001255 setlocal ma
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001256 %d
1257
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001258 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001259 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001260 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001261
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001262 if trailer =~ '^\%(\.\./\)*$'
1263 " tack on a ../"
1264 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001265
1266 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001267 " strip off a directory name from dirname
1268 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001269 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001270" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001271
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001272 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001273 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001274 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001275" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001276 endif
1277
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001278" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001279 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001280endfun
1281
Bram Moolenaar843ee412004-06-30 16:16:41 +00001282" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001283" NetGetWord: it gets the directory named under the cursor
1284fun! <SID>NetGetWord()
1285" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001286 let dirname= getline(".")
1287 if dirname =~ '\t'
1288 let dirname= substitute(dirname,'\t.*$','','e')
1289 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001290" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001291 return dirname
1292endfun
1293
1294" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001295" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar843ee412004-06-30 16:16:41 +00001296fun! <SID>NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001297" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1298" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001299
1300 " preparation for removing multiple files/directories
1301 let ctr= a:firstline
1302
1303 " remove multiple files and directories
1304 while ctr <= a:lastline
1305 exe ctr
1306
1307 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001308 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001309" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001310
1311 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '/$')
1312 " attempt to remove file
Bram Moolenaar843ee412004-06-30 16:16:41 +00001313 call inputsave()
1314 let ok= input("Confirm deletion of file<".rmfile."> ","y")
1315 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001316
Bram Moolenaar843ee412004-06-30 16:16:41 +00001317 if ok == "y"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001318 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1319 silent! keepjumps .,$d
1320 call NetBrowseFtpCmd(a:path,"delete ".rmfile)
1321 else
1322 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1323" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1324 let ret= system(netrw_rm_cmd)
1325" call Decho("returned=".ret." errcode=".v:shell_error)
1326 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001327 endif
1328
1329 else
1330 " attempt to remove directory
Bram Moolenaar843ee412004-06-30 16:16:41 +00001331 call inputsave()
1332 let ok= input("Confirm deletion of directory<".rmfile."> ","y")
1333 call inputrestore()
1334
1335 if ok == "y"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001336 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1337 call NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
1338 else
1339 let rmfile = a:path.rmfile
1340 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1341" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1342 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001343" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001344
1345 if v:shell_error != 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001346 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'/$','','e')
1347" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1348 let ret= system(netrw_rmf_cmd)
1349" call Decho("returned=".ret." errcode=".v:shell_error)
1350
1351 if v:shell_error != 0
1352 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
1353 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001354 endif
1355 endif
1356 endif
1357 endif
1358
1359 let ctr= ctr + 1
1360 endwhile
1361
1362 " refresh the directory
1363 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001364" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001365 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1366 exe curline
1367
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001368" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001369endfun
1370
1371" ---------------------------------------------------------------------
1372" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00001373fun! <SID>NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001374" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001375
1376 " preparation for removing multiple files/directories
1377 let ctr = a:firstline
1378 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1379
1380 " attempt to rename files/directories
1381 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001382 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001383
1384 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001385 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001386" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001387
1388 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001389 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001390 call inputrestore()
1391
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001392 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1393 call NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
1394 else
1395 let oldname= a:path.oldname
1396 let newname= a:path.newname
1397" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1398 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1399 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001400
1401 let ctr= ctr + 1
1402 endwhile
1403
1404 " refresh the directory
1405 let curline= line(".")
1406 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001407 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001408" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001409endfun
1410
1411" ---------------------------------------------------------------------
1412" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001413" files given their extension. Passes 0=local, 1=remote
1414fun! <SID>NetBrowseX(fname,remote)
1415" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001416
1417 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001418 if has("win32") || has("win95") || has("win64") || has("win16")
1419 let exten= substitute(exten,'^.*$','\L&\E','')
1420 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001421" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar843ee412004-06-30 16:16:41 +00001422 if exten != "" && exists("*NetrwFileHandler_".exten)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001423
1424 let fname= a:fname
1425 if a:remote == 1
1426 " create a local copy
1427 let fname= tempname().".".exten
1428" call Decho("create a local copy of <".a:fname."> as <".fname.">")
1429 exe "keepjumps silent bot 1new ".a:fname
1430 let eikeep= &ei
1431 set ei=all bh=delete
1432 exe "w! ".fname
1433 let &ei= eikeep
1434 q
1435 endif
1436
1437 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
1438 redraw!
1439
1440 " cleanup: remove temporary file,
1441 " delete current buffer if success with handler,
1442 " return to prior buffer (directory listing)
1443 if a:remote == 1 && fname != a:fname
1444" call Decho("deleting temporary file<".fname.">")
1445 call delete(fname)
1446 endif
1447 if ret != 0
1448 let eikeep= &ei
1449 set ei=all bh=delete bt=nofile
1450 exe "norm! \<c-o>"
1451 let &ei= eikeep
1452 redraw!
1453 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001454 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001455
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001456" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001457endfun
1458
1459" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001460" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1461" This function assumes that a long listing will be received. Size, time,
1462" and reverse sorts will be requested of the server but not otherwise
1463" enforced here.
1464fun! NetBrowseFtpCmd(path,cmd)
1465" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".s:netrw_method)
1466
1467 " because WinXX ftp uses unix style input
1468 " curline is one more than the bannercnt in order to account
1469 " for the unwanted first blank line (doing a :put to an empty
1470 " buffer yields a blank first line)
1471 let ffkeep= &ff
1472 setlocal ma
1473 setlocal ff=unix
1474 let curline= s:netrw_bannercnt+1
1475 exe "silent! keepjumps ".curline.",$d"
1476
1477 ".........................................
1478 if s:netrw_method == 2
1479 " ftp + <.netrc>: Method #2
1480 if a:path != ""
1481 put ='cd '.a:path
1482 endif
1483 exe "put ='".a:cmd."'"
1484
1485 if exists("g:netrw_port") && g:netrw_port != ""
1486" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1487 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1488 else
1489" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1490 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1491 endif
1492
1493 ".........................................
1494 elseif s:netrw_method == 3
1495 " ftp + machine,id,passwd,filename: Method #3
1496 setlocal ff=unix
1497 if exists("g:netrw_port") && g:netrw_port != ""
1498 put ='open '.g:netrw_machine.' '.g:netrw_port
1499 else
1500 put ='open '.g:netrw_machine
1501 endif
1502
1503 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1504 put =g:netrw_uid
1505 put =g:netrw_passwd
1506 else
1507 put ='user '.g:netrw_uid.' '.g:netrw_passwd
1508 endif
1509
1510 if a:path != ""
1511 put ='cd '.a:path
1512 endif
1513 exe "put ='".a:cmd."'"
1514
1515 " perform ftp:
1516 " -i : turns off interactive prompting from ftp
1517 " -n unix : DON'T use <.netrc>, even though it exists
1518 " -n win32: quit being obnoxious about password
1519" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1520 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1521
1522 ".........................................
1523 else
1524 echo "***warning*** unable to comply with your request<" . choice . ">"
1525 endif
1526
1527 " restore settings
1528 let &ff= ffkeep
1529" call Dret("NetBrowseFtpCmd")
1530endfun
1531
1532" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001533" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1534" separated patterns given in g:netrw_list_hide
1535fun! <SID>NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001536" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001537
1538 let listhide= g:netrw_list_hide
1539 while listhide != ""
1540 if listhide =~ ','
1541 let hide = substitute(listhide,',.*$','','e')
1542 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1543 else
1544 let hide = listhide
1545 let listhide= ""
1546 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001547" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001548 exe 'keepjumps silent '.s:netrw_bannercnt.',$g~'.hide.'~d'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001549 endwhile
1550
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001551" call Dret("NetrwListHide")
1552endfun
1553
1554" ---------------------------------------------------------------------
1555" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar8299df92004-07-10 09:47:34 +00001556fun! <SID>NetHideEdit(mode)
1557" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001558
1559 call inputsave()
1560 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1561 call inputrestore()
1562
1563 " refresh the listing
1564 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001565 if a:mode == 0
1566 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1567 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001568 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001569 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001570
1571" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001572endfun
1573
Bram Moolenaar8299df92004-07-10 09:47:34 +00001574" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001575" NetSortSequence: allows user to edit the sorting sequence
1576fun! <SID>NetSortSequence(mode)
1577" call Dfunc("NetSortSequence(mode=".a:mode.")")
1578
1579 call inputsave()
1580 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
1581 call inputrestore()
1582
1583 " refresh the listing
1584 let g:netrw_sort_sequence= newsortseq
1585 if a:mode == 0
1586 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1587 else
1588 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
1589 endif
1590
1591" call Dret("NetSortSequence")
1592endfun
1593
1594" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001595" NetLongList: {{{2
1596fun! <SID>NetLongList(mode)
1597" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".g:netrw_longlist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001598 call s:NetSavePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001599
1600 if g:netrw_longlist != 0
1601 " turn long listing off
1602 let g:netrw_longlist = 0
1603 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1604
1605 else
1606 " turn long listing on
1607 let g:netrw_longlist = 1
1608 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
1609 endif
1610
1611 " refresh the listing
1612 if a:mode == 0
1613 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1614 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001615 silent call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001616 endif
1617
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001618 call s:NetRestorePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001619" call Dret("NetLongList : g:netrw_longlist=".g:netrw_longlist)
1620endfun
1621
1622" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001623" NetSaveWordPosn: used by the "s" command in both remote and local
1624" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
1625" the same word even though the sorting has changed its order of appearance.
1626fun! s:NetSaveWordPosn()
1627" call Dfunc("NetSaveWordPosn()")
1628 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
1629" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
1630endfun
1631
1632" ---------------------------------------------------------------------
1633" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above
1634fun! s:NetRestoreWordPosn()
1635" call Dfunc("NetRestoreWordPosn()")
1636 silent! call search(s:netrw_saveword,'w')
1637" call Dret("NetRestoreWordPosn")
1638endfun
1639
1640" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001641" NetMakeDir: this function makes a directory (both local and remote)
1642fun! <SID>NetMakeDir(usrhost)
1643" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
1644
1645 " get name of new directory from user. A bare <CR> will skip.
1646 " if its currently a directory, also request will be skipped, but with
1647 " a message.
1648 call inputsave()
1649 let newdirname= input("Please give directory name: ")
1650 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001651" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001652
1653 if newdirname == ""
1654" call Dret("NetMakeDir : user aborted with bare <cr>")
1655 return
1656 endif
1657
1658 if a:usrhost == ""
1659
1660 " Local mkdir:
1661 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001662 let fullnewdir= b:netrw_curdir.'/'.newdirname
1663" call Decho("fullnewdir<".fullnewdir.">")
1664 if isdirectory(fullnewdir)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001665 echoerr "***warning*** <".newdirname."> is already a directory!"
1666" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
1667 return
1668 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001669 if filereadable(fullnewdir)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001670 echoerr "***warning*** <".newdirname."> is already a file!"
1671" call Dret("NetMakeDir : file<".newdirname."> exists previously")
1672 return
1673 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001674 let netrw_origdir= s:NetGetcwd(1)
1675 exe 'cd '.b:netrw_curdir
1676" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
1677" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
1678 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
1679 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
1680
Bram Moolenaar8299df92004-07-10 09:47:34 +00001681 if v:shell_error == 0
1682 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001683" call Decho("refresh listing")
1684 let linenum= line(".")
1685 norm! H0
1686 let hline = line(".")
1687 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
1688 exe "norm! ".hline."G0z\<CR>"
1689 exe linenum
Bram Moolenaar8299df92004-07-10 09:47:34 +00001690 else
1691 echoerr "***warning*** unable to make directory<".newdirname.">"
1692 endif
1693 redraw!
1694
1695 else
1696 " Remote mkdir:
1697 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001698 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00001699" call Decho("exe silent! !".mkdircmd." ".newdirname)
1700 exe "silent! !".mkdircmd." ".newdirname
1701 if v:shell_error == 0
1702 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001703 let linenum= line(".")
1704 norm! H0
1705 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001706 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001707 exe "norm! ".hline."G0z\<CR>"
1708 exe linenum
Bram Moolenaar8299df92004-07-10 09:47:34 +00001709 else
1710 echoerr "***warning*** unable to make directory<".newdirname.">"
1711 endif
1712 redraw!
1713 endif
1714
1715" call Dret("NetMakeDir")
1716endfun
1717
1718" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001719" NetBookmarkDir:
1720" 0: bookmark the current directory
1721" 1: change to the bookmarked directory
1722fun! <SID>NetBookmarkDir(chg,curdir)
1723" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
1724
1725 if a:chg == 0
1726 " bookmark the current directory
1727 let s:netrw_bookmarkdir_{v:count}= a:curdir
1728 if !exists("s:bookmarkmax")
1729 let s:bookmarkmax= v:count
1730 elseif v:count > s:bookmarkmax
1731 let s:bookmarkmax= v:count
1732 endif
1733
1734 elseif a:chg == 1
1735 " change to the bookmarked directory
1736 if exists("s:netrw_bookmarkdir_{v:count}")
1737 exe "e ".s:netrw_bookmarkdir_{v:count}
1738 else
1739 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
1740 endif
1741
1742 elseif exists("s:bookmarkmax")
1743 " list bookmarks
1744" call Decho("list bookmarks [0,".s:bookmarkmax."]")
1745 let cnt= 0
1746 while cnt <= s:bookmarkmax
1747 if exists("s:netrw_bookmarkdir_{cnt}")
1748 echo "Netrw Bookmark#".cnt.": ".s:netrw_bookmarkdir_{cnt}
1749" call Decho("Netrw Bookmark#".cnt.": ".s:netrw_bookmarkdir_{cnt})
1750 endif
1751 let cnt= cnt + 1
1752 endwhile
1753 endif
1754" call Dret("NetBookmarkDir")
1755endfun
1756
1757
1758" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001759" Browsing Support For Local Directories And Files: {{{1
1760
1761" ---------------------------------------------------------------------
1762" LocalBrowse: supports local file/directory browsing {{{2
1763fun! <SID>LocalBrowse(dirname)
1764
1765" let dirname= (a:dirname == "")? expand("%:p") : a:dirname
1766 if !isdirectory(a:dirname)
1767 " not a directory, ignore it
1768 return
1769 endif
1770
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001771 " unfortunate interaction -- when putting debugging calls
1772 " above one can no longer enter the DBG buffer.
1773" call Dfunc("LocalBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr())
1774" call Decho("winbufnr1=".winbufnr(1)." winbufnr2=".winbufnr(2)." winbufnr3=".winbufnr(3))
1775" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001776
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001777 if v:version < 603
1778 echoerr "vim version<".v:version."> too old for browsing with netrw"
1779" call Dret("LocalBrowse : vim version<".v:version."> too old")
1780 return
1781 endif
1782
1783 " record and change current directory
1784 let netrw_origdir= s:NetGetcwd(1)
1785 exe 'cd '.escape(substitute(a:dirname,'\\','/','ge'),s:netrw_cd_escape)
1786 let dirname= s:NetGetcwd(0)
1787" call Decho("dirname<".dirname."> buf#".bufnr("%")." winnr=".winnr())
Bram Moolenaar8299df92004-07-10 09:47:34 +00001788
1789 " make this buffer modifiable
1790 setlocal ma
1791
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001792 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001793 " Perform Directory Listing:
1794" call Decho("Perform directory listing...")
1795 " set up new buffer and map
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001796 " remove the trailing "/"
1797 let dirnamens= substitute(dirname,'/$','','e')
1798 let dirnamenr= bufnr(dirnamens.'$')
1799" call Decho("dirnamenr= bufnr(".dirnamens.")=".dirnamenr)
1800
1801 if dirnamenr != 0 && bufname(dirnamenr) != dirnamens
1802 " try keeping the trailing slash
1803 let dirnamenr = bufnr(dirname.'$')
1804" call Decho("retry: dirnamenr= bufnr(".dirname.")=".dirnamenr)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001805 endif
1806" call Decho("bufnr(dirname<".dirname.">)=".dirnamenr)
1807
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001808 if dirnamenr != -1
Bram Moolenaar8299df92004-07-10 09:47:34 +00001809 " buffer already exists (hidden), so switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001810" call Decho("buffer already exists: dirnamenr=".dirnamenr." dirname<".dirname."> pre-exists")
1811" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001812 exe "b ".dirnamenr
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001813 exe 'silent! cd '.escape(substitute(a:dirname,'\\','/','ge'),s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001814" call Decho("changed directory to<".dirname.">")
1815 if a:dirname != "." && line("$") >= 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001816" call Dret("LocalBrowse : buffer already exists with info, #".dirnamenr)
1817 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001818 return
1819 endif
1820" call Decho("buffer already exists, but needs listing (buf#".dirnamenr.")")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001821 setlocal ma
Bram Moolenaar8299df92004-07-10 09:47:34 +00001822 keepjumps %d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001823 if expand("%:p") != dirname
1824 exe 'silent! file '.escape(dirname,s:netrw_cd_escape)
1825" call Decho("renamed file to<".escape(dirname,' #').">")
Bram Moolenaar269ec652004-07-29 08:43:53 +00001826 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001827 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001828" call Decho("generate new buffer named<".escape(dirname,' #').">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001829 silent! enew!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001830 exe 'silent! file '.substitute(escape(dirname,s:netrw_cd_escape),'/$','','e')
1831" call Decho("renamed file to<".escape(dirname,s:netrw_cd_escape).">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001832 endif
1833 " set standard browser options on buffer
1834 setlocal ts=32 bt=nowrite bh=hide nobl
1835
1836 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00001837" call Decho("Setting up local browser maps")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001838 let b:netrw_curdir= s:NetGetcwd(1)
1839 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
1840 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
1841 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
1842 nnoremap <buffer> <silent> a :let g:netrw_hide=!g:netrw_hide<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
1843 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
1844 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
1845 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
1846 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
1847 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00001848 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001849 nnoremap <buffer> <silent> o :exe g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
1850 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
1851 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(b:netrw_curdir,'./'))<cr>
1852 nnoremap <buffer> <silent> s :call <SID>NetSaveWordPosn()<bar>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(b:netrw_curdir,'./'))<bar>call <SID>NetRestoreWordPosn()<cr>
1853 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
1854 nnoremap <buffer> <silent> v :exe g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
1855 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)<cr>
1856 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
1857 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
1858 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
1859 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
1860 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
1861 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
1862 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001863 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001864 nnoremap <buffer> ? :he netrw-dir<cr>
1865
1866 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00001867" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001868 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001869 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001870 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001871 keepjumps put ='\" '.dirname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001872 let s:netrw_bannercnt= 7
1873
1874 let sortby= g:netrw_sort_by
1875 if g:netrw_sort_direction =~ "^r"
1876 let sortby= sortby." reversed"
1877 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001878
Bram Moolenaar8299df92004-07-10 09:47:34 +00001879 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00001880" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001881 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001882 let s:netrw_bannercnt= s:netrw_bannercnt + 1
1883 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00001884 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1885 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00001886" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001887 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001888 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00001889 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001890 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001891 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001892 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00001893 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001894 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1895 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001896
1897 " generate the requested directory listing
1898 call LocalBrowseList(dirname)
1899
1900 " manipulate the directory listing (hide, sort)
1901 setlocal ft=netrwlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001902 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001903 if g:netrw_hide && g:netrw_list_hide != ""
1904 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001905 endif
1906 if g:netrw_sort_by =~ "^n"
1907 call s:SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001908 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
1909 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001910 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001911 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
1912 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001913 endif
1914 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001915 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001916
1917 setlocal noma nomod
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001918 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001919
Bram Moolenaar269ec652004-07-29 08:43:53 +00001920" call Dret("LocalBrowse : file<".expand("%:p").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001921endfun
1922
1923" ---------------------------------------------------------------------
1924" LocalBrowseList: does the job of "ls" for local directories {{{2
1925fun! LocalBrowseList(dirname)
1926" call Dfunc("LocalBrowseList(dirname<".a:dirname.">)")
1927
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001928 let dirname = escape(a:dirname,s:netrw_glob_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001929 let dirnamelen = strlen(a:dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001930 let filelist = glob(dirname."*")
1931 if filelist != ""
1932 let filelist= filelist."\n"
1933 endif
1934 let filelist= filelist.glob(dirname.".*")
1935" call Decho("dirname<".dirname.">")
1936" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001937" call Decho("filelist<".filelist.">")
1938
1939 while filelist != ""
1940 if filelist =~ '\n'
1941 let file = substitute(filelist,'\n.*$','','e')
1942 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
1943 else
1944 let file = filelist
1945 let filelist= ""
1946 endif
1947 let pfile= file
1948 if isdirectory(file)
1949 let pfile= file."/"
1950 endif
1951 let pfile= strpart(pfile,dirnamelen)
1952 if g:netrw_longlist
Bram Moolenaar269ec652004-07-29 08:43:53 +00001953 let sz = getfsize(file)
1954 let fsz = strpart(" ",1,15-strlen(sz)).sz
1955 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(file))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001956 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001957
Bram Moolenaar8299df92004-07-10 09:47:34 +00001958 if g:netrw_sort_by =~ "^t"
1959 " sort by time (handles time up to 1 quintillion seconds, US)
1960" call Decho("getftime(".file.")=".getftime(file))
1961 let t = getftime(file)
1962 let ft = strpart("000000000000000000",1,18-strlen(t)).t
1963" call Decho("exe keepjumps put ='".ft.'/'.file."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001964 let ftpfile= ft.'/'.pfile
1965 keepjumps put=ftpfile
1966
Bram Moolenaar8299df92004-07-10 09:47:34 +00001967 elseif g:netrw_sort_by =~ "^s"
1968 " sort by size (handles file sizes up to 1 quintillion bytes, US)
1969" call Decho("getfsize(".file.")=".getfsize(file))
1970 let sz = getfsize(file)
1971 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
1972" call Decho("exe keepjumps put ='".fsz.'/'.file."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001973 let fszpfile= fsz.'/'.pfile
1974 keepjumps put =fszpfile
1975
Bram Moolenaar8299df92004-07-10 09:47:34 +00001976 else
1977 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001978" call Decho("exe keepjumps put ='".pfile."'")
1979 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00001980 endif
1981 endwhile
1982
1983" call Dret("LocalBrowseList")
1984endfun
1985
1986" ---------------------------------------------------------------------
1987" LocalBrowseChgDir: constructs a new directory based on the current {{{2
1988" directory and a new directory name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001989fun! <SID>LocalBrowseChgDir(dirname,newdir,...)
1990" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001991
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001992 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001993 let newdir = a:newdir
1994
1995 if dirname !~ '/$'
1996 " apparently vim is "recognizing" that it is in the home directory and
1997 " is removing the "/". Bad idea, so I have to put it back.
1998 let dirname= dirname.'/'
1999" call Decho("adjusting dirname<".dirname.">")
2000 endif
2001
2002 if newdir !~ '/$'
2003 " handling a file
2004 let dirname= dirname.newdir
2005" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002006 " this lets NetBrowseX avoid the edit
2007 if a:0 < 1
2008 exe "e ".escape(dirname,s:netrw_cd_escape)
2009 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002010
2011 elseif newdir == './'
2012 " refresh the directory list
2013" call Decho("refresh directory listing")
2014 setlocal ma
2015 %d
2016
2017 elseif newdir == '../'
2018 " go up one directory
2019 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+/$\)','\1','e')
2020" call Decho("go up one dir: dirname<".dirname.">")
2021
2022 else
2023 " go down one directory
2024 let dirname= dirname.newdir
2025" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2026 endif
2027
2028" call Dret("LocalBrowseChgDir <".dirname.">")
2029 return dirname
2030endfun
2031
2032" ---------------------------------------------------------------------
2033" LocalBrowseRm:
2034fun! <SID>LocalBrowseRm(path) range
2035" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2036" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2037
2038 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002039 let ctr = a:firstline
2040 let ret = 0
2041 let netrw_origdir = s:NetGetcwd(1)
2042 exe 'cd '.b:netrw_curdir
Bram Moolenaar8299df92004-07-10 09:47:34 +00002043
2044 " remove multiple files and directories
2045 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002046 exe "keepjumps ".ctr
2047
2048 " sanity checks
2049 if line(".") < s:netrw_bannercnt
2050 let ctr= ctr + 1
2051 continue
2052 endif
2053 let curword= s:NetGetWord()
2054 if curword == "./" || curword == "../"
2055 let ctr= ctr + 1
2056 continue
2057 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002058
2059 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002060 let rmfile= a:path.curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002061" call Decho("rmfile<".rmfile.">")
2062
2063 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '/$')
2064 " attempt to remove file
2065 call inputsave()
2066 let ok= input("Confirm deletion of file<".rmfile."> ","y")
2067 call inputrestore()
2068 if ok == "y"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002069 let ret= delete(rmfile)
2070" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002071 endif
2072
2073 else
2074 " attempt to remove directory
2075 call inputsave()
2076 let ok= input("Confirm deletion of directory<".rmfile."> ","y")
2077 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002078 let rmfile= substitute(rmfile,'/$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002079
2080 if ok == "y"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002081" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2082 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002083" call Decho("v:shell_error=".v:shell_error)
2084
2085 if v:shell_error != 0
2086" call Decho("2nd attempt to remove directory<".rmfile.">")
2087 let errcode= delete(rmfile)
2088" call Decho("errcode=".errcode)
2089
2090 if errcode != 0
2091 if has("unix")
2092" call Decho("3rd attempt to remove directory<".rmfile.">")
2093 call system("rm ".rmfile)
2094 if v:shell_error != 0
2095 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
2096 endif
2097 else
2098 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
2099 endif
2100 endif
2101 endif
2102 endif
2103 endif
2104
2105 let ctr= ctr + 1
2106 endwhile
2107
2108 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002109 let curline= line(".")
2110 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002111" call Decho("refresh the directory")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002112 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002113 exe curline
2114
2115" call Dret("LocalBrowseRm")
2116endfun
2117
2118" ---------------------------------------------------------------------
2119" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00002120fun! <SID>LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002121" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2122
2123 " preparation for removing multiple files/directories
2124 let ctr= a:firstline
2125
2126 " attempt to rename files/directories
2127 while ctr <= a:lastline
2128 exe "keepjumps ".ctr
2129
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002130 " sanity checks
2131 if line(".") < s:netrw_bannercnt
2132 let ctr= ctr + 1
2133 continue
2134 endif
2135 let curword= s:NetGetWord()
2136 if curword == "./" || curword == "../"
2137 let ctr= ctr + 1
2138 continue
2139 endif
2140
Bram Moolenaar8299df92004-07-10 09:47:34 +00002141 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002142 let oldname= a:path.curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002143" call Decho("oldname<".oldname.">")
2144
2145 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002146 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002147 call inputrestore()
2148
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002149 let ret= system(g:netrw_local_rename.' "'.oldname.'" "'.newname.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002150" call Decho("executing system(".g:netrw_local_rename." ".oldname." ".newname)
2151
2152 let ctr= ctr + 1
2153 endwhile
2154
2155 " refresh the directory
2156 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002157" call Decho("refresh the directory listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002158 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002159 exe "keepjumps ".curline
2160" call Dret("LocalBrowseRename")
2161endfun
2162
2163" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002164" NetGetcwd: get the current directory.
2165" Change backslashes to forward slashes, if any.
2166" If doesc is true, escape certain troublesome characters
2167fun! <SID>NetGetcwd(doesc)
2168" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
2169 let curdir= substitute(getcwd(),'\\','/','ge')
2170 if curdir !~ '/$'
2171 let curdir= curdir.'/'
2172 endif
2173 if a:doesc
2174 let curdir= escape(curdir,s:netrw_cd_escape)
2175 endif
2176" call Dret("NetGetcwd <".curdir.">")
2177 return curdir
2178endfun
2179
2180" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00002181" NetMethod: determine method of transfer {{{1
2182" method == 1: rcp
2183" 2: ftp + <.netrc>
2184" 3: ftp + machine, id, password, and [path]filename
2185" 4: scp
2186" 5: http (wget)
2187" 6: cadaver
2188" 7: rsync
2189" 8: fetch
2190" 9: sftp
2191fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002192" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002193
2194 " initialization
2195 let b:netrw_method = 0
2196 let g:netrw_machine = ""
2197 let b:netrw_fname = ""
2198 let g:netrw_port = ""
2199
2200 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002201 " mipf : a:machine a:id password filename Use ftp
2202 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002203 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002204 " rcpurm : rcp://[user@]host/filename Use rcp
2205 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002206 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002207 " httpurm : http://[user@]host/filename Use wget
2208 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002209 " rsyncurm : rsync://host[:port]/path Use rsync
2210 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2211 " sftpurm : sftp://[user@]host/filename Use scp
2212 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2213 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
2214 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2215 let rcpurm = '^rcp://\(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
2216 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
2217 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2218 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002219 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002220 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
2221 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2222 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
2223
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002224" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002225 " Determine Method
2226 " rcp://user@hostname/...path-to-file
2227 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002228" call Decho("rcp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002229 let b:netrw_method = 1
2230 let userid = substitute(a:choice,rcpurm,'\2',"")
2231 let g:netrw_machine= substitute(a:choice,rcpurm,'\3',"")
2232 let b:netrw_fname = substitute(a:choice,rcpurm,'\4',"")
2233 if userid != ""
2234 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002235 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002236
2237 " scp://user@hostname/...path-to-file
2238 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002239" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002240 let b:netrw_method = 4
2241 let g:netrw_machine= substitute(a:choice,scpurm,'\1',"")
2242 let b:netrw_port = substitute(a:choice,scpurm,'\2',"")
2243 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
2244
2245 " http://user@hostname/...path-to-file
2246 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002247" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002248 let b:netrw_method = 5
2249 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2250 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
2251
2252 " dav://hostname[:port]/..path-to-file..
2253 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002254" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002255 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002256 if a:choice =~ '^s'
2257 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2258 else
2259 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2260 endif
2261 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002262
2263 " rsync://user@hostname/...path-to-file
2264 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002265" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002266 let b:netrw_method = 7
2267 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2268 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
2269
2270 " ftp://[user@]hostname[[:#]port]/...path-to-file
2271 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002272" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002273 let userid = substitute(a:choice,ftpurm,'\2',"")
2274 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2275 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2276 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
2277 if g:netrw_port != ""
2278 let g:netrw_port = substitute(g:netrw_port,"[#:]","","")
2279 endif
2280 if userid != ""
2281 let g:netrw_uid= userid
2282 endif
2283 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2284 let b:netrw_method = 3
2285 else
2286 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
2287 let b:netrw_method= 2
2288 else
2289 if !exists("g:netrw_uid") || g:netrw_uid == ""
2290 call NetUserPass()
2291 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
2292 call NetUserPass(g:netrw_uid)
2293 " else just use current g:netrw_uid and g:netrw_passwd
2294 endif
2295 let b:netrw_method= 3
2296 endif
2297 endif
2298
2299 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002300" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002301 let b:netrw_method = 8
2302 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
2303 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
2304 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
2305 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
2306
2307 " Issue an ftp : "machine id password [path/]filename"
2308 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002309" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002310 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002311 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
2312 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
2313 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
2314 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
2315
2316 " Issue an ftp: "hostname [path/]filename"
2317 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002318" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002319 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2320 let b:netrw_method = 3
2321 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2322 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2323
2324 elseif filereadable(expand("$HOME/.netrc"))
2325 let b:netrw_method = 2
2326 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2327 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2328 endif
2329
2330 " sftp://user@hostname/...path-to-file
2331 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002332" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002333 let b:netrw_method = 9
2334 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
2335 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
2336
2337 " Issue an rcp: hostname:filename" (this one should be last)
2338 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002339" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002340 let b:netrw_method = 1
2341 let userid = substitute(a:choice,rcphf,'\2',"")
2342 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
2343 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002344" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
2345" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
2346" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
2347" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002348 if userid != ""
2349 let g:netrw_uid= userid
2350 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002351 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002352 " don't let PCs try <.netrc>
2353 let b:netrw_method = 3
2354 endif
2355
2356 else
2357 echoerr "***error*** cannot determine method"
2358 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002359 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002360
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002361" call Decho("a:choice <".a:choice.">")
2362" call Decho("b:netrw_method <".b:netrw_method.">")
2363" call Decho("g:netrw_machine<".g:netrw_machine.">")
2364" call Decho("g:netrw_port <".g:netrw_port.">")
2365" if exists("g:netrw_uid") "Decho
2366" call Decho("g:netrw_uid <".g:netrw_uid.">")
2367" endif "Decho
2368" if exists("g:netrw_passwd") "Decho
2369" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
2370" endif "Decho
2371" call Decho("b:netrw_fname <".b:netrw_fname.">")
2372" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002373endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002374
2375" ------------------------------------------------------------------------
2376" NetUserPass: set username and password for subsequent ftp transfer {{{1
2377" Usage: :call NetUserPass() -- will prompt for userid and password
2378" :call NetUserPass("uid") -- will prompt for password
2379" :call NetUserPass("uid","password") -- sets global userid and password
2380fun! NetUserPass(...)
2381
2382 " get/set userid
2383 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002384" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002385 if !exists("g:netrw_uid") || g:netrw_uid == ""
2386 " via prompt
2387 let g:netrw_uid= input('Enter username: ')
2388 endif
2389 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002390" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002391 let g:netrw_uid= a:1
2392 endif
2393
2394 " get password
2395 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002396" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002397 let g:netrw_passwd= inputsecret("Enter Password: ")
2398 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002399" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002400 let g:netrw_passwd=a:2
2401 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002402" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002403endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002404
2405" ------------------------------------------------------------------------
2406" NetOptionSave: save options and set to "standard" form {{{1
2407fun!s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002408" call Dfunc("NetOptionSave()")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002409
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002410 " Get Temporary Filename
2411 let s:aikeep = &ai
2412 let s:cinkeep = &cin
2413 let s:cinokeep = &cino
2414 let s:comkeep = &com
2415 let s:cpokeep = &cpo
2416 let s:dirkeep = getcwd()
2417 let s:gdkeep = &gd
2418 let s:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00002419 setlocal cino =
2420 setlocal com =
2421 setlocal cpo -=aA
2422 setlocal nocin noai
2423 setlocal tw =0
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002424 if has("win32") && !has("win95")
2425 let s:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00002426 setlocal noswf
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002427" call Decho("setting s:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002428 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002429
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002430" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002431endfun
2432
2433" ------------------------------------------------------------------------
2434" NetOptionRestore: restore options {{{1
2435fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002436" call Dfunc("NetOptionRestore()")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002437
2438 let &ai = s:aikeep
2439 let &cin = s:cinkeep
2440 let &cino = s:cinokeep
2441 let &com = s:comkeep
2442 let &cpo = s:cpokeep
2443 exe "lcd ".s:dirkeep
2444 let &gd = s:gdkeep
2445 let &tw = s:twkeep
2446 if exists("s:swfkeep")
2447 let &swf= s:swfkeep
2448 unlet s:swfkeep
2449 endif
2450 unlet s:aikeep
2451 unlet s:cinkeep
2452 unlet s:cinokeep
2453 unlet s:comkeep
2454 unlet s:cpokeep
2455 unlet s:gdkeep
2456 unlet s:twkeep
2457 unlet s:dirkeep
2458
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002459" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002460endfun
2461
2462" ------------------------------------------------------------------------
2463" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002464" to handle extra junk that their system's ftp dumps
2465" into the transfer. This function is provided as an
2466" example and as a fix for a Windows 95 problem: in my
2467" experience, win95's ftp always dumped four blank lines
2468" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002469if has("win95") && g:netrw_win95ftp
2470 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002471" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002472 if method == 3 " ftp (no <.netrc>)
2473 let fourblanklines= line2 - 3
2474 silent fourblanklines.",".line2."g/^\s*/d"
2475 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002476" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002477 endfun
2478endif
2479
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002480" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002481" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002482fun! <SID>NetSort() range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002483" call Dfunc("NetSort()")
2484
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002485 let i = a:firstline + 1
2486 while i <= a:lastline
2487 " find insertion point via binary search
2488 let i_val = getline(i)
2489 let lo = a:firstline
2490 let hi = i
2491 while lo < hi
2492 let mid = (lo + hi) / 2
2493 let mid_val = getline(mid)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002494 if g:netrw_sort_direction =~ '^n'
2495 " normal sorting order
2496 if i_val < mid_val
2497 let hi = mid
2498 else
2499 let lo = mid + 1
2500 if i_val == mid_val | break | endif
2501 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002502 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002503 " reverse sorting order
2504 if i_val > mid_val
2505 let hi = mid
2506 else
2507 let lo = mid + 1
2508 if i_val == mid_val | break | endif
2509 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002510 endif
2511 endwhile
2512 " do insert
2513 if lo < i
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002514 exe 'keepjumps '.i.'d_'
2515 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002516 endif
2517 let i = i + 1
2518 endwhile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002519
2520" call Dret("NetSort")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002521endfun
2522
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002523" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002524" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
2525" What this function does is to compute a priority for the patterns
2526" in the g:netrw_sort_sequence. It applies a substitute to any
2527" "files" that satisfy each pattern, putting the priority / in
2528" front. An "*" pattern handles the default priority.
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002529fun! <SID>SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002530" call Dfunc("SetSort() bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002531 if g:netrw_longlist
2532 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
2533 else
2534 let seqlist = g:netrw_sort_sequence
2535 endif
2536 " sanity check -- insure that * appears somewhere
2537 if seqlist == ""
2538 let seqlist= '*'
2539 elseif seqlist !~ '\*'
2540 let seqlist= seqlist.',*'
2541 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002542 let priority = 1
2543 while seqlist != ""
2544 if seqlist =~ ','
2545 let seq = substitute(seqlist,',.*$','','e')
2546 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
2547 else
2548 let seq = seqlist
2549 let seqlist = ""
2550 endif
2551 let eseq= escape(seq,'/')
2552 if priority < 10
2553 let spriority= "00".priority.'\/'
2554 elseif priority < 100
2555 let spriority= "0".priority.'\/'
2556 else
2557 let spriority= priority.'\/'
2558 endif
2559" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
2560
2561 if seq == '*'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002562 exe 'keepjumps silent '.s:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002563 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002564 exe 'keepjumps silent '.s:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002565 endif
2566 let priority = priority + 1
2567 endwhile
2568
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002569 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002570
2571" call Dret("SetSort")
2572endfun
2573
Bram Moolenaar071d4272004-06-13 20:20:40 +00002574" ------------------------------------------------------------------------
2575" Restore {{{1
2576let &cpo= s:save_cpo
2577unlet s:save_cpo
2578" vim:ts=8 fdm=marker