blob: 9f5dc9e74adb2ce5271b99a8d04307eac2730bbe [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002" Last Change: Sep 10, 2004
Bram Moolenaar071d4272004-06-13 20:20:40 +00003" Maintainer: Charles E. Campbell, Jr. PhD <drchipNOSPAM at campbellfamily.biz>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00004" Version: 48
Bram Moolenaar071d4272004-06-13 20:20:40 +00005" License: Vim License (see vim's :help license)
6"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00007" But be doers of the Word, and not only hearers, deluding your own selves
Bram Moolenaar071d4272004-06-13 20:20:40 +00008" (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 Moolenaarc0197e22004-09-13 20:26:32 +000014if exists("g:loaded_netrw") || &cp
Bram Moolenaar071d4272004-06-13 20:20:40 +000015 finish
16endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +000017let g:loaded_netrw = "v48"
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
Bram Moolenaarc0197e22004-09-13 20:26:32 +000046if !exists("g:netrw_ftp_list_cmd")
47 if has("unix") || exists("g:netrw_cygwin")
48 let g:netrw_ftp_list_cmd= "ls -lF"
49 else
50 let g:netrw_ftp_list_cmd= "dir"
51 endif
52endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000053if !exists("g:netrw_rm_cmd")
54 let g:netrw_rm_cmd = "ssh HOSTNAME rm"
55endif
56if !exists("g:netrw_rmf_cmd")
57 let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
58endif
59if !exists("g:netrw_rmdir_cmd")
60 let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
61endif
62if !exists("g:netrw_rename_cmd")
63 let g:netrw_rename_cmd= "ssh HOSTNAME mv"
64endif
65if exists("g:netrw_silent") && g:netrw_silent != 0
66 let g:netrw_silentxfer= "silent "
67else
68 let g:netrw_silentxfer= ""
69endif
70if !exists("g:netrw_winsize")
71 let g:netrw_winsize= ""
72endif
73if !exists("g:netrw_list_hide")
74 let g:netrw_list_hide= ""
75endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000076if !exists("g:netrw_sort_by")
77 " alternatives: date size
78 let g:netrw_sort_by= "name"
79endif
80if !exists("g:netrw_sort_sequence")
81 let g:netrw_sort_sequence= '/$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
82endif
83if !exists("g:netrw_sort_direction")
84 " alternative: reverse (z y x ...)
85 let g:netrw_sort_direction= "normal"
86endif
Bram Moolenaar8299df92004-07-10 09:47:34 +000087if !exists("g:netrw_longlist") || g:netrw_longlist == 0
88 let g:netrw_longlist= 0
89else
90 let g:netrw_longlist= 1
Bram Moolenaar269ec652004-07-29 08:43:53 +000091 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -lk"
Bram Moolenaar8299df92004-07-10 09:47:34 +000092endif
93if !exists("g:netrw_timefmt")
94 let g:netrw_timefmt= "%c"
95endif
96if !exists("g:netrw_local_rmdir")
97 let g:netrw_local_rmdir= "rmdir"
98endif
99if !exists("g:netrw_local_rename")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000100 if g:netrw_cygwin
101 let g:netrw_local_rename= "mv"
102 elseif has("win32") || has("win95") || has("win64") || has("win16")
103 let g:netrw_local_rename= "rename"
Bram Moolenaar8299df92004-07-10 09:47:34 +0000104 elseif has("unix")
105 let g:netrw_local_rename= "mv"
106 endif
107endif
108if !exists("g:netrw_local_mkdir")
109 let g:netrw_local_mkdir= "mkdir"
110endif
111if !exists("g:netrw_mkdir_cmd")
112 let g:netrw_mkdir_cmd= "ssh HOSTNAME mkdir"
113endif
Bram Moolenaar269ec652004-07-29 08:43:53 +0000114if !exists("g:netrw_hide")
115 let g:netrw_hide= 1
116endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000117if !exists("g:netrw_ftp_browse_reject")
118 let g:netrw_ftp_browse_reject='^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not'
119endif
120if !exists("g:netrw_keepdir")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000121 let g:netrw_keepdir= 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000122endif
123if !exists("s:netrw_cd_escape")
124 if has("win32") || has("win95") || has("win64") || has("win16")
125 let s:netrw_cd_escape="#% "
126 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000127 let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000128 endif
129endif
130if !exists("s:netrw_glob_escape")
131 if has("win32") || has("win95") || has("win64") || has("win16")
132 let s:netrw_glob_escape= ""
133 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000134 let s:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000135 endif
136endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000137if !exists("g:netrw_alto")
138 let g:netrw_alto= 0
139endif
140if !exists("g:netrw_altv")
141 let g:netrw_altv= 0
142endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000143
144" BufEnter event ignored by decho when following variable is true
145" Has a side effect that doau BufReadPost doesn't work, so
146" files read by network transfer aren't appropriately highlighted.
147"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000148
149" ---------------------------------------------------------------------
150" Default values for global protocol variables {{{1
151if !exists("g:netrw_rcp_cmd")
152 let g:netrw_rcp_cmd = "rcp"
153endif
154if !exists("g:netrw_ftp_cmd")
155 let g:netrw_ftp_cmd = "ftp"
156endif
157if !exists("g:netrw_scp_cmd")
158 let g:netrw_scp_cmd = "scp -q"
159endif
160if !exists("g:netrw_sftp_cmd")
161 let g:netrw_sftp_cmd = "sftp"
162endif
163if !exists("g:netrw_http_cmd")
164 if executable("wget")
165 let g:netrw_http_cmd = "wget -q -O"
166 elseif executable("fetch")
167 let g:netrw_http_cmd = "fetch -o"
168 else
169 let g:netrw_http_cmd = ""
170 endif
171endif
172if !exists("g:netrw_dav_cmd")
173 let g:netrw_dav_cmd = "cadaver"
174endif
175if !exists("g:netrw_rsync_cmd")
176 let g:netrw_rsync_cmd = "rsync"
177endif
178if !exists("g:netrw_fetch_cmd")
179 if executable("fetch")
180 let g:netrw_fetch_cmd = "fetch -o"
181 else
182 let g:netrw_fetch_cmd = ""
183 endif
184endif
185
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000186if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000187 \ && exists("g:netrw_use_nt_rcp")
188 \ && g:netrw_use_nt_rcp
189 \ && executable( $SystemRoot .'/system32/rcp.exe')
190 let s:netrw_has_nt_rcp = 1
191 let s:netrw_rcpmode = '-b'
192 else
193 let s:netrw_has_nt_rcp = 0
194 let s:netrw_rcpmode = ''
195endif
196
197" ---------------------------------------------------------------------
198" Transparency Support: {{{1
Bram Moolenaar8299df92004-07-10 09:47:34 +0000199 " File Explorer: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000200if version >= 600
Bram Moolenaar8299df92004-07-10 09:47:34 +0000201 augroup FileExplorer
202 au!
203 au BufEnter * call <SID>LocalBrowse(expand("<afile>"))
204 augroup END
205 " Network Handler: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000206 augroup Network
207 au!
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000208 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000209 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 +0000210 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000211 au BufReadCmd file:///* exe "silent doau BufReadPre ".expand("<afile>")|exe 'e /'.substitute(expand("<afile>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<afile>")
212 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 +0000213 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000214 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>")
215 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 +0000216 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 +0000217 augroup END
218endif
219
220" ------------------------------------------------------------------------
221" Commands: :Nread, :Nwrite, and :NetUserPass {{{1
222com! -nargs=* Nread call <SID>NetSavePosn()<bar>call <SID>NetRead(<f-args>)<bar>call <SID>NetRestorePosn()
223com! -range=% -nargs=* Nwrite call <SID>NetSavePosn()<bar><line1>,<line2>call <SID>NetWrite(<f-args>)<bar>call <SID>NetRestorePosn()
224com! -nargs=* NetUserPass call NetUserPass(<f-args>)
225
226" ------------------------------------------------------------------------
227" NetSavePosn: saves position of cursor on screen {{{1
228fun! s:NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000229" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000230 " Save current line and column
231 let s:netrw_winnr= winnr()
232 let s:netrw_line = line(".")
233 let s:netrw_col = virtcol(".")
234
235 " Save top-of-screen line
236 norm! H0
237 let s:netrw_hline= line(".")
238
239 call s:NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000240" 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 +0000241endfun
242
243" ------------------------------------------------------------------------
244" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
245fun! <SID>NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000246" 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 +0000247
248 exe "silent! ".s:netrw_winnr."wincmd w"
249 if v:shell_error == 0
250 " as suggested by Bram M: redraw on no error
251 " allows protocol error messages to remain visible
252 redraw!
253 endif
254 " restore top-of-screen line
255 exe "norm! ".s:netrw_hline."G0z\<CR>"
256 " restore position
257 exe "norm! ".s:netrw_line."G0".s:netrw_col."\<bar>"
258
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000259" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000260endfun
261
262" ------------------------------------------------------------------------
263" NetRead: responsible for reading a file over the net {{{1
264fun! s:NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000265" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000266
267 " save options
268 call s:NetOptionSave()
269
270 " Special Exception: if a file is named "0r", then
271 " "0r" will be used to read the
272 " following files instead of "r"
273 if a:0 == 0
274 let readcmd= "r"
275 let ichoice= 0
276 elseif a:1 == "0r"
277 let readcmd = "0r"
278 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000279 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000280 let readcmd = "r"
281 let ichoice = 1
282 endif
283
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000284 " get name of a temporary file and set up shell-quoting character
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000285 let tmpfile= tempname()
286
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000287" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000288 while ichoice <= a:0
289
290 " attempt to repeat with previous host-file-etc
291 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000292" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000293 let choice = b:netrw_lastfile
294 let ichoice= ichoice + 1
295
296 else
297 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000298" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000299
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000300 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000301 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000302 echomsg 'NetRead Usage:'
303 echomsg ':Nread machine:path uses rcp'
304 echomsg ':Nread "machine path" uses ftp with <.netrc>'
305 echomsg ':Nread "machine id password path" uses ftp'
306 echomsg ':Nread dav://machine[:port]/path uses cadaver'
307 echomsg ':Nread fetch://machine/path uses fetch'
308 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
309 echomsg ':Nread http://[user@]machine/path uses http wget'
310 echomsg ':Nread rcp://[user@]machine/path uses rcp'
311 echomsg ':Nread rsync://machine[:port]/path uses rsync'
312 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
313 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000314 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000315
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000316 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000317 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000318" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000319 if match(choice,"\"$") != -1
320 " case "..."
321 let choice=strpart(choice,1,strlen(choice)-2)
322 else
323 " case "... ... ..."
324 let choice = strpart(choice,1,strlen(choice)-1)
325 let wholechoice = ""
326
327 while match(choice,"\"$") == -1
328 let wholechoice = wholechoice . " " . choice
329 let ichoice = ichoice + 1
330 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000331 if !exists("g:netrw_quiet")
332 echoerr "Unbalanced string in filename '". wholechoice ."'"
333 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000334" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000335 return
336 endif
337 let choice= a:{ichoice}
338 endwhile
339 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
340 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000341 endif
342 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000343
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000344" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000345 let ichoice= ichoice + 1
346
347 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000348 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000349 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000350" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000351
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000352 exe 'lcd ' . fnamemodify(tmpfile,':h')
353 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000354 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000355
356 " Determine method of read (ftp, rcp, etc)
357 call s:NetMethod(choice)
358
Bram Moolenaar843ee412004-06-30 16:16:41 +0000359 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000360" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000361 if choice =~ "^.*/$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000362 keepjumps call s:NetBrowse(choice)
363" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000364 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000365 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000366
367 " ============
368 " Perform Read
369 " ============
370
371 ".........................................
372 " rcp: NetRead Method #1
373 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000374" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000375 " ER: noting done with g:netrw_uid yet?
376 " ER: on Win2K" rcp machine[.user]:file tmpfile
377 " ER: if machine contains '.' adding .user is required (use $USERNAME)
378 " ER: the tmpfile is full path: rcp sees C:\... as host C
379 if s:netrw_has_nt_rcp == 1
380 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
381 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
382 else
383 " Any way needed it machine contains a '.'
384 let uid_machine = g:netrw_machine .'.'. $USERNAME
385 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000386 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000387 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
388 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
389 else
390 let uid_machine = g:netrw_machine
391 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000392 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000393" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000394 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
395 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
396 let b:netrw_lastfile = choice
397
398 ".........................................
399 " ftp + <.netrc>: NetRead Method #2
400 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000401" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000402 let netrw_fname= b:netrw_fname
403 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000404 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000405 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000406 exe "put ='"."get ".netrw_fname." ".tmpfile."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000407 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000408" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000409 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
410 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000411" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000412 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
413 endif
414 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000415 if getline(1) !~ "^$" && !exists("g:netrw_quiet")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000416 let debugkeep= &debug
417 set debug=msg
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000418 echoerr getline(1)
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000419 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000420 endif
421 bd!
422 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
423 let b:netrw_lastfile = choice
424
425 ".........................................
426 " ftp + machine,id,passwd,filename: NetRead Method #3
427 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
428 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000429" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000430 let netrw_fname= b:netrw_fname
431 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000432 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000433 if exists("g:netrw_port") && g:netrw_port != ""
434 put ='open '.g:netrw_machine.' '.g:netrw_port
435 else
436 put ='open '.g:netrw_machine
437 endif
438
439 if exists("g:netrw_ftp") && g:netrw_ftp == 1
440 put =g:netrw_uid
441 put =g:netrw_passwd
442 else
443 put ='user '.g:netrw_uid.' '.g:netrw_passwd
444 endif
445
446 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
447 put =g:netrw_ftpmode
448 endif
449 put ='get '.netrw_fname.' '.tmpfile
450
451 " perform ftp:
452 " -i : turns off interactive prompting from ftp
453 " -n unix : DON'T use <.netrc>, even though it exists
454 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000455" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000456 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000457" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000458 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
459 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
460 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000461" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000462 if !exists("g:netrw_quiet")
463 echoerr getline(1)
464 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000465 endif
466 bd!
467 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
468 let b:netrw_lastfile = choice
469
470 ".........................................
471 " scp: NetRead Method #4
472 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000473" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000474 if exists("g:netrw_port") && g:netrw_port != ""
475 let useport= " -P ".g:netrw_port
476 else
477 let useport= ""
478 endif
479 if g:netrw_cygwin == 1
480 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000481" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000482 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
483 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000484" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000485 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
486 endif
487 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
488 let b:netrw_lastfile = choice
489
490 ".........................................
491 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000492" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000493 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000494 if !exists("g:netrw_quiet")
495 echoerr "neither wget nor fetch command is available"
496 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000497 exit
498 endif
499
500 if match(b:netrw_fname,"#") == -1
501 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000502" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000503 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
504 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
505
506 else
507 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
508 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
509 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000510" call Decho("netrw_html<".netrw_html.">")
511" call Decho("netrw_tag <".netrw_tag.">")
512" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000513 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
514 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000515" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000516 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
517 endif
518 let b:netrw_lastfile = choice
519
520 ".........................................
521 " cadaver: NetRead Method #6
522 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000523" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000524
525 " Construct execution string (four lines) which will be passed through filter
526 let netrw_fname= b:netrw_fname
527 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000528 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000529 if exists("g:netrw_port") && g:netrw_port != ""
530 put ='open '.g:netrw_machine.' '.g:netrw_port
531 else
532 put ='open '.g:netrw_machine
533 endif
534 put ='user '.g:netrw_uid.' '.g:netrw_passwd
535
536 if g:netrw_cygwin == 1
537 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
538 put ='get '.netrw_fname.' '.cygtmpfile
539 else
540 put ='get '.netrw_fname.' '.tmpfile
541 endif
542
543 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000544 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000545" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000546 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
547 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000548 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000549 let b:netrw_lastfile = choice
550
551 ".........................................
552 " rsync: NetRead Method #7
553 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000554" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000555 if g:netrw_cygwin == 1
556 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000557" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000558 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
559 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000560" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000561 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
562 endif
563 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
564 let b:netrw_lastfile = choice
565
566 ".........................................
567 " fetch: NetRead Method #8
568 " fetch://[user@]host[:http]/path
569 elseif b:netrw_method == 8 " read with fetch
570 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000571 if !exists("g:netrw_quiet")
572 echoerr "fetch command not available"
573 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000574 exit
575 endif
576 if exists("g:netrw_option") && g:netrw_option == ":http"
577 let netrw_option= "http"
578 else
579 let netrw_option= "ftp"
580 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000581" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000582
583 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000584" 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 +0000585 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
586 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000587" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000588 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
589 endif
590
591 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
592 let b:netrw_lastfile = choice
593
594 ".........................................
595 " sftp: NetRead Method #9
596 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000597" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000598 if g:netrw_cygwin == 1
599 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000600" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
601" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000602 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
603 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000604" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000605 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
606 endif
607 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
608 let b:netrw_lastfile = choice
609
610 ".........................................
611 else " Complain
612 echo "***warning*** unable to comply with your request<" . choice . ">"
613 endif
614 endwhile
615
616 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000617" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000618 if exists("b:netrw_method")
619 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000620 unlet b:netrw_fname
621 endif
622 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000623
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000624" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000625endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000626
627" ------------------------------------------------------------------------
628" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
629fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000630" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000631
632 if exists("*NetReadFixup")
633 " for the use of NetReadFixup (not otherwise used internally)
634 let line2= line("$")
635 endif
636
637 " transform paths from / to \ for Windows, unless the shell is bash
638 if &term == "win32"
639 if &shell == "bash"
640 let fname=a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000641" call Decho("(win32 && bash) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000642 else
643 let fname=substitute(a:fname,'/','\\\\','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000644" call Decho("(win32 && !bash) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000645 endif
646 else
647 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000648" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000649 endif
650
651 " get the file, but disable undo when reading a new buffer
652 if a:readcmd[0] == '0'
653 let use_e_cmd = 0 " 1 when using ':edit'
654 let delline = 0 " 1 when have to delete empty last line
655 if line("$") == 1 && getline(1) == ""
656 " Now being asked to 0r a file into an empty file.
657 " Safe to :e it instead, unless there is another window on the same buffer.
658 let curbufnr = bufnr("%")
659 let use_e_cmd = 1
660 let delline = 1
661 " Loop over all windows,
662 " reset use_e_cmd when another one is editing the current buffer.
663 let i = 1
664 while 1
665 if i != winnr() && winbufnr(i) == curbufnr
666 let use_e_cmd = 0
667 break
668 endif
669 let i = i + 1
670 if winbufnr(i) < 0
671 break
672 endif
673 endwhile
674 endif
675
676 if use_e_cmd > 0
677 " ':edit' the temp file, wipe out the old buffer and rename the buffer
678 let curfilename = expand("%")
679
680 let binlocal = &l:bin
681 let binglobal = &g:bin
682 if binlocal
683 setglobal bin " Need to set 'bin' globally for ":e" command.
684 endif
685 silent exe "e! ".v:cmdarg." ".fname
686 if binlocal && !binglobal
687 setglobal nobin
688 setlocal bin
689 endif
690
691 exe curbufnr . "bwipe!"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000692 exe "f ".escape(curfilename," ")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000693 " the ":f newname" apparently leaves the temporary file as the alternate
694 " file in the buffer list (see :ls!). The following command wipes it out.
695 exe bufnr("#")."bwipe!"
696 else
697 let oldul= &ul
Bram Moolenaar8299df92004-07-10 09:47:34 +0000698 setlocal ul=-1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000699 exe a:readcmd." ".v:cmdarg." ".escape(fname," ")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000700 if delline > 0
701 " wipe out last line, which should be a blank line anyway
702 $del
703 endif
704 let &ul= oldul
705 endif
706 elseif filereadable(fname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000707" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000708 exe a:readcmd." ".v:cmdarg." ".fname
709 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000710" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000711 return
712 endif
713
714 " User-provided (ie. optional) fix-it-up command
715 if exists("*NetReadFixup")
716 let line1= line(".")
717 if a:readcmd == "r"
718 let line2= line("$") - line2 + line1
719 else
720 let line2= line("$") - line2
721 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000722" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000723 call NetReadFixup(a:method, line1, line2)
724 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000725
726 " update the Buffers menu
727 if has("gui") && has("gui_running")
728 silent! emenu Buffers.Refresh\ menu
729 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000730
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000731" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000732
733 " insure that we have the right filetype and that its being displayed
734 filetype detect
735 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000736" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000737endfun
738
739" ------------------------------------------------------------------------
740" NetWrite: responsible for writing a file over the net {{{1
741fun! s:NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000742" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000743
744 " option handling
745 let mod= 0
746 call s:NetOptionSave()
747
748 " Get Temporary Filename
749 let tmpfile= tempname()
750
751 if a:0 == 0
752 let ichoice = 0
753 else
754 let ichoice = 1
755 endif
756
757 " write (selected portion of) file to temporary
758 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
759
760 while ichoice <= a:0
761
762 " attempt to repeat with previous host-file-etc
763 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000764" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000765 let choice = b:netrw_lastfile
766 let ichoice= ichoice + 1
767 else
768 exe "let choice= a:" . ichoice
769
770 " Reconstruct Choice if choice starts with '"'
771 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000772 echomsg 'NetWrite Usage:"'
773 echomsg ':Nwrite machine:path uses rcp'
774 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
775 echomsg ':Nwrite "machine id password path" uses ftp'
776 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
777 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
778 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
779 echomsg ':Nwrite rcp://machine/path uses rcp'
780 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
781 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
782 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000783 break
784
785 elseif match(choice,"^\"") != -1
786 if match(choice,"\"$") != -1
787 " case "..."
788 let choice=strpart(choice,1,strlen(choice)-2)
789 else
790 " case "... ... ..."
791 let choice = strpart(choice,1,strlen(choice)-1)
792 let wholechoice = ""
793
794 while match(choice,"\"$") == -1
795 let wholechoice= wholechoice . " " . choice
796 let ichoice = ichoice + 1
797 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000798 if !exists("g:netrw_quiet")
799 echoerr "Unbalanced string in filename '". wholechoice ."'"
800 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000801" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000802 return
803 endif
804 let choice= a:{ichoice}
805 endwhile
806 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
807 endif
808 endif
809 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000810" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000811 let ichoice= ichoice + 1
812
813 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000814 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000815 let choice= substitute(choice,'\\','/','ge')
816 "ER: see NetRead()
817 exe 'lcd ' . fnamemodify(tmpfile,':h')
818 let tmpfile = fnamemodify(tmpfile,':t')
819 endif
820
821 " Determine method of read (ftp, rcp, etc)
822 call s:NetMethod(choice)
823
824 " =============
825 " Perform Write
826 " =============
827
828 ".........................................
829 " rcp: NetWrite Method #1
830 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000831" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000832 if s:netrw_has_nt_rcp == 1
833 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
834 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
835 else
836 let uid_machine = g:netrw_machine .'.'. $USERNAME
837 endif
838 else
839 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
840 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
841 else
842 let uid_machine = g:netrw_machine
843 endif
844 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000845" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000846 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
847 let b:netrw_lastfile = choice
848
849 ".........................................
850 " ftp + <.netrc>: NetWrite Method #2
851 elseif b:netrw_method == 2 " write with ftp + <.netrc>
852 let netrw_fname = b:netrw_fname
853 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000854 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000855 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000856" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000857 exe "put ='"."put ".tmpfile." ".netrw_fname."'"
858" call Decho("put ='"."put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000859 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000860" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000861 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000862 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000863" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000864 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000865 endif
866 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
867 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000868 if !exists("g:netrw_quiet")
869 echoerr getline(1)
870 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000871 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000872 endif
873 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000874 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000875
876 ".........................................
877 " ftp + machine, id, passwd, filename: NetWrite Method #3
878 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
879 let netrw_fname= b:netrw_fname
880 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000881 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000882 if exists("g:netrw_port") && g:netrw_port != ""
883 put ='open '.g:netrw_machine.' '.g:netrw_port
884 else
885 put ='open '.g:netrw_machine
886 endif
887 if exists("g:netrw_ftp") && g:netrw_ftp == 1
888 put =g:netrw_uid
889 put =g:netrw_passwd
890 else
891 put ='user '.g:netrw_uid.' '.g:netrw_passwd
892 endif
893 put ='put '.tmpfile.' '.netrw_fname
894 " save choice/id/password for future use
895 let b:netrw_lastfile = choice
896
897 " perform ftp:
898 " -i : turns off interactive prompting from ftp
899 " -n unix : DON'T use <.netrc>, even though it exists
900 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000901" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000902 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000903" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000904 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
905 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
906 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000907 if !exists("g:netrw_quiet")
908 echoerr getline(1)
909 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000910 let mod=1
911 endif
912 bd!
913
914 ".........................................
915 " scp: NetWrite Method #4
916 elseif b:netrw_method == 4 " write with scp
917 if exists("g:netrw_port") && g:netrw_port != ""
918 let useport= " -P ".g:netrw_port
919 else
920 let useport= ""
921 endif
922 if g:netrw_cygwin == 1
923 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000924" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000925 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
926 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000927" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000928 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
929 endif
930 let b:netrw_lastfile = choice
931
932 ".........................................
933 " http: NetWrite Method #5
934 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000935 if !exists("g:netrw_quiet")
936 echoerr "***warning*** currently <netrw.vim> does not support writing using http:"
937 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000938
939 ".........................................
940 " dav: NetWrite Method #6
941 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000942" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000943
944 " Construct execution string (four lines) which will be passed through filter
945 let netrw_fname= b:netrw_fname
946 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000947 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000948 if exists("g:netrw_port") && g:netrw_port != ""
949 put ='open '.g:netrw_machine.' '.g:netrw_port
950 else
951 put ='open '.g:netrw_machine
952 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000953 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000954
955 if g:netrw_cygwin == 1
956 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
957 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000958 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000959 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000960 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000961
962 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000963 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000964" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000965 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
966 bd!
967 let b:netrw_lastfile = choice
968
969 ".........................................
970 " rsync: NetWrite Method #7
971 elseif b:netrw_method == 7 " write with rsync
972 if g:netrw_cygwin == 1
973 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000974" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000975 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000976 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000977" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000978 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000979 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000980 let b:netrw_lastfile = choice
981
982 ".........................................
983 " scp: NetWrite Method #9
984 elseif b:netrw_method == 9 " write with sftp
985 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000986 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
987 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
988 else
989 let uid_machine = g:netrw_machine
990 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000991 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000992 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000993 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000994 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000995" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000996 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
997 bd!
998 let b:netrw_lastfile= choice
999
1000 ".........................................
1001 else " Complain
1002 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001003 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001004 endwhile
1005
1006 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001007" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001008 let result=delete(tmpfile)
1009 call s:NetOptionRestore()
1010
1011 if a:firstline == 1 && a:lastline == line("$")
1012 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001013 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001014
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001015" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001016endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001017
1018" ------------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001019" Browsing Support For Remote Directories And Files: {{{1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001020" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001021" of the contents of a remote directory. It is assumed that the
1022" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1023" with the requested remote hostname first.
Bram Moolenaar843ee412004-06-30 16:16:41 +00001024fun! <SID>NetBrowse(dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001025" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".g:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001026
1027 " sanity check
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001028 if exists("b:netrw_method") && b:netrw_method =~ '[23]'
1029 if !executable("ftp")
1030 if !exists("g:netrw_quiet")
1031 echoerr "***netrw*** this system doesn't support remote directory listing via ftp"
1032 endif
1033" call Dret("NetBrowse")
1034 return
1035 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001036 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001037 if !exists("g:netrw_quiet")
1038 echoerr "***netrw*** this system doesn't support remote directory listing via ssh"
1039 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001040" call Dret("NetBrowse")
1041 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001042 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001043
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001044 " make this buffer modifiable
1045 setlocal ma
1046
1047 " analyze a:dirname and g:netrw_list_cmd
1048 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001049" call Decho("dirpat<".dirpat.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001050 if a:dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001051 if !exists("g:netrw_quiet")
1052 echoerr "NetBrowse: I don't understand your dirname<".a:dirname.">"
1053 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001054" call Dret("NetBrowse : badly formatted dirname<".a:dirname.">")
1055 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001056 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001057
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001058 let method = substitute(a:dirname,dirpat,'\1','')
1059 let user = substitute(a:dirname,dirpat,'\2','')
1060 let machine = substitute(a:dirname,dirpat,'\3','')
1061 let path = substitute(a:dirname,dirpat,'\4','')
1062 let fname = substitute(a:dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001063" call Decho("set up method <".method .">")
1064" call Decho("set up user <".user .">")
1065" call Decho("set up machine<".machine.">")
1066" call Decho("set up path <".path .">")
1067" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001068
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001069 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001070 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001071 else
1072 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1073 endif
1074 if exists("b:netrw_method")
1075" call Decho("setting s:netrw_method<".b:netrw_method.">")
1076 let s:netrw_method= b:netrw_method
1077 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001078
Bram Moolenaar8299df92004-07-10 09:47:34 +00001079 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001080 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
1081 echoerr "***warning*** windows' ftp doesn't support time/size sorts (get cygwin, set g:netrw_cygwin)"
1082 else
1083 if g:netrw_sort_by =~ "^t"
1084 let listcmd= listcmd."t"
1085 elseif g:netrw_sort_by =~ "^s"
1086 let listcmd= listcmd."S"
1087 endif
1088 " optionally sort in reverse
1089 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1090 let listcmd= listcmd."r"
1091 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001092 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001093
1094" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001095 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001096" call Decho("attempt transfer of symlink as file")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001097 call s:NetBrowse(substitute(a:dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001098 redraw!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001099" call Dret("NetBrowse : symlink")
1100 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001101
1102 elseif fname !~ '/$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001103 " looks like a regular file, attempt transfer
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001104" call Decho("attempt transfer as regular file<".a:dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001105
1106 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001107 " "this is a directory" indicator (/). There shouldn't be one of those,
1108 " anyway.
1109 let path= substitute(path,'[*=@|]$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001110" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001111
1112 " remote-read the requested file into current buffer
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001113 enew!
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001114" call Decho("exe file .method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001115 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001116 exe "silent doau BufReadPre ".fname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001117 silent call s:NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001118 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001119 keepjumps 1d
1120 setlocal nomod
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001121
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001122" call Dret("NetBrowse : file<".fname.">")
1123 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001124 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001125
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001126 " ---------------------------------------------------------------------
1127 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001128" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001129 " set up new buffer and map
1130 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001131 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001132" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001133 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001134 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001135" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001136 exe "b ".bufnamenr
1137 if line("$") >= 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001138" call Dret("NetBrowse")
1139 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001140 endif
1141 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001142" call Decho("generate a new buffer")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001143 enew!
1144 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001145
1146 " rename file to reflect where its from
Bram Moolenaar8299df92004-07-10 09:47:34 +00001147 setlocal ts=32 bt=nofile bh=wipe nobl
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001148" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001149 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001150" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001151 setlocal bt=nowrite bh=hide nobl
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001152
1153 " set up buffer-local mappings
1154" call Decho("set up buffer-local mappings")
1155 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001156 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
1157 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001158 nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001159 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1160 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1161 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1162 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001163 nnoremap <buffer> <silent> o :exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001164 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1165 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>
1166 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>
1167 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001168 nnoremap <buffer> <silent> v :exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001169 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
1170 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 +00001171 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1172 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001173 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001174 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1175 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1176 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001177 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001178 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001179 setlocal ma
1180
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001181 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001182" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1183 keepjumps put ='\" ==========================================================================='
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001184 keepjumps put ='\" Netrw Remote Directory Listing'
1185 keepjumps put ='\" '.bufname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001186 let s:netrw_bannercnt= 7
1187 let sortby= g:netrw_sort_by
1188 if g:netrw_sort_direction =~ "^r"
1189 let sortby= sortby." reversed"
1190 endif
1191
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001192 if g:netrw_sort_by =~ "^n"
1193 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001194 let s:netrw_bannercnt= s:netrw_bannercnt + 1
1195 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001196 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1197 else
1198 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001199 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001200 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001201 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001202 if g:netrw_hide == 1
1203 keepjumps put ='\" Hiding: '.g:netrw_list_hide
1204 else
1205 keepjumps put ='\" Showing: '.g:netrw_list_hide
1206 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001207 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001208 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001209 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1210 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001211
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001212 " remote read the requested directory listing
1213 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1214 " Note that not all ftp servers honor the options for ls
1215 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001216 " use ftp to get remote file listing
1217" call Decho("use ftp to get remote file listing")
1218 call NetBrowseFtpCmd(path,listcmd)
1219
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001220 keepjumps 1d
1221
1222 if !g:netrw_longlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001223 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001224" call Decho("generate short listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001225 exe "keepjumps ".s:netrw_bannercnt
1226 " cleanup
1227 while getline(".") =~ g:netrw_ftp_browse_reject
1228 keepjumps d
1229 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001230
1231 " if there's no ../ listed, then put ./ and ../ in
1232 let line1= line(".")
1233 keepjumps 1
1234 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1235 let line2= line(".")
1236 if line2 == 0
1237 keepjumps put='../'
1238 keepjumps put='./'
1239 endif
1240 exe "keepjumps ".line1
1241 keepjumps norm! 0
1242
1243 " more cleanup
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001244 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1245 exe "keepjumps silent ".s:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#'
1246 exe "keepjumps silent ".s:netrw_bannercnt.',$g/ -> /s# -> .*$#/#'
1247 endif
1248
1249 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001250 " use ssh to get remote file listing
1251" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001252 let shq= &shq? &shq : ( &sxq? &sxq : "'")
1253" call Decho("exe silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq)
1254 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1255 keepjumps 1d
1256 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001257
1258 " manipulate the directory listing (hide, sort)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001259 setlocal ft=netrwlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001260 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001261 if g:netrw_hide && g:netrw_list_hide != ""
1262 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001263 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001264
Bram Moolenaar8299df92004-07-10 09:47:34 +00001265 if g:netrw_longlist
1266 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001267" call Decho("manipulate long listing")
1268
1269 if method == "ftp"
1270 " cleanup
1271 exe "keepjumps ".s:netrw_bannercnt
1272 while getline(".") =~ '^total\s\+\d\+$' || getline(".") =~ 'Trying\s\+\d\+.*$'
1273 keepjumps d
1274 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001275 " if there's no ../ listed, then put ./ and ../ in
1276 let line1= line(".")
1277 keepjumps 1
1278 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1279 let line2= line(".")
1280 if line2 == 0
1281 exe 'keepjumps '.s:netrw_bannercnt."put='./'"
1282 exe 'keepjumps '.s:netrw_bannercnt."put='../'"
1283 endif
1284 exe "keepjumps ".line1
1285 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001286 endif
1287
1288 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/ -> .*$//e'
1289 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1290 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001291 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001292
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001293 if g:netrw_sort_by =~ "^n"
1294 call s:SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001295 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
1296 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001297 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001298 if g:netrw_longlist
1299 " shorten the list to keep its width <= 80 characters
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001300 exe "keepjumps silent ".s:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001301 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001302 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001303 exe "keepjumps ".s:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001304 setlocal nomod
1305 setlocal noma
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001306
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001307" call Dret("NetBrowse")
1308 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001309endfun
1310
1311" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001312" NetBrowseChgDir: {{{2
1313fun! <SID>NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001314" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001315
1316 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001317 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001318
1319 if newdir !~ '/$'
1320 " handling a file
1321 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001322" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001323
1324 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001325 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001326" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001327 setlocal ma
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001328 %d
1329
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001330 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001331 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001332 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001333
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001334 if trailer =~ '^\%(\.\./\)*$'
1335 " tack on a ../"
1336 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001337
1338 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001339 " strip off a directory name from dirname
1340 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001341 exe "silent! keepjumps ".curline.",$d"
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001342 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001343" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001344
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001345 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001346 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001347 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001348" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001349 endif
1350
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001351" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001352 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001353endfun
1354
Bram Moolenaar843ee412004-06-30 16:16:41 +00001355" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001356" NetGetWord: it gets the directory named under the cursor
1357fun! <SID>NetGetWord()
1358" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001359 if line(".") < s:netrw_bannercnt
1360 let dirname= "./"
1361 else
1362 let dirname= getline(".")
1363 if dirname =~ '\t'
1364 let dirname= substitute(dirname,'\t.*$','','e')
1365 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001366 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001367" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001368 return dirname
1369endfun
1370
1371" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001372" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar843ee412004-06-30 16:16:41 +00001373fun! <SID>NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001374" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1375" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001376
1377 " preparation for removing multiple files/directories
1378 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001379 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001380
1381 " remove multiple files and directories
1382 while ctr <= a:lastline
1383 exe ctr
1384
1385 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001386 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001387" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001388
1389 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '/$')
1390 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001391 if !all
1392 echohl Statement
1393 call inputsave()
1394 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1395 call inputrestore()
1396 echohl NONE
1397 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1398 if ok =~ 'a\%[ll]'
1399 let all= 1
1400 endif
1401 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001402
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001403 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001404 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1405 silent! keepjumps .,$d
1406 call NetBrowseFtpCmd(a:path,"delete ".rmfile)
1407 else
1408 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1409" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1410 let ret= system(netrw_rm_cmd)
1411" call Decho("returned=".ret." errcode=".v:shell_error)
1412 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001413 elseif ok =~ 'q\%[uit]'
1414 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001415 endif
1416
1417 else
1418 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001419 if !all
1420 call inputsave()
1421 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1422 call inputrestore()
1423 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1424 if ok =~ 'a\%[ll]'
1425 let all= 1
1426 endif
1427 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001428
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001429 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001430 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1431 call NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
1432 else
1433 let rmfile = a:path.rmfile
1434 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1435" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1436 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001437" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001438
1439 if v:shell_error != 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001440 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'/$','','e')
1441" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1442 let ret= system(netrw_rmf_cmd)
1443" call Decho("returned=".ret." errcode=".v:shell_error)
1444
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001445 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001446 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
1447 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001448 endif
1449 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001450
1451 elseif ok =~ 'q\%[uit]'
1452 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001453 endif
1454 endif
1455
1456 let ctr= ctr + 1
1457 endwhile
1458
1459 " refresh the directory
1460 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001461" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001462 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1463 exe curline
1464
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001465" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001466endfun
1467
1468" ---------------------------------------------------------------------
1469" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00001470fun! <SID>NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001471" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001472
1473 " preparation for removing multiple files/directories
1474 let ctr = a:firstline
1475 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1476
1477 " attempt to rename files/directories
1478 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001479 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001480
1481 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001482 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001483" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001484
1485 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001486 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001487 call inputrestore()
1488
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001489 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1490 call NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
1491 else
1492 let oldname= a:path.oldname
1493 let newname= a:path.newname
1494" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1495 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1496 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001497
1498 let ctr= ctr + 1
1499 endwhile
1500
1501 " refresh the directory
1502 let curline= line(".")
1503 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001504 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001505" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001506endfun
1507
1508" ---------------------------------------------------------------------
1509" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001510" files given their extension. Passes 0=local, 1=remote
1511fun! <SID>NetBrowseX(fname,remote)
1512" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001513
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001514 " set up the filename
1515 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001516 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001517 if has("win32") || has("win95") || has("win64") || has("win16")
1518 let exten= substitute(exten,'^.*$','\L&\E','')
1519 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001520 let fname= escape(a:fname,"%#")
1521" call Decho("fname<".fname."> after escape()")
1522
1523 if a:remote == 1
1524 " create a local copy
1525 let fname= tempname().".".exten
1526" call Decho("create a local copy of <".a:fname."> as <".fname.">")
1527 exe "keepjumps silent bot 1new ".a:fname
1528 let eikeep= &ei
1529 set ei=all bh=delete
1530 exe "w! ".fname
1531 let &ei= eikeep
1532 q
1533 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001534" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001535
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001536 " set up redirection
1537 if &srr =~ "%s"
1538 let redir= substitute(&srr,"%s","/dev/null"."")
1539 else
1540 let redir= &srr . "/dev/null"
1541 endif
1542" call Decho("redir:".redir.":")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001543
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001544 " execute the file handler
1545 if has("win32") || has("win64")
1546" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1547 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1548 let ret= v:shell_error
1549
1550 elseif has("unix") && executable("kfmclient")
1551" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1552 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1553 let ret= v:shell_error
1554
1555 elseif has("unix") && executable("gnome-open")
1556" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1557 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1558 let ret= v:shell_error
1559
1560 elseif exten != "" && exists("*NetrwFileHandler_".exten)
1561" call Decho("let ret= NetrwFileHandler_".exten.'("'.fname.'")')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001562 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001563 endif
1564 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001565
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001566 " cleanup: remove temporary file,
1567 " delete current buffer if success with handler,
1568 " return to prior buffer (directory listing)
1569 if a:remote == 1 && fname != a:fname
1570" call Decho("deleting temporary file<".fname.">")
1571 call delete(fname)
1572 endif
1573
1574 if a:remote == 1
1575 let eikeep= &ei
1576 set ei=all bh=delete bt=nofile
1577 exe "norm! \<c-o>"
1578 let &ei= eikeep
1579 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001580 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001581
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001582" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001583endfun
1584
1585" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001586" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1587" This function assumes that a long listing will be received. Size, time,
1588" and reverse sorts will be requested of the server but not otherwise
1589" enforced here.
1590fun! NetBrowseFtpCmd(path,cmd)
1591" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".s:netrw_method)
1592
1593 " because WinXX ftp uses unix style input
1594 " curline is one more than the bannercnt in order to account
1595 " for the unwanted first blank line (doing a :put to an empty
1596 " buffer yields a blank first line)
1597 let ffkeep= &ff
1598 setlocal ma
1599 setlocal ff=unix
1600 let curline= s:netrw_bannercnt+1
1601 exe "silent! keepjumps ".curline.",$d"
1602
1603 ".........................................
1604 if s:netrw_method == 2
1605 " ftp + <.netrc>: Method #2
1606 if a:path != ""
1607 put ='cd '.a:path
1608 endif
1609 exe "put ='".a:cmd."'"
1610
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001611
1612" redraw!|call inputsave()|call input("Pausing...")|call inputrestore() "Decho
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001613 if exists("g:netrw_port") && g:netrw_port != ""
1614" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1615 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1616 else
1617" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1618 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1619 endif
1620
1621 ".........................................
1622 elseif s:netrw_method == 3
1623 " ftp + machine,id,passwd,filename: Method #3
1624 setlocal ff=unix
1625 if exists("g:netrw_port") && g:netrw_port != ""
1626 put ='open '.g:netrw_machine.' '.g:netrw_port
1627 else
1628 put ='open '.g:netrw_machine
1629 endif
1630
1631 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1632 put =g:netrw_uid
1633 put =g:netrw_passwd
1634 else
1635 put ='user '.g:netrw_uid.' '.g:netrw_passwd
1636 endif
1637
1638 if a:path != ""
1639 put ='cd '.a:path
1640 endif
1641 exe "put ='".a:cmd."'"
1642
1643 " perform ftp:
1644 " -i : turns off interactive prompting from ftp
1645 " -n unix : DON'T use <.netrc>, even though it exists
1646 " -n win32: quit being obnoxious about password
1647" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1648 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1649
1650 ".........................................
1651 else
1652 echo "***warning*** unable to comply with your request<" . choice . ">"
1653 endif
1654
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001655 " cleanup for Windows
1656 if has("win32") || has("win95") || has("win64") || has("win16")
1657 keepjumps silent! %s/\r$//
1658 endif
1659 if a:cmd == "dir"
1660 " infer directory/link based on the file permission string
1661 keepjumps silent g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1662 keepjumps silent g/l\%([-r][-w][-x]\)\{3}/s/$/@/
1663 if !g:netrw_longlist
1664 exe "keepjumps silent ".curline.',$s/^\%(\S\+\s\+\)\{8}//'
1665 endif
1666 endif
1667
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001668 " restore settings
1669 let &ff= ffkeep
1670" call Dret("NetBrowseFtpCmd")
1671endfun
1672
1673" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001674" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1675" separated patterns given in g:netrw_list_hide
1676fun! <SID>NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001677" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001678
1679 let listhide= g:netrw_list_hide
1680 while listhide != ""
1681 if listhide =~ ','
1682 let hide = substitute(listhide,',.*$','','e')
1683 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1684 else
1685 let hide = listhide
1686 let listhide= ""
1687 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001688
1689 " Prune the list by hiding any files which match
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001690" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001691 if g:netrw_hide == 1
1692 exe 'keepjumps silent '.s:netrw_bannercnt.',$g~'.hide.'~d'
1693 elseif g:netrw_hide == 2
1694 exe 'keepjumps silent '.s:netrw_bannercnt.',$v~'.hide.'~d'
1695 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001696 endwhile
1697
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001698" call Dret("NetrwListHide")
1699endfun
1700
1701" ---------------------------------------------------------------------
1702" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar8299df92004-07-10 09:47:34 +00001703fun! <SID>NetHideEdit(mode)
1704" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001705
1706 call inputsave()
1707 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1708 call inputrestore()
1709
1710 " refresh the listing
1711 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001712 if a:mode == 0
1713 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1714 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001715 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001716 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001717
1718" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001719endfun
1720
Bram Moolenaar8299df92004-07-10 09:47:34 +00001721" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001722" NetSortSequence: allows user to edit the sorting sequence
1723fun! <SID>NetSortSequence(mode)
1724" call Dfunc("NetSortSequence(mode=".a:mode.")")
1725
1726 call inputsave()
1727 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
1728 call inputrestore()
1729
1730 " refresh the listing
1731 let g:netrw_sort_sequence= newsortseq
1732 if a:mode == 0
1733 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1734 else
1735 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
1736 endif
1737
1738" call Dret("NetSortSequence")
1739endfun
1740
1741" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001742" NetLongList: {{{2
1743fun! <SID>NetLongList(mode)
1744" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".g:netrw_longlist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001745 call s:NetSavePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001746
1747 if g:netrw_longlist != 0
1748 " turn long listing off
1749 let g:netrw_longlist = 0
1750 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1751
1752 else
1753 " turn long listing on
1754 let g:netrw_longlist = 1
1755 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
1756 endif
1757
1758 " refresh the listing
1759 if a:mode == 0
1760 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1761 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001762 silent call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001763 endif
1764
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001765 call s:NetRestorePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001766" call Dret("NetLongList : g:netrw_longlist=".g:netrw_longlist)
1767endfun
1768
1769" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001770" NetSaveWordPosn: used by the "s" command in both remote and local
1771" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
1772" the same word even though the sorting has changed its order of appearance.
1773fun! s:NetSaveWordPosn()
1774" call Dfunc("NetSaveWordPosn()")
1775 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
1776" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
1777endfun
1778
1779" ---------------------------------------------------------------------
1780" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above
1781fun! s:NetRestoreWordPosn()
1782" call Dfunc("NetRestoreWordPosn()")
1783 silent! call search(s:netrw_saveword,'w')
1784" call Dret("NetRestoreWordPosn")
1785endfun
1786
1787" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001788" NetMakeDir: this function makes a directory (both local and remote)
1789fun! <SID>NetMakeDir(usrhost)
1790" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
1791
1792 " get name of new directory from user. A bare <CR> will skip.
1793 " if its currently a directory, also request will be skipped, but with
1794 " a message.
1795 call inputsave()
1796 let newdirname= input("Please give directory name: ")
1797 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001798" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001799
1800 if newdirname == ""
1801" call Dret("NetMakeDir : user aborted with bare <cr>")
1802 return
1803 endif
1804
1805 if a:usrhost == ""
1806
1807 " Local mkdir:
1808 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001809 let fullnewdir= b:netrw_curdir.'/'.newdirname
1810" call Decho("fullnewdir<".fullnewdir.">")
1811 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001812 if !exists("g:netrw_quiet")
1813 echoerr "***warning*** <".newdirname."> is already a directory!"
1814 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001815" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
1816 return
1817 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001818 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001819 if !exists("g:netrw_quiet")
1820 echoerr "***warning*** <".newdirname."> is already a file!"
1821 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001822" call Dret("NetMakeDir : file<".newdirname."> exists previously")
1823 return
1824 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001825 let netrw_origdir= s:NetGetcwd(1)
1826 exe 'cd '.b:netrw_curdir
1827" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
1828" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
1829 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
1830 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
1831
Bram Moolenaar8299df92004-07-10 09:47:34 +00001832 if v:shell_error == 0
1833 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001834" call Decho("refresh listing")
1835 let linenum= line(".")
1836 norm! H0
1837 let hline = line(".")
1838 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
1839 exe "norm! ".hline."G0z\<CR>"
1840 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001841 elseif !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001842 echoerr "***warning*** unable to make directory<".newdirname.">"
1843 endif
1844 redraw!
1845
1846 else
1847 " Remote mkdir:
1848 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001849 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00001850" call Decho("exe silent! !".mkdircmd." ".newdirname)
1851 exe "silent! !".mkdircmd." ".newdirname
1852 if v:shell_error == 0
1853 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001854 let linenum= line(".")
1855 norm! H0
1856 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001857 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001858 exe "norm! ".hline."G0z\<CR>"
1859 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001860 elseif !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001861 echoerr "***warning*** unable to make directory<".newdirname.">"
1862 endif
1863 redraw!
1864 endif
1865
1866" call Dret("NetMakeDir")
1867endfun
1868
1869" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001870" NetBookmarkDir:
1871" 0: bookmark the current directory
1872" 1: change to the bookmarked directory
1873fun! <SID>NetBookmarkDir(chg,curdir)
1874" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
1875
1876 if a:chg == 0
1877 " bookmark the current directory
1878 let s:netrw_bookmarkdir_{v:count}= a:curdir
1879 if !exists("s:bookmarkmax")
1880 let s:bookmarkmax= v:count
1881 elseif v:count > s:bookmarkmax
1882 let s:bookmarkmax= v:count
1883 endif
1884
1885 elseif a:chg == 1
1886 " change to the bookmarked directory
1887 if exists("s:netrw_bookmarkdir_{v:count}")
1888 exe "e ".s:netrw_bookmarkdir_{v:count}
1889 else
1890 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
1891 endif
1892
1893 elseif exists("s:bookmarkmax")
1894 " list bookmarks
1895" call Decho("list bookmarks [0,".s:bookmarkmax."]")
1896 let cnt= 0
1897 while cnt <= s:bookmarkmax
1898 if exists("s:netrw_bookmarkdir_{cnt}")
1899 echo "Netrw Bookmark#".cnt.": ".s:netrw_bookmarkdir_{cnt}
1900" call Decho("Netrw Bookmark#".cnt.": ".s:netrw_bookmarkdir_{cnt})
1901 endif
1902 let cnt= cnt + 1
1903 endwhile
1904 endif
1905" call Dret("NetBookmarkDir")
1906endfun
1907
1908
1909" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001910" Browsing Support For Local Directories And Files: {{{1
1911
1912" ---------------------------------------------------------------------
1913" LocalBrowse: supports local file/directory browsing {{{2
1914fun! <SID>LocalBrowse(dirname)
1915
1916" let dirname= (a:dirname == "")? expand("%:p") : a:dirname
1917 if !isdirectory(a:dirname)
1918 " not a directory, ignore it
1919 return
1920 endif
1921
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001922 " unfortunate interaction -- when putting debugging calls
1923 " above one can no longer enter the DBG buffer.
1924" call Dfunc("LocalBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr())
1925" call Decho("winbufnr1=".winbufnr(1)." winbufnr2=".winbufnr(2)." winbufnr3=".winbufnr(3))
1926" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001927
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001928 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001929 if !exists("g:netrw_quiet")
1930 echoerr "vim version<".v:version."> too old for browsing with netrw"
1931 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001932" call Dret("LocalBrowse : vim version<".v:version."> too old")
1933 return
1934 endif
1935
1936 " record and change current directory
1937 let netrw_origdir= s:NetGetcwd(1)
1938 exe 'cd '.escape(substitute(a:dirname,'\\','/','ge'),s:netrw_cd_escape)
1939 let dirname= s:NetGetcwd(0)
1940" call Decho("dirname<".dirname."> buf#".bufnr("%")." winnr=".winnr())
Bram Moolenaar8299df92004-07-10 09:47:34 +00001941
1942 " make this buffer modifiable
1943 setlocal ma
1944
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001945 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001946 " Perform Directory Listing:
1947" call Decho("Perform directory listing...")
1948 " set up new buffer and map
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001949 " remove the trailing "/"
1950 let dirnamens= substitute(dirname,'/$','','e')
1951 let dirnamenr= bufnr(dirnamens.'$')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001952" call Decho("dirnamenr= bufnr(".dirnamens.")=".dirnamenr." bufname(".dirnamenr.")=".bufname(dirnamenr))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001953
1954 if dirnamenr != 0 && bufname(dirnamenr) != dirnamens
1955 " try keeping the trailing slash
1956 let dirnamenr = bufnr(dirname.'$')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001957" call Decho("dirnamenr= bufnr(".dirname.")=".dirnamenr." bufname(".dirnamenr.")=".bufname(dirnamenr)." (retry with /)")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001958 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001959
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001960 if dirnamenr != -1
Bram Moolenaar8299df92004-07-10 09:47:34 +00001961 " buffer already exists (hidden), so switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001962" call Decho("buffer already exists: dirnamenr=".dirnamenr." dirname<".dirname."> pre-exists")
1963" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001964 exe "b ".dirnamenr
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001965 exe 'silent! cd '.escape(substitute(a:dirname,'\\','/','ge'),s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001966" call Decho("changed directory to<".dirname.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001967 if a:dirname != "." && line("$") >= 5 && exists("b:netrw_curdir")
1968 if b:netrw_curdir == dirname
1969" call Dret("LocalBrowse : buffer already exists with info, #".dirnamenr)
1970 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
1971 return
1972 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001973 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001974" call Decho("buffer already exists, but needs re-listing (buf#".dirnamenr.")")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001975 setlocal ma
Bram Moolenaar8299df92004-07-10 09:47:34 +00001976 keepjumps %d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001977 if expand("%:p") != dirname
1978 exe 'silent! file '.escape(dirname,s:netrw_cd_escape)
1979" call Decho("renamed file to<".escape(dirname,' #').">")
Bram Moolenaar269ec652004-07-29 08:43:53 +00001980 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001981 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001982" call Decho("generate new buffer named<".escape(dirname,' #').">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001983 silent! enew!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001984 exe 'silent! file '.substitute(escape(dirname,s:netrw_cd_escape),'/$','','e')
1985" call Decho("renamed file to<".escape(dirname,s:netrw_cd_escape).">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001986 endif
1987 " set standard browser options on buffer
1988 setlocal ts=32 bt=nowrite bh=hide nobl
1989
1990 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00001991" call Decho("Setting up local browser maps")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001992 let b:netrw_curdir= s:NetGetcwd(1)
1993 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
1994 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
1995 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001996 nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001997 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
1998 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
1999 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2000 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2001 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002002 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002003 nnoremap <buffer> <silent> o :exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2004 nnoremap <buffer> <silent> p :exe "norm! 0"<bar>call <SID>LocalPreview(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),1))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002005 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
2006 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>
2007 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>
2008 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002009 nnoremap <buffer> <silent> v :exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002010 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)<cr>
2011 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2012 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2013 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2014 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2015 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2016 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
2017 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002018 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002019 nnoremap <buffer> ? :he netrw-dir<cr>
2020
2021 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002022" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002023 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002024 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002025 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002026 keepjumps put ='\" '.dirname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002027 let s:netrw_bannercnt= 7
2028
2029 let sortby= g:netrw_sort_by
2030 if g:netrw_sort_direction =~ "^r"
2031 let sortby= sortby." reversed"
2032 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002033
Bram Moolenaar8299df92004-07-10 09:47:34 +00002034 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002035" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002036 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002037 let s:netrw_bannercnt= s:netrw_bannercnt + 1
2038 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002039 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
2040 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002041" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002042 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002043 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002044 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002045 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002046 if g:netrw_hide == 1
2047 keepjumps put ='\" Hiding: '.g:netrw_list_hide
2048 else
2049 keepjumps put ='\" Showing: '.g:netrw_list_hide
2050 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002051 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002052 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002053 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2054 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002055
2056 " generate the requested directory listing
2057 call LocalBrowseList(dirname)
2058
2059 " manipulate the directory listing (hide, sort)
2060 setlocal ft=netrwlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002061 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002062 if g:netrw_hide && g:netrw_list_hide != ""
2063 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002064 endif
2065 if g:netrw_sort_by =~ "^n"
2066 call s:SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002067 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
2068 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002069 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002070 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
2071 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002072 endif
2073 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002074 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00002075
2076 setlocal noma nomod
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002077 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002078
Bram Moolenaar269ec652004-07-29 08:43:53 +00002079" call Dret("LocalBrowse : file<".expand("%:p").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002080endfun
2081
2082" ---------------------------------------------------------------------
2083" LocalBrowseList: does the job of "ls" for local directories {{{2
2084fun! LocalBrowseList(dirname)
2085" call Dfunc("LocalBrowseList(dirname<".a:dirname.">)")
2086
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002087 " get the list of files contained in the current directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002088 let dirname = escape(a:dirname,s:netrw_glob_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002089 let dirnamelen = strlen(a:dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002090 let filelist = glob(dirname."*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002091" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002092 if filelist != ""
2093 let filelist= filelist."\n"
2094 endif
2095 let filelist= filelist.glob(dirname.".*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002096" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2097
2098 " if the directory name includes a "$", and possibly other characters,
2099 " the glob() doesn't include "." and ".." entries.
2100 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2101" call Decho("forcibly tacking on .")
2102 if filelist == ""
2103 let filelist= dirname."."
2104 else
2105 let filelist= filelist."\n".a:dirname."."
2106 endif
2107" call Decho("filelist<".filelist.">")
2108 endif
2109 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2110" call Decho("forcibly tacking on ..")
2111 let filelist= filelist."\n".a:dirname.".."
2112" call Decho("filelist<".filelist.">")
2113 endif
2114 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
2115
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002116" call Decho("dirname<".dirname.">")
2117" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002118" call Decho("filelist<".filelist.">")
2119
2120 while filelist != ""
2121 if filelist =~ '\n'
2122 let file = substitute(filelist,'\n.*$','','e')
2123 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2124 else
2125 let file = filelist
2126 let filelist= ""
2127 endif
2128 let pfile= file
2129 if isdirectory(file)
2130 let pfile= file."/"
2131 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002132 if pfile =~ '//$'
2133 let pfile= substitute(pfile,'//$','/','e')
2134 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002135 let pfile= strpart(pfile,dirnamelen)
2136 if g:netrw_longlist
Bram Moolenaar269ec652004-07-29 08:43:53 +00002137 let sz = getfsize(file)
2138 let fsz = strpart(" ",1,15-strlen(sz)).sz
2139 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(file))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002140 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002141
Bram Moolenaar8299df92004-07-10 09:47:34 +00002142 if g:netrw_sort_by =~ "^t"
2143 " sort by time (handles time up to 1 quintillion seconds, US)
2144" call Decho("getftime(".file.")=".getftime(file))
2145 let t = getftime(file)
2146 let ft = strpart("000000000000000000",1,18-strlen(t)).t
2147" call Decho("exe keepjumps put ='".ft.'/'.file."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002148 let ftpfile= ft.'/'.pfile
2149 keepjumps put=ftpfile
2150
Bram Moolenaar8299df92004-07-10 09:47:34 +00002151 elseif g:netrw_sort_by =~ "^s"
2152 " sort by size (handles file sizes up to 1 quintillion bytes, US)
2153" call Decho("getfsize(".file.")=".getfsize(file))
2154 let sz = getfsize(file)
2155 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
2156" call Decho("exe keepjumps put ='".fsz.'/'.file."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002157 let fszpfile= fsz.'/'.pfile
2158 keepjumps put =fszpfile
2159
Bram Moolenaar8299df92004-07-10 09:47:34 +00002160 else
2161 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002162" call Decho("exe keepjumps put ='".pfile."'")
2163 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002164 endif
2165 endwhile
2166
2167" call Dret("LocalBrowseList")
2168endfun
2169
2170" ---------------------------------------------------------------------
2171" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2172" directory and a new directory name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002173fun! <SID>LocalBrowseChgDir(dirname,newdir,...)
2174" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002175
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002176 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002177 let newdir = a:newdir
2178
2179 if dirname !~ '/$'
2180 " apparently vim is "recognizing" that it is in the home directory and
2181 " is removing the "/". Bad idea, so I have to put it back.
2182 let dirname= dirname.'/'
2183" call Decho("adjusting dirname<".dirname.">")
2184 endif
2185
2186 if newdir !~ '/$'
2187 " handling a file
2188 let dirname= dirname.newdir
2189" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002190 " this lets NetBrowseX avoid the edit
2191 if a:0 < 1
2192 exe "e ".escape(dirname,s:netrw_cd_escape)
2193 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002194
2195 elseif newdir == './'
2196 " refresh the directory list
2197" call Decho("refresh directory listing")
2198 setlocal ma
2199 %d
2200
2201 elseif newdir == '../'
2202 " go up one directory
2203 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+/$\)','\1','e')
2204" call Decho("go up one dir: dirname<".dirname.">")
2205
2206 else
2207 " go down one directory
2208 let dirname= dirname.newdir
2209" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2210 endif
2211
2212" call Dret("LocalBrowseChgDir <".dirname.">")
2213 return dirname
2214endfun
2215
2216" ---------------------------------------------------------------------
2217" LocalBrowseRm:
2218fun! <SID>LocalBrowseRm(path) range
2219" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2220" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2221
2222 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002223 let ctr = a:firstline
2224 let ret = 0
2225 let netrw_origdir = s:NetGetcwd(1)
2226 exe 'cd '.b:netrw_curdir
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002227 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002228
2229 " remove multiple files and directories
2230 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002231 exe "keepjumps ".ctr
2232
2233 " sanity checks
2234 if line(".") < s:netrw_bannercnt
2235 let ctr= ctr + 1
2236 continue
2237 endif
2238 let curword= s:NetGetWord()
2239 if curword == "./" || curword == "../"
2240 let ctr= ctr + 1
2241 continue
2242 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002243
2244 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002245 let rmfile= a:path.curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002246" call Decho("rmfile<".rmfile.">")
2247
2248 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '/$')
2249 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002250 if !all
2251 echohl Statement
2252 call inputsave()
2253 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2254 call inputrestore()
2255 echohl NONE
2256 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2257 if ok =~ 'a\%[ll]'
2258 let all= 1
2259 endif
2260 endif
2261
2262 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002263 let ret= delete(rmfile)
2264" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002265 elseif ok =~ 'q\%[uit]'
2266 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002267 endif
2268
2269 else
2270 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002271 if !all
2272 echohl Statement
2273 call inputsave()
2274 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2275 call inputrestore()
2276 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2277 if ok =~ 'a\%[ll]'
2278 let all= 1
2279 endif
2280 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002281 let rmfile= substitute(rmfile,'/$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002282
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002283 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002284" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2285 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002286" call Decho("v:shell_error=".v:shell_error)
2287
2288 if v:shell_error != 0
2289" call Decho("2nd attempt to remove directory<".rmfile.">")
2290 let errcode= delete(rmfile)
2291" call Decho("errcode=".errcode)
2292
2293 if errcode != 0
2294 if has("unix")
2295" call Decho("3rd attempt to remove directory<".rmfile.">")
2296 call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002297 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002298 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
2299 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002300 elseif !exist("g:netrw_quiet")s
Bram Moolenaar8299df92004-07-10 09:47:34 +00002301 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
2302 endif
2303 endif
2304 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002305
2306 elseif ok =~ 'q\%[uit]'
2307 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002308 endif
2309 endif
2310
2311 let ctr= ctr + 1
2312 endwhile
2313
2314 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002315 let curline= line(".")
2316 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002317" call Decho("refresh the directory")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002318 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002319 exe curline
2320
2321" call Dret("LocalBrowseRm")
2322endfun
2323
2324" ---------------------------------------------------------------------
2325" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00002326fun! <SID>LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002327" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2328
2329 " preparation for removing multiple files/directories
2330 let ctr= a:firstline
2331
2332 " attempt to rename files/directories
2333 while ctr <= a:lastline
2334 exe "keepjumps ".ctr
2335
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002336 " sanity checks
2337 if line(".") < s:netrw_bannercnt
2338 let ctr= ctr + 1
2339 continue
2340 endif
2341 let curword= s:NetGetWord()
2342 if curword == "./" || curword == "../"
2343 let ctr= ctr + 1
2344 continue
2345 endif
2346
Bram Moolenaar8299df92004-07-10 09:47:34 +00002347 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002348 let oldname= a:path.curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002349" call Decho("oldname<".oldname.">")
2350
2351 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002352 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002353 call inputrestore()
2354
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002355 let ret= system(g:netrw_local_rename.' "'.oldname.'" "'.newname.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002356" call Decho("executing system(".g:netrw_local_rename." ".oldname." ".newname)
2357
2358 let ctr= ctr + 1
2359 endwhile
2360
2361 " refresh the directory
2362 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002363" call Decho("refresh the directory listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002364 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002365 exe "keepjumps ".curline
2366" call Dret("LocalBrowseRename")
2367endfun
2368
2369" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002370" LocalPreview: {{{2
2371fun! <SID>LocalPreview(path) range
2372" call Dfunc("LocalPreview(path<".a:path.">)")
2373 if has("quickfix")
2374 if !isdirectory(a:path)
2375 exe "pedit ".a:path
2376 elseif !exist("g:netrw_quiet")s
2377 echoerr "sorry, cannot preview a directory such as <".a:path.">"
2378 endif
2379 elseif !exist("g:netrw_quiet")s
2380 echoerr "sorry, to preview your vim needs the quickfix feature compiled in"
2381 endif
2382" call Dret("LocalPreview")
2383endfun
2384
2385" ---------------------------------------------------------------------
2386" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002387" Change backslashes to forward slashes, if any.
2388" If doesc is true, escape certain troublesome characters
2389fun! <SID>NetGetcwd(doesc)
2390" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
2391 let curdir= substitute(getcwd(),'\\','/','ge')
2392 if curdir !~ '/$'
2393 let curdir= curdir.'/'
2394 endif
2395 if a:doesc
2396 let curdir= escape(curdir,s:netrw_cd_escape)
2397 endif
2398" call Dret("NetGetcwd <".curdir.">")
2399 return curdir
2400endfun
2401
2402" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00002403" NetMethod: determine method of transfer {{{1
2404" method == 1: rcp
2405" 2: ftp + <.netrc>
2406" 3: ftp + machine, id, password, and [path]filename
2407" 4: scp
2408" 5: http (wget)
2409" 6: cadaver
2410" 7: rsync
2411" 8: fetch
2412" 9: sftp
2413fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002414" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002415
2416 " initialization
2417 let b:netrw_method = 0
2418 let g:netrw_machine = ""
2419 let b:netrw_fname = ""
2420 let g:netrw_port = ""
2421
2422 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002423 " mipf : a:machine a:id password filename Use ftp
2424 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002425 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002426 " rcpurm : rcp://[user@]host/filename Use rcp
2427 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002428 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002429 " httpurm : http://[user@]host/filename Use wget
2430 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002431 " rsyncurm : rsync://host[:port]/path Use rsync
2432 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2433 " sftpurm : sftp://[user@]host/filename Use scp
2434 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2435 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
2436 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2437 let rcpurm = '^rcp://\(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
2438 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
2439 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2440 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002441 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002442 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
2443 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2444 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
2445
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002446" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002447 " Determine Method
2448 " rcp://user@hostname/...path-to-file
2449 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002450" call Decho("rcp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002451 let b:netrw_method = 1
2452 let userid = substitute(a:choice,rcpurm,'\2',"")
2453 let g:netrw_machine= substitute(a:choice,rcpurm,'\3',"")
2454 let b:netrw_fname = substitute(a:choice,rcpurm,'\4',"")
2455 if userid != ""
2456 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002457 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002458
2459 " scp://user@hostname/...path-to-file
2460 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002461" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002462 let b:netrw_method = 4
2463 let g:netrw_machine= substitute(a:choice,scpurm,'\1',"")
2464 let b:netrw_port = substitute(a:choice,scpurm,'\2',"")
2465 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
2466
2467 " http://user@hostname/...path-to-file
2468 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002469" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002470 let b:netrw_method = 5
2471 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2472 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
2473
2474 " dav://hostname[:port]/..path-to-file..
2475 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002476" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002477 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002478 if a:choice =~ '^s'
2479 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2480 else
2481 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2482 endif
2483 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002484
2485 " rsync://user@hostname/...path-to-file
2486 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002487" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002488 let b:netrw_method = 7
2489 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2490 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
2491
2492 " ftp://[user@]hostname[[:#]port]/...path-to-file
2493 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002494" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002495 let userid = substitute(a:choice,ftpurm,'\2',"")
2496 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2497 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2498 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
2499 if g:netrw_port != ""
2500 let g:netrw_port = substitute(g:netrw_port,"[#:]","","")
2501 endif
2502 if userid != ""
2503 let g:netrw_uid= userid
2504 endif
2505 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2506 let b:netrw_method = 3
2507 else
2508 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
2509 let b:netrw_method= 2
2510 else
2511 if !exists("g:netrw_uid") || g:netrw_uid == ""
2512 call NetUserPass()
2513 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
2514 call NetUserPass(g:netrw_uid)
2515 " else just use current g:netrw_uid and g:netrw_passwd
2516 endif
2517 let b:netrw_method= 3
2518 endif
2519 endif
2520
2521 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002522" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002523 let b:netrw_method = 8
2524 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
2525 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
2526 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
2527 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
2528
2529 " Issue an ftp : "machine id password [path/]filename"
2530 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002531" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002532 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002533 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
2534 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
2535 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
2536 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
2537
2538 " Issue an ftp: "hostname [path/]filename"
2539 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002540" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002541 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2542 let b:netrw_method = 3
2543 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2544 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2545
2546 elseif filereadable(expand("$HOME/.netrc"))
2547 let b:netrw_method = 2
2548 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2549 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2550 endif
2551
2552 " sftp://user@hostname/...path-to-file
2553 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002554" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002555 let b:netrw_method = 9
2556 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
2557 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
2558
2559 " Issue an rcp: hostname:filename" (this one should be last)
2560 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002561" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002562 let b:netrw_method = 1
2563 let userid = substitute(a:choice,rcphf,'\2',"")
2564 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
2565 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002566" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
2567" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
2568" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
2569" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002570 if userid != ""
2571 let g:netrw_uid= userid
2572 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002573 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002574 " don't let PCs try <.netrc>
2575 let b:netrw_method = 3
2576 endif
2577
2578 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002579 if !exists("g:netrw_quiet")
2580 echoerr "***error*** cannot determine method"
2581 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002582 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002583 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002584
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002585" call Decho("a:choice <".a:choice.">")
2586" call Decho("b:netrw_method <".b:netrw_method.">")
2587" call Decho("g:netrw_machine<".g:netrw_machine.">")
2588" call Decho("g:netrw_port <".g:netrw_port.">")
2589" if exists("g:netrw_uid") "Decho
2590" call Decho("g:netrw_uid <".g:netrw_uid.">")
2591" endif "Decho
2592" if exists("g:netrw_passwd") "Decho
2593" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
2594" endif "Decho
2595" call Decho("b:netrw_fname <".b:netrw_fname.">")
2596" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002597endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002598
2599" ------------------------------------------------------------------------
2600" NetUserPass: set username and password for subsequent ftp transfer {{{1
2601" Usage: :call NetUserPass() -- will prompt for userid and password
2602" :call NetUserPass("uid") -- will prompt for password
2603" :call NetUserPass("uid","password") -- sets global userid and password
2604fun! NetUserPass(...)
2605
2606 " get/set userid
2607 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002608" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002609 if !exists("g:netrw_uid") || g:netrw_uid == ""
2610 " via prompt
2611 let g:netrw_uid= input('Enter username: ')
2612 endif
2613 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002614" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002615 let g:netrw_uid= a:1
2616 endif
2617
2618 " get password
2619 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002620" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002621 let g:netrw_passwd= inputsecret("Enter Password: ")
2622 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002623" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002624 let g:netrw_passwd=a:2
2625 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002626" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002627endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002628
2629" ------------------------------------------------------------------------
2630" NetOptionSave: save options and set to "standard" form {{{1
2631fun!s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002632" call Dfunc("NetOptionSave()")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002633
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002634 " Get Temporary Filename
2635 let s:aikeep = &ai
2636 let s:cinkeep = &cin
2637 let s:cinokeep = &cino
2638 let s:comkeep = &com
2639 let s:cpokeep = &cpo
2640 let s:dirkeep = getcwd()
2641 let s:gdkeep = &gd
2642 let s:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00002643 setlocal cino =
2644 setlocal com =
2645 setlocal cpo -=aA
2646 setlocal nocin noai
2647 setlocal tw =0
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002648 if has("win32") && !has("win95")
2649 let s:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00002650 setlocal noswf
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002651" call Decho("setting s:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002652 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002653
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002654" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002655endfun
2656
2657" ------------------------------------------------------------------------
2658" NetOptionRestore: restore options {{{1
2659fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002660" call Dfunc("NetOptionRestore()")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002661
2662 let &ai = s:aikeep
2663 let &cin = s:cinkeep
2664 let &cino = s:cinokeep
2665 let &com = s:comkeep
2666 let &cpo = s:cpokeep
2667 exe "lcd ".s:dirkeep
2668 let &gd = s:gdkeep
2669 let &tw = s:twkeep
2670 if exists("s:swfkeep")
2671 let &swf= s:swfkeep
2672 unlet s:swfkeep
2673 endif
2674 unlet s:aikeep
2675 unlet s:cinkeep
2676 unlet s:cinokeep
2677 unlet s:comkeep
2678 unlet s:cpokeep
2679 unlet s:gdkeep
2680 unlet s:twkeep
2681 unlet s:dirkeep
2682
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002683" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002684endfun
2685
2686" ------------------------------------------------------------------------
2687" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002688" to handle extra junk that their system's ftp dumps
2689" into the transfer. This function is provided as an
2690" example and as a fix for a Windows 95 problem: in my
2691" experience, win95's ftp always dumped four blank lines
2692" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002693if has("win95") && g:netrw_win95ftp
2694 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002695" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002696 if method == 3 " ftp (no <.netrc>)
2697 let fourblanklines= line2 - 3
2698 silent fourblanklines.",".line2."g/^\s*/d"
2699 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002700" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002701 endfun
2702endif
2703
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002704" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002705" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002706fun! <SID>NetSort() range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002707" call Dfunc("NetSort()")
2708
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002709 let i = a:firstline + 1
2710 while i <= a:lastline
2711 " find insertion point via binary search
2712 let i_val = getline(i)
2713 let lo = a:firstline
2714 let hi = i
2715 while lo < hi
2716 let mid = (lo + hi) / 2
2717 let mid_val = getline(mid)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002718 if g:netrw_sort_direction =~ '^n'
2719 " normal sorting order
2720 if i_val < mid_val
2721 let hi = mid
2722 else
2723 let lo = mid + 1
2724 if i_val == mid_val | break | endif
2725 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002726 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002727 " reverse sorting order
2728 if i_val > mid_val
2729 let hi = mid
2730 else
2731 let lo = mid + 1
2732 if i_val == mid_val | break | endif
2733 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002734 endif
2735 endwhile
2736 " do insert
2737 if lo < i
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002738 exe 'keepjumps '.i.'d_'
2739 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002740 endif
2741 let i = i + 1
2742 endwhile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002743
2744" call Dret("NetSort")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002745endfun
2746
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002747" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002748" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
2749" What this function does is to compute a priority for the patterns
2750" in the g:netrw_sort_sequence. It applies a substitute to any
2751" "files" that satisfy each pattern, putting the priority / in
2752" front. An "*" pattern handles the default priority.
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002753fun! <SID>SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002754" call Dfunc("SetSort() bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002755 if g:netrw_longlist
2756 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
2757 else
2758 let seqlist = g:netrw_sort_sequence
2759 endif
2760 " sanity check -- insure that * appears somewhere
2761 if seqlist == ""
2762 let seqlist= '*'
2763 elseif seqlist !~ '\*'
2764 let seqlist= seqlist.',*'
2765 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002766 let priority = 1
2767 while seqlist != ""
2768 if seqlist =~ ','
2769 let seq = substitute(seqlist,',.*$','','e')
2770 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
2771 else
2772 let seq = seqlist
2773 let seqlist = ""
2774 endif
2775 let eseq= escape(seq,'/')
2776 if priority < 10
2777 let spriority= "00".priority.'\/'
2778 elseif priority < 100
2779 let spriority= "0".priority.'\/'
2780 else
2781 let spriority= priority.'\/'
2782 endif
2783" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
2784
2785 if seq == '*'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002786 exe 'keepjumps silent '.s:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002787 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002788 exe 'keepjumps silent '.s:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002789 endif
2790 let priority = priority + 1
2791 endwhile
2792
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002793 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002794
2795" call Dret("SetSort")
2796endfun
2797
Bram Moolenaar071d4272004-06-13 20:20:40 +00002798" ------------------------------------------------------------------------
2799" Restore {{{1
2800let &cpo= s:save_cpo
2801unlet s:save_cpo
2802" vim:ts=8 fdm=marker