blob: 10dd28542d534ad694551668afa4bc063c9ac7c0 [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 Moolenaar1e015462005-09-25 22:16:38 +00003" Last Change: Aug 29, 2005
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00004" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00005" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
6" Copyright: Copyright (C) 1999-2005 Charles E. Campbell, Jr. {{{1
Bram Moolenaar572cb562005-08-05 21:35:02 +00007" Permission is hereby granted to use and distribute this code,
8" with or without modifications, provided that this copyright
9" notice is copied with it. Like anything else that's free,
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000010" netrw.vim is provided *as is* and comes with no warranty
11" of any kind, either expressed or implied. By using this
12" plugin, you agree that in no event will the copyright
13" holder be liable for any damages resulting from the use
14" of this software.
Bram Moolenaar071d4272004-06-13 20:20:40 +000015"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000016" But be doers of the Word, and not only hearers, deluding your own selves {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000017" (James 1:22 RSV)
18" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bram Moolenaar1e015462005-09-25 22:16:38 +000019let s:keepcpo= &cpo
20set cpo&vim
21" call Decho("doing autoload/netrw.vim")
Bram Moolenaar578b49e2005-09-10 19:22:57 +000022if v:version < 700
23 echohl WarningMsg | echo "***netrw*** you need vim version 7.0 or later for version ".g:loaded_netrw." of netrw" | echohl None
24 finish
25endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000026
27" ---------------------------------------------------------------------
28" Default values for global netrw variables {{{1
29if !exists("g:netrw_ftpmode")
30 let g:netrw_ftpmode= "binary"
31endif
32if !exists("g:netrw_win95ftp")
33 let g:netrw_win95ftp= 1
34endif
35if !exists("g:netrw_cygwin")
Bram Moolenaard4755bb2004-09-02 19:12:26 +000036 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000037 if &shell == "bash"
38 let g:netrw_cygwin= 1
39 else
40 let g:netrw_cygwin= 0
41 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000042 else
43 let g:netrw_cygwin= 0
44 endif
45endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000046if !exists("g:netrw_list_cmd")
47 if executable("ssh")
48 " provide a default listing command
49 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
50 else
Bram Moolenaar83bab712005-08-01 21:58:57 +000051" call Decho("ssh is not executable, can't do remote directory exploring with ssh")
Bram Moolenaar843ee412004-06-30 16:16:41 +000052 let g:netrw_list_cmd= ""
53 endif
54endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +000055if !exists("g:netrw_ftp_list_cmd")
56 if has("unix") || exists("g:netrw_cygwin")
57 let g:netrw_ftp_list_cmd= "ls -lF"
58 else
59 let g:netrw_ftp_list_cmd= "dir"
60 endif
61endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000062if !exists("g:netrw_rm_cmd")
63 let g:netrw_rm_cmd = "ssh HOSTNAME rm"
64endif
65if !exists("g:netrw_rmf_cmd")
66 let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
67endif
68if !exists("g:netrw_rmdir_cmd")
69 let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
70endif
71if !exists("g:netrw_rename_cmd")
72 let g:netrw_rename_cmd= "ssh HOSTNAME mv"
73endif
74if exists("g:netrw_silent") && g:netrw_silent != 0
75 let g:netrw_silentxfer= "silent "
76else
77 let g:netrw_silentxfer= ""
78endif
79if !exists("g:netrw_winsize")
80 let g:netrw_winsize= ""
81endif
82if !exists("g:netrw_list_hide")
83 let g:netrw_list_hide= ""
84endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000085if !exists("g:netrw_sort_by")
86 " alternatives: date size
87 let g:netrw_sort_by= "name"
88endif
89if !exists("g:netrw_sort_sequence")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000090 let g:netrw_sort_sequence= '[\/]$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000091endif
92if !exists("g:netrw_sort_direction")
93 " alternative: reverse (z y x ...)
94 let g:netrw_sort_direction= "normal"
95endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +000096if !exists("g:netrw_longlist")
Bram Moolenaar8299df92004-07-10 09:47:34 +000097 let g:netrw_longlist= 0
Bram Moolenaar578b49e2005-09-10 19:22:57 +000098endif
99if g:netrw_longlist == 0 || g:netrw_longlist == 2
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000100 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
Bram Moolenaar8299df92004-07-10 09:47:34 +0000101else
102 let g:netrw_longlist= 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000103 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -l"
104endif
105if !exists("g:netrw_list_cmd")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000106endif
107if !exists("g:netrw_timefmt")
108 let g:netrw_timefmt= "%c"
109endif
110if !exists("g:netrw_local_rmdir")
111 let g:netrw_local_rmdir= "rmdir"
112endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000113if !exists("g:netrw_local_mkdir")
114 let g:netrw_local_mkdir= "mkdir"
115endif
116if !exists("g:netrw_mkdir_cmd")
117 let g:netrw_mkdir_cmd= "ssh HOSTNAME mkdir"
118endif
Bram Moolenaar269ec652004-07-29 08:43:53 +0000119if !exists("g:netrw_hide")
120 let g:netrw_hide= 1
121endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000122if !exists("g:netrw_ftp_browse_reject")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000123 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 +0000124endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000125if !exists("g:netrw_ssh_browse_reject")
126 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
127endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000128if !exists("g:netrw_keepdir")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000129 let g:netrw_keepdir= 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000130endif
131if !exists("s:netrw_cd_escape")
132 if has("win32") || has("win95") || has("win64") || has("win16")
133 let s:netrw_cd_escape="#% "
134 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000135 let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000136 endif
137endif
138if !exists("s:netrw_glob_escape")
139 if has("win32") || has("win95") || has("win64") || has("win16")
140 let s:netrw_glob_escape= ""
141 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000142 let s:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000143 endif
144endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000145if !exists("g:netrw_alto")
146 let g:netrw_alto= 0
147endif
148if !exists("g:netrw_altv")
149 let g:netrw_altv= 0
150endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000151if !exists("g:netrw_maxfilenamelen")
152 let g:netrw_maxfilenamelen= 32
153endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000154if !exists("g:netrw_dirhistmax")
155 let g:netrw_dirhistmax= 10
156endif
157if !exists("g:NETRW_DIRHIST_CNT")
158 let g:NETRW_DIRHIST_CNT= 0
159endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000160
161" BufEnter event ignored by decho when following variable is true
162" Has a side effect that doau BufReadPost doesn't work, so
163" files read by network transfer aren't appropriately highlighted.
164"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000165
166" ---------------------------------------------------------------------
167" Default values for global protocol variables {{{1
168if !exists("g:netrw_rcp_cmd")
169 let g:netrw_rcp_cmd = "rcp"
170endif
171if !exists("g:netrw_ftp_cmd")
172 let g:netrw_ftp_cmd = "ftp"
173endif
174if !exists("g:netrw_scp_cmd")
175 let g:netrw_scp_cmd = "scp -q"
176endif
177if !exists("g:netrw_sftp_cmd")
178 let g:netrw_sftp_cmd = "sftp"
179endif
180if !exists("g:netrw_http_cmd")
181 if executable("wget")
182 let g:netrw_http_cmd = "wget -q -O"
183 elseif executable("fetch")
184 let g:netrw_http_cmd = "fetch -o"
185 else
186 let g:netrw_http_cmd = ""
187 endif
188endif
189if !exists("g:netrw_dav_cmd")
190 let g:netrw_dav_cmd = "cadaver"
191endif
192if !exists("g:netrw_rsync_cmd")
193 let g:netrw_rsync_cmd = "rsync"
194endif
195if !exists("g:netrw_fetch_cmd")
196 if executable("fetch")
197 let g:netrw_fetch_cmd = "fetch -o"
198 else
199 let g:netrw_fetch_cmd = ""
200 endif
201endif
202
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000203if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000204 \ && exists("g:netrw_use_nt_rcp")
205 \ && g:netrw_use_nt_rcp
206 \ && executable( $SystemRoot .'/system32/rcp.exe')
207 let s:netrw_has_nt_rcp = 1
208 let s:netrw_rcpmode = '-b'
209 else
210 let s:netrw_has_nt_rcp = 0
211 let s:netrw_rcpmode = ''
212endif
213
Bram Moolenaar071d4272004-06-13 20:20:40 +0000214" ------------------------------------------------------------------------
215" NetSavePosn: saves position of cursor on screen {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000216fun! netrw#NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000217" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000218 " Save current line and column
Bram Moolenaar488c6512005-08-11 20:09:58 +0000219 let w:netrw_winnr= winnr()
220 let w:netrw_line = line(".")
221 let w:netrw_col = virtcol(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000222
223 " Save top-of-screen line
224 norm! H0
Bram Moolenaar488c6512005-08-11 20:09:58 +0000225 let w:netrw_hline= line(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000226
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000227 call netrw#NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000228" 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 +0000229endfun
230
231" ------------------------------------------------------------------------
232" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000233fun! netrw#NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000234" 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 +0000235 let eikeep= &ei
236 set ei=all
Bram Moolenaar071d4272004-06-13 20:20:40 +0000237
Bram Moolenaar81695252004-12-29 20:58:21 +0000238 " restore window
Bram Moolenaar488c6512005-08-11 20:09:58 +0000239" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
240 exe "silent! ".w:netrw_winnr."wincmd w"
Bram Moolenaar572cb562005-08-05 21:35:02 +0000241" if v:shell_error == 0
242" " as suggested by Bram M: redraw on no error
243" " allows protocol error messages to remain visible
244" redraw!
245" endif
Bram Moolenaar81695252004-12-29 20:58:21 +0000246
Bram Moolenaar071d4272004-06-13 20:20:40 +0000247 " restore top-of-screen line
Bram Moolenaar488c6512005-08-11 20:09:58 +0000248" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
249 exe "norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaar81695252004-12-29 20:58:21 +0000250
Bram Moolenaar071d4272004-06-13 20:20:40 +0000251 " restore position
Bram Moolenaar488c6512005-08-11 20:09:58 +0000252" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
253 exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000254
Bram Moolenaar572cb562005-08-05 21:35:02 +0000255 let &ei= eikeep
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000256" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000257endfun
258
259" ------------------------------------------------------------------------
260" NetRead: responsible for reading a file over the net {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000261fun! netrw#NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000262" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000263
264 " save options
265 call s:NetOptionSave()
266
267 " Special Exception: if a file is named "0r", then
268 " "0r" will be used to read the
269 " following files instead of "r"
270 if a:0 == 0
271 let readcmd= "r"
272 let ichoice= 0
273 elseif a:1 == "0r"
274 let readcmd = "0r"
275 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000276 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000277 let readcmd = "r"
278 let ichoice = 1
279 endif
280
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000281 " get name of a temporary file and set up shell-quoting character
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000282 let tmpfile= tempname()
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000283 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000284 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000285 echohl Error | echo "***netrw*** your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000286 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
287" call Dret("NetRead")
288 return
289 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000290
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000291" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000292 while ichoice <= a:0
293
294 " attempt to repeat with previous host-file-etc
295 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000296" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000297 let choice = b:netrw_lastfile
298 let ichoice= ichoice + 1
299
300 else
301 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000302" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000303
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000304 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000305 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000306 echomsg 'NetRead Usage:'
307 echomsg ':Nread machine:path uses rcp'
308 echomsg ':Nread "machine path" uses ftp with <.netrc>'
309 echomsg ':Nread "machine id password path" uses ftp'
310 echomsg ':Nread dav://machine[:port]/path uses cadaver'
311 echomsg ':Nread fetch://machine/path uses fetch'
312 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
313 echomsg ':Nread http://[user@]machine/path uses http wget'
314 echomsg ':Nread rcp://[user@]machine/path uses rcp'
315 echomsg ':Nread rsync://machine[:port]/path uses rsync'
316 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
317 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000318 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000319
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000320 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000321 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000322" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000323 if match(choice,"\"$") != -1
324 " case "..."
325 let choice=strpart(choice,1,strlen(choice)-2)
326 else
327 " case "... ... ..."
328 let choice = strpart(choice,1,strlen(choice)-1)
329 let wholechoice = ""
330
331 while match(choice,"\"$") == -1
332 let wholechoice = wholechoice . " " . choice
333 let ichoice = ichoice + 1
334 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000335 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000336 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000337 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000338 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000339" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000340 return
341 endif
342 let choice= a:{ichoice}
343 endwhile
344 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
345 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000346 endif
347 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000348
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000349" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000350 let ichoice= ichoice + 1
351
352 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000353 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000354 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000355" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000356
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000357 exe 'lcd ' . fnamemodify(tmpfile,':h')
358 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000359 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000360
361 " Determine method of read (ftp, rcp, etc)
362 call s:NetMethod(choice)
363
Bram Moolenaar843ee412004-06-30 16:16:41 +0000364 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000365" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000366 if choice =~ "^.*[\/]$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000367 keepjumps call s:NetBrowse(choice)
368" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000369 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000370 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000371
372 " ============
373 " Perform Read
374 " ============
375
376 ".........................................
377 " rcp: NetRead Method #1
378 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000379" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000380 " ER: noting done with g:netrw_uid yet?
381 " ER: on Win2K" rcp machine[.user]:file tmpfile
382 " ER: if machine contains '.' adding .user is required (use $USERNAME)
383 " ER: the tmpfile is full path: rcp sees C:\... as host C
384 if s:netrw_has_nt_rcp == 1
385 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
386 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
387 else
388 " Any way needed it machine contains a '.'
389 let uid_machine = g:netrw_machine .'.'. $USERNAME
390 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000391 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000392 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
393 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
394 else
395 let uid_machine = g:netrw_machine
396 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000397 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000398" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000399 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
400 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
401 let b:netrw_lastfile = choice
402
403 ".........................................
404 " ftp + <.netrc>: NetRead Method #2
405 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000406" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000407 let netrw_fname= b:netrw_fname
408 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000409 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000410 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000411 exe "put ='"."get ".netrw_fname." ".tmpfile."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000412 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000413" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000414 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
415 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000416" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000417 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
418 endif
419 " 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 +0000420 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000421 let debugkeep= &debug
422 set debug=msg
Bram Moolenaar572cb562005-08-05 21:35:02 +0000423 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000424 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000425 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000426 endif
427 bd!
428 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
429 let b:netrw_lastfile = choice
430
431 ".........................................
432 " ftp + machine,id,passwd,filename: NetRead Method #3
433 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
434 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000435" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000436 let netrw_fname= b:netrw_fname
437 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000438 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000439 if exists("g:netrw_port") && g:netrw_port != ""
440 put ='open '.g:netrw_machine.' '.g:netrw_port
441 else
442 put ='open '.g:netrw_machine
443 endif
444
445 if exists("g:netrw_ftp") && g:netrw_ftp == 1
446 put =g:netrw_uid
447 put =g:netrw_passwd
448 else
449 put ='user '.g:netrw_uid.' '.g:netrw_passwd
450 endif
451
452 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
453 put =g:netrw_ftpmode
454 endif
455 put ='get '.netrw_fname.' '.tmpfile
456
457 " perform ftp:
458 " -i : turns off interactive prompting from ftp
459 " -n unix : DON'T use <.netrc>, even though it exists
460 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000461" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000462 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000463" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000464 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
465 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
466 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000467" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000468 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000469 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000470 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000471 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000472 endif
473 bd!
474 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
475 let b:netrw_lastfile = choice
476
477 ".........................................
478 " scp: NetRead Method #4
479 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000480" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000481 if exists("g:netrw_port") && g:netrw_port != ""
482 let useport= " -P ".g:netrw_port
483 else
484 let useport= ""
485 endif
486 if g:netrw_cygwin == 1
487 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000488" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000489 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
490 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000491" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000492 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
493 endif
494 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
495 let b:netrw_lastfile = choice
496
497 ".........................................
498 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000499" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000500 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000501 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000502 echohl Error | echo "***netrw*** neither wget nor fetch command is available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000503 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000504 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000505 exit
506 endif
507
508 if match(b:netrw_fname,"#") == -1
509 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000510" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000511 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
512 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
513
514 else
515 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
516 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
517 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000518" call Decho("netrw_html<".netrw_html.">")
519" call Decho("netrw_tag <".netrw_tag.">")
520" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000521 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
522 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000523" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000524 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
525 endif
526 let b:netrw_lastfile = choice
527
528 ".........................................
529 " cadaver: NetRead Method #6
530 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000531" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000532
533 " Construct execution string (four lines) which will be passed through filter
534 let netrw_fname= b:netrw_fname
535 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000536 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000537 if exists("g:netrw_port") && g:netrw_port != ""
538 put ='open '.g:netrw_machine.' '.g:netrw_port
539 else
540 put ='open '.g:netrw_machine
541 endif
542 put ='user '.g:netrw_uid.' '.g:netrw_passwd
543
544 if g:netrw_cygwin == 1
545 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
546 put ='get '.netrw_fname.' '.cygtmpfile
547 else
548 put ='get '.netrw_fname.' '.tmpfile
549 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000550 put ='quit'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000551
552 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000553 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000554" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000555 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
556 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000557 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000558 let b:netrw_lastfile = choice
559
560 ".........................................
561 " rsync: NetRead Method #7
562 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000563" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000564 if g:netrw_cygwin == 1
565 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000566" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000567 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
568 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000569" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000570 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
571 endif
572 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
573 let b:netrw_lastfile = choice
574
575 ".........................................
576 " fetch: NetRead Method #8
577 " fetch://[user@]host[:http]/path
578 elseif b:netrw_method == 8 " read with fetch
579 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000580 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000581 echohl Error | echo "***netrw*** fetch command not available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000582 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000583 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000584 exit
585 endif
586 if exists("g:netrw_option") && g:netrw_option == ":http"
587 let netrw_option= "http"
588 else
589 let netrw_option= "ftp"
590 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000591" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000592
593 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000594" 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 +0000595 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
596 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000597" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000598 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
599 endif
600
601 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
602 let b:netrw_lastfile = choice
603
604 ".........................................
605 " sftp: NetRead Method #9
606 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000607" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000608 if g:netrw_cygwin == 1
609 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000610" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
611" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000612 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
613 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000614" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000615 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
616 endif
617 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
618 let b:netrw_lastfile = choice
619
620 ".........................................
621 else " Complain
622 echo "***warning*** unable to comply with your request<" . choice . ">"
623 endif
624 endwhile
625
626 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000627" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000628 if exists("b:netrw_method")
629 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000630 unlet b:netrw_fname
631 endif
632 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000633
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000634" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000635endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000636
637" ------------------------------------------------------------------------
638" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
639fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000640" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000641
642 if exists("*NetReadFixup")
643 " for the use of NetReadFixup (not otherwise used internally)
644 let line2= line("$")
645 endif
646
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000647 " transform paths from / to \ for Windows (except for cygwin)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000648 if &term == "win32"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000649 if g:netrw_cygwin
650 let fname= a:fname
651" call Decho("(win32 && cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000652 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000653 let fname= substitute(a:fname,'/','\\\\','ge')
654" call Decho("(win32 && !cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000655 endif
656 else
657 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000658" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000659 endif
660
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000661 if a:readcmd[0] == '0'
Bram Moolenaar81695252004-12-29 20:58:21 +0000662 " get file into buffer
Bram Moolenaar83bab712005-08-01 21:58:57 +0000663
Bram Moolenaar81695252004-12-29 20:58:21 +0000664 " record remote filename
Bram Moolenaar83bab712005-08-01 21:58:57 +0000665 let rfile= bufname(".")
666" call Decho("remotefile<".rfile.">")
667" call Dredir("ls!","starting buffer list")
668
Bram Moolenaar81695252004-12-29 20:58:21 +0000669 " rename the current buffer to the temp file (ie. fname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000670 keepalt exe "file ".fname
Bram Moolenaar83bab712005-08-01 21:58:57 +0000671" call Dredir("ls!","after renaming current buffer to <".fname.">")
672
Bram Moolenaar81695252004-12-29 20:58:21 +0000673 " edit temporary file
674 e
Bram Moolenaar83bab712005-08-01 21:58:57 +0000675" call Dredir("ls!","after editing temporary file")
676
Bram Moolenaar81695252004-12-29 20:58:21 +0000677 " rename buffer back to remote filename
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000678 keepalt exe "file ".rfile
Bram Moolenaar83bab712005-08-01 21:58:57 +0000679" call Dredir("ls!","renaming buffer back to remote filename<".rfile.">")
Bram Moolenaar81695252004-12-29 20:58:21 +0000680 let line1 = 1
681 let line2 = line("$")
682
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000683 elseif filereadable(fname)
Bram Moolenaar81695252004-12-29 20:58:21 +0000684 " read file after current line
685 let curline = line(".")
686 let lastline= line("$")
687" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname."> line#".curline)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000688 exe a:readcmd." ".v:cmdarg." ".fname
Bram Moolenaar81695252004-12-29 20:58:21 +0000689 let line1 = curline + 1
690 let line2 = line("$") - lastline + 1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000691 else
Bram Moolenaar81695252004-12-29 20:58:21 +0000692 " not readable
693" call Dret("NetGetFile : fname<".fname."> not readable")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000694 return
695 endif
696
697 " User-provided (ie. optional) fix-it-up command
698 if exists("*NetReadFixup")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000699" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000700 call NetReadFixup(a:method, line1, line2)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000701" else " Decho
702" call Decho("NetReadFixup() not called, doesn't exist")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000703 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000704
705 " update the Buffers menu
706 if has("gui") && has("gui_running")
707 silent! emenu Buffers.Refresh\ menu
708 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000709
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000710" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000711
712 " insure that we have the right filetype and that its being displayed
713 filetype detect
714 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000715" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000716endfun
717
718" ------------------------------------------------------------------------
719" NetWrite: responsible for writing a file over the net {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000720fun! netrw#NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000721" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000722
723 " option handling
724 let mod= 0
725 call s:NetOptionSave()
726
727 " Get Temporary Filename
728 let tmpfile= tempname()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000729 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
730 echohl Error | echo "***netrw*** your ".substitute(tmpfile,'[^/]\+$','','e')." directory is missing!"
731 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
732" call Dret("NetRead")
733 return
734 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000735
736 if a:0 == 0
737 let ichoice = 0
738 else
739 let ichoice = 1
740 endif
741
742 " write (selected portion of) file to temporary
743 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
744
745 while ichoice <= a:0
746
747 " attempt to repeat with previous host-file-etc
748 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000749" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000750 let choice = b:netrw_lastfile
751 let ichoice= ichoice + 1
752 else
753 exe "let choice= a:" . ichoice
754
755 " Reconstruct Choice if choice starts with '"'
756 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000757 echomsg 'NetWrite Usage:"'
758 echomsg ':Nwrite machine:path uses rcp'
759 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
760 echomsg ':Nwrite "machine id password path" uses ftp'
761 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
762 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
763 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
764 echomsg ':Nwrite rcp://machine/path uses rcp'
765 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
766 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
767 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000768 break
769
770 elseif match(choice,"^\"") != -1
771 if match(choice,"\"$") != -1
772 " case "..."
773 let choice=strpart(choice,1,strlen(choice)-2)
774 else
775 " case "... ... ..."
776 let choice = strpart(choice,1,strlen(choice)-1)
777 let wholechoice = ""
778
779 while match(choice,"\"$") == -1
780 let wholechoice= wholechoice . " " . choice
781 let ichoice = ichoice + 1
782 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000783 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000784 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000785 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000786 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000787" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000788 return
789 endif
790 let choice= a:{ichoice}
791 endwhile
792 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
793 endif
794 endif
795 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000796" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000797 let ichoice= ichoice + 1
798
799 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000800 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000801 let choice= substitute(choice,'\\','/','ge')
802 "ER: see NetRead()
803 exe 'lcd ' . fnamemodify(tmpfile,':h')
804 let tmpfile = fnamemodify(tmpfile,':t')
805 endif
806
807 " Determine method of read (ftp, rcp, etc)
808 call s:NetMethod(choice)
809
810 " =============
811 " Perform Write
812 " =============
813
814 ".........................................
815 " rcp: NetWrite Method #1
816 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000817" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000818 if s:netrw_has_nt_rcp == 1
819 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
820 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
821 else
822 let uid_machine = g:netrw_machine .'.'. $USERNAME
823 endif
824 else
825 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
826 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
827 else
828 let uid_machine = g:netrw_machine
829 endif
830 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000831" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000832 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
833 let b:netrw_lastfile = choice
834
835 ".........................................
836 " ftp + <.netrc>: NetWrite Method #2
837 elseif b:netrw_method == 2 " write with ftp + <.netrc>
838 let netrw_fname = b:netrw_fname
839 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000840 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000841 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000842" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000843 exe "put ='"."put ".tmpfile." ".netrw_fname."'"
844" call Decho("put ='"."put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000845 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000846" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000847 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000848 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000849" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000850 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000851 endif
852 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
853 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000854 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000855 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000856 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000857 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000858 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000859 endif
860 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000861 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000862
863 ".........................................
864 " ftp + machine, id, passwd, filename: NetWrite Method #3
865 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
866 let netrw_fname= b:netrw_fname
867 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000868 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000869 if exists("g:netrw_port") && g:netrw_port != ""
870 put ='open '.g:netrw_machine.' '.g:netrw_port
871 else
872 put ='open '.g:netrw_machine
873 endif
874 if exists("g:netrw_ftp") && g:netrw_ftp == 1
875 put =g:netrw_uid
876 put =g:netrw_passwd
877 else
878 put ='user '.g:netrw_uid.' '.g:netrw_passwd
879 endif
880 put ='put '.tmpfile.' '.netrw_fname
881 " save choice/id/password for future use
882 let b:netrw_lastfile = choice
883
884 " perform ftp:
885 " -i : turns off interactive prompting from ftp
886 " -n unix : DON'T use <.netrc>, even though it exists
887 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000888" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000889 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000890" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000891 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
892 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
893 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000894 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000895 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000896 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000897 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000898 let mod=1
899 endif
900 bd!
901
902 ".........................................
903 " scp: NetWrite Method #4
904 elseif b:netrw_method == 4 " write with scp
905 if exists("g:netrw_port") && g:netrw_port != ""
906 let useport= " -P ".g:netrw_port
907 else
908 let useport= ""
909 endif
910 if g:netrw_cygwin == 1
911 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000912" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000913 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
914 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000915" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000916 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
917 endif
918 let b:netrw_lastfile = choice
919
920 ".........................................
921 " http: NetWrite Method #5
922 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000923 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000924 echohl Error | echo "***netrw*** currently <netrw.vim> does not support writing using http:" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000925 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000926 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000927
928 ".........................................
929 " dav: NetWrite Method #6
930 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000931" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000932
933 " Construct execution string (four lines) which will be passed through filter
934 let netrw_fname= b:netrw_fname
935 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000936 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000937 if exists("g:netrw_port") && g:netrw_port != ""
938 put ='open '.g:netrw_machine.' '.g:netrw_port
939 else
940 put ='open '.g:netrw_machine
941 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000942 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000943
944 if g:netrw_cygwin == 1
945 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
946 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000947 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000948 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000949 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000950
951 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000952 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000953" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000954 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
955 bd!
956 let b:netrw_lastfile = choice
957
958 ".........................................
959 " rsync: NetWrite Method #7
960 elseif b:netrw_method == 7 " write with rsync
961 if g:netrw_cygwin == 1
962 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000963" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000964 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000965 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000966" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000967 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000968 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000969 let b:netrw_lastfile = choice
970
971 ".........................................
972 " scp: NetWrite Method #9
973 elseif b:netrw_method == 9 " write with sftp
974 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000975 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
976 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
977 else
978 let uid_machine = g:netrw_machine
979 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000980 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000981 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000982 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000983 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000984" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000985 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
986 bd!
987 let b:netrw_lastfile= choice
988
989 ".........................................
990 else " Complain
991 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000992 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000993 endwhile
994
995 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000996" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000997 let result=delete(tmpfile)
998 call s:NetOptionRestore()
999
1000 if a:firstline == 1 && a:lastline == line("$")
1001 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001002 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001003
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001004" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001005endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001006
Bram Moolenaar83bab712005-08-01 21:58:57 +00001007" ===========================================
1008" Remote Directory Browsing Support: {{{1
1009" ===========================================
1010
Bram Moolenaar843ee412004-06-30 16:16:41 +00001011" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001012" of the contents of a remote directory. It is assumed that the
1013" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1014" with the requested remote hostname first.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001015fun! s:NetBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001016 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
1017" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".w:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001018
Bram Moolenaar488c6512005-08-11 20:09:58 +00001019 if exists("s:netrw_skipbrowse")
1020 unlet s:netrw_skipbrowse
1021" call Dret("NetBrowse")
1022 return
1023 endif
1024
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001025 call s:NetOptionSave()
1026
Bram Moolenaar843ee412004-06-30 16:16:41 +00001027 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001028 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1029" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001030 if !executable("ftp")
1031 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001032 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ftp" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001033 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001034 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001035 call s:NetOptionRestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001036" call Dret("NetBrowse")
1037 return
1038 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001039 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001040 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001041 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ssh" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001042 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001043 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001044
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001045 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001046" call Dret("NetBrowse")
1047 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001048 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001049
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001050 " use buffer-oriented WinVars if buffer ones exist but window ones don't
1051 call s:UseBufWinVars()
1052
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001053 " make this buffer modifiable
Bram Moolenaar83bab712005-08-01 21:58:57 +00001054 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001055
1056 " analyze a:dirname and g:netrw_list_cmd
1057 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001058 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001059" call Decho("dirpat<".dirpat.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001060 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001061 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001062 echohl Error | echo "***netrw*** netrw doesn't understand your dirname<".dirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001063 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001064 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001065 call s:NetOptionRestore()
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001066" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001067 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001068 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001069
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001070 let method = substitute(dirname,dirpat,'\1','')
1071 let user = substitute(dirname,dirpat,'\2','')
1072 let machine = substitute(dirname,dirpat,'\3','')
1073 let path = substitute(dirname,dirpat,'\4','')
1074 let fname = substitute(dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001075" call Decho("set up method <".method .">")
1076" call Decho("set up user <".user .">")
1077" call Decho("set up machine<".machine.">")
1078" call Decho("set up path <".path .">")
1079" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001080
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001081 if method == "ftp" || method == "http"
1082 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001083 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001084 else
1085 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1086 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001087
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001088 if exists("b:netrw_method")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001089" call Decho("setting w:netrw_method<".b:netrw_method.">")
1090 let w:netrw_method= b:netrw_method
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001091 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001092
Bram Moolenaar8299df92004-07-10 09:47:34 +00001093 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001094 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
Bram Moolenaar572cb562005-08-05 21:35:02 +00001095 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 +00001096 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001097 else
1098 if g:netrw_sort_by =~ "^t"
1099 let listcmd= listcmd."t"
1100 elseif g:netrw_sort_by =~ "^s"
1101 let listcmd= listcmd."S"
1102 endif
1103 " optionally sort in reverse
1104 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1105 let listcmd= listcmd."r"
1106 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001107 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001108
1109" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001110 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001111" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001112 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001113 redraw!
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001114 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001115" call Dret("NetBrowse : symlink")
1116 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001117
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001118 elseif fname !~ '[\/]$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001119 " looks like a regular file, attempt transfer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001120" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001121
1122 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001123 " "this is a directory" indicator (/). There shouldn't be one of those,
1124 " anyway.
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001125 let path= substitute(path,'[*=@|]\r\=$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001126" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001127
1128 " remote-read the requested file into current buffer
Bram Moolenaar1e015462005-09-25 22:16:38 +00001129 enew!
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001130 set ma
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001131" call Decho("exe file .method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001132 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001133 exe "silent doau BufReadPre ".fname
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001134 silent call netrw#NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001135 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001136 keepjumps 1d
Bram Moolenaar572cb562005-08-05 21:35:02 +00001137
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001138 " save certain window-oriented variables into buffer-oriented variables
Bram Moolenaar1e015462005-09-25 22:16:38 +00001139 call s:BufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001140 call s:NetOptionRestore()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001141 setlocal nomod
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001142
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001143" call Dret("NetBrowse : file<".fname.">")
1144 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001145 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001146
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001147 " ---------------------------------------------------------------------
1148 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001149" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001150 " set up new buffer and map
1151 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001152 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001153" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001154 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001155 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001156" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001157 exe "b ".bufnamenr
1158 if line("$") >= 5
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001159 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001160" call Dret("NetBrowse")
1161 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001162 endif
1163 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001164" call Decho("generate a new buffer")
Bram Moolenaar1e015462005-09-25 22:16:38 +00001165 enew!
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001166 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001167
1168 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001169 setlocal bt=nofile bh=wipe nobl noswf
1170 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001171" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001172 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001173" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001174 setlocal bh=hide bt=nofile nobl nonu
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001175
1176 " save current directory on directory history list
1177 call <SID>NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001178
1179 " set up buffer-local mappings
1180" call Decho("set up buffer-local mappings")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001181 nnoremap <buffer> <silent> <cr> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00001182 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001183 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001184 nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001185 if w:netrw_longlist != 2
1186 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1187 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1188 endif
1189 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1190 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001191 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1192 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001193 nnoremap <buffer> <silent> o :call <SID>NetSplit(0)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001194 nnoremap <buffer> <silent> O :call <SID>NetObtain()<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001195 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1196 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>
1197 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>
1198 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001199 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1200 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001201 nnoremap <buffer> <silent> v :call <SID>NetSplit(1)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001202 nnoremap <buffer> <silent> x :call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
Bram Moolenaar1e015462005-09-25 22:16:38 +00001203 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001204 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001205 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001206 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001207 exe 'nnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001208 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001209 exe 'nnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001210 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001211 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaar83bab712005-08-01 21:58:57 +00001212 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001213
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001214 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001215" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1216 keepjumps put ='\" ==========================================================================='
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001217 keepjumps put ='\" Netrw Remote Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001218 keepjumps put ='\" '.bufname
Bram Moolenaar488c6512005-08-11 20:09:58 +00001219 let w:netrw_bannercnt = 7
1220 let sortby = g:netrw_sort_by
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001221 if g:netrw_sort_direction =~ "^r"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001222 let sortby = sortby." reversed"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001223 endif
1224
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001225 if g:netrw_sort_by =~ "^n"
1226 " sorted by name
Bram Moolenaar488c6512005-08-11 20:09:58 +00001227 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001228 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001229 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1230 else
1231 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001232 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001233 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001234 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001235 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001236 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001237 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001238 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001239 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001240 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001241 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001242 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1243 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001244
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001245 " remote read the requested directory listing
1246 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1247 " Note that not all ftp servers honor the options for ls
1248 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001249 " use ftp to get remote file listing
1250" call Decho("use ftp to get remote file listing")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001251 call s:NetBrowseFtpCmd(path,listcmd)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001252 keepjumps 1d
1253
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001254 if w:netrw_longlist == 0 || w:netrw_longlist == 2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001255 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001256" call Decho("generate short listing")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001257 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001258
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001259 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001260 if g:netrw_ftp_browse_reject != ""
1261 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1262 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001263
1264 " if there's no ../ listed, then put ./ and ../ in
1265 let line1= line(".")
1266 keepjumps 1
1267 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1268 let line2= line(".")
1269 if line2 == 0
1270 keepjumps put='../'
1271 keepjumps put='./'
1272 endif
1273 exe "keepjumps ".line1
1274 keepjumps norm! 0
1275
1276 " more cleanup
Bram Moolenaar1e015462005-09-25 22:16:38 +00001277 exe 'keepjumps silent! '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1278 exe "keepjumps silent! ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
1279 exe "keepjumps silent! ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001280 endif
1281
1282 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001283 " use ssh to get remote file listing
1284" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001285 let shq= &shq? &shq : ( &sxq? &sxq : "'")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001286" call Decho("exe silent r! ".listcmd." '".shq.escape(path,s:netrw_cd_escape).shq."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001287 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1288 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001289 " cleanup
1290 if g:netrw_ftp_browse_reject != ""
1291 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001292 endif
1293 endif
1294
1295 " set up syntax highlighting
1296 if has("syntax")
1297 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00001298 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001299 setlocal ft=
Bram Moolenaar572cb562005-08-05 21:35:02 +00001300 " Ugly workaround -- when syntax highlighting is off and laststatus==2,
1301 " sometimes the laststatus highlight bleeds into the entire display.
1302 " Only seems to happen with remote browsing. Weird.
1303 redraw
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001304 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001305 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001306
1307 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001308 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001309 if g:netrw_hide && g:netrw_list_hide != ""
1310 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001311 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001312
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001313 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00001314 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001315" call Decho("manipulate long listing")
1316
1317 if method == "ftp"
1318 " cleanup
Bram Moolenaar488c6512005-08-11 20:09:58 +00001319 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001320 while getline(".") =~ g:netrw_ftp_browse_reject
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001321 keepjumps d
1322 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001323 " if there's no ../ listed, then put ./ and ../ in
1324 let line1= line(".")
1325 keepjumps 1
1326 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1327 let line2= line(".")
1328 if line2 == 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00001329 exe 'keepjumps '.w:netrw_bannercnt."put='./'"
1330 exe 'keepjumps '.w:netrw_bannercnt."put='../'"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001331 endif
1332 exe "keepjumps ".line1
1333 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001334 endif
1335
Bram Moolenaar1e015462005-09-25 22:16:38 +00001336 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/ -> .*$//e'
1337 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1338 exe w:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001339 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001340
Bram Moolenaar488c6512005-08-11 20:09:58 +00001341 if line("$") >= w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001342 if g:netrw_sort_by =~ "^n"
1343 call s:SetSort()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001344 if g:netrw_sort_direction =~ 'n'
Bram Moolenaar1e015462005-09-25 22:16:38 +00001345 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001346 else
Bram Moolenaar1e015462005-09-25 22:16:38 +00001347 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001348 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +00001349 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001350 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001351 if w:netrw_longlist == 1
1352 " shorten the list to keep its width <= winwidth characters
Bram Moolenaar1e015462005-09-25 22:16:38 +00001353 exe "keepjumps silent ".w:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001354 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001355 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001356 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001357
Bram Moolenaar1e015462005-09-25 22:16:38 +00001358 " cleanup any windows mess at end-of-line
1359 keepjumps silent! %s/\r$//e
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001360 call s:NetrwWideListing()
1361 if line("$") >= w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001362 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001363 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001364
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001365 call s:NetOptionRestore()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001366 setlocal nomod noma nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001367
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001368" call Dret("NetBrowse")
1369 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001370endfun
1371
1372" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001373" NetBrowseChgDir: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001374fun! s:NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001375" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001376
1377 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001378 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001379
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001380 if newdir !~ '[\/]$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001381 " handling a file
1382 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001383" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001384
1385 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001386 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001387" call Decho("refresh directory listing")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001388 setlocal ma nobl bh=hide
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001389 %d
1390
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001391 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001392 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001393 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001394
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001395 if trailer =~ '^\%(\.\./\)*$'
1396 " tack on a ../"
1397 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001398
1399 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001400 " strip off a directory name from dirname
1401 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001402 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001403" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001404
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001405 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001406 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001407 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001408" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001409 endif
1410
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001411" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001412 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001413endfun
1414
Bram Moolenaar843ee412004-06-30 16:16:41 +00001415" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001416" NetGetWord: it gets the directory named under the cursor
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001417fun! s:NetGetWord()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001418" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001419 call s:UseBufWinVars()
1420
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001421 " insure that w:netrw_longlist is set up
1422 if !exists("w:netrw_longlist")
1423 if exists("g:netrw_longlist")
1424 let w:netrw_longlist= g:netrw_longlist
1425 else
1426 let w:netrw_longlist= 0
1427 endif
1428 endif
1429
Bram Moolenaar488c6512005-08-11 20:09:58 +00001430 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001431 " Active Banner support
1432" call Decho("active banner handling")
1433 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001434 let dirname= "./"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001435 let curline= getline(".")
1436 if curline =~ '"\s*Sorted by\s'
1437 norm s
1438 let s:netrw_skipbrowse= 1
1439 echo 'Pressing "s" also works'
1440 elseif curline =~ '"\s*Sort sequence:'
1441 let s:netrw_skipbrowse= 1
1442 echo 'Press "S" to edit sorting sequence'
1443 elseif curline =~ '"\s*Quick Help:'
1444 norm ?
1445 let s:netrw_skipbrowse= 1
1446 echo 'Pressing "?" also works'
1447 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
1448 norm a
1449 let s:netrw_skipbrowse= 1
1450 echo 'Pressing "a" also works'
1451 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar1e015462005-09-25 22:16:38 +00001452 exe w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00001453 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001454
1455 elseif w:netrw_longlist == 0
1456" call Decho("thin column handling")
1457 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001458 let dirname= getline(".")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001459
1460 elseif w:netrw_longlist == 1
1461" call Decho("long column handling")
1462 norm! 0
1463 let dirname= substitute(getline("."),'^\(\%(\S\+\s\)*\S\+\).\{-}$','\1','e')
1464
1465 else
1466" call Decho("obtain word from wide listing")
1467 let dirname= getline(".")
1468
1469 if !exists("b:netrw_cpf")
1470 let b:netrw_cpf= 0
1471 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
1472" call Decho("computed cpf")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001473 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001474
1475 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
1476" call Decho("virtcol=".virtcol(".")." cpf=".b:netrw_cpf." bannercnt=".w:netrw_bannercnt." filestart=".filestart)
1477" call Decho("1: dirname<".dirname.">")
1478 if filestart > 0|let dirname= substitute(dirname,'^.\{'.filestart.'}','','')|endif
1479" call Decho("2: dirname<".dirname.">")
1480 let dirname = substitute(dirname,'^\(.\{'.b:netrw_cpf.'}\).*$','\1','e')
1481" call Decho("3: dirname<".dirname.">")
1482 let dirname = substitute(dirname,'\s\+$','','e')
1483" call Decho("4: dirname<".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001484 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001485
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001486" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001487 return dirname
1488endfun
1489
1490" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001491" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001492fun! s:NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001493" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1494" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001495
1496 " preparation for removing multiple files/directories
1497 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001498 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001499
1500 " remove multiple files and directories
1501 while ctr <= a:lastline
1502 exe ctr
1503
1504 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001505 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001506" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001507
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001508 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001509 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001510 if !all
1511 echohl Statement
1512 call inputsave()
1513 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1514 call inputrestore()
1515 echohl NONE
1516 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1517 if ok =~ 'a\%[ll]'
1518 let all= 1
1519 endif
1520 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001521
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001522 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001523 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001524 silent! keepjumps .,$d
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001525 call s:NetBrowseFtpCmd(a:path,"delete ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001526 else
1527 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1528" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1529 let ret= system(netrw_rm_cmd)
1530" call Decho("returned=".ret." errcode=".v:shell_error)
1531 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001532 elseif ok =~ 'q\%[uit]'
1533 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001534 endif
1535
1536 else
1537 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001538 if !all
1539 call inputsave()
1540 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1541 call inputrestore()
1542 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1543 if ok =~ 'a\%[ll]'
1544 let all= 1
1545 endif
1546 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001547
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001548 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001549 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001550 call s:NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001551 else
1552 let rmfile = a:path.rmfile
1553 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1554" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1555 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001556" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001557
1558 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001559 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001560" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1561 let ret= system(netrw_rmf_cmd)
1562" call Decho("returned=".ret." errcode=".v:shell_error)
1563
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001564 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001565 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001566 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001567 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001568 endif
1569 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001570
1571 elseif ok =~ 'q\%[uit]'
1572 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001573 endif
1574 endif
1575
1576 let ctr= ctr + 1
1577 endwhile
1578
1579 " refresh the directory
1580 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001581" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001582 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1583 exe curline
1584
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001585" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001586endfun
1587
1588" ---------------------------------------------------------------------
1589" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001590fun! s:NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001591" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001592
1593 " preparation for removing multiple files/directories
1594 let ctr = a:firstline
1595 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1596
1597 " attempt to rename files/directories
1598 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001599 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001600
1601 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001602 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001603" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001604
1605 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001606 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001607 call inputrestore()
1608
Bram Moolenaar488c6512005-08-11 20:09:58 +00001609 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001610 call s:NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001611 else
1612 let oldname= a:path.oldname
1613 let newname= a:path.newname
1614" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1615 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1616 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001617
1618 let ctr= ctr + 1
1619 endwhile
1620
1621 " refresh the directory
1622 let curline= line(".")
1623 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001624 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001625" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001626endfun
1627
1628" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00001629" NetRefresh: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001630fun! s:NetRefresh(dirname)
Bram Moolenaar572cb562005-08-05 21:35:02 +00001631" call Dfunc("NetRefresh(dirname<".a:dirname.">)")
1632 set ma
1633 %d
1634 call <SID>NetBrowse(dirname)
1635 redraw!
1636" call Dret("NetRefresh")
1637endfun
1638
1639" ---------------------------------------------------------------------
Bram Moolenaar488c6512005-08-11 20:09:58 +00001640" NetSplit: mode {{{2
1641" =0 : net and o
1642" =1 : net and v
1643" =2 : local and o
1644" =3 : local and v
1645fun! s:NetSplit(mode)
1646" call Dfunc("NetSplit(mode=".a:mode.")")
1647
1648 call s:SaveWinVars()
1649 if a:mode == 0
1650 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1651 call s:CopyWinVars()
1652 exe "norm! 0"
1653 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
1654 elseif a:mode ==1
1655 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1656 call s:CopyWinVars()
1657 exe "norm! 0"
1658 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
1659 elseif a:mode ==2
1660 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1661 call s:CopyWinVars()
1662 exe "norm! 0"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001663 call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001664 else
1665 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1666 call s:CopyWinVars()
1667 exe "norm! 0"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001668 call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001669 endif
1670
1671" call Dret("NetSplit")
1672endfun
1673
1674" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001675" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001676" files given their extension. Passes 0=local, 1=remote
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001677fun! s:NetBrowseX(fname,remote)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001678" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001679
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001680 " set up the filename
1681 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001682 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001683 if has("win32") || has("win95") || has("win64") || has("win16")
1684 let exten= substitute(exten,'^.*$','\L&\E','')
1685 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001686 let fname= escape(a:fname,"%#")
1687" call Decho("fname<".fname."> after escape()")
1688
1689 if a:remote == 1
1690 " create a local copy
1691 let fname= tempname().".".exten
1692" call Decho("create a local copy of <".a:fname."> as <".fname.">")
Bram Moolenaar1e015462005-09-25 22:16:38 +00001693 exe "keepjumps silent bot 1new ".a:fname
Bram Moolenaar572cb562005-08-05 21:35:02 +00001694 set bh=delete
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001695 exe "w! ".fname
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001696 q
1697 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001698" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001699
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001700 " set up redirection
1701 if &srr =~ "%s"
1702 let redir= substitute(&srr,"%s","/dev/null"."")
1703 else
1704 let redir= &srr . "/dev/null"
1705 endif
1706" call Decho("redir:".redir.":")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001707
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001708 " execute the file handler
1709 if has("win32") || has("win64")
1710" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1711 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1712 let ret= v:shell_error
1713
1714 elseif has("unix") && executable("kfmclient")
1715" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1716 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1717 let ret= v:shell_error
1718
1719 elseif has("unix") && executable("gnome-open")
1720" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1721 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1722 let ret= v:shell_error
1723
1724 elseif exten != "" && exists("*NetrwFileHandler_".exten)
1725" call Decho("let ret= NetrwFileHandler_".exten.'("'.fname.'")')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001726 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001727 endif
1728 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001729
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001730 " cleanup: remove temporary file,
1731 " delete current buffer if success with handler,
1732 " return to prior buffer (directory listing)
1733 if a:remote == 1 && fname != a:fname
1734" call Decho("deleting temporary file<".fname.">")
1735 call delete(fname)
1736 endif
1737
1738 if a:remote == 1
Bram Moolenaar572cb562005-08-05 21:35:02 +00001739 set bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001740 exe "norm! \<c-o>"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001741 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001742 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001743
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001744" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001745endfun
1746
1747" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001748" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1749" This function assumes that a long listing will be received. Size, time,
1750" and reverse sorts will be requested of the server but not otherwise
1751" enforced here.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001752fun! s:NetBrowseFtpCmd(path,cmd)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001753" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".w:netrw_method)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001754
1755 " because WinXX ftp uses unix style input
1756 " curline is one more than the bannercnt in order to account
1757 " for the unwanted first blank line (doing a :put to an empty
1758 " buffer yields a blank first line)
1759 let ffkeep= &ff
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001760 setlocal ma ff=unix
Bram Moolenaar488c6512005-08-11 20:09:58 +00001761 let curline= w:netrw_bannercnt+1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001762 exe "silent! keepjumps ".curline.",$d"
1763
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001764 ".........................................
1765 if w:netrw_method == 2 || w:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001766 " ftp + <.netrc>: Method #2
1767 if a:path != ""
1768 put ='cd '.a:path
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001769" call Decho("ftp: cd ".a:path)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001770 endif
1771 exe "put ='".a:cmd."'"
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001772" call Decho("ftp: ".a:cmd)
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001773" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001774 if exists("g:netrw_port") && g:netrw_port != ""
1775" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1776 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1777 else
1778" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1779 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1780 endif
1781
1782 ".........................................
Bram Moolenaar488c6512005-08-11 20:09:58 +00001783 elseif w:netrw_method == 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001784 " ftp + machine,id,passwd,filename: Method #3
1785 setlocal ff=unix
1786 if exists("g:netrw_port") && g:netrw_port != ""
1787 put ='open '.g:netrw_machine.' '.g:netrw_port
1788 else
1789 put ='open '.g:netrw_machine
1790 endif
1791
1792 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1793 put =g:netrw_uid
1794 put =g:netrw_passwd
1795 else
1796 put ='user '.g:netrw_uid.' '.g:netrw_passwd
1797 endif
1798
1799 if a:path != ""
1800 put ='cd '.a:path
1801 endif
1802 exe "put ='".a:cmd."'"
1803
1804 " perform ftp:
1805 " -i : turns off interactive prompting from ftp
1806 " -n unix : DON'T use <.netrc>, even though it exists
1807 " -n win32: quit being obnoxious about password
1808" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1809 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1810
1811 ".........................................
1812 else
1813 echo "***warning*** unable to comply with your request<" . choice . ">"
1814 endif
1815
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001816 " cleanup for Windows
1817 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar1e015462005-09-25 22:16:38 +00001818 keepjumps silent!! %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001819 endif
1820 if a:cmd == "dir"
1821 " infer directory/link based on the file permission string
Bram Moolenaar1e015462005-09-25 22:16:38 +00001822 keepjumps silent! g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1823 keepjumps silent! g/l\%([-r][-w][-x]\)\{3}/s/$/@/
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001824 if w:netrw_longlist == 0 || w:netrw_longlist == 2
Bram Moolenaar1e015462005-09-25 22:16:38 +00001825 exe "keepjumps silent! ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001826 endif
1827 endif
1828
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001829 " ftp's ls doesn't seem to include ./ or ../
1830 if !search('^\.\/$','wn')
1831 exe 'keepjumps '.curline
1832 if a:path !~ '^$'
1833 put ='../'
1834 endif
1835 put ='./'
1836 exe 'keepjumps '.curline
1837 endif
1838
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001839 " restore settings
1840 let &ff= ffkeep
1841" call Dret("NetBrowseFtpCmd")
1842endfun
1843
1844" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001845" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1846" separated patterns given in g:netrw_list_hide
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001847fun! s:NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001848" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001849
1850 let listhide= g:netrw_list_hide
1851 while listhide != ""
1852 if listhide =~ ','
1853 let hide = substitute(listhide,',.*$','','e')
1854 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1855 else
1856 let hide = listhide
1857 let listhide= ""
1858 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001859
1860 " Prune the list by hiding any files which match
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001861" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001862 if g:netrw_hide == 1
Bram Moolenaar1e015462005-09-25 22:16:38 +00001863 exe 'keepjumps silent '.w:netrw_bannercnt.',$g~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001864 elseif g:netrw_hide == 2
Bram Moolenaar1e015462005-09-25 22:16:38 +00001865 exe 'keepjumps silent '.w:netrw_bannercnt.',$v~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001866 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001867 endwhile
1868
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001869" call Dret("NetrwListHide")
1870endfun
1871
1872" ---------------------------------------------------------------------
1873" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001874fun! s:NetHideEdit(mode)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001875" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001876
1877 call inputsave()
1878 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1879 call inputrestore()
1880
1881 " refresh the listing
1882 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001883 if a:mode == 0
1884 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1885 else
Bram Moolenaar572cb562005-08-05 21:35:02 +00001886 silent call s:LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001887 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001888
1889" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001890endfun
1891
Bram Moolenaar8299df92004-07-10 09:47:34 +00001892" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001893" NetSortSequence: allows user to edit the sorting sequence
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001894fun! s:NetSortSequence(mode)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001895" call Dfunc("NetSortSequence(mode=".a:mode.")")
1896
1897 call inputsave()
1898 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
1899 call inputrestore()
1900
1901 " refresh the listing
1902 let g:netrw_sort_sequence= newsortseq
1903 if a:mode == 0
1904 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1905 else
1906 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
1907 endif
1908
1909" call Dret("NetSortSequence")
1910endfun
1911
1912" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001913" NetLongList: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001914fun! s:NetLongList(mode)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001915" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".w:netrw_longlist)
1916 let fname = s:NetGetWord()
1917 let w:netrw_longlist = (w:netrw_longlist + 1) % 3
1918" call Decho("fname<".fname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001919
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001920 if w:netrw_longlist == 0
1921 " use one column listing
1922" call Decho("use one column list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001923 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1924
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001925 elseif w:netrw_longlist == 1
1926 " use long list
1927" call Decho("use long list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001928 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001929
1930 else
1931 " give wide list
1932" call Decho("use wide list")
1933 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001934 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001935 setlocal ma
Bram Moolenaar572cb562005-08-05 21:35:02 +00001936
1937 " clear buffer - this will cause NetBrowse/LocalBrowse to do a refresh
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001938 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00001939
1940 " refresh the listing
1941 if a:mode == 0
1942 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1943 else
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001944 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001945 endif
1946
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001947 " keep cursor on the filename
1948 silent keepjumps $
1949 if fname =~ '/$'
1950 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
1951 else
1952 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
1953 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001954
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001955" call Dret("NetLongList : w:netrw_longlist=".w:netrw_longlist)
1956endfun
1957
1958" ---------------------------------------------------------------------
1959" NetrwWideListing: {{{2
1960fun! s:NetrwWideListing()
1961" call Dfunc("NetrwWideListing()")
1962
1963 if w:netrw_longlist == 2
1964 " look for longest filename (cpf=characters per filename)
1965 " cpf: characters per file
1966 " fpl: files per line
1967 " fpc: files per column
1968 set ma
1969 let b:netrw_cpf= 0
1970 if line("$") >= w:netrw_bannercnt
1971 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
1972 else
1973" call Dret("NetrwWideListing")
1974 return
1975 endif
1976" call Decho("max file strlen+1=".b:netrw_cpf)
1977 let b:netrw_cpf= b:netrw_cpf + 1
1978
1979 " determine qty files per line (fpl)
1980 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
1981" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
1982
1983 " make wide display
1984 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=printf("%-'.b:netrw_cpf.'s",submatch(0))/'
1985 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
1986 let newcolstart = w:netrw_bannercnt + fpc
1987 let newcolend = newcolstart + fpc - 1
1988" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
1989 while line("$") >= newcolstart
1990 if newcolend > line("$") | let newcolend= line("$") | endif
1991 let newcolqty= newcolend - newcolstart
1992 exe newcolstart
1993 if newcolqty == 0
1994 exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
1995 else
1996 exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
1997 endif
1998 exe "silent keepjumps ".newcolstart.','.newcolend.'d'
Bram Moolenaar1e015462005-09-25 22:16:38 +00001999 exe w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002000 endwhile
2001 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
2002 set noma nomod
2003 endif
2004
2005" call Dret("NetrwWideListing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002006endfun
2007
2008" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002009" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002010" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
2011" the same word even though the sorting has changed its order of appearance.
2012fun! s:NetSaveWordPosn()
2013" call Dfunc("NetSaveWordPosn()")
2014 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
2015" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
2016endfun
2017
2018" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002019" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002020fun! s:NetRestoreWordPosn()
2021" call Dfunc("NetRestoreWordPosn()")
2022 silent! call search(s:netrw_saveword,'w')
2023" call Dret("NetRestoreWordPosn")
2024endfun
2025
2026" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002027" NetMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002028fun! s:NetMakeDir(usrhost)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002029" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
2030
2031 " get name of new directory from user. A bare <CR> will skip.
2032 " if its currently a directory, also request will be skipped, but with
2033 " a message.
2034 call inputsave()
2035 let newdirname= input("Please give directory name: ")
2036 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002037" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002038
2039 if newdirname == ""
2040" call Dret("NetMakeDir : user aborted with bare <cr>")
2041 return
2042 endif
2043
2044 if a:usrhost == ""
2045
2046 " Local mkdir:
2047 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002048 let fullnewdir= b:netrw_curdir.'/'.newdirname
2049" call Decho("fullnewdir<".fullnewdir.">")
2050 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002051 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002052 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a directory!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002053 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002054 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002055" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
2056 return
2057 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002058 if filereadable(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 file!" | 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 : file<".newdirname."> exists previously")
2064 return
2065 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002066
2067 " requested new local directory is neither a pre-existing file or
2068 " directory, so make it!
2069 if exists("*mkdir")
2070 call mkdir(fullnewdir,"p")
2071 else
2072 let netrw_origdir= s:NetGetcwd(1)
2073 exe 'cd '.b:netrw_curdir
2074" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
2075" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
2076 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002077 if !g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002078 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002079
Bram Moolenaar8299df92004-07-10 09:47:34 +00002080 if v:shell_error == 0
2081 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002082" call Decho("refresh listing")
2083 let linenum= line(".")
2084 norm! H0
2085 let hline = line(".")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002086 set ma|norm! 2D
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002087 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
2088 exe "norm! ".hline."G0z\<CR>"
2089 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002090 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002091 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002092 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002093 endif
2094 redraw!
2095
2096 else
2097 " Remote mkdir:
2098 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002099 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002100" call Decho("exe silent! !".mkdircmd." ".newdirname)
2101 exe "silent! !".mkdircmd." ".newdirname
2102 if v:shell_error == 0
2103 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002104 let linenum= line(".")
2105 norm! H0
2106 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002107 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002108 exe "norm! ".hline."G0z\<CR>"
2109 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002110 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002111 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002112 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002113 endif
2114 redraw!
2115 endif
2116
2117" call Dret("NetMakeDir")
2118endfun
2119
2120" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002121" NetBookmarkDir: {{{2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002122" 0: (user: <b>) bookmark current directory
2123" 1: (user: <B>) change to the bookmarked directory
2124" 2: (user: <q>) list bookmarks
2125" 3: (LocalBrowse) record current directory history
2126" 4: (user: <u>) go up (previous) bookmark
2127" 5: (user: <U>) go down (next) bookmark
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002128fun! s:NetBookmarkDir(chg,curdir)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002129" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002130 if exists("w:netrw_bannercnt") && line(".") <= w:netrw_bannercnt
2131 " looks like a "b" was pressed while in the banner region
2132 if line("$") > w:netrw_bannercnt
Bram Moolenaar1e015462005-09-25 22:16:38 +00002133 exe w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00002134 endif
2135 echo ""
2136" call Dret("NetBookmarkDir - ignoring")
2137 return
2138 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002139
2140 if a:chg == 0
2141 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002142 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
2143 if !exists("g:NETRW_BOOKMARKMAX")
2144 let g:NETRW_BOOKMARKMAX= v:count
2145 elseif v:count > g:NETRW_BOOKMARKMAX
2146 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002147 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002148 echo "bookmarked the current directory"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002149
2150 elseif a:chg == 1
2151 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002152 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
2153 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002154 else
2155 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2156 endif
2157
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002158 elseif a:chg == 2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002159 " list user's bookmarks
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002160 if exists("g:NETRW_BOOKMARKMAX")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002161" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
2162 let cnt= 0
2163 while cnt <= g:NETRW_BOOKMARKMAX
2164 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
2165" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
2166 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
2167 endif
2168 let cnt= cnt + 1
2169 endwhile
2170 endif
2171
2172 " list directory history
2173 let cnt = g:NETRW_DIRHIST_CNT
2174 let first = 1
2175 let histcnt = 0
2176 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2177" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
2178 let histcnt= histcnt + 1
2179 if exists("g:NETRW_DIRHIST_{cnt}")
2180" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
2181 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002182 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002183 let first = 0
2184 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2185 if cnt < 0
2186 let cnt= cnt + g:netrw_dirhistmax
2187 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002188 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002189
2190 elseif a:chg == 3
Bram Moolenaar572cb562005-08-05 21:35:02 +00002191 " saves most recently visited directories (when they differ)
2192 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
2193 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2194 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
2195" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2196 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002197
2198 elseif a:chg == 4
2199 " u: change to the previous directory stored on the history list
2200 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2201 if g:NETRW_DIRHIST_CNT < 0
2202 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2203 endif
2204 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2205" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2206 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2207 else
2208 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2209 echo "Sorry, no predecessor directory exists yet"
2210 endif
2211
2212 elseif a:chg == 5
2213 " U: change to the subsequent directory stored on the history list
2214 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2215 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2216" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2217 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2218 else
2219 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2220 if g:NETRW_DIRHIST_CNT < 0
2221 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2222 endif
2223 echo "Sorry, no successor directory exists yet"
2224 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002225 endif
2226" call Dret("NetBookmarkDir")
2227endfun
2228
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002229" ---------------------------------------------------------------------
2230" NetObtain: obtain file under cursor (for remote browsing support) {{{2
2231fun! s:NetObtain()
Bram Moolenaar1e015462005-09-25 22:16:38 +00002232 if !exists("s:netrw_users_stl")
2233 let s:netrw_users_stl= &stl
2234 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002235 let fname= expand("<cWORD>")
Bram Moolenaar1e015462005-09-25 22:16:38 +00002236 exe 'set stl=%f\ %h%m%r%=Obtaining\ '.escape(fname,' ')
2237 redraw!
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002238
2239" call Dfunc("NetObtain() method=".w:netrw_method)
2240 if exists("w:netrw_method") && w:netrw_method =~ '[235]'
2241 if executable("ftp")
2242 let curdir = expand("%")
2243 let path = substitute(curdir,'ftp://[^/]\+/','','e')
2244 let curline= line(".")
2245 let endline= line("$")+1
2246 set ma
2247 keepjumps $
2248
2249 ".........................................
2250 if w:netrw_method == 2
2251 " ftp + <.netrc>: Method #2
2252 if path != ""
2253 put ='cd '.path
2254" call Decho("ftp: cd ".path)
2255 endif
2256 put ='get '.fname
2257" call Decho("ftp: get ".fname)
2258 if exists("g:netrw_port") && g:netrw_port != ""
2259" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
2260 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
2261 else
2262" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
2263 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
2264 endif
2265
2266 ".........................................
2267 elseif w:netrw_method == 3
2268 " ftp + machine,id,passwd,filename: Method #3
2269 setlocal ff=unix
2270 if exists("g:netrw_port") && g:netrw_port != ""
2271 put ='open '.g:netrw_machine.' '.g:netrw_port
2272" call Decho('ftp: open '.g:netrw_machine.' '.g:netrw_port)
2273 else
2274 put ='open '.g:netrw_machine
2275" call Decho('ftp: open '.g:netrw_machine
2276 endif
2277
2278 if exists("g:netrw_ftp") && g:netrw_ftp == 1
2279 put =g:netrw_uid
2280 put =g:netrw_passwd
2281" call Decho('ftp: g:netrw_uid')
2282" call Decho('ftp: g:netrw_passwd')
2283 else
2284 put ='user '.g:netrw_uid.' '.g:netrw_passwd
2285" call Decho('user '.g:netrw_uid.' '.g:netrw_passwd)
2286 endif
2287
2288 if a:path != ""
2289 put ='cd '.a:path
2290" call Decho('cd '.a:path)
2291 endif
2292 exe "put ='".a:cmd."'"
2293" call Decho("ftp: ".a:cmd)
2294
2295 " perform ftp:
2296 " -i : turns off interactive prompting from ftp
2297 " -n unix : DON'T use <.netrc>, even though it exists
2298 " -n win32: quit being obnoxious about password
2299" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
2300 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i -n"
2301
2302 ".........................................
2303 else
2304 echo "***warning*** unable to comply with your request<" . choice . ">"
2305 endif
2306 " restore
2307 exe "silent! ".endline.",$d"
2308 exe "keepjumps ".curline
2309 set noma nomod
2310 else
2311 if !exists("g:netrw_quiet")
2312 echohl Error | echo "***netrw*** this system doesn't support ftp" | echohl None
2313 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2314 endif
2315" call Dret("NetObtain")
2316 return
2317 endif
2318
2319 ".........................................
2320 else
2321 " scp: Method#4
2322 if exists("g:netrw_port") && g:netrw_port != ""
2323 let useport= " -P ".g:netrw_port
2324 else
2325 let useport= ""
2326 endif
2327 if g:netrw_cygwin == 1
2328 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
2329" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." .")
2330 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." ."
2331 else
2332" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." .")
2333 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." ."
2334 endif
2335 endif
2336
2337 " restore status line
Bram Moolenaar1e015462005-09-25 22:16:38 +00002338 let &stl= s:netrw_users_stl
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002339 redraw!
2340
2341" call Dret("NetObtain")
2342endfun
2343
Bram Moolenaar83bab712005-08-01 21:58:57 +00002344" ==========================================
2345" Local Directory Browsing Support: {{{1
2346" ==========================================
Bram Moolenaar8299df92004-07-10 09:47:34 +00002347
2348" ---------------------------------------------------------------------
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002349" LocalBrowse: {{{2
2350fun! s:LocalBrowse(dirname)
2351 " unfortunate interaction -- debugging calls can't be used here;
2352 " the BufEnter event causes triggering when attempts to write to
2353 " the DBG buffer are made.
2354 if isdirectory(a:dirname)
2355 call netrw#DirBrowse(a:dirname)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002356 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002357 " not a directory, ignore it
2358endfun
Bram Moolenaar8299df92004-07-10 09:47:34 +00002359
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002360" ---------------------------------------------------------------------
2361" DirBrowse: supports local file/directory browsing {{{2
2362fun! netrw#DirBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002363 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002364" call Dfunc("DirBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr()." sortby=".g:netrw_sort_by)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002365" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002366
Bram Moolenaar488c6512005-08-11 20:09:58 +00002367 if exists("s:netrw_skipbrowse")
2368 unlet s:netrw_skipbrowse
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002369" call Dret("DirBrowse")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002370 return
2371 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002372 call s:NetOptionSave()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002373
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002374 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002375 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002376 echohl Error | echo "***netrw*** vim version<".v:version."> too old for browsing with netrw" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002377 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002378 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002379 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002380" call Dret("DirBrowse : vim version<".v:version."> too old")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002381 return
2382 endif
2383
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002384 " use buffer-oriented WinVars if buffer ones exist but window ones don't
2385 call s:UseBufWinVars()
2386
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002387 " find buffer number of buffer named precisely the same as a:dirname
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002388 let bufnum= bufnr(escape(a:dirname,'\'))
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002389" call Decho("findbuf: bufnum=".bufnum)
2390 if bufnum > 0 && bufname(bufnum) != a:dirname
2391 let ibuf= 1
2392 let buflast= bufnr("$")
2393 while bufname(ibuf) !~ '^'.a:dirname.'\=$' && ibuf <= buflast
2394" call Decho("findbuf: ibuf=".ibuf. " bufname<".bufname(ibuf)."> dirname<".a:dirname.">")
2395 let ibuf= ibuf + 1
2396 endwhile
2397 if ibuf > buflast
2398 let bufnum= -1
2399 else
2400 let bufnum= ibuf
2401 endif
2402" call Decho("findbuf: bufnum=".bufnum." (final)")
2403 endif
2404
2405 " get cleared buffer
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002406 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaar1e015462005-09-25 22:16:38 +00002407 keepalt enew!
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002408" call Decho("enew buffer")
2409 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002410 exe "keepalt b ".bufnum
Bram Moolenaar572cb562005-08-05 21:35:02 +00002411 if exists("s:last_sort_by") && g:netrw_sort_by == s:last_sort_by
2412 if getline(2) =~ '^" Directory Listing '
2413 if !g:netrw_keepdir
2414" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002415 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002416 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002417 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002418" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002419 return
2420 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002421 endif
2422 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002423 let s:last_sort_by= g:netrw_sort_by
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002424
2425 " get the new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002426 if has("win32") || has("win95") || has("win64") || has("win16")
2427 let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
2428 else
2429 let b:netrw_curdir= a:dirname
2430 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002431 if b:netrw_curdir =~ '[/\\]$'
2432 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2433 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002434 if b:netrw_curdir == ''
2435 " under unix, when the root directory is encountered, the result
2436 " from the preceding substitute is an empty string.
2437 let b:netrw_curdir= '/'
2438 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002439" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002440
Bram Moolenaar83bab712005-08-01 21:58:57 +00002441 " make netrw's idea of the current directory vim's if the user wishes
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002442 if !g:netrw_keepdir
Bram Moolenaar83bab712005-08-01 21:58:57 +00002443" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002444 try
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002445 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002446 catch /^Vim\%((\a\+)\)\=:E472/
2447 echohl Error | echo "***netrw*** unable to change directory to <".b:netrw_curdir."> (permissions?)" | echohl None
2448 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2449 if exists("w:netrw_prvdir")
2450 let b:netrw_curdir= w:netrw_prvdir
2451 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002452 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002453" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002454 return
2455 endif
2456 endtry
Bram Moolenaar83bab712005-08-01 21:58:57 +00002457 endif
2458
2459 " change the name of the buffer to reflect the b:netrw_curdir
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002460 exe 'silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002461
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002462 " make this buffer not-a-file, modifiable, not line-numbered, etc
2463 setlocal bh=hide bt=nofile nobl ma nonu
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002464 keepalt silent! %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002465
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002466 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002467 " Perform Directory Listing:
Bram Moolenaar8299df92004-07-10 09:47:34 +00002468
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002469 " save current directory on directory history list
Bram Moolenaar83bab712005-08-01 21:58:57 +00002470 call <SID>NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002471
Bram Moolenaar8299df92004-07-10 09:47:34 +00002472 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002473" call Decho("Setting up local browser maps")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002474 nnoremap <buffer> <silent> <cr> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002475 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 +00002476 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002477 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 +00002478 if w:netrw_longlist != 2
2479 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2480 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2481 endif
2482 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2483 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002484 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2485 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2486 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002487 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002488 nnoremap <buffer> <silent> o :call <SID>NetSplit(2)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002489 nnoremap <buffer> <silent> O :call <SID>LocalObtain()<cr>
2490 nnoremap <buffer> <silent> p :call <SID>LocalPreview(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),1))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002491 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002492 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 +00002493 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>
2494 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002495 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2496 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002497 nnoremap <buffer> <silent> v :call <SID>NetSplit(3)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002498 nnoremap <buffer> <silent> x :call <SID>NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)"<cr>
Bram Moolenaar1e015462005-09-25 22:16:38 +00002499 nnoremap <buffer> <silent> <2-leftmouse> :exe "call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))"<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002500 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
2501 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002502 exe 'nnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002503 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002504 exe 'nnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002505 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002506 exe 'nnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002507 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002508 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002509 nnoremap <buffer> ? :he netrw-dir<cr>
2510
2511 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002512" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002513 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002514 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002515 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002516 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar488c6512005-08-11 20:09:58 +00002517 let w:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002518
2519 let sortby= g:netrw_sort_by
2520 if g:netrw_sort_direction =~ "^r"
2521 let sortby= sortby." reversed"
2522 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002523
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002524 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002525 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002526" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002527 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002528 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002529 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar488c6512005-08-11 20:09:58 +00002530 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002531 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002532" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002533 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002534 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar488c6512005-08-11 20:09:58 +00002535 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002536 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002537
2538 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002539 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002540 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002541 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002542 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002543 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002544 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002545 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002546 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002547 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2548 keepjumps put ='\" ============================================================================'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002549 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002550
2551 " bannercnt should index the line just after the banner
Bram Moolenaar488c6512005-08-11 20:09:58 +00002552 let w:netrw_bannercnt= w:netrw_bannercnt + 1
2553" call Decho("bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002554
2555 " generate the requested directory listing
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002556 call s:LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002557
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002558 " set up syntax highlighting
2559 if has("syntax")
2560 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00002561 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002562 setlocal ft=
2563 endif
2564 endif
2565
Bram Moolenaar8299df92004-07-10 09:47:34 +00002566 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002567 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002568 if g:netrw_hide && g:netrw_list_hide != ""
2569 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002570 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002571 if line("$") >= w:netrw_bannercnt
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002572
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002573 if g:netrw_sort_by =~ "^n"
2574 call s:SetSort()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002575
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002576 if g:netrw_sort_direction =~ 'n'
Bram Moolenaar1e015462005-09-25 22:16:38 +00002577 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002578 else
Bram Moolenaar1e015462005-09-25 22:16:38 +00002579 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002580 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +00002581 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002582
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002583 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002584 if g:netrw_sort_direction =~ 'n'
Bram Moolenaar1e015462005-09-25 22:16:38 +00002585 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002586 else
Bram Moolenaar1e015462005-09-25 22:16:38 +00002587 exe 'keepjumps silent '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002588 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +00002589 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002590 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002591
Bram Moolenaar8299df92004-07-10 09:47:34 +00002592 endif
2593 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002594
2595 call s:NetrwWideListing()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002596 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
Bram Moolenaar1e015462005-09-25 22:16:38 +00002597 exe w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00002598 endif
2599
2600 " record previous current directory
2601 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaar8299df92004-07-10 09:47:34 +00002602
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002603 " save certain window-oriented variables into buffer-oriented variables
Bram Moolenaar1e015462005-09-25 22:16:38 +00002604 call s:BufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002605 call s:NetOptionRestore()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002606 setlocal noma nomod nonu bh=hide nobl
Bram Moolenaar8299df92004-07-10 09:47:34 +00002607
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002608" call Dret("DirBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002609endfun
2610
2611" ---------------------------------------------------------------------
2612" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002613fun! s:LocalBrowseList()
Bram Moolenaar83bab712005-08-01 21:58:57 +00002614" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002615
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002616 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00002617 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
2618 let dirnamelen = strlen(b:netrw_curdir)
2619 let filelist = glob(dirname."/*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002620" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002621 if filelist != ""
2622 let filelist= filelist."\n"
2623 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002624 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002625" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2626
2627 " if the directory name includes a "$", and possibly other characters,
2628 " the glob() doesn't include "." and ".." entries.
2629 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2630" call Decho("forcibly tacking on .")
2631 if filelist == ""
2632 let filelist= dirname."."
2633 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002634 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002635 endif
2636" call Decho("filelist<".filelist.">")
2637 endif
2638 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2639" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002640 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002641" call Decho("filelist<".filelist.">")
2642 endif
2643 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002644 let filelist= substitute(filelist,'\','/','ge')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002645
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002646" call Decho("dirname<".dirname.">")
2647" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002648" call Decho("filelist<".filelist.">")
2649
2650 while filelist != ""
2651 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002652 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002653 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2654 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002655 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002656 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00002657 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002658 let pfile= filename
2659 if isdirectory(filename)
2660 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002661 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002662 if pfile =~ '//$'
2663 let pfile= substitute(pfile,'//$','/','e')
2664 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002665 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002666 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaar83bab712005-08-01 21:58:57 +00002667" call Decho(" ")
2668" call Decho("filename<".filename.">")
2669" call Decho("pfile <".pfile.">")
2670
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002671 if w:netrw_longlist == 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002672 let sz = getfsize(filename)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002673 let fsz = strpart(" ",1,15-strlen(sz)).sz
2674 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaar83bab712005-08-01 21:58:57 +00002675" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002676 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002677
Bram Moolenaar8299df92004-07-10 09:47:34 +00002678 if g:netrw_sort_by =~ "^t"
2679 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002680" call Decho("getftime(".filename.")=".getftime(filename))
2681 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002682 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00002683" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002684 let ftpfile= ft.'/'.pfile
2685 keepjumps put=ftpfile
2686
Bram Moolenaar8299df92004-07-10 09:47:34 +00002687 elseif g:netrw_sort_by =~ "^s"
2688 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002689" call Decho("getfsize(".filename.")=".getfsize(filename))
2690 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002691 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00002692" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002693 let fszpfile= fsz.'/'.pfile
2694 keepjumps put =fszpfile
2695
Bram Moolenaar8299df92004-07-10 09:47:34 +00002696 else
2697 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002698" call Decho("exe keepjumps put ='".pfile."'")
2699 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002700 endif
2701 endwhile
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002702
2703 " cleanup any windows mess at end-of-line
Bram Moolenaar1e015462005-09-25 22:16:38 +00002704 keepjumps silent! %s/\r$//e
Bram Moolenaar83bab712005-08-01 21:58:57 +00002705 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00002706
2707" call Dret("LocalBrowseList")
2708endfun
2709
2710" ---------------------------------------------------------------------
2711" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2712" directory and a new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002713fun! s:LocalBrowseChgDir(dirname,newdir,...)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002714" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002715
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002716 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002717 let newdir = a:newdir
2718
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002719 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002720 " apparently vim is "recognizing" that it is in the home directory and
2721 " is removing the "/". Bad idea, so I have to put it back.
2722 let dirname= dirname.'/'
2723" call Decho("adjusting dirname<".dirname.">")
2724 endif
2725
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002726 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002727 " handling a file
2728 let dirname= dirname.newdir
2729" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002730 " this lets NetBrowseX avoid the edit
2731 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002732" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
2733" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
2734 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002735 set ma nomod
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002736 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002737
2738 elseif newdir == './'
2739 " refresh the directory list
2740" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002741
2742 elseif newdir == '../'
2743 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002744 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002745" call Decho("go up one dir: dirname<".dirname.">")
2746
2747 else
2748 " go down one directory
2749 let dirname= dirname.newdir
2750" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2751 endif
2752
2753" call Dret("LocalBrowseChgDir <".dirname.">")
2754 return dirname
2755endfun
2756
2757" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002758" LocalBrowseRm: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002759fun! s:LocalBrowseRm(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002760" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2761" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2762
2763 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002764 let ctr = a:firstline
2765 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002766 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002767
2768 " remove multiple files and directories
2769 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002770 exe "keepjumps ".ctr
2771
2772 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00002773 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002774 let ctr= ctr + 1
2775 continue
2776 endif
2777 let curword= s:NetGetWord()
2778 if curword == "./" || curword == "../"
2779 let ctr= ctr + 1
2780 continue
2781 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002782
2783 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00002784 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002785" call Decho("rmfile<".rmfile.">")
2786
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002787 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002788 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002789 if !all
2790 echohl Statement
2791 call inputsave()
2792 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2793 call inputrestore()
2794 echohl NONE
2795 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2796 if ok =~ 'a\%[ll]'
2797 let all= 1
2798 endif
2799 endif
2800
2801 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002802 let ret= delete(rmfile)
2803" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002804 elseif ok =~ 'q\%[uit]'
2805 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002806 endif
2807
2808 else
2809 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002810 if !all
2811 echohl Statement
2812 call inputsave()
2813 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2814 call inputrestore()
2815 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2816 if ok =~ 'a\%[ll]'
2817 let all= 1
2818 endif
2819 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002820 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002821
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002822 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002823" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2824 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002825" call Decho("v:shell_error=".v:shell_error)
2826
2827 if v:shell_error != 0
2828" call Decho("2nd attempt to remove directory<".rmfile.">")
2829 let errcode= delete(rmfile)
2830" call Decho("errcode=".errcode)
2831
2832 if errcode != 0
2833 if has("unix")
2834" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002835call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002836 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002837 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002838 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002839endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002840 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002841 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002842 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002843 endif
2844 endif
2845 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002846
2847 elseif ok =~ 'q\%[uit]'
2848 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002849 endif
2850 endif
2851
2852 let ctr= ctr + 1
2853 endwhile
2854
2855 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002856 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002857" call Decho("refresh the directory")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002858 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002859 exe curline
2860
2861" call Dret("LocalBrowseRm")
2862endfun
2863
2864" ---------------------------------------------------------------------
2865" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002866fun! s:LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002867" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2868
2869 " preparation for removing multiple files/directories
2870 let ctr= a:firstline
2871
2872 " attempt to rename files/directories
2873 while ctr <= a:lastline
2874 exe "keepjumps ".ctr
2875
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002876 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00002877 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002878 let ctr= ctr + 1
2879 continue
2880 endif
2881 let curword= s:NetGetWord()
2882 if curword == "./" || curword == "../"
2883 let ctr= ctr + 1
2884 continue
2885 endif
2886
Bram Moolenaar8299df92004-07-10 09:47:34 +00002887 norm! 0
Bram Moolenaar572cb562005-08-05 21:35:02 +00002888 let oldname= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002889" call Decho("oldname<".oldname.">")
2890
2891 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002892 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002893 call inputrestore()
2894
Bram Moolenaar83bab712005-08-01 21:58:57 +00002895 let ret= rename(oldname,newname)
2896" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002897
2898 let ctr= ctr + 1
2899 endwhile
2900
2901 " refresh the directory
2902 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002903" call Decho("refresh the directory listing")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002904 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002905 exe "keepjumps ".curline
2906" call Dret("LocalBrowseRename")
2907endfun
2908
2909" ---------------------------------------------------------------------
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002910" LocalObtain: copy selected file to current working directory {{{2
2911fun! s:LocalObtain()
2912" call Dfunc("LocalObtain()")
2913 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
2914 let fname= expand("<cWORD>")
2915 let fcopy= readfile(b:netrw_curdir."/".fname,"b")
2916 call writefile(fcopy,getcwd()."/".fname,"b")
2917 elseif !exists("b:netrw_curdir")
2918 echohl Error | echo "***netrw*** local browsing directory doesn't exist!"
2919 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2920 else
2921 echohl Error | echo "***netrw*** local browsing directory and current directory are identical"
2922 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2923 endif
2924" call Dret("LocalObtain")
2925endfun
2926
2927" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002928" LocalPreview: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002929fun! s:LocalPreview(path) range
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002930" call Dfunc("LocalPreview(path<".a:path.">)")
2931 if has("quickfix")
2932 if !isdirectory(a:path)
2933 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002934 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002935 echohl WarningMsg | echo "***netrw*** sorry, cannot preview a directory such as <".a:path.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002936 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002937 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002938 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002939 echohl WarningMsg | echo "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002940 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002941 endif
2942" call Dret("LocalPreview")
2943endfun
2944
2945" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002946" LocalRefresh: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002947fun! s:LocalRefresh(dirname)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002948" call Dfunc("LocalRefresh(dirname<".a:dirname.">)")
2949 set ma
2950 %d
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002951 call s:LocalBrowse(a:dirname)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002952 redraw!
2953" call Dret("LocalRefresh")
2954endfun
2955
2956" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002957" Explore: launch the local browser in the directory of the current file {{{2
2958" dosplit==0: the window will be split iff the current file has
2959" been modified
2960" dosplit==1: the window will be split before running the local
2961" browser
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002962fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002963" call Dfunc("Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.")")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002964
2965 " if dosplit or file has been modified
2966 if a:dosplit || &modified
Bram Moolenaar488c6512005-08-11 20:09:58 +00002967 call <SID>SaveWinVars()
2968
Bram Moolenaar83bab712005-08-01 21:58:57 +00002969 if a:style == 0 " Explore, Sexplore
2970 exe g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002971" call Decho("style=0: Explore or Sexplore")
2972
Bram Moolenaar83bab712005-08-01 21:58:57 +00002973 elseif a:style == 1 "Explore!, Sexplore!
2974 exe g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002975" call Decho("style=1: Explore! or Sexplore!")
2976
Bram Moolenaar83bab712005-08-01 21:58:57 +00002977 elseif a:style == 2 " Hexplore
2978 exe "bel ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002979" call Decho("style=2: Hexplore")
2980
Bram Moolenaar83bab712005-08-01 21:58:57 +00002981 elseif a:style == 3 " Hexplore!
2982 exe "abo ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002983" call Decho("style=3: Hexplore!")
2984
Bram Moolenaar83bab712005-08-01 21:58:57 +00002985 elseif a:style == 4 " Vexplore
2986 exe "lefta ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002987" call Decho("style=4: Vexplore")
2988
Bram Moolenaar83bab712005-08-01 21:58:57 +00002989 elseif a:style == 5 " Vexplore!
2990 exe "rightb ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002991" call Decho("style=5: Vexplore!")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002992 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002993 call s:CopyWinVars()
Bram Moolenaar83bab712005-08-01 21:58:57 +00002994 endif
2995 norm! 0
2996
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002997 if a:1 == "" && a:indx >= 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00002998 " Explore Hexplore Vexplore Sexplore
2999 let newdir= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3000 if newdir =~ '^scp:' || newdir =~ '^ftp:'
3001" call Decho("calling NetBrowse(newdir<".newdir.">)")
3002 call s:NetBrowse(newdir)
3003 else
3004" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3005 call s:LocalBrowse(newdir)
3006 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003007
Bram Moolenaar572cb562005-08-05 21:35:02 +00003008 elseif a:1 =~ '\*\*/' || a:indx < 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003009 " Nexplore Pexplore -or- Explore **/...
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003010
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003011 if has("path_extra")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003012 if !exists("w:netrw_explore_indx")
3013 let w:netrw_explore_indx= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003014 endif
3015 let indx = a:indx
3016 if indx == -1
Bram Moolenaar488c6512005-08-11 20:09:58 +00003017 let indx= w:netrw_explore_indx + 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003018 elseif indx == -2
Bram Moolenaar488c6512005-08-11 20:09:58 +00003019 let indx= w:netrw_explore_indx - 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003020 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003021 let w:netrw_explore_indx = 0
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003022 if !exists("b:netrw_curdir")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003023 let b:netrw_curdir= getcwd()
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003024 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003025 let w:netrw_explore_list = split(expand(b:netrw_curdir."/".a:1),'\n')
3026 let w:netrw_explore_listlen = len(w:netrw_explore_list)
3027 if w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/'
Bram Moolenaar572cb562005-08-05 21:35:02 +00003028 echohl WarningMsg | echo "***netrw*** no files matched" | echohl None
3029 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3030" call Dret("Explore")
3031 return
3032 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003033 endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003034
Bram Moolenaar1e015462005-09-25 22:16:38 +00003035 " NetrwStatusLine support
Bram Moolenaar488c6512005-08-11 20:09:58 +00003036 let w:netrw_explore_indx= indx
Bram Moolenaar1e015462005-09-25 22:16:38 +00003037 if !exists("s:netrw_users_stl")
3038 let s:netrw_users_stl= &stl
3039 endif
3040 set stl=%f\ %h%m%r%=%{NetrwStatusLine()}
Bram Moolenaar488c6512005-08-11 20:09:58 +00003041" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003042
3043 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00003044 if indx >= w:netrw_explore_listlen || indx < 0
3045 let indx= (indx < 0)? 0 : ( w:netrw_explore_listlen - 1 )
Bram Moolenaar572cb562005-08-05 21:35:02 +00003046 echohl WarningMsg | echo "***netrw*** no more files match Explore pattern" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003047 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3048" call Dret("Explore")
3049 return
3050 endif
3051
Bram Moolenaar488c6512005-08-11 20:09:58 +00003052 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaar1e015462005-09-25 22:16:38 +00003053" call Decho("dirfile<".dirfile."> indx=".indx)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003054 let newdir= substitute(dirfile,'/[^/]*$','','e')
3055" call Decho("newdir<".newdir.">")
3056" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3057 call s:LocalBrowse(newdir)
Bram Moolenaar1e015462005-09-25 22:16:38 +00003058 call search(substitute(dirfile,"^.*/","",""),"W")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003059 let w:netrw_explore_mtchcnt = indx + 1
3060 let w:netrw_explore_bufnr = bufnr(".")
3061 let w:netrw_explore_line = line(".")
3062" 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 +00003063
3064 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003065 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003066 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 +00003067 endif
3068 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3069 endif
3070
Bram Moolenaar83bab712005-08-01 21:58:57 +00003071 else
3072 let newdir= a:1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003073" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3074 call s:LocalBrowse(newdir)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003075 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003076
3077" call Dret("Explore")
3078endfun
3079
3080" ---------------------------------------------------------------------
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003081" NetrwStatusLine: {{{2
3082fun! NetrwStatusLine()
Bram Moolenaar1e015462005-09-25 22:16:38 +00003083" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr(".")." Xline#".w:netrw_explore_line." line#".line(".")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003084 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 +00003085 " restore user's status line
Bram Moolenaar1e015462005-09-25 22:16:38 +00003086 let &stl= s:netrw_users_stl
Bram Moolenaar488c6512005-08-11 20:09:58 +00003087 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
3088 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003089 return ""
3090 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003091 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003092 endif
3093endfun
3094
3095" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003096" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003097" Change backslashes to forward slashes, if any.
3098" If doesc is true, escape certain troublesome characters
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003099fun! s:NetGetcwd(doesc)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003100" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
3101 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003102 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003103 let curdir= curdir.'/'
3104 endif
3105 if a:doesc
3106 let curdir= escape(curdir,s:netrw_cd_escape)
3107 endif
3108" call Dret("NetGetcwd <".curdir.">")
3109 return curdir
3110endfun
3111
3112" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00003113" NetMethod: determine method of transfer {{{1
3114" method == 1: rcp
3115" 2: ftp + <.netrc>
3116" 3: ftp + machine, id, password, and [path]filename
3117" 4: scp
3118" 5: http (wget)
3119" 6: cadaver
3120" 7: rsync
3121" 8: fetch
3122" 9: sftp
3123fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003124" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003125
3126 " initialization
3127 let b:netrw_method = 0
3128 let g:netrw_machine = ""
3129 let b:netrw_fname = ""
3130 let g:netrw_port = ""
3131
3132 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003133 " mipf : a:machine a:id password filename Use ftp
3134 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003135 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003136 " rcpurm : rcp://[user@]host/filename Use rcp
3137 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003138 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003139 " httpurm : http://[user@]host/filename Use wget
3140 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003141 " rsyncurm : rsync://host[:port]/path Use rsync
3142 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
3143 " sftpurm : sftp://[user@]host/filename Use scp
3144 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
3145 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
3146 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00003147 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003148 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
3149 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
3150 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003151 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003152 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
3153 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
3154 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
3155
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003156" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003157 " Determine Method
3158 " rcp://user@hostname/...path-to-file
3159 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003160" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003161 let b:netrw_method = 1
3162 let userid = substitute(a:choice,rcpurm,'\1',"")
3163 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
3164 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003165 if userid != ""
3166 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00003167 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003168
3169 " scp://user@hostname/...path-to-file
3170 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003171" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003172 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00003173 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
3174 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
3175 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003176
3177 " http://user@hostname/...path-to-file
3178 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003179" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003180 let b:netrw_method = 5
3181 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
3182 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
3183
3184 " dav://hostname[:port]/..path-to-file..
3185 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003186" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003187 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003188 if a:choice =~ '^s'
3189 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
3190 else
3191 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
3192 endif
3193 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003194
3195 " rsync://user@hostname/...path-to-file
3196 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003197" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003198 let b:netrw_method = 7
3199 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
3200 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
3201
3202 " ftp://[user@]hostname[[:#]port]/...path-to-file
3203 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003204" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003205 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003206 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
3207 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
3208 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003209 if userid != ""
3210 let g:netrw_uid= userid
3211 endif
3212 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3213 let b:netrw_method = 3
3214 else
3215 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
3216 let b:netrw_method= 2
3217 else
3218 if !exists("g:netrw_uid") || g:netrw_uid == ""
3219 call NetUserPass()
3220 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
3221 call NetUserPass(g:netrw_uid)
3222 " else just use current g:netrw_uid and g:netrw_passwd
3223 endif
3224 let b:netrw_method= 3
3225 endif
3226 endif
3227
3228 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003229" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003230 let b:netrw_method = 8
3231 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
3232 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
3233 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
3234 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
3235
3236 " Issue an ftp : "machine id password [path/]filename"
3237 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003238" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003239 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003240 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
3241 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
3242 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
3243 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
3244
3245 " Issue an ftp: "hostname [path/]filename"
3246 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003247" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003248 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3249 let b:netrw_method = 3
3250 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3251 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3252
3253 elseif filereadable(expand("$HOME/.netrc"))
3254 let b:netrw_method = 2
3255 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3256 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3257 endif
3258
3259 " sftp://user@hostname/...path-to-file
3260 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003261" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003262 let b:netrw_method = 9
3263 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
3264 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
3265
3266 " Issue an rcp: hostname:filename" (this one should be last)
3267 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003268" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003269 let b:netrw_method = 1
3270 let userid = substitute(a:choice,rcphf,'\2',"")
3271 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
3272 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003273" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
3274" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
3275" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
3276" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003277 if userid != ""
3278 let g:netrw_uid= userid
3279 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003280 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003281 " don't let PCs try <.netrc>
3282 let b:netrw_method = 3
3283 endif
3284
3285 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003286 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003287 echohl Error | echo "***netrw*** cannot determine method" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003288 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003289 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003290 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003291 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00003292
3293 " remove any leading [:#] from port number
3294 if g:netrw_port != ""
3295 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
3296 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003297
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003298" call Decho("a:choice <".a:choice.">")
3299" call Decho("b:netrw_method <".b:netrw_method.">")
3300" call Decho("g:netrw_machine<".g:netrw_machine.">")
3301" call Decho("g:netrw_port <".g:netrw_port.">")
3302" if exists("g:netrw_uid") "Decho
3303" call Decho("g:netrw_uid <".g:netrw_uid.">")
3304" endif "Decho
3305" if exists("g:netrw_passwd") "Decho
3306" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
3307" endif "Decho
3308" call Decho("b:netrw_fname <".b:netrw_fname.">")
3309" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003310endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003311
3312" ------------------------------------------------------------------------
3313" NetUserPass: set username and password for subsequent ftp transfer {{{1
3314" Usage: :call NetUserPass() -- will prompt for userid and password
3315" :call NetUserPass("uid") -- will prompt for password
3316" :call NetUserPass("uid","password") -- sets global userid and password
3317fun! NetUserPass(...)
3318
3319 " get/set userid
3320 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003321" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003322 if !exists("g:netrw_uid") || g:netrw_uid == ""
3323 " via prompt
3324 let g:netrw_uid= input('Enter username: ')
3325 endif
3326 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003327" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003328 let g:netrw_uid= a:1
3329 endif
3330
3331 " get password
3332 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003333" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003334 let g:netrw_passwd= inputsecret("Enter Password: ")
3335 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003336" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003337 let g:netrw_passwd=a:2
3338 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003339" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003340endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003341
3342" ------------------------------------------------------------------------
3343" NetOptionSave: save options and set to "standard" form {{{1
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003344fun! s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003345" call Dfunc("NetOptionSave()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003346 if !exists("w:netoptionsave")
3347 let w:netoptionsave= 1
3348 else
3349" call Dret("NetOptionSave : netoptionsave=".w:netoptionsave)
3350 return
3351 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003352
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003353 " Get Temporary Filename
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003354 let w:aikeep = &ai
3355 " record autochdir setting and then insure its unset (tnx to David Fishburn)
3356 if has("netbeans_intg") || has("sun_workshop")
3357 let w:acdkeep = &autochdir
3358 set noautochdir
3359 endif
3360 let w:cinkeep = &cin
3361 let w:cinokeep = &cino
3362 let w:comkeep = &com
3363 let w:cpokeep = &cpo
3364 if !g:netrw_keepdir
3365 let w:dirkeep = getcwd()
3366 endif
3367 let w:gdkeep = &gd
3368 let w:repkeep = &report
3369 let w:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00003370 setlocal cino =
3371 setlocal com =
3372 setlocal cpo -=aA
3373 setlocal nocin noai
3374 setlocal tw =0
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003375 setlocal report=10000
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003376 if has("win32") && !has("win95")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003377 let w:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00003378 setlocal noswf
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003379" call Decho("setting w:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003380 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003381
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003382" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003383endfun
3384
3385" ------------------------------------------------------------------------
3386" NetOptionRestore: restore options {{{1
3387fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003388" call Dfunc("NetOptionRestore()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003389 if !exists("w:netoptionsave")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003390" call Dret("NetOptionRestore : w:netoptionsave doesn't exist")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003391 return
3392 endif
3393 unlet w:netoptionsave
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003394
Bram Moolenaar1e015462005-09-25 22:16:38 +00003395 let &ai = w:aikeep
3396 if has("netbeans_intg") || has("sun_workshop")
3397 let &acd = w:acdkeep
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003398 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +00003399 let &cin = w:cinkeep
3400 let &cino = w:cinokeep
3401 let &com = w:comkeep
3402 let &cpo = w:cpokeep
3403 if exists("w:dirkeep")
3404 exe "lcd ".w:dirkeep
3405 endif
3406 let &gd = w:gdkeep
3407 let &report = w:repkeep
3408 let &tw = w:twkeep
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003409 if exists("w:swfkeep")
Bram Moolenaar1e015462005-09-25 22:16:38 +00003410 if &directory == ""
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003411 " user hasn't specified a swapfile directory;
3412 " netrw will temporarily make the swapfile
3413 " directory the current local one.
3414 let &directory = getcwd()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003415 silent! let &swf = w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003416 set directory=
3417 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003418 let &swf= w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003419 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003420 unlet w:swfkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003421 endif
Bram Moolenaar1e015462005-09-25 22:16:38 +00003422 unlet w:aikeep
3423 unlet w:cinkeep
3424 unlet w:cinokeep
3425 unlet w:comkeep
3426 unlet w:cpokeep
3427 unlet w:gdkeep
3428 unlet w:repkeep
3429 unlet w:twkeep
3430 if exists("w:dirkeep")
3431 unlet w:dirkeep
3432 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003433
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003434" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003435endfun
3436
3437" ------------------------------------------------------------------------
3438" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003439" to handle extra junk that their system's ftp dumps
3440" into the transfer. This function is provided as an
3441" example and as a fix for a Windows 95 problem: in my
3442" experience, win95's ftp always dumped four blank lines
3443" at the end of the transfer.
Bram Moolenaar1e015462005-09-25 22:16:38 +00003444if has("win95") && g:netrw_win95ftp
Bram Moolenaar071d4272004-06-13 20:20:40 +00003445 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003446" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003447 if method == 3 " ftp (no <.netrc>)
3448 let fourblanklines= line2 - 3
3449 silent fourblanklines.",".line2."g/^\s*/d"
3450 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003451" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003452 endfun
3453endif
3454
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003455" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003456" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003457if v:version < 700
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003458 fun! s:NetSort() range
Bram Moolenaar83bab712005-08-01 21:58:57 +00003459" " call Dfunc("NetSort()")
3460
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003461 let i = a:firstline + 1
3462 while i <= a:lastline
3463 " find insertion point via binary search
3464 let i_val = getline(i)
3465 let lo = a:firstline
3466 let hi = i
3467 while lo < hi
Bram Moolenaar83bab712005-08-01 21:58:57 +00003468 let mid = (lo + hi) / 2
3469 let mid_val = getline(mid)
3470 if g:netrw_sort_direction =~ '^n'
3471 " normal sorting order
3472 if i_val < mid_val
3473 let hi = mid
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003474 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003475 let lo = mid + 1
3476 if i_val == mid_val | break | endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003477 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003478 else
3479 " reverse sorting order
3480 if i_val > mid_val
3481 let hi = mid
3482 else
3483 let lo = mid + 1
3484 if i_val == mid_val | break | endif
3485 endif
3486 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003487 endwhile
3488 " do insert
3489 if lo < i
Bram Moolenaar83bab712005-08-01 21:58:57 +00003490 exe 'keepjumps '.i.'d_'
3491 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003492 endif
3493 let i = i + 1
3494 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00003495
3496" " call Dret("NetSort")
3497 endfun
3498endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003499
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003500" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00003501" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
3502" What this function does is to compute a priority for the patterns
3503" in the g:netrw_sort_sequence. It applies a substitute to any
3504" "files" that satisfy each pattern, putting the priority / in
3505" front. An "*" pattern handles the default priority.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003506fun! s:SetSort()
Bram Moolenaar488c6512005-08-11 20:09:58 +00003507" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003508 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00003509 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
3510 else
3511 let seqlist = g:netrw_sort_sequence
3512 endif
3513 " sanity check -- insure that * appears somewhere
3514 if seqlist == ""
3515 let seqlist= '*'
3516 elseif seqlist !~ '\*'
3517 let seqlist= seqlist.',*'
3518 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003519 let priority = 1
3520 while seqlist != ""
3521 if seqlist =~ ','
3522 let seq = substitute(seqlist,',.*$','','e')
3523 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
3524 else
3525 let seq = seqlist
3526 let seqlist = ""
3527 endif
3528 let eseq= escape(seq,'/')
3529 if priority < 10
3530 let spriority= "00".priority.'\/'
3531 elseif priority < 100
3532 let spriority= "0".priority.'\/'
3533 else
3534 let spriority= priority.'\/'
3535 endif
3536" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
3537
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003538 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00003539 if w:netrw_bannercnt > line("$")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003540 " apparently no files were left after a Hiding pattern was used
3541" call Dret("SetSort : no files left after hiding")
3542 return
3543 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003544 if seq == '*'
Bram Moolenaar1e015462005-09-25 22:16:38 +00003545 exe 'keepjumps silent '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003546 else
Bram Moolenaar1e015462005-09-25 22:16:38 +00003547 exe 'keepjumps silent '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003548 endif
3549 let priority = priority + 1
3550 endwhile
3551
Bram Moolenaar1e015462005-09-25 22:16:38 +00003552 exe 'keepjumps silent '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003553
3554" call Dret("SetSort")
3555endfun
3556
Bram Moolenaar488c6512005-08-11 20:09:58 +00003557" ---------------------------------------------------------------------
3558" SaveWinVars: (used by Explore()) {{{1
3559fun! s:SaveWinVars()
3560" call Dfunc("SaveWinVars()")
3561 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
3562 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
3563 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
3564 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
3565 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
3566 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
3567 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
3568 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003569 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003570" call Dret("SaveWinVars")
3571endfun
3572
3573" ---------------------------------------------------------------------
3574" CopyWinVars: (used by Explore()) {{{1
3575fun! s:CopyWinVars()
3576" call Dfunc("CopyWinVars()")
3577 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
3578 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
3579 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
3580 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
3581 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
3582 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
3583 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
3584 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 +00003585 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 +00003586" call Dret("CopyWinVars")
3587endfun
3588
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003589" ---------------------------------------------------------------------
Bram Moolenaar1e015462005-09-25 22:16:38 +00003590" BufWinVars: (used by NetBrowse() and LocalBrowse()) {{{1
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003591" To allow separate windows to have their own activities, such as
3592" Explore **/pattern, several variables have been made window-oriented.
3593" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar1e015462005-09-25 22:16:38 +00003594" variables are not inherited by the new window. BufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003595" UseBufWinVars() get around that.
Bram Moolenaar1e015462005-09-25 22:16:38 +00003596fun! s:BufWinVars()
3597" call Dfunc("BufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003598 if exists("w:netrw_longlist") |let b:netrw_longlist = w:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003599 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
3600 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
3601 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
3602 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
3603 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen = w:netrw_explore_listlen|endif
3604 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = w:netrw_explore_mtchcnt|endif
3605 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
3606 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
3607 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
Bram Moolenaar1e015462005-09-25 22:16:38 +00003608" call Dret("BufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003609endfun
3610
3611" ---------------------------------------------------------------------
3612" UseBufWinVars: (used by NetBrowse() and LocalBrowse() {{{1
3613" Matching function to BufferWinVars()
3614fun! s:UseBufWinVars()
3615" call Dfunc("UseBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003616 if exists("b:netrw_longlist") && !exists("w:netrw_longlist") |let w:netrw_longlist = b:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003617 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
3618 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
3619 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
3620 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
3621 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
3622 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
3623 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
3624 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
3625 if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif
3626" call Dret("UseBufWinVars")
3627endfun
3628
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003629" ------------------------------------------------------------------------
3630" Settings Restoration: {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003631let &cpo= s:keepcpo
3632unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003633
Bram Moolenaar071d4272004-06-13 20:20:40 +00003634" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00003635" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003636" vim:ts=8 fdm=marker