blob: e4868a3d75904c4b7be0d980180c15cbc6810485 [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002" last change: Dec 06, 2004
3" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
4" Version: 53
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 Moolenaar293ee4d2004-12-09 21:34:53 +000017let g:loaded_netrw = "v53"
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>")
231 au FileReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau BufReadPre ".expand("<afile>")|exe "Nread " .expand("<afile>")|exe "silent doau BufReadPost ".expand("<afile>")
232 au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("<afile>")|exe "Nwrite " .expand("<afile>")|exe "silent doau BufWritePost ".expand("<afile>")
233 au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("<afile>")|exe "'[,']Nwrite " .expand("<afile>")|exe "silent doau BufWritePost ".expand("<afile>")
Bram Moolenaar071d4272004-06-13 20:20:40 +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
265 exe "silent! ".s:netrw_winnr."wincmd w"
266 if v:shell_error == 0
267 " as suggested by Bram M: redraw on no error
268 " allows protocol error messages to remain visible
269 redraw!
270 endif
271 " restore top-of-screen line
272 exe "norm! ".s:netrw_hline."G0z\<CR>"
273 " restore position
274 exe "norm! ".s:netrw_line."G0".s:netrw_col."\<bar>"
275
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000276" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000277endfun
278
279" ------------------------------------------------------------------------
280" NetRead: responsible for reading a file over the net {{{1
281fun! s:NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000282" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000283
284 " save options
285 call s:NetOptionSave()
286
287 " Special Exception: if a file is named "0r", then
288 " "0r" will be used to read the
289 " following files instead of "r"
290 if a:0 == 0
291 let readcmd= "r"
292 let ichoice= 0
293 elseif a:1 == "0r"
294 let readcmd = "0r"
295 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000296 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000297 let readcmd = "r"
298 let ichoice = 1
299 endif
300
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000301 " get name of a temporary file and set up shell-quoting character
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000302 let tmpfile= tempname()
303
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000304" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000305 while ichoice <= a:0
306
307 " attempt to repeat with previous host-file-etc
308 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000309" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000310 let choice = b:netrw_lastfile
311 let ichoice= ichoice + 1
312
313 else
314 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000315" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000316
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000317 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000318 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000319 echomsg 'NetRead Usage:'
320 echomsg ':Nread machine:path uses rcp'
321 echomsg ':Nread "machine path" uses ftp with <.netrc>'
322 echomsg ':Nread "machine id password path" uses ftp'
323 echomsg ':Nread dav://machine[:port]/path uses cadaver'
324 echomsg ':Nread fetch://machine/path uses fetch'
325 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
326 echomsg ':Nread http://[user@]machine/path uses http wget'
327 echomsg ':Nread rcp://[user@]machine/path uses rcp'
328 echomsg ':Nread rsync://machine[:port]/path uses rsync'
329 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
330 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000331 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000332
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000333 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000334 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000335" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000336 if match(choice,"\"$") != -1
337 " case "..."
338 let choice=strpart(choice,1,strlen(choice)-2)
339 else
340 " case "... ... ..."
341 let choice = strpart(choice,1,strlen(choice)-1)
342 let wholechoice = ""
343
344 while match(choice,"\"$") == -1
345 let wholechoice = wholechoice . " " . choice
346 let ichoice = ichoice + 1
347 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000348 if !exists("g:netrw_quiet")
349 echoerr "Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000350 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000351 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000352" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000353 return
354 endif
355 let choice= a:{ichoice}
356 endwhile
357 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
358 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000359 endif
360 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000361
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000362" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000363 let ichoice= ichoice + 1
364
365 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000366 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000367 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000368" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000369
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000370 exe 'lcd ' . fnamemodify(tmpfile,':h')
371 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000372 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000373
374 " Determine method of read (ftp, rcp, etc)
375 call s:NetMethod(choice)
376
Bram Moolenaar843ee412004-06-30 16:16:41 +0000377 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000378" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000379 if choice =~ "^.*[\/]$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000380 keepjumps call s:NetBrowse(choice)
381" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000382 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000383 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000384
385 " ============
386 " Perform Read
387 " ============
388
389 ".........................................
390 " rcp: NetRead Method #1
391 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000392" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000393 " ER: noting done with g:netrw_uid yet?
394 " ER: on Win2K" rcp machine[.user]:file tmpfile
395 " ER: if machine contains '.' adding .user is required (use $USERNAME)
396 " ER: the tmpfile is full path: rcp sees C:\... as host C
397 if s:netrw_has_nt_rcp == 1
398 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
399 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
400 else
401 " Any way needed it machine contains a '.'
402 let uid_machine = g:netrw_machine .'.'. $USERNAME
403 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000404 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000405 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
406 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
407 else
408 let uid_machine = g:netrw_machine
409 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000410 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000411" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000412 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
413 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
414 let b:netrw_lastfile = choice
415
416 ".........................................
417 " ftp + <.netrc>: NetRead Method #2
418 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000419" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000420 let netrw_fname= b:netrw_fname
421 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000422 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000423 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000424 exe "put ='"."get ".netrw_fname." ".tmpfile."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000425 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000426" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000427 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
428 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000429" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000430 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
431 endif
432 " 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 +0000433 if getline(1) !~ "^$" && !exists("g:netrw_quiet")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000434 let debugkeep= &debug
435 set debug=msg
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000436 echoerr getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000437 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000438 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000439 endif
440 bd!
441 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
442 let b:netrw_lastfile = choice
443
444 ".........................................
445 " ftp + machine,id,passwd,filename: NetRead Method #3
446 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
447 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000448" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000449 let netrw_fname= b:netrw_fname
450 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000451 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000452 if exists("g:netrw_port") && g:netrw_port != ""
453 put ='open '.g:netrw_machine.' '.g:netrw_port
454 else
455 put ='open '.g:netrw_machine
456 endif
457
458 if exists("g:netrw_ftp") && g:netrw_ftp == 1
459 put =g:netrw_uid
460 put =g:netrw_passwd
461 else
462 put ='user '.g:netrw_uid.' '.g:netrw_passwd
463 endif
464
465 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
466 put =g:netrw_ftpmode
467 endif
468 put ='get '.netrw_fname.' '.tmpfile
469
470 " perform ftp:
471 " -i : turns off interactive prompting from ftp
472 " -n unix : DON'T use <.netrc>, even though it exists
473 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000474" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000475 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000476" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000477 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
478 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
479 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000480" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000481 if !exists("g:netrw_quiet")
482 echoerr getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000483 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000484 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000485 endif
486 bd!
487 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
488 let b:netrw_lastfile = choice
489
490 ".........................................
491 " scp: NetRead Method #4
492 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000493" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000494 if exists("g:netrw_port") && g:netrw_port != ""
495 let useport= " -P ".g:netrw_port
496 else
497 let useport= ""
498 endif
499 if g:netrw_cygwin == 1
500 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000501" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000502 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
503 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000504" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000505 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
506 endif
507 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
508 let b:netrw_lastfile = choice
509
510 ".........................................
511 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000512" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000513 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000514 if !exists("g:netrw_quiet")
515 echoerr "neither wget nor fetch command is available"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000516 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000517 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000518 exit
519 endif
520
521 if match(b:netrw_fname,"#") == -1
522 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000523" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000524 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
525 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
526
527 else
528 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
529 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
530 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000531" call Decho("netrw_html<".netrw_html.">")
532" call Decho("netrw_tag <".netrw_tag.">")
533" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000534 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
535 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000536" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000537 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
538 endif
539 let b:netrw_lastfile = choice
540
541 ".........................................
542 " cadaver: NetRead Method #6
543 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000544" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000545
546 " Construct execution string (four lines) which will be passed through filter
547 let netrw_fname= b:netrw_fname
548 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000549 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000550 if exists("g:netrw_port") && g:netrw_port != ""
551 put ='open '.g:netrw_machine.' '.g:netrw_port
552 else
553 put ='open '.g:netrw_machine
554 endif
555 put ='user '.g:netrw_uid.' '.g:netrw_passwd
556
557 if g:netrw_cygwin == 1
558 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
559 put ='get '.netrw_fname.' '.cygtmpfile
560 else
561 put ='get '.netrw_fname.' '.tmpfile
562 endif
563
564 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000565 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000566" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000567 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
568 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000569 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000570 let b:netrw_lastfile = choice
571
572 ".........................................
573 " rsync: NetRead Method #7
574 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000575" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000576 if g:netrw_cygwin == 1
577 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000578" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000579 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
580 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000581" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000582 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
583 endif
584 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
585 let b:netrw_lastfile = choice
586
587 ".........................................
588 " fetch: NetRead Method #8
589 " fetch://[user@]host[:http]/path
590 elseif b:netrw_method == 8 " read with fetch
591 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000592 if !exists("g:netrw_quiet")
593 echoerr "fetch command not available"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000594 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000595 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000596 exit
597 endif
598 if exists("g:netrw_option") && g:netrw_option == ":http"
599 let netrw_option= "http"
600 else
601 let netrw_option= "ftp"
602 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000603" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000604
605 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000606" 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 +0000607 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
608 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000609" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000610 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
611 endif
612
613 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
614 let b:netrw_lastfile = choice
615
616 ".........................................
617 " sftp: NetRead Method #9
618 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000619" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000620 if g:netrw_cygwin == 1
621 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000622" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
623" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000624 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
625 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000626" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000627 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
628 endif
629 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
630 let b:netrw_lastfile = choice
631
632 ".........................................
633 else " Complain
634 echo "***warning*** unable to comply with your request<" . choice . ">"
635 endif
636 endwhile
637
638 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000639" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000640 if exists("b:netrw_method")
641 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000642 unlet b:netrw_fname
643 endif
644 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000645
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000646" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000647endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000648
649" ------------------------------------------------------------------------
650" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
651fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000652" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000653
654 if exists("*NetReadFixup")
655 " for the use of NetReadFixup (not otherwise used internally)
656 let line2= line("$")
657 endif
658
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000659 " transform paths from / to \ for Windows (except for cygwin)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000660 if &term == "win32"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000661 if g:netrw_cygwin
662 let fname= a:fname
663" call Decho("(win32 && cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000664 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000665 let fname= substitute(a:fname,'/','\\\\','ge')
666" call Decho("(win32 && !cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000667 endif
668 else
669 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000670" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000671 endif
672
673 " get the file, but disable undo when reading a new buffer
674 if a:readcmd[0] == '0'
675 let use_e_cmd = 0 " 1 when using ':edit'
676 let delline = 0 " 1 when have to delete empty last line
677 if line("$") == 1 && getline(1) == ""
678 " Now being asked to 0r a file into an empty file.
679 " Safe to :e it instead, unless there is another window on the same buffer.
680 let curbufnr = bufnr("%")
681 let use_e_cmd = 1
682 let delline = 1
683 " Loop over all windows,
684 " reset use_e_cmd when another one is editing the current buffer.
685 let i = 1
686 while 1
687 if i != winnr() && winbufnr(i) == curbufnr
688 let use_e_cmd = 0
689 break
690 endif
691 let i = i + 1
692 if winbufnr(i) < 0
693 break
694 endif
695 endwhile
696 endif
697
698 if use_e_cmd > 0
699 " ':edit' the temp file, wipe out the old buffer and rename the buffer
700 let curfilename = expand("%")
701
702 let binlocal = &l:bin
703 let binglobal = &g:bin
704 if binlocal
705 setglobal bin " Need to set 'bin' globally for ":e" command.
706 endif
707 silent exe "e! ".v:cmdarg." ".fname
708 if binlocal && !binglobal
709 setglobal nobin
710 setlocal bin
711 endif
712
713 exe curbufnr . "bwipe!"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000714 exe "f ".escape(curfilename," ")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000715 " the ":f newname" apparently leaves the temporary file as the alternate
716 " file in the buffer list (see :ls!). The following command wipes it out.
717 exe bufnr("#")."bwipe!"
718 else
719 let oldul= &ul
Bram Moolenaar8299df92004-07-10 09:47:34 +0000720 setlocal ul=-1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000721 exe a:readcmd." ".v:cmdarg." ".escape(fname," ")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000722 if delline > 0
723 " wipe out last line, which should be a blank line anyway
724 $del
725 endif
726 let &ul= oldul
727 endif
728 elseif filereadable(fname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000729" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000730 exe a:readcmd." ".v:cmdarg." ".fname
731 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000732" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000733 return
734 endif
735
736 " User-provided (ie. optional) fix-it-up command
737 if exists("*NetReadFixup")
738 let line1= line(".")
739 if a:readcmd == "r"
740 let line2= line("$") - line2 + line1
741 else
742 let line2= line("$") - line2
743 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000744" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000745 call NetReadFixup(a:method, line1, line2)
746 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000747
748 " update the Buffers menu
749 if has("gui") && has("gui_running")
750 silent! emenu Buffers.Refresh\ menu
751 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000752
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000753" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000754
755 " insure that we have the right filetype and that its being displayed
756 filetype detect
757 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000758" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000759endfun
760
761" ------------------------------------------------------------------------
762" NetWrite: responsible for writing a file over the net {{{1
763fun! s:NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000764" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000765
766 " option handling
767 let mod= 0
768 call s:NetOptionSave()
769
770 " Get Temporary Filename
771 let tmpfile= tempname()
772
773 if a:0 == 0
774 let ichoice = 0
775 else
776 let ichoice = 1
777 endif
778
779 " write (selected portion of) file to temporary
780 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
781
782 while ichoice <= a:0
783
784 " attempt to repeat with previous host-file-etc
785 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000786" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000787 let choice = b:netrw_lastfile
788 let ichoice= ichoice + 1
789 else
790 exe "let choice= a:" . ichoice
791
792 " Reconstruct Choice if choice starts with '"'
793 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000794 echomsg 'NetWrite Usage:"'
795 echomsg ':Nwrite machine:path uses rcp'
796 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
797 echomsg ':Nwrite "machine id password path" uses ftp'
798 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
799 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
800 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
801 echomsg ':Nwrite rcp://machine/path uses rcp'
802 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
803 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
804 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000805 break
806
807 elseif match(choice,"^\"") != -1
808 if match(choice,"\"$") != -1
809 " case "..."
810 let choice=strpart(choice,1,strlen(choice)-2)
811 else
812 " case "... ... ..."
813 let choice = strpart(choice,1,strlen(choice)-1)
814 let wholechoice = ""
815
816 while match(choice,"\"$") == -1
817 let wholechoice= wholechoice . " " . choice
818 let ichoice = ichoice + 1
819 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000820 if !exists("g:netrw_quiet")
821 echoerr "Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000822 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000823 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000824" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000825 return
826 endif
827 let choice= a:{ichoice}
828 endwhile
829 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
830 endif
831 endif
832 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000833" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000834 let ichoice= ichoice + 1
835
836 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000837 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000838 let choice= substitute(choice,'\\','/','ge')
839 "ER: see NetRead()
840 exe 'lcd ' . fnamemodify(tmpfile,':h')
841 let tmpfile = fnamemodify(tmpfile,':t')
842 endif
843
844 " Determine method of read (ftp, rcp, etc)
845 call s:NetMethod(choice)
846
847 " =============
848 " Perform Write
849 " =============
850
851 ".........................................
852 " rcp: NetWrite Method #1
853 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000854" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000855 if s:netrw_has_nt_rcp == 1
856 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
857 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
858 else
859 let uid_machine = g:netrw_machine .'.'. $USERNAME
860 endif
861 else
862 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
863 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
864 else
865 let uid_machine = g:netrw_machine
866 endif
867 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000868" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000869 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
870 let b:netrw_lastfile = choice
871
872 ".........................................
873 " ftp + <.netrc>: NetWrite Method #2
874 elseif b:netrw_method == 2 " write with ftp + <.netrc>
875 let netrw_fname = b:netrw_fname
876 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000877 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000878 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000879" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000880 exe "put ='"."put ".tmpfile." ".netrw_fname."'"
881" call Decho("put ='"."put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000882 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000883" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000884 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000885 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000886" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000887 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000888 endif
889 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
890 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000891 if !exists("g:netrw_quiet")
892 echoerr getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000893 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000894 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000895 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000896 endif
897 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000898 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000899
900 ".........................................
901 " ftp + machine, id, passwd, filename: NetWrite Method #3
902 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
903 let netrw_fname= b:netrw_fname
904 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000905 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000906 if exists("g:netrw_port") && g:netrw_port != ""
907 put ='open '.g:netrw_machine.' '.g:netrw_port
908 else
909 put ='open '.g:netrw_machine
910 endif
911 if exists("g:netrw_ftp") && g:netrw_ftp == 1
912 put =g:netrw_uid
913 put =g:netrw_passwd
914 else
915 put ='user '.g:netrw_uid.' '.g:netrw_passwd
916 endif
917 put ='put '.tmpfile.' '.netrw_fname
918 " save choice/id/password for future use
919 let b:netrw_lastfile = choice
920
921 " perform ftp:
922 " -i : turns off interactive prompting from ftp
923 " -n unix : DON'T use <.netrc>, even though it exists
924 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000925" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000926 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000927" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000928 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
929 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
930 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000931 if !exists("g:netrw_quiet")
932 echoerr getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000933 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000934 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000935 let mod=1
936 endif
937 bd!
938
939 ".........................................
940 " scp: NetWrite Method #4
941 elseif b:netrw_method == 4 " write with scp
942 if exists("g:netrw_port") && g:netrw_port != ""
943 let useport= " -P ".g:netrw_port
944 else
945 let useport= ""
946 endif
947 if g:netrw_cygwin == 1
948 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000949" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000950 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
951 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000952" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000953 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
954 endif
955 let b:netrw_lastfile = choice
956
957 ".........................................
958 " http: NetWrite Method #5
959 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000960 if !exists("g:netrw_quiet")
961 echoerr "***warning*** currently <netrw.vim> does not support writing using http:"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000962 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000963 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000964
965 ".........................................
966 " dav: NetWrite Method #6
967 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000968" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000969
970 " Construct execution string (four lines) which will be passed through filter
971 let netrw_fname= b:netrw_fname
972 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000973 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000974 if exists("g:netrw_port") && g:netrw_port != ""
975 put ='open '.g:netrw_machine.' '.g:netrw_port
976 else
977 put ='open '.g:netrw_machine
978 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000979 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000980
981 if g:netrw_cygwin == 1
982 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
983 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000984 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000985 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000986 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000987
988 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000989 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000990" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000991 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
992 bd!
993 let b:netrw_lastfile = choice
994
995 ".........................................
996 " rsync: NetWrite Method #7
997 elseif b:netrw_method == 7 " write with rsync
998 if g:netrw_cygwin == 1
999 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001000" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001001 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +00001002 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001003" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001004 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +00001005 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001006 let b:netrw_lastfile = choice
1007
1008 ".........................................
1009 " scp: NetWrite Method #9
1010 elseif b:netrw_method == 9 " write with sftp
1011 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001012 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1013 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1014 else
1015 let uid_machine = g:netrw_machine
1016 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001017 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001018 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +00001019 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001020 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001021" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001022 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
1023 bd!
1024 let b:netrw_lastfile= choice
1025
1026 ".........................................
1027 else " Complain
1028 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001029 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001030 endwhile
1031
1032 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001033" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001034 let result=delete(tmpfile)
1035 call s:NetOptionRestore()
1036
1037 if a:firstline == 1 && a:lastline == line("$")
1038 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001039 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001040
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001041" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001042endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001043
1044" ------------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001045" Browsing Support For Remote Directories And Files: {{{1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001046" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001047" of the contents of a remote directory. It is assumed that the
1048" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1049" with the requested remote hostname first.
Bram Moolenaar843ee412004-06-30 16:16:41 +00001050fun! <SID>NetBrowse(dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001051" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".g:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001052
1053 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001054 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1055" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001056 if !executable("ftp")
1057 if !exists("g:netrw_quiet")
1058 echoerr "***netrw*** this system doesn't support remote directory listing via ftp"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001059 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001060 endif
1061" call Dret("NetBrowse")
1062 return
1063 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001064 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001065 if !exists("g:netrw_quiet")
1066 echoerr "***netrw*** this system doesn't support remote directory listing via ssh"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001067 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001068 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001069" call Dret("NetBrowse")
1070 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001071 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001072
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001073 " make this buffer modifiable
1074 setlocal ma
1075
1076 " analyze a:dirname and g:netrw_list_cmd
1077 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001078 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001079" call Decho("dirpat<".dirpat.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001080 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001081 if !exists("g:netrw_quiet")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001082 echoerr "NetBrowse: I don't understand your dirname<".dirname.">"
1083 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001084 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001085" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001086 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001087 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001088
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001089 let method = substitute(dirname,dirpat,'\1','')
1090 let user = substitute(dirname,dirpat,'\2','')
1091 let machine = substitute(dirname,dirpat,'\3','')
1092 let path = substitute(dirname,dirpat,'\4','')
1093 let fname = substitute(dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001094" call Decho("set up method <".method .">")
1095" call Decho("set up user <".user .">")
1096" call Decho("set up machine<".machine.">")
1097" call Decho("set up path <".path .">")
1098" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001099
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001100 if method == "ftp" || method == "http"
1101 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001102 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001103 else
1104 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1105 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001106
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001107 if exists("b:netrw_method")
1108" call Decho("setting s:netrw_method<".b:netrw_method.">")
1109 let s:netrw_method= b:netrw_method
1110 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001111
Bram Moolenaar8299df92004-07-10 09:47:34 +00001112 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001113 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
1114 echoerr "***warning*** windows' ftp doesn't support time/size sorts (get cygwin, set g:netrw_cygwin)"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001115 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001116 else
1117 if g:netrw_sort_by =~ "^t"
1118 let listcmd= listcmd."t"
1119 elseif g:netrw_sort_by =~ "^s"
1120 let listcmd= listcmd."S"
1121 endif
1122 " optionally sort in reverse
1123 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1124 let listcmd= listcmd."r"
1125 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001126 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001127
1128" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001129 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001130" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001131 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001132 redraw!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001133" call Dret("NetBrowse : symlink")
1134 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001135
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001136 elseif fname !~ '[\/]$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001137 " looks like a regular file, attempt transfer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001138" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001139
1140 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001141 " "this is a directory" indicator (/). There shouldn't be one of those,
1142 " anyway.
1143 let path= substitute(path,'[*=@|]$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001144" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001145
1146 " remote-read the requested file into current buffer
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001147 enew!
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001148" call Decho("exe file .method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001149 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001150 exe "silent doau BufReadPre ".fname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001151 silent call s:NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001152 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001153 keepjumps 1d
1154 setlocal nomod
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001155
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001156" call Dret("NetBrowse : file<".fname.">")
1157 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001158 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001159
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001160 " ---------------------------------------------------------------------
1161 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001162" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001163 " set up new buffer and map
1164 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001165 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001166" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001167 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001168 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001169" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001170 exe "b ".bufnamenr
1171 if line("$") >= 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001172" call Dret("NetBrowse")
1173 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001174 endif
1175 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001176" call Decho("generate a new buffer")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001177 enew!
1178 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001179
1180 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001181 setlocal bt=nofile bh=wipe nobl noswf
1182 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001183" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001184 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001185" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001186 setlocal bh=hide nobl nonu
1187
1188 " save current directory on directory history list
1189 call <SID>NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001190
1191 " set up buffer-local mappings
1192" call Decho("set up buffer-local mappings")
1193 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001194 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
1195 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001196 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 +00001197 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1198 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1199 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1200 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001201 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 +00001202 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1203 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>
1204 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>
1205 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001206 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1207 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001208 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 +00001209 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
1210 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 +00001211 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1212 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001213 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001214 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1215 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1216 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001217 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001218 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001219 setlocal ma nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001220
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001221 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001222" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1223 keepjumps put ='\" ==========================================================================='
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001224 keepjumps put ='\" Netrw Remote Directory Listing'
1225 keepjumps put ='\" '.bufname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001226 let s:netrw_bannercnt= 7
1227 let sortby= g:netrw_sort_by
1228 if g:netrw_sort_direction =~ "^r"
1229 let sortby= sortby." reversed"
1230 endif
1231
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001232 if g:netrw_sort_by =~ "^n"
1233 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001234 let s:netrw_bannercnt= s:netrw_bannercnt + 1
1235 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001236 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1237 else
1238 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001239 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001240 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001241 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001242 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001243 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001244 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001245 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001246 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001247 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001248 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001249 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1250 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001251
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001252 " remote read the requested directory listing
1253 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1254 " Note that not all ftp servers honor the options for ls
1255 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001256 " use ftp to get remote file listing
1257" call Decho("use ftp to get remote file listing")
1258 call NetBrowseFtpCmd(path,listcmd)
1259
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001260 keepjumps 1d
1261
1262 if !g:netrw_longlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001263 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001264" call Decho("generate short listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001265 exe "keepjumps ".s:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001266
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001267 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001268 if g:netrw_ftp_browse_reject != ""
1269 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1270 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001271
1272 " if there's no ../ listed, then put ./ and ../ in
1273 let line1= line(".")
1274 keepjumps 1
1275 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1276 let line2= line(".")
1277 if line2 == 0
1278 keepjumps put='../'
1279 keepjumps put='./'
1280 endif
1281 exe "keepjumps ".line1
1282 keepjumps norm! 0
1283
1284 " more cleanup
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001285 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1286 exe "keepjumps silent ".s:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#'
1287 exe "keepjumps silent ".s:netrw_bannercnt.',$g/ -> /s# -> .*$#/#'
1288 endif
1289
1290 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001291 " use ssh to get remote file listing
1292" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001293 let shq= &shq? &shq : ( &sxq? &sxq : "'")
1294" call Decho("exe silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq)
1295 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1296 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001297 " cleanup
1298 if g:netrw_ftp_browse_reject != ""
1299 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
1300 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001301 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001302
1303 " manipulate the directory listing (hide, sort)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001304 setlocal ft=netrwlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001305 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001306 if g:netrw_hide && g:netrw_list_hide != ""
1307 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001308 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001309
Bram Moolenaar8299df92004-07-10 09:47:34 +00001310 if g:netrw_longlist
1311 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001312" call Decho("manipulate long listing")
1313
1314 if method == "ftp"
1315 " cleanup
1316 exe "keepjumps ".s:netrw_bannercnt
1317 while getline(".") =~ '^total\s\+\d\+$' || getline(".") =~ 'Trying\s\+\d\+.*$'
1318 keepjumps d
1319 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001320 " if there's no ../ listed, then put ./ and ../ in
1321 let line1= line(".")
1322 keepjumps 1
1323 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1324 let line2= line(".")
1325 if line2 == 0
1326 exe 'keepjumps '.s:netrw_bannercnt."put='./'"
1327 exe 'keepjumps '.s:netrw_bannercnt."put='../'"
1328 endif
1329 exe "keepjumps ".line1
1330 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001331 endif
1332
1333 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/ -> .*$//e'
1334 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1335 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001336 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001337
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001338 if line("$") >= s:netrw_bannercnt
1339 if g:netrw_sort_by =~ "^n"
1340 call s:SetSort()
1341 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
1342 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
1343 endif
1344 if g:netrw_longlist
1345 " shorten the list to keep its width <= 80 characters
1346 exe "keepjumps silent ".s:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
1347 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001348 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001349 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001350 exe "keepjumps ".s:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001351 setlocal nomod
1352 setlocal noma
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001353 setlocal nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001354
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001355" call Dret("NetBrowse")
1356 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001357endfun
1358
1359" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001360" NetBrowseChgDir: {{{2
1361fun! <SID>NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001362" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001363
1364 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001365 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001366
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001367 if newdir !~ '[\/]$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001368 " handling a file
1369 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001370" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001371
1372 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001373 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001374" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001375 setlocal ma
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001376 %d
1377
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001378 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001379 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001380 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001381
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001382 if trailer =~ '^\%(\.\./\)*$'
1383 " tack on a ../"
1384 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001385
1386 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001387 " strip off a directory name from dirname
1388 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001389 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001390" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001391
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001392 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001393 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001394 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001395" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001396 endif
1397
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001398" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001399 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001400endfun
1401
Bram Moolenaar843ee412004-06-30 16:16:41 +00001402" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001403" NetGetWord: it gets the directory named under the cursor
1404fun! <SID>NetGetWord()
1405" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001406 if line(".") < s:netrw_bannercnt
1407 let dirname= "./"
1408 else
1409 let dirname= getline(".")
1410 if dirname =~ '\t'
1411 let dirname= substitute(dirname,'\t.*$','','e')
1412 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001413 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001414" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001415 return dirname
1416endfun
1417
1418" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001419" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar843ee412004-06-30 16:16:41 +00001420fun! <SID>NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001421" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1422" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001423
1424 " preparation for removing multiple files/directories
1425 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001426 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001427
1428 " remove multiple files and directories
1429 while ctr <= a:lastline
1430 exe ctr
1431
1432 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001433 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001434" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001435
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001436 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001437 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001438 if !all
1439 echohl Statement
1440 call inputsave()
1441 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1442 call inputrestore()
1443 echohl NONE
1444 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1445 if ok =~ 'a\%[ll]'
1446 let all= 1
1447 endif
1448 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001449
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001450 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001451 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1452 silent! keepjumps .,$d
1453 call NetBrowseFtpCmd(a:path,"delete ".rmfile)
1454 else
1455 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1456" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1457 let ret= system(netrw_rm_cmd)
1458" call Decho("returned=".ret." errcode=".v:shell_error)
1459 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001460 elseif ok =~ 'q\%[uit]'
1461 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001462 endif
1463
1464 else
1465 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001466 if !all
1467 call inputsave()
1468 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1469 call inputrestore()
1470 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1471 if ok =~ 'a\%[ll]'
1472 let all= 1
1473 endif
1474 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001475
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001476 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001477 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1478 call NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
1479 else
1480 let rmfile = a:path.rmfile
1481 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1482" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1483 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001484" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001485
1486 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001487 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001488" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1489 let ret= system(netrw_rmf_cmd)
1490" call Decho("returned=".ret." errcode=".v:shell_error)
1491
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001492 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001493 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001494 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001495 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001496 endif
1497 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001498
1499 elseif ok =~ 'q\%[uit]'
1500 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001501 endif
1502 endif
1503
1504 let ctr= ctr + 1
1505 endwhile
1506
1507 " refresh the directory
1508 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001509" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001510 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1511 exe curline
1512
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001513" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001514endfun
1515
1516" ---------------------------------------------------------------------
1517" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00001518fun! <SID>NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001519" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001520
1521 " preparation for removing multiple files/directories
1522 let ctr = a:firstline
1523 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1524
1525 " attempt to rename files/directories
1526 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001527 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001528
1529 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001530 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001531" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001532
1533 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001534 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001535 call inputrestore()
1536
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001537 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1538 call NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
1539 else
1540 let oldname= a:path.oldname
1541 let newname= a:path.newname
1542" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1543 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1544 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001545
1546 let ctr= ctr + 1
1547 endwhile
1548
1549 " refresh the directory
1550 let curline= line(".")
1551 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001552 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001553" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001554endfun
1555
1556" ---------------------------------------------------------------------
1557" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001558" files given their extension. Passes 0=local, 1=remote
1559fun! <SID>NetBrowseX(fname,remote)
1560" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001561
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001562 " set up the filename
1563 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001564 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001565 if has("win32") || has("win95") || has("win64") || has("win16")
1566 let exten= substitute(exten,'^.*$','\L&\E','')
1567 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001568 let fname= escape(a:fname,"%#")
1569" call Decho("fname<".fname."> after escape()")
1570
1571 if a:remote == 1
1572 " create a local copy
1573 let fname= tempname().".".exten
1574" call Decho("create a local copy of <".a:fname."> as <".fname.">")
1575 exe "keepjumps silent bot 1new ".a:fname
1576 let eikeep= &ei
1577 set ei=all bh=delete
1578 exe "w! ".fname
1579 let &ei= eikeep
1580 q
1581 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001582" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001583
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001584 " set up redirection
1585 if &srr =~ "%s"
1586 let redir= substitute(&srr,"%s","/dev/null"."")
1587 else
1588 let redir= &srr . "/dev/null"
1589 endif
1590" call Decho("redir:".redir.":")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001591
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001592 " execute the file handler
1593 if has("win32") || has("win64")
1594" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1595 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1596 let ret= v:shell_error
1597
1598 elseif has("unix") && executable("kfmclient")
1599" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1600 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1601 let ret= v:shell_error
1602
1603 elseif has("unix") && executable("gnome-open")
1604" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1605 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1606 let ret= v:shell_error
1607
1608 elseif exten != "" && exists("*NetrwFileHandler_".exten)
1609" call Decho("let ret= NetrwFileHandler_".exten.'("'.fname.'")')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001610 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001611 endif
1612 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001613
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001614 " cleanup: remove temporary file,
1615 " delete current buffer if success with handler,
1616 " return to prior buffer (directory listing)
1617 if a:remote == 1 && fname != a:fname
1618" call Decho("deleting temporary file<".fname.">")
1619 call delete(fname)
1620 endif
1621
1622 if a:remote == 1
1623 let eikeep= &ei
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001624 set ei=all bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001625 exe "norm! \<c-o>"
1626 let &ei= eikeep
1627 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001628 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001629
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001630" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001631endfun
1632
1633" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001634" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1635" This function assumes that a long listing will be received. Size, time,
1636" and reverse sorts will be requested of the server but not otherwise
1637" enforced here.
1638fun! NetBrowseFtpCmd(path,cmd)
1639" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".s:netrw_method)
1640
1641 " because WinXX ftp uses unix style input
1642 " curline is one more than the bannercnt in order to account
1643 " for the unwanted first blank line (doing a :put to an empty
1644 " buffer yields a blank first line)
1645 let ffkeep= &ff
1646 setlocal ma
1647 setlocal ff=unix
1648 let curline= s:netrw_bannercnt+1
1649 exe "silent! keepjumps ".curline.",$d"
1650
1651 ".........................................
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001652 if s:netrw_method == 2 || s:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001653 " ftp + <.netrc>: Method #2
1654 if a:path != ""
1655 put ='cd '.a:path
1656 endif
1657 exe "put ='".a:cmd."'"
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001658" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001659 if exists("g:netrw_port") && g:netrw_port != ""
1660" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1661 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1662 else
1663" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1664 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1665 endif
1666
1667 ".........................................
1668 elseif s:netrw_method == 3
1669 " ftp + machine,id,passwd,filename: Method #3
1670 setlocal ff=unix
1671 if exists("g:netrw_port") && g:netrw_port != ""
1672 put ='open '.g:netrw_machine.' '.g:netrw_port
1673 else
1674 put ='open '.g:netrw_machine
1675 endif
1676
1677 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1678 put =g:netrw_uid
1679 put =g:netrw_passwd
1680 else
1681 put ='user '.g:netrw_uid.' '.g:netrw_passwd
1682 endif
1683
1684 if a:path != ""
1685 put ='cd '.a:path
1686 endif
1687 exe "put ='".a:cmd."'"
1688
1689 " perform ftp:
1690 " -i : turns off interactive prompting from ftp
1691 " -n unix : DON'T use <.netrc>, even though it exists
1692 " -n win32: quit being obnoxious about password
1693" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1694 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1695
1696 ".........................................
1697 else
1698 echo "***warning*** unable to comply with your request<" . choice . ">"
1699 endif
1700
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001701 " cleanup for Windows
1702 if has("win32") || has("win95") || has("win64") || has("win16")
1703 keepjumps silent! %s/\r$//
1704 endif
1705 if a:cmd == "dir"
1706 " infer directory/link based on the file permission string
1707 keepjumps silent g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1708 keepjumps silent g/l\%([-r][-w][-x]\)\{3}/s/$/@/
1709 if !g:netrw_longlist
1710 exe "keepjumps silent ".curline.',$s/^\%(\S\+\s\+\)\{8}//'
1711 endif
1712 endif
1713
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001714 " restore settings
1715 let &ff= ffkeep
1716" call Dret("NetBrowseFtpCmd")
1717endfun
1718
1719" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001720" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1721" separated patterns given in g:netrw_list_hide
1722fun! <SID>NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001723" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001724
1725 let listhide= g:netrw_list_hide
1726 while listhide != ""
1727 if listhide =~ ','
1728 let hide = substitute(listhide,',.*$','','e')
1729 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1730 else
1731 let hide = listhide
1732 let listhide= ""
1733 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001734
1735 " Prune the list by hiding any files which match
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001736" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001737 if g:netrw_hide == 1
1738 exe 'keepjumps silent '.s:netrw_bannercnt.',$g~'.hide.'~d'
1739 elseif g:netrw_hide == 2
1740 exe 'keepjumps silent '.s:netrw_bannercnt.',$v~'.hide.'~d'
1741 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001742 endwhile
1743
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001744" call Dret("NetrwListHide")
1745endfun
1746
1747" ---------------------------------------------------------------------
1748" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar8299df92004-07-10 09:47:34 +00001749fun! <SID>NetHideEdit(mode)
1750" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001751
1752 call inputsave()
1753 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1754 call inputrestore()
1755
1756 " refresh the listing
1757 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001758 if a:mode == 0
1759 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1760 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001761 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001762 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001763
1764" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001765endfun
1766
Bram Moolenaar8299df92004-07-10 09:47:34 +00001767" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001768" NetSortSequence: allows user to edit the sorting sequence
1769fun! <SID>NetSortSequence(mode)
1770" call Dfunc("NetSortSequence(mode=".a:mode.")")
1771
1772 call inputsave()
1773 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
1774 call inputrestore()
1775
1776 " refresh the listing
1777 let g:netrw_sort_sequence= newsortseq
1778 if a:mode == 0
1779 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1780 else
1781 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
1782 endif
1783
1784" call Dret("NetSortSequence")
1785endfun
1786
1787" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001788" NetLongList: {{{2
1789fun! <SID>NetLongList(mode)
1790" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".g:netrw_longlist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001791 call s:NetSavePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001792
1793 if g:netrw_longlist != 0
1794 " turn long listing off
1795 let g:netrw_longlist = 0
1796 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1797
1798 else
1799 " turn long listing on
1800 let g:netrw_longlist = 1
1801 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
1802 endif
1803
1804 " refresh the listing
1805 if a:mode == 0
1806 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1807 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001808 silent call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001809 endif
1810
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001811 call s:NetRestorePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001812" call Dret("NetLongList : g:netrw_longlist=".g:netrw_longlist)
1813endfun
1814
1815" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001816" NetSaveWordPosn: used by the "s" command in both remote and local
1817" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
1818" the same word even though the sorting has changed its order of appearance.
1819fun! s:NetSaveWordPosn()
1820" call Dfunc("NetSaveWordPosn()")
1821 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
1822" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
1823endfun
1824
1825" ---------------------------------------------------------------------
1826" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above
1827fun! s:NetRestoreWordPosn()
1828" call Dfunc("NetRestoreWordPosn()")
1829 silent! call search(s:netrw_saveword,'w')
1830" call Dret("NetRestoreWordPosn")
1831endfun
1832
1833" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001834" NetMakeDir: this function makes a directory (both local and remote)
1835fun! <SID>NetMakeDir(usrhost)
1836" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
1837
1838 " get name of new directory from user. A bare <CR> will skip.
1839 " if its currently a directory, also request will be skipped, but with
1840 " a message.
1841 call inputsave()
1842 let newdirname= input("Please give directory name: ")
1843 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001844" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001845
1846 if newdirname == ""
1847" call Dret("NetMakeDir : user aborted with bare <cr>")
1848 return
1849 endif
1850
1851 if a:usrhost == ""
1852
1853 " Local mkdir:
1854 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001855 let fullnewdir= b:netrw_curdir.'/'.newdirname
1856" call Decho("fullnewdir<".fullnewdir.">")
1857 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001858 if !exists("g:netrw_quiet")
1859 echoerr "***warning*** <".newdirname."> is already a directory!"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001860 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001861 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001862" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
1863 return
1864 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001865 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001866 if !exists("g:netrw_quiet")
1867 echoerr "***warning*** <".newdirname."> is already a file!"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001868 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001869 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001870" call Dret("NetMakeDir : file<".newdirname."> exists previously")
1871 return
1872 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001873 let netrw_origdir= s:NetGetcwd(1)
1874 exe 'cd '.b:netrw_curdir
1875" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
1876" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
1877 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
1878 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
1879
Bram Moolenaar8299df92004-07-10 09:47:34 +00001880 if v:shell_error == 0
1881 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001882" call Decho("refresh listing")
1883 let linenum= line(".")
1884 norm! H0
1885 let hline = line(".")
1886 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
1887 exe "norm! ".hline."G0z\<CR>"
1888 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001889 elseif !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001890 echoerr "***warning*** unable to make directory<".newdirname.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001891 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001892 endif
1893 redraw!
1894
1895 else
1896 " Remote mkdir:
1897 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001898 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00001899" call Decho("exe silent! !".mkdircmd." ".newdirname)
1900 exe "silent! !".mkdircmd." ".newdirname
1901 if v:shell_error == 0
1902 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001903 let linenum= line(".")
1904 norm! H0
1905 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001906 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001907 exe "norm! ".hline."G0z\<CR>"
1908 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001909 elseif !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001910 echoerr "***warning*** unable to make directory<".newdirname.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001911 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001912 endif
1913 redraw!
1914 endif
1915
1916" call Dret("NetMakeDir")
1917endfun
1918
1919" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001920" NetBookmarkDir:
1921" 0: bookmark the current directory
1922" 1: change to the bookmarked directory
1923fun! <SID>NetBookmarkDir(chg,curdir)
1924" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
1925
1926 if a:chg == 0
1927 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001928 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
1929 if !exists("g:NETRW_BOOKMARKMAX")
1930 let g:NETRW_BOOKMARKMAX= v:count
1931 elseif v:count > g:NETRW_BOOKMARKMAX
1932 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001933 endif
1934
1935 elseif a:chg == 1
1936 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001937 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
1938 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001939 else
1940 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
1941 endif
1942
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001943 elseif a:chg == 2
1944 if exists("g:NETRW_BOOKMARKMAX")
1945 " list user's bookmarks
1946" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
1947 let cnt= 0
1948 while cnt <= g:NETRW_BOOKMARKMAX
1949 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
1950" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
1951 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
1952 endif
1953 let cnt= cnt + 1
1954 endwhile
1955 endif
1956
1957 " list directory history
1958 let cnt = g:NETRW_DIRHIST_CNT
1959 let first = 1
1960 let histcnt = 0
1961 while ( first || cnt != g:NETRW_DIRHIST_CNT )
1962" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
1963 let histcnt= histcnt + 1
1964 if exists("g:NETRW_DIRHIST_{cnt}")
1965" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
1966 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001967 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001968 let first = 0
1969 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
1970 if cnt < 0
1971 let cnt= cnt + g:netrw_dirhistmax
1972 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001973 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001974
1975 elseif a:chg == 3
1976 " saves most recently visited directories
1977 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1978 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
1979" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1980
1981 elseif a:chg == 4
1982 " u: change to the previous directory stored on the history list
1983 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1984 if g:NETRW_DIRHIST_CNT < 0
1985 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1986 endif
1987 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1988" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1989 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
1990 else
1991 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1992 echo "Sorry, no predecessor directory exists yet"
1993 endif
1994
1995 elseif a:chg == 5
1996 " U: change to the subsequent directory stored on the history list
1997 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1998 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1999" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2000 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2001 else
2002 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2003 if g:NETRW_DIRHIST_CNT < 0
2004 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2005 endif
2006 echo "Sorry, no successor directory exists yet"
2007 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002008 endif
2009" call Dret("NetBookmarkDir")
2010endfun
2011
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002012" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002013" Browsing Support For Local Directories And Files: {{{1
2014
2015" ---------------------------------------------------------------------
2016" LocalBrowse: supports local file/directory browsing {{{2
2017fun! <SID>LocalBrowse(dirname)
2018
2019" let dirname= (a:dirname == "")? expand("%:p") : a:dirname
2020 if !isdirectory(a:dirname)
2021 " not a directory, ignore it
2022 return
2023 endif
2024
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002025 " unfortunate interaction -- when putting debugging calls
2026 " above one can no longer enter the DBG buffer.
2027" call Dfunc("LocalBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr())
2028" call Decho("winbufnr1=".winbufnr(1)." winbufnr2=".winbufnr(2)." winbufnr3=".winbufnr(3))
2029" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002030
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002031 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002032 if !exists("g:netrw_quiet")
2033 echoerr "vim version<".v:version."> too old for browsing with netrw"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002034 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002035 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002036" call Dret("LocalBrowse : vim version<".v:version."> too old")
2037 return
2038 endif
2039
2040 " record and change current directory
2041 let netrw_origdir= s:NetGetcwd(1)
2042 exe 'cd '.escape(substitute(a:dirname,'\\','/','ge'),s:netrw_cd_escape)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002043" call Decho("dirname<".a:dirname."> buf#".bufnr("%")." winnr=".winnr())
Bram Moolenaar8299df92004-07-10 09:47:34 +00002044
2045 " make this buffer modifiable
2046 setlocal ma
2047
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002048 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002049 " Perform Directory Listing:
2050" call Decho("Perform directory listing...")
2051 " set up new buffer and map
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002052 " dirname : current working directory, no escapes, has trailing /
2053 " dirnamens : dirname, but with no trailing slash
2054 " dirnamenr : buffer number containing dirnamens
2055 " dirnamebuf: buffer's idea of dirname, with all \ -> /
2056 let dirname = s:NetGetcwd(0)
2057 let dirnamens = substitute(dirname,'[\/]$','','e')
2058 let dirnamenr = bufnr(dirnamens.'$')
2059 let dirnamebuf = substitute(bufname(dirnamenr),'\\','/','ge')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002060" call Decho("dirnamenr= bufnr(".dirnamens.")=".dirnamenr." bufname(".dirnamenr.")=".bufname(dirnamenr))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002061
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002062 if dirnamenr != 0 && dirnamebuf != dirnamens
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002063 " try keeping the trailing slash
2064 let dirnamenr = bufnr(dirname.'$')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002065" call Decho("dirnamenr= bufnr(".dirname.")=".dirnamenr." bufname(".dirnamenr.")=".bufname(dirnamenr)." (retry with /)")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002066 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002067
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002068 if dirnamenr != -1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002069 " buffer already exists (hidden), so switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002070" call Decho("buffer already exists: dirnamenr=".dirnamenr." dirname<".dirname."> pre-exists")
2071" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002072 exe "b ".dirnamenr
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002073 exe 'silent! cd '.escape(dirname,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002074" call Decho("changed directory to<".dirname.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002075 if a:dirname != "." && line("$") >= 5 && exists("b:netrw_curdir")
2076 if b:netrw_curdir == dirname
2077" call Dret("LocalBrowse : buffer already exists with info, #".dirnamenr)
2078 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
2079 return
2080 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002081 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002082" call Decho("buffer already exists, but needs re-listing (buf#".dirnamenr.")")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002083" call Decho("buffer name<".bufname("%")."> dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002084 setlocal ma
Bram Moolenaar8299df92004-07-10 09:47:34 +00002085 keepjumps %d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002086 let curdir= substitute(substitute(expand("%"),'\\','/','ge'),'[^/]$','&/','e')
2087 if curdir != dirname
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002088 " set standard browser options on buffer
2089 setlocal bt=nofile bh=hide nobl noswf
2090 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002091 exe 'silent file '.escape(dirname,s:netrw_cd_escape)
2092" call Decho("errmsg1<".v:errmsg.">")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002093" call Decho("renamed buffer to<".escape(dirname,s:netrw_cd_escape).">")
2094" call Decho("yielding actual bufname<".bufname("%").">")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002095 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002096 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002097" call Decho("generate new buffer named<".escape(dirname,' #').">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002098 silent! enew!
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002099 " set standard browser options on buffer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002100 setlocal bt=nofile bh=hide nobl noswf nonu
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002101 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002102 exe 'silent file '.substitute(escape(dirname,s:netrw_cd_escape),'[\/]$','','e')
2103" call Decho("errmsg2<".v:errmsg.">")
2104" call Decho("renamed buffer to<".substitute(escape(dirname,s:netrw_cd_escape),'[\/]$','','e').">")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002105" call Decho("yielding actual bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002106 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002107 if bufname("#") == "" && bufnr("#") != -1
2108 " the file command produces a lot of [No File] buffers
2109" call Decho("wiping out nofile buffer#".bufnr("#"))
2110 exe bufnr("#")."bwipe"
2111 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002112
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002113 " save current directory on directory history list
2114 call <SID>NetBookmarkDir(3,s:NetGetcwd(0))
2115
Bram Moolenaar8299df92004-07-10 09:47:34 +00002116 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002117" call Decho("Setting up local browser maps")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002118 let b:netrw_curdir= s:NetGetcwd(1)
2119 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2120 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
2121 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002122 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 +00002123 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2124 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2125 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2126 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2127 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002128 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002129 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>
2130 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 +00002131 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
2132 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>
2133 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>
2134 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002135 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2136 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002137 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 +00002138 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)<cr>
2139 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2140 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2141 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2142 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2143 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2144 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
2145 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002146 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002147 nnoremap <buffer> ? :he netrw-dir<cr>
2148
2149 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002150" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002151 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002152 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002153 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002154 keepjumps put ='\" '.dirname
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002155 let s:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002156
2157 let sortby= g:netrw_sort_by
2158 if g:netrw_sort_direction =~ "^r"
2159 let sortby= sortby." reversed"
2160 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002161
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002162 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002163 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002164" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002165 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002166 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002167 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002168 let s:netrw_bannercnt= s:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002169 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002170" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002171 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002172 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002173 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002174 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002175
2176 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002177 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002178 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002179 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002180 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002181 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002182 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002183 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002184 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002185 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2186 keepjumps put ='\" ============================================================================'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002187 let s:netrw_bannercnt= s:netrw_bannercnt + 2
2188
2189 " bannercnt should index the line just after the banner
2190 let s:netrw_bannercnt= s:netrw_bannercnt + 1
2191" call Decho("bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002192
2193 " generate the requested directory listing
2194 call LocalBrowseList(dirname)
2195
2196 " manipulate the directory listing (hide, sort)
2197 setlocal ft=netrwlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002198 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002199 if g:netrw_hide && g:netrw_list_hide != ""
2200 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002201 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002202 if line("$") >= s:netrw_bannercnt
2203 if g:netrw_sort_by =~ "^n"
2204 call s:SetSort()
2205 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
2206 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
2207 else
2208 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
2209 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{-}\///e'
2210 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002211 endif
2212 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002213 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00002214
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002215 setlocal noma nomod nonu
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002216 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002217
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002218" call Dret("LocalBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002219endfun
2220
2221" ---------------------------------------------------------------------
2222" LocalBrowseList: does the job of "ls" for local directories {{{2
2223fun! LocalBrowseList(dirname)
2224" call Dfunc("LocalBrowseList(dirname<".a:dirname.">)")
2225
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002226 " get the list of files contained in the current directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002227 let dirname = escape(a:dirname,s:netrw_glob_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002228 let dirnamelen = strlen(a:dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002229 let filelist = glob(dirname."*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002230" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002231 if filelist != ""
2232 let filelist= filelist."\n"
2233 endif
2234 let filelist= filelist.glob(dirname.".*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002235" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2236
2237 " if the directory name includes a "$", and possibly other characters,
2238 " the glob() doesn't include "." and ".." entries.
2239 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2240" call Decho("forcibly tacking on .")
2241 if filelist == ""
2242 let filelist= dirname."."
2243 else
2244 let filelist= filelist."\n".a:dirname."."
2245 endif
2246" call Decho("filelist<".filelist.">")
2247 endif
2248 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2249" call Decho("forcibly tacking on ..")
2250 let filelist= filelist."\n".a:dirname.".."
2251" call Decho("filelist<".filelist.">")
2252 endif
2253 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
2254
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002255" call Decho("dirname<".dirname.">")
2256" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002257" call Decho("filelist<".filelist.">")
2258
2259 while filelist != ""
2260 if filelist =~ '\n'
2261 let file = substitute(filelist,'\n.*$','','e')
2262 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2263 else
2264 let file = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002265 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00002266 endif
2267 let pfile= file
2268 if isdirectory(file)
2269 let pfile= file."/"
2270 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002271 if pfile =~ '//$'
2272 let pfile= substitute(pfile,'//$','/','e')
2273 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002274 let pfile= strpart(pfile,dirnamelen)
2275 if g:netrw_longlist
Bram Moolenaar269ec652004-07-29 08:43:53 +00002276 let sz = getfsize(file)
2277 let fsz = strpart(" ",1,15-strlen(sz)).sz
2278 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(file))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002279 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002280
Bram Moolenaar8299df92004-07-10 09:47:34 +00002281 if g:netrw_sort_by =~ "^t"
2282 " sort by time (handles time up to 1 quintillion seconds, US)
2283" call Decho("getftime(".file.")=".getftime(file))
2284 let t = getftime(file)
2285 let ft = strpart("000000000000000000",1,18-strlen(t)).t
2286" call Decho("exe keepjumps put ='".ft.'/'.file."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002287 let ftpfile= ft.'/'.pfile
2288 keepjumps put=ftpfile
2289
Bram Moolenaar8299df92004-07-10 09:47:34 +00002290 elseif g:netrw_sort_by =~ "^s"
2291 " sort by size (handles file sizes up to 1 quintillion bytes, US)
2292" call Decho("getfsize(".file.")=".getfsize(file))
2293 let sz = getfsize(file)
2294 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
2295" call Decho("exe keepjumps put ='".fsz.'/'.file."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002296 let fszpfile= fsz.'/'.pfile
2297 keepjumps put =fszpfile
2298
Bram Moolenaar8299df92004-07-10 09:47:34 +00002299 else
2300 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002301" call Decho("exe keepjumps put ='".pfile."'")
2302 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002303 endif
2304 endwhile
2305
2306" call Dret("LocalBrowseList")
2307endfun
2308
2309" ---------------------------------------------------------------------
2310" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2311" directory and a new directory name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002312fun! <SID>LocalBrowseChgDir(dirname,newdir,...)
2313" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002314
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002315 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002316 let newdir = a:newdir
2317
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002318 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002319 " apparently vim is "recognizing" that it is in the home directory and
2320 " is removing the "/". Bad idea, so I have to put it back.
2321 let dirname= dirname.'/'
2322" call Decho("adjusting dirname<".dirname.">")
2323 endif
2324
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002325 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002326 " handling a file
2327 let dirname= dirname.newdir
2328" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002329 " this lets NetBrowseX avoid the edit
2330 if a:0 < 1
2331 exe "e ".escape(dirname,s:netrw_cd_escape)
2332 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002333
2334 elseif newdir == './'
2335 " refresh the directory list
2336" call Decho("refresh directory listing")
2337 setlocal ma
2338 %d
2339
2340 elseif newdir == '../'
2341 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002342 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002343" call Decho("go up one dir: dirname<".dirname.">")
2344
2345 else
2346 " go down one directory
2347 let dirname= dirname.newdir
2348" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2349 endif
2350
2351" call Dret("LocalBrowseChgDir <".dirname.">")
2352 return dirname
2353endfun
2354
2355" ---------------------------------------------------------------------
2356" LocalBrowseRm:
2357fun! <SID>LocalBrowseRm(path) range
2358" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2359" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2360
2361 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002362 let ctr = a:firstline
2363 let ret = 0
2364 let netrw_origdir = s:NetGetcwd(1)
2365 exe 'cd '.b:netrw_curdir
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002366 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002367
2368 " remove multiple files and directories
2369 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002370 exe "keepjumps ".ctr
2371
2372 " sanity checks
2373 if line(".") < s:netrw_bannercnt
2374 let ctr= ctr + 1
2375 continue
2376 endif
2377 let curword= s:NetGetWord()
2378 if curword == "./" || curword == "../"
2379 let ctr= ctr + 1
2380 continue
2381 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002382
2383 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002384 let rmfile= a:path.curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002385" call Decho("rmfile<".rmfile.">")
2386
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002387 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002388 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002389 if !all
2390 echohl Statement
2391 call inputsave()
2392 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2393 call inputrestore()
2394 echohl NONE
2395 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2396 if ok =~ 'a\%[ll]'
2397 let all= 1
2398 endif
2399 endif
2400
2401 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002402 let ret= delete(rmfile)
2403" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002404 elseif ok =~ 'q\%[uit]'
2405 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002406 endif
2407
2408 else
2409 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002410 if !all
2411 echohl Statement
2412 call inputsave()
2413 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2414 call inputrestore()
2415 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2416 if ok =~ 'a\%[ll]'
2417 let all= 1
2418 endif
2419 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002420 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002421
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002422 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002423" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2424 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002425" call Decho("v:shell_error=".v:shell_error)
2426
2427 if v:shell_error != 0
2428" call Decho("2nd attempt to remove directory<".rmfile.">")
2429 let errcode= delete(rmfile)
2430" call Decho("errcode=".errcode)
2431
2432 if errcode != 0
2433 if has("unix")
2434" call Decho("3rd attempt to remove directory<".rmfile.">")
2435 call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002436 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002437 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002438 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002439 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002440 elseif !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002441 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002442 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002443 endif
2444 endif
2445 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002446
2447 elseif ok =~ 'q\%[uit]'
2448 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002449 endif
2450 endif
2451
2452 let ctr= ctr + 1
2453 endwhile
2454
2455 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002456 let curline= line(".")
2457 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002458" call Decho("refresh the directory")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002459 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002460 exe curline
2461
2462" call Dret("LocalBrowseRm")
2463endfun
2464
2465" ---------------------------------------------------------------------
2466" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00002467fun! <SID>LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002468" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2469
2470 " preparation for removing multiple files/directories
2471 let ctr= a:firstline
2472
2473 " attempt to rename files/directories
2474 while ctr <= a:lastline
2475 exe "keepjumps ".ctr
2476
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002477 " sanity checks
2478 if line(".") < s:netrw_bannercnt
2479 let ctr= ctr + 1
2480 continue
2481 endif
2482 let curword= s:NetGetWord()
2483 if curword == "./" || curword == "../"
2484 let ctr= ctr + 1
2485 continue
2486 endif
2487
Bram Moolenaar8299df92004-07-10 09:47:34 +00002488 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002489 let oldname= a:path.curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002490" call Decho("oldname<".oldname.">")
2491
2492 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002493 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002494 call inputrestore()
2495
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002496 let ret= system(g:netrw_local_rename.' "'.oldname.'" "'.newname.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002497" call Decho("executing system(".g:netrw_local_rename." ".oldname." ".newname)
2498
2499 let ctr= ctr + 1
2500 endwhile
2501
2502 " refresh the directory
2503 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002504" call Decho("refresh the directory listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002505 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002506 exe "keepjumps ".curline
2507" call Dret("LocalBrowseRename")
2508endfun
2509
2510" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002511" LocalPreview: {{{2
2512fun! <SID>LocalPreview(path) range
2513" call Dfunc("LocalPreview(path<".a:path.">)")
2514 if has("quickfix")
2515 if !isdirectory(a:path)
2516 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002517 elseif !exists("g:netrw_quiet")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002518 echoerr "sorry, cannot preview a directory such as <".a:path.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002519 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002520 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002521 elseif !exists("g:netrw_quiet")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002522 echoerr "sorry, to preview your vim needs the quickfix feature compiled in"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002523 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002524 endif
2525" call Dret("LocalPreview")
2526endfun
2527
2528" ---------------------------------------------------------------------
2529" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002530" Change backslashes to forward slashes, if any.
2531" If doesc is true, escape certain troublesome characters
2532fun! <SID>NetGetcwd(doesc)
2533" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
2534 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002535 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002536 let curdir= curdir.'/'
2537 endif
2538 if a:doesc
2539 let curdir= escape(curdir,s:netrw_cd_escape)
2540 endif
2541" call Dret("NetGetcwd <".curdir.">")
2542 return curdir
2543endfun
2544
2545" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00002546" NetMethod: determine method of transfer {{{1
2547" method == 1: rcp
2548" 2: ftp + <.netrc>
2549" 3: ftp + machine, id, password, and [path]filename
2550" 4: scp
2551" 5: http (wget)
2552" 6: cadaver
2553" 7: rsync
2554" 8: fetch
2555" 9: sftp
2556fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002557" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002558
2559 " initialization
2560 let b:netrw_method = 0
2561 let g:netrw_machine = ""
2562 let b:netrw_fname = ""
2563 let g:netrw_port = ""
2564
2565 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002566 " mipf : a:machine a:id password filename Use ftp
2567 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002568 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002569 " rcpurm : rcp://[user@]host/filename Use rcp
2570 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002571 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002572 " httpurm : http://[user@]host/filename Use wget
2573 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002574 " rsyncurm : rsync://host[:port]/path Use rsync
2575 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2576 " sftpurm : sftp://[user@]host/filename Use scp
2577 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2578 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
2579 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2580 let rcpurm = '^rcp://\(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
2581 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
2582 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2583 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002584 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002585 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
2586 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2587 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
2588
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002589" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002590 " Determine Method
2591 " rcp://user@hostname/...path-to-file
2592 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002593" call Decho("rcp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002594 let b:netrw_method = 1
2595 let userid = substitute(a:choice,rcpurm,'\2',"")
2596 let g:netrw_machine= substitute(a:choice,rcpurm,'\3',"")
2597 let b:netrw_fname = substitute(a:choice,rcpurm,'\4',"")
2598 if userid != ""
2599 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002600 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002601
2602 " scp://user@hostname/...path-to-file
2603 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002604" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002605 let b:netrw_method = 4
2606 let g:netrw_machine= substitute(a:choice,scpurm,'\1',"")
2607 let b:netrw_port = substitute(a:choice,scpurm,'\2',"")
2608 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
2609
2610 " http://user@hostname/...path-to-file
2611 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002612" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002613 let b:netrw_method = 5
2614 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2615 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
2616
2617 " dav://hostname[:port]/..path-to-file..
2618 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002619" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002620 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002621 if a:choice =~ '^s'
2622 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2623 else
2624 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2625 endif
2626 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002627
2628 " rsync://user@hostname/...path-to-file
2629 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002630" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002631 let b:netrw_method = 7
2632 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2633 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
2634
2635 " ftp://[user@]hostname[[:#]port]/...path-to-file
2636 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002637" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002638 let userid = substitute(a:choice,ftpurm,'\2',"")
2639 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2640 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2641 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
2642 if g:netrw_port != ""
2643 let g:netrw_port = substitute(g:netrw_port,"[#:]","","")
2644 endif
2645 if userid != ""
2646 let g:netrw_uid= userid
2647 endif
2648 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2649 let b:netrw_method = 3
2650 else
2651 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
2652 let b:netrw_method= 2
2653 else
2654 if !exists("g:netrw_uid") || g:netrw_uid == ""
2655 call NetUserPass()
2656 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
2657 call NetUserPass(g:netrw_uid)
2658 " else just use current g:netrw_uid and g:netrw_passwd
2659 endif
2660 let b:netrw_method= 3
2661 endif
2662 endif
2663
2664 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002665" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002666 let b:netrw_method = 8
2667 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
2668 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
2669 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
2670 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
2671
2672 " Issue an ftp : "machine id password [path/]filename"
2673 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002674" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002675 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002676 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
2677 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
2678 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
2679 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
2680
2681 " Issue an ftp: "hostname [path/]filename"
2682 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002683" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002684 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2685 let b:netrw_method = 3
2686 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2687 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2688
2689 elseif filereadable(expand("$HOME/.netrc"))
2690 let b:netrw_method = 2
2691 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2692 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2693 endif
2694
2695 " sftp://user@hostname/...path-to-file
2696 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002697" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002698 let b:netrw_method = 9
2699 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
2700 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
2701
2702 " Issue an rcp: hostname:filename" (this one should be last)
2703 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002704" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002705 let b:netrw_method = 1
2706 let userid = substitute(a:choice,rcphf,'\2',"")
2707 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
2708 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002709" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
2710" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
2711" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
2712" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002713 if userid != ""
2714 let g:netrw_uid= userid
2715 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002716 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002717 " don't let PCs try <.netrc>
2718 let b:netrw_method = 3
2719 endif
2720
2721 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002722 if !exists("g:netrw_quiet")
2723 echoerr "***error*** cannot determine method"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002724 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002725 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002726 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002727 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002728
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002729" call Decho("a:choice <".a:choice.">")
2730" call Decho("b:netrw_method <".b:netrw_method.">")
2731" call Decho("g:netrw_machine<".g:netrw_machine.">")
2732" call Decho("g:netrw_port <".g:netrw_port.">")
2733" if exists("g:netrw_uid") "Decho
2734" call Decho("g:netrw_uid <".g:netrw_uid.">")
2735" endif "Decho
2736" if exists("g:netrw_passwd") "Decho
2737" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
2738" endif "Decho
2739" call Decho("b:netrw_fname <".b:netrw_fname.">")
2740" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002741endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002742
2743" ------------------------------------------------------------------------
2744" NetUserPass: set username and password for subsequent ftp transfer {{{1
2745" Usage: :call NetUserPass() -- will prompt for userid and password
2746" :call NetUserPass("uid") -- will prompt for password
2747" :call NetUserPass("uid","password") -- sets global userid and password
2748fun! NetUserPass(...)
2749
2750 " get/set userid
2751 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002752" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002753 if !exists("g:netrw_uid") || g:netrw_uid == ""
2754 " via prompt
2755 let g:netrw_uid= input('Enter username: ')
2756 endif
2757 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002758" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002759 let g:netrw_uid= a:1
2760 endif
2761
2762 " get password
2763 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002764" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002765 let g:netrw_passwd= inputsecret("Enter Password: ")
2766 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002767" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002768 let g:netrw_passwd=a:2
2769 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002770" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002771endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002772
2773" ------------------------------------------------------------------------
2774" NetOptionSave: save options and set to "standard" form {{{1
2775fun!s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002776" call Dfunc("NetOptionSave()")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002777
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002778 " Get Temporary Filename
2779 let s:aikeep = &ai
2780 let s:cinkeep = &cin
2781 let s:cinokeep = &cino
2782 let s:comkeep = &com
2783 let s:cpokeep = &cpo
2784 let s:dirkeep = getcwd()
2785 let s:gdkeep = &gd
2786 let s:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00002787 setlocal cino =
2788 setlocal com =
2789 setlocal cpo -=aA
2790 setlocal nocin noai
2791 setlocal tw =0
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002792 if has("win32") && !has("win95")
2793 let s:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00002794 setlocal noswf
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002795" call Decho("setting s:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002796 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002797
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002798" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002799endfun
2800
2801" ------------------------------------------------------------------------
2802" NetOptionRestore: restore options {{{1
2803fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002804" call Dfunc("NetOptionRestore()")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002805
2806 let &ai = s:aikeep
2807 let &cin = s:cinkeep
2808 let &cino = s:cinokeep
2809 let &com = s:comkeep
2810 let &cpo = s:cpokeep
2811 exe "lcd ".s:dirkeep
2812 let &gd = s:gdkeep
2813 let &tw = s:twkeep
2814 if exists("s:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002815 if &directory == ""
2816 " user hasn't specified a swapfile directory;
2817 " netrw will temporarily make the swapfile
2818 " directory the current local one.
2819 let &directory = getcwd()
2820 silent! let &swf = s:swfkeep
2821 set directory=
2822 else
2823 let &swf= s:swfkeep
2824 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002825 unlet s:swfkeep
2826 endif
2827 unlet s:aikeep
2828 unlet s:cinkeep
2829 unlet s:cinokeep
2830 unlet s:comkeep
2831 unlet s:cpokeep
2832 unlet s:gdkeep
2833 unlet s:twkeep
2834 unlet s:dirkeep
2835
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002836" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002837endfun
2838
2839" ------------------------------------------------------------------------
2840" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002841" to handle extra junk that their system's ftp dumps
2842" into the transfer. This function is provided as an
2843" example and as a fix for a Windows 95 problem: in my
2844" experience, win95's ftp always dumped four blank lines
2845" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002846if has("win95") && g:netrw_win95ftp
2847 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002848" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002849 if method == 3 " ftp (no <.netrc>)
2850 let fourblanklines= line2 - 3
2851 silent fourblanklines.",".line2."g/^\s*/d"
2852 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002853" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002854 endfun
2855endif
2856
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002857" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002858" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002859fun! <SID>NetSort() range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002860" call Dfunc("NetSort()")
2861
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002862 let i = a:firstline + 1
2863 while i <= a:lastline
2864 " find insertion point via binary search
2865 let i_val = getline(i)
2866 let lo = a:firstline
2867 let hi = i
2868 while lo < hi
2869 let mid = (lo + hi) / 2
2870 let mid_val = getline(mid)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002871 if g:netrw_sort_direction =~ '^n'
2872 " normal sorting order
2873 if i_val < mid_val
2874 let hi = mid
2875 else
2876 let lo = mid + 1
2877 if i_val == mid_val | break | endif
2878 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002879 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002880 " reverse sorting order
2881 if i_val > mid_val
2882 let hi = mid
2883 else
2884 let lo = mid + 1
2885 if i_val == mid_val | break | endif
2886 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002887 endif
2888 endwhile
2889 " do insert
2890 if lo < i
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002891 exe 'keepjumps '.i.'d_'
2892 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002893 endif
2894 let i = i + 1
2895 endwhile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002896
2897" call Dret("NetSort")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002898endfun
2899
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002900" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002901" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
2902" What this function does is to compute a priority for the patterns
2903" in the g:netrw_sort_sequence. It applies a substitute to any
2904" "files" that satisfy each pattern, putting the priority / in
2905" front. An "*" pattern handles the default priority.
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002906fun! <SID>SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002907" call Dfunc("SetSort() bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002908 if g:netrw_longlist
2909 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
2910 else
2911 let seqlist = g:netrw_sort_sequence
2912 endif
2913 " sanity check -- insure that * appears somewhere
2914 if seqlist == ""
2915 let seqlist= '*'
2916 elseif seqlist !~ '\*'
2917 let seqlist= seqlist.',*'
2918 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002919 let priority = 1
2920 while seqlist != ""
2921 if seqlist =~ ','
2922 let seq = substitute(seqlist,',.*$','','e')
2923 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
2924 else
2925 let seq = seqlist
2926 let seqlist = ""
2927 endif
2928 let eseq= escape(seq,'/')
2929 if priority < 10
2930 let spriority= "00".priority.'\/'
2931 elseif priority < 100
2932 let spriority= "0".priority.'\/'
2933 else
2934 let spriority= priority.'\/'
2935 endif
2936" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
2937
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002938 " sanity check
2939 if s:netrw_bannercnt > line("$")
2940 " apparently no files were left after a Hiding pattern was used
2941" call Dret("SetSort : no files left after hiding")
2942 return
2943 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002944 if seq == '*'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002945 exe 'keepjumps silent '.s:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002946 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002947 exe 'keepjumps silent '.s:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002948 endif
2949 let priority = priority + 1
2950 endwhile
2951
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002952 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002953
2954" call Dret("SetSort")
2955endfun
2956
Bram Moolenaar071d4272004-06-13 20:20:40 +00002957" ------------------------------------------------------------------------
2958" Restore {{{1
2959let &cpo= s:save_cpo
2960unlet s:save_cpo
2961" vim:ts=8 fdm=marker