blob: f1da4b072c15e3375dd8997f7ee4300984a09ebc [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 Moolenaard8c00872005-07-22 21:52:15 +00001842" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.fullnewdir.'"')
1843 exe "silent! !".g:netrw_local_mkdir.' "'.fullnewdir.'"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001844
Bram Moolenaar8299df92004-07-10 09:47:34 +00001845 if v:shell_error == 0
1846 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001847" call Decho("refresh listing")
1848 let linenum= line(".")
1849 norm! H0
1850 let hline = line(".")
1851 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
1852 exe "norm! ".hline."G0z\<CR>"
1853 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001854 elseif !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001855 echoerr "***warning*** unable to make directory<".newdirname.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001856 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001857 endif
1858 redraw!
1859
1860 else
1861 " Remote mkdir:
1862 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001863 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00001864" call Decho("exe silent! !".mkdircmd." ".newdirname)
1865 exe "silent! !".mkdircmd." ".newdirname
1866 if v:shell_error == 0
1867 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001868 let linenum= line(".")
1869 norm! H0
1870 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001871 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001872 exe "norm! ".hline."G0z\<CR>"
1873 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001874 elseif !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001875 echoerr "***warning*** unable to make directory<".newdirname.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001876 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001877 endif
1878 redraw!
1879 endif
1880
1881" call Dret("NetMakeDir")
1882endfun
1883
1884" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001885" NetBookmarkDir:
1886" 0: bookmark the current directory
1887" 1: change to the bookmarked directory
1888fun! <SID>NetBookmarkDir(chg,curdir)
1889" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
1890
1891 if a:chg == 0
1892 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001893 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
1894 if !exists("g:NETRW_BOOKMARKMAX")
1895 let g:NETRW_BOOKMARKMAX= v:count
1896 elseif v:count > g:NETRW_BOOKMARKMAX
1897 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001898 endif
1899
1900 elseif a:chg == 1
1901 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001902 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
1903 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001904 else
1905 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
1906 endif
1907
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001908 elseif a:chg == 2
1909 if exists("g:NETRW_BOOKMARKMAX")
1910 " list user's bookmarks
1911" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
1912 let cnt= 0
1913 while cnt <= g:NETRW_BOOKMARKMAX
1914 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
1915" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
1916 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
1917 endif
1918 let cnt= cnt + 1
1919 endwhile
1920 endif
1921
1922 " list directory history
1923 let cnt = g:NETRW_DIRHIST_CNT
1924 let first = 1
1925 let histcnt = 0
1926 while ( first || cnt != g:NETRW_DIRHIST_CNT )
1927" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
1928 let histcnt= histcnt + 1
1929 if exists("g:NETRW_DIRHIST_{cnt}")
1930" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
1931 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001932 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001933 let first = 0
1934 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
1935 if cnt < 0
1936 let cnt= cnt + g:netrw_dirhistmax
1937 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001938 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001939
1940 elseif a:chg == 3
1941 " saves most recently visited directories
1942 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1943 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
1944" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1945
1946 elseif a:chg == 4
1947 " u: change to the previous directory stored on the history list
1948 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1949 if g:NETRW_DIRHIST_CNT < 0
1950 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1951 endif
1952 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1953" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1954 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
1955 else
1956 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1957 echo "Sorry, no predecessor directory exists yet"
1958 endif
1959
1960 elseif a:chg == 5
1961 " U: change to the subsequent directory stored on the history list
1962 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1963 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1964" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1965 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
1966 else
1967 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1968 if g:NETRW_DIRHIST_CNT < 0
1969 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1970 endif
1971 echo "Sorry, no successor directory exists yet"
1972 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001973 endif
1974" call Dret("NetBookmarkDir")
1975endfun
1976
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001977" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001978" Browsing Support For Local Directories And Files: {{{1
1979
1980" ---------------------------------------------------------------------
1981" LocalBrowse: supports local file/directory browsing {{{2
1982fun! <SID>LocalBrowse(dirname)
1983
1984" let dirname= (a:dirname == "")? expand("%:p") : a:dirname
1985 if !isdirectory(a:dirname)
1986 " not a directory, ignore it
1987 return
1988 endif
1989
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001990 " unfortunate interaction -- when putting debugging calls
1991 " above one can no longer enter the DBG buffer.
1992" call Dfunc("LocalBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr())
1993" call Decho("winbufnr1=".winbufnr(1)." winbufnr2=".winbufnr(2)." winbufnr3=".winbufnr(3))
1994" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001995
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001996 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001997 if !exists("g:netrw_quiet")
1998 echoerr "vim version<".v:version."> too old for browsing with netrw"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001999 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002000 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002001" call Dret("LocalBrowse : vim version<".v:version."> too old")
2002 return
2003 endif
2004
2005 " record and change current directory
2006 let netrw_origdir= s:NetGetcwd(1)
Bram Moolenaard8c00872005-07-22 21:52:15 +00002007 try
2008 cd -
2009 let netrw_altdir= s:NetGetcwd(1)
2010 cd -
2011 catch
2012 let netrw_altdir= ''
2013 endtry
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002014 exe 'cd '.escape(substitute(a:dirname,'\\','/','ge'),s:netrw_cd_escape)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002015" call Decho("dirname<".a:dirname."> buf#".bufnr("%")." winnr=".winnr())
Bram Moolenaar8299df92004-07-10 09:47:34 +00002016
2017 " make this buffer modifiable
2018 setlocal ma
2019
Bram Moolenaard8c00872005-07-22 21:52:15 +00002020 " disable 'autochdir', it breaks things
2021 set noautochdir
2022
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002023 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002024 " Perform Directory Listing:
2025" call Decho("Perform directory listing...")
2026 " set up new buffer and map
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002027 " dirname : current working directory, no escapes, has trailing /
2028 " dirnamens : dirname, but with no trailing slash
2029 " dirnamenr : buffer number containing dirnamens
2030 " dirnamebuf: buffer's idea of dirname, with all \ -> /
2031 let dirname = s:NetGetcwd(0)
2032 let dirnamens = substitute(dirname,'[\/]$','','e')
2033 let dirnamenr = bufnr(dirnamens.'$')
2034 let dirnamebuf = substitute(bufname(dirnamenr),'\\','/','ge')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002035" call Decho("dirnamenr= bufnr(".dirnamens.")=".dirnamenr." bufname(".dirnamenr.")=".bufname(dirnamenr))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002036
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002037 if dirnamenr != 0 && dirnamebuf != dirnamens
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002038 " try keeping the trailing slash
2039 let dirnamenr = bufnr(dirname.'$')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002040" call Decho("dirnamenr= bufnr(".dirname.")=".dirnamenr." bufname(".dirnamenr.")=".bufname(dirnamenr)." (retry with /)")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002041 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002042
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002043 if dirnamenr != -1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002044 " buffer already exists (hidden), so switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002045" call Decho("buffer already exists: dirnamenr=".dirnamenr." dirname<".dirname."> pre-exists")
2046" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002047 exe "b ".dirnamenr
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002048 exe 'silent! cd '.escape(dirname,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002049" call Decho("changed directory to<".dirname.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002050 if a:dirname != "." && line("$") >= 5 && exists("b:netrw_curdir")
2051 if b:netrw_curdir == dirname
2052" call Dret("LocalBrowse : buffer already exists with info, #".dirnamenr)
Bram Moolenaard8c00872005-07-22 21:52:15 +00002053 if g:netrw_keepdir
2054 if netrw_altdir != ''
2055 exe 'keepjumps cd '.netrw_altdir
2056 endif
2057 exe 'keepjumps cd '.netrw_origdir
2058 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002059 return
2060 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002061 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002062" call Decho("buffer already exists, but needs re-listing (buf#".dirnamenr.")")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002063" call Decho("buffer name<".bufname("%")."> dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002064 setlocal ma
Bram Moolenaar8299df92004-07-10 09:47:34 +00002065 keepjumps %d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002066 let curdir= substitute(substitute(expand("%"),'\\','/','ge'),'[^/]$','&/','e')
2067 if curdir != dirname
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002068 " set standard browser options on buffer
2069 setlocal bt=nofile bh=hide nobl noswf
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002070 exe 'silent file '.escape(dirname,s:netrw_cd_escape)
2071" call Decho("errmsg1<".v:errmsg.">")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002072" call Decho("renamed buffer to<".escape(dirname,s:netrw_cd_escape).">")
2073" call Decho("yielding actual bufname<".bufname("%").">")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002074 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002075 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002076" call Decho("generate new buffer named<".escape(dirname,' #').">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002077 silent! enew!
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002078 " set standard browser options on buffer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002079 setlocal bt=nofile bh=hide nobl noswf nonu
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002080 exe 'silent file '.substitute(escape(dirname,s:netrw_cd_escape),'[\/]$','','e')
2081" call Decho("errmsg2<".v:errmsg.">")
2082" call Decho("renamed buffer to<".substitute(escape(dirname,s:netrw_cd_escape),'[\/]$','','e').">")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002083" call Decho("yielding actual bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002084 endif
Bram Moolenaard8c00872005-07-22 21:52:15 +00002085 exe "setlocal ts=".g:netrw_maxfilenamelen
2086
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002087 if bufname("#") == "" && bufnr("#") != -1
2088 " the file command produces a lot of [No File] buffers
2089" call Decho("wiping out nofile buffer#".bufnr("#"))
2090 exe bufnr("#")."bwipe"
2091 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002092
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002093 " save current directory on directory history list
2094 call <SID>NetBookmarkDir(3,s:NetGetcwd(0))
2095
Bram Moolenaar8299df92004-07-10 09:47:34 +00002096 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002097" call Decho("Setting up local browser maps")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002098 let b:netrw_curdir= s:NetGetcwd(1)
2099 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2100 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
2101 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002102 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 +00002103 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2104 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2105 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2106 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2107 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002108 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002109 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>
2110 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 +00002111 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
2112 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>
2113 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>
2114 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002115 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2116 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002117 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 +00002118 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)<cr>
2119 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2120 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2121 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2122 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2123 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2124 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
2125 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002126 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002127 nnoremap <buffer> ? :he netrw-dir<cr>
2128
2129 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002130" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002131 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002132 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002133 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002134 keepjumps put ='\" '.dirname
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002135 let s:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002136
2137 let sortby= g:netrw_sort_by
2138 if g:netrw_sort_direction =~ "^r"
2139 let sortby= sortby." reversed"
2140 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002141
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002142 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002143 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002144" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002145 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002146 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002147 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002148 let s:netrw_bannercnt= s:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002149 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002150" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002151 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002152 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002153 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002154 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002155
2156 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002157 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002158 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002159 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002160 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002161 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002162 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002163 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002164 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002165 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2166 keepjumps put ='\" ============================================================================'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002167 let s:netrw_bannercnt= s:netrw_bannercnt + 2
2168
2169 " bannercnt should index the line just after the banner
2170 let s:netrw_bannercnt= s:netrw_bannercnt + 1
2171" call Decho("bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002172
2173 " generate the requested directory listing
2174 call LocalBrowseList(dirname)
2175
2176 " manipulate the directory listing (hide, sort)
2177 setlocal ft=netrwlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002178 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002179 if g:netrw_hide && g:netrw_list_hide != ""
2180 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002181 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002182 if line("$") >= s:netrw_bannercnt
2183 if g:netrw_sort_by =~ "^n"
2184 call s:SetSort()
2185 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
2186 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
2187 else
2188 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
2189 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{-}\///e'
2190 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002191 endif
2192 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002193 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00002194
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002195 setlocal noma nomod nonu
Bram Moolenaard8c00872005-07-22 21:52:15 +00002196 if g:netrw_keepdir
2197 if netrw_altdir != ''
2198 exe 'keepjumps cd '.netrw_altdir
2199 endif
2200 exe 'keepjumps cd '.netrw_origdir
2201 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002202
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002203" call Dret("LocalBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002204endfun
2205
2206" ---------------------------------------------------------------------
2207" LocalBrowseList: does the job of "ls" for local directories {{{2
2208fun! LocalBrowseList(dirname)
2209" call Dfunc("LocalBrowseList(dirname<".a:dirname.">)")
2210
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002211 " get the list of files contained in the current directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002212 let dirname = escape(a:dirname,s:netrw_glob_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002213 let dirnamelen = strlen(a:dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002214 let filelist = glob(dirname."*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002215" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002216 if filelist != ""
2217 let filelist= filelist."\n"
2218 endif
2219 let filelist= filelist.glob(dirname.".*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002220" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2221
2222 " if the directory name includes a "$", and possibly other characters,
2223 " the glob() doesn't include "." and ".." entries.
2224 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2225" call Decho("forcibly tacking on .")
2226 if filelist == ""
2227 let filelist= dirname."."
2228 else
2229 let filelist= filelist."\n".a:dirname."."
2230 endif
2231" call Decho("filelist<".filelist.">")
2232 endif
2233 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2234" call Decho("forcibly tacking on ..")
2235 let filelist= filelist."\n".a:dirname.".."
2236" call Decho("filelist<".filelist.">")
2237 endif
2238 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
2239
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002240" call Decho("dirname<".dirname.">")
2241" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002242" call Decho("filelist<".filelist.">")
2243
2244 while filelist != ""
2245 if filelist =~ '\n'
2246 let file = substitute(filelist,'\n.*$','','e')
2247 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2248 else
2249 let file = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002250 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00002251 endif
2252 let pfile= file
2253 if isdirectory(file)
2254 let pfile= file."/"
2255 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002256 if pfile =~ '//$'
2257 let pfile= substitute(pfile,'//$','/','e')
2258 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002259 let pfile= strpart(pfile,dirnamelen)
2260 if g:netrw_longlist
Bram Moolenaar269ec652004-07-29 08:43:53 +00002261 let sz = getfsize(file)
2262 let fsz = strpart(" ",1,15-strlen(sz)).sz
2263 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(file))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002264 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002265
Bram Moolenaar8299df92004-07-10 09:47:34 +00002266 if g:netrw_sort_by =~ "^t"
2267 " sort by time (handles time up to 1 quintillion seconds, US)
2268" call Decho("getftime(".file.")=".getftime(file))
2269 let t = getftime(file)
2270 let ft = strpart("000000000000000000",1,18-strlen(t)).t
2271" call Decho("exe keepjumps put ='".ft.'/'.file."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002272 let ftpfile= ft.'/'.pfile
2273 keepjumps put=ftpfile
2274
Bram Moolenaar8299df92004-07-10 09:47:34 +00002275 elseif g:netrw_sort_by =~ "^s"
2276 " sort by size (handles file sizes up to 1 quintillion bytes, US)
2277" call Decho("getfsize(".file.")=".getfsize(file))
2278 let sz = getfsize(file)
2279 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
2280" call Decho("exe keepjumps put ='".fsz.'/'.file."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002281 let fszpfile= fsz.'/'.pfile
2282 keepjumps put =fszpfile
2283
Bram Moolenaar8299df92004-07-10 09:47:34 +00002284 else
2285 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002286" call Decho("exe keepjumps put ='".pfile."'")
2287 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002288 endif
2289 endwhile
2290
2291" call Dret("LocalBrowseList")
2292endfun
2293
2294" ---------------------------------------------------------------------
2295" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2296" directory and a new directory name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002297fun! <SID>LocalBrowseChgDir(dirname,newdir,...)
2298" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002299
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002300 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002301 let newdir = a:newdir
2302
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002303 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002304 " apparently vim is "recognizing" that it is in the home directory and
2305 " is removing the "/". Bad idea, so I have to put it back.
2306 let dirname= dirname.'/'
2307" call Decho("adjusting dirname<".dirname.">")
2308 endif
2309
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002310 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002311 " handling a file
2312 let dirname= dirname.newdir
2313" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002314 " this lets NetBrowseX avoid the edit
2315 if a:0 < 1
2316 exe "e ".escape(dirname,s:netrw_cd_escape)
2317 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002318
2319 elseif newdir == './'
2320 " refresh the directory list
2321" call Decho("refresh directory listing")
2322 setlocal ma
2323 %d
2324
2325 elseif newdir == '../'
2326 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002327 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002328" call Decho("go up one dir: dirname<".dirname.">")
2329
2330 else
2331 " go down one directory
2332 let dirname= dirname.newdir
2333" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2334 endif
2335
2336" call Dret("LocalBrowseChgDir <".dirname.">")
2337 return dirname
2338endfun
2339
2340" ---------------------------------------------------------------------
2341" LocalBrowseRm:
2342fun! <SID>LocalBrowseRm(path) range
2343" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2344" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2345
2346 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002347 let ctr = a:firstline
2348 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002349 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002350
2351 " remove multiple files and directories
2352 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002353 exe "keepjumps ".ctr
2354
2355 " sanity checks
2356 if line(".") < s:netrw_bannercnt
2357 let ctr= ctr + 1
2358 continue
2359 endif
2360 let curword= s:NetGetWord()
2361 if curword == "./" || curword == "../"
2362 let ctr= ctr + 1
2363 continue
2364 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002365
2366 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002367 let rmfile= a:path.curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002368" call Decho("rmfile<".rmfile.">")
2369
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002370 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002371 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002372 if !all
2373 echohl Statement
2374 call inputsave()
2375 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2376 call inputrestore()
2377 echohl NONE
2378 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2379 if ok =~ 'a\%[ll]'
2380 let all= 1
2381 endif
2382 endif
2383
2384 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002385 let ret= delete(rmfile)
2386" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002387 elseif ok =~ 'q\%[uit]'
2388 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002389 endif
2390
2391 else
2392 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002393 if !all
2394 echohl Statement
2395 call inputsave()
2396 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2397 call inputrestore()
2398 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2399 if ok =~ 'a\%[ll]'
2400 let all= 1
2401 endif
2402 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002403 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002404
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002405 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002406" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2407 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002408" call Decho("v:shell_error=".v:shell_error)
2409
2410 if v:shell_error != 0
2411" call Decho("2nd attempt to remove directory<".rmfile.">")
2412 let errcode= delete(rmfile)
2413" call Decho("errcode=".errcode)
2414
2415 if errcode != 0
2416 if has("unix")
2417" call Decho("3rd attempt to remove directory<".rmfile.">")
2418 call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002419 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002420 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002421 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002422 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002423 elseif !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002424 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002425 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002426 endif
2427 endif
2428 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002429
2430 elseif ok =~ 'q\%[uit]'
2431 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002432 endif
2433 endif
2434
2435 let ctr= ctr + 1
2436 endwhile
2437
2438 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002439 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002440" call Decho("refresh the directory")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002441 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002442 exe curline
2443
2444" call Dret("LocalBrowseRm")
2445endfun
2446
2447" ---------------------------------------------------------------------
2448" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00002449fun! <SID>LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002450" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2451
2452 " preparation for removing multiple files/directories
2453 let ctr= a:firstline
2454
2455 " attempt to rename files/directories
2456 while ctr <= a:lastline
2457 exe "keepjumps ".ctr
2458
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002459 " sanity checks
2460 if line(".") < s:netrw_bannercnt
2461 let ctr= ctr + 1
2462 continue
2463 endif
2464 let curword= s:NetGetWord()
2465 if curword == "./" || curword == "../"
2466 let ctr= ctr + 1
2467 continue
2468 endif
2469
Bram Moolenaar8299df92004-07-10 09:47:34 +00002470 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002471 let oldname= a:path.curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002472" call Decho("oldname<".oldname.">")
2473
2474 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002475 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002476 call inputrestore()
2477
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002478 let ret= system(g:netrw_local_rename.' "'.oldname.'" "'.newname.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002479" call Decho("executing system(".g:netrw_local_rename." ".oldname." ".newname)
2480
2481 let ctr= ctr + 1
2482 endwhile
2483
2484 " refresh the directory
2485 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002486" call Decho("refresh the directory listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002487 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002488 exe "keepjumps ".curline
2489" call Dret("LocalBrowseRename")
2490endfun
2491
2492" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002493" LocalPreview: {{{2
2494fun! <SID>LocalPreview(path) range
2495" call Dfunc("LocalPreview(path<".a:path.">)")
2496 if has("quickfix")
2497 if !isdirectory(a:path)
2498 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002499 elseif !exists("g:netrw_quiet")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002500 echoerr "sorry, cannot preview a directory such as <".a:path.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002501 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002502 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002503 elseif !exists("g:netrw_quiet")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002504 echoerr "sorry, to preview your vim needs the quickfix feature compiled in"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002505 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002506 endif
2507" call Dret("LocalPreview")
2508endfun
2509
2510" ---------------------------------------------------------------------
2511" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002512" Change backslashes to forward slashes, if any.
2513" If doesc is true, escape certain troublesome characters
2514fun! <SID>NetGetcwd(doesc)
2515" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
2516 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002517 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002518 let curdir= curdir.'/'
2519 endif
2520 if a:doesc
2521 let curdir= escape(curdir,s:netrw_cd_escape)
2522 endif
2523" call Dret("NetGetcwd <".curdir.">")
2524 return curdir
2525endfun
2526
2527" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00002528" NetMethod: determine method of transfer {{{1
2529" method == 1: rcp
2530" 2: ftp + <.netrc>
2531" 3: ftp + machine, id, password, and [path]filename
2532" 4: scp
2533" 5: http (wget)
2534" 6: cadaver
2535" 7: rsync
2536" 8: fetch
2537" 9: sftp
2538fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002539" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002540
2541 " initialization
2542 let b:netrw_method = 0
2543 let g:netrw_machine = ""
2544 let b:netrw_fname = ""
2545 let g:netrw_port = ""
2546
2547 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002548 " mipf : a:machine a:id password filename Use ftp
2549 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002550 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002551 " rcpurm : rcp://[user@]host/filename Use rcp
2552 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002553 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002554 " httpurm : http://[user@]host/filename Use wget
2555 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002556 " rsyncurm : rsync://host[:port]/path Use rsync
2557 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2558 " sftpurm : sftp://[user@]host/filename Use scp
2559 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2560 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
2561 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2562 let rcpurm = '^rcp://\(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
2563 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
2564 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2565 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002566 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002567 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
2568 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2569 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
2570
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002571" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002572 " Determine Method
2573 " rcp://user@hostname/...path-to-file
2574 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002575" call Decho("rcp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002576 let b:netrw_method = 1
2577 let userid = substitute(a:choice,rcpurm,'\2',"")
2578 let g:netrw_machine= substitute(a:choice,rcpurm,'\3',"")
2579 let b:netrw_fname = substitute(a:choice,rcpurm,'\4',"")
2580 if userid != ""
2581 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002582 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002583
2584 " scp://user@hostname/...path-to-file
2585 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002586" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002587 let b:netrw_method = 4
2588 let g:netrw_machine= substitute(a:choice,scpurm,'\1',"")
Bram Moolenaar81695252004-12-29 20:58:21 +00002589 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002590 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
2591
2592 " http://user@hostname/...path-to-file
2593 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002594" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002595 let b:netrw_method = 5
2596 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2597 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
2598
2599 " dav://hostname[:port]/..path-to-file..
2600 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002601" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002602 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002603 if a:choice =~ '^s'
2604 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2605 else
2606 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2607 endif
2608 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002609
2610 " rsync://user@hostname/...path-to-file
2611 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002612" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002613 let b:netrw_method = 7
2614 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2615 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
2616
2617 " ftp://[user@]hostname[[:#]port]/...path-to-file
2618 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002619" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002620 let userid = substitute(a:choice,ftpurm,'\2',"")
2621 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2622 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2623 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002624 if userid != ""
2625 let g:netrw_uid= userid
2626 endif
2627 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2628 let b:netrw_method = 3
2629 else
2630 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
2631 let b:netrw_method= 2
2632 else
2633 if !exists("g:netrw_uid") || g:netrw_uid == ""
2634 call NetUserPass()
2635 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
2636 call NetUserPass(g:netrw_uid)
2637 " else just use current g:netrw_uid and g:netrw_passwd
2638 endif
2639 let b:netrw_method= 3
2640 endif
2641 endif
2642
2643 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002644" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002645 let b:netrw_method = 8
2646 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
2647 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
2648 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
2649 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
2650
2651 " Issue an ftp : "machine id password [path/]filename"
2652 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002653" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002654 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002655 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
2656 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
2657 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
2658 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
2659
2660 " Issue an ftp: "hostname [path/]filename"
2661 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002662" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002663 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2664 let b:netrw_method = 3
2665 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2666 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2667
2668 elseif filereadable(expand("$HOME/.netrc"))
2669 let b:netrw_method = 2
2670 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2671 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2672 endif
2673
2674 " sftp://user@hostname/...path-to-file
2675 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002676" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002677 let b:netrw_method = 9
2678 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
2679 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
2680
2681 " Issue an rcp: hostname:filename" (this one should be last)
2682 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002683" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002684 let b:netrw_method = 1
2685 let userid = substitute(a:choice,rcphf,'\2',"")
2686 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
2687 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002688" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
2689" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
2690" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
2691" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002692 if userid != ""
2693 let g:netrw_uid= userid
2694 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002695 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002696 " don't let PCs try <.netrc>
2697 let b:netrw_method = 3
2698 endif
2699
2700 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002701 if !exists("g:netrw_quiet")
2702 echoerr "***error*** cannot determine method"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002703 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002704 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002705 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002706 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00002707
2708 " remove any leading [:#] from port number
2709 if g:netrw_port != ""
2710 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
2711 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002712
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002713" call Decho("a:choice <".a:choice.">")
2714" call Decho("b:netrw_method <".b:netrw_method.">")
2715" call Decho("g:netrw_machine<".g:netrw_machine.">")
2716" call Decho("g:netrw_port <".g:netrw_port.">")
2717" if exists("g:netrw_uid") "Decho
2718" call Decho("g:netrw_uid <".g:netrw_uid.">")
2719" endif "Decho
2720" if exists("g:netrw_passwd") "Decho
2721" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
2722" endif "Decho
2723" call Decho("b:netrw_fname <".b:netrw_fname.">")
2724" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002725endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002726
2727" ------------------------------------------------------------------------
2728" NetUserPass: set username and password for subsequent ftp transfer {{{1
2729" Usage: :call NetUserPass() -- will prompt for userid and password
2730" :call NetUserPass("uid") -- will prompt for password
2731" :call NetUserPass("uid","password") -- sets global userid and password
2732fun! NetUserPass(...)
2733
2734 " get/set userid
2735 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002736" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002737 if !exists("g:netrw_uid") || g:netrw_uid == ""
2738 " via prompt
2739 let g:netrw_uid= input('Enter username: ')
2740 endif
2741 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002742" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002743 let g:netrw_uid= a:1
2744 endif
2745
2746 " get password
2747 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002748" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002749 let g:netrw_passwd= inputsecret("Enter Password: ")
2750 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002751" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002752 let g:netrw_passwd=a:2
2753 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002754" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002755endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002756
2757" ------------------------------------------------------------------------
2758" NetOptionSave: save options and set to "standard" form {{{1
2759fun!s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002760" call Dfunc("NetOptionSave()")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002761
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002762 " Get Temporary Filename
2763 let s:aikeep = &ai
2764 let s:cinkeep = &cin
2765 let s:cinokeep = &cino
2766 let s:comkeep = &com
2767 let s:cpokeep = &cpo
2768 let s:dirkeep = getcwd()
2769 let s:gdkeep = &gd
2770 let s:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00002771 setlocal cino =
2772 setlocal com =
2773 setlocal cpo -=aA
2774 setlocal nocin noai
2775 setlocal tw =0
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002776 if has("win32") && !has("win95")
2777 let s:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00002778 setlocal noswf
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002779" call Decho("setting s:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002780 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002781
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002782" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002783endfun
2784
2785" ------------------------------------------------------------------------
2786" NetOptionRestore: restore options {{{1
2787fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002788" call Dfunc("NetOptionRestore()")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002789
2790 let &ai = s:aikeep
2791 let &cin = s:cinkeep
2792 let &cino = s:cinokeep
2793 let &com = s:comkeep
2794 let &cpo = s:cpokeep
2795 exe "lcd ".s:dirkeep
2796 let &gd = s:gdkeep
2797 let &tw = s:twkeep
2798 if exists("s:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002799 if &directory == ""
2800 " user hasn't specified a swapfile directory;
2801 " netrw will temporarily make the swapfile
2802 " directory the current local one.
2803 let &directory = getcwd()
2804 silent! let &swf = s:swfkeep
2805 set directory=
2806 else
2807 let &swf= s:swfkeep
2808 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002809 unlet s:swfkeep
2810 endif
2811 unlet s:aikeep
2812 unlet s:cinkeep
2813 unlet s:cinokeep
2814 unlet s:comkeep
2815 unlet s:cpokeep
2816 unlet s:gdkeep
2817 unlet s:twkeep
2818 unlet s:dirkeep
2819
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002820" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002821endfun
2822
2823" ------------------------------------------------------------------------
2824" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002825" to handle extra junk that their system's ftp dumps
2826" into the transfer. This function is provided as an
2827" example and as a fix for a Windows 95 problem: in my
2828" experience, win95's ftp always dumped four blank lines
2829" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002830if has("win95") && g:netrw_win95ftp
2831 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002832" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002833 if method == 3 " ftp (no <.netrc>)
2834 let fourblanklines= line2 - 3
2835 silent fourblanklines.",".line2."g/^\s*/d"
2836 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002837" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002838 endfun
2839endif
2840
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002841" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002842" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002843fun! <SID>NetSort() range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002844" call Dfunc("NetSort()")
2845
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002846 let i = a:firstline + 1
2847 while i <= a:lastline
2848 " find insertion point via binary search
2849 let i_val = getline(i)
2850 let lo = a:firstline
2851 let hi = i
2852 while lo < hi
2853 let mid = (lo + hi) / 2
2854 let mid_val = getline(mid)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002855 if g:netrw_sort_direction =~ '^n'
2856 " normal sorting order
2857 if i_val < mid_val
2858 let hi = mid
2859 else
2860 let lo = mid + 1
2861 if i_val == mid_val | break | endif
2862 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002863 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002864 " reverse sorting order
2865 if i_val > mid_val
2866 let hi = mid
2867 else
2868 let lo = mid + 1
2869 if i_val == mid_val | break | endif
2870 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002871 endif
2872 endwhile
2873 " do insert
2874 if lo < i
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002875 exe 'keepjumps '.i.'d_'
2876 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002877 endif
2878 let i = i + 1
2879 endwhile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002880
2881" call Dret("NetSort")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002882endfun
2883
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002884" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002885" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
2886" What this function does is to compute a priority for the patterns
2887" in the g:netrw_sort_sequence. It applies a substitute to any
2888" "files" that satisfy each pattern, putting the priority / in
2889" front. An "*" pattern handles the default priority.
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002890fun! <SID>SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002891" call Dfunc("SetSort() bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002892 if g:netrw_longlist
2893 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
2894 else
2895 let seqlist = g:netrw_sort_sequence
2896 endif
2897 " sanity check -- insure that * appears somewhere
2898 if seqlist == ""
2899 let seqlist= '*'
2900 elseif seqlist !~ '\*'
2901 let seqlist= seqlist.',*'
2902 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002903 let priority = 1
2904 while seqlist != ""
2905 if seqlist =~ ','
2906 let seq = substitute(seqlist,',.*$','','e')
2907 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
2908 else
2909 let seq = seqlist
2910 let seqlist = ""
2911 endif
2912 let eseq= escape(seq,'/')
2913 if priority < 10
2914 let spriority= "00".priority.'\/'
2915 elseif priority < 100
2916 let spriority= "0".priority.'\/'
2917 else
2918 let spriority= priority.'\/'
2919 endif
2920" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
2921
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002922 " sanity check
2923 if s:netrw_bannercnt > line("$")
2924 " apparently no files were left after a Hiding pattern was used
2925" call Dret("SetSort : no files left after hiding")
2926 return
2927 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002928 if seq == '*'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002929 exe 'keepjumps silent '.s:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002930 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002931 exe 'keepjumps silent '.s:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002932 endif
2933 let priority = priority + 1
2934 endwhile
2935
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002936 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002937
2938" call Dret("SetSort")
2939endfun
2940
Bram Moolenaar071d4272004-06-13 20:20:40 +00002941" ------------------------------------------------------------------------
2942" Restore {{{1
2943let &cpo= s:save_cpo
2944unlet s:save_cpo
2945" vim:ts=8 fdm=marker