blob: 0653aabc2a7b91d5da7b58fdfda93ef310d15bba [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaar81695252004-12-29 20:58:21 +00002" last change: Dec 29, 2004
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
Bram Moolenaar81695252004-12-29 20:58:21 +00004" Version: 54
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 Moolenaar81695252004-12-29 20:58:21 +000017let g:loaded_netrw = "v54"
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 Moolenaar293ee4d2004-12-09 21:34:53 +000032 if &shell == "bash"
33 let g:netrw_cygwin= 1
34 else
35 let g:netrw_cygwin= 0
36 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000037 else
38 let g:netrw_cygwin= 0
39 endif
40endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000041if !exists("g:netrw_list_cmd")
42 if executable("ssh")
43 " provide a default listing command
44 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
45 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000046" call Decho("ssh is not executable, can't do remote directory exploring")
Bram Moolenaar843ee412004-06-30 16:16:41 +000047 let g:netrw_list_cmd= ""
48 endif
49endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +000050if !exists("g:netrw_ftp_list_cmd")
51 if has("unix") || exists("g:netrw_cygwin")
52 let g:netrw_ftp_list_cmd= "ls -lF"
53 else
54 let g:netrw_ftp_list_cmd= "dir"
55 endif
56endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000057if !exists("g:netrw_rm_cmd")
58 let g:netrw_rm_cmd = "ssh HOSTNAME rm"
59endif
60if !exists("g:netrw_rmf_cmd")
61 let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
62endif
63if !exists("g:netrw_rmdir_cmd")
64 let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
65endif
66if !exists("g:netrw_rename_cmd")
67 let g:netrw_rename_cmd= "ssh HOSTNAME mv"
68endif
69if exists("g:netrw_silent") && g:netrw_silent != 0
70 let g:netrw_silentxfer= "silent "
71else
72 let g:netrw_silentxfer= ""
73endif
74if !exists("g:netrw_winsize")
75 let g:netrw_winsize= ""
76endif
77if !exists("g:netrw_list_hide")
78 let g:netrw_list_hide= ""
79endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000080if !exists("g:netrw_sort_by")
81 " alternatives: date size
82 let g:netrw_sort_by= "name"
83endif
84if !exists("g:netrw_sort_sequence")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000085 let g:netrw_sort_sequence= '[\/]$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000086endif
87if !exists("g:netrw_sort_direction")
88 " alternative: reverse (z y x ...)
89 let g:netrw_sort_direction= "normal"
90endif
Bram Moolenaar8299df92004-07-10 09:47:34 +000091if !exists("g:netrw_longlist") || g:netrw_longlist == 0
92 let g:netrw_longlist= 0
93else
94 let g:netrw_longlist= 1
Bram Moolenaar269ec652004-07-29 08:43:53 +000095 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -lk"
Bram Moolenaar8299df92004-07-10 09:47:34 +000096endif
97if !exists("g:netrw_timefmt")
98 let g:netrw_timefmt= "%c"
99endif
100if !exists("g:netrw_local_rmdir")
101 let g:netrw_local_rmdir= "rmdir"
102endif
103if !exists("g:netrw_local_rename")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000104 if g:netrw_cygwin
105 let g:netrw_local_rename= "mv"
106 elseif has("win32") || has("win95") || has("win64") || has("win16")
107 let g:netrw_local_rename= "rename"
Bram Moolenaar8299df92004-07-10 09:47:34 +0000108 elseif has("unix")
109 let g:netrw_local_rename= "mv"
110 endif
111endif
112if !exists("g:netrw_local_mkdir")
113 let g:netrw_local_mkdir= "mkdir"
114endif
115if !exists("g:netrw_mkdir_cmd")
116 let g:netrw_mkdir_cmd= "ssh HOSTNAME mkdir"
117endif
Bram Moolenaar269ec652004-07-29 08:43:53 +0000118if !exists("g:netrw_hide")
119 let g:netrw_hide= 1
120endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000121if !exists("g:netrw_ftp_browse_reject")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000122 let g:netrw_ftp_browse_reject='^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not\|No such file\|: connect to address [0-9a-fA-F:]*: No route to host$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000123endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000124if !exists("g:netrw_ssh_browse_reject")
125 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
126endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000127if !exists("g:netrw_keepdir")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000128 let g:netrw_keepdir= 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000129endif
130if !exists("s:netrw_cd_escape")
131 if has("win32") || has("win95") || has("win64") || has("win16")
132 let s:netrw_cd_escape="#% "
133 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000134 let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000135 endif
136endif
137if !exists("s:netrw_glob_escape")
138 if has("win32") || has("win95") || has("win64") || has("win16")
139 let s:netrw_glob_escape= ""
140 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000141 let s:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000142 endif
143endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000144if !exists("g:netrw_alto")
145 let g:netrw_alto= 0
146endif
147if !exists("g:netrw_altv")
148 let g:netrw_altv= 0
149endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000150if !exists("g:netrw_maxfilenamelen")
151 let g:netrw_maxfilenamelen= 32
152endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000153if !exists("g:netrw_dirhistmax")
154 let g:netrw_dirhistmax= 10
155endif
156if !exists("g:NETRW_DIRHIST_CNT")
157 let g:NETRW_DIRHIST_CNT= 0
158endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000159
160" BufEnter event ignored by decho when following variable is true
161" Has a side effect that doau BufReadPost doesn't work, so
162" files read by network transfer aren't appropriately highlighted.
163"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000164
165" ---------------------------------------------------------------------
166" Default values for global protocol variables {{{1
167if !exists("g:netrw_rcp_cmd")
168 let g:netrw_rcp_cmd = "rcp"
169endif
170if !exists("g:netrw_ftp_cmd")
171 let g:netrw_ftp_cmd = "ftp"
172endif
173if !exists("g:netrw_scp_cmd")
174 let g:netrw_scp_cmd = "scp -q"
175endif
176if !exists("g:netrw_sftp_cmd")
177 let g:netrw_sftp_cmd = "sftp"
178endif
179if !exists("g:netrw_http_cmd")
180 if executable("wget")
181 let g:netrw_http_cmd = "wget -q -O"
182 elseif executable("fetch")
183 let g:netrw_http_cmd = "fetch -o"
184 else
185 let g:netrw_http_cmd = ""
186 endif
187endif
188if !exists("g:netrw_dav_cmd")
189 let g:netrw_dav_cmd = "cadaver"
190endif
191if !exists("g:netrw_rsync_cmd")
192 let g:netrw_rsync_cmd = "rsync"
193endif
194if !exists("g:netrw_fetch_cmd")
195 if executable("fetch")
196 let g:netrw_fetch_cmd = "fetch -o"
197 else
198 let g:netrw_fetch_cmd = ""
199 endif
200endif
201
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000202if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000203 \ && exists("g:netrw_use_nt_rcp")
204 \ && g:netrw_use_nt_rcp
205 \ && executable( $SystemRoot .'/system32/rcp.exe')
206 let s:netrw_has_nt_rcp = 1
207 let s:netrw_rcpmode = '-b'
208 else
209 let s:netrw_has_nt_rcp = 0
210 let s:netrw_rcpmode = ''
211endif
212
213" ---------------------------------------------------------------------
214" Transparency Support: {{{1
Bram Moolenaar8299df92004-07-10 09:47:34 +0000215 " File Explorer: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000216if version >= 600
Bram Moolenaar8299df92004-07-10 09:47:34 +0000217 augroup FileExplorer
218 au!
219 au BufEnter * call <SID>LocalBrowse(expand("<afile>"))
220 augroup END
221 " Network Handler: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000222 augroup Network
223 au!
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000224 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000225 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 +0000226 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000227 au BufReadCmd file:///* exe "silent doau BufReadPre ".expand("<afile>")|exe 'e /'.substitute(expand("<afile>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<afile>")
228 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 +0000229 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000230 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>")
Bram Moolenaar81695252004-12-29 20:58:21 +0000231 au FileReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau BufReadPre ".expand("<afile>")|exe "Nread " .expand("<afile>")|exe "silent doau FileReadPost ".expand("<afile>")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000232 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 Moolenaar81695252004-12-29 20:58:21 +0000233 au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("<afile>")|exe "'[,']Nwrite " .expand("<afile>")|exe "silent doau FileWritePost ".expand("<afile>")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000234 augroup END
235endif
236
237" ------------------------------------------------------------------------
238" Commands: :Nread, :Nwrite, and :NetUserPass {{{1
239com! -nargs=* Nread call <SID>NetSavePosn()<bar>call <SID>NetRead(<f-args>)<bar>call <SID>NetRestorePosn()
240com! -range=% -nargs=* Nwrite call <SID>NetSavePosn()<bar><line1>,<line2>call <SID>NetWrite(<f-args>)<bar>call <SID>NetRestorePosn()
241com! -nargs=* NetUserPass call NetUserPass(<f-args>)
242
243" ------------------------------------------------------------------------
244" NetSavePosn: saves position of cursor on screen {{{1
245fun! s:NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000246" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000247 " Save current line and column
248 let s:netrw_winnr= winnr()
249 let s:netrw_line = line(".")
250 let s:netrw_col = virtcol(".")
251
252 " Save top-of-screen line
253 norm! H0
254 let s:netrw_hline= line(".")
255
256 call s:NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000257" 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 +0000258endfun
259
260" ------------------------------------------------------------------------
261" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
262fun! <SID>NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000263" 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 +0000264
Bram Moolenaar81695252004-12-29 20:58:21 +0000265 " restore window
266" call Decho("restore window: exe silent! ".s:netrw_winnr."wincmd w")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000267 exe "silent! ".s:netrw_winnr."wincmd w"
268 if v:shell_error == 0
269 " as suggested by Bram M: redraw on no error
270 " allows protocol error messages to remain visible
271 redraw!
272 endif
Bram Moolenaar81695252004-12-29 20:58:21 +0000273
Bram Moolenaar071d4272004-06-13 20:20:40 +0000274 " restore top-of-screen line
Bram Moolenaar81695252004-12-29 20:58:21 +0000275" call Decho("restore topofscreen: exe norm! ".s:netrw_hline."G0z")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000276 exe "norm! ".s:netrw_hline."G0z\<CR>"
Bram Moolenaar81695252004-12-29 20:58:21 +0000277
Bram Moolenaar071d4272004-06-13 20:20:40 +0000278 " restore position
Bram Moolenaar81695252004-12-29 20:58:21 +0000279" call Decho("restore posn: exe norm! ".s:netrw_line."G0".s:netrw_col."|")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000280 exe "norm! ".s:netrw_line."G0".s:netrw_col."\<bar>"
281
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000282" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000283endfun
284
285" ------------------------------------------------------------------------
286" NetRead: responsible for reading a file over the net {{{1
287fun! s:NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000288" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000289
290 " save options
291 call s:NetOptionSave()
292
293 " Special Exception: if a file is named "0r", then
294 " "0r" will be used to read the
295 " following files instead of "r"
296 if a:0 == 0
297 let readcmd= "r"
298 let ichoice= 0
299 elseif a:1 == "0r"
300 let readcmd = "0r"
301 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000302 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000303 let readcmd = "r"
304 let ichoice = 1
305 endif
306
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000307 " get name of a temporary file and set up shell-quoting character
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000308 let tmpfile= tempname()
309
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000310" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000311 while ichoice <= a:0
312
313 " attempt to repeat with previous host-file-etc
314 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000315" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000316 let choice = b:netrw_lastfile
317 let ichoice= ichoice + 1
318
319 else
320 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000321" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000322
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000323 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000324 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000325 echomsg 'NetRead Usage:'
326 echomsg ':Nread machine:path uses rcp'
327 echomsg ':Nread "machine path" uses ftp with <.netrc>'
328 echomsg ':Nread "machine id password path" uses ftp'
329 echomsg ':Nread dav://machine[:port]/path uses cadaver'
330 echomsg ':Nread fetch://machine/path uses fetch'
331 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
332 echomsg ':Nread http://[user@]machine/path uses http wget'
333 echomsg ':Nread rcp://[user@]machine/path uses rcp'
334 echomsg ':Nread rsync://machine[:port]/path uses rsync'
335 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
336 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000337 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000338
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000339 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000340 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000341" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000342 if match(choice,"\"$") != -1
343 " case "..."
344 let choice=strpart(choice,1,strlen(choice)-2)
345 else
346 " case "... ... ..."
347 let choice = strpart(choice,1,strlen(choice)-1)
348 let wholechoice = ""
349
350 while match(choice,"\"$") == -1
351 let wholechoice = wholechoice . " " . choice
352 let ichoice = ichoice + 1
353 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000354 if !exists("g:netrw_quiet")
355 echoerr "Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000356 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000357 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000358" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000359 return
360 endif
361 let choice= a:{ichoice}
362 endwhile
363 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
364 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000365 endif
366 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000367
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000368" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000369 let ichoice= ichoice + 1
370
371 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000372 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000373 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000374" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000375
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000376 exe 'lcd ' . fnamemodify(tmpfile,':h')
377 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000378 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000379
380 " Determine method of read (ftp, rcp, etc)
381 call s:NetMethod(choice)
382
Bram Moolenaar843ee412004-06-30 16:16:41 +0000383 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000384" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000385 if choice =~ "^.*[\/]$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000386 keepjumps call s:NetBrowse(choice)
387" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000388 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000389 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000390
391 " ============
392 " Perform Read
393 " ============
394
395 ".........................................
396 " rcp: NetRead Method #1
397 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000398" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000399 " ER: noting done with g:netrw_uid yet?
400 " ER: on Win2K" rcp machine[.user]:file tmpfile
401 " ER: if machine contains '.' adding .user is required (use $USERNAME)
402 " ER: the tmpfile is full path: rcp sees C:\... as host C
403 if s:netrw_has_nt_rcp == 1
404 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
405 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
406 else
407 " Any way needed it machine contains a '.'
408 let uid_machine = g:netrw_machine .'.'. $USERNAME
409 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000410 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000411 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
412 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
413 else
414 let uid_machine = g:netrw_machine
415 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000416 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000417" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000418 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
419 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
420 let b:netrw_lastfile = choice
421
422 ".........................................
423 " ftp + <.netrc>: NetRead Method #2
424 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000425" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000426 let netrw_fname= b:netrw_fname
427 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000428 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000429 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000430 exe "put ='"."get ".netrw_fname." ".tmpfile."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000431 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000432" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000433 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
434 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000435" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000436 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
437 endif
438 " 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 +0000439 if getline(1) !~ "^$" && !exists("g:netrw_quiet")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000440 let debugkeep= &debug
441 set debug=msg
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000442 echoerr getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000443 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000444 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000445 endif
446 bd!
447 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
448 let b:netrw_lastfile = choice
449
450 ".........................................
451 " ftp + machine,id,passwd,filename: NetRead Method #3
452 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
453 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000454" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000455 let netrw_fname= b:netrw_fname
456 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000457 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000458 if exists("g:netrw_port") && g:netrw_port != ""
459 put ='open '.g:netrw_machine.' '.g:netrw_port
460 else
461 put ='open '.g:netrw_machine
462 endif
463
464 if exists("g:netrw_ftp") && g:netrw_ftp == 1
465 put =g:netrw_uid
466 put =g:netrw_passwd
467 else
468 put ='user '.g:netrw_uid.' '.g:netrw_passwd
469 endif
470
471 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
472 put =g:netrw_ftpmode
473 endif
474 put ='get '.netrw_fname.' '.tmpfile
475
476 " perform ftp:
477 " -i : turns off interactive prompting from ftp
478 " -n unix : DON'T use <.netrc>, even though it exists
479 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000480" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000481 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000482" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000483 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
484 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
485 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000486" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000487 if !exists("g:netrw_quiet")
488 echoerr getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000489 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000490 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000491 endif
492 bd!
493 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
494 let b:netrw_lastfile = choice
495
496 ".........................................
497 " scp: NetRead Method #4
498 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000499" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000500 if exists("g:netrw_port") && g:netrw_port != ""
501 let useport= " -P ".g:netrw_port
502 else
503 let useport= ""
504 endif
505 if g:netrw_cygwin == 1
506 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000507" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000508 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
509 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000510" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000511 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
512 endif
513 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
514 let b:netrw_lastfile = choice
515
516 ".........................................
517 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000518" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000519 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000520 if !exists("g:netrw_quiet")
521 echoerr "neither wget nor fetch command is available"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000522 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000523 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000524 exit
525 endif
526
527 if match(b:netrw_fname,"#") == -1
528 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000529" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000530 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
531 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
532
533 else
534 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
535 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
536 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000537" call Decho("netrw_html<".netrw_html.">")
538" call Decho("netrw_tag <".netrw_tag.">")
539" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000540 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
541 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000542" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000543 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
544 endif
545 let b:netrw_lastfile = choice
546
547 ".........................................
548 " cadaver: NetRead Method #6
549 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000550" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000551
552 " Construct execution string (four lines) which will be passed through filter
553 let netrw_fname= b:netrw_fname
554 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000555 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000556 if exists("g:netrw_port") && g:netrw_port != ""
557 put ='open '.g:netrw_machine.' '.g:netrw_port
558 else
559 put ='open '.g:netrw_machine
560 endif
561 put ='user '.g:netrw_uid.' '.g:netrw_passwd
562
563 if g:netrw_cygwin == 1
564 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
565 put ='get '.netrw_fname.' '.cygtmpfile
566 else
567 put ='get '.netrw_fname.' '.tmpfile
568 endif
569
570 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000571 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000572" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000573 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
574 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000575 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000576 let b:netrw_lastfile = choice
577
578 ".........................................
579 " rsync: NetRead Method #7
580 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000581" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000582 if g:netrw_cygwin == 1
583 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000584" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000585 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
586 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000587" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000588 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
589 endif
590 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
591 let b:netrw_lastfile = choice
592
593 ".........................................
594 " fetch: NetRead Method #8
595 " fetch://[user@]host[:http]/path
596 elseif b:netrw_method == 8 " read with fetch
597 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000598 if !exists("g:netrw_quiet")
599 echoerr "fetch command not available"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000600 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000601 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000602 exit
603 endif
604 if exists("g:netrw_option") && g:netrw_option == ":http"
605 let netrw_option= "http"
606 else
607 let netrw_option= "ftp"
608 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000609" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000610
611 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000612" 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 +0000613 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
614 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000615" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000616 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
617 endif
618
619 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
620 let b:netrw_lastfile = choice
621
622 ".........................................
623 " sftp: NetRead Method #9
624 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000625" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000626 if g:netrw_cygwin == 1
627 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000628" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
629" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000630 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
631 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000632" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000633 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
634 endif
635 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
636 let b:netrw_lastfile = choice
637
638 ".........................................
639 else " Complain
640 echo "***warning*** unable to comply with your request<" . choice . ">"
641 endif
642 endwhile
643
644 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000645" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000646 if exists("b:netrw_method")
647 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000648 unlet b:netrw_fname
649 endif
650 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000651
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000652" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000653endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000654
655" ------------------------------------------------------------------------
656" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
657fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000658" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000659
660 if exists("*NetReadFixup")
661 " for the use of NetReadFixup (not otherwise used internally)
662 let line2= line("$")
663 endif
664
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000665 " transform paths from / to \ for Windows (except for cygwin)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000666 if &term == "win32"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000667 if g:netrw_cygwin
668 let fname= a:fname
669" call Decho("(win32 && cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000670 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000671 let fname= substitute(a:fname,'/','\\\\','ge')
672" call Decho("(win32 && !cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000673 endif
674 else
675 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000676" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000677 endif
678
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000679 if a:readcmd[0] == '0'
Bram Moolenaar81695252004-12-29 20:58:21 +0000680 " get file into buffer
681 " record remote filename
682 let rfile= bufname("%")
683" call Decho("edit remotefile<".rfile.">")
684 " rename the current buffer to the temp file (ie. fname)
685 exe "keepalt file ".fname
686 " edit temporary file
687 e
688 " rename buffer back to remote filename
689 exe "keepalt file ".rfile
690 " wipe out the buffer with the temp file name
691 exe "bwipe ".fname
692 let line1 = 1
693 let line2 = line("$")
694
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000695 elseif filereadable(fname)
Bram Moolenaar81695252004-12-29 20:58:21 +0000696 " read file after current line
697 let curline = line(".")
698 let lastline= line("$")
699" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname."> line#".curline)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000700 exe a:readcmd." ".v:cmdarg." ".fname
Bram Moolenaar81695252004-12-29 20:58:21 +0000701 let line1 = curline + 1
702 let line2 = line("$") - lastline + 1
703 let s:netrw_line = s:netrw_line + 1
704 let s:netrw_col = 1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000705 else
Bram Moolenaar81695252004-12-29 20:58:21 +0000706 " not readable
707" call Dret("NetGetFile : fname<".fname."> not readable")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000708 return
709 endif
710
711 " User-provided (ie. optional) fix-it-up command
712 if exists("*NetReadFixup")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000713" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000714 call NetReadFixup(a:method, line1, line2)
715 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000716
717 " update the Buffers menu
718 if has("gui") && has("gui_running")
719 silent! emenu Buffers.Refresh\ menu
720 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000721
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000722" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000723
724 " insure that we have the right filetype and that its being displayed
725 filetype detect
726 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000727" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000728endfun
729
730" ------------------------------------------------------------------------
731" NetWrite: responsible for writing a file over the net {{{1
732fun! s:NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000733" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000734
735 " option handling
736 let mod= 0
737 call s:NetOptionSave()
738
739 " Get Temporary Filename
740 let tmpfile= tempname()
741
742 if a:0 == 0
743 let ichoice = 0
744 else
745 let ichoice = 1
746 endif
747
748 " write (selected portion of) file to temporary
749 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
750
751 while ichoice <= a:0
752
753 " attempt to repeat with previous host-file-etc
754 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000755" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000756 let choice = b:netrw_lastfile
757 let ichoice= ichoice + 1
758 else
759 exe "let choice= a:" . ichoice
760
761 " Reconstruct Choice if choice starts with '"'
762 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000763 echomsg 'NetWrite Usage:"'
764 echomsg ':Nwrite machine:path uses rcp'
765 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
766 echomsg ':Nwrite "machine id password path" uses ftp'
767 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
768 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
769 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
770 echomsg ':Nwrite rcp://machine/path uses rcp'
771 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
772 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
773 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000774 break
775
776 elseif match(choice,"^\"") != -1
777 if match(choice,"\"$") != -1
778 " case "..."
779 let choice=strpart(choice,1,strlen(choice)-2)
780 else
781 " case "... ... ..."
782 let choice = strpart(choice,1,strlen(choice)-1)
783 let wholechoice = ""
784
785 while match(choice,"\"$") == -1
786 let wholechoice= wholechoice . " " . choice
787 let ichoice = ichoice + 1
788 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000789 if !exists("g:netrw_quiet")
790 echoerr "Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000791 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000792 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000793" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000794 return
795 endif
796 let choice= a:{ichoice}
797 endwhile
798 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
799 endif
800 endif
801 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000802" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000803 let ichoice= ichoice + 1
804
805 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000806 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000807 let choice= substitute(choice,'\\','/','ge')
808 "ER: see NetRead()
809 exe 'lcd ' . fnamemodify(tmpfile,':h')
810 let tmpfile = fnamemodify(tmpfile,':t')
811 endif
812
813 " Determine method of read (ftp, rcp, etc)
814 call s:NetMethod(choice)
815
816 " =============
817 " Perform Write
818 " =============
819
820 ".........................................
821 " rcp: NetWrite Method #1
822 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000823" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000824 if s:netrw_has_nt_rcp == 1
825 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
826 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
827 else
828 let uid_machine = g:netrw_machine .'.'. $USERNAME
829 endif
830 else
831 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
832 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
833 else
834 let uid_machine = g:netrw_machine
835 endif
836 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000837" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000838 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
839 let b:netrw_lastfile = choice
840
841 ".........................................
842 " ftp + <.netrc>: NetWrite Method #2
843 elseif b:netrw_method == 2 " write with ftp + <.netrc>
844 let netrw_fname = b:netrw_fname
845 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000846 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000847 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000848" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000849 exe "put ='"."put ".tmpfile." ".netrw_fname."'"
850" call Decho("put ='"."put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000851 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000852" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000853 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000854 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000855" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000856 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000857 endif
858 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
859 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000860 if !exists("g:netrw_quiet")
861 echoerr getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000862 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000863 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000864 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000865 endif
866 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000867 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000868
869 ".........................................
870 " ftp + machine, id, passwd, filename: NetWrite Method #3
871 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
872 let netrw_fname= b:netrw_fname
873 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000874 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000875 if exists("g:netrw_port") && g:netrw_port != ""
876 put ='open '.g:netrw_machine.' '.g:netrw_port
877 else
878 put ='open '.g:netrw_machine
879 endif
880 if exists("g:netrw_ftp") && g:netrw_ftp == 1
881 put =g:netrw_uid
882 put =g:netrw_passwd
883 else
884 put ='user '.g:netrw_uid.' '.g:netrw_passwd
885 endif
886 put ='put '.tmpfile.' '.netrw_fname
887 " save choice/id/password for future use
888 let b:netrw_lastfile = choice
889
890 " perform ftp:
891 " -i : turns off interactive prompting from ftp
892 " -n unix : DON'T use <.netrc>, even though it exists
893 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000894" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000895 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000896" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000897 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
898 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
899 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000900 if !exists("g:netrw_quiet")
901 echoerr getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000902 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000903 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000904 let mod=1
905 endif
906 bd!
907
908 ".........................................
909 " scp: NetWrite Method #4
910 elseif b:netrw_method == 4 " write with scp
911 if exists("g:netrw_port") && g:netrw_port != ""
912 let useport= " -P ".g:netrw_port
913 else
914 let useport= ""
915 endif
916 if g:netrw_cygwin == 1
917 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000918" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000919 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
920 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000921" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000922 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
923 endif
924 let b:netrw_lastfile = choice
925
926 ".........................................
927 " http: NetWrite Method #5
928 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000929 if !exists("g:netrw_quiet")
930 echoerr "***warning*** currently <netrw.vim> does not support writing using http:"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000931 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000932 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000933
934 ".........................................
935 " dav: NetWrite Method #6
936 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000937" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000938
939 " Construct execution string (four lines) which will be passed through filter
940 let netrw_fname= b:netrw_fname
941 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000942 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000943 if exists("g:netrw_port") && g:netrw_port != ""
944 put ='open '.g:netrw_machine.' '.g:netrw_port
945 else
946 put ='open '.g:netrw_machine
947 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000948 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000949
950 if g:netrw_cygwin == 1
951 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
952 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000953 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000954 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000955 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000956
957 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000958 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000959" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000960 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
961 bd!
962 let b:netrw_lastfile = choice
963
964 ".........................................
965 " rsync: NetWrite Method #7
966 elseif b:netrw_method == 7 " write with rsync
967 if g:netrw_cygwin == 1
968 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000969" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000970 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000971 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000972" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000973 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000974 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000975 let b:netrw_lastfile = choice
976
977 ".........................................
978 " scp: NetWrite Method #9
979 elseif b:netrw_method == 9 " write with sftp
980 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000981 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
982 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
983 else
984 let uid_machine = g:netrw_machine
985 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000986 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000987 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000988 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000989 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000990" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000991 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
992 bd!
993 let b:netrw_lastfile= choice
994
995 ".........................................
996 else " Complain
997 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000998 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000999 endwhile
1000
1001 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001002" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001003 let result=delete(tmpfile)
1004 call s:NetOptionRestore()
1005
1006 if a:firstline == 1 && a:lastline == line("$")
1007 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001008 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001009
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001010" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001011endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001012
1013" ------------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001014" Browsing Support For Remote Directories And Files: {{{1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001015" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001016" of the contents of a remote directory. It is assumed that the
1017" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1018" with the requested remote hostname first.
Bram Moolenaar843ee412004-06-30 16:16:41 +00001019fun! <SID>NetBrowse(dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001020" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".g:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001021
1022 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001023 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1024" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001025 if !executable("ftp")
1026 if !exists("g:netrw_quiet")
1027 echoerr "***netrw*** this system doesn't support remote directory listing via ftp"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001028 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001029 endif
1030" call Dret("NetBrowse")
1031 return
1032 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001033 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001034 if !exists("g:netrw_quiet")
1035 echoerr "***netrw*** this system doesn't support remote directory listing via ssh"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001036 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001037 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001038" call Dret("NetBrowse")
1039 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001040 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001041
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001042 " make this buffer modifiable
1043 setlocal ma
1044
1045 " analyze a:dirname and g:netrw_list_cmd
1046 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001047 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001048" call Decho("dirpat<".dirpat.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001049 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001050 if !exists("g:netrw_quiet")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001051 echoerr "NetBrowse: I don't understand your dirname<".dirname.">"
1052 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001053 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001054" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001055 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001056 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001057
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001058 let method = substitute(dirname,dirpat,'\1','')
1059 let user = substitute(dirname,dirpat,'\2','')
1060 let machine = substitute(dirname,dirpat,'\3','')
1061 let path = substitute(dirname,dirpat,'\4','')
1062 let fname = substitute(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 Moolenaar3fdfa4a2004-10-07 21:02:47 +00001069 if method == "ftp" || method == "http"
1070 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001071 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001072 else
1073 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1074 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001075
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001076 if exists("b:netrw_method")
1077" call Decho("setting s:netrw_method<".b:netrw_method.">")
1078 let s:netrw_method= b:netrw_method
1079 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001080
Bram Moolenaar8299df92004-07-10 09:47:34 +00001081 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001082 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
1083 echoerr "***warning*** windows' ftp doesn't support time/size sorts (get cygwin, set g:netrw_cygwin)"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001084 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001085 else
1086 if g:netrw_sort_by =~ "^t"
1087 let listcmd= listcmd."t"
1088 elseif g:netrw_sort_by =~ "^s"
1089 let listcmd= listcmd."S"
1090 endif
1091 " optionally sort in reverse
1092 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1093 let listcmd= listcmd."r"
1094 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001095 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001096
1097" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001098 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001099" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001100 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001101 redraw!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001102" call Dret("NetBrowse : symlink")
1103 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001104
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001105 elseif fname !~ '[\/]$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001106 " looks like a regular file, attempt transfer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001107" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001108
1109 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001110 " "this is a directory" indicator (/). There shouldn't be one of those,
1111 " anyway.
1112 let path= substitute(path,'[*=@|]$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001113" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001114
1115 " remote-read the requested file into current buffer
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001116 enew!
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001117" call Decho("exe file .method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001118 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001119 exe "silent doau BufReadPre ".fname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001120 silent call s:NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001121 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001122 keepjumps 1d
1123 setlocal nomod
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001124
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001125" call Dret("NetBrowse : file<".fname.">")
1126 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001127 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001128
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001129 " ---------------------------------------------------------------------
1130 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001131" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001132 " set up new buffer and map
1133 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001134 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001135" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001136 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001137 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001138" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001139 exe "b ".bufnamenr
1140 if line("$") >= 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001141" call Dret("NetBrowse")
1142 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001143 endif
1144 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001145" call Decho("generate a new buffer")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001146 enew!
1147 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001148
1149 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001150 setlocal bt=nofile bh=wipe nobl noswf
1151 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001152" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001153 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001154" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001155 setlocal bh=hide nobl nonu
1156
1157 " save current directory on directory history list
1158 call <SID>NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001159
1160 " set up buffer-local mappings
1161" call Decho("set up buffer-local mappings")
1162 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001163 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
1164 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001165 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 +00001166 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1167 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1168 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1169 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001170 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 +00001171 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1172 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>
1173 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>
1174 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001175 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1176 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001177 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 +00001178 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
1179 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 +00001180 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1181 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001182 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001183 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1184 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1185 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001186 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001187 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001188 setlocal ma nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001189
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001190 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001191" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1192 keepjumps put ='\" ==========================================================================='
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001193 keepjumps put ='\" Netrw Remote Directory Listing'
1194 keepjumps put ='\" '.bufname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001195 let s:netrw_bannercnt= 7
1196 let sortby= g:netrw_sort_by
1197 if g:netrw_sort_direction =~ "^r"
1198 let sortby= sortby." reversed"
1199 endif
1200
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001201 if g:netrw_sort_by =~ "^n"
1202 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001203 let s:netrw_bannercnt= s:netrw_bannercnt + 1
1204 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001205 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1206 else
1207 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001208 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001209 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001210 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001211 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001212 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001213 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001214 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001215 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001216 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001217 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001218 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1219 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001220
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001221 " remote read the requested directory listing
1222 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1223 " Note that not all ftp servers honor the options for ls
1224 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001225 " use ftp to get remote file listing
1226" call Decho("use ftp to get remote file listing")
1227 call NetBrowseFtpCmd(path,listcmd)
1228
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001229 keepjumps 1d
1230
1231 if !g:netrw_longlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001232 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001233" call Decho("generate short listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001234 exe "keepjumps ".s:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001235
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001236 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001237 if g:netrw_ftp_browse_reject != ""
1238 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1239 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001240
1241 " if there's no ../ listed, then put ./ and ../ in
1242 let line1= line(".")
1243 keepjumps 1
1244 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1245 let line2= line(".")
1246 if line2 == 0
1247 keepjumps put='../'
1248 keepjumps put='./'
1249 endif
1250 exe "keepjumps ".line1
1251 keepjumps norm! 0
1252
1253 " more cleanup
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001254 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1255 exe "keepjumps silent ".s:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#'
1256 exe "keepjumps silent ".s:netrw_bannercnt.',$g/ -> /s# -> .*$#/#'
1257 endif
1258
1259 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001260 " use ssh to get remote file listing
1261" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001262 let shq= &shq? &shq : ( &sxq? &sxq : "'")
1263" call Decho("exe silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq)
1264 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1265 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001266 " cleanup
1267 if g:netrw_ftp_browse_reject != ""
1268 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
1269 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001270 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001271
1272 " manipulate the directory listing (hide, sort)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001273 setlocal ft=netrwlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001274 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001275 if g:netrw_hide && g:netrw_list_hide != ""
1276 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001277 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001278
Bram Moolenaar8299df92004-07-10 09:47:34 +00001279 if g:netrw_longlist
1280 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001281" call Decho("manipulate long listing")
1282
1283 if method == "ftp"
1284 " cleanup
1285 exe "keepjumps ".s:netrw_bannercnt
1286 while getline(".") =~ '^total\s\+\d\+$' || getline(".") =~ 'Trying\s\+\d\+.*$'
1287 keepjumps d
1288 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001289 " if there's no ../ listed, then put ./ and ../ in
1290 let line1= line(".")
1291 keepjumps 1
1292 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1293 let line2= line(".")
1294 if line2 == 0
1295 exe 'keepjumps '.s:netrw_bannercnt."put='./'"
1296 exe 'keepjumps '.s:netrw_bannercnt."put='../'"
1297 endif
1298 exe "keepjumps ".line1
1299 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001300 endif
1301
1302 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/ -> .*$//e'
1303 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1304 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001305 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001306
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001307 if line("$") >= s:netrw_bannercnt
1308 if g:netrw_sort_by =~ "^n"
1309 call s:SetSort()
1310 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
1311 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
1312 endif
1313 if g:netrw_longlist
1314 " shorten the list to keep its width <= 80 characters
1315 exe "keepjumps silent ".s:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
1316 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001317 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001318 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001319 exe "keepjumps ".s:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001320 setlocal nomod
1321 setlocal noma
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001322 setlocal nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001323
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001324" call Dret("NetBrowse")
1325 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001326endfun
1327
1328" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001329" NetBrowseChgDir: {{{2
1330fun! <SID>NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001331" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001332
1333 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001334 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001335
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001336 if newdir !~ '[\/]$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001337 " handling a file
1338 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001339" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001340
1341 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001342 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001343" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001344 setlocal ma
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001345 %d
1346
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001347 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001348 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001349 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001350
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001351 if trailer =~ '^\%(\.\./\)*$'
1352 " tack on a ../"
1353 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001354
1355 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001356 " strip off a directory name from dirname
1357 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001358 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001359" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001360
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001361 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001362 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001363 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001364" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001365 endif
1366
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001367" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001368 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001369endfun
1370
Bram Moolenaar843ee412004-06-30 16:16:41 +00001371" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001372" NetGetWord: it gets the directory named under the cursor
1373fun! <SID>NetGetWord()
1374" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001375 if line(".") < s:netrw_bannercnt
1376 let dirname= "./"
1377 else
1378 let dirname= getline(".")
1379 if dirname =~ '\t'
1380 let dirname= substitute(dirname,'\t.*$','','e')
1381 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001382 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001383" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001384 return dirname
1385endfun
1386
1387" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001388" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar843ee412004-06-30 16:16:41 +00001389fun! <SID>NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001390" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1391" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001392
1393 " preparation for removing multiple files/directories
1394 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001395 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001396
1397 " remove multiple files and directories
1398 while ctr <= a:lastline
1399 exe ctr
1400
1401 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001402 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001403" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001404
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001405 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001406 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001407 if !all
1408 echohl Statement
1409 call inputsave()
1410 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1411 call inputrestore()
1412 echohl NONE
1413 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1414 if ok =~ 'a\%[ll]'
1415 let all= 1
1416 endif
1417 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001418
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001419 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001420 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1421 silent! keepjumps .,$d
1422 call NetBrowseFtpCmd(a:path,"delete ".rmfile)
1423 else
1424 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1425" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1426 let ret= system(netrw_rm_cmd)
1427" call Decho("returned=".ret." errcode=".v:shell_error)
1428 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001429 elseif ok =~ 'q\%[uit]'
1430 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001431 endif
1432
1433 else
1434 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001435 if !all
1436 call inputsave()
1437 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1438 call inputrestore()
1439 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1440 if ok =~ 'a\%[ll]'
1441 let all= 1
1442 endif
1443 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001444
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001445 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001446 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1447 call NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
1448 else
1449 let rmfile = a:path.rmfile
1450 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1451" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1452 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001453" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001454
1455 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001456 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001457" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1458 let ret= system(netrw_rmf_cmd)
1459" call Decho("returned=".ret." errcode=".v:shell_error)
1460
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001461 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001462 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001463 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001464 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001465 endif
1466 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001467
1468 elseif ok =~ 'q\%[uit]'
1469 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001470 endif
1471 endif
1472
1473 let ctr= ctr + 1
1474 endwhile
1475
1476 " refresh the directory
1477 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001478" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001479 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1480 exe curline
1481
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001482" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001483endfun
1484
1485" ---------------------------------------------------------------------
1486" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00001487fun! <SID>NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001488" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001489
1490 " preparation for removing multiple files/directories
1491 let ctr = a:firstline
1492 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1493
1494 " attempt to rename files/directories
1495 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001496 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001497
1498 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001499 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001500" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001501
1502 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001503 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001504 call inputrestore()
1505
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001506 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1507 call NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
1508 else
1509 let oldname= a:path.oldname
1510 let newname= a:path.newname
1511" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1512 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1513 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001514
1515 let ctr= ctr + 1
1516 endwhile
1517
1518 " refresh the directory
1519 let curline= line(".")
1520 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001521 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001522" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001523endfun
1524
1525" ---------------------------------------------------------------------
1526" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001527" files given their extension. Passes 0=local, 1=remote
1528fun! <SID>NetBrowseX(fname,remote)
1529" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001530
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001531 " set up the filename
1532 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001533 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001534 if has("win32") || has("win95") || has("win64") || has("win16")
1535 let exten= substitute(exten,'^.*$','\L&\E','')
1536 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001537 let fname= escape(a:fname,"%#")
1538" call Decho("fname<".fname."> after escape()")
1539
1540 if a:remote == 1
1541 " create a local copy
1542 let fname= tempname().".".exten
1543" call Decho("create a local copy of <".a:fname."> as <".fname.">")
1544 exe "keepjumps silent bot 1new ".a:fname
1545 let eikeep= &ei
1546 set ei=all bh=delete
1547 exe "w! ".fname
1548 let &ei= eikeep
1549 q
1550 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001551" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001552
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001553 " set up redirection
1554 if &srr =~ "%s"
1555 let redir= substitute(&srr,"%s","/dev/null"."")
1556 else
1557 let redir= &srr . "/dev/null"
1558 endif
1559" call Decho("redir:".redir.":")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001560
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001561 " execute the file handler
1562 if has("win32") || has("win64")
1563" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1564 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1565 let ret= v:shell_error
1566
1567 elseif has("unix") && executable("kfmclient")
1568" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1569 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1570 let ret= v:shell_error
1571
1572 elseif has("unix") && executable("gnome-open")
1573" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1574 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1575 let ret= v:shell_error
1576
1577 elseif exten != "" && exists("*NetrwFileHandler_".exten)
1578" call Decho("let ret= NetrwFileHandler_".exten.'("'.fname.'")')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001579 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001580 endif
1581 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001582
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001583 " cleanup: remove temporary file,
1584 " delete current buffer if success with handler,
1585 " return to prior buffer (directory listing)
1586 if a:remote == 1 && fname != a:fname
1587" call Decho("deleting temporary file<".fname.">")
1588 call delete(fname)
1589 endif
1590
1591 if a:remote == 1
1592 let eikeep= &ei
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001593 set ei=all bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001594 exe "norm! \<c-o>"
1595 let &ei= eikeep
1596 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001597 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001598
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001599" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001600endfun
1601
1602" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001603" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1604" This function assumes that a long listing will be received. Size, time,
1605" and reverse sorts will be requested of the server but not otherwise
1606" enforced here.
1607fun! NetBrowseFtpCmd(path,cmd)
1608" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".s:netrw_method)
1609
1610 " because WinXX ftp uses unix style input
1611 " curline is one more than the bannercnt in order to account
1612 " for the unwanted first blank line (doing a :put to an empty
1613 " buffer yields a blank first line)
1614 let ffkeep= &ff
1615 setlocal ma
1616 setlocal ff=unix
1617 let curline= s:netrw_bannercnt+1
1618 exe "silent! keepjumps ".curline.",$d"
1619
1620 ".........................................
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001621 if s:netrw_method == 2 || s:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001622 " ftp + <.netrc>: Method #2
1623 if a:path != ""
1624 put ='cd '.a:path
1625 endif
1626 exe "put ='".a:cmd."'"
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001627" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001628 if exists("g:netrw_port") && g:netrw_port != ""
1629" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1630 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1631 else
1632" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1633 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1634 endif
1635
1636 ".........................................
1637 elseif s:netrw_method == 3
1638 " ftp + machine,id,passwd,filename: Method #3
1639 setlocal ff=unix
1640 if exists("g:netrw_port") && g:netrw_port != ""
1641 put ='open '.g:netrw_machine.' '.g:netrw_port
1642 else
1643 put ='open '.g:netrw_machine
1644 endif
1645
1646 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1647 put =g:netrw_uid
1648 put =g:netrw_passwd
1649 else
1650 put ='user '.g:netrw_uid.' '.g:netrw_passwd
1651 endif
1652
1653 if a:path != ""
1654 put ='cd '.a:path
1655 endif
1656 exe "put ='".a:cmd."'"
1657
1658 " perform ftp:
1659 " -i : turns off interactive prompting from ftp
1660 " -n unix : DON'T use <.netrc>, even though it exists
1661 " -n win32: quit being obnoxious about password
1662" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1663 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1664
1665 ".........................................
1666 else
1667 echo "***warning*** unable to comply with your request<" . choice . ">"
1668 endif
1669
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001670 " cleanup for Windows
1671 if has("win32") || has("win95") || has("win64") || has("win16")
1672 keepjumps silent! %s/\r$//
1673 endif
1674 if a:cmd == "dir"
1675 " infer directory/link based on the file permission string
1676 keepjumps silent g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1677 keepjumps silent g/l\%([-r][-w][-x]\)\{3}/s/$/@/
1678 if !g:netrw_longlist
1679 exe "keepjumps silent ".curline.',$s/^\%(\S\+\s\+\)\{8}//'
1680 endif
1681 endif
1682
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001683 " restore settings
1684 let &ff= ffkeep
1685" call Dret("NetBrowseFtpCmd")
1686endfun
1687
1688" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001689" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1690" separated patterns given in g:netrw_list_hide
1691fun! <SID>NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001692" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001693
1694 let listhide= g:netrw_list_hide
1695 while listhide != ""
1696 if listhide =~ ','
1697 let hide = substitute(listhide,',.*$','','e')
1698 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1699 else
1700 let hide = listhide
1701 let listhide= ""
1702 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001703
1704 " Prune the list by hiding any files which match
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001705" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001706 if g:netrw_hide == 1
1707 exe 'keepjumps silent '.s:netrw_bannercnt.',$g~'.hide.'~d'
1708 elseif g:netrw_hide == 2
1709 exe 'keepjumps silent '.s:netrw_bannercnt.',$v~'.hide.'~d'
1710 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001711 endwhile
1712
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001713" call Dret("NetrwListHide")
1714endfun
1715
1716" ---------------------------------------------------------------------
1717" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar8299df92004-07-10 09:47:34 +00001718fun! <SID>NetHideEdit(mode)
1719" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001720
1721 call inputsave()
1722 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1723 call inputrestore()
1724
1725 " refresh the listing
1726 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001727 if a:mode == 0
1728 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1729 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001730 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001731 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001732
1733" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001734endfun
1735
Bram Moolenaar8299df92004-07-10 09:47:34 +00001736" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001737" NetSortSequence: allows user to edit the sorting sequence
1738fun! <SID>NetSortSequence(mode)
1739" call Dfunc("NetSortSequence(mode=".a:mode.")")
1740
1741 call inputsave()
1742 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
1743 call inputrestore()
1744
1745 " refresh the listing
1746 let g:netrw_sort_sequence= newsortseq
1747 if a:mode == 0
1748 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1749 else
1750 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
1751 endif
1752
1753" call Dret("NetSortSequence")
1754endfun
1755
1756" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001757" NetLongList: {{{2
1758fun! <SID>NetLongList(mode)
1759" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".g:netrw_longlist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001760 call s:NetSavePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001761
1762 if g:netrw_longlist != 0
1763 " turn long listing off
1764 let g:netrw_longlist = 0
1765 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1766
1767 else
1768 " turn long listing on
1769 let g:netrw_longlist = 1
1770 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
1771 endif
1772
1773 " refresh the listing
1774 if a:mode == 0
1775 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1776 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001777 silent call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001778 endif
1779
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001780 call s:NetRestorePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001781" call Dret("NetLongList : g:netrw_longlist=".g:netrw_longlist)
1782endfun
1783
1784" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001785" NetSaveWordPosn: used by the "s" command in both remote and local
1786" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
1787" the same word even though the sorting has changed its order of appearance.
1788fun! s:NetSaveWordPosn()
1789" call Dfunc("NetSaveWordPosn()")
1790 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
1791" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
1792endfun
1793
1794" ---------------------------------------------------------------------
1795" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above
1796fun! s:NetRestoreWordPosn()
1797" call Dfunc("NetRestoreWordPosn()")
1798 silent! call search(s:netrw_saveword,'w')
1799" call Dret("NetRestoreWordPosn")
1800endfun
1801
1802" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001803" NetMakeDir: this function makes a directory (both local and remote)
1804fun! <SID>NetMakeDir(usrhost)
1805" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
1806
1807 " get name of new directory from user. A bare <CR> will skip.
1808 " if its currently a directory, also request will be skipped, but with
1809 " a message.
1810 call inputsave()
1811 let newdirname= input("Please give directory name: ")
1812 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001813" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001814
1815 if newdirname == ""
1816" call Dret("NetMakeDir : user aborted with bare <cr>")
1817 return
1818 endif
1819
1820 if a:usrhost == ""
1821
1822 " Local mkdir:
1823 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001824 let fullnewdir= b:netrw_curdir.'/'.newdirname
1825" call Decho("fullnewdir<".fullnewdir.">")
1826 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001827 if !exists("g:netrw_quiet")
1828 echoerr "***warning*** <".newdirname."> is already a directory!"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001829 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001830 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001831" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
1832 return
1833 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001834 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001835 if !exists("g:netrw_quiet")
1836 echoerr "***warning*** <".newdirname."> is already a file!"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001837 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001838 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001839" call Dret("NetMakeDir : file<".newdirname."> exists previously")
1840 return
1841 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001842 let netrw_origdir= s:NetGetcwd(1)
1843 exe 'cd '.b:netrw_curdir
1844" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
1845" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
1846 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
1847 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
1848
Bram Moolenaar8299df92004-07-10 09:47:34 +00001849 if v:shell_error == 0
1850 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001851" call Decho("refresh listing")
1852 let linenum= line(".")
1853 norm! H0
1854 let hline = line(".")
1855 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
1856 exe "norm! ".hline."G0z\<CR>"
1857 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001858 elseif !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001859 echoerr "***warning*** unable to make directory<".newdirname.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001860 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001861 endif
1862 redraw!
1863
1864 else
1865 " Remote mkdir:
1866 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001867 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00001868" call Decho("exe silent! !".mkdircmd." ".newdirname)
1869 exe "silent! !".mkdircmd." ".newdirname
1870 if v:shell_error == 0
1871 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001872 let linenum= line(".")
1873 norm! H0
1874 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001875 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001876 exe "norm! ".hline."G0z\<CR>"
1877 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001878 elseif !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001879 echoerr "***warning*** unable to make directory<".newdirname.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001880 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001881 endif
1882 redraw!
1883 endif
1884
1885" call Dret("NetMakeDir")
1886endfun
1887
1888" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001889" NetBookmarkDir:
1890" 0: bookmark the current directory
1891" 1: change to the bookmarked directory
1892fun! <SID>NetBookmarkDir(chg,curdir)
1893" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
1894
1895 if a:chg == 0
1896 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001897 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
1898 if !exists("g:NETRW_BOOKMARKMAX")
1899 let g:NETRW_BOOKMARKMAX= v:count
1900 elseif v:count > g:NETRW_BOOKMARKMAX
1901 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001902 endif
1903
1904 elseif a:chg == 1
1905 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001906 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
1907 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001908 else
1909 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
1910 endif
1911
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001912 elseif a:chg == 2
1913 if exists("g:NETRW_BOOKMARKMAX")
1914 " list user's bookmarks
1915" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
1916 let cnt= 0
1917 while cnt <= g:NETRW_BOOKMARKMAX
1918 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
1919" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
1920 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
1921 endif
1922 let cnt= cnt + 1
1923 endwhile
1924 endif
1925
1926 " list directory history
1927 let cnt = g:NETRW_DIRHIST_CNT
1928 let first = 1
1929 let histcnt = 0
1930 while ( first || cnt != g:NETRW_DIRHIST_CNT )
1931" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
1932 let histcnt= histcnt + 1
1933 if exists("g:NETRW_DIRHIST_{cnt}")
1934" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
1935 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001936 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001937 let first = 0
1938 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
1939 if cnt < 0
1940 let cnt= cnt + g:netrw_dirhistmax
1941 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001942 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001943
1944 elseif a:chg == 3
1945 " saves most recently visited directories
1946 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1947 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
1948" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1949
1950 elseif a:chg == 4
1951 " u: change to the previous directory stored on the history list
1952 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1953 if g:NETRW_DIRHIST_CNT < 0
1954 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1955 endif
1956 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1957" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1958 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
1959 else
1960 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1961 echo "Sorry, no predecessor directory exists yet"
1962 endif
1963
1964 elseif a:chg == 5
1965 " U: change to the subsequent directory stored on the history list
1966 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1967 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1968" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1969 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
1970 else
1971 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1972 if g:NETRW_DIRHIST_CNT < 0
1973 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1974 endif
1975 echo "Sorry, no successor directory exists yet"
1976 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001977 endif
1978" call Dret("NetBookmarkDir")
1979endfun
1980
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001981" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001982" Browsing Support For Local Directories And Files: {{{1
1983
1984" ---------------------------------------------------------------------
1985" LocalBrowse: supports local file/directory browsing {{{2
1986fun! <SID>LocalBrowse(dirname)
1987
1988" let dirname= (a:dirname == "")? expand("%:p") : a:dirname
1989 if !isdirectory(a:dirname)
1990 " not a directory, ignore it
1991 return
1992 endif
1993
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001994 " unfortunate interaction -- when putting debugging calls
1995 " above one can no longer enter the DBG buffer.
1996" call Dfunc("LocalBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr())
1997" call Decho("winbufnr1=".winbufnr(1)." winbufnr2=".winbufnr(2)." winbufnr3=".winbufnr(3))
1998" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001999
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002000 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002001 if !exists("g:netrw_quiet")
2002 echoerr "vim version<".v:version."> too old for browsing with netrw"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002003 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002004 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002005" call Dret("LocalBrowse : vim version<".v:version."> too old")
2006 return
2007 endif
2008
2009 " record and change current directory
2010 let netrw_origdir= s:NetGetcwd(1)
2011 exe 'cd '.escape(substitute(a:dirname,'\\','/','ge'),s:netrw_cd_escape)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002012" call Decho("dirname<".a:dirname."> buf#".bufnr("%")." winnr=".winnr())
Bram Moolenaar8299df92004-07-10 09:47:34 +00002013
2014 " make this buffer modifiable
2015 setlocal ma
2016
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002017 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002018 " Perform Directory Listing:
2019" call Decho("Perform directory listing...")
2020 " set up new buffer and map
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002021 " dirname : current working directory, no escapes, has trailing /
2022 " dirnamens : dirname, but with no trailing slash
2023 " dirnamenr : buffer number containing dirnamens
2024 " dirnamebuf: buffer's idea of dirname, with all \ -> /
2025 let dirname = s:NetGetcwd(0)
2026 let dirnamens = substitute(dirname,'[\/]$','','e')
2027 let dirnamenr = bufnr(dirnamens.'$')
2028 let dirnamebuf = substitute(bufname(dirnamenr),'\\','/','ge')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002029" call Decho("dirnamenr= bufnr(".dirnamens.")=".dirnamenr." bufname(".dirnamenr.")=".bufname(dirnamenr))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002030
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002031 if dirnamenr != 0 && dirnamebuf != dirnamens
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002032 " try keeping the trailing slash
2033 let dirnamenr = bufnr(dirname.'$')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002034" call Decho("dirnamenr= bufnr(".dirname.")=".dirnamenr." bufname(".dirnamenr.")=".bufname(dirnamenr)." (retry with /)")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002035 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002036
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002037 if dirnamenr != -1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002038 " buffer already exists (hidden), so switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002039" call Decho("buffer already exists: dirnamenr=".dirnamenr." dirname<".dirname."> pre-exists")
2040" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002041 exe "b ".dirnamenr
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002042 exe 'silent! cd '.escape(dirname,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002043" call Decho("changed directory to<".dirname.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002044 if a:dirname != "." && line("$") >= 5 && exists("b:netrw_curdir")
2045 if b:netrw_curdir == dirname
2046" call Dret("LocalBrowse : buffer already exists with info, #".dirnamenr)
2047 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
2048 return
2049 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002050 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002051" call Decho("buffer already exists, but needs re-listing (buf#".dirnamenr.")")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002052" call Decho("buffer name<".bufname("%")."> dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002053 setlocal ma
Bram Moolenaar8299df92004-07-10 09:47:34 +00002054 keepjumps %d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002055 let curdir= substitute(substitute(expand("%"),'\\','/','ge'),'[^/]$','&/','e')
2056 if curdir != dirname
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002057 " set standard browser options on buffer
2058 setlocal bt=nofile bh=hide nobl noswf
2059 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002060 exe 'silent file '.escape(dirname,s:netrw_cd_escape)
2061" call Decho("errmsg1<".v:errmsg.">")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002062" call Decho("renamed buffer to<".escape(dirname,s:netrw_cd_escape).">")
2063" call Decho("yielding actual bufname<".bufname("%").">")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002064 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002065 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002066" call Decho("generate new buffer named<".escape(dirname,' #').">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002067 silent! enew!
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002068 " set standard browser options on buffer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002069 setlocal bt=nofile bh=hide nobl noswf nonu
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002070 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002071 exe 'silent file '.substitute(escape(dirname,s:netrw_cd_escape),'[\/]$','','e')
2072" call Decho("errmsg2<".v:errmsg.">")
2073" call Decho("renamed buffer to<".substitute(escape(dirname,s:netrw_cd_escape),'[\/]$','','e').">")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002074" call Decho("yielding actual bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002075 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002076 if bufname("#") == "" && bufnr("#") != -1
2077 " the file command produces a lot of [No File] buffers
2078" call Decho("wiping out nofile buffer#".bufnr("#"))
2079 exe bufnr("#")."bwipe"
2080 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002081
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002082 " save current directory on directory history list
2083 call <SID>NetBookmarkDir(3,s:NetGetcwd(0))
2084
Bram Moolenaar8299df92004-07-10 09:47:34 +00002085 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002086" call Decho("Setting up local browser maps")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002087 let b:netrw_curdir= s:NetGetcwd(1)
2088 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2089 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
2090 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002091 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 +00002092 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2093 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2094 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2095 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2096 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002097 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002098 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>
2099 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 +00002100 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
2101 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>
2102 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>
2103 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002104 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2105 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002106 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 +00002107 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)<cr>
2108 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2109 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2110 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2111 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2112 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2113 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
2114 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002115 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002116 nnoremap <buffer> ? :he netrw-dir<cr>
2117
2118 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002119" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002120 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002121 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002122 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002123 keepjumps put ='\" '.dirname
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002124 let s:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002125
2126 let sortby= g:netrw_sort_by
2127 if g:netrw_sort_direction =~ "^r"
2128 let sortby= sortby." reversed"
2129 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002130
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002131 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002132 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002133" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002134 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002135 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002136 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002137 let s:netrw_bannercnt= s:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002138 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002139" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002140 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002141 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002142 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002143 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002144
2145 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002146 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002147 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002148 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002149 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002150 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002151 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002152 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002153 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002154 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2155 keepjumps put ='\" ============================================================================'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002156 let s:netrw_bannercnt= s:netrw_bannercnt + 2
2157
2158 " bannercnt should index the line just after the banner
2159 let s:netrw_bannercnt= s:netrw_bannercnt + 1
2160" call Decho("bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002161
2162 " generate the requested directory listing
2163 call LocalBrowseList(dirname)
2164
2165 " manipulate the directory listing (hide, sort)
2166 setlocal ft=netrwlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002167 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002168 if g:netrw_hide && g:netrw_list_hide != ""
2169 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002170 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002171 if line("$") >= s:netrw_bannercnt
2172 if g:netrw_sort_by =~ "^n"
2173 call s:SetSort()
2174 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
2175 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
2176 else
2177 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
2178 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{-}\///e'
2179 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002180 endif
2181 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002182 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00002183
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002184 setlocal noma nomod nonu
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002185 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002186
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002187" call Dret("LocalBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002188endfun
2189
2190" ---------------------------------------------------------------------
2191" LocalBrowseList: does the job of "ls" for local directories {{{2
2192fun! LocalBrowseList(dirname)
2193" call Dfunc("LocalBrowseList(dirname<".a:dirname.">)")
2194
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002195 " get the list of files contained in the current directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002196 let dirname = escape(a:dirname,s:netrw_glob_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002197 let dirnamelen = strlen(a:dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002198 let filelist = glob(dirname."*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002199" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002200 if filelist != ""
2201 let filelist= filelist."\n"
2202 endif
2203 let filelist= filelist.glob(dirname.".*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002204" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2205
2206 " if the directory name includes a "$", and possibly other characters,
2207 " the glob() doesn't include "." and ".." entries.
2208 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2209" call Decho("forcibly tacking on .")
2210 if filelist == ""
2211 let filelist= dirname."."
2212 else
2213 let filelist= filelist."\n".a:dirname."."
2214 endif
2215" call Decho("filelist<".filelist.">")
2216 endif
2217 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2218" call Decho("forcibly tacking on ..")
2219 let filelist= filelist."\n".a:dirname.".."
2220" call Decho("filelist<".filelist.">")
2221 endif
2222 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
2223
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002224" call Decho("dirname<".dirname.">")
2225" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002226" call Decho("filelist<".filelist.">")
2227
2228 while filelist != ""
2229 if filelist =~ '\n'
2230 let file = substitute(filelist,'\n.*$','','e')
2231 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2232 else
2233 let file = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002234 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00002235 endif
2236 let pfile= file
2237 if isdirectory(file)
2238 let pfile= file."/"
2239 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002240 if pfile =~ '//$'
2241 let pfile= substitute(pfile,'//$','/','e')
2242 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002243 let pfile= strpart(pfile,dirnamelen)
2244 if g:netrw_longlist
Bram Moolenaar269ec652004-07-29 08:43:53 +00002245 let sz = getfsize(file)
2246 let fsz = strpart(" ",1,15-strlen(sz)).sz
2247 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(file))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002248 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002249
Bram Moolenaar8299df92004-07-10 09:47:34 +00002250 if g:netrw_sort_by =~ "^t"
2251 " sort by time (handles time up to 1 quintillion seconds, US)
2252" call Decho("getftime(".file.")=".getftime(file))
2253 let t = getftime(file)
2254 let ft = strpart("000000000000000000",1,18-strlen(t)).t
2255" call Decho("exe keepjumps put ='".ft.'/'.file."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002256 let ftpfile= ft.'/'.pfile
2257 keepjumps put=ftpfile
2258
Bram Moolenaar8299df92004-07-10 09:47:34 +00002259 elseif g:netrw_sort_by =~ "^s"
2260 " sort by size (handles file sizes up to 1 quintillion bytes, US)
2261" call Decho("getfsize(".file.")=".getfsize(file))
2262 let sz = getfsize(file)
2263 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
2264" call Decho("exe keepjumps put ='".fsz.'/'.file."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002265 let fszpfile= fsz.'/'.pfile
2266 keepjumps put =fszpfile
2267
Bram Moolenaar8299df92004-07-10 09:47:34 +00002268 else
2269 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002270" call Decho("exe keepjumps put ='".pfile."'")
2271 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002272 endif
2273 endwhile
2274
2275" call Dret("LocalBrowseList")
2276endfun
2277
2278" ---------------------------------------------------------------------
2279" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2280" directory and a new directory name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002281fun! <SID>LocalBrowseChgDir(dirname,newdir,...)
2282" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002283
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002284 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002285 let newdir = a:newdir
2286
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002287 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002288 " apparently vim is "recognizing" that it is in the home directory and
2289 " is removing the "/". Bad idea, so I have to put it back.
2290 let dirname= dirname.'/'
2291" call Decho("adjusting dirname<".dirname.">")
2292 endif
2293
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002294 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002295 " handling a file
2296 let dirname= dirname.newdir
2297" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002298 " this lets NetBrowseX avoid the edit
2299 if a:0 < 1
2300 exe "e ".escape(dirname,s:netrw_cd_escape)
2301 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002302
2303 elseif newdir == './'
2304 " refresh the directory list
2305" call Decho("refresh directory listing")
2306 setlocal ma
2307 %d
2308
2309 elseif newdir == '../'
2310 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002311 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002312" call Decho("go up one dir: dirname<".dirname.">")
2313
2314 else
2315 " go down one directory
2316 let dirname= dirname.newdir
2317" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2318 endif
2319
2320" call Dret("LocalBrowseChgDir <".dirname.">")
2321 return dirname
2322endfun
2323
2324" ---------------------------------------------------------------------
2325" LocalBrowseRm:
2326fun! <SID>LocalBrowseRm(path) range
2327" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2328" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2329
2330 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002331 let ctr = a:firstline
2332 let ret = 0
2333 let netrw_origdir = s:NetGetcwd(1)
2334 exe 'cd '.b:netrw_curdir
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002335 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002336
2337 " remove multiple files and directories
2338 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002339 exe "keepjumps ".ctr
2340
2341 " sanity checks
2342 if line(".") < s:netrw_bannercnt
2343 let ctr= ctr + 1
2344 continue
2345 endif
2346 let curword= s:NetGetWord()
2347 if curword == "./" || curword == "../"
2348 let ctr= ctr + 1
2349 continue
2350 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002351
2352 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002353 let rmfile= a:path.curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002354" call Decho("rmfile<".rmfile.">")
2355
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002356 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002357 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002358 if !all
2359 echohl Statement
2360 call inputsave()
2361 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2362 call inputrestore()
2363 echohl NONE
2364 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2365 if ok =~ 'a\%[ll]'
2366 let all= 1
2367 endif
2368 endif
2369
2370 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002371 let ret= delete(rmfile)
2372" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002373 elseif ok =~ 'q\%[uit]'
2374 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002375 endif
2376
2377 else
2378 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002379 if !all
2380 echohl Statement
2381 call inputsave()
2382 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2383 call inputrestore()
2384 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2385 if ok =~ 'a\%[ll]'
2386 let all= 1
2387 endif
2388 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002389 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002390
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002391 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002392" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2393 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002394" call Decho("v:shell_error=".v:shell_error)
2395
2396 if v:shell_error != 0
2397" call Decho("2nd attempt to remove directory<".rmfile.">")
2398 let errcode= delete(rmfile)
2399" call Decho("errcode=".errcode)
2400
2401 if errcode != 0
2402 if has("unix")
2403" call Decho("3rd attempt to remove directory<".rmfile.">")
2404 call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002405 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002406 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002407 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002408 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002409 elseif !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002410 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002411 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002412 endif
2413 endif
2414 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002415
2416 elseif ok =~ 'q\%[uit]'
2417 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002418 endif
2419 endif
2420
2421 let ctr= ctr + 1
2422 endwhile
2423
2424 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002425 let curline= line(".")
2426 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002427" call Decho("refresh the directory")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002428 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002429 exe curline
2430
2431" call Dret("LocalBrowseRm")
2432endfun
2433
2434" ---------------------------------------------------------------------
2435" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00002436fun! <SID>LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002437" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2438
2439 " preparation for removing multiple files/directories
2440 let ctr= a:firstline
2441
2442 " attempt to rename files/directories
2443 while ctr <= a:lastline
2444 exe "keepjumps ".ctr
2445
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002446 " sanity checks
2447 if line(".") < s:netrw_bannercnt
2448 let ctr= ctr + 1
2449 continue
2450 endif
2451 let curword= s:NetGetWord()
2452 if curword == "./" || curword == "../"
2453 let ctr= ctr + 1
2454 continue
2455 endif
2456
Bram Moolenaar8299df92004-07-10 09:47:34 +00002457 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002458 let oldname= a:path.curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002459" call Decho("oldname<".oldname.">")
2460
2461 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002462 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002463 call inputrestore()
2464
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002465 let ret= system(g:netrw_local_rename.' "'.oldname.'" "'.newname.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002466" call Decho("executing system(".g:netrw_local_rename." ".oldname." ".newname)
2467
2468 let ctr= ctr + 1
2469 endwhile
2470
2471 " refresh the directory
2472 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002473" call Decho("refresh the directory listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002474 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002475 exe "keepjumps ".curline
2476" call Dret("LocalBrowseRename")
2477endfun
2478
2479" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002480" LocalPreview: {{{2
2481fun! <SID>LocalPreview(path) range
2482" call Dfunc("LocalPreview(path<".a:path.">)")
2483 if has("quickfix")
2484 if !isdirectory(a:path)
2485 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002486 elseif !exists("g:netrw_quiet")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002487 echoerr "sorry, cannot preview a directory such as <".a:path.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002488 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002489 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002490 elseif !exists("g:netrw_quiet")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002491 echoerr "sorry, to preview your vim needs the quickfix feature compiled in"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002492 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002493 endif
2494" call Dret("LocalPreview")
2495endfun
2496
2497" ---------------------------------------------------------------------
2498" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002499" Change backslashes to forward slashes, if any.
2500" If doesc is true, escape certain troublesome characters
2501fun! <SID>NetGetcwd(doesc)
2502" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
2503 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002504 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002505 let curdir= curdir.'/'
2506 endif
2507 if a:doesc
2508 let curdir= escape(curdir,s:netrw_cd_escape)
2509 endif
2510" call Dret("NetGetcwd <".curdir.">")
2511 return curdir
2512endfun
2513
2514" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00002515" NetMethod: determine method of transfer {{{1
2516" method == 1: rcp
2517" 2: ftp + <.netrc>
2518" 3: ftp + machine, id, password, and [path]filename
2519" 4: scp
2520" 5: http (wget)
2521" 6: cadaver
2522" 7: rsync
2523" 8: fetch
2524" 9: sftp
2525fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002526" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002527
2528 " initialization
2529 let b:netrw_method = 0
2530 let g:netrw_machine = ""
2531 let b:netrw_fname = ""
2532 let g:netrw_port = ""
2533
2534 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002535 " mipf : a:machine a:id password filename Use ftp
2536 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002537 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002538 " rcpurm : rcp://[user@]host/filename Use rcp
2539 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002540 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002541 " httpurm : http://[user@]host/filename Use wget
2542 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002543 " rsyncurm : rsync://host[:port]/path Use rsync
2544 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2545 " sftpurm : sftp://[user@]host/filename Use scp
2546 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2547 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
2548 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2549 let rcpurm = '^rcp://\(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
2550 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
2551 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2552 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002553 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002554 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
2555 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2556 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
2557
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002558" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002559 " Determine Method
2560 " rcp://user@hostname/...path-to-file
2561 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002562" call Decho("rcp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002563 let b:netrw_method = 1
2564 let userid = substitute(a:choice,rcpurm,'\2',"")
2565 let g:netrw_machine= substitute(a:choice,rcpurm,'\3',"")
2566 let b:netrw_fname = substitute(a:choice,rcpurm,'\4',"")
2567 if userid != ""
2568 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002569 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002570
2571 " scp://user@hostname/...path-to-file
2572 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002573" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002574 let b:netrw_method = 4
2575 let g:netrw_machine= substitute(a:choice,scpurm,'\1',"")
Bram Moolenaar81695252004-12-29 20:58:21 +00002576 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002577 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
2578
2579 " http://user@hostname/...path-to-file
2580 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002581" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002582 let b:netrw_method = 5
2583 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2584 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
2585
2586 " dav://hostname[:port]/..path-to-file..
2587 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002588" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002589 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002590 if a:choice =~ '^s'
2591 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2592 else
2593 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2594 endif
2595 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002596
2597 " rsync://user@hostname/...path-to-file
2598 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002599" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002600 let b:netrw_method = 7
2601 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2602 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
2603
2604 " ftp://[user@]hostname[[:#]port]/...path-to-file
2605 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002606" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002607 let userid = substitute(a:choice,ftpurm,'\2',"")
2608 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2609 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2610 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002611 if userid != ""
2612 let g:netrw_uid= userid
2613 endif
2614 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2615 let b:netrw_method = 3
2616 else
2617 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
2618 let b:netrw_method= 2
2619 else
2620 if !exists("g:netrw_uid") || g:netrw_uid == ""
2621 call NetUserPass()
2622 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
2623 call NetUserPass(g:netrw_uid)
2624 " else just use current g:netrw_uid and g:netrw_passwd
2625 endif
2626 let b:netrw_method= 3
2627 endif
2628 endif
2629
2630 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002631" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002632 let b:netrw_method = 8
2633 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
2634 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
2635 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
2636 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
2637
2638 " Issue an ftp : "machine id password [path/]filename"
2639 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002640" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002641 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002642 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
2643 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
2644 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
2645 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
2646
2647 " Issue an ftp: "hostname [path/]filename"
2648 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002649" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002650 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2651 let b:netrw_method = 3
2652 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2653 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2654
2655 elseif filereadable(expand("$HOME/.netrc"))
2656 let b:netrw_method = 2
2657 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2658 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2659 endif
2660
2661 " sftp://user@hostname/...path-to-file
2662 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002663" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002664 let b:netrw_method = 9
2665 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
2666 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
2667
2668 " Issue an rcp: hostname:filename" (this one should be last)
2669 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002670" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002671 let b:netrw_method = 1
2672 let userid = substitute(a:choice,rcphf,'\2',"")
2673 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
2674 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002675" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
2676" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
2677" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
2678" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002679 if userid != ""
2680 let g:netrw_uid= userid
2681 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002682 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002683 " don't let PCs try <.netrc>
2684 let b:netrw_method = 3
2685 endif
2686
2687 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002688 if !exists("g:netrw_quiet")
2689 echoerr "***error*** cannot determine method"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002690 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002691 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002692 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002693 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00002694
2695 " remove any leading [:#] from port number
2696 if g:netrw_port != ""
2697 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
2698 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002699
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002700" call Decho("a:choice <".a:choice.">")
2701" call Decho("b:netrw_method <".b:netrw_method.">")
2702" call Decho("g:netrw_machine<".g:netrw_machine.">")
2703" call Decho("g:netrw_port <".g:netrw_port.">")
2704" if exists("g:netrw_uid") "Decho
2705" call Decho("g:netrw_uid <".g:netrw_uid.">")
2706" endif "Decho
2707" if exists("g:netrw_passwd") "Decho
2708" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
2709" endif "Decho
2710" call Decho("b:netrw_fname <".b:netrw_fname.">")
2711" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002712endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002713
2714" ------------------------------------------------------------------------
2715" NetUserPass: set username and password for subsequent ftp transfer {{{1
2716" Usage: :call NetUserPass() -- will prompt for userid and password
2717" :call NetUserPass("uid") -- will prompt for password
2718" :call NetUserPass("uid","password") -- sets global userid and password
2719fun! NetUserPass(...)
2720
2721 " get/set userid
2722 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002723" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002724 if !exists("g:netrw_uid") || g:netrw_uid == ""
2725 " via prompt
2726 let g:netrw_uid= input('Enter username: ')
2727 endif
2728 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002729" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002730 let g:netrw_uid= a:1
2731 endif
2732
2733 " get password
2734 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002735" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002736 let g:netrw_passwd= inputsecret("Enter Password: ")
2737 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002738" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002739 let g:netrw_passwd=a:2
2740 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002741" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002742endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002743
2744" ------------------------------------------------------------------------
2745" NetOptionSave: save options and set to "standard" form {{{1
2746fun!s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002747" call Dfunc("NetOptionSave()")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002748
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002749 " Get Temporary Filename
2750 let s:aikeep = &ai
2751 let s:cinkeep = &cin
2752 let s:cinokeep = &cino
2753 let s:comkeep = &com
2754 let s:cpokeep = &cpo
2755 let s:dirkeep = getcwd()
2756 let s:gdkeep = &gd
2757 let s:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00002758 setlocal cino =
2759 setlocal com =
2760 setlocal cpo -=aA
2761 setlocal nocin noai
2762 setlocal tw =0
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002763 if has("win32") && !has("win95")
2764 let s:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00002765 setlocal noswf
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002766" call Decho("setting s:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002767 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002768
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002769" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002770endfun
2771
2772" ------------------------------------------------------------------------
2773" NetOptionRestore: restore options {{{1
2774fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002775" call Dfunc("NetOptionRestore()")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002776
2777 let &ai = s:aikeep
2778 let &cin = s:cinkeep
2779 let &cino = s:cinokeep
2780 let &com = s:comkeep
2781 let &cpo = s:cpokeep
2782 exe "lcd ".s:dirkeep
2783 let &gd = s:gdkeep
2784 let &tw = s:twkeep
2785 if exists("s:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002786 if &directory == ""
2787 " user hasn't specified a swapfile directory;
2788 " netrw will temporarily make the swapfile
2789 " directory the current local one.
2790 let &directory = getcwd()
2791 silent! let &swf = s:swfkeep
2792 set directory=
2793 else
2794 let &swf= s:swfkeep
2795 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002796 unlet s:swfkeep
2797 endif
2798 unlet s:aikeep
2799 unlet s:cinkeep
2800 unlet s:cinokeep
2801 unlet s:comkeep
2802 unlet s:cpokeep
2803 unlet s:gdkeep
2804 unlet s:twkeep
2805 unlet s:dirkeep
2806
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002807" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002808endfun
2809
2810" ------------------------------------------------------------------------
2811" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002812" to handle extra junk that their system's ftp dumps
2813" into the transfer. This function is provided as an
2814" example and as a fix for a Windows 95 problem: in my
2815" experience, win95's ftp always dumped four blank lines
2816" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002817if has("win95") && g:netrw_win95ftp
2818 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002819" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002820 if method == 3 " ftp (no <.netrc>)
2821 let fourblanklines= line2 - 3
2822 silent fourblanklines.",".line2."g/^\s*/d"
2823 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002824" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002825 endfun
2826endif
2827
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002828" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002829" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002830fun! <SID>NetSort() range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002831" call Dfunc("NetSort()")
2832
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002833 let i = a:firstline + 1
2834 while i <= a:lastline
2835 " find insertion point via binary search
2836 let i_val = getline(i)
2837 let lo = a:firstline
2838 let hi = i
2839 while lo < hi
2840 let mid = (lo + hi) / 2
2841 let mid_val = getline(mid)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002842 if g:netrw_sort_direction =~ '^n'
2843 " normal sorting order
2844 if i_val < mid_val
2845 let hi = mid
2846 else
2847 let lo = mid + 1
2848 if i_val == mid_val | break | endif
2849 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002850 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002851 " reverse sorting order
2852 if i_val > mid_val
2853 let hi = mid
2854 else
2855 let lo = mid + 1
2856 if i_val == mid_val | break | endif
2857 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002858 endif
2859 endwhile
2860 " do insert
2861 if lo < i
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002862 exe 'keepjumps '.i.'d_'
2863 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002864 endif
2865 let i = i + 1
2866 endwhile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002867
2868" call Dret("NetSort")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002869endfun
2870
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002871" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002872" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
2873" What this function does is to compute a priority for the patterns
2874" in the g:netrw_sort_sequence. It applies a substitute to any
2875" "files" that satisfy each pattern, putting the priority / in
2876" front. An "*" pattern handles the default priority.
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002877fun! <SID>SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002878" call Dfunc("SetSort() bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002879 if g:netrw_longlist
2880 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
2881 else
2882 let seqlist = g:netrw_sort_sequence
2883 endif
2884 " sanity check -- insure that * appears somewhere
2885 if seqlist == ""
2886 let seqlist= '*'
2887 elseif seqlist !~ '\*'
2888 let seqlist= seqlist.',*'
2889 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002890 let priority = 1
2891 while seqlist != ""
2892 if seqlist =~ ','
2893 let seq = substitute(seqlist,',.*$','','e')
2894 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
2895 else
2896 let seq = seqlist
2897 let seqlist = ""
2898 endif
2899 let eseq= escape(seq,'/')
2900 if priority < 10
2901 let spriority= "00".priority.'\/'
2902 elseif priority < 100
2903 let spriority= "0".priority.'\/'
2904 else
2905 let spriority= priority.'\/'
2906 endif
2907" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
2908
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002909 " sanity check
2910 if s:netrw_bannercnt > line("$")
2911 " apparently no files were left after a Hiding pattern was used
2912" call Dret("SetSort : no files left after hiding")
2913 return
2914 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002915 if seq == '*'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002916 exe 'keepjumps silent '.s:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002917 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002918 exe 'keepjumps silent '.s:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002919 endif
2920 let priority = priority + 1
2921 endwhile
2922
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002923 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002924
2925" call Dret("SetSort")
2926endfun
2927
Bram Moolenaar071d4272004-06-13 20:20:40 +00002928" ------------------------------------------------------------------------
2929" Restore {{{1
2930let &cpo= s:save_cpo
2931unlet s:save_cpo
2932" vim:ts=8 fdm=marker