blob: c7434af9b517665f543e5ddcfacabaa77fac548d [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 Moolenaarf75a9632005-09-13 21:20:47 +00003" Date: Sep 12, 2005
4" Version: 70
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00005" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
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 Moolenaar578b49e2005-09-10 19:22:57 +000020
21" Exception for &cp: {{{1
22if &cp
23 finish
24endif
25if v:version < 700
26 echohl WarningMsg | echo "***netrw*** you need vim version 7.0 or later for version ".g:loaded_netrw." of netrw" | echohl None
27 finish
28endif
Bram Moolenaarf75a9632005-09-13 21:20:47 +000029let g:loaded_netrw = "v70"
Bram Moolenaar578b49e2005-09-10 19:22:57 +000030let s:keepcpo = &cpo
Bram Moolenaar071d4272004-06-13 20:20:40 +000031set cpo&vim
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000032" call Decho("doing autoload/netrw.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +000033
34" ---------------------------------------------------------------------
35" Default values for global netrw variables {{{1
36if !exists("g:netrw_ftpmode")
37 let g:netrw_ftpmode= "binary"
38endif
39if !exists("g:netrw_win95ftp")
40 let g:netrw_win95ftp= 1
41endif
42if !exists("g:netrw_cygwin")
Bram Moolenaard4755bb2004-09-02 19:12:26 +000043 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000044 if &shell == "bash"
45 let g:netrw_cygwin= 1
46 else
47 let g:netrw_cygwin= 0
48 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000049 else
50 let g:netrw_cygwin= 0
51 endif
52endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000053if !exists("g:netrw_list_cmd")
54 if executable("ssh")
55 " provide a default listing command
56 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
57 else
Bram Moolenaar83bab712005-08-01 21:58:57 +000058" call Decho("ssh is not executable, can't do remote directory exploring with ssh")
Bram Moolenaar843ee412004-06-30 16:16:41 +000059 let g:netrw_list_cmd= ""
60 endif
61endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +000062if !exists("g:netrw_ftp_list_cmd")
63 if has("unix") || exists("g:netrw_cygwin")
64 let g:netrw_ftp_list_cmd= "ls -lF"
65 else
66 let g:netrw_ftp_list_cmd= "dir"
67 endif
68endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000069if !exists("g:netrw_rm_cmd")
70 let g:netrw_rm_cmd = "ssh HOSTNAME rm"
71endif
72if !exists("g:netrw_rmf_cmd")
73 let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
74endif
75if !exists("g:netrw_rmdir_cmd")
76 let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
77endif
78if !exists("g:netrw_rename_cmd")
79 let g:netrw_rename_cmd= "ssh HOSTNAME mv"
80endif
81if exists("g:netrw_silent") && g:netrw_silent != 0
82 let g:netrw_silentxfer= "silent "
83else
84 let g:netrw_silentxfer= ""
85endif
86if !exists("g:netrw_winsize")
87 let g:netrw_winsize= ""
88endif
89if !exists("g:netrw_list_hide")
90 let g:netrw_list_hide= ""
91endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000092if !exists("g:netrw_sort_by")
93 " alternatives: date size
94 let g:netrw_sort_by= "name"
95endif
96if !exists("g:netrw_sort_sequence")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000097 let g:netrw_sort_sequence= '[\/]$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000098endif
99if !exists("g:netrw_sort_direction")
100 " alternative: reverse (z y x ...)
101 let g:netrw_sort_direction= "normal"
102endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000103if !exists("g:netrw_longlist")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000104 let g:netrw_longlist= 0
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000105endif
106if g:netrw_longlist == 0 || g:netrw_longlist == 2
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000107 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
Bram Moolenaar8299df92004-07-10 09:47:34 +0000108else
109 let g:netrw_longlist= 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000110 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -l"
111endif
112if !exists("g:netrw_list_cmd")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000113endif
114if !exists("g:netrw_timefmt")
115 let g:netrw_timefmt= "%c"
116endif
117if !exists("g:netrw_local_rmdir")
118 let g:netrw_local_rmdir= "rmdir"
119endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000120if !exists("g:netrw_local_mkdir")
121 let g:netrw_local_mkdir= "mkdir"
122endif
123if !exists("g:netrw_mkdir_cmd")
124 let g:netrw_mkdir_cmd= "ssh HOSTNAME mkdir"
125endif
Bram Moolenaar269ec652004-07-29 08:43:53 +0000126if !exists("g:netrw_hide")
127 let g:netrw_hide= 1
128endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000129if !exists("g:netrw_ftp_browse_reject")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000130 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 +0000131endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000132if !exists("g:netrw_ssh_browse_reject")
133 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
134endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000135if !exists("g:netrw_keepdir")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000136 let g:netrw_keepdir= 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000137endif
138if !exists("s:netrw_cd_escape")
139 if has("win32") || has("win95") || has("win64") || has("win16")
140 let s:netrw_cd_escape="#% "
141 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000142 let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000143 endif
144endif
145if !exists("s:netrw_glob_escape")
146 if has("win32") || has("win95") || has("win64") || has("win16")
147 let s:netrw_glob_escape= ""
148 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000149 let s:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000150 endif
151endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000152if !exists("g:netrw_alto")
153 let g:netrw_alto= 0
154endif
155if !exists("g:netrw_altv")
156 let g:netrw_altv= 0
157endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000158if !exists("g:netrw_maxfilenamelen")
159 let g:netrw_maxfilenamelen= 32
160endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000161if !exists("g:netrw_dirhistmax")
162 let g:netrw_dirhistmax= 10
163endif
164if !exists("g:NETRW_DIRHIST_CNT")
165 let g:NETRW_DIRHIST_CNT= 0
166endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000167
168" BufEnter event ignored by decho when following variable is true
169" Has a side effect that doau BufReadPost doesn't work, so
170" files read by network transfer aren't appropriately highlighted.
171"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000172
173" ---------------------------------------------------------------------
174" Default values for global protocol variables {{{1
175if !exists("g:netrw_rcp_cmd")
176 let g:netrw_rcp_cmd = "rcp"
177endif
178if !exists("g:netrw_ftp_cmd")
179 let g:netrw_ftp_cmd = "ftp"
180endif
181if !exists("g:netrw_scp_cmd")
182 let g:netrw_scp_cmd = "scp -q"
183endif
184if !exists("g:netrw_sftp_cmd")
185 let g:netrw_sftp_cmd = "sftp"
186endif
187if !exists("g:netrw_http_cmd")
188 if executable("wget")
189 let g:netrw_http_cmd = "wget -q -O"
190 elseif executable("fetch")
191 let g:netrw_http_cmd = "fetch -o"
192 else
193 let g:netrw_http_cmd = ""
194 endif
195endif
196if !exists("g:netrw_dav_cmd")
197 let g:netrw_dav_cmd = "cadaver"
198endif
199if !exists("g:netrw_rsync_cmd")
200 let g:netrw_rsync_cmd = "rsync"
201endif
202if !exists("g:netrw_fetch_cmd")
203 if executable("fetch")
204 let g:netrw_fetch_cmd = "fetch -o"
205 else
206 let g:netrw_fetch_cmd = ""
207 endif
208endif
209
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000210if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000211 \ && exists("g:netrw_use_nt_rcp")
212 \ && g:netrw_use_nt_rcp
213 \ && executable( $SystemRoot .'/system32/rcp.exe')
214 let s:netrw_has_nt_rcp = 1
215 let s:netrw_rcpmode = '-b'
216 else
217 let s:netrw_has_nt_rcp = 0
218 let s:netrw_rcpmode = ''
219endif
220
Bram Moolenaar071d4272004-06-13 20:20:40 +0000221" ------------------------------------------------------------------------
222" NetSavePosn: saves position of cursor on screen {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000223fun! netrw#NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000224" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000225 " Save current line and column
Bram Moolenaar488c6512005-08-11 20:09:58 +0000226 let w:netrw_winnr= winnr()
227 let w:netrw_line = line(".")
228 let w:netrw_col = virtcol(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000229
230 " Save top-of-screen line
231 norm! H0
Bram Moolenaar488c6512005-08-11 20:09:58 +0000232 let w:netrw_hline= line(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000233
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000234 call netrw#NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000235" 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 +0000236endfun
237
238" ------------------------------------------------------------------------
239" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000240fun! netrw#NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000241" 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 +0000242 let eikeep= &ei
243 set ei=all
Bram Moolenaar071d4272004-06-13 20:20:40 +0000244
Bram Moolenaar81695252004-12-29 20:58:21 +0000245 " restore window
Bram Moolenaar488c6512005-08-11 20:09:58 +0000246" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
247 exe "silent! ".w:netrw_winnr."wincmd w"
Bram Moolenaar572cb562005-08-05 21:35:02 +0000248" if v:shell_error == 0
249" " as suggested by Bram M: redraw on no error
250" " allows protocol error messages to remain visible
251" redraw!
252" endif
Bram Moolenaar81695252004-12-29 20:58:21 +0000253
Bram Moolenaar071d4272004-06-13 20:20:40 +0000254 " restore top-of-screen line
Bram Moolenaar488c6512005-08-11 20:09:58 +0000255" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
256 exe "norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaar81695252004-12-29 20:58:21 +0000257
Bram Moolenaar071d4272004-06-13 20:20:40 +0000258 " restore position
Bram Moolenaar488c6512005-08-11 20:09:58 +0000259" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
260 exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000261
Bram Moolenaar572cb562005-08-05 21:35:02 +0000262 let &ei= eikeep
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000263" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000264endfun
265
266" ------------------------------------------------------------------------
267" NetRead: responsible for reading a file over the net {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000268fun! netrw#NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000269" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000270
271 " save options
272 call s:NetOptionSave()
273
274 " Special Exception: if a file is named "0r", then
275 " "0r" will be used to read the
276 " following files instead of "r"
277 if a:0 == 0
278 let readcmd= "r"
279 let ichoice= 0
280 elseif a:1 == "0r"
281 let readcmd = "0r"
282 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000283 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000284 let readcmd = "r"
285 let ichoice = 1
286 endif
287
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000288 " get name of a temporary file and set up shell-quoting character
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000289 let tmpfile= tempname()
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000290 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000291 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000292 echohl Error | echo "***netrw*** your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000293 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
294" call Dret("NetRead")
295 return
296 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000297
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000298" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000299 while ichoice <= a:0
300
301 " attempt to repeat with previous host-file-etc
302 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000303" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000304 let choice = b:netrw_lastfile
305 let ichoice= ichoice + 1
306
307 else
308 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000309" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000310
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000311 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000312 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000313 echomsg 'NetRead Usage:'
314 echomsg ':Nread machine:path uses rcp'
315 echomsg ':Nread "machine path" uses ftp with <.netrc>'
316 echomsg ':Nread "machine id password path" uses ftp'
317 echomsg ':Nread dav://machine[:port]/path uses cadaver'
318 echomsg ':Nread fetch://machine/path uses fetch'
319 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
320 echomsg ':Nread http://[user@]machine/path uses http wget'
321 echomsg ':Nread rcp://[user@]machine/path uses rcp'
322 echomsg ':Nread rsync://machine[:port]/path uses rsync'
323 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
324 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000325 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000326
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000327 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000328 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000329" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000330 if match(choice,"\"$") != -1
331 " case "..."
332 let choice=strpart(choice,1,strlen(choice)-2)
333 else
334 " case "... ... ..."
335 let choice = strpart(choice,1,strlen(choice)-1)
336 let wholechoice = ""
337
338 while match(choice,"\"$") == -1
339 let wholechoice = wholechoice . " " . choice
340 let ichoice = ichoice + 1
341 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000342 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000343 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000344 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000345 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000346" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000347 return
348 endif
349 let choice= a:{ichoice}
350 endwhile
351 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
352 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000353 endif
354 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000355
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000356" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000357 let ichoice= ichoice + 1
358
359 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000360 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000361 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000362" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000363
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000364 exe 'lcd ' . fnamemodify(tmpfile,':h')
365 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000366 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000367
368 " Determine method of read (ftp, rcp, etc)
369 call s:NetMethod(choice)
370
Bram Moolenaar843ee412004-06-30 16:16:41 +0000371 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000372" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000373 if choice =~ "^.*[\/]$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000374 keepjumps call s:NetBrowse(choice)
375" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000376 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000377 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000378
379 " ============
380 " Perform Read
381 " ============
382
383 ".........................................
384 " rcp: NetRead Method #1
385 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000386" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000387 " ER: noting done with g:netrw_uid yet?
388 " ER: on Win2K" rcp machine[.user]:file tmpfile
389 " ER: if machine contains '.' adding .user is required (use $USERNAME)
390 " ER: the tmpfile is full path: rcp sees C:\... as host C
391 if s:netrw_has_nt_rcp == 1
392 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
393 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
394 else
395 " Any way needed it machine contains a '.'
396 let uid_machine = g:netrw_machine .'.'. $USERNAME
397 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000398 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000399 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
400 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
401 else
402 let uid_machine = g:netrw_machine
403 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000404 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000405" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000406 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
407 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
408 let b:netrw_lastfile = choice
409
410 ".........................................
411 " ftp + <.netrc>: NetRead Method #2
412 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000413" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000414 let netrw_fname= b:netrw_fname
415 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000416 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000417 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000418 exe "put ='"."get ".netrw_fname." ".tmpfile."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000419 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000420" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000421 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
422 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000423" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000424 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
425 endif
426 " 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 +0000427 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000428 let debugkeep= &debug
429 set debug=msg
Bram Moolenaar572cb562005-08-05 21:35:02 +0000430 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000431 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000432 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000433 endif
434 bd!
435 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
436 let b:netrw_lastfile = choice
437
438 ".........................................
439 " ftp + machine,id,passwd,filename: NetRead Method #3
440 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
441 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000442" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000443 let netrw_fname= b:netrw_fname
444 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000445 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000446 if exists("g:netrw_port") && g:netrw_port != ""
447 put ='open '.g:netrw_machine.' '.g:netrw_port
448 else
449 put ='open '.g:netrw_machine
450 endif
451
452 if exists("g:netrw_ftp") && g:netrw_ftp == 1
453 put =g:netrw_uid
454 put =g:netrw_passwd
455 else
456 put ='user '.g:netrw_uid.' '.g:netrw_passwd
457 endif
458
459 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
460 put =g:netrw_ftpmode
461 endif
462 put ='get '.netrw_fname.' '.tmpfile
463
464 " perform ftp:
465 " -i : turns off interactive prompting from ftp
466 " -n unix : DON'T use <.netrc>, even though it exists
467 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000468" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000469 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000470" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000471 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
472 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
473 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000474" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000475 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000476 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000477 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000478 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000479 endif
480 bd!
481 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
482 let b:netrw_lastfile = choice
483
484 ".........................................
485 " scp: NetRead Method #4
486 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000487" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000488 if exists("g:netrw_port") && g:netrw_port != ""
489 let useport= " -P ".g:netrw_port
490 else
491 let useport= ""
492 endif
493 if g:netrw_cygwin == 1
494 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000495" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000496 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
497 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000498" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000499 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
500 endif
501 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
502 let b:netrw_lastfile = choice
503
504 ".........................................
505 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000506" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000507 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000508 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000509 echohl Error | echo "***netrw*** neither wget nor fetch command is available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000510 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000511 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000512 exit
513 endif
514
515 if match(b:netrw_fname,"#") == -1
516 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000517" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000518 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
519 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
520
521 else
522 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
523 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
524 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000525" call Decho("netrw_html<".netrw_html.">")
526" call Decho("netrw_tag <".netrw_tag.">")
527" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000528 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
529 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000530" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000531 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
532 endif
533 let b:netrw_lastfile = choice
534
535 ".........................................
536 " cadaver: NetRead Method #6
537 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000538" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000539
540 " Construct execution string (four lines) which will be passed through filter
541 let netrw_fname= b:netrw_fname
542 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000543 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000544 if exists("g:netrw_port") && g:netrw_port != ""
545 put ='open '.g:netrw_machine.' '.g:netrw_port
546 else
547 put ='open '.g:netrw_machine
548 endif
549 put ='user '.g:netrw_uid.' '.g:netrw_passwd
550
551 if g:netrw_cygwin == 1
552 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
553 put ='get '.netrw_fname.' '.cygtmpfile
554 else
555 put ='get '.netrw_fname.' '.tmpfile
556 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000557 put ='quit'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000558
559 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000560 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000561" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000562 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
563 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000564 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000565 let b:netrw_lastfile = choice
566
567 ".........................................
568 " rsync: NetRead Method #7
569 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000570" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000571 if g:netrw_cygwin == 1
572 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000573" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000574 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
575 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000576" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000577 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
578 endif
579 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
580 let b:netrw_lastfile = choice
581
582 ".........................................
583 " fetch: NetRead Method #8
584 " fetch://[user@]host[:http]/path
585 elseif b:netrw_method == 8 " read with fetch
586 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000587 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000588 echohl Error | echo "***netrw*** fetch command not available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000589 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000590 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000591 exit
592 endif
593 if exists("g:netrw_option") && g:netrw_option == ":http"
594 let netrw_option= "http"
595 else
596 let netrw_option= "ftp"
597 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000598" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000599
600 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000601" 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 +0000602 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
603 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000604" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000605 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
606 endif
607
608 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
609 let b:netrw_lastfile = choice
610
611 ".........................................
612 " sftp: NetRead Method #9
613 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000614" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000615 if g:netrw_cygwin == 1
616 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000617" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
618" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000619 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
620 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000621" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000622 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
623 endif
624 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
625 let b:netrw_lastfile = choice
626
627 ".........................................
628 else " Complain
629 echo "***warning*** unable to comply with your request<" . choice . ">"
630 endif
631 endwhile
632
633 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000634" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000635 if exists("b:netrw_method")
636 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000637 unlet b:netrw_fname
638 endif
639 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000640
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000641" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000642endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000643
644" ------------------------------------------------------------------------
645" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
646fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000647" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000648
649 if exists("*NetReadFixup")
650 " for the use of NetReadFixup (not otherwise used internally)
651 let line2= line("$")
652 endif
653
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000654 " transform paths from / to \ for Windows (except for cygwin)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000655 if &term == "win32"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000656 if g:netrw_cygwin
657 let fname= a:fname
658" call Decho("(win32 && cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000659 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000660 let fname= substitute(a:fname,'/','\\\\','ge')
661" call Decho("(win32 && !cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000662 endif
663 else
664 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000665" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000666 endif
667
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000668 if a:readcmd[0] == '0'
Bram Moolenaar81695252004-12-29 20:58:21 +0000669 " get file into buffer
Bram Moolenaar83bab712005-08-01 21:58:57 +0000670
Bram Moolenaar81695252004-12-29 20:58:21 +0000671 " record remote filename
Bram Moolenaar83bab712005-08-01 21:58:57 +0000672 let rfile= bufname(".")
673" call Decho("remotefile<".rfile.">")
674" call Dredir("ls!","starting buffer list")
675
Bram Moolenaar81695252004-12-29 20:58:21 +0000676 " rename the current buffer to the temp file (ie. fname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000677 keepalt exe "file ".fname
Bram Moolenaar83bab712005-08-01 21:58:57 +0000678" call Dredir("ls!","after renaming current buffer to <".fname.">")
679
Bram Moolenaar81695252004-12-29 20:58:21 +0000680 " edit temporary file
681 e
Bram Moolenaar83bab712005-08-01 21:58:57 +0000682" call Dredir("ls!","after editing temporary file")
683
Bram Moolenaar81695252004-12-29 20:58:21 +0000684 " rename buffer back to remote filename
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000685 keepalt exe "file ".rfile
Bram Moolenaar83bab712005-08-01 21:58:57 +0000686" call Dredir("ls!","renaming buffer back to remote filename<".rfile.">")
Bram Moolenaar81695252004-12-29 20:58:21 +0000687 let line1 = 1
688 let line2 = line("$")
689
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000690 elseif filereadable(fname)
Bram Moolenaar81695252004-12-29 20:58:21 +0000691 " read file after current line
692 let curline = line(".")
693 let lastline= line("$")
694" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname."> line#".curline)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000695 exe a:readcmd." ".v:cmdarg." ".fname
Bram Moolenaar81695252004-12-29 20:58:21 +0000696 let line1 = curline + 1
697 let line2 = line("$") - lastline + 1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000698 else
Bram Moolenaar81695252004-12-29 20:58:21 +0000699 " not readable
700" call Dret("NetGetFile : fname<".fname."> not readable")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000701 return
702 endif
703
704 " User-provided (ie. optional) fix-it-up command
705 if exists("*NetReadFixup")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000706" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000707 call NetReadFixup(a:method, line1, line2)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000708" else " Decho
709" call Decho("NetReadFixup() not called, doesn't exist")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000710 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000711
712 " update the Buffers menu
713 if has("gui") && has("gui_running")
714 silent! emenu Buffers.Refresh\ menu
715 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000716
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000717" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000718
719 " insure that we have the right filetype and that its being displayed
720 filetype detect
721 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000722" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000723endfun
724
725" ------------------------------------------------------------------------
726" NetWrite: responsible for writing a file over the net {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000727fun! netrw#NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000728" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000729
730 " option handling
731 let mod= 0
732 call s:NetOptionSave()
733
734 " Get Temporary Filename
735 let tmpfile= tempname()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000736 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
737 echohl Error | echo "***netrw*** your ".substitute(tmpfile,'[^/]\+$','','e')." directory is missing!"
738 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
739" call Dret("NetRead")
740 return
741 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000742
743 if a:0 == 0
744 let ichoice = 0
745 else
746 let ichoice = 1
747 endif
748
749 " write (selected portion of) file to temporary
750 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
751
752 while ichoice <= a:0
753
754 " attempt to repeat with previous host-file-etc
755 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000756" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000757 let choice = b:netrw_lastfile
758 let ichoice= ichoice + 1
759 else
760 exe "let choice= a:" . ichoice
761
762 " Reconstruct Choice if choice starts with '"'
763 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000764 echomsg 'NetWrite Usage:"'
765 echomsg ':Nwrite machine:path uses rcp'
766 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
767 echomsg ':Nwrite "machine id password path" uses ftp'
768 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
769 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
770 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
771 echomsg ':Nwrite rcp://machine/path uses rcp'
772 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
773 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
774 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000775 break
776
777 elseif match(choice,"^\"") != -1
778 if match(choice,"\"$") != -1
779 " case "..."
780 let choice=strpart(choice,1,strlen(choice)-2)
781 else
782 " case "... ... ..."
783 let choice = strpart(choice,1,strlen(choice)-1)
784 let wholechoice = ""
785
786 while match(choice,"\"$") == -1
787 let wholechoice= wholechoice . " " . choice
788 let ichoice = ichoice + 1
789 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000790 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000791 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000792 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000793 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000794" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000795 return
796 endif
797 let choice= a:{ichoice}
798 endwhile
799 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
800 endif
801 endif
802 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000803" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000804 let ichoice= ichoice + 1
805
806 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000807 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000808 let choice= substitute(choice,'\\','/','ge')
809 "ER: see NetRead()
810 exe 'lcd ' . fnamemodify(tmpfile,':h')
811 let tmpfile = fnamemodify(tmpfile,':t')
812 endif
813
814 " Determine method of read (ftp, rcp, etc)
815 call s:NetMethod(choice)
816
817 " =============
818 " Perform Write
819 " =============
820
821 ".........................................
822 " rcp: NetWrite Method #1
823 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000824" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000825 if s:netrw_has_nt_rcp == 1
826 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
827 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
828 else
829 let uid_machine = g:netrw_machine .'.'. $USERNAME
830 endif
831 else
832 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
833 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
834 else
835 let uid_machine = g:netrw_machine
836 endif
837 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000838" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000839 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
840 let b:netrw_lastfile = choice
841
842 ".........................................
843 " ftp + <.netrc>: NetWrite Method #2
844 elseif b:netrw_method == 2 " write with ftp + <.netrc>
845 let netrw_fname = b:netrw_fname
846 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000847 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000848 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000849" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000850 exe "put ='"."put ".tmpfile." ".netrw_fname."'"
851" call Decho("put ='"."put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000852 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000853" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000854 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000855 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000856" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000857 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000858 endif
859 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
860 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000861 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000862 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000863 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000864 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000865 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000866 endif
867 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000868 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000869
870 ".........................................
871 " ftp + machine, id, passwd, filename: NetWrite Method #3
872 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
873 let netrw_fname= b:netrw_fname
874 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000875 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000876 if exists("g:netrw_port") && g:netrw_port != ""
877 put ='open '.g:netrw_machine.' '.g:netrw_port
878 else
879 put ='open '.g:netrw_machine
880 endif
881 if exists("g:netrw_ftp") && g:netrw_ftp == 1
882 put =g:netrw_uid
883 put =g:netrw_passwd
884 else
885 put ='user '.g:netrw_uid.' '.g:netrw_passwd
886 endif
887 put ='put '.tmpfile.' '.netrw_fname
888 " save choice/id/password for future use
889 let b:netrw_lastfile = choice
890
891 " perform ftp:
892 " -i : turns off interactive prompting from ftp
893 " -n unix : DON'T use <.netrc>, even though it exists
894 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000895" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000896 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000897" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000898 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
899 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
900 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000901 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000902 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000903 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000904 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000905 let mod=1
906 endif
907 bd!
908
909 ".........................................
910 " scp: NetWrite Method #4
911 elseif b:netrw_method == 4 " write with scp
912 if exists("g:netrw_port") && g:netrw_port != ""
913 let useport= " -P ".g:netrw_port
914 else
915 let useport= ""
916 endif
917 if g:netrw_cygwin == 1
918 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000919" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000920 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
921 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000922" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000923 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
924 endif
925 let b:netrw_lastfile = choice
926
927 ".........................................
928 " http: NetWrite Method #5
929 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000930 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000931 echohl Error | echo "***netrw*** currently <netrw.vim> does not support writing using http:" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000932 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000933 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000934
935 ".........................................
936 " dav: NetWrite Method #6
937 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000938" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000939
940 " Construct execution string (four lines) which will be passed through filter
941 let netrw_fname= b:netrw_fname
942 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000943 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000944 if exists("g:netrw_port") && g:netrw_port != ""
945 put ='open '.g:netrw_machine.' '.g:netrw_port
946 else
947 put ='open '.g:netrw_machine
948 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000949 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000950
951 if g:netrw_cygwin == 1
952 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
953 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000954 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000955 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000956 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000957
958 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000959 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000960" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000961 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
962 bd!
963 let b:netrw_lastfile = choice
964
965 ".........................................
966 " rsync: NetWrite Method #7
967 elseif b:netrw_method == 7 " write with rsync
968 if g:netrw_cygwin == 1
969 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000970" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000971 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000972 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000973" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000974 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000975 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000976 let b:netrw_lastfile = choice
977
978 ".........................................
979 " scp: NetWrite Method #9
980 elseif b:netrw_method == 9 " write with sftp
981 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000982 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
983 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
984 else
985 let uid_machine = g:netrw_machine
986 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000987 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000988 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000989 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000990 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000991" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000992 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
993 bd!
994 let b:netrw_lastfile= choice
995
996 ".........................................
997 else " Complain
998 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000999 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001000 endwhile
1001
1002 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001003" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001004 let result=delete(tmpfile)
1005 call s:NetOptionRestore()
1006
1007 if a:firstline == 1 && a:lastline == line("$")
1008 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001009 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001010
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001011" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001012endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001013
Bram Moolenaar83bab712005-08-01 21:58:57 +00001014" ===========================================
1015" Remote Directory Browsing Support: {{{1
1016" ===========================================
1017
Bram Moolenaar843ee412004-06-30 16:16:41 +00001018" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001019" of the contents of a remote directory. It is assumed that the
1020" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1021" with the requested remote hostname first.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001022fun! s:NetBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001023 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
1024" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".w:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001025
Bram Moolenaar488c6512005-08-11 20:09:58 +00001026 if exists("s:netrw_skipbrowse")
1027 unlet s:netrw_skipbrowse
1028" call Dret("NetBrowse")
1029 return
1030 endif
1031
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001032 call s:NetOptionSave()
1033
Bram Moolenaar843ee412004-06-30 16:16:41 +00001034 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001035 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1036" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001037 if !executable("ftp")
1038 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001039 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ftp" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001040 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001041 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001042 call s:NetOptionRestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001043" call Dret("NetBrowse")
1044 return
1045 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001046 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001047 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001048 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ssh" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001049 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001050 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001051
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001052 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001053" call Dret("NetBrowse")
1054 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001055 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001056
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001057 " use buffer-oriented WinVars if buffer ones exist but window ones don't
1058 call s:UseBufWinVars()
1059
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001060 " make this buffer modifiable
Bram Moolenaar83bab712005-08-01 21:58:57 +00001061 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001062
1063 " analyze a:dirname and g:netrw_list_cmd
1064 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001065 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001066" call Decho("dirpat<".dirpat.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001067 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001068 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001069 echohl Error | echo "***netrw*** netrw doesn't understand your dirname<".dirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001070 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001071 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001072 call s:NetOptionRestore()
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001073" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001074 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001075 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001076
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001077 let method = substitute(dirname,dirpat,'\1','')
1078 let user = substitute(dirname,dirpat,'\2','')
1079 let machine = substitute(dirname,dirpat,'\3','')
1080 let path = substitute(dirname,dirpat,'\4','')
1081 let fname = substitute(dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001082" call Decho("set up method <".method .">")
1083" call Decho("set up user <".user .">")
1084" call Decho("set up machine<".machine.">")
1085" call Decho("set up path <".path .">")
1086" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001087
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001088 if method == "ftp" || method == "http"
1089 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001090 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001091 else
1092 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1093 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001094
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001095 if exists("b:netrw_method")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001096" call Decho("setting w:netrw_method<".b:netrw_method.">")
1097 let w:netrw_method= b:netrw_method
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001098 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001099
Bram Moolenaar8299df92004-07-10 09:47:34 +00001100 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001101 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
Bram Moolenaar572cb562005-08-05 21:35:02 +00001102 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 +00001103 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001104 else
1105 if g:netrw_sort_by =~ "^t"
1106 let listcmd= listcmd."t"
1107 elseif g:netrw_sort_by =~ "^s"
1108 let listcmd= listcmd."S"
1109 endif
1110 " optionally sort in reverse
1111 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1112 let listcmd= listcmd."r"
1113 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001114 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001115
1116" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001117 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001118" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001119 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001120 redraw!
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001121 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001122" call Dret("NetBrowse : symlink")
1123 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001124
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001125 elseif fname !~ '[\/]$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001126 " looks like a regular file, attempt transfer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001127" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001128
1129 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001130 " "this is a directory" indicator (/). There shouldn't be one of those,
1131 " anyway.
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001132 let path= substitute(path,'[*=@|]\r\=$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001133" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001134
1135 " remote-read the requested file into current buffer
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001136 keepjumps keepalt enew!
1137 set ma
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001138" call Decho("exe file .method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001139 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001140 exe "silent doau BufReadPre ".fname
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001141 silent call netrw#NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001142 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001143 keepjumps 1d
Bram Moolenaar572cb562005-08-05 21:35:02 +00001144
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001145 " save certain window-oriented variables into buffer-oriented variables
Bram Moolenaarf75a9632005-09-13 21:20:47 +00001146 call s:SetBufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001147 call s:NetOptionRestore()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001148 setlocal nomod
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001149
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001150" call Dret("NetBrowse : file<".fname.">")
1151 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001152 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001153
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001154 " ---------------------------------------------------------------------
1155 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001156" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001157 " set up new buffer and map
1158 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001159 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001160" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001161 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001162 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001163" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001164 exe "b ".bufnamenr
1165 if line("$") >= 5
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001166 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001167" call Dret("NetBrowse")
1168 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001169 endif
1170 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001171" call Decho("generate a new buffer")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001172 keepjumps keepalt enew!
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001173 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001174
1175 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001176 setlocal bt=nofile bh=wipe nobl noswf
1177 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001178" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001179 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001180" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001181 setlocal bh=hide bt=nofile nobl nonu
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001182
1183 " save current directory on directory history list
1184 call <SID>NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001185
1186 " set up buffer-local mappings
1187" call Decho("set up buffer-local mappings")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001188 nnoremap <buffer> <silent> <cr> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00001189 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001190 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001191 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 Moolenaar578b49e2005-09-10 19:22:57 +00001192 if w:netrw_longlist != 2
1193 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1194 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1195 endif
1196 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1197 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001198 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1199 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001200 nnoremap <buffer> <silent> o :call <SID>NetSplit(0)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001201 nnoremap <buffer> <silent> O :call <SID>NetObtain()<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001202 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1203 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
1204 nnoremap <buffer> <silent> s :call <SID>NetSaveWordPosn()<bar>let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name'<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<bar>call <SID>NetRestoreWordPosn()<cr>
1205 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001206 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1207 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001208 nnoremap <buffer> <silent> v :call <SID>NetSplit(1)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001209 nnoremap <buffer> <silent> x :call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
1210 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
1211 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001212 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001213 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001214 exe 'nnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001215 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001216 exe 'nnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001217 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001218 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaar83bab712005-08-01 21:58:57 +00001219 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001220
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001221 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001222" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1223 keepjumps put ='\" ==========================================================================='
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001224 keepjumps put ='\" Netrw Remote Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001225 keepjumps put ='\" '.bufname
Bram Moolenaar488c6512005-08-11 20:09:58 +00001226 let w:netrw_bannercnt = 7
1227 let sortby = g:netrw_sort_by
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001228 if g:netrw_sort_direction =~ "^r"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001229 let sortby = sortby." reversed"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001230 endif
1231
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001232 if g:netrw_sort_by =~ "^n"
1233 " sorted by name
Bram Moolenaar488c6512005-08-11 20:09:58 +00001234 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001235 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001236 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1237 else
1238 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001239 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001240 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001241 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001242 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001243 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001244 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001245 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001246 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001247 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001248 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001249 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1250 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001251
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001252 " remote read the requested directory listing
1253 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1254 " Note that not all ftp servers honor the options for ls
1255 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001256 " use ftp to get remote file listing
1257" call Decho("use ftp to get remote file listing")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001258 call s:NetBrowseFtpCmd(path,listcmd)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001259 keepjumps 1d
1260
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001261 if w:netrw_longlist == 0 || w:netrw_longlist == 2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001262 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001263" call Decho("generate short listing")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001264 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001265
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001266 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001267 if g:netrw_ftp_browse_reject != ""
1268 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1269 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001270 silent! keepjumps %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001271
1272 " if there's no ../ listed, then put ./ and ../ in
1273 let line1= line(".")
1274 keepjumps 1
1275 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1276 let line2= line(".")
1277 if line2 == 0
1278 keepjumps put='../'
1279 keepjumps put='./'
1280 endif
1281 exe "keepjumps ".line1
1282 keepjumps norm! 0
1283
1284 " more cleanup
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001285 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1286 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
1287 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001288 endif
1289
1290 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001291 " use ssh to get remote file listing
1292" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001293 let shq= &shq? &shq : ( &sxq? &sxq : "'")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001294" call Decho("exe silent r! ".listcmd." '".shq.escape(path,s:netrw_cd_escape).shq."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001295 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1296 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001297 " cleanup
1298 if g:netrw_ftp_browse_reject != ""
1299 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001300 endif
1301 endif
1302
1303 " set up syntax highlighting
1304 if has("syntax")
1305 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00001306 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001307 setlocal ft=
Bram Moolenaar572cb562005-08-05 21:35:02 +00001308 " Ugly workaround -- when syntax highlighting is off and laststatus==2,
1309 " sometimes the laststatus highlight bleeds into the entire display.
1310 " Only seems to happen with remote browsing. Weird.
1311 redraw
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001312 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001313 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001314
1315 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001316 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001317 if g:netrw_hide && g:netrw_list_hide != ""
1318 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001319 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001320
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001321 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00001322 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001323" call Decho("manipulate long listing")
1324
1325 if method == "ftp"
1326 " cleanup
Bram Moolenaar488c6512005-08-11 20:09:58 +00001327 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001328 while getline(".") =~ g:netrw_ftp_browse_reject
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001329 keepjumps d
1330 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001331 " if there's no ../ listed, then put ./ and ../ in
1332 let line1= line(".")
1333 keepjumps 1
1334 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1335 let line2= line(".")
1336 if line2 == 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00001337 exe 'keepjumps '.w:netrw_bannercnt."put='./'"
1338 exe 'keepjumps '.w:netrw_bannercnt."put='../'"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001339 endif
1340 exe "keepjumps ".line1
1341 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001342 endif
1343
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001344 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e'
1345 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1346 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001347 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001348
Bram Moolenaar488c6512005-08-11 20:09:58 +00001349 if line("$") >= w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001350 if g:netrw_sort_by =~ "^n"
1351 call s:SetSort()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001352 if g:netrw_sort_direction =~ 'n'
1353 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001354 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001355 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001356 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001357 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001358 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001359 if w:netrw_longlist == 1
1360 " shorten the list to keep its width <= winwidth characters
1361 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001362 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001363 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001364 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001365
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001366 call s:NetrwWideListing()
1367 if line("$") >= w:netrw_bannercnt
1368 " place cursor on the top-left corner of the file listing
1369 exe "keepjumps ".w:netrw_bannercnt
1370 norm! 0
1371 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001372
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001373 call s:NetOptionRestore()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001374 setlocal nomod noma nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001375
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001376" call Dret("NetBrowse")
1377 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001378endfun
1379
1380" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001381" NetBrowseChgDir: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001382fun! s:NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001383" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001384
1385 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001386 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001387
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001388 if newdir !~ '[\/]$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001389 " handling a file
1390 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001391" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001392
1393 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001394 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001395" call Decho("refresh directory listing")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001396 setlocal ma nobl bh=hide
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001397 %d
1398
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001399 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001400 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001401 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001402
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001403 if trailer =~ '^\%(\.\./\)*$'
1404 " tack on a ../"
1405 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001406
1407 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001408 " strip off a directory name from dirname
1409 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001410 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001411" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001412
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001413 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001414 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001415 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001416" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001417 endif
1418
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001419" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001420 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001421endfun
1422
Bram Moolenaar843ee412004-06-30 16:16:41 +00001423" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001424" NetGetWord: it gets the directory named under the cursor
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001425fun! s:NetGetWord()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001426" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001427 call s:UseBufWinVars()
1428
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001429 " insure that w:netrw_longlist is set up
1430 if !exists("w:netrw_longlist")
1431 if exists("g:netrw_longlist")
1432 let w:netrw_longlist= g:netrw_longlist
1433 else
1434 let w:netrw_longlist= 0
1435 endif
1436 endif
1437
Bram Moolenaar488c6512005-08-11 20:09:58 +00001438 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001439 " Active Banner support
1440" call Decho("active banner handling")
1441 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001442 let dirname= "./"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001443 let curline= getline(".")
1444 if curline =~ '"\s*Sorted by\s'
1445 norm s
1446 let s:netrw_skipbrowse= 1
1447 echo 'Pressing "s" also works'
1448 elseif curline =~ '"\s*Sort sequence:'
1449 let s:netrw_skipbrowse= 1
1450 echo 'Press "S" to edit sorting sequence'
1451 elseif curline =~ '"\s*Quick Help:'
1452 norm ?
1453 let s:netrw_skipbrowse= 1
1454 echo 'Pressing "?" also works'
1455 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
1456 norm a
1457 let s:netrw_skipbrowse= 1
1458 echo 'Pressing "a" also works'
1459 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001460 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00001461 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001462
1463 elseif w:netrw_longlist == 0
1464" call Decho("thin column handling")
1465 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001466 let dirname= getline(".")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001467
1468 elseif w:netrw_longlist == 1
1469" call Decho("long column handling")
1470 norm! 0
1471 let dirname= substitute(getline("."),'^\(\%(\S\+\s\)*\S\+\).\{-}$','\1','e')
1472
1473 else
1474" call Decho("obtain word from wide listing")
1475 let dirname= getline(".")
1476
1477 if !exists("b:netrw_cpf")
1478 let b:netrw_cpf= 0
1479 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
1480" call Decho("computed cpf")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001481 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001482
1483 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
1484" call Decho("virtcol=".virtcol(".")." cpf=".b:netrw_cpf." bannercnt=".w:netrw_bannercnt." filestart=".filestart)
1485" call Decho("1: dirname<".dirname.">")
1486 if filestart > 0|let dirname= substitute(dirname,'^.\{'.filestart.'}','','')|endif
1487" call Decho("2: dirname<".dirname.">")
1488 let dirname = substitute(dirname,'^\(.\{'.b:netrw_cpf.'}\).*$','\1','e')
1489" call Decho("3: dirname<".dirname.">")
1490 let dirname = substitute(dirname,'\s\+$','','e')
1491" call Decho("4: dirname<".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001492 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001493
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001494" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001495 return dirname
1496endfun
1497
1498" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001499" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001500fun! s:NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001501" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1502" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001503
1504 " preparation for removing multiple files/directories
1505 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001506 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001507
1508 " remove multiple files and directories
1509 while ctr <= a:lastline
1510 exe ctr
1511
1512 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001513 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001514" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001515
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001516 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001517 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001518 if !all
1519 echohl Statement
1520 call inputsave()
1521 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1522 call inputrestore()
1523 echohl NONE
1524 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1525 if ok =~ 'a\%[ll]'
1526 let all= 1
1527 endif
1528 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001529
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001530 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001531 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001532 silent! keepjumps .,$d
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001533 call s:NetBrowseFtpCmd(a:path,"delete ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001534 else
1535 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1536" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1537 let ret= system(netrw_rm_cmd)
1538" call Decho("returned=".ret." errcode=".v:shell_error)
1539 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001540 elseif ok =~ 'q\%[uit]'
1541 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001542 endif
1543
1544 else
1545 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001546 if !all
1547 call inputsave()
1548 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1549 call inputrestore()
1550 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1551 if ok =~ 'a\%[ll]'
1552 let all= 1
1553 endif
1554 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001555
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001556 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001557 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001558 call s:NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001559 else
1560 let rmfile = a:path.rmfile
1561 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1562" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1563 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001564" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001565
1566 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001567 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001568" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1569 let ret= system(netrw_rmf_cmd)
1570" call Decho("returned=".ret." errcode=".v:shell_error)
1571
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001572 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001573 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001574 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001575 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001576 endif
1577 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001578
1579 elseif ok =~ 'q\%[uit]'
1580 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001581 endif
1582 endif
1583
1584 let ctr= ctr + 1
1585 endwhile
1586
1587 " refresh the directory
1588 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001589" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001590 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1591 exe curline
1592
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001593" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001594endfun
1595
1596" ---------------------------------------------------------------------
1597" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001598fun! s:NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001599" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001600
1601 " preparation for removing multiple files/directories
1602 let ctr = a:firstline
1603 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1604
1605 " attempt to rename files/directories
1606 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001607 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001608
1609 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001610 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001611" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001612
1613 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001614 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001615 call inputrestore()
1616
Bram Moolenaar488c6512005-08-11 20:09:58 +00001617 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001618 call s:NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001619 else
1620 let oldname= a:path.oldname
1621 let newname= a:path.newname
1622" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1623 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1624 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001625
1626 let ctr= ctr + 1
1627 endwhile
1628
1629 " refresh the directory
1630 let curline= line(".")
1631 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001632 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001633" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001634endfun
1635
1636" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00001637" NetRefresh: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001638fun! s:NetRefresh(dirname)
Bram Moolenaar572cb562005-08-05 21:35:02 +00001639" call Dfunc("NetRefresh(dirname<".a:dirname.">)")
1640 set ma
1641 %d
1642 call <SID>NetBrowse(dirname)
1643 redraw!
1644" call Dret("NetRefresh")
1645endfun
1646
1647" ---------------------------------------------------------------------
Bram Moolenaar488c6512005-08-11 20:09:58 +00001648" NetSplit: mode {{{2
1649" =0 : net and o
1650" =1 : net and v
1651" =2 : local and o
1652" =3 : local and v
1653fun! s:NetSplit(mode)
1654" call Dfunc("NetSplit(mode=".a:mode.")")
1655
1656 call s:SaveWinVars()
1657 if a:mode == 0
1658 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1659 call s:CopyWinVars()
1660 exe "norm! 0"
1661 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
1662 elseif a:mode ==1
1663 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1664 call s:CopyWinVars()
1665 exe "norm! 0"
1666 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
1667 elseif a:mode ==2
1668 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1669 call s:CopyWinVars()
1670 exe "norm! 0"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001671 call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001672 else
1673 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1674 call s:CopyWinVars()
1675 exe "norm! 0"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001676 call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001677 endif
1678
1679" call Dret("NetSplit")
1680endfun
1681
1682" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001683" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001684" files given their extension. Passes 0=local, 1=remote
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001685fun! s:NetBrowseX(fname,remote)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001686" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001687
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001688 " set up the filename
1689 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001690 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001691 if has("win32") || has("win95") || has("win64") || has("win16")
1692 let exten= substitute(exten,'^.*$','\L&\E','')
1693 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001694 let fname= escape(a:fname,"%#")
1695" call Decho("fname<".fname."> after escape()")
1696
1697 if a:remote == 1
1698 " create a local copy
1699 let fname= tempname().".".exten
1700" call Decho("create a local copy of <".a:fname."> as <".fname.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001701 exe "silent keepjumps bot 1new ".a:fname
Bram Moolenaar572cb562005-08-05 21:35:02 +00001702 set bh=delete
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001703 exe "w! ".fname
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001704 q
1705 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001706" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001707
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001708 " set up redirection
1709 if &srr =~ "%s"
1710 let redir= substitute(&srr,"%s","/dev/null"."")
1711 else
1712 let redir= &srr . "/dev/null"
1713 endif
1714" call Decho("redir:".redir.":")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001715
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001716 " execute the file handler
1717 if has("win32") || has("win64")
1718" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1719 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1720 let ret= v:shell_error
1721
1722 elseif has("unix") && executable("kfmclient")
1723" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1724 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1725 let ret= v:shell_error
1726
1727 elseif has("unix") && executable("gnome-open")
1728" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1729 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1730 let ret= v:shell_error
1731
1732 elseif exten != "" && exists("*NetrwFileHandler_".exten)
1733" call Decho("let ret= NetrwFileHandler_".exten.'("'.fname.'")')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001734 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001735 endif
1736 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001737
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001738 " cleanup: remove temporary file,
1739 " delete current buffer if success with handler,
1740 " return to prior buffer (directory listing)
1741 if a:remote == 1 && fname != a:fname
1742" call Decho("deleting temporary file<".fname.">")
1743 call delete(fname)
1744 endif
1745
1746 if a:remote == 1
Bram Moolenaar572cb562005-08-05 21:35:02 +00001747 set bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001748 exe "norm! \<c-o>"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001749 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001750 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001751
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001752" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001753endfun
1754
1755" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001756" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1757" This function assumes that a long listing will be received. Size, time,
1758" and reverse sorts will be requested of the server but not otherwise
1759" enforced here.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001760fun! s:NetBrowseFtpCmd(path,cmd)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001761" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".w:netrw_method)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001762
1763 " because WinXX ftp uses unix style input
1764 " curline is one more than the bannercnt in order to account
1765 " for the unwanted first blank line (doing a :put to an empty
1766 " buffer yields a blank first line)
1767 let ffkeep= &ff
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001768 setlocal ma ff=unix
Bram Moolenaar488c6512005-08-11 20:09:58 +00001769 let curline= w:netrw_bannercnt+1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001770 exe "silent! keepjumps ".curline.",$d"
1771
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001772 ".........................................
1773 if w:netrw_method == 2 || w:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001774 " ftp + <.netrc>: Method #2
1775 if a:path != ""
1776 put ='cd '.a:path
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001777" call Decho("ftp: cd ".a:path)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001778 endif
1779 exe "put ='".a:cmd."'"
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001780" call Decho("ftp: ".a:cmd)
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001781" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001782 if exists("g:netrw_port") && g:netrw_port != ""
1783" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1784 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1785 else
1786" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1787 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1788 endif
1789
1790 ".........................................
Bram Moolenaar488c6512005-08-11 20:09:58 +00001791 elseif w:netrw_method == 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001792 " ftp + machine,id,passwd,filename: Method #3
1793 setlocal ff=unix
1794 if exists("g:netrw_port") && g:netrw_port != ""
1795 put ='open '.g:netrw_machine.' '.g:netrw_port
1796 else
1797 put ='open '.g:netrw_machine
1798 endif
1799
1800 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1801 put =g:netrw_uid
1802 put =g:netrw_passwd
1803 else
1804 put ='user '.g:netrw_uid.' '.g:netrw_passwd
1805 endif
1806
1807 if a:path != ""
1808 put ='cd '.a:path
1809 endif
1810 exe "put ='".a:cmd."'"
1811
1812 " perform ftp:
1813 " -i : turns off interactive prompting from ftp
1814 " -n unix : DON'T use <.netrc>, even though it exists
1815 " -n win32: quit being obnoxious about password
1816" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1817 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1818
1819 ".........................................
1820 else
1821 echo "***warning*** unable to comply with your request<" . choice . ">"
1822 endif
1823
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001824 " cleanup for Windows
1825 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001826 silent! keepjumps! %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001827 endif
1828 if a:cmd == "dir"
1829 " infer directory/link based on the file permission string
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001830 silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1831 silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/
1832 if w:netrw_longlist == 0 || w:netrw_longlist == 2
1833 exe "silent! keepjumps ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001834 endif
1835 endif
1836
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001837 " ftp's ls doesn't seem to include ./ or ../
1838 if !search('^\.\/$','wn')
1839 exe 'keepjumps '.curline
1840 if a:path !~ '^$'
1841 put ='../'
1842 endif
1843 put ='./'
1844 exe 'keepjumps '.curline
1845 endif
1846
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001847 " restore settings
1848 let &ff= ffkeep
1849" call Dret("NetBrowseFtpCmd")
1850endfun
1851
1852" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001853" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1854" separated patterns given in g:netrw_list_hide
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001855fun! s:NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001856" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001857
1858 let listhide= g:netrw_list_hide
1859 while listhide != ""
1860 if listhide =~ ','
1861 let hide = substitute(listhide,',.*$','','e')
1862 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1863 else
1864 let hide = listhide
1865 let listhide= ""
1866 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001867
1868 " Prune the list by hiding any files which match
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001869" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001870 if g:netrw_hide == 1
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001871 exe 'silent keepjumps '.w:netrw_bannercnt.',$g~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001872 elseif g:netrw_hide == 2
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001873 exe 'silent keepjumps '.w:netrw_bannercnt.',$v~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001874 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001875 endwhile
1876
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001877" call Dret("NetrwListHide")
1878endfun
1879
1880" ---------------------------------------------------------------------
1881" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001882fun! s:NetHideEdit(mode)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001883" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001884
1885 call inputsave()
1886 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1887 call inputrestore()
1888
1889 " refresh the listing
1890 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001891 if a:mode == 0
1892 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1893 else
Bram Moolenaar572cb562005-08-05 21:35:02 +00001894 silent call s:LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001895 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001896
1897" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001898endfun
1899
Bram Moolenaar8299df92004-07-10 09:47:34 +00001900" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001901" NetSortSequence: allows user to edit the sorting sequence
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001902fun! s:NetSortSequence(mode)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001903" call Dfunc("NetSortSequence(mode=".a:mode.")")
1904
1905 call inputsave()
1906 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
1907 call inputrestore()
1908
1909 " refresh the listing
1910 let g:netrw_sort_sequence= newsortseq
1911 if a:mode == 0
1912 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1913 else
1914 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
1915 endif
1916
1917" call Dret("NetSortSequence")
1918endfun
1919
1920" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001921" NetLongList: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001922fun! s:NetLongList(mode)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001923" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".w:netrw_longlist)
1924 let fname = s:NetGetWord()
1925 let w:netrw_longlist = (w:netrw_longlist + 1) % 3
1926" call Decho("fname<".fname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001927
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001928 if w:netrw_longlist == 0
1929 " use one column listing
1930" call Decho("use one column list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001931 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1932
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001933 elseif w:netrw_longlist == 1
1934 " use long list
1935" call Decho("use long list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001936 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001937
1938 else
1939 " give wide list
1940" call Decho("use wide list")
1941 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001942 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001943 setlocal ma
Bram Moolenaar572cb562005-08-05 21:35:02 +00001944
1945 " clear buffer - this will cause NetBrowse/LocalBrowse to do a refresh
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001946 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00001947
1948 " refresh the listing
1949 if a:mode == 0
1950 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1951 else
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001952 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001953 endif
1954
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001955 " keep cursor on the filename
1956 silent keepjumps $
1957 if fname =~ '/$'
1958 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
1959 else
1960 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
1961 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001962
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001963" call Dret("NetLongList : w:netrw_longlist=".w:netrw_longlist)
1964endfun
1965
1966" ---------------------------------------------------------------------
1967" NetrwWideListing: {{{2
1968fun! s:NetrwWideListing()
1969" call Dfunc("NetrwWideListing()")
1970
1971 if w:netrw_longlist == 2
1972 " look for longest filename (cpf=characters per filename)
1973 " cpf: characters per file
1974 " fpl: files per line
1975 " fpc: files per column
1976 set ma
1977 let b:netrw_cpf= 0
1978 if line("$") >= w:netrw_bannercnt
1979 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
1980 else
1981" call Dret("NetrwWideListing")
1982 return
1983 endif
1984" call Decho("max file strlen+1=".b:netrw_cpf)
1985 let b:netrw_cpf= b:netrw_cpf + 1
1986
1987 " determine qty files per line (fpl)
1988 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
1989" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
1990
1991 " make wide display
1992 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=printf("%-'.b:netrw_cpf.'s",submatch(0))/'
1993 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
1994 let newcolstart = w:netrw_bannercnt + fpc
1995 let newcolend = newcolstart + fpc - 1
1996" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
1997 while line("$") >= newcolstart
1998 if newcolend > line("$") | let newcolend= line("$") | endif
1999 let newcolqty= newcolend - newcolstart
2000 exe newcolstart
2001 if newcolqty == 0
2002 exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
2003 else
2004 exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
2005 endif
2006 exe "silent keepjumps ".newcolstart.','.newcolend.'d'
2007 exe 'silent keepjumps '.w:netrw_bannercnt
2008 endwhile
2009 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
2010 set noma nomod
2011 endif
2012
2013" call Dret("NetrwWideListing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002014endfun
2015
2016" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002017" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002018" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
2019" the same word even though the sorting has changed its order of appearance.
2020fun! s:NetSaveWordPosn()
2021" call Dfunc("NetSaveWordPosn()")
2022 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
2023" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
2024endfun
2025
2026" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002027" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002028fun! s:NetRestoreWordPosn()
2029" call Dfunc("NetRestoreWordPosn()")
2030 silent! call search(s:netrw_saveword,'w')
2031" call Dret("NetRestoreWordPosn")
2032endfun
2033
2034" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002035" NetMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002036fun! s:NetMakeDir(usrhost)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002037" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
2038
2039 " get name of new directory from user. A bare <CR> will skip.
2040 " if its currently a directory, also request will be skipped, but with
2041 " a message.
2042 call inputsave()
2043 let newdirname= input("Please give directory name: ")
2044 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002045" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002046
2047 if newdirname == ""
2048" call Dret("NetMakeDir : user aborted with bare <cr>")
2049 return
2050 endif
2051
2052 if a:usrhost == ""
2053
2054 " Local mkdir:
2055 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002056 let fullnewdir= b:netrw_curdir.'/'.newdirname
2057" call Decho("fullnewdir<".fullnewdir.">")
2058 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002059 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002060 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a directory!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002061 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002062 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002063" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
2064 return
2065 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002066 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002067 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002068 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a file!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002069 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002070 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002071" call Dret("NetMakeDir : file<".newdirname."> exists previously")
2072 return
2073 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002074
2075 " requested new local directory is neither a pre-existing file or
2076 " directory, so make it!
2077 if exists("*mkdir")
2078 call mkdir(fullnewdir,"p")
2079 else
2080 let netrw_origdir= s:NetGetcwd(1)
2081 exe 'cd '.b:netrw_curdir
2082" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
2083" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
2084 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002085 if !g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002086 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002087
Bram Moolenaar8299df92004-07-10 09:47:34 +00002088 if v:shell_error == 0
2089 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002090" call Decho("refresh listing")
2091 let linenum= line(".")
2092 norm! H0
2093 let hline = line(".")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002094 set ma|norm! 2D
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002095 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
2096 exe "norm! ".hline."G0z\<CR>"
2097 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002098 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002099 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002100 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002101 endif
2102 redraw!
2103
2104 else
2105 " Remote mkdir:
2106 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002107 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002108" call Decho("exe silent! !".mkdircmd." ".newdirname)
2109 exe "silent! !".mkdircmd." ".newdirname
2110 if v:shell_error == 0
2111 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002112 let linenum= line(".")
2113 norm! H0
2114 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002115 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002116 exe "norm! ".hline."G0z\<CR>"
2117 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002118 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002119 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002120 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002121 endif
2122 redraw!
2123 endif
2124
2125" call Dret("NetMakeDir")
2126endfun
2127
2128" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002129" NetBookmarkDir: {{{2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002130" 0: (user: <b>) bookmark current directory
2131" 1: (user: <B>) change to the bookmarked directory
2132" 2: (user: <q>) list bookmarks
2133" 3: (LocalBrowse) record current directory history
2134" 4: (user: <u>) go up (previous) bookmark
2135" 5: (user: <U>) go down (next) bookmark
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002136fun! s:NetBookmarkDir(chg,curdir)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002137" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002138 if exists("w:netrw_bannercnt") && line(".") <= w:netrw_bannercnt
2139 " looks like a "b" was pressed while in the banner region
2140 if line("$") > w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002141 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00002142 endif
2143 echo ""
2144" call Dret("NetBookmarkDir - ignoring")
2145 return
2146 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002147
2148 if a:chg == 0
2149 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002150 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
2151 if !exists("g:NETRW_BOOKMARKMAX")
2152 let g:NETRW_BOOKMARKMAX= v:count
2153 elseif v:count > g:NETRW_BOOKMARKMAX
2154 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002155 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002156 echo "bookmarked the current directory"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002157
2158 elseif a:chg == 1
2159 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002160 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
2161 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002162 else
2163 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2164 endif
2165
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002166 elseif a:chg == 2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002167 " list user's bookmarks
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002168 if exists("g:NETRW_BOOKMARKMAX")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002169" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
2170 let cnt= 0
2171 while cnt <= g:NETRW_BOOKMARKMAX
2172 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
2173" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
2174 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
2175 endif
2176 let cnt= cnt + 1
2177 endwhile
2178 endif
2179
2180 " list directory history
2181 let cnt = g:NETRW_DIRHIST_CNT
2182 let first = 1
2183 let histcnt = 0
2184 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2185" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
2186 let histcnt= histcnt + 1
2187 if exists("g:NETRW_DIRHIST_{cnt}")
2188" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
2189 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002190 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002191 let first = 0
2192 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2193 if cnt < 0
2194 let cnt= cnt + g:netrw_dirhistmax
2195 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002196 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002197
2198 elseif a:chg == 3
Bram Moolenaar572cb562005-08-05 21:35:02 +00002199 " saves most recently visited directories (when they differ)
2200 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
2201 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2202 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
2203" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2204 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002205
2206 elseif a:chg == 4
2207 " u: change to the previous directory stored on the history list
2208 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2209 if g:NETRW_DIRHIST_CNT < 0
2210 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2211 endif
2212 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2213" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2214 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2215 else
2216 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2217 echo "Sorry, no predecessor directory exists yet"
2218 endif
2219
2220 elseif a:chg == 5
2221 " U: change to the subsequent directory stored on the history list
2222 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2223 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2224" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2225 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2226 else
2227 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2228 if g:NETRW_DIRHIST_CNT < 0
2229 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2230 endif
2231 echo "Sorry, no successor directory exists yet"
2232 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002233 endif
2234" call Dret("NetBookmarkDir")
2235endfun
2236
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002237" ---------------------------------------------------------------------
2238" NetObtain: obtain file under cursor (for remote browsing support) {{{2
2239fun! s:NetObtain()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002240 let fname= expand("<cWORD>")
Bram Moolenaarf75a9632005-09-13 21:20:47 +00002241
2242 " NetrwStatusLine support - for obtaining support
2243 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.fname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002244
2245" call Dfunc("NetObtain() method=".w:netrw_method)
2246 if exists("w:netrw_method") && w:netrw_method =~ '[235]'
2247 if executable("ftp")
2248 let curdir = expand("%")
2249 let path = substitute(curdir,'ftp://[^/]\+/','','e')
2250 let curline= line(".")
2251 let endline= line("$")+1
2252 set ma
2253 keepjumps $
2254
2255 ".........................................
2256 if w:netrw_method == 2
2257 " ftp + <.netrc>: Method #2
2258 if path != ""
2259 put ='cd '.path
2260" call Decho("ftp: cd ".path)
2261 endif
2262 put ='get '.fname
2263" call Decho("ftp: get ".fname)
2264 if exists("g:netrw_port") && g:netrw_port != ""
2265" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
2266 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
2267 else
2268" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
2269 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
2270 endif
2271
2272 ".........................................
2273 elseif w:netrw_method == 3
2274 " ftp + machine,id,passwd,filename: Method #3
2275 setlocal ff=unix
2276 if exists("g:netrw_port") && g:netrw_port != ""
2277 put ='open '.g:netrw_machine.' '.g:netrw_port
2278" call Decho('ftp: open '.g:netrw_machine.' '.g:netrw_port)
2279 else
2280 put ='open '.g:netrw_machine
2281" call Decho('ftp: open '.g:netrw_machine
2282 endif
2283
2284 if exists("g:netrw_ftp") && g:netrw_ftp == 1
2285 put =g:netrw_uid
2286 put =g:netrw_passwd
2287" call Decho('ftp: g:netrw_uid')
2288" call Decho('ftp: g:netrw_passwd')
2289 else
2290 put ='user '.g:netrw_uid.' '.g:netrw_passwd
2291" call Decho('user '.g:netrw_uid.' '.g:netrw_passwd)
2292 endif
2293
2294 if a:path != ""
2295 put ='cd '.a:path
2296" call Decho('cd '.a:path)
2297 endif
2298 exe "put ='".a:cmd."'"
2299" call Decho("ftp: ".a:cmd)
2300
2301 " perform ftp:
2302 " -i : turns off interactive prompting from ftp
2303 " -n unix : DON'T use <.netrc>, even though it exists
2304 " -n win32: quit being obnoxious about password
2305" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
2306 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i -n"
2307
2308 ".........................................
2309 else
2310 echo "***warning*** unable to comply with your request<" . choice . ">"
2311 endif
2312 " restore
2313 exe "silent! ".endline.",$d"
2314 exe "keepjumps ".curline
2315 set noma nomod
2316 else
2317 if !exists("g:netrw_quiet")
2318 echohl Error | echo "***netrw*** this system doesn't support ftp" | echohl None
2319 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2320 endif
Bram Moolenaarf75a9632005-09-13 21:20:47 +00002321 let &stl = s:netrw_users_stl
2322 let &laststatus = s:netrw_users_ls
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002323" call Dret("NetObtain")
2324 return
2325 endif
2326
2327 ".........................................
2328 else
2329 " scp: Method#4
2330 if exists("g:netrw_port") && g:netrw_port != ""
2331 let useport= " -P ".g:netrw_port
2332 else
2333 let useport= ""
2334 endif
2335 if g:netrw_cygwin == 1
2336 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
2337" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." .")
2338 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." ."
2339 else
2340" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." .")
2341 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." ."
2342 endif
2343 endif
2344
2345 " restore status line
Bram Moolenaarf75a9632005-09-13 21:20:47 +00002346 let &stl = s:netrw_users_stl
2347 let &laststatus = s:netrw_users_ls
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002348 redraw!
2349
2350" call Dret("NetObtain")
2351endfun
2352
Bram Moolenaar83bab712005-08-01 21:58:57 +00002353" ==========================================
2354" Local Directory Browsing Support: {{{1
2355" ==========================================
Bram Moolenaar8299df92004-07-10 09:47:34 +00002356
2357" ---------------------------------------------------------------------
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002358" LocalBrowse: {{{2
2359fun! s:LocalBrowse(dirname)
2360 " unfortunate interaction -- debugging calls can't be used here;
2361 " the BufEnter event causes triggering when attempts to write to
2362 " the DBG buffer are made.
2363 if isdirectory(a:dirname)
2364 call netrw#DirBrowse(a:dirname)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002365 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002366 " not a directory, ignore it
2367endfun
Bram Moolenaar8299df92004-07-10 09:47:34 +00002368
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002369" ---------------------------------------------------------------------
2370" DirBrowse: supports local file/directory browsing {{{2
2371fun! netrw#DirBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002372 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002373" call Dfunc("DirBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr()." sortby=".g:netrw_sort_by)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002374" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002375
Bram Moolenaar488c6512005-08-11 20:09:58 +00002376 if exists("s:netrw_skipbrowse")
2377 unlet s:netrw_skipbrowse
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002378" call Dret("DirBrowse")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002379 return
2380 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002381 call s:NetOptionSave()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002382
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002383 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002384 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002385 echohl Error | echo "***netrw*** vim version<".v:version."> too old for browsing with netrw" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002386 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002387 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002388 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002389" call Dret("DirBrowse : vim version<".v:version."> too old")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002390 return
2391 endif
2392
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002393 " use buffer-oriented WinVars if buffer ones exist but window ones don't
2394 call s:UseBufWinVars()
2395
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002396 " find buffer number of buffer named precisely the same as a:dirname
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002397 let bufnum= bufnr(escape(a:dirname,'\'))
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002398" call Decho("findbuf: bufnum=".bufnum)
2399 if bufnum > 0 && bufname(bufnum) != a:dirname
2400 let ibuf= 1
2401 let buflast= bufnr("$")
2402 while bufname(ibuf) !~ '^'.a:dirname.'\=$' && ibuf <= buflast
2403" call Decho("findbuf: ibuf=".ibuf. " bufname<".bufname(ibuf)."> dirname<".a:dirname.">")
2404 let ibuf= ibuf + 1
2405 endwhile
2406 if ibuf > buflast
2407 let bufnum= -1
2408 else
2409 let bufnum= ibuf
2410 endif
2411" call Decho("findbuf: bufnum=".bufnum." (final)")
2412 endif
2413
2414 " get cleared buffer
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002415 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002416 keepjumps keepalt enew!
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002417" call Decho("enew buffer")
2418 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002419 exe "keepalt b ".bufnum
Bram Moolenaar572cb562005-08-05 21:35:02 +00002420 if exists("s:last_sort_by") && g:netrw_sort_by == s:last_sort_by
2421 if getline(2) =~ '^" Directory Listing '
2422 if !g:netrw_keepdir
2423" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002424 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002425 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002426 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002427" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002428 return
2429 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002430 endif
2431 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002432 let s:last_sort_by= g:netrw_sort_by
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002433
2434 " get the new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002435 if has("win32") || has("win95") || has("win64") || has("win16")
2436 let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
2437 else
2438 let b:netrw_curdir= a:dirname
2439 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002440 if b:netrw_curdir =~ '[/\\]$'
2441 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2442 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002443 if b:netrw_curdir == ''
2444 " under unix, when the root directory is encountered, the result
2445 " from the preceding substitute is an empty string.
2446 let b:netrw_curdir= '/'
2447 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002448" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002449
Bram Moolenaar83bab712005-08-01 21:58:57 +00002450 " make netrw's idea of the current directory vim's if the user wishes
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002451 if !g:netrw_keepdir
Bram Moolenaar83bab712005-08-01 21:58:57 +00002452" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002453 try
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002454 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002455 catch /^Vim\%((\a\+)\)\=:E472/
2456 echohl Error | echo "***netrw*** unable to change directory to <".b:netrw_curdir."> (permissions?)" | echohl None
2457 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2458 if exists("w:netrw_prvdir")
2459 let b:netrw_curdir= w:netrw_prvdir
2460 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002461 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002462" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002463 return
2464 endif
2465 endtry
Bram Moolenaar83bab712005-08-01 21:58:57 +00002466 endif
2467
2468 " change the name of the buffer to reflect the b:netrw_curdir
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002469 exe 'silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002470
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002471 " make this buffer not-a-file, modifiable, not line-numbered, etc
2472 setlocal bh=hide bt=nofile nobl ma nonu
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002473 keepalt silent! %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002474
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002475 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002476 " Perform Directory Listing:
Bram Moolenaar8299df92004-07-10 09:47:34 +00002477
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002478 " save current directory on directory history list
Bram Moolenaar83bab712005-08-01 21:58:57 +00002479 call <SID>NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002480
Bram Moolenaar8299df92004-07-10 09:47:34 +00002481 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002482" call Decho("Setting up local browser maps")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002483 nnoremap <buffer> <silent> <cr> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002484 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 +00002485 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002486 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 Moolenaar578b49e2005-09-10 19:22:57 +00002487 if w:netrw_longlist != 2
2488 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2489 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2490 endif
2491 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2492 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002493 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2494 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2495 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002496 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002497 nnoremap <buffer> <silent> o :call <SID>NetSplit(2)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002498 nnoremap <buffer> <silent> O :call <SID>LocalObtain()<cr>
2499 nnoremap <buffer> <silent> p :call <SID>LocalPreview(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),1))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002500 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002501 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 +00002502 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>
2503 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002504 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2505 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002506 nnoremap <buffer> <silent> v :call <SID>NetSplit(3)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002507 nnoremap <buffer> <silent> x :call <SID>NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)"<cr>
2508 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002509 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
2510 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002511 exe 'nnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002512 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002513 exe 'nnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002514 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002515 exe 'nnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002516 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002517 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002518 nnoremap <buffer> ? :he netrw-dir<cr>
2519
2520 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002521" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002522 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002523 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002524 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002525 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar488c6512005-08-11 20:09:58 +00002526 let w:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002527
2528 let sortby= g:netrw_sort_by
2529 if g:netrw_sort_direction =~ "^r"
2530 let sortby= sortby." reversed"
2531 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002532
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002533 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002534 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002535" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002536 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002537 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002538 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar488c6512005-08-11 20:09:58 +00002539 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002540 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002541" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002542 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002543 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar488c6512005-08-11 20:09:58 +00002544 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002545 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002546
2547 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002548 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002549 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002550 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002551 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002552 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002553 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002554 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002555 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002556 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2557 keepjumps put ='\" ============================================================================'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002558 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002559
2560 " bannercnt should index the line just after the banner
Bram Moolenaar488c6512005-08-11 20:09:58 +00002561 let w:netrw_bannercnt= w:netrw_bannercnt + 1
2562" call Decho("bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002563
2564 " generate the requested directory listing
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002565 call s:LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002566
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002567 " set up syntax highlighting
2568 if has("syntax")
2569 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00002570 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002571 setlocal ft=
2572 endif
2573 endif
2574
Bram Moolenaar8299df92004-07-10 09:47:34 +00002575 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002576 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002577 if g:netrw_hide && g:netrw_list_hide != ""
2578 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002579 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002580 if line("$") >= w:netrw_bannercnt
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002581
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002582 if g:netrw_sort_by =~ "^n"
2583 call s:SetSort()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002584
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002585 if g:netrw_sort_direction =~ 'n'
2586 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002587 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002588 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002589 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002590 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002591
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002592 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002593 if g:netrw_sort_direction =~ 'n'
2594 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002595 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002596 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002597 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002598 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002599 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002600
Bram Moolenaar8299df92004-07-10 09:47:34 +00002601 endif
2602 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002603
2604 call s:NetrwWideListing()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002605 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002606 " place cursor on the top-left corner of the file listing
2607 exe 'silent '.w:netrw_bannercnt
2608 norm! 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00002609 endif
2610
2611 " record previous current directory
2612 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaar8299df92004-07-10 09:47:34 +00002613
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002614 " save certain window-oriented variables into buffer-oriented variables
Bram Moolenaarf75a9632005-09-13 21:20:47 +00002615 call s:SetBufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002616 call s:NetOptionRestore()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002617 setlocal noma nomod nonu bh=hide nobl
Bram Moolenaar8299df92004-07-10 09:47:34 +00002618
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002619" call Dret("DirBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002620endfun
2621
2622" ---------------------------------------------------------------------
2623" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002624fun! s:LocalBrowseList()
Bram Moolenaar83bab712005-08-01 21:58:57 +00002625" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002626
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002627 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00002628 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
2629 let dirnamelen = strlen(b:netrw_curdir)
2630 let filelist = glob(dirname."/*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002631" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002632 if filelist != ""
2633 let filelist= filelist."\n"
2634 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002635 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002636" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2637
2638 " if the directory name includes a "$", and possibly other characters,
2639 " the glob() doesn't include "." and ".." entries.
2640 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2641" call Decho("forcibly tacking on .")
2642 if filelist == ""
2643 let filelist= dirname."."
2644 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002645 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002646 endif
2647" call Decho("filelist<".filelist.">")
2648 endif
2649 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2650" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002651 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002652" call Decho("filelist<".filelist.">")
2653 endif
2654 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002655 let filelist= substitute(filelist,'\','/','ge')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002656
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002657" call Decho("dirname<".dirname.">")
2658" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002659" call Decho("filelist<".filelist.">")
2660
2661 while filelist != ""
2662 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002663 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002664 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2665 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002666 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002667 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00002668 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002669 let pfile= filename
2670 if isdirectory(filename)
2671 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002672 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002673 if pfile =~ '//$'
2674 let pfile= substitute(pfile,'//$','/','e')
2675 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002676 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002677 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaar83bab712005-08-01 21:58:57 +00002678" call Decho(" ")
2679" call Decho("filename<".filename.">")
2680" call Decho("pfile <".pfile.">")
2681
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002682 if w:netrw_longlist == 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002683 let sz = getfsize(filename)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002684 let fsz = strpart(" ",1,15-strlen(sz)).sz
2685 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaar83bab712005-08-01 21:58:57 +00002686" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002687 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002688
Bram Moolenaar8299df92004-07-10 09:47:34 +00002689 if g:netrw_sort_by =~ "^t"
2690 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002691" call Decho("getftime(".filename.")=".getftime(filename))
2692 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002693 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00002694" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002695 let ftpfile= ft.'/'.pfile
2696 keepjumps put=ftpfile
2697
Bram Moolenaar8299df92004-07-10 09:47:34 +00002698 elseif g:netrw_sort_by =~ "^s"
2699 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002700" call Decho("getfsize(".filename.")=".getfsize(filename))
2701 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002702 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00002703" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002704 let fszpfile= fsz.'/'.pfile
2705 keepjumps put =fszpfile
2706
Bram Moolenaar8299df92004-07-10 09:47:34 +00002707 else
2708 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002709" call Decho("exe keepjumps put ='".pfile."'")
2710 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002711 endif
2712 endwhile
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002713
2714 " cleanup any windows mess at end-of-line
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002715 silent! keepjumps %s/\r$//e
Bram Moolenaar83bab712005-08-01 21:58:57 +00002716 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00002717
2718" call Dret("LocalBrowseList")
2719endfun
2720
2721" ---------------------------------------------------------------------
2722" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2723" directory and a new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002724fun! s:LocalBrowseChgDir(dirname,newdir,...)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002725" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002726
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002727 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002728 let newdir = a:newdir
2729
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002730 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002731 " apparently vim is "recognizing" that it is in the home directory and
2732 " is removing the "/". Bad idea, so I have to put it back.
2733 let dirname= dirname.'/'
2734" call Decho("adjusting dirname<".dirname.">")
2735 endif
2736
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002737 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002738 " handling a file
2739 let dirname= dirname.newdir
2740" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002741 " this lets NetBrowseX avoid the edit
2742 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002743" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
2744" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
2745 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002746 set ma nomod
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002747 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002748
2749 elseif newdir == './'
2750 " refresh the directory list
2751" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002752
2753 elseif newdir == '../'
2754 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002755 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002756" call Decho("go up one dir: dirname<".dirname.">")
2757
2758 else
2759 " go down one directory
2760 let dirname= dirname.newdir
2761" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2762 endif
2763
2764" call Dret("LocalBrowseChgDir <".dirname.">")
2765 return dirname
2766endfun
2767
2768" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002769" LocalBrowseRm: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002770fun! s:LocalBrowseRm(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002771" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2772" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2773
2774 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002775 let ctr = a:firstline
2776 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002777 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002778
2779 " remove multiple files and directories
2780 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002781 exe "keepjumps ".ctr
2782
2783 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00002784 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002785 let ctr= ctr + 1
2786 continue
2787 endif
2788 let curword= s:NetGetWord()
2789 if curword == "./" || curword == "../"
2790 let ctr= ctr + 1
2791 continue
2792 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002793
2794 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00002795 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002796" call Decho("rmfile<".rmfile.">")
2797
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002798 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002799 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002800 if !all
2801 echohl Statement
2802 call inputsave()
2803 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2804 call inputrestore()
2805 echohl NONE
2806 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2807 if ok =~ 'a\%[ll]'
2808 let all= 1
2809 endif
2810 endif
2811
2812 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002813 let ret= delete(rmfile)
2814" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002815 elseif ok =~ 'q\%[uit]'
2816 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002817 endif
2818
2819 else
2820 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002821 if !all
2822 echohl Statement
2823 call inputsave()
2824 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2825 call inputrestore()
2826 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2827 if ok =~ 'a\%[ll]'
2828 let all= 1
2829 endif
2830 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002831 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002832
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002833 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002834" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2835 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002836" call Decho("v:shell_error=".v:shell_error)
2837
2838 if v:shell_error != 0
2839" call Decho("2nd attempt to remove directory<".rmfile.">")
2840 let errcode= delete(rmfile)
2841" call Decho("errcode=".errcode)
2842
2843 if errcode != 0
2844 if has("unix")
2845" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002846call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002847 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002848 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002849 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002850endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002851 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002852 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002853 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002854 endif
2855 endif
2856 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002857
2858 elseif ok =~ 'q\%[uit]'
2859 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002860 endif
2861 endif
2862
2863 let ctr= ctr + 1
2864 endwhile
2865
2866 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002867 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002868" call Decho("refresh the directory")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002869 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002870 exe curline
2871
2872" call Dret("LocalBrowseRm")
2873endfun
2874
2875" ---------------------------------------------------------------------
2876" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002877fun! s:LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002878" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2879
2880 " preparation for removing multiple files/directories
2881 let ctr= a:firstline
2882
2883 " attempt to rename files/directories
2884 while ctr <= a:lastline
2885 exe "keepjumps ".ctr
2886
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002887 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00002888 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002889 let ctr= ctr + 1
2890 continue
2891 endif
2892 let curword= s:NetGetWord()
2893 if curword == "./" || curword == "../"
2894 let ctr= ctr + 1
2895 continue
2896 endif
2897
Bram Moolenaar8299df92004-07-10 09:47:34 +00002898 norm! 0
Bram Moolenaar572cb562005-08-05 21:35:02 +00002899 let oldname= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002900" call Decho("oldname<".oldname.">")
2901
2902 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002903 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002904 call inputrestore()
2905
Bram Moolenaar83bab712005-08-01 21:58:57 +00002906 let ret= rename(oldname,newname)
2907" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002908
2909 let ctr= ctr + 1
2910 endwhile
2911
2912 " refresh the directory
2913 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002914" call Decho("refresh the directory listing")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002915 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002916 exe "keepjumps ".curline
2917" call Dret("LocalBrowseRename")
2918endfun
2919
2920" ---------------------------------------------------------------------
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002921" LocalObtain: copy selected file to current working directory {{{2
2922fun! s:LocalObtain()
2923" call Dfunc("LocalObtain()")
2924 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
2925 let fname= expand("<cWORD>")
2926 let fcopy= readfile(b:netrw_curdir."/".fname,"b")
2927 call writefile(fcopy,getcwd()."/".fname,"b")
2928 elseif !exists("b:netrw_curdir")
2929 echohl Error | echo "***netrw*** local browsing directory doesn't exist!"
2930 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2931 else
2932 echohl Error | echo "***netrw*** local browsing directory and current directory are identical"
2933 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2934 endif
2935" call Dret("LocalObtain")
2936endfun
2937
2938" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002939" LocalPreview: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002940fun! s:LocalPreview(path) range
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002941" call Dfunc("LocalPreview(path<".a:path.">)")
2942 if has("quickfix")
2943 if !isdirectory(a:path)
2944 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002945 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002946 echohl WarningMsg | echo "***netrw*** sorry, cannot preview a directory such as <".a:path.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002947 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002948 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002949 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002950 echohl WarningMsg | echo "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002951 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002952 endif
2953" call Dret("LocalPreview")
2954endfun
2955
2956" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002957" LocalRefresh: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002958fun! s:LocalRefresh(dirname)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002959" call Dfunc("LocalRefresh(dirname<".a:dirname.">)")
2960 set ma
2961 %d
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002962 call s:LocalBrowse(a:dirname)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002963 redraw!
2964" call Dret("LocalRefresh")
2965endfun
2966
2967" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002968" Explore: launch the local browser in the directory of the current file {{{2
2969" dosplit==0: the window will be split iff the current file has
2970" been modified
2971" dosplit==1: the window will be split before running the local
2972" browser
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002973fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002974" call Dfunc("Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.")")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002975
2976 " if dosplit or file has been modified
2977 if a:dosplit || &modified
Bram Moolenaar488c6512005-08-11 20:09:58 +00002978 call <SID>SaveWinVars()
2979
Bram Moolenaar83bab712005-08-01 21:58:57 +00002980 if a:style == 0 " Explore, Sexplore
2981 exe g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002982" call Decho("style=0: Explore or Sexplore")
2983
Bram Moolenaar83bab712005-08-01 21:58:57 +00002984 elseif a:style == 1 "Explore!, Sexplore!
2985 exe g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002986" call Decho("style=1: Explore! or Sexplore!")
2987
Bram Moolenaar83bab712005-08-01 21:58:57 +00002988 elseif a:style == 2 " Hexplore
2989 exe "bel ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002990" call Decho("style=2: Hexplore")
2991
Bram Moolenaar83bab712005-08-01 21:58:57 +00002992 elseif a:style == 3 " Hexplore!
2993 exe "abo ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002994" call Decho("style=3: Hexplore!")
2995
Bram Moolenaar83bab712005-08-01 21:58:57 +00002996 elseif a:style == 4 " Vexplore
2997 exe "lefta ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002998" call Decho("style=4: Vexplore")
2999
Bram Moolenaar83bab712005-08-01 21:58:57 +00003000 elseif a:style == 5 " Vexplore!
3001 exe "rightb ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003002" call Decho("style=5: Vexplore!")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003003 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003004 call s:CopyWinVars()
Bram Moolenaar83bab712005-08-01 21:58:57 +00003005 endif
3006 norm! 0
3007
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003008 if a:1 == "" && a:indx >= 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003009 " Explore Hexplore Vexplore Sexplore
3010 let newdir= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3011 if newdir =~ '^scp:' || newdir =~ '^ftp:'
3012" call Decho("calling NetBrowse(newdir<".newdir.">)")
3013 call s:NetBrowse(newdir)
3014 else
3015" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3016 call s:LocalBrowse(newdir)
3017 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003018
Bram Moolenaar572cb562005-08-05 21:35:02 +00003019 elseif a:1 =~ '\*\*/' || a:indx < 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003020 " Nexplore Pexplore -or- Explore **/...
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003021
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003022 if has("path_extra")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003023 if !exists("w:netrw_explore_indx")
3024 let w:netrw_explore_indx= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003025 endif
3026 let indx = a:indx
3027 if indx == -1
Bram Moolenaar488c6512005-08-11 20:09:58 +00003028 let indx= w:netrw_explore_indx + 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003029 elseif indx == -2
Bram Moolenaar488c6512005-08-11 20:09:58 +00003030 let indx= w:netrw_explore_indx - 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003031 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003032 let w:netrw_explore_indx = 0
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003033 if !exists("b:netrw_curdir")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003034 let b:netrw_curdir= getcwd()
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003035 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003036 let w:netrw_explore_list = split(expand(b:netrw_curdir."/".a:1),'\n')
3037 let w:netrw_explore_listlen = len(w:netrw_explore_list)
3038 if w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/'
Bram Moolenaar572cb562005-08-05 21:35:02 +00003039 echohl WarningMsg | echo "***netrw*** no files matched" | echohl None
3040 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3041" call Dret("Explore")
3042 return
3043 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003044 endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003045
Bram Moolenaarf75a9632005-09-13 21:20:47 +00003046 " NetrwStatusLine support - for exploring support
Bram Moolenaar488c6512005-08-11 20:09:58 +00003047 let w:netrw_explore_indx= indx
Bram Moolenaar488c6512005-08-11 20:09:58 +00003048" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003049
3050 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00003051 if indx >= w:netrw_explore_listlen || indx < 0
3052 let indx= (indx < 0)? 0 : ( w:netrw_explore_listlen - 1 )
Bram Moolenaar572cb562005-08-05 21:35:02 +00003053 echohl WarningMsg | echo "***netrw*** no more files match Explore pattern" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003054 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3055" call Dret("Explore")
3056 return
3057 endif
3058
Bram Moolenaar488c6512005-08-11 20:09:58 +00003059 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaarf75a9632005-09-13 21:20:47 +00003060" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003061 let newdir= substitute(dirfile,'/[^/]*$','','e')
3062" call Decho("newdir<".newdir.">")
Bram Moolenaarf75a9632005-09-13 21:20:47 +00003063
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003064" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3065 call s:LocalBrowse(newdir)
Bram Moolenaarf75a9632005-09-13 21:20:47 +00003066 if w:netrw_longlist == 0 || w:netrw_longlist == 1
3067 call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
3068 else
3069 call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
3070 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003071 let w:netrw_explore_mtchcnt = indx + 1
3072 let w:netrw_explore_bufnr = bufnr(".")
3073 let w:netrw_explore_line = line(".")
Bram Moolenaarf75a9632005-09-13 21:20:47 +00003074 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
Bram Moolenaar488c6512005-08-11 20:09:58 +00003075" 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 +00003076
3077 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003078 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003079 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 +00003080 endif
3081 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3082 endif
3083
Bram Moolenaar83bab712005-08-01 21:58:57 +00003084 else
3085 let newdir= a:1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003086" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3087 call s:LocalBrowse(newdir)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003088 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003089
3090" call Dret("Explore")
3091endfun
3092
3093" ---------------------------------------------------------------------
Bram Moolenaarf75a9632005-09-13 21:20:47 +00003094" SetupNetrwStatusLine: {{{2
3095fun! s:SetupNetrwStatusLine(statline)
3096" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
3097
3098 if !exists("s:netrw_setup_statline")
3099 let s:netrw_setup_statline= 1
3100" call Decho("do first-time status line setup")
3101
3102 if !exists("s:netrw_users_stl")
3103 let s:netrw_users_stl= &stl
3104 endif
3105 if !exists("s:netrw_users_ls")
3106 let s:netrw_users_ls= &laststatus
3107 endif
3108
3109 " set up User9 highlighting as needed
3110 let keepa= @a
3111 redir @a
3112 try
3113 hi User9
3114 catch /^Vim\%((\a\+)\)\=:E411/
3115 if &bg == "dark"
3116 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
3117 else
3118 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
3119 endif
3120 endtry
3121 redir END
3122 let @a= keepa
3123 endif
3124
3125 " set up status line (may use User9 highlighting)
3126 " insure that windows have a statusline
3127 " make sure statusline is displayed
3128 let &stl=a:statline
3129 set laststatus=2
3130" call Decho("stl=".&stl)
3131 redraw!
3132
3133" call Dret("SetupNetrwStatusLine : stl=".&stl)
3134endfun
3135
3136" ---------------------------------------------------------------------
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003137" NetrwStatusLine: {{{2
3138fun! NetrwStatusLine()
Bram Moolenaarf75a9632005-09-13 21:20:47 +00003139
3140 " vvv NetrwStatusLine() debugging vvv
3141" let g:stlmsg=""
3142" if !exists("w:netrw_explore_bufnr")
3143" let g:stlmsg="!X<explore_bufnr>"
3144" elseif w:netrw_explore_bufnr != bufnr(".")
3145" let g:stlmsg="explore_bufnr!=".bufnr(".")
3146" endif
3147" if !exists("w:netrw_explore_line")
3148" let g:stlmsg=" !X<explore_line>"
3149" elseif w:netrw_explore_line != line(".")
3150" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
3151" endif
3152" if !exists("w:netrw_explore_list")
3153" let g:stlmsg=" !X<explore_list>"
3154" endif
3155 " ^^^ NetrwStatusLine() debugging ^^^
3156
Bram Moolenaar488c6512005-08-11 20:09:58 +00003157 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 Moolenaar578b49e2005-09-10 19:22:57 +00003158 " restore user's status line
Bram Moolenaarf75a9632005-09-13 21:20:47 +00003159 let &stl = s:netrw_users_stl
3160 let &laststatus = s:netrw_users_ls
Bram Moolenaar488c6512005-08-11 20:09:58 +00003161 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
3162 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003163 return ""
3164 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003165 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003166 endif
3167endfun
3168
3169" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003170" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003171" Change backslashes to forward slashes, if any.
3172" If doesc is true, escape certain troublesome characters
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003173fun! s:NetGetcwd(doesc)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003174" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
3175 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003176 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003177 let curdir= curdir.'/'
3178 endif
3179 if a:doesc
3180 let curdir= escape(curdir,s:netrw_cd_escape)
3181 endif
3182" call Dret("NetGetcwd <".curdir.">")
3183 return curdir
3184endfun
3185
3186" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00003187" NetMethod: determine method of transfer {{{1
3188" method == 1: rcp
3189" 2: ftp + <.netrc>
3190" 3: ftp + machine, id, password, and [path]filename
3191" 4: scp
3192" 5: http (wget)
3193" 6: cadaver
3194" 7: rsync
3195" 8: fetch
3196" 9: sftp
3197fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003198" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003199
3200 " initialization
3201 let b:netrw_method = 0
3202 let g:netrw_machine = ""
3203 let b:netrw_fname = ""
3204 let g:netrw_port = ""
3205
3206 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003207 " mipf : a:machine a:id password filename Use ftp
3208 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003209 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003210 " rcpurm : rcp://[user@]host/filename Use rcp
3211 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003212 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003213 " httpurm : http://[user@]host/filename Use wget
3214 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003215 " rsyncurm : rsync://host[:port]/path Use rsync
3216 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
3217 " sftpurm : sftp://[user@]host/filename Use scp
3218 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
3219 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
3220 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00003221 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003222 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
3223 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
3224 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003225 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003226 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
3227 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
3228 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
3229
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003230" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003231 " Determine Method
3232 " rcp://user@hostname/...path-to-file
3233 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003234" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003235 let b:netrw_method = 1
3236 let userid = substitute(a:choice,rcpurm,'\1',"")
3237 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
3238 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003239 if userid != ""
3240 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00003241 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003242
3243 " scp://user@hostname/...path-to-file
3244 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003245" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003246 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00003247 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
3248 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
3249 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003250
3251 " http://user@hostname/...path-to-file
3252 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003253" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003254 let b:netrw_method = 5
3255 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
3256 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
3257
3258 " dav://hostname[:port]/..path-to-file..
3259 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003260" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003261 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003262 if a:choice =~ '^s'
3263 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
3264 else
3265 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
3266 endif
3267 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003268
3269 " rsync://user@hostname/...path-to-file
3270 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003271" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003272 let b:netrw_method = 7
3273 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
3274 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
3275
3276 " ftp://[user@]hostname[[:#]port]/...path-to-file
3277 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003278" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003279 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003280 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
3281 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
3282 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003283 if userid != ""
3284 let g:netrw_uid= userid
3285 endif
3286 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3287 let b:netrw_method = 3
3288 else
3289 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
3290 let b:netrw_method= 2
3291 else
3292 if !exists("g:netrw_uid") || g:netrw_uid == ""
3293 call NetUserPass()
3294 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
3295 call NetUserPass(g:netrw_uid)
3296 " else just use current g:netrw_uid and g:netrw_passwd
3297 endif
3298 let b:netrw_method= 3
3299 endif
3300 endif
3301
3302 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003303" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003304 let b:netrw_method = 8
3305 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
3306 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
3307 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
3308 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
3309
3310 " Issue an ftp : "machine id password [path/]filename"
3311 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003312" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003313 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003314 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
3315 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
3316 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
3317 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
3318
3319 " Issue an ftp: "hostname [path/]filename"
3320 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003321" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003322 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3323 let b:netrw_method = 3
3324 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3325 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3326
3327 elseif filereadable(expand("$HOME/.netrc"))
3328 let b:netrw_method = 2
3329 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3330 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3331 endif
3332
3333 " sftp://user@hostname/...path-to-file
3334 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003335" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003336 let b:netrw_method = 9
3337 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
3338 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
3339
3340 " Issue an rcp: hostname:filename" (this one should be last)
3341 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003342" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003343 let b:netrw_method = 1
3344 let userid = substitute(a:choice,rcphf,'\2',"")
3345 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
3346 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003347" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
3348" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
3349" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
3350" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003351 if userid != ""
3352 let g:netrw_uid= userid
3353 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003354 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003355 " don't let PCs try <.netrc>
3356 let b:netrw_method = 3
3357 endif
3358
3359 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003360 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003361 echohl Error | echo "***netrw*** cannot determine method" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003362 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003363 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003364 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003365 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00003366
3367 " remove any leading [:#] from port number
3368 if g:netrw_port != ""
3369 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
3370 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003371
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003372" call Decho("a:choice <".a:choice.">")
3373" call Decho("b:netrw_method <".b:netrw_method.">")
3374" call Decho("g:netrw_machine<".g:netrw_machine.">")
3375" call Decho("g:netrw_port <".g:netrw_port.">")
3376" if exists("g:netrw_uid") "Decho
3377" call Decho("g:netrw_uid <".g:netrw_uid.">")
3378" endif "Decho
3379" if exists("g:netrw_passwd") "Decho
3380" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
3381" endif "Decho
3382" call Decho("b:netrw_fname <".b:netrw_fname.">")
3383" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003384endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003385
3386" ------------------------------------------------------------------------
3387" NetUserPass: set username and password for subsequent ftp transfer {{{1
3388" Usage: :call NetUserPass() -- will prompt for userid and password
3389" :call NetUserPass("uid") -- will prompt for password
3390" :call NetUserPass("uid","password") -- sets global userid and password
3391fun! NetUserPass(...)
3392
3393 " get/set userid
3394 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003395" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003396 if !exists("g:netrw_uid") || g:netrw_uid == ""
3397 " via prompt
3398 let g:netrw_uid= input('Enter username: ')
3399 endif
3400 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003401" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003402 let g:netrw_uid= a:1
3403 endif
3404
3405 " get password
3406 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003407" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003408 let g:netrw_passwd= inputsecret("Enter Password: ")
3409 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003410" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003411 let g:netrw_passwd=a:2
3412 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003413
3414 " surround password with double-quotes if it contains embedded blanks
3415 if g:netrw_passwd !~ '^"' && g:netrw_passwd =~ ' '
3416 let g:netrw_passwd= '"'.g:netrw_passwd.'"'
3417 endif
3418
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003419" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003420endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003421
3422" ------------------------------------------------------------------------
3423" NetOptionSave: save options and set to "standard" form {{{1
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003424fun! s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003425" call Dfunc("NetOptionSave()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003426 if !exists("w:netoptionsave")
3427 let w:netoptionsave= 1
3428 else
3429" call Dret("NetOptionSave : netoptionsave=".w:netoptionsave)
3430 return
3431 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003432
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003433 " Get Temporary Filename
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003434 let w:aikeep = &ai
3435 " record autochdir setting and then insure its unset (tnx to David Fishburn)
3436 if has("netbeans_intg") || has("sun_workshop")
3437 let w:acdkeep = &autochdir
3438 set noautochdir
3439 endif
3440 let w:cinkeep = &cin
3441 let w:cinokeep = &cino
3442 let w:comkeep = &com
3443 let w:cpokeep = &cpo
3444 if !g:netrw_keepdir
3445 let w:dirkeep = getcwd()
3446 endif
3447 let w:gdkeep = &gd
3448 let w:repkeep = &report
3449 let w:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00003450 setlocal cino =
3451 setlocal com =
3452 setlocal cpo -=aA
3453 setlocal nocin noai
3454 setlocal tw =0
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003455 setlocal report=10000
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003456 if has("win32") && !has("win95")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003457 let w:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00003458 setlocal noswf
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003459" call Decho("setting w:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003460 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003461
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003462" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003463endfun
3464
3465" ------------------------------------------------------------------------
3466" NetOptionRestore: restore options {{{1
3467fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003468" call Dfunc("NetOptionRestore()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003469 if !exists("w:netoptionsave")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003470" call Dret("NetOptionRestore : w:netoptionsave doesn't exist")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003471 return
3472 endif
3473 unlet w:netoptionsave
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003474
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003475 if exists("w:aikeep")| let &ai= w:aikeep|endif
3476 if (has("netbeans_intg") || has("sun_workshop")) && exists("w:acdkeep")
3477 let &acd= w:acdkeep
3478 unlet w:acdkeep
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003479 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003480 if exists("w:cinkeep") |let &cin = w:cinkeep |unlet w:cinkeep |endif
3481 if exists("w:cinokeep")|let &cino = w:cinokeep|unlet w:cinokeep|endif
3482 if exists("w:comkeep") |let &com = w:comkeep |unlet w:comkeep |endif
3483 if exists("w:cpokeep") |let &cpo = w:cpokeep |unlet w:cpokeep |endif
3484 if exists("w:dirkeep") |exe "lcd ".w:dirkeep |unlet w:dirkeep |endif
3485 if exists("w:gdkeep") |let &gd = w:gdkeep |unlet w:gdkeep |endif
3486 if exists("w:repkeep") |let &report = w:repkeep |unlet w:repkeep |endif
3487 if exists("w:twkeep") |let &tw = w:twkeep |unlet w:twkeep |endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003488 if exists("w:swfkeep")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003489 if &directory == "" && exists("w:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003490 " user hasn't specified a swapfile directory;
3491 " netrw will temporarily make the swapfile
3492 " directory the current local one.
3493 let &directory = getcwd()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003494 silent! let &swf = w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003495 set directory=
3496 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003497 let &swf= w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003498 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003499 unlet w:swfkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003500 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003501
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003502" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003503endfun
3504
3505" ------------------------------------------------------------------------
3506" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003507" to handle extra junk that their system's ftp dumps
3508" into the transfer. This function is provided as an
3509" example and as a fix for a Windows 95 problem: in my
3510" experience, win95's ftp always dumped four blank lines
3511" at the end of the transfer.
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003512if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
Bram Moolenaar071d4272004-06-13 20:20:40 +00003513 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003514" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003515 if method == 3 " ftp (no <.netrc>)
3516 let fourblanklines= line2 - 3
3517 silent fourblanklines.",".line2."g/^\s*/d"
3518 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003519" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003520 endfun
3521endif
3522
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003523" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003524" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003525if v:version < 700
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003526 fun! s:NetSort() range
Bram Moolenaar83bab712005-08-01 21:58:57 +00003527" " call Dfunc("NetSort()")
3528
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003529 let i = a:firstline + 1
3530 while i <= a:lastline
3531 " find insertion point via binary search
3532 let i_val = getline(i)
3533 let lo = a:firstline
3534 let hi = i
3535 while lo < hi
Bram Moolenaar83bab712005-08-01 21:58:57 +00003536 let mid = (lo + hi) / 2
3537 let mid_val = getline(mid)
3538 if g:netrw_sort_direction =~ '^n'
3539 " normal sorting order
3540 if i_val < mid_val
3541 let hi = mid
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003542 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003543 let lo = mid + 1
3544 if i_val == mid_val | break | endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003545 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003546 else
3547 " reverse sorting order
3548 if i_val > mid_val
3549 let hi = mid
3550 else
3551 let lo = mid + 1
3552 if i_val == mid_val | break | endif
3553 endif
3554 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003555 endwhile
3556 " do insert
3557 if lo < i
Bram Moolenaar83bab712005-08-01 21:58:57 +00003558 exe 'keepjumps '.i.'d_'
3559 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003560 endif
3561 let i = i + 1
3562 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00003563
3564" " call Dret("NetSort")
3565 endfun
3566endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003567
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003568" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00003569" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
3570" What this function does is to compute a priority for the patterns
3571" in the g:netrw_sort_sequence. It applies a substitute to any
3572" "files" that satisfy each pattern, putting the priority / in
3573" front. An "*" pattern handles the default priority.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003574fun! s:SetSort()
Bram Moolenaar488c6512005-08-11 20:09:58 +00003575" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003576 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00003577 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
3578 else
3579 let seqlist = g:netrw_sort_sequence
3580 endif
3581 " sanity check -- insure that * appears somewhere
3582 if seqlist == ""
3583 let seqlist= '*'
3584 elseif seqlist !~ '\*'
3585 let seqlist= seqlist.',*'
3586 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003587 let priority = 1
3588 while seqlist != ""
3589 if seqlist =~ ','
3590 let seq = substitute(seqlist,',.*$','','e')
3591 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
3592 else
3593 let seq = seqlist
3594 let seqlist = ""
3595 endif
3596 let eseq= escape(seq,'/')
3597 if priority < 10
3598 let spriority= "00".priority.'\/'
3599 elseif priority < 100
3600 let spriority= "0".priority.'\/'
3601 else
3602 let spriority= priority.'\/'
3603 endif
3604" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
3605
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003606 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00003607 if w:netrw_bannercnt > line("$")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003608 " apparently no files were left after a Hiding pattern was used
3609" call Dret("SetSort : no files left after hiding")
3610 return
3611 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003612 if seq == '*'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003613 exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003614 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003615 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003616 endif
3617 let priority = priority + 1
3618 endwhile
3619
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003620 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003621
3622" call Dret("SetSort")
3623endfun
3624
Bram Moolenaar488c6512005-08-11 20:09:58 +00003625" ---------------------------------------------------------------------
3626" SaveWinVars: (used by Explore()) {{{1
3627fun! s:SaveWinVars()
3628" call Dfunc("SaveWinVars()")
3629 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
3630 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
3631 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
3632 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
3633 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
3634 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
3635 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
3636 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003637 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003638" call Dret("SaveWinVars")
3639endfun
3640
3641" ---------------------------------------------------------------------
3642" CopyWinVars: (used by Explore()) {{{1
3643fun! s:CopyWinVars()
3644" call Dfunc("CopyWinVars()")
3645 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
3646 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
3647 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
3648 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
3649 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
3650 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
3651 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
3652 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 +00003653 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 +00003654" call Dret("CopyWinVars")
3655endfun
3656
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003657" ---------------------------------------------------------------------
Bram Moolenaarf75a9632005-09-13 21:20:47 +00003658" SetBufWinVars: (used by NetBrowse() and LocalBrowse()) {{{1
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003659" To allow separate windows to have their own activities, such as
3660" Explore **/pattern, several variables have been made window-oriented.
3661" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaarf75a9632005-09-13 21:20:47 +00003662" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003663" UseBufWinVars() get around that.
Bram Moolenaarf75a9632005-09-13 21:20:47 +00003664fun! s:SetBufWinVars()
3665" call Dfunc("SetBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003666 if exists("w:netrw_longlist") |let b:netrw_longlist = w:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003667 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
3668 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
3669 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
3670 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
3671 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen = w:netrw_explore_listlen|endif
3672 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = w:netrw_explore_mtchcnt|endif
3673 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
3674 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
3675 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
Bram Moolenaarf75a9632005-09-13 21:20:47 +00003676" call Dret("SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003677endfun
3678
3679" ---------------------------------------------------------------------
3680" UseBufWinVars: (used by NetBrowse() and LocalBrowse() {{{1
3681" Matching function to BufferWinVars()
3682fun! s:UseBufWinVars()
3683" call Dfunc("UseBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003684 if exists("b:netrw_longlist") && !exists("w:netrw_longlist") |let w:netrw_longlist = b:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003685 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
3686 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
3687 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
3688 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
3689 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
3690 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
3691 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
3692 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
3693 if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif
3694" call Dret("UseBufWinVars")
3695endfun
3696
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003697" ------------------------------------------------------------------------
3698" Settings Restoration: {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003699let &cpo= s:keepcpo
3700unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003701
Bram Moolenaar071d4272004-06-13 20:20:40 +00003702" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00003703" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003704" vim:ts=8 fdm=marker