blob: c797beca30a7637a3b0ad4d0dc659c1065449d96 [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002" AUTOLOAD PORTION
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003" Last Change: Aug 19, 2005
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00004" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00005" Version: 65
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00006" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
7" Copyright: Copyright (C) 1999-2005 Charles E. Campbell, Jr. {{{1
Bram Moolenaar572cb562005-08-05 21:35:02 +00008" Permission is hereby granted to use and distribute this code,
9" with or without modifications, provided that this copyright
10" notice is copied with it. Like anything else that's free,
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000011" netrw.vim is provided *as is* and comes with no warranty
12" of any kind, either expressed or implied. By using this
13" plugin, you agree that in no event will the copyright
14" holder be liable for any damages resulting from the use
15" of this software.
Bram Moolenaar071d4272004-06-13 20:20:40 +000016"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000017" But be doers of the Word, and not only hearers, deluding your own selves {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000018" (James 1:22 RSV)
19" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bram Moolenaar488c6512005-08-11 20:09:58 +000020let s:keepcpo= &cpo
Bram Moolenaar071d4272004-06-13 20:20:40 +000021set cpo&vim
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000022" call Decho("doing autoload/netrw.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +000023
24" ---------------------------------------------------------------------
25" Default values for global netrw variables {{{1
26if !exists("g:netrw_ftpmode")
27 let g:netrw_ftpmode= "binary"
28endif
29if !exists("g:netrw_win95ftp")
30 let g:netrw_win95ftp= 1
31endif
32if !exists("g:netrw_cygwin")
Bram Moolenaard4755bb2004-09-02 19:12:26 +000033 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000034 if &shell == "bash"
35 let g:netrw_cygwin= 1
36 else
37 let g:netrw_cygwin= 0
38 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000039 else
40 let g:netrw_cygwin= 0
41 endif
42endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000043if !exists("g:netrw_list_cmd")
44 if executable("ssh")
45 " provide a default listing command
46 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
47 else
Bram Moolenaar83bab712005-08-01 21:58:57 +000048" call Decho("ssh is not executable, can't do remote directory exploring with ssh")
Bram Moolenaar843ee412004-06-30 16:16:41 +000049 let g:netrw_list_cmd= ""
50 endif
51endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +000052if !exists("g:netrw_ftp_list_cmd")
53 if has("unix") || exists("g:netrw_cygwin")
54 let g:netrw_ftp_list_cmd= "ls -lF"
55 else
56 let g:netrw_ftp_list_cmd= "dir"
57 endif
58endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000059if !exists("g:netrw_rm_cmd")
60 let g:netrw_rm_cmd = "ssh HOSTNAME rm"
61endif
62if !exists("g:netrw_rmf_cmd")
63 let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
64endif
65if !exists("g:netrw_rmdir_cmd")
66 let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
67endif
68if !exists("g:netrw_rename_cmd")
69 let g:netrw_rename_cmd= "ssh HOSTNAME mv"
70endif
71if exists("g:netrw_silent") && g:netrw_silent != 0
72 let g:netrw_silentxfer= "silent "
73else
74 let g:netrw_silentxfer= ""
75endif
76if !exists("g:netrw_winsize")
77 let g:netrw_winsize= ""
78endif
79if !exists("g:netrw_list_hide")
80 let g:netrw_list_hide= ""
81endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000082if !exists("g:netrw_sort_by")
83 " alternatives: date size
84 let g:netrw_sort_by= "name"
85endif
86if !exists("g:netrw_sort_sequence")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000087 let g:netrw_sort_sequence= '[\/]$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000088endif
89if !exists("g:netrw_sort_direction")
90 " alternative: reverse (z y x ...)
91 let g:netrw_sort_direction= "normal"
92endif
Bram Moolenaar8299df92004-07-10 09:47:34 +000093if !exists("g:netrw_longlist") || g:netrw_longlist == 0
94 let g:netrw_longlist= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +000095 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
Bram Moolenaar8299df92004-07-10 09:47:34 +000096else
97 let g:netrw_longlist= 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +000098 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -l"
99endif
100if !exists("g:netrw_list_cmd")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000101endif
102if !exists("g:netrw_timefmt")
103 let g:netrw_timefmt= "%c"
104endif
105if !exists("g:netrw_local_rmdir")
106 let g:netrw_local_rmdir= "rmdir"
107endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000108if !exists("g:netrw_local_mkdir")
109 let g:netrw_local_mkdir= "mkdir"
110endif
111if !exists("g:netrw_mkdir_cmd")
112 let g:netrw_mkdir_cmd= "ssh HOSTNAME mkdir"
113endif
Bram Moolenaar269ec652004-07-29 08:43:53 +0000114if !exists("g:netrw_hide")
115 let g:netrw_hide= 1
116endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000117if !exists("g:netrw_ftp_browse_reject")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000118 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 +0000119endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000120if !exists("g:netrw_ssh_browse_reject")
121 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
122endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000123if !exists("g:netrw_keepdir")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000124 let g:netrw_keepdir= 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000125endif
126if !exists("s:netrw_cd_escape")
127 if has("win32") || has("win95") || has("win64") || has("win16")
128 let s:netrw_cd_escape="#% "
129 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000130 let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000131 endif
132endif
133if !exists("s:netrw_glob_escape")
134 if has("win32") || has("win95") || has("win64") || has("win16")
135 let s:netrw_glob_escape= ""
136 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000137 let s:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000138 endif
139endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000140if !exists("g:netrw_alto")
141 let g:netrw_alto= 0
142endif
143if !exists("g:netrw_altv")
144 let g:netrw_altv= 0
145endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000146if !exists("g:netrw_maxfilenamelen")
147 let g:netrw_maxfilenamelen= 32
148endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000149if !exists("g:netrw_dirhistmax")
150 let g:netrw_dirhistmax= 10
151endif
152if !exists("g:NETRW_DIRHIST_CNT")
153 let g:NETRW_DIRHIST_CNT= 0
154endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000155
156" BufEnter event ignored by decho when following variable is true
157" Has a side effect that doau BufReadPost doesn't work, so
158" files read by network transfer aren't appropriately highlighted.
159"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000160
161" ---------------------------------------------------------------------
162" Default values for global protocol variables {{{1
163if !exists("g:netrw_rcp_cmd")
164 let g:netrw_rcp_cmd = "rcp"
165endif
166if !exists("g:netrw_ftp_cmd")
167 let g:netrw_ftp_cmd = "ftp"
168endif
169if !exists("g:netrw_scp_cmd")
170 let g:netrw_scp_cmd = "scp -q"
171endif
172if !exists("g:netrw_sftp_cmd")
173 let g:netrw_sftp_cmd = "sftp"
174endif
175if !exists("g:netrw_http_cmd")
176 if executable("wget")
177 let g:netrw_http_cmd = "wget -q -O"
178 elseif executable("fetch")
179 let g:netrw_http_cmd = "fetch -o"
180 else
181 let g:netrw_http_cmd = ""
182 endif
183endif
184if !exists("g:netrw_dav_cmd")
185 let g:netrw_dav_cmd = "cadaver"
186endif
187if !exists("g:netrw_rsync_cmd")
188 let g:netrw_rsync_cmd = "rsync"
189endif
190if !exists("g:netrw_fetch_cmd")
191 if executable("fetch")
192 let g:netrw_fetch_cmd = "fetch -o"
193 else
194 let g:netrw_fetch_cmd = ""
195 endif
196endif
197
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000198if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000199 \ && exists("g:netrw_use_nt_rcp")
200 \ && g:netrw_use_nt_rcp
201 \ && executable( $SystemRoot .'/system32/rcp.exe')
202 let s:netrw_has_nt_rcp = 1
203 let s:netrw_rcpmode = '-b'
204 else
205 let s:netrw_has_nt_rcp = 0
206 let s:netrw_rcpmode = ''
207endif
208
Bram Moolenaar071d4272004-06-13 20:20:40 +0000209" ------------------------------------------------------------------------
210" NetSavePosn: saves position of cursor on screen {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000211fun! netrw#NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000212" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000213 " Save current line and column
Bram Moolenaar488c6512005-08-11 20:09:58 +0000214 let w:netrw_winnr= winnr()
215 let w:netrw_line = line(".")
216 let w:netrw_col = virtcol(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000217
218 " Save top-of-screen line
219 norm! H0
Bram Moolenaar488c6512005-08-11 20:09:58 +0000220 let w:netrw_hline= line(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000221
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000222 call netrw#NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000223" call Dret("NetSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000224endfun
225
226" ------------------------------------------------------------------------
227" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000228fun! netrw#NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000229" call Dfunc("NetRestorePosn() winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
Bram Moolenaar572cb562005-08-05 21:35:02 +0000230 let eikeep= &ei
231 set ei=all
Bram Moolenaar071d4272004-06-13 20:20:40 +0000232
Bram Moolenaar81695252004-12-29 20:58:21 +0000233 " restore window
Bram Moolenaar488c6512005-08-11 20:09:58 +0000234" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
235 exe "silent! ".w:netrw_winnr."wincmd w"
Bram Moolenaar572cb562005-08-05 21:35:02 +0000236" if v:shell_error == 0
237" " as suggested by Bram M: redraw on no error
238" " allows protocol error messages to remain visible
239" redraw!
240" endif
Bram Moolenaar81695252004-12-29 20:58:21 +0000241
Bram Moolenaar071d4272004-06-13 20:20:40 +0000242 " restore top-of-screen line
Bram Moolenaar488c6512005-08-11 20:09:58 +0000243" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
244 exe "norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaar81695252004-12-29 20:58:21 +0000245
Bram Moolenaar071d4272004-06-13 20:20:40 +0000246 " restore position
Bram Moolenaar488c6512005-08-11 20:09:58 +0000247" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
248 exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000249
Bram Moolenaar572cb562005-08-05 21:35:02 +0000250 let &ei= eikeep
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000251" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000252endfun
253
254" ------------------------------------------------------------------------
255" NetRead: responsible for reading a file over the net {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000256fun! netrw#NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000257" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000258
259 " save options
260 call s:NetOptionSave()
261
262 " Special Exception: if a file is named "0r", then
263 " "0r" will be used to read the
264 " following files instead of "r"
265 if a:0 == 0
266 let readcmd= "r"
267 let ichoice= 0
268 elseif a:1 == "0r"
269 let readcmd = "0r"
270 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000271 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000272 let readcmd = "r"
273 let ichoice = 1
274 endif
275
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000276 " get name of a temporary file and set up shell-quoting character
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000277 let tmpfile= tempname()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000278 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
279 echohl Error | echo "***netrw*** your ".substitute(tmpfile,'[^/]\+$','','e')." directory is missing!"
280 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
281" call Dret("NetRead")
282 return
283 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000284
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000285" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000286 while ichoice <= a:0
287
288 " attempt to repeat with previous host-file-etc
289 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000290" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000291 let choice = b:netrw_lastfile
292 let ichoice= ichoice + 1
293
294 else
295 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000296" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000297
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000298 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000299 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000300 echomsg 'NetRead Usage:'
301 echomsg ':Nread machine:path uses rcp'
302 echomsg ':Nread "machine path" uses ftp with <.netrc>'
303 echomsg ':Nread "machine id password path" uses ftp'
304 echomsg ':Nread dav://machine[:port]/path uses cadaver'
305 echomsg ':Nread fetch://machine/path uses fetch'
306 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
307 echomsg ':Nread http://[user@]machine/path uses http wget'
308 echomsg ':Nread rcp://[user@]machine/path uses rcp'
309 echomsg ':Nread rsync://machine[:port]/path uses rsync'
310 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
311 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000312 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000313
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000314 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000315 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000316" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000317 if match(choice,"\"$") != -1
318 " case "..."
319 let choice=strpart(choice,1,strlen(choice)-2)
320 else
321 " case "... ... ..."
322 let choice = strpart(choice,1,strlen(choice)-1)
323 let wholechoice = ""
324
325 while match(choice,"\"$") == -1
326 let wholechoice = wholechoice . " " . choice
327 let ichoice = ichoice + 1
328 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000329 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000330 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000331 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000332 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000333" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000334 return
335 endif
336 let choice= a:{ichoice}
337 endwhile
338 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
339 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000340 endif
341 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000342
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000343" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000344 let ichoice= ichoice + 1
345
346 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000347 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000348 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000349" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000350
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000351 exe 'lcd ' . fnamemodify(tmpfile,':h')
352 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000353 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000354
355 " Determine method of read (ftp, rcp, etc)
356 call s:NetMethod(choice)
357
Bram Moolenaar843ee412004-06-30 16:16:41 +0000358 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000359" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000360 if choice =~ "^.*[\/]$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000361 keepjumps call s:NetBrowse(choice)
362" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000363 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000364 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000365
366 " ============
367 " Perform Read
368 " ============
369
370 ".........................................
371 " rcp: NetRead Method #1
372 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000373" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000374 " ER: noting done with g:netrw_uid yet?
375 " ER: on Win2K" rcp machine[.user]:file tmpfile
376 " ER: if machine contains '.' adding .user is required (use $USERNAME)
377 " ER: the tmpfile is full path: rcp sees C:\... as host C
378 if s:netrw_has_nt_rcp == 1
379 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
380 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
381 else
382 " Any way needed it machine contains a '.'
383 let uid_machine = g:netrw_machine .'.'. $USERNAME
384 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000385 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000386 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
387 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
388 else
389 let uid_machine = g:netrw_machine
390 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000391 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000392" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000393 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
394 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
395 let b:netrw_lastfile = choice
396
397 ".........................................
398 " ftp + <.netrc>: NetRead Method #2
399 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000400" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000401 let netrw_fname= b:netrw_fname
402 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000403 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000404 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000405 exe "put ='"."get ".netrw_fname." ".tmpfile."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000406 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000407" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000408 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
409 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000410" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000411 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
412 endif
413 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000414 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000415 let debugkeep= &debug
416 set debug=msg
Bram Moolenaar572cb562005-08-05 21:35:02 +0000417 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000418 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000419 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000420 endif
421 bd!
422 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
423 let b:netrw_lastfile = choice
424
425 ".........................................
426 " ftp + machine,id,passwd,filename: NetRead Method #3
427 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
428 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000429" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000430 let netrw_fname= b:netrw_fname
431 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000432 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000433 if exists("g:netrw_port") && g:netrw_port != ""
434 put ='open '.g:netrw_machine.' '.g:netrw_port
435 else
436 put ='open '.g:netrw_machine
437 endif
438
439 if exists("g:netrw_ftp") && g:netrw_ftp == 1
440 put =g:netrw_uid
441 put =g:netrw_passwd
442 else
443 put ='user '.g:netrw_uid.' '.g:netrw_passwd
444 endif
445
446 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
447 put =g:netrw_ftpmode
448 endif
449 put ='get '.netrw_fname.' '.tmpfile
450
451 " perform ftp:
452 " -i : turns off interactive prompting from ftp
453 " -n unix : DON'T use <.netrc>, even though it exists
454 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000455" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000456 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000457" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000458 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
459 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
460 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000461" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000462 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000463 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000464 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000465 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000466 endif
467 bd!
468 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
469 let b:netrw_lastfile = choice
470
471 ".........................................
472 " scp: NetRead Method #4
473 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000474" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000475 if exists("g:netrw_port") && g:netrw_port != ""
476 let useport= " -P ".g:netrw_port
477 else
478 let useport= ""
479 endif
480 if g:netrw_cygwin == 1
481 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000482" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000483 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
484 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000485" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000486 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
487 endif
488 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
489 let b:netrw_lastfile = choice
490
491 ".........................................
492 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000493" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000494 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000495 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000496 echohl Error | echo "***netrw*** neither wget nor fetch command is available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000497 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000498 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000499 exit
500 endif
501
502 if match(b:netrw_fname,"#") == -1
503 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000504" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000505 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
506 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
507
508 else
509 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
510 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
511 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000512" call Decho("netrw_html<".netrw_html.">")
513" call Decho("netrw_tag <".netrw_tag.">")
514" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000515 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
516 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000517" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000518 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
519 endif
520 let b:netrw_lastfile = choice
521
522 ".........................................
523 " cadaver: NetRead Method #6
524 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000525" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000526
527 " Construct execution string (four lines) which will be passed through filter
528 let netrw_fname= b:netrw_fname
529 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000530 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000531 if exists("g:netrw_port") && g:netrw_port != ""
532 put ='open '.g:netrw_machine.' '.g:netrw_port
533 else
534 put ='open '.g:netrw_machine
535 endif
536 put ='user '.g:netrw_uid.' '.g:netrw_passwd
537
538 if g:netrw_cygwin == 1
539 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
540 put ='get '.netrw_fname.' '.cygtmpfile
541 else
542 put ='get '.netrw_fname.' '.tmpfile
543 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000544 put ='quit'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000545
546 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000547 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000548" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000549 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
550 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000551 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000552 let b:netrw_lastfile = choice
553
554 ".........................................
555 " rsync: NetRead Method #7
556 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000557" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000558 if g:netrw_cygwin == 1
559 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000560" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000561 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
562 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000563" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000564 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
565 endif
566 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
567 let b:netrw_lastfile = choice
568
569 ".........................................
570 " fetch: NetRead Method #8
571 " fetch://[user@]host[:http]/path
572 elseif b:netrw_method == 8 " read with fetch
573 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000574 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000575 echohl Error | echo "***netrw*** fetch command not available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000576 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000577 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000578 exit
579 endif
580 if exists("g:netrw_option") && g:netrw_option == ":http"
581 let netrw_option= "http"
582 else
583 let netrw_option= "ftp"
584 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000585" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000586
587 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000588" 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 +0000589 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
590 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000591" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000592 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
593 endif
594
595 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
596 let b:netrw_lastfile = choice
597
598 ".........................................
599 " sftp: NetRead Method #9
600 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000601" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000602 if g:netrw_cygwin == 1
603 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000604" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
605" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000606 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
607 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000608" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000609 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
610 endif
611 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
612 let b:netrw_lastfile = choice
613
614 ".........................................
615 else " Complain
616 echo "***warning*** unable to comply with your request<" . choice . ">"
617 endif
618 endwhile
619
620 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000621" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000622 if exists("b:netrw_method")
623 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000624 unlet b:netrw_fname
625 endif
626 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000627
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000628" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000629endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000630
631" ------------------------------------------------------------------------
632" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
633fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000634" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000635
636 if exists("*NetReadFixup")
637 " for the use of NetReadFixup (not otherwise used internally)
638 let line2= line("$")
639 endif
640
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000641 " transform paths from / to \ for Windows (except for cygwin)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000642 if &term == "win32"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000643 if g:netrw_cygwin
644 let fname= a:fname
645" call Decho("(win32 && cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000646 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000647 let fname= substitute(a:fname,'/','\\\\','ge')
648" call Decho("(win32 && !cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000649 endif
650 else
651 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000652" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000653 endif
654
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000655 if a:readcmd[0] == '0'
Bram Moolenaar81695252004-12-29 20:58:21 +0000656 " get file into buffer
Bram Moolenaar83bab712005-08-01 21:58:57 +0000657
Bram Moolenaar81695252004-12-29 20:58:21 +0000658 " record remote filename
Bram Moolenaar83bab712005-08-01 21:58:57 +0000659 let rfile= bufname(".")
660" call Decho("remotefile<".rfile.">")
661" call Dredir("ls!","starting buffer list")
662
Bram Moolenaar81695252004-12-29 20:58:21 +0000663 " rename the current buffer to the temp file (ie. fname)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000664 if v:version < 700
665 exe "file ".fname
666 else
667 keepalt exe "file ".fname
668 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000669" call Dredir("ls!","after renaming current buffer to <".fname.">")
670
Bram Moolenaar81695252004-12-29 20:58:21 +0000671 " edit temporary file
672 e
Bram Moolenaar83bab712005-08-01 21:58:57 +0000673" call Dredir("ls!","after editing temporary file")
674
Bram Moolenaar81695252004-12-29 20:58:21 +0000675 " rename buffer back to remote filename
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000676 if v:version < 700
677 exe "file ".rfile
678 else
679 keepalt exe "file ".rfile
680 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000681" call Dredir("ls!","renaming buffer back to remote filename<".rfile.">")
Bram Moolenaar81695252004-12-29 20:58:21 +0000682 let line1 = 1
683 let line2 = line("$")
684
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000685 elseif filereadable(fname)
Bram Moolenaar81695252004-12-29 20:58:21 +0000686 " read file after current line
687 let curline = line(".")
688 let lastline= line("$")
689" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname."> line#".curline)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000690 exe a:readcmd." ".v:cmdarg." ".fname
Bram Moolenaar81695252004-12-29 20:58:21 +0000691 let line1 = curline + 1
692 let line2 = line("$") - lastline + 1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000693 else
Bram Moolenaar81695252004-12-29 20:58:21 +0000694 " not readable
695" call Dret("NetGetFile : fname<".fname."> not readable")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000696 return
697 endif
698
699 " User-provided (ie. optional) fix-it-up command
700 if exists("*NetReadFixup")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000701" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000702 call NetReadFixup(a:method, line1, line2)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000703" else " Decho
704" call Decho("NetReadFixup() not called, doesn't exist")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000705 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000706
707 " update the Buffers menu
708 if has("gui") && has("gui_running")
709 silent! emenu Buffers.Refresh\ menu
710 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000711
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000712" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000713
714 " insure that we have the right filetype and that its being displayed
715 filetype detect
716 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000717" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000718endfun
719
720" ------------------------------------------------------------------------
721" NetWrite: responsible for writing a file over the net {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000722fun! netrw#NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000723" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000724
725 " option handling
726 let mod= 0
727 call s:NetOptionSave()
728
729 " Get Temporary Filename
730 let tmpfile= tempname()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000731 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
732 echohl Error | echo "***netrw*** your ".substitute(tmpfile,'[^/]\+$','','e')." directory is missing!"
733 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
734" call Dret("NetRead")
735 return
736 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000737
738 if a:0 == 0
739 let ichoice = 0
740 else
741 let ichoice = 1
742 endif
743
744 " write (selected portion of) file to temporary
745 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
746
747 while ichoice <= a:0
748
749 " attempt to repeat with previous host-file-etc
750 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000751" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000752 let choice = b:netrw_lastfile
753 let ichoice= ichoice + 1
754 else
755 exe "let choice= a:" . ichoice
756
757 " Reconstruct Choice if choice starts with '"'
758 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000759 echomsg 'NetWrite Usage:"'
760 echomsg ':Nwrite machine:path uses rcp'
761 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
762 echomsg ':Nwrite "machine id password path" uses ftp'
763 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
764 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
765 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
766 echomsg ':Nwrite rcp://machine/path uses rcp'
767 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
768 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
769 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000770 break
771
772 elseif match(choice,"^\"") != -1
773 if match(choice,"\"$") != -1
774 " case "..."
775 let choice=strpart(choice,1,strlen(choice)-2)
776 else
777 " case "... ... ..."
778 let choice = strpart(choice,1,strlen(choice)-1)
779 let wholechoice = ""
780
781 while match(choice,"\"$") == -1
782 let wholechoice= wholechoice . " " . choice
783 let ichoice = ichoice + 1
784 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000785 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000786 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000787 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000788 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000789" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000790 return
791 endif
792 let choice= a:{ichoice}
793 endwhile
794 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
795 endif
796 endif
797 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000798" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000799 let ichoice= ichoice + 1
800
801 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000802 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000803 let choice= substitute(choice,'\\','/','ge')
804 "ER: see NetRead()
805 exe 'lcd ' . fnamemodify(tmpfile,':h')
806 let tmpfile = fnamemodify(tmpfile,':t')
807 endif
808
809 " Determine method of read (ftp, rcp, etc)
810 call s:NetMethod(choice)
811
812 " =============
813 " Perform Write
814 " =============
815
816 ".........................................
817 " rcp: NetWrite Method #1
818 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000819" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000820 if s:netrw_has_nt_rcp == 1
821 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
822 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
823 else
824 let uid_machine = g:netrw_machine .'.'. $USERNAME
825 endif
826 else
827 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
828 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
829 else
830 let uid_machine = g:netrw_machine
831 endif
832 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000833" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000834 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
835 let b:netrw_lastfile = choice
836
837 ".........................................
838 " ftp + <.netrc>: NetWrite Method #2
839 elseif b:netrw_method == 2 " write with ftp + <.netrc>
840 let netrw_fname = b:netrw_fname
841 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000842 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000843 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000844" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000845 exe "put ='"."put ".tmpfile." ".netrw_fname."'"
846" call Decho("put ='"."put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000847 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000848" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000849 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000850 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000851" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000852 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000853 endif
854 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
855 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000856 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000857 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000858 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000859 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000860 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000861 endif
862 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000863 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000864
865 ".........................................
866 " ftp + machine, id, passwd, filename: NetWrite Method #3
867 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
868 let netrw_fname= b:netrw_fname
869 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000870 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000871 if exists("g:netrw_port") && g:netrw_port != ""
872 put ='open '.g:netrw_machine.' '.g:netrw_port
873 else
874 put ='open '.g:netrw_machine
875 endif
876 if exists("g:netrw_ftp") && g:netrw_ftp == 1
877 put =g:netrw_uid
878 put =g:netrw_passwd
879 else
880 put ='user '.g:netrw_uid.' '.g:netrw_passwd
881 endif
882 put ='put '.tmpfile.' '.netrw_fname
883 " save choice/id/password for future use
884 let b:netrw_lastfile = choice
885
886 " perform ftp:
887 " -i : turns off interactive prompting from ftp
888 " -n unix : DON'T use <.netrc>, even though it exists
889 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000890" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000891 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000892" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000893 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
894 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
895 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000896 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000897 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000898 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000899 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000900 let mod=1
901 endif
902 bd!
903
904 ".........................................
905 " scp: NetWrite Method #4
906 elseif b:netrw_method == 4 " write with scp
907 if exists("g:netrw_port") && g:netrw_port != ""
908 let useport= " -P ".g:netrw_port
909 else
910 let useport= ""
911 endif
912 if g:netrw_cygwin == 1
913 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000914" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000915 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
916 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000917" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000918 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
919 endif
920 let b:netrw_lastfile = choice
921
922 ".........................................
923 " http: NetWrite Method #5
924 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000925 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000926 echohl Error | echo "***netrw*** currently <netrw.vim> does not support writing using http:" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000927 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000928 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000929
930 ".........................................
931 " dav: NetWrite Method #6
932 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000933" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000934
935 " Construct execution string (four lines) which will be passed through filter
936 let netrw_fname= b:netrw_fname
937 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000938 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000939 if exists("g:netrw_port") && g:netrw_port != ""
940 put ='open '.g:netrw_machine.' '.g:netrw_port
941 else
942 put ='open '.g:netrw_machine
943 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000944 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000945
946 if g:netrw_cygwin == 1
947 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
948 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000949 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000950 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000951 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000952
953 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000954 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000955" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000956 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
957 bd!
958 let b:netrw_lastfile = choice
959
960 ".........................................
961 " rsync: NetWrite Method #7
962 elseif b:netrw_method == 7 " write with rsync
963 if g:netrw_cygwin == 1
964 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000965" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000966 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000967 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000968" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000969 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000970 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000971 let b:netrw_lastfile = choice
972
973 ".........................................
974 " scp: NetWrite Method #9
975 elseif b:netrw_method == 9 " write with sftp
976 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000977 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
978 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
979 else
980 let uid_machine = g:netrw_machine
981 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000982 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000983 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000984 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000985 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000986" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000987 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
988 bd!
989 let b:netrw_lastfile= choice
990
991 ".........................................
992 else " Complain
993 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000994 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000995 endwhile
996
997 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000998" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000999 let result=delete(tmpfile)
1000 call s:NetOptionRestore()
1001
1002 if a:firstline == 1 && a:lastline == line("$")
1003 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001004 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001005
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001006" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001007endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001008
Bram Moolenaar83bab712005-08-01 21:58:57 +00001009" ===========================================
1010" Remote Directory Browsing Support: {{{1
1011" ===========================================
1012
Bram Moolenaar843ee412004-06-30 16:16:41 +00001013" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001014" of the contents of a remote directory. It is assumed that the
1015" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1016" with the requested remote hostname first.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001017fun! s:NetBrowse(dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001018" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".g:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001019
Bram Moolenaar488c6512005-08-11 20:09:58 +00001020 if exists("s:netrw_skipbrowse")
1021 unlet s:netrw_skipbrowse
1022" call Dret("NetBrowse")
1023 return
1024 endif
1025
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001026 call s:NetOptionSave()
1027
Bram Moolenaar843ee412004-06-30 16:16:41 +00001028 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001029 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1030" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001031 if !executable("ftp")
1032 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001033 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ftp" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001034 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001035 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001036 call s:NetOptionRestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001037" call Dret("NetBrowse")
1038 return
1039 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001040 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001041 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001042 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ssh" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001043 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001044 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001045
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001046 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001047" call Dret("NetBrowse")
1048 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001049 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001050
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001051 " use buffer-oriented WinVars if buffer ones exist but window ones don't
1052 call s:UseBufWinVars()
1053
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001054 " make this buffer modifiable
Bram Moolenaar83bab712005-08-01 21:58:57 +00001055 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001056
1057 " analyze a:dirname and g:netrw_list_cmd
1058 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001059 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001060" call Decho("dirpat<".dirpat.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001061 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001062 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001063 echohl Error | echo "***netrw*** netrw doesn't understand your dirname<".dirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001064 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001065 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001066 call s:NetOptionRestore()
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001067" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001068 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001069 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001070
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001071 let method = substitute(dirname,dirpat,'\1','')
1072 let user = substitute(dirname,dirpat,'\2','')
1073 let machine = substitute(dirname,dirpat,'\3','')
1074 let path = substitute(dirname,dirpat,'\4','')
1075 let fname = substitute(dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001076" call Decho("set up method <".method .">")
1077" call Decho("set up user <".user .">")
1078" call Decho("set up machine<".machine.">")
1079" call Decho("set up path <".path .">")
1080" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001081
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001082 if method == "ftp" || method == "http"
1083 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001084 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001085 else
1086 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1087 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001088
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001089 if exists("b:netrw_method")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001090" call Decho("setting w:netrw_method<".b:netrw_method.">")
1091 let w:netrw_method= b:netrw_method
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001092 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001093
Bram Moolenaar8299df92004-07-10 09:47:34 +00001094 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001095 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
Bram Moolenaar572cb562005-08-05 21:35:02 +00001096 echohl WarningMsg | echo "***netrw*** windows' ftp doesn't support time/size sorts (get cygwin, set g:netrw_cygwin)" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001097 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001098 else
1099 if g:netrw_sort_by =~ "^t"
1100 let listcmd= listcmd."t"
1101 elseif g:netrw_sort_by =~ "^s"
1102 let listcmd= listcmd."S"
1103 endif
1104 " optionally sort in reverse
1105 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1106 let listcmd= listcmd."r"
1107 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001108 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001109
1110" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001111 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001112" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001113 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001114 redraw!
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001115 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001116" call Dret("NetBrowse : symlink")
1117 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001118
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001119 elseif fname !~ '[\/]$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001120 " looks like a regular file, attempt transfer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001121" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001122
1123 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001124 " "this is a directory" indicator (/). There shouldn't be one of those,
1125 " anyway.
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001126 let path= substitute(path,'[*=@|]\r\=$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001127" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001128
1129 " remote-read the requested file into current buffer
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001130 enew!
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001131" call Decho("exe file .method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001132 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001133 exe "silent doau BufReadPre ".fname
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001134 silent call netrw#NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001135 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001136 keepjumps 1d
Bram Moolenaar572cb562005-08-05 21:35:02 +00001137
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001138 " save certain window-oriented variables into buffer-oriented variables
1139 call s:BufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001140 call s:NetOptionRestore()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001141 setlocal nonu nomod noma
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001142
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001143" call Dret("NetBrowse : file<".fname.">")
1144 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001145 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001146
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001147 " ---------------------------------------------------------------------
1148 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001149" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001150 " set up new buffer and map
1151 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001152 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001153" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001154 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001155 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001156" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001157 exe "b ".bufnamenr
1158 if line("$") >= 5
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001159 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001160" call Dret("NetBrowse")
1161 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001162 endif
1163 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001164" call Decho("generate a new buffer")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001165 enew!
1166 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001167
1168 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001169 setlocal bt=nofile bh=wipe nobl noswf
1170 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001171" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001172 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001173" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001174 setlocal bh=hide bt=nofile nobl nonu
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001175
1176 " save current directory on directory history list
1177 call <SID>NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001178
1179 " set up buffer-local mappings
1180" call Decho("set up buffer-local mappings")
1181 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00001182 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001183 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001184 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 +00001185 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1186 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1187 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1188 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001189 nnoremap <buffer> <silent> o :call <SID>NetSplit(0)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001190 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1191 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>
1192 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>
1193 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001194 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1195 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001196 nnoremap <buffer> <silent> v :call <SID>NetSplit(1)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001197 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
1198 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 +00001199 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1200 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001201 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001202 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1203 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1204 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001205 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001206 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaar83bab712005-08-01 21:58:57 +00001207 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001208
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001209 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001210" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1211 keepjumps put ='\" ==========================================================================='
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001212 keepjumps put ='\" Netrw Remote Directory Listing'
1213 keepjumps put ='\" '.bufname
Bram Moolenaar488c6512005-08-11 20:09:58 +00001214 let w:netrw_bannercnt = 7
1215 let sortby = g:netrw_sort_by
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001216 if g:netrw_sort_direction =~ "^r"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001217 let sortby = sortby." reversed"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001218 endif
1219
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001220 if g:netrw_sort_by =~ "^n"
1221 " sorted by name
Bram Moolenaar488c6512005-08-11 20:09:58 +00001222 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001223 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001224 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1225 else
1226 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001227 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001228 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001229 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001230 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001231 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001232 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001233 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001234 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001235 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001236 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001237 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1238 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001239
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001240 " remote read the requested directory listing
1241 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1242 " Note that not all ftp servers honor the options for ls
1243 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001244 " use ftp to get remote file listing
1245" call Decho("use ftp to get remote file listing")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001246 call s:NetBrowseFtpCmd(path,listcmd)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001247 keepjumps 1d
1248
1249 if !g:netrw_longlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001250 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001251" call Decho("generate short listing")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001252 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001253
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001254 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001255 if g:netrw_ftp_browse_reject != ""
1256 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1257 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001258
1259 " if there's no ../ listed, then put ./ and ../ in
1260 let line1= line(".")
1261 keepjumps 1
1262 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1263 let line2= line(".")
1264 if line2 == 0
1265 keepjumps put='../'
1266 keepjumps put='./'
1267 endif
1268 exe "keepjumps ".line1
1269 keepjumps norm! 0
1270
1271 " more cleanup
Bram Moolenaar488c6512005-08-11 20:09:58 +00001272 exe 'keepjumps silent! '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1273 exe "keepjumps silent! ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
1274 exe "keepjumps silent! ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001275 endif
1276
1277 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001278 " use ssh to get remote file listing
1279" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001280 let shq= &shq? &shq : ( &sxq? &sxq : "'")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001281" call Decho("exe silent r! ".listcmd." '".shq.escape(path,s:netrw_cd_escape).shq."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001282 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1283 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001284 " cleanup
1285 if g:netrw_ftp_browse_reject != ""
1286 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001287 endif
1288 endif
1289
1290 " set up syntax highlighting
1291 if has("syntax")
1292 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00001293 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001294 setlocal ft=
Bram Moolenaar572cb562005-08-05 21:35:02 +00001295 " Ugly workaround -- when syntax highlighting is off and laststatus==2,
1296 " sometimes the laststatus highlight bleeds into the entire display.
1297 " Only seems to happen with remote browsing. Weird.
1298 redraw
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001299 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001300 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001301
1302 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001303 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001304 if g:netrw_hide && g:netrw_list_hide != ""
1305 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001306 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001307
Bram Moolenaar8299df92004-07-10 09:47:34 +00001308 if g:netrw_longlist
1309 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001310" call Decho("manipulate long listing")
1311
1312 if method == "ftp"
1313 " cleanup
Bram Moolenaar488c6512005-08-11 20:09:58 +00001314 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001315 while getline(".") =~ g:netrw_ftp_browse_reject
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001316 keepjumps d
1317 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001318 " if there's no ../ listed, then put ./ and ../ in
1319 let line1= line(".")
1320 keepjumps 1
1321 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1322 let line2= line(".")
1323 if line2 == 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00001324 exe 'keepjumps '.w:netrw_bannercnt."put='./'"
1325 exe 'keepjumps '.w:netrw_bannercnt."put='../'"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001326 endif
1327 exe "keepjumps ".line1
1328 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001329 endif
1330
Bram Moolenaar488c6512005-08-11 20:09:58 +00001331 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/ -> .*$//e'
1332 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1333 exe w:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001334 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001335
Bram Moolenaar488c6512005-08-11 20:09:58 +00001336 if line("$") >= w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001337 if g:netrw_sort_by =~ "^n"
1338 call s:SetSort()
Bram Moolenaar83bab712005-08-01 21:58:57 +00001339 if v:version < 700
Bram Moolenaar488c6512005-08-11 20:09:58 +00001340 exe 'keepjumps silent '.w:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001341 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar488c6512005-08-11 20:09:58 +00001342 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001343 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00001344 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001345 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001346 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001347 endif
1348 if g:netrw_longlist
1349 " shorten the list to keep its width <= 80 characters
Bram Moolenaar488c6512005-08-11 20:09:58 +00001350 exe "keepjumps silent ".w:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001351 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001352 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001353 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001354
1355 " cleanup any windows mess at end-of-line
1356 keepjumps silent! %s/\r$//e
Bram Moolenaar488c6512005-08-11 20:09:58 +00001357 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001358
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001359 call s:NetOptionRestore()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001360 setlocal nomod noma nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001361
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001362" call Dret("NetBrowse")
1363 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001364endfun
1365
1366" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001367" NetBrowseChgDir: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001368fun! s:NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001369" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001370
1371 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001372 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001373
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001374 if newdir !~ '[\/]$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001375 " handling a file
1376 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001377" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001378
1379 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001380 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001381" call Decho("refresh directory listing")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001382 setlocal ma nobl bh=hide
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001383 %d
1384
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001385 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001386 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001387 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001388
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001389 if trailer =~ '^\%(\.\./\)*$'
1390 " tack on a ../"
1391 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001392
1393 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001394 " strip off a directory name from dirname
1395 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001396 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001397" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001398
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001399 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001400 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001401 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001402" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001403 endif
1404
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001405" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001406 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001407endfun
1408
Bram Moolenaar843ee412004-06-30 16:16:41 +00001409" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001410" NetGetWord: it gets the directory named under the cursor
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001411fun! s:NetGetWord()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001412" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001413 call s:UseBufWinVars()
1414
Bram Moolenaar488c6512005-08-11 20:09:58 +00001415 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001416 let dirname= "./"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001417 let curline= getline(".")
1418 if curline =~ '"\s*Sorted by\s'
1419 norm s
1420 let s:netrw_skipbrowse= 1
1421 echo 'Pressing "s" also works'
1422 elseif curline =~ '"\s*Sort sequence:'
1423 let s:netrw_skipbrowse= 1
1424 echo 'Press "S" to edit sorting sequence'
1425 elseif curline =~ '"\s*Quick Help:'
1426 norm ?
1427 let s:netrw_skipbrowse= 1
1428 echo 'Pressing "?" also works'
1429 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
1430 norm a
1431 let s:netrw_skipbrowse= 1
1432 echo 'Pressing "a" also works'
1433 elseif line("$") > w:netrw_bannercnt
1434 exe w:netrw_bannercnt
1435 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001436 else
1437 let dirname= getline(".")
1438 if dirname =~ '\t'
1439 let dirname= substitute(dirname,'\t.*$','','e')
1440 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001441 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001442" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001443 return dirname
1444endfun
1445
1446" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001447" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001448fun! s:NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001449" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1450" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001451
1452 " preparation for removing multiple files/directories
1453 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001454 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001455
1456 " remove multiple files and directories
1457 while ctr <= a:lastline
1458 exe ctr
1459
1460 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001461 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001462" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001463
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001464 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001465 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001466 if !all
1467 echohl Statement
1468 call inputsave()
1469 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1470 call inputrestore()
1471 echohl NONE
1472 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1473 if ok =~ 'a\%[ll]'
1474 let all= 1
1475 endif
1476 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001477
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001478 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001479 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001480 silent! keepjumps .,$d
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001481 call s:NetBrowseFtpCmd(a:path,"delete ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001482 else
1483 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1484" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1485 let ret= system(netrw_rm_cmd)
1486" call Decho("returned=".ret." errcode=".v:shell_error)
1487 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001488 elseif ok =~ 'q\%[uit]'
1489 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001490 endif
1491
1492 else
1493 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001494 if !all
1495 call inputsave()
1496 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1497 call inputrestore()
1498 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1499 if ok =~ 'a\%[ll]'
1500 let all= 1
1501 endif
1502 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001503
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001504 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001505 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001506 call s:NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001507 else
1508 let rmfile = a:path.rmfile
1509 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1510" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1511 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001512" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001513
1514 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001515 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001516" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1517 let ret= system(netrw_rmf_cmd)
1518" call Decho("returned=".ret." errcode=".v:shell_error)
1519
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001520 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001521 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001522 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001523 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001524 endif
1525 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001526
1527 elseif ok =~ 'q\%[uit]'
1528 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001529 endif
1530 endif
1531
1532 let ctr= ctr + 1
1533 endwhile
1534
1535 " refresh the directory
1536 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001537" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001538 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1539 exe curline
1540
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001541" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001542endfun
1543
1544" ---------------------------------------------------------------------
1545" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001546fun! s:NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001547" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001548
1549 " preparation for removing multiple files/directories
1550 let ctr = a:firstline
1551 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1552
1553 " attempt to rename files/directories
1554 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001555 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001556
1557 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001558 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001559" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001560
1561 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001562 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001563 call inputrestore()
1564
Bram Moolenaar488c6512005-08-11 20:09:58 +00001565 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001566 call s:NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001567 else
1568 let oldname= a:path.oldname
1569 let newname= a:path.newname
1570" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1571 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1572 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001573
1574 let ctr= ctr + 1
1575 endwhile
1576
1577 " refresh the directory
1578 let curline= line(".")
1579 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001580 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001581" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001582endfun
1583
1584" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00001585" NetRefresh: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001586fun! s:NetRefresh(dirname)
Bram Moolenaar572cb562005-08-05 21:35:02 +00001587" call Dfunc("NetRefresh(dirname<".a:dirname.">)")
1588 set ma
1589 %d
1590 call <SID>NetBrowse(dirname)
1591 redraw!
1592" call Dret("NetRefresh")
1593endfun
1594
1595" ---------------------------------------------------------------------
Bram Moolenaar488c6512005-08-11 20:09:58 +00001596" NetSplit: mode {{{2
1597" =0 : net and o
1598" =1 : net and v
1599" =2 : local and o
1600" =3 : local and v
1601fun! s:NetSplit(mode)
1602" call Dfunc("NetSplit(mode=".a:mode.")")
1603
1604 call s:SaveWinVars()
1605 if a:mode == 0
1606 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1607 call s:CopyWinVars()
1608 exe "norm! 0"
1609 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
1610 elseif a:mode ==1
1611 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1612 call s:CopyWinVars()
1613 exe "norm! 0"
1614 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
1615 elseif a:mode ==2
1616 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1617 call s:CopyWinVars()
1618 exe "norm! 0"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001619 call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001620 else
1621 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1622 call s:CopyWinVars()
1623 exe "norm! 0"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001624 call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001625 endif
1626
1627" call Dret("NetSplit")
1628endfun
1629
1630" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001631" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001632" files given their extension. Passes 0=local, 1=remote
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001633fun! s:NetBrowseX(fname,remote)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001634" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001635
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001636 " set up the filename
1637 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001638 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001639 if has("win32") || has("win95") || has("win64") || has("win16")
1640 let exten= substitute(exten,'^.*$','\L&\E','')
1641 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001642 let fname= escape(a:fname,"%#")
1643" call Decho("fname<".fname."> after escape()")
1644
1645 if a:remote == 1
1646 " create a local copy
1647 let fname= tempname().".".exten
1648" call Decho("create a local copy of <".a:fname."> as <".fname.">")
1649 exe "keepjumps silent bot 1new ".a:fname
Bram Moolenaar572cb562005-08-05 21:35:02 +00001650 set bh=delete
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001651 exe "w! ".fname
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001652 q
1653 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001654" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001655
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001656 " set up redirection
1657 if &srr =~ "%s"
1658 let redir= substitute(&srr,"%s","/dev/null"."")
1659 else
1660 let redir= &srr . "/dev/null"
1661 endif
1662" call Decho("redir:".redir.":")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001663
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001664 " execute the file handler
1665 if has("win32") || has("win64")
1666" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1667 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1668 let ret= v:shell_error
1669
1670 elseif has("unix") && executable("kfmclient")
1671" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1672 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1673 let ret= v:shell_error
1674
1675 elseif has("unix") && executable("gnome-open")
1676" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1677 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1678 let ret= v:shell_error
1679
1680 elseif exten != "" && exists("*NetrwFileHandler_".exten)
1681" call Decho("let ret= NetrwFileHandler_".exten.'("'.fname.'")')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001682 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001683 endif
1684 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001685
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001686 " cleanup: remove temporary file,
1687 " delete current buffer if success with handler,
1688 " return to prior buffer (directory listing)
1689 if a:remote == 1 && fname != a:fname
1690" call Decho("deleting temporary file<".fname.">")
1691 call delete(fname)
1692 endif
1693
1694 if a:remote == 1
Bram Moolenaar572cb562005-08-05 21:35:02 +00001695 set bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001696 exe "norm! \<c-o>"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001697 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001698 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001699
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001700" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001701endfun
1702
1703" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001704" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1705" This function assumes that a long listing will be received. Size, time,
1706" and reverse sorts will be requested of the server but not otherwise
1707" enforced here.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001708fun! s:NetBrowseFtpCmd(path,cmd)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001709" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".w:netrw_method)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001710
1711 " because WinXX ftp uses unix style input
1712 " curline is one more than the bannercnt in order to account
1713 " for the unwanted first blank line (doing a :put to an empty
1714 " buffer yields a blank first line)
1715 let ffkeep= &ff
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001716 setlocal ma ff=unix
Bram Moolenaar488c6512005-08-11 20:09:58 +00001717 let curline= w:netrw_bannercnt+1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001718 exe "silent! keepjumps ".curline.",$d"
1719
1720 ".........................................
Bram Moolenaar488c6512005-08-11 20:09:58 +00001721 if w:netrw_method == 2 || w:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001722 " ftp + <.netrc>: Method #2
1723 if a:path != ""
1724 put ='cd '.a:path
1725 endif
1726 exe "put ='".a:cmd."'"
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001727" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001728 if exists("g:netrw_port") && g:netrw_port != ""
1729" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1730 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1731 else
1732" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1733 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1734 endif
1735
1736 ".........................................
Bram Moolenaar488c6512005-08-11 20:09:58 +00001737 elseif w:netrw_method == 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001738 " ftp + machine,id,passwd,filename: Method #3
1739 setlocal ff=unix
1740 if exists("g:netrw_port") && g:netrw_port != ""
1741 put ='open '.g:netrw_machine.' '.g:netrw_port
1742 else
1743 put ='open '.g:netrw_machine
1744 endif
1745
1746 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1747 put =g:netrw_uid
1748 put =g:netrw_passwd
1749 else
1750 put ='user '.g:netrw_uid.' '.g:netrw_passwd
1751 endif
1752
1753 if a:path != ""
1754 put ='cd '.a:path
1755 endif
1756 exe "put ='".a:cmd."'"
1757
1758 " perform ftp:
1759 " -i : turns off interactive prompting from ftp
1760 " -n unix : DON'T use <.netrc>, even though it exists
1761 " -n win32: quit being obnoxious about password
1762" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1763 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1764
1765 ".........................................
1766 else
1767 echo "***warning*** unable to comply with your request<" . choice . ">"
1768 endif
1769
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001770 " cleanup for Windows
1771 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001772 keepjumps silent!! %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001773 endif
1774 if a:cmd == "dir"
1775 " infer directory/link based on the file permission string
Bram Moolenaar83bab712005-08-01 21:58:57 +00001776 keepjumps silent! g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1777 keepjumps silent! g/l\%([-r][-w][-x]\)\{3}/s/$/@/
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001778 if !g:netrw_longlist
Bram Moolenaar83bab712005-08-01 21:58:57 +00001779 exe "keepjumps silent! ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001780 endif
1781 endif
1782
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001783 " ftp's ls doesn't seem to include ./ or ../
1784 if !search('^\.\/$','wn')
1785 exe 'keepjumps '.curline
1786 if a:path !~ '^$'
1787 put ='../'
1788 endif
1789 put ='./'
1790 exe 'keepjumps '.curline
1791 endif
1792
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001793 " restore settings
1794 let &ff= ffkeep
1795" call Dret("NetBrowseFtpCmd")
1796endfun
1797
1798" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001799" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1800" separated patterns given in g:netrw_list_hide
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001801fun! s:NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001802" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001803
1804 let listhide= g:netrw_list_hide
1805 while listhide != ""
1806 if listhide =~ ','
1807 let hide = substitute(listhide,',.*$','','e')
1808 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1809 else
1810 let hide = listhide
1811 let listhide= ""
1812 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001813
1814 " Prune the list by hiding any files which match
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001815" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001816 if g:netrw_hide == 1
Bram Moolenaar488c6512005-08-11 20:09:58 +00001817 exe 'keepjumps silent '.w:netrw_bannercnt.',$g~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001818 elseif g:netrw_hide == 2
Bram Moolenaar488c6512005-08-11 20:09:58 +00001819 exe 'keepjumps silent '.w:netrw_bannercnt.',$v~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001820 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001821 endwhile
1822
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001823" call Dret("NetrwListHide")
1824endfun
1825
1826" ---------------------------------------------------------------------
1827" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001828fun! s:NetHideEdit(mode)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001829" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001830
1831 call inputsave()
1832 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1833 call inputrestore()
1834
1835 " refresh the listing
1836 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001837 if a:mode == 0
1838 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1839 else
Bram Moolenaar572cb562005-08-05 21:35:02 +00001840 silent call s:LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001841 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001842
1843" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001844endfun
1845
Bram Moolenaar8299df92004-07-10 09:47:34 +00001846" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001847" NetSortSequence: allows user to edit the sorting sequence
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001848fun! s:NetSortSequence(mode)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001849" call Dfunc("NetSortSequence(mode=".a:mode.")")
1850
1851 call inputsave()
1852 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
1853 call inputrestore()
1854
1855 " refresh the listing
1856 let g:netrw_sort_sequence= newsortseq
1857 if a:mode == 0
1858 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1859 else
1860 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
1861 endif
1862
1863" call Dret("NetSortSequence")
1864endfun
1865
1866" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001867" NetLongList: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001868fun! s:NetLongList(mode)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001869" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".g:netrw_longlist)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001870 call netrw#NetSavePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001871
1872 if g:netrw_longlist != 0
1873 " turn long listing off
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001874" call Decho("turn long listing off")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001875 let g:netrw_longlist = 0
1876 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1877
1878 else
1879 " turn long listing on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001880" call Decho("turn long listing on")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001881 let g:netrw_longlist = 1
1882 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
1883 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001884 setlocal ma
Bram Moolenaar572cb562005-08-05 21:35:02 +00001885
1886 " clear buffer - this will cause NetBrowse/LocalBrowse to do a refresh
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001887 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00001888
1889 " refresh the listing
1890 if a:mode == 0
1891 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1892 else
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001893 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001894 endif
1895
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001896 call netrw#NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +00001897
Bram Moolenaar8299df92004-07-10 09:47:34 +00001898" call Dret("NetLongList : g:netrw_longlist=".g:netrw_longlist)
1899endfun
1900
1901" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001902" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001903" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
1904" the same word even though the sorting has changed its order of appearance.
1905fun! s:NetSaveWordPosn()
1906" call Dfunc("NetSaveWordPosn()")
1907 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
1908" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
1909endfun
1910
1911" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001912" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001913fun! s:NetRestoreWordPosn()
1914" call Dfunc("NetRestoreWordPosn()")
1915 silent! call search(s:netrw_saveword,'w')
1916" call Dret("NetRestoreWordPosn")
1917endfun
1918
1919" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001920" NetMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001921fun! s:NetMakeDir(usrhost)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001922" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
1923
1924 " get name of new directory from user. A bare <CR> will skip.
1925 " if its currently a directory, also request will be skipped, but with
1926 " a message.
1927 call inputsave()
1928 let newdirname= input("Please give directory name: ")
1929 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001930" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001931
1932 if newdirname == ""
1933" call Dret("NetMakeDir : user aborted with bare <cr>")
1934 return
1935 endif
1936
1937 if a:usrhost == ""
1938
1939 " Local mkdir:
1940 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001941 let fullnewdir= b:netrw_curdir.'/'.newdirname
1942" call Decho("fullnewdir<".fullnewdir.">")
1943 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001944 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001945 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a directory!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001946 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001947 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001948" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
1949 return
1950 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001951 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001952 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001953 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a file!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001954 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001955 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001956" call Dret("NetMakeDir : file<".newdirname."> exists previously")
1957 return
1958 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00001959
1960 " requested new local directory is neither a pre-existing file or
1961 " directory, so make it!
1962 if exists("*mkdir")
1963 call mkdir(fullnewdir,"p")
1964 else
1965 let netrw_origdir= s:NetGetcwd(1)
1966 exe 'cd '.b:netrw_curdir
1967" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
1968" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
1969 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001970 if !g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00001971 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001972
Bram Moolenaar8299df92004-07-10 09:47:34 +00001973 if v:shell_error == 0
1974 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001975" call Decho("refresh listing")
1976 let linenum= line(".")
1977 norm! H0
1978 let hline = line(".")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001979 set ma|norm! 2D
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001980 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
1981 exe "norm! ".hline."G0z\<CR>"
1982 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001983 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001984 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001985 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001986 endif
1987 redraw!
1988
1989 else
1990 " Remote mkdir:
1991 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001992 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00001993" call Decho("exe silent! !".mkdircmd." ".newdirname)
1994 exe "silent! !".mkdircmd." ".newdirname
1995 if v:shell_error == 0
1996 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001997 let linenum= line(".")
1998 norm! H0
1999 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002000 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002001 exe "norm! ".hline."G0z\<CR>"
2002 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002003 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002004 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002005 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002006 endif
2007 redraw!
2008 endif
2009
2010" call Dret("NetMakeDir")
2011endfun
2012
2013" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002014" NetBookmarkDir: {{{2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002015" 0: (user: <b>) bookmark current directory
2016" 1: (user: <B>) change to the bookmarked directory
2017" 2: (user: <q>) list bookmarks
2018" 3: (LocalBrowse) record current directory history
2019" 4: (user: <u>) go up (previous) bookmark
2020" 5: (user: <U>) go down (next) bookmark
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002021fun! s:NetBookmarkDir(chg,curdir)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002022" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002023 if exists("w:netrw_bannercnt") && line(".") <= w:netrw_bannercnt
2024 " looks like a "b" was pressed while in the banner region
2025 if line("$") > w:netrw_bannercnt
2026 exe w:netrw_bannercnt
2027 endif
2028 echo ""
2029" call Dret("NetBookmarkDir - ignoring")
2030 return
2031 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002032
2033 if a:chg == 0
2034 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002035 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
2036 if !exists("g:NETRW_BOOKMARKMAX")
2037 let g:NETRW_BOOKMARKMAX= v:count
2038 elseif v:count > g:NETRW_BOOKMARKMAX
2039 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002040 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002041 echo "bookmarked the current directory"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002042
2043 elseif a:chg == 1
2044 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002045 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
2046 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002047 else
2048 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2049 endif
2050
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002051 elseif a:chg == 2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002052 " list user's bookmarks
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002053 if exists("g:NETRW_BOOKMARKMAX")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002054" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
2055 let cnt= 0
2056 while cnt <= g:NETRW_BOOKMARKMAX
2057 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
2058" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
2059 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
2060 endif
2061 let cnt= cnt + 1
2062 endwhile
2063 endif
2064
2065 " list directory history
2066 let cnt = g:NETRW_DIRHIST_CNT
2067 let first = 1
2068 let histcnt = 0
2069 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2070" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
2071 let histcnt= histcnt + 1
2072 if exists("g:NETRW_DIRHIST_{cnt}")
2073" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
2074 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002075 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002076 let first = 0
2077 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2078 if cnt < 0
2079 let cnt= cnt + g:netrw_dirhistmax
2080 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002081 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002082
2083 elseif a:chg == 3
Bram Moolenaar572cb562005-08-05 21:35:02 +00002084 " saves most recently visited directories (when they differ)
2085 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
2086 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2087 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
2088" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2089 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002090
2091 elseif a:chg == 4
2092 " u: change to the previous directory stored on the history list
2093 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2094 if g:NETRW_DIRHIST_CNT < 0
2095 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2096 endif
2097 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2098" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2099 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2100 else
2101 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2102 echo "Sorry, no predecessor directory exists yet"
2103 endif
2104
2105 elseif a:chg == 5
2106 " U: change to the subsequent directory stored on the history list
2107 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2108 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2109" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2110 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2111 else
2112 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2113 if g:NETRW_DIRHIST_CNT < 0
2114 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2115 endif
2116 echo "Sorry, no successor directory exists yet"
2117 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002118 endif
2119" call Dret("NetBookmarkDir")
2120endfun
2121
Bram Moolenaar83bab712005-08-01 21:58:57 +00002122" ==========================================
2123" Local Directory Browsing Support: {{{1
2124" ==========================================
Bram Moolenaar8299df92004-07-10 09:47:34 +00002125
2126" ---------------------------------------------------------------------
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002127" LocalBrowse: {{{2
2128fun! s:LocalBrowse(dirname)
2129 " unfortunate interaction -- debugging calls can't be used here;
2130 " the BufEnter event causes triggering when attempts to write to
2131 " the DBG buffer are made.
2132 if isdirectory(a:dirname)
2133 call netrw#DirBrowse(a:dirname)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002134 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002135 " not a directory, ignore it
2136endfun
Bram Moolenaar8299df92004-07-10 09:47:34 +00002137
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002138" ---------------------------------------------------------------------
2139" DirBrowse: supports local file/directory browsing {{{2
2140fun! netrw#DirBrowse(dirname)
2141" call Dfunc("DirBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr()." sortby=".g:netrw_sort_by)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002142" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002143
Bram Moolenaar488c6512005-08-11 20:09:58 +00002144 if exists("s:netrw_skipbrowse")
2145 unlet s:netrw_skipbrowse
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002146" call Dret("DirBrowse")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002147 return
2148 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002149 call s:NetOptionSave()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002150
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002151 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002152 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002153 echohl Error | echo "***netrw*** vim version<".v:version."> too old for browsing with netrw" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002154 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002155 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002156 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002157" call Dret("DirBrowse : vim version<".v:version."> too old")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002158 return
2159 endif
2160
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002161 " use buffer-oriented WinVars if buffer ones exist but window ones don't
2162 call s:UseBufWinVars()
2163
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002164 " find buffer number of buffer named precisely the same as a:dirname
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002165 let bufnum= bufnr(escape(a:dirname,'\'))
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002166" call Decho("findbuf: bufnum=".bufnum)
2167 if bufnum > 0 && bufname(bufnum) != a:dirname
2168 let ibuf= 1
2169 let buflast= bufnr("$")
2170 while bufname(ibuf) !~ '^'.a:dirname.'\=$' && ibuf <= buflast
2171" call Decho("findbuf: ibuf=".ibuf. " bufname<".bufname(ibuf)."> dirname<".a:dirname.">")
2172 let ibuf= ibuf + 1
2173 endwhile
2174 if ibuf > buflast
2175 let bufnum= -1
2176 else
2177 let bufnum= ibuf
2178 endif
2179" call Decho("findbuf: bufnum=".bufnum." (final)")
2180 endif
2181
2182 " get cleared buffer
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002183 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002184 if v:version < 700
2185 enew!
2186 else
2187 keepalt enew!
2188 endif
2189" call Decho("enew buffer")
2190 else
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002191 if v:version < 700
2192 exe "b ".bufnum
2193 else
2194 exe "keepalt b ".bufnum
2195 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002196 if exists("s:last_sort_by") && g:netrw_sort_by == s:last_sort_by
2197 if getline(2) =~ '^" Directory Listing '
2198 if !g:netrw_keepdir
2199" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002200 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002201 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002202 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002203" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002204 return
2205 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002206 endif
2207 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002208 let s:last_sort_by= g:netrw_sort_by
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002209
2210 " get the new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002211 if has("win32") || has("win95") || has("win64") || has("win16")
2212 let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
2213 else
2214 let b:netrw_curdir= a:dirname
2215 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002216 if b:netrw_curdir =~ '[/\\]$'
2217 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2218 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002219 if b:netrw_curdir == ''
2220 " under unix, when the root directory is encountered, the result
2221 " from the preceding substitute is an empty string.
2222 let b:netrw_curdir= '/'
2223 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002224" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002225
Bram Moolenaar83bab712005-08-01 21:58:57 +00002226 " make netrw's idea of the current directory vim's if the user wishes
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002227 if !g:netrw_keepdir
Bram Moolenaar83bab712005-08-01 21:58:57 +00002228" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002229 try
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002230 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002231 catch /^Vim\%((\a\+)\)\=:E472/
2232 echohl Error | echo "***netrw*** unable to change directory to <".b:netrw_curdir."> (permissions?)" | echohl None
2233 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2234 if exists("w:netrw_prvdir")
2235 let b:netrw_curdir= w:netrw_prvdir
2236 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002237 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002238" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002239 return
2240 endif
2241 endtry
Bram Moolenaar83bab712005-08-01 21:58:57 +00002242 endif
2243
2244 " change the name of the buffer to reflect the b:netrw_curdir
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002245 exe 'silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002246
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002247 " make this buffer not-a-file, modifiable, not line-numbered, etc
2248 setlocal bh=hide bt=nofile nobl ma nonu
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002249 if v:version < 700
2250 silent! %d
2251 else
2252 keepalt silent! %d
2253 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002254
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002255 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002256 " Perform Directory Listing:
Bram Moolenaar8299df92004-07-10 09:47:34 +00002257
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002258 " save current directory on directory history list
Bram Moolenaar83bab712005-08-01 21:58:57 +00002259 call <SID>NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002260
Bram Moolenaar8299df92004-07-10 09:47:34 +00002261 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002262" call Decho("Setting up local browser maps")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002263 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002264 nnoremap <buffer> <silent> <c-l> :set ma<bar>%d<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<bar>redraw!<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002265 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002266 nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002267 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2268 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2269 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2270 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2271 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002272 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002273 nnoremap <buffer> <silent> o :call <SID>NetSplit(2)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002274 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 +00002275 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002276 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002277 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>
2278 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002279 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2280 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002281 nnoremap <buffer> <silent> v :call <SID>NetSplit(3)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002282 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002283 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2284 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
2285 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002286 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2287 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2288 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2289 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2290 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
2291 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002292 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002293 nnoremap <buffer> ? :he netrw-dir<cr>
2294
2295 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002296" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002297 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002298 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002299 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002300 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar488c6512005-08-11 20:09:58 +00002301 let w:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002302
2303 let sortby= g:netrw_sort_by
2304 if g:netrw_sort_direction =~ "^r"
2305 let sortby= sortby." reversed"
2306 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002307
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002308 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002309 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002310" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002311 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002312 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002313 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar488c6512005-08-11 20:09:58 +00002314 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002315 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002316" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002317 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002318 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar488c6512005-08-11 20:09:58 +00002319 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002320 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002321
2322 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002323 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002324 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002325 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002326 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002327 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002328 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002329 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002330 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002331 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2332 keepjumps put ='\" ============================================================================'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002333 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002334
2335 " bannercnt should index the line just after the banner
Bram Moolenaar488c6512005-08-11 20:09:58 +00002336 let w:netrw_bannercnt= w:netrw_bannercnt + 1
2337" call Decho("bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002338
2339 " generate the requested directory listing
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002340 call s:LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002341
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002342 " set up syntax highlighting
2343 if has("syntax")
2344 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00002345 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002346 setlocal ft=
2347 endif
2348 endif
2349
Bram Moolenaar8299df92004-07-10 09:47:34 +00002350 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002351 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002352 if g:netrw_hide && g:netrw_list_hide != ""
2353 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002354 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002355 if line("$") >= w:netrw_bannercnt
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002356
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002357 if g:netrw_sort_by =~ "^n"
2358 call s:SetSort()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002359
Bram Moolenaar83bab712005-08-01 21:58:57 +00002360 if v:version < 700
Bram Moolenaar488c6512005-08-11 20:09:58 +00002361 exe 'keepjumps silent '.w:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002362 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002363 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002364 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00002365 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002366 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002367 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002368
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002369 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002370 if v:version < 700
Bram Moolenaar488c6512005-08-11 20:09:58 +00002371 exe 'keepjumps silent '.w:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002372 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002373 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002374 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00002375 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002376 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002377 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002378 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002379
Bram Moolenaar8299df92004-07-10 09:47:34 +00002380 endif
2381 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002382 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
2383 exe w:netrw_bannercnt
2384 endif
2385
2386 " record previous current directory
2387 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaar8299df92004-07-10 09:47:34 +00002388
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002389 " save certain window-oriented variables into buffer-oriented variables
2390 call s:BufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002391 call s:NetOptionRestore()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002392 setlocal noma nomod nonu bh=hide nobl
Bram Moolenaar8299df92004-07-10 09:47:34 +00002393
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002394" call Dret("DirBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002395endfun
2396
2397" ---------------------------------------------------------------------
2398" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002399fun! s:LocalBrowseList()
Bram Moolenaar83bab712005-08-01 21:58:57 +00002400" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002401
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002402 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00002403 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
2404 let dirnamelen = strlen(b:netrw_curdir)
2405 let filelist = glob(dirname."/*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002406" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002407 if filelist != ""
2408 let filelist= filelist."\n"
2409 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002410 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002411" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2412
2413 " if the directory name includes a "$", and possibly other characters,
2414 " the glob() doesn't include "." and ".." entries.
2415 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2416" call Decho("forcibly tacking on .")
2417 if filelist == ""
2418 let filelist= dirname."."
2419 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002420 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002421 endif
2422" call Decho("filelist<".filelist.">")
2423 endif
2424 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2425" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002426 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002427" call Decho("filelist<".filelist.">")
2428 endif
2429 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
2430
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002431" call Decho("dirname<".dirname.">")
2432" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002433" call Decho("filelist<".filelist.">")
2434
2435 while filelist != ""
2436 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002437 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002438 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2439 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002440 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002441 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00002442 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002443 let pfile= filename
2444 if isdirectory(filename)
2445 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002446 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002447 if pfile =~ '//$'
2448 let pfile= substitute(pfile,'//$','/','e')
2449 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002450 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002451 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaar83bab712005-08-01 21:58:57 +00002452" call Decho(" ")
2453" call Decho("filename<".filename.">")
2454" call Decho("pfile <".pfile.">")
2455
Bram Moolenaar8299df92004-07-10 09:47:34 +00002456 if g:netrw_longlist
Bram Moolenaar83bab712005-08-01 21:58:57 +00002457 let sz = getfsize(filename)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002458 if v:version <= 700
2459 let fsz = strpart(" ",1,15-strlen(sz)).sz
2460 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
2461 else
2462 let pfile= printf('%-'.g:netrw_maxfilenamelen.'s%15d%s',pfile,sz,getftime(filename))
2463 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002464" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002465 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002466
Bram Moolenaar8299df92004-07-10 09:47:34 +00002467 if g:netrw_sort_by =~ "^t"
2468 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002469" call Decho("getftime(".filename.")=".getftime(filename))
2470 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002471 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00002472" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002473 let ftpfile= ft.'/'.pfile
2474 keepjumps put=ftpfile
2475
Bram Moolenaar8299df92004-07-10 09:47:34 +00002476 elseif g:netrw_sort_by =~ "^s"
2477 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002478" call Decho("getfsize(".filename.")=".getfsize(filename))
2479 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002480 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00002481" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002482 let fszpfile= fsz.'/'.pfile
2483 keepjumps put =fszpfile
2484
Bram Moolenaar8299df92004-07-10 09:47:34 +00002485 else
2486 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002487" call Decho("exe keepjumps put ='".pfile."'")
2488 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002489 endif
2490 endwhile
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002491
2492 " cleanup any windows mess at end-of-line
2493 keepjumps silent! %s/\r$//e
Bram Moolenaar83bab712005-08-01 21:58:57 +00002494 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00002495
2496" call Dret("LocalBrowseList")
2497endfun
2498
2499" ---------------------------------------------------------------------
2500" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2501" directory and a new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002502fun! s:LocalBrowseChgDir(dirname,newdir,...)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002503" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002504
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002505 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002506 let newdir = a:newdir
2507
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002508 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002509 " apparently vim is "recognizing" that it is in the home directory and
2510 " is removing the "/". Bad idea, so I have to put it back.
2511 let dirname= dirname.'/'
2512" call Decho("adjusting dirname<".dirname.">")
2513 endif
2514
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002515 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002516 " handling a file
2517 let dirname= dirname.newdir
2518" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002519 " this lets NetBrowseX avoid the edit
2520 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002521" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
2522" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
2523 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002524 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002525
2526 elseif newdir == './'
2527 " refresh the directory list
2528" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002529
2530 elseif newdir == '../'
2531 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002532 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002533" call Decho("go up one dir: dirname<".dirname.">")
2534
2535 else
2536 " go down one directory
2537 let dirname= dirname.newdir
2538" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2539 endif
2540
2541" call Dret("LocalBrowseChgDir <".dirname.">")
2542 return dirname
2543endfun
2544
2545" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002546" LocalBrowseRm: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002547fun! s:LocalBrowseRm(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002548" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2549" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2550
2551 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002552 let ctr = a:firstline
2553 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002554 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002555
2556 " remove multiple files and directories
2557 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002558 exe "keepjumps ".ctr
2559
2560 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00002561 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002562 let ctr= ctr + 1
2563 continue
2564 endif
2565 let curword= s:NetGetWord()
2566 if curword == "./" || curword == "../"
2567 let ctr= ctr + 1
2568 continue
2569 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002570
2571 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00002572 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002573" call Decho("rmfile<".rmfile.">")
2574
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002575 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002576 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002577 if !all
2578 echohl Statement
2579 call inputsave()
2580 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2581 call inputrestore()
2582 echohl NONE
2583 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2584 if ok =~ 'a\%[ll]'
2585 let all= 1
2586 endif
2587 endif
2588
2589 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002590 let ret= delete(rmfile)
2591" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002592 elseif ok =~ 'q\%[uit]'
2593 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002594 endif
2595
2596 else
2597 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002598 if !all
2599 echohl Statement
2600 call inputsave()
2601 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2602 call inputrestore()
2603 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2604 if ok =~ 'a\%[ll]'
2605 let all= 1
2606 endif
2607 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002608 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002609
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002610 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002611" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2612 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002613" call Decho("v:shell_error=".v:shell_error)
2614
2615 if v:shell_error != 0
2616" call Decho("2nd attempt to remove directory<".rmfile.">")
2617 let errcode= delete(rmfile)
2618" call Decho("errcode=".errcode)
2619
2620 if errcode != 0
2621 if has("unix")
2622" call Decho("3rd attempt to remove directory<".rmfile.">")
2623 call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002624 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002625 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002626 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002627 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002628 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002629 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002630 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002631 endif
2632 endif
2633 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002634
2635 elseif ok =~ 'q\%[uit]'
2636 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002637 endif
2638 endif
2639
2640 let ctr= ctr + 1
2641 endwhile
2642
2643 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002644 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002645" call Decho("refresh the directory")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002646 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002647 exe curline
2648
2649" call Dret("LocalBrowseRm")
2650endfun
2651
2652" ---------------------------------------------------------------------
2653" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002654fun! s:LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002655" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2656
2657 " preparation for removing multiple files/directories
2658 let ctr= a:firstline
2659
2660 " attempt to rename files/directories
2661 while ctr <= a:lastline
2662 exe "keepjumps ".ctr
2663
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002664 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00002665 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002666 let ctr= ctr + 1
2667 continue
2668 endif
2669 let curword= s:NetGetWord()
2670 if curword == "./" || curword == "../"
2671 let ctr= ctr + 1
2672 continue
2673 endif
2674
Bram Moolenaar8299df92004-07-10 09:47:34 +00002675 norm! 0
Bram Moolenaar572cb562005-08-05 21:35:02 +00002676 let oldname= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002677" call Decho("oldname<".oldname.">")
2678
2679 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002680 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002681 call inputrestore()
2682
Bram Moolenaar83bab712005-08-01 21:58:57 +00002683 let ret= rename(oldname,newname)
2684" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002685
2686 let ctr= ctr + 1
2687 endwhile
2688
2689 " refresh the directory
2690 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002691" call Decho("refresh the directory listing")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002692 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002693 exe "keepjumps ".curline
2694" call Dret("LocalBrowseRename")
2695endfun
2696
2697" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002698" LocalPreview: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002699fun! s:LocalPreview(path) range
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002700" call Dfunc("LocalPreview(path<".a:path.">)")
2701 if has("quickfix")
2702 if !isdirectory(a:path)
2703 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002704 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002705 echohl WarningMsg | echo "***netrw*** sorry, cannot preview a directory such as <".a:path.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002706 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002707 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002708 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002709 echohl WarningMsg | echo "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002710 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002711 endif
2712" call Dret("LocalPreview")
2713endfun
2714
2715" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002716" LocalRefresh: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002717fun! s:LocalRefresh(dirname)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002718" call Dfunc("LocalRefresh(dirname<".a:dirname.">)")
2719 set ma
2720 %d
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002721 call s:LocalBrowse(a:dirname)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002722 redraw!
2723" call Dret("LocalRefresh")
2724endfun
2725
2726" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002727" Explore: launch the local browser in the directory of the current file {{{2
2728" dosplit==0: the window will be split iff the current file has
2729" been modified
2730" dosplit==1: the window will be split before running the local
2731" browser
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002732fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002733" call Dfunc("Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.")")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002734
2735 " if dosplit or file has been modified
2736 if a:dosplit || &modified
Bram Moolenaar488c6512005-08-11 20:09:58 +00002737 call <SID>SaveWinVars()
2738
Bram Moolenaar83bab712005-08-01 21:58:57 +00002739 if a:style == 0 " Explore, Sexplore
2740 exe g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002741" call Decho("style=0: Explore or Sexplore")
2742
Bram Moolenaar83bab712005-08-01 21:58:57 +00002743 elseif a:style == 1 "Explore!, Sexplore!
2744 exe g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002745" call Decho("style=1: Explore! or Sexplore!")
2746
Bram Moolenaar83bab712005-08-01 21:58:57 +00002747 elseif a:style == 2 " Hexplore
2748 exe "bel ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002749" call Decho("style=2: Hexplore")
2750
Bram Moolenaar83bab712005-08-01 21:58:57 +00002751 elseif a:style == 3 " Hexplore!
2752 exe "abo ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002753" call Decho("style=3: Hexplore!")
2754
Bram Moolenaar83bab712005-08-01 21:58:57 +00002755 elseif a:style == 4 " Vexplore
2756 exe "lefta ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002757" call Decho("style=4: Vexplore")
2758
Bram Moolenaar83bab712005-08-01 21:58:57 +00002759 elseif a:style == 5 " Vexplore!
2760 exe "rightb ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002761" call Decho("style=5: Vexplore!")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002762 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002763 call s:CopyWinVars()
Bram Moolenaar83bab712005-08-01 21:58:57 +00002764 endif
2765 norm! 0
2766
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002767 if a:1 == "" && a:indx >= 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00002768 " Explore Hexplore Vexplore Sexplore
2769 let newdir= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
2770 if newdir =~ '^scp:' || newdir =~ '^ftp:'
2771" call Decho("calling NetBrowse(newdir<".newdir.">)")
2772 call s:NetBrowse(newdir)
2773 else
2774" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2775 call s:LocalBrowse(newdir)
2776 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002777
Bram Moolenaar572cb562005-08-05 21:35:02 +00002778 elseif a:1 =~ '\*\*/' || a:indx < 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00002779 " Nexplore Pexplore -or- Explore **/...
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002780
Bram Moolenaar488c6512005-08-11 20:09:58 +00002781 if has("path_extra") && v:version >= 700
2782 if !exists("w:netrw_explore_indx")
2783 let w:netrw_explore_indx= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002784 endif
2785 let indx = a:indx
2786 if indx == -1
Bram Moolenaar488c6512005-08-11 20:09:58 +00002787 let indx= w:netrw_explore_indx + 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002788 elseif indx == -2
Bram Moolenaar488c6512005-08-11 20:09:58 +00002789 let indx= w:netrw_explore_indx - 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002790 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00002791 let w:netrw_explore_indx = 0
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002792 if !exists("b:netrw_curdir")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002793 let b:netrw_curdir= getcwd()
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002794 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002795 let w:netrw_explore_list = split(expand(b:netrw_curdir."/".a:1),'\n')
2796 let w:netrw_explore_listlen = len(w:netrw_explore_list)
2797 if w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/'
Bram Moolenaar572cb562005-08-05 21:35:02 +00002798 echohl WarningMsg | echo "***netrw*** no files matched" | echohl None
2799 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2800" call Dret("Explore")
2801 return
2802 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002803 endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002804
2805 " NetrwStatusLine support
Bram Moolenaar488c6512005-08-11 20:09:58 +00002806 let w:netrw_explore_indx= indx
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002807 if !exists("s:netrw_explore_stl")
2808 let s:netrw_explore_stl= &stl
2809 endif
2810 set stl=%f\ %h%m%r%=%{NetrwStatusLine()}
Bram Moolenaar488c6512005-08-11 20:09:58 +00002811" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002812
2813 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00002814 if indx >= w:netrw_explore_listlen || indx < 0
2815 let indx= (indx < 0)? 0 : ( w:netrw_explore_listlen - 1 )
Bram Moolenaar572cb562005-08-05 21:35:02 +00002816 echohl WarningMsg | echo "***netrw*** no more files match Explore pattern" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002817 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2818" call Dret("Explore")
2819 return
2820 endif
2821
Bram Moolenaar488c6512005-08-11 20:09:58 +00002822 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002823" call Decho("dirfile<".dirfile."> indx=".indx)
2824 let newdir= substitute(dirfile,'/[^/]*$','','e')
2825" call Decho("newdir<".newdir.">")
2826" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2827 call s:LocalBrowse(newdir)
2828 call search(substitute(dirfile,"^.*/","",""),"W")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002829 let w:netrw_explore_mtchcnt = indx + 1
2830 let w:netrw_explore_bufnr = bufnr(".")
2831 let w:netrw_explore_line = line(".")
2832" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002833
2834 else
2835 if v:version < 700
Bram Moolenaar572cb562005-08-05 21:35:02 +00002836 echohl WarningMsg | echo "***netrw*** you need vim version 7.0 or later for Exploring with **!" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002837 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002838 echohl WarningMsg | echo "***netrw*** your vim needs the +path_extra feature for Exploring with **!" | echohl None | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002839 endif
2840 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2841 endif
2842
Bram Moolenaar83bab712005-08-01 21:58:57 +00002843 else
2844 let newdir= a:1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002845" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2846 call s:LocalBrowse(newdir)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002847 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002848
2849" call Dret("Explore")
2850endfun
2851
2852" ---------------------------------------------------------------------
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002853" NetrwStatusLine: {{{2
2854fun! NetrwStatusLine()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002855" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr(".")." Xline#".w:netrw_explore_line." line#".line(".")
2856 if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr(".") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list")
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002857 let &stl= s:netrw_explore_stl
Bram Moolenaar488c6512005-08-11 20:09:58 +00002858 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
2859 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002860 return ""
2861 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00002862 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00002863 endif
2864endfun
2865
2866" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002867" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002868" Change backslashes to forward slashes, if any.
2869" If doesc is true, escape certain troublesome characters
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002870fun! s:NetGetcwd(doesc)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002871" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
2872 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002873 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002874 let curdir= curdir.'/'
2875 endif
2876 if a:doesc
2877 let curdir= escape(curdir,s:netrw_cd_escape)
2878 endif
2879" call Dret("NetGetcwd <".curdir.">")
2880 return curdir
2881endfun
2882
2883" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00002884" NetMethod: determine method of transfer {{{1
2885" method == 1: rcp
2886" 2: ftp + <.netrc>
2887" 3: ftp + machine, id, password, and [path]filename
2888" 4: scp
2889" 5: http (wget)
2890" 6: cadaver
2891" 7: rsync
2892" 8: fetch
2893" 9: sftp
2894fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002895" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002896
2897 " initialization
2898 let b:netrw_method = 0
2899 let g:netrw_machine = ""
2900 let b:netrw_fname = ""
2901 let g:netrw_port = ""
2902
2903 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002904 " mipf : a:machine a:id password filename Use ftp
2905 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002906 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002907 " rcpurm : rcp://[user@]host/filename Use rcp
2908 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002909 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002910 " httpurm : http://[user@]host/filename Use wget
2911 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002912 " rsyncurm : rsync://host[:port]/path Use rsync
2913 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2914 " sftpurm : sftp://[user@]host/filename Use scp
2915 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2916 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
2917 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002918 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002919 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
2920 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2921 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002922 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002923 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
2924 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2925 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
2926
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002927" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002928 " Determine Method
2929 " rcp://user@hostname/...path-to-file
2930 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002931" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002932 let b:netrw_method = 1
2933 let userid = substitute(a:choice,rcpurm,'\1',"")
2934 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
2935 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002936 if userid != ""
2937 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002938 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002939
2940 " scp://user@hostname/...path-to-file
2941 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002942" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002943 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00002944 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
2945 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
2946 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002947
2948 " http://user@hostname/...path-to-file
2949 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002950" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002951 let b:netrw_method = 5
2952 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2953 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
2954
2955 " dav://hostname[:port]/..path-to-file..
2956 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002957" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002958 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002959 if a:choice =~ '^s'
2960 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2961 else
2962 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2963 endif
2964 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002965
2966 " rsync://user@hostname/...path-to-file
2967 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002968" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002969 let b:netrw_method = 7
2970 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2971 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
2972
2973 " ftp://[user@]hostname[[:#]port]/...path-to-file
2974 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002975" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002976 let userid = substitute(a:choice,ftpurm,'\2',"")
2977 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2978 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2979 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002980 if userid != ""
2981 let g:netrw_uid= userid
2982 endif
2983 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2984 let b:netrw_method = 3
2985 else
2986 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
2987 let b:netrw_method= 2
2988 else
2989 if !exists("g:netrw_uid") || g:netrw_uid == ""
2990 call NetUserPass()
2991 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
2992 call NetUserPass(g:netrw_uid)
2993 " else just use current g:netrw_uid and g:netrw_passwd
2994 endif
2995 let b:netrw_method= 3
2996 endif
2997 endif
2998
2999 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003000" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003001 let b:netrw_method = 8
3002 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
3003 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
3004 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
3005 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
3006
3007 " Issue an ftp : "machine id password [path/]filename"
3008 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003009" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003010 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003011 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
3012 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
3013 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
3014 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
3015
3016 " Issue an ftp: "hostname [path/]filename"
3017 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003018" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003019 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3020 let b:netrw_method = 3
3021 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3022 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3023
3024 elseif filereadable(expand("$HOME/.netrc"))
3025 let b:netrw_method = 2
3026 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3027 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3028 endif
3029
3030 " sftp://user@hostname/...path-to-file
3031 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003032" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003033 let b:netrw_method = 9
3034 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
3035 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
3036
3037 " Issue an rcp: hostname:filename" (this one should be last)
3038 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003039" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003040 let b:netrw_method = 1
3041 let userid = substitute(a:choice,rcphf,'\2',"")
3042 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
3043 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003044" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
3045" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
3046" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
3047" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003048 if userid != ""
3049 let g:netrw_uid= userid
3050 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003051 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003052 " don't let PCs try <.netrc>
3053 let b:netrw_method = 3
3054 endif
3055
3056 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003057 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003058 echohl Error | echo "***netrw*** cannot determine method" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003059 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003060 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003061 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003062 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00003063
3064 " remove any leading [:#] from port number
3065 if g:netrw_port != ""
3066 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
3067 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003068
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003069" call Decho("a:choice <".a:choice.">")
3070" call Decho("b:netrw_method <".b:netrw_method.">")
3071" call Decho("g:netrw_machine<".g:netrw_machine.">")
3072" call Decho("g:netrw_port <".g:netrw_port.">")
3073" if exists("g:netrw_uid") "Decho
3074" call Decho("g:netrw_uid <".g:netrw_uid.">")
3075" endif "Decho
3076" if exists("g:netrw_passwd") "Decho
3077" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
3078" endif "Decho
3079" call Decho("b:netrw_fname <".b:netrw_fname.">")
3080" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003081endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003082
3083" ------------------------------------------------------------------------
3084" NetUserPass: set username and password for subsequent ftp transfer {{{1
3085" Usage: :call NetUserPass() -- will prompt for userid and password
3086" :call NetUserPass("uid") -- will prompt for password
3087" :call NetUserPass("uid","password") -- sets global userid and password
3088fun! NetUserPass(...)
3089
3090 " get/set userid
3091 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003092" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003093 if !exists("g:netrw_uid") || g:netrw_uid == ""
3094 " via prompt
3095 let g:netrw_uid= input('Enter username: ')
3096 endif
3097 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003098" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003099 let g:netrw_uid= a:1
3100 endif
3101
3102 " get password
3103 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003104" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003105 let g:netrw_passwd= inputsecret("Enter Password: ")
3106 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003107" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003108 let g:netrw_passwd=a:2
3109 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003110" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003111endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003112
3113" ------------------------------------------------------------------------
3114" NetOptionSave: save options and set to "standard" form {{{1
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003115fun! s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003116" call Dfunc("NetOptionSave()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003117 if !exists("w:netoptionsave")
3118 let w:netoptionsave= 1
3119 else
3120" call Dret("NetOptionSave : netoptionsave=".w:netoptionsave)
3121 return
3122 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003123
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003124 " Get Temporary Filename
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003125 let w:aikeep = &ai
3126 " record autochdir setting and then insure its unset (tnx to David Fishburn)
3127 if has("netbeans_intg") || has("sun_workshop")
3128 let w:acdkeep = &autochdir
3129 set noautochdir
3130 endif
3131 let w:cinkeep = &cin
3132 let w:cinokeep = &cino
3133 let w:comkeep = &com
3134 let w:cpokeep = &cpo
3135 if !g:netrw_keepdir
3136 let w:dirkeep = getcwd()
3137 endif
3138 let w:gdkeep = &gd
3139 let w:repkeep = &report
3140 let w:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00003141 setlocal cino =
3142 setlocal com =
3143 setlocal cpo -=aA
3144 setlocal nocin noai
3145 setlocal tw =0
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003146 setlocal report=10000
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003147 if has("win32") && !has("win95")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003148 let w:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00003149 setlocal noswf
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003150" call Decho("setting w:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003151 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003152
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003153" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003154endfun
3155
3156" ------------------------------------------------------------------------
3157" NetOptionRestore: restore options {{{1
3158fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003159" call Dfunc("NetOptionRestore()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003160 if !exists("w:netoptionsave")
3161" call Dret("NetOptionRestore : netoptionsave=".w:netoptionsave)
3162 return
3163 endif
3164 unlet w:netoptionsave
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003165
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003166 let &ai = w:aikeep
3167 if has("netbeans_intg") || has("sun_workshop")
3168 let &acd = w:acdkeep
3169 endif
3170 let &cin = w:cinkeep
3171 let &cino = w:cinokeep
3172 let &com = w:comkeep
3173 let &cpo = w:cpokeep
3174 if exists("w:dirkeep")
3175 exe "lcd ".w:dirkeep
3176 endif
3177 let &gd = w:gdkeep
3178 let &report = w:repkeep
3179 let &tw = w:twkeep
3180 if exists("w:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003181 if &directory == ""
3182 " user hasn't specified a swapfile directory;
3183 " netrw will temporarily make the swapfile
3184 " directory the current local one.
3185 let &directory = getcwd()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003186 silent! let &swf = w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003187 set directory=
3188 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003189 let &swf= w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003190 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003191 unlet w:swfkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003192 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003193 unlet w:aikeep
3194 unlet w:cinkeep
3195 unlet w:cinokeep
3196 unlet w:comkeep
3197 unlet w:cpokeep
3198 unlet w:gdkeep
3199 unlet w:repkeep
3200 unlet w:twkeep
3201 if exists("w:dirkeep")
3202 unlet w:dirkeep
3203 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003204
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003205" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003206endfun
3207
3208" ------------------------------------------------------------------------
3209" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003210" to handle extra junk that their system's ftp dumps
3211" into the transfer. This function is provided as an
3212" example and as a fix for a Windows 95 problem: in my
3213" experience, win95's ftp always dumped four blank lines
3214" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003215if has("win95") && g:netrw_win95ftp
3216 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003217" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003218 if method == 3 " ftp (no <.netrc>)
3219 let fourblanklines= line2 - 3
3220 silent fourblanklines.",".line2."g/^\s*/d"
3221 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003222" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003223 endfun
3224endif
3225
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003226" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003227" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003228if v:version < 700
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003229 fun! s:NetSort() range
Bram Moolenaar83bab712005-08-01 21:58:57 +00003230" " call Dfunc("NetSort()")
3231
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003232 let i = a:firstline + 1
3233 while i <= a:lastline
3234 " find insertion point via binary search
3235 let i_val = getline(i)
3236 let lo = a:firstline
3237 let hi = i
3238 while lo < hi
Bram Moolenaar83bab712005-08-01 21:58:57 +00003239 let mid = (lo + hi) / 2
3240 let mid_val = getline(mid)
3241 if g:netrw_sort_direction =~ '^n'
3242 " normal sorting order
3243 if i_val < mid_val
3244 let hi = mid
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003245 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003246 let lo = mid + 1
3247 if i_val == mid_val | break | endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003248 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003249 else
3250 " reverse sorting order
3251 if i_val > mid_val
3252 let hi = mid
3253 else
3254 let lo = mid + 1
3255 if i_val == mid_val | break | endif
3256 endif
3257 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003258 endwhile
3259 " do insert
3260 if lo < i
Bram Moolenaar83bab712005-08-01 21:58:57 +00003261 exe 'keepjumps '.i.'d_'
3262 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003263 endif
3264 let i = i + 1
3265 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00003266
3267" " call Dret("NetSort")
3268 endfun
3269endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003270
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003271" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00003272" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
3273" What this function does is to compute a priority for the patterns
3274" in the g:netrw_sort_sequence. It applies a substitute to any
3275" "files" that satisfy each pattern, putting the priority / in
3276" front. An "*" pattern handles the default priority.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003277fun! s:SetSort()
Bram Moolenaar488c6512005-08-11 20:09:58 +00003278" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003279 if g:netrw_longlist
3280 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
3281 else
3282 let seqlist = g:netrw_sort_sequence
3283 endif
3284 " sanity check -- insure that * appears somewhere
3285 if seqlist == ""
3286 let seqlist= '*'
3287 elseif seqlist !~ '\*'
3288 let seqlist= seqlist.',*'
3289 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003290 let priority = 1
3291 while seqlist != ""
3292 if seqlist =~ ','
3293 let seq = substitute(seqlist,',.*$','','e')
3294 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
3295 else
3296 let seq = seqlist
3297 let seqlist = ""
3298 endif
3299 let eseq= escape(seq,'/')
3300 if priority < 10
3301 let spriority= "00".priority.'\/'
3302 elseif priority < 100
3303 let spriority= "0".priority.'\/'
3304 else
3305 let spriority= priority.'\/'
3306 endif
3307" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
3308
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003309 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00003310 if w:netrw_bannercnt > line("$")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003311 " apparently no files were left after a Hiding pattern was used
3312" call Dret("SetSort : no files left after hiding")
3313 return
3314 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003315 if seq == '*'
Bram Moolenaar488c6512005-08-11 20:09:58 +00003316 exe 'keepjumps silent '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003317 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003318 exe 'keepjumps silent '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003319 endif
3320 let priority = priority + 1
3321 endwhile
3322
Bram Moolenaar488c6512005-08-11 20:09:58 +00003323 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003324
3325" call Dret("SetSort")
3326endfun
3327
Bram Moolenaar488c6512005-08-11 20:09:58 +00003328" ---------------------------------------------------------------------
3329" SaveWinVars: (used by Explore()) {{{1
3330fun! s:SaveWinVars()
3331" call Dfunc("SaveWinVars()")
3332 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
3333 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
3334 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
3335 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
3336 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
3337 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
3338 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
3339 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003340 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003341" call Dret("SaveWinVars")
3342endfun
3343
3344" ---------------------------------------------------------------------
3345" CopyWinVars: (used by Explore()) {{{1
3346fun! s:CopyWinVars()
3347" call Dfunc("CopyWinVars()")
3348 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
3349 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
3350 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
3351 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
3352 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
3353 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
3354 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
3355 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003356 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003357" call Dret("CopyWinVars")
3358endfun
3359
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003360" ---------------------------------------------------------------------
3361" BufWinVars: (used by NetBrowse() and LocalBrowse()) {{{1
3362" To allow separate windows to have their own activities, such as
3363" Explore **/pattern, several variables have been made window-oriented.
3364" However, when the user splits a browser window (ex: ctrl-w s), these
3365" variables are not inherited by the new window. BufWinVars() and
3366" UseBufWinVars() get around that.
3367fun! s:BufWinVars()
3368" call Dfunc("BufWinVars()")
3369 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
3370 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
3371 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
3372 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
3373 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen = w:netrw_explore_listlen|endif
3374 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = w:netrw_explore_mtchcnt|endif
3375 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
3376 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
3377 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
3378" call Dret("BufWinVars")
3379endfun
3380
3381" ---------------------------------------------------------------------
3382" UseBufWinVars: (used by NetBrowse() and LocalBrowse() {{{1
3383" Matching function to BufferWinVars()
3384fun! s:UseBufWinVars()
3385" call Dfunc("UseBufWinVars()")
3386 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
3387 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
3388 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
3389 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
3390 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
3391 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
3392 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
3393 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
3394 if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif
3395" call Dret("UseBufWinVars")
3396endfun
3397
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003398" ------------------------------------------------------------------------
3399" Settings Restoration: {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003400let &cpo= s:keepcpo
3401unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003402
Bram Moolenaar071d4272004-06-13 20:20:40 +00003403" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00003404" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003405" vim:ts=8 fdm=marker