blob: 37dd13dfa462ab83d7de416f0a269a4b5ad7b6a7 [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 Moolenaar578b49e2005-09-10 19:22:57 +00003" Date: Sep 09, 2005
4" Version: 69
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00005" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00006" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
7" Copyright: Copyright (C) 1999-2005 Charles E. Campbell, Jr. {{{1
Bram Moolenaar572cb562005-08-05 21:35:02 +00008" Permission is hereby granted to use and distribute this code,
9" with or without modifications, provided that this copyright
10" notice is copied with it. Like anything else that's free,
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000011" netrw.vim is provided *as is* and comes with no warranty
12" of any kind, either expressed or implied. By using this
13" plugin, you agree that in no event will the copyright
14" holder be liable for any damages resulting from the use
15" of this software.
Bram Moolenaar071d4272004-06-13 20:20:40 +000016"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000017" But be doers of the Word, and not only hearers, deluding your own selves {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000018" (James 1:22 RSV)
19" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bram Moolenaar578b49e2005-09-10 19:22:57 +000020
21" Exception for &cp: {{{1
22if &cp
23 finish
24endif
25if v:version < 700
26 echohl WarningMsg | echo "***netrw*** you need vim version 7.0 or later for version ".g:loaded_netrw." of netrw" | echohl None
27 finish
28endif
29let g:loaded_netrw = "v69"
30let s:keepcpo = &cpo
Bram Moolenaar071d4272004-06-13 20:20:40 +000031set cpo&vim
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000032" call Decho("doing autoload/netrw.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +000033
34" ---------------------------------------------------------------------
35" Default values for global netrw variables {{{1
36if !exists("g:netrw_ftpmode")
37 let g:netrw_ftpmode= "binary"
38endif
39if !exists("g:netrw_win95ftp")
40 let g:netrw_win95ftp= 1
41endif
42if !exists("g:netrw_cygwin")
Bram Moolenaard4755bb2004-09-02 19:12:26 +000043 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000044 if &shell == "bash"
45 let g:netrw_cygwin= 1
46 else
47 let g:netrw_cygwin= 0
48 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000049 else
50 let g:netrw_cygwin= 0
51 endif
52endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000053if !exists("g:netrw_list_cmd")
54 if executable("ssh")
55 " provide a default listing command
56 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
57 else
Bram Moolenaar83bab712005-08-01 21:58:57 +000058" call Decho("ssh is not executable, can't do remote directory exploring with ssh")
Bram Moolenaar843ee412004-06-30 16:16:41 +000059 let g:netrw_list_cmd= ""
60 endif
61endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +000062if !exists("g:netrw_ftp_list_cmd")
63 if has("unix") || exists("g:netrw_cygwin")
64 let g:netrw_ftp_list_cmd= "ls -lF"
65 else
66 let g:netrw_ftp_list_cmd= "dir"
67 endif
68endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000069if !exists("g:netrw_rm_cmd")
70 let g:netrw_rm_cmd = "ssh HOSTNAME rm"
71endif
72if !exists("g:netrw_rmf_cmd")
73 let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
74endif
75if !exists("g:netrw_rmdir_cmd")
76 let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
77endif
78if !exists("g:netrw_rename_cmd")
79 let g:netrw_rename_cmd= "ssh HOSTNAME mv"
80endif
81if exists("g:netrw_silent") && g:netrw_silent != 0
82 let g:netrw_silentxfer= "silent "
83else
84 let g:netrw_silentxfer= ""
85endif
86if !exists("g:netrw_winsize")
87 let g:netrw_winsize= ""
88endif
89if !exists("g:netrw_list_hide")
90 let g:netrw_list_hide= ""
91endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000092if !exists("g:netrw_sort_by")
93 " alternatives: date size
94 let g:netrw_sort_by= "name"
95endif
96if !exists("g:netrw_sort_sequence")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000097 let g:netrw_sort_sequence= '[\/]$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000098endif
99if !exists("g:netrw_sort_direction")
100 " alternative: reverse (z y x ...)
101 let g:netrw_sort_direction= "normal"
102endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000103if !exists("g:netrw_longlist")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000104 let g:netrw_longlist= 0
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000105endif
106if g:netrw_longlist == 0 || g:netrw_longlist == 2
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000107 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
Bram Moolenaar8299df92004-07-10 09:47:34 +0000108else
109 let g:netrw_longlist= 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000110 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -l"
111endif
112if !exists("g:netrw_list_cmd")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000113endif
114if !exists("g:netrw_timefmt")
115 let g:netrw_timefmt= "%c"
116endif
117if !exists("g:netrw_local_rmdir")
118 let g:netrw_local_rmdir= "rmdir"
119endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000120if !exists("g:netrw_local_mkdir")
121 let g:netrw_local_mkdir= "mkdir"
122endif
123if !exists("g:netrw_mkdir_cmd")
124 let g:netrw_mkdir_cmd= "ssh HOSTNAME mkdir"
125endif
Bram Moolenaar269ec652004-07-29 08:43:53 +0000126if !exists("g:netrw_hide")
127 let g:netrw_hide= 1
128endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000129if !exists("g:netrw_ftp_browse_reject")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000130 let g:netrw_ftp_browse_reject='^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not\|No such file\|: connect to address [0-9a-fA-F:]*: No route to host$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000131endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000132if !exists("g:netrw_ssh_browse_reject")
133 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
134endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000135if !exists("g:netrw_keepdir")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000136 let g:netrw_keepdir= 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000137endif
138if !exists("s:netrw_cd_escape")
139 if has("win32") || has("win95") || has("win64") || has("win16")
140 let s:netrw_cd_escape="#% "
141 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000142 let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000143 endif
144endif
145if !exists("s:netrw_glob_escape")
146 if has("win32") || has("win95") || has("win64") || has("win16")
147 let s:netrw_glob_escape= ""
148 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000149 let s:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000150 endif
151endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000152if !exists("g:netrw_alto")
153 let g:netrw_alto= 0
154endif
155if !exists("g:netrw_altv")
156 let g:netrw_altv= 0
157endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000158if !exists("g:netrw_maxfilenamelen")
159 let g:netrw_maxfilenamelen= 32
160endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000161if !exists("g:netrw_dirhistmax")
162 let g:netrw_dirhistmax= 10
163endif
164if !exists("g:NETRW_DIRHIST_CNT")
165 let g:NETRW_DIRHIST_CNT= 0
166endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000167
168" BufEnter event ignored by decho when following variable is true
169" Has a side effect that doau BufReadPost doesn't work, so
170" files read by network transfer aren't appropriately highlighted.
171"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000172
173" ---------------------------------------------------------------------
174" Default values for global protocol variables {{{1
175if !exists("g:netrw_rcp_cmd")
176 let g:netrw_rcp_cmd = "rcp"
177endif
178if !exists("g:netrw_ftp_cmd")
179 let g:netrw_ftp_cmd = "ftp"
180endif
181if !exists("g:netrw_scp_cmd")
182 let g:netrw_scp_cmd = "scp -q"
183endif
184if !exists("g:netrw_sftp_cmd")
185 let g:netrw_sftp_cmd = "sftp"
186endif
187if !exists("g:netrw_http_cmd")
188 if executable("wget")
189 let g:netrw_http_cmd = "wget -q -O"
190 elseif executable("fetch")
191 let g:netrw_http_cmd = "fetch -o"
192 else
193 let g:netrw_http_cmd = ""
194 endif
195endif
196if !exists("g:netrw_dav_cmd")
197 let g:netrw_dav_cmd = "cadaver"
198endif
199if !exists("g:netrw_rsync_cmd")
200 let g:netrw_rsync_cmd = "rsync"
201endif
202if !exists("g:netrw_fetch_cmd")
203 if executable("fetch")
204 let g:netrw_fetch_cmd = "fetch -o"
205 else
206 let g:netrw_fetch_cmd = ""
207 endif
208endif
209
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000210if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000211 \ && exists("g:netrw_use_nt_rcp")
212 \ && g:netrw_use_nt_rcp
213 \ && executable( $SystemRoot .'/system32/rcp.exe')
214 let s:netrw_has_nt_rcp = 1
215 let s:netrw_rcpmode = '-b'
216 else
217 let s:netrw_has_nt_rcp = 0
218 let s:netrw_rcpmode = ''
219endif
220
Bram Moolenaar071d4272004-06-13 20:20:40 +0000221" ------------------------------------------------------------------------
222" NetSavePosn: saves position of cursor on screen {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000223fun! netrw#NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000224" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000225 " Save current line and column
Bram Moolenaar488c6512005-08-11 20:09:58 +0000226 let w:netrw_winnr= winnr()
227 let w:netrw_line = line(".")
228 let w:netrw_col = virtcol(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000229
230 " Save top-of-screen line
231 norm! H0
Bram Moolenaar488c6512005-08-11 20:09:58 +0000232 let w:netrw_hline= line(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000233
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000234 call netrw#NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000235" call Dret("NetSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000236endfun
237
238" ------------------------------------------------------------------------
239" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000240fun! netrw#NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000241" call Dfunc("NetRestorePosn() winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
Bram Moolenaar572cb562005-08-05 21:35:02 +0000242 let eikeep= &ei
243 set ei=all
Bram Moolenaar071d4272004-06-13 20:20:40 +0000244
Bram Moolenaar81695252004-12-29 20:58:21 +0000245 " restore window
Bram Moolenaar488c6512005-08-11 20:09:58 +0000246" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
247 exe "silent! ".w:netrw_winnr."wincmd w"
Bram Moolenaar572cb562005-08-05 21:35:02 +0000248" if v:shell_error == 0
249" " as suggested by Bram M: redraw on no error
250" " allows protocol error messages to remain visible
251" redraw!
252" endif
Bram Moolenaar81695252004-12-29 20:58:21 +0000253
Bram Moolenaar071d4272004-06-13 20:20:40 +0000254 " restore top-of-screen line
Bram Moolenaar488c6512005-08-11 20:09:58 +0000255" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
256 exe "norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaar81695252004-12-29 20:58:21 +0000257
Bram Moolenaar071d4272004-06-13 20:20:40 +0000258 " restore position
Bram Moolenaar488c6512005-08-11 20:09:58 +0000259" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
260 exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000261
Bram Moolenaar572cb562005-08-05 21:35:02 +0000262 let &ei= eikeep
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000263" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000264endfun
265
266" ------------------------------------------------------------------------
267" NetRead: responsible for reading a file over the net {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000268fun! netrw#NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000269" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000270
271 " save options
272 call s:NetOptionSave()
273
274 " Special Exception: if a file is named "0r", then
275 " "0r" will be used to read the
276 " following files instead of "r"
277 if a:0 == 0
278 let readcmd= "r"
279 let ichoice= 0
280 elseif a:1 == "0r"
281 let readcmd = "0r"
282 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000283 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000284 let readcmd = "r"
285 let ichoice = 1
286 endif
287
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000288 " get name of a temporary file and set up shell-quoting character
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000289 let tmpfile= tempname()
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000290 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000291 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000292 echohl Error | echo "***netrw*** your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000293 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
294" call Dret("NetRead")
295 return
296 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000297
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000298" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000299 while ichoice <= a:0
300
301 " attempt to repeat with previous host-file-etc
302 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000303" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000304 let choice = b:netrw_lastfile
305 let ichoice= ichoice + 1
306
307 else
308 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000309" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000310
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000311 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000312 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000313 echomsg 'NetRead Usage:'
314 echomsg ':Nread machine:path uses rcp'
315 echomsg ':Nread "machine path" uses ftp with <.netrc>'
316 echomsg ':Nread "machine id password path" uses ftp'
317 echomsg ':Nread dav://machine[:port]/path uses cadaver'
318 echomsg ':Nread fetch://machine/path uses fetch'
319 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
320 echomsg ':Nread http://[user@]machine/path uses http wget'
321 echomsg ':Nread rcp://[user@]machine/path uses rcp'
322 echomsg ':Nread rsync://machine[:port]/path uses rsync'
323 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
324 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000325 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000326
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000327 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000328 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000329" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000330 if match(choice,"\"$") != -1
331 " case "..."
332 let choice=strpart(choice,1,strlen(choice)-2)
333 else
334 " case "... ... ..."
335 let choice = strpart(choice,1,strlen(choice)-1)
336 let wholechoice = ""
337
338 while match(choice,"\"$") == -1
339 let wholechoice = wholechoice . " " . choice
340 let ichoice = ichoice + 1
341 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000342 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000343 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000344 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000345 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000346" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000347 return
348 endif
349 let choice= a:{ichoice}
350 endwhile
351 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
352 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000353 endif
354 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000355
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000356" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000357 let ichoice= ichoice + 1
358
359 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000360 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000361 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000362" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000363
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000364 exe 'lcd ' . fnamemodify(tmpfile,':h')
365 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000366 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000367
368 " Determine method of read (ftp, rcp, etc)
369 call s:NetMethod(choice)
370
Bram Moolenaar843ee412004-06-30 16:16:41 +0000371 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000372" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000373 if choice =~ "^.*[\/]$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000374 keepjumps call s:NetBrowse(choice)
375" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000376 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000377 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000378
379 " ============
380 " Perform Read
381 " ============
382
383 ".........................................
384 " rcp: NetRead Method #1
385 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000386" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000387 " ER: noting done with g:netrw_uid yet?
388 " ER: on Win2K" rcp machine[.user]:file tmpfile
389 " ER: if machine contains '.' adding .user is required (use $USERNAME)
390 " ER: the tmpfile is full path: rcp sees C:\... as host C
391 if s:netrw_has_nt_rcp == 1
392 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
393 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
394 else
395 " Any way needed it machine contains a '.'
396 let uid_machine = g:netrw_machine .'.'. $USERNAME
397 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000398 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000399 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
400 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
401 else
402 let uid_machine = g:netrw_machine
403 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000404 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000405" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000406 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
407 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
408 let b:netrw_lastfile = choice
409
410 ".........................................
411 " ftp + <.netrc>: NetRead Method #2
412 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000413" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000414 let netrw_fname= b:netrw_fname
415 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000416 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000417 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000418 exe "put ='"."get ".netrw_fname." ".tmpfile."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000419 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000420" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000421 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
422 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000423" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000424 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
425 endif
426 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000427 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000428 let debugkeep= &debug
429 set debug=msg
Bram Moolenaar572cb562005-08-05 21:35:02 +0000430 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000431 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000432 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000433 endif
434 bd!
435 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
436 let b:netrw_lastfile = choice
437
438 ".........................................
439 " ftp + machine,id,passwd,filename: NetRead Method #3
440 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
441 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000442" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000443 let netrw_fname= b:netrw_fname
444 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000445 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000446 if exists("g:netrw_port") && g:netrw_port != ""
447 put ='open '.g:netrw_machine.' '.g:netrw_port
448 else
449 put ='open '.g:netrw_machine
450 endif
451
452 if exists("g:netrw_ftp") && g:netrw_ftp == 1
453 put =g:netrw_uid
454 put =g:netrw_passwd
455 else
456 put ='user '.g:netrw_uid.' '.g:netrw_passwd
457 endif
458
459 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
460 put =g:netrw_ftpmode
461 endif
462 put ='get '.netrw_fname.' '.tmpfile
463
464 " perform ftp:
465 " -i : turns off interactive prompting from ftp
466 " -n unix : DON'T use <.netrc>, even though it exists
467 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000468" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000469 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000470" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000471 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
472 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
473 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000474" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000475 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000476 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000477 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000478 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000479 endif
480 bd!
481 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
482 let b:netrw_lastfile = choice
483
484 ".........................................
485 " scp: NetRead Method #4
486 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000487" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000488 if exists("g:netrw_port") && g:netrw_port != ""
489 let useport= " -P ".g:netrw_port
490 else
491 let useport= ""
492 endif
493 if g:netrw_cygwin == 1
494 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000495" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000496 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
497 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000498" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000499 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
500 endif
501 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
502 let b:netrw_lastfile = choice
503
504 ".........................................
505 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000506" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000507 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000508 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000509 echohl Error | echo "***netrw*** neither wget nor fetch command is available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000510 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000511 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000512 exit
513 endif
514
515 if match(b:netrw_fname,"#") == -1
516 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000517" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000518 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
519 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
520
521 else
522 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
523 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
524 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000525" call Decho("netrw_html<".netrw_html.">")
526" call Decho("netrw_tag <".netrw_tag.">")
527" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000528 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
529 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000530" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000531 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
532 endif
533 let b:netrw_lastfile = choice
534
535 ".........................................
536 " cadaver: NetRead Method #6
537 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000538" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000539
540 " Construct execution string (four lines) which will be passed through filter
541 let netrw_fname= b:netrw_fname
542 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000543 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000544 if exists("g:netrw_port") && g:netrw_port != ""
545 put ='open '.g:netrw_machine.' '.g:netrw_port
546 else
547 put ='open '.g:netrw_machine
548 endif
549 put ='user '.g:netrw_uid.' '.g:netrw_passwd
550
551 if g:netrw_cygwin == 1
552 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
553 put ='get '.netrw_fname.' '.cygtmpfile
554 else
555 put ='get '.netrw_fname.' '.tmpfile
556 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000557 put ='quit'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000558
559 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000560 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000561" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000562 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
563 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000564 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000565 let b:netrw_lastfile = choice
566
567 ".........................................
568 " rsync: NetRead Method #7
569 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000570" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000571 if g:netrw_cygwin == 1
572 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000573" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000574 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
575 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000576" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000577 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
578 endif
579 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
580 let b:netrw_lastfile = choice
581
582 ".........................................
583 " fetch: NetRead Method #8
584 " fetch://[user@]host[:http]/path
585 elseif b:netrw_method == 8 " read with fetch
586 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000587 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000588 echohl Error | echo "***netrw*** fetch command not available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000589 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000590 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000591 exit
592 endif
593 if exists("g:netrw_option") && g:netrw_option == ":http"
594 let netrw_option= "http"
595 else
596 let netrw_option= "ftp"
597 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000598" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000599
600 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000601" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000602 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
603 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000604" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000605 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
606 endif
607
608 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
609 let b:netrw_lastfile = choice
610
611 ".........................................
612 " sftp: NetRead Method #9
613 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000614" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000615 if g:netrw_cygwin == 1
616 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000617" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
618" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000619 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
620 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000621" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000622 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
623 endif
624 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
625 let b:netrw_lastfile = choice
626
627 ".........................................
628 else " Complain
629 echo "***warning*** unable to comply with your request<" . choice . ">"
630 endif
631 endwhile
632
633 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000634" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000635 if exists("b:netrw_method")
636 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000637 unlet b:netrw_fname
638 endif
639 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000640
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000641" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000642endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000643
644" ------------------------------------------------------------------------
645" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
646fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000647" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000648
649 if exists("*NetReadFixup")
650 " for the use of NetReadFixup (not otherwise used internally)
651 let line2= line("$")
652 endif
653
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000654 " transform paths from / to \ for Windows (except for cygwin)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000655 if &term == "win32"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000656 if g:netrw_cygwin
657 let fname= a:fname
658" call Decho("(win32 && cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000659 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000660 let fname= substitute(a:fname,'/','\\\\','ge')
661" call Decho("(win32 && !cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000662 endif
663 else
664 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000665" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000666 endif
667
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000668 if a:readcmd[0] == '0'
Bram Moolenaar81695252004-12-29 20:58:21 +0000669 " get file into buffer
Bram Moolenaar83bab712005-08-01 21:58:57 +0000670
Bram Moolenaar81695252004-12-29 20:58:21 +0000671 " record remote filename
Bram Moolenaar83bab712005-08-01 21:58:57 +0000672 let rfile= bufname(".")
673" call Decho("remotefile<".rfile.">")
674" call Dredir("ls!","starting buffer list")
675
Bram Moolenaar81695252004-12-29 20:58:21 +0000676 " rename the current buffer to the temp file (ie. fname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000677 keepalt exe "file ".fname
Bram Moolenaar83bab712005-08-01 21:58:57 +0000678" call Dredir("ls!","after renaming current buffer to <".fname.">")
679
Bram Moolenaar81695252004-12-29 20:58:21 +0000680 " edit temporary file
681 e
Bram Moolenaar83bab712005-08-01 21:58:57 +0000682" call Dredir("ls!","after editing temporary file")
683
Bram Moolenaar81695252004-12-29 20:58:21 +0000684 " rename buffer back to remote filename
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000685 keepalt exe "file ".rfile
Bram Moolenaar83bab712005-08-01 21:58:57 +0000686" call Dredir("ls!","renaming buffer back to remote filename<".rfile.">")
Bram Moolenaar81695252004-12-29 20:58:21 +0000687 let line1 = 1
688 let line2 = line("$")
689
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000690 elseif filereadable(fname)
Bram Moolenaar81695252004-12-29 20:58:21 +0000691 " read file after current line
692 let curline = line(".")
693 let lastline= line("$")
694" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname."> line#".curline)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000695 exe a:readcmd." ".v:cmdarg." ".fname
Bram Moolenaar81695252004-12-29 20:58:21 +0000696 let line1 = curline + 1
697 let line2 = line("$") - lastline + 1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000698 else
Bram Moolenaar81695252004-12-29 20:58:21 +0000699 " not readable
700" call Dret("NetGetFile : fname<".fname."> not readable")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000701 return
702 endif
703
704 " User-provided (ie. optional) fix-it-up command
705 if exists("*NetReadFixup")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000706" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000707 call NetReadFixup(a:method, line1, line2)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000708" else " Decho
709" call Decho("NetReadFixup() not called, doesn't exist")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000710 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000711
712 " update the Buffers menu
713 if has("gui") && has("gui_running")
714 silent! emenu Buffers.Refresh\ menu
715 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000716
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000717" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000718
719 " insure that we have the right filetype and that its being displayed
720 filetype detect
721 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000722" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000723endfun
724
725" ------------------------------------------------------------------------
726" NetWrite: responsible for writing a file over the net {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000727fun! netrw#NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000728" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000729
730 " option handling
731 let mod= 0
732 call s:NetOptionSave()
733
734 " Get Temporary Filename
735 let tmpfile= tempname()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000736 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
737 echohl Error | echo "***netrw*** your ".substitute(tmpfile,'[^/]\+$','','e')." directory is missing!"
738 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
739" call Dret("NetRead")
740 return
741 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000742
743 if a:0 == 0
744 let ichoice = 0
745 else
746 let ichoice = 1
747 endif
748
749 " write (selected portion of) file to temporary
750 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
751
752 while ichoice <= a:0
753
754 " attempt to repeat with previous host-file-etc
755 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000756" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000757 let choice = b:netrw_lastfile
758 let ichoice= ichoice + 1
759 else
760 exe "let choice= a:" . ichoice
761
762 " Reconstruct Choice if choice starts with '"'
763 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000764 echomsg 'NetWrite Usage:"'
765 echomsg ':Nwrite machine:path uses rcp'
766 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
767 echomsg ':Nwrite "machine id password path" uses ftp'
768 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
769 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
770 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
771 echomsg ':Nwrite rcp://machine/path uses rcp'
772 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
773 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
774 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000775 break
776
777 elseif match(choice,"^\"") != -1
778 if match(choice,"\"$") != -1
779 " case "..."
780 let choice=strpart(choice,1,strlen(choice)-2)
781 else
782 " case "... ... ..."
783 let choice = strpart(choice,1,strlen(choice)-1)
784 let wholechoice = ""
785
786 while match(choice,"\"$") == -1
787 let wholechoice= wholechoice . " " . choice
788 let ichoice = ichoice + 1
789 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000790 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000791 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000792 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000793 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000794" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000795 return
796 endif
797 let choice= a:{ichoice}
798 endwhile
799 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
800 endif
801 endif
802 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000803" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000804 let ichoice= ichoice + 1
805
806 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000807 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000808 let choice= substitute(choice,'\\','/','ge')
809 "ER: see NetRead()
810 exe 'lcd ' . fnamemodify(tmpfile,':h')
811 let tmpfile = fnamemodify(tmpfile,':t')
812 endif
813
814 " Determine method of read (ftp, rcp, etc)
815 call s:NetMethod(choice)
816
817 " =============
818 " Perform Write
819 " =============
820
821 ".........................................
822 " rcp: NetWrite Method #1
823 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000824" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000825 if s:netrw_has_nt_rcp == 1
826 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
827 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
828 else
829 let uid_machine = g:netrw_machine .'.'. $USERNAME
830 endif
831 else
832 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
833 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
834 else
835 let uid_machine = g:netrw_machine
836 endif
837 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000838" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000839 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
840 let b:netrw_lastfile = choice
841
842 ".........................................
843 " ftp + <.netrc>: NetWrite Method #2
844 elseif b:netrw_method == 2 " write with ftp + <.netrc>
845 let netrw_fname = b:netrw_fname
846 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000847 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000848 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000849" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000850 exe "put ='"."put ".tmpfile." ".netrw_fname."'"
851" call Decho("put ='"."put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000852 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000853" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000854 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000855 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000856" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000857 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000858 endif
859 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
860 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000861 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000862 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000863 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000864 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000865 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000866 endif
867 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000868 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000869
870 ".........................................
871 " ftp + machine, id, passwd, filename: NetWrite Method #3
872 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
873 let netrw_fname= b:netrw_fname
874 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000875 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000876 if exists("g:netrw_port") && g:netrw_port != ""
877 put ='open '.g:netrw_machine.' '.g:netrw_port
878 else
879 put ='open '.g:netrw_machine
880 endif
881 if exists("g:netrw_ftp") && g:netrw_ftp == 1
882 put =g:netrw_uid
883 put =g:netrw_passwd
884 else
885 put ='user '.g:netrw_uid.' '.g:netrw_passwd
886 endif
887 put ='put '.tmpfile.' '.netrw_fname
888 " save choice/id/password for future use
889 let b:netrw_lastfile = choice
890
891 " perform ftp:
892 " -i : turns off interactive prompting from ftp
893 " -n unix : DON'T use <.netrc>, even though it exists
894 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000895" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000896 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000897" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000898 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
899 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
900 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000901 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000902 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000903 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000904 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000905 let mod=1
906 endif
907 bd!
908
909 ".........................................
910 " scp: NetWrite Method #4
911 elseif b:netrw_method == 4 " write with scp
912 if exists("g:netrw_port") && g:netrw_port != ""
913 let useport= " -P ".g:netrw_port
914 else
915 let useport= ""
916 endif
917 if g:netrw_cygwin == 1
918 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000919" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000920 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
921 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000922" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000923 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
924 endif
925 let b:netrw_lastfile = choice
926
927 ".........................................
928 " http: NetWrite Method #5
929 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000930 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000931 echohl Error | echo "***netrw*** currently <netrw.vim> does not support writing using http:" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000932 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000933 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000934
935 ".........................................
936 " dav: NetWrite Method #6
937 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000938" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000939
940 " Construct execution string (four lines) which will be passed through filter
941 let netrw_fname= b:netrw_fname
942 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000943 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000944 if exists("g:netrw_port") && g:netrw_port != ""
945 put ='open '.g:netrw_machine.' '.g:netrw_port
946 else
947 put ='open '.g:netrw_machine
948 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000949 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000950
951 if g:netrw_cygwin == 1
952 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
953 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000954 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000955 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000956 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000957
958 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000959 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000960" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000961 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
962 bd!
963 let b:netrw_lastfile = choice
964
965 ".........................................
966 " rsync: NetWrite Method #7
967 elseif b:netrw_method == 7 " write with rsync
968 if g:netrw_cygwin == 1
969 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000970" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000971 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000972 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000973" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000974 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000975 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000976 let b:netrw_lastfile = choice
977
978 ".........................................
979 " scp: NetWrite Method #9
980 elseif b:netrw_method == 9 " write with sftp
981 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000982 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
983 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
984 else
985 let uid_machine = g:netrw_machine
986 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000987 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000988 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000989 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000990 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000991" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000992 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
993 bd!
994 let b:netrw_lastfile= choice
995
996 ".........................................
997 else " Complain
998 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000999 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001000 endwhile
1001
1002 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001003" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001004 let result=delete(tmpfile)
1005 call s:NetOptionRestore()
1006
1007 if a:firstline == 1 && a:lastline == line("$")
1008 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001009 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001010
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001011" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001012endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001013
Bram Moolenaar83bab712005-08-01 21:58:57 +00001014" ===========================================
1015" Remote Directory Browsing Support: {{{1
1016" ===========================================
1017
Bram Moolenaar843ee412004-06-30 16:16:41 +00001018" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001019" of the contents of a remote directory. It is assumed that the
1020" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1021" with the requested remote hostname first.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001022fun! s:NetBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001023 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
1024" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".w:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001025
Bram Moolenaar488c6512005-08-11 20:09:58 +00001026 if exists("s:netrw_skipbrowse")
1027 unlet s:netrw_skipbrowse
1028" call Dret("NetBrowse")
1029 return
1030 endif
1031
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001032 call s:NetOptionSave()
1033
Bram Moolenaar843ee412004-06-30 16:16:41 +00001034 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001035 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1036" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001037 if !executable("ftp")
1038 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001039 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ftp" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001040 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001041 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001042 call s:NetOptionRestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001043" call Dret("NetBrowse")
1044 return
1045 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001046 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001047 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001048 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ssh" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001049 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001050 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001051
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001052 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001053" call Dret("NetBrowse")
1054 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001055 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001056
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001057 " use buffer-oriented WinVars if buffer ones exist but window ones don't
1058 call s:UseBufWinVars()
1059
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001060 " make this buffer modifiable
Bram Moolenaar83bab712005-08-01 21:58:57 +00001061 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001062
1063 " analyze a:dirname and g:netrw_list_cmd
1064 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001065 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001066" call Decho("dirpat<".dirpat.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001067 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001068 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001069 echohl Error | echo "***netrw*** netrw doesn't understand your dirname<".dirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001070 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001071 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001072 call s:NetOptionRestore()
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001073" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001074 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001075 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001076
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001077 let method = substitute(dirname,dirpat,'\1','')
1078 let user = substitute(dirname,dirpat,'\2','')
1079 let machine = substitute(dirname,dirpat,'\3','')
1080 let path = substitute(dirname,dirpat,'\4','')
1081 let fname = substitute(dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001082" call Decho("set up method <".method .">")
1083" call Decho("set up user <".user .">")
1084" call Decho("set up machine<".machine.">")
1085" call Decho("set up path <".path .">")
1086" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001087
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001088 if method == "ftp" || method == "http"
1089 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001090 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001091 else
1092 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1093 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001094
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001095 if exists("b:netrw_method")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001096" call Decho("setting w:netrw_method<".b:netrw_method.">")
1097 let w:netrw_method= b:netrw_method
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001098 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001099
Bram Moolenaar8299df92004-07-10 09:47:34 +00001100 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001101 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
Bram Moolenaar572cb562005-08-05 21:35:02 +00001102 echohl WarningMsg | echo "***netrw*** windows' ftp doesn't support time/size sorts (get cygwin, set g:netrw_cygwin)" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001103 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001104 else
1105 if g:netrw_sort_by =~ "^t"
1106 let listcmd= listcmd."t"
1107 elseif g:netrw_sort_by =~ "^s"
1108 let listcmd= listcmd."S"
1109 endif
1110 " optionally sort in reverse
1111 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1112 let listcmd= listcmd."r"
1113 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001114 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001115
1116" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001117 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001118" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001119 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001120 redraw!
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001121 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001122" call Dret("NetBrowse : symlink")
1123 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001124
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001125 elseif fname !~ '[\/]$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001126 " looks like a regular file, attempt transfer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001127" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001128
1129 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001130 " "this is a directory" indicator (/). There shouldn't be one of those,
1131 " anyway.
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001132 let path= substitute(path,'[*=@|]\r\=$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001133" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001134
1135 " remote-read the requested file into current buffer
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001136 keepjumps keepalt enew!
1137 set ma
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001138" call Decho("exe file .method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001139 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001140 exe "silent doau BufReadPre ".fname
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001141 silent call netrw#NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001142 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001143 keepjumps 1d
Bram Moolenaar572cb562005-08-05 21:35:02 +00001144
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001145 " save certain window-oriented variables into buffer-oriented variables
1146 call s:BufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001147 call s:NetOptionRestore()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001148 setlocal nomod
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001149
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001150" call Dret("NetBrowse : file<".fname.">")
1151 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001152 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001153
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001154 " ---------------------------------------------------------------------
1155 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001156" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001157 " set up new buffer and map
1158 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001159 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001160" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001161 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001162 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001163" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001164 exe "b ".bufnamenr
1165 if line("$") >= 5
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001166 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001167" call Dret("NetBrowse")
1168 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001169 endif
1170 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001171" call Decho("generate a new buffer")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001172 keepjumps keepalt enew!
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001173 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001174
1175 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001176 setlocal bt=nofile bh=wipe nobl noswf
1177 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001178" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001179 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001180" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001181 setlocal bh=hide bt=nofile nobl nonu
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001182
1183 " save current directory on directory history list
1184 call <SID>NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001185
1186 " set up buffer-local mappings
1187" call Decho("set up buffer-local mappings")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001188 nnoremap <buffer> <silent> <cr> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00001189 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001190 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001191 nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001192 if w:netrw_longlist != 2
1193 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1194 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1195 endif
1196 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1197 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001198 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1199 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001200 nnoremap <buffer> <silent> o :call <SID>NetSplit(0)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001201 nnoremap <buffer> <silent> O :call <SID>NetObtain()<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001202 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1203 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
1204 nnoremap <buffer> <silent> s :call <SID>NetSaveWordPosn()<bar>let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name'<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<bar>call <SID>NetRestoreWordPosn()<cr>
1205 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001206 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1207 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001208 nnoremap <buffer> <silent> v :call <SID>NetSplit(1)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001209 nnoremap <buffer> <silent> x :call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
1210 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
1211 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001212 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001213 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001214 exe 'nnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001215 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001216 exe 'nnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001217 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001218 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaar83bab712005-08-01 21:58:57 +00001219 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001220
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001221 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001222" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1223 keepjumps put ='\" ==========================================================================='
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001224 keepjumps put ='\" Netrw Remote Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001225 keepjumps put ='\" '.bufname
Bram Moolenaar488c6512005-08-11 20:09:58 +00001226 let w:netrw_bannercnt = 7
1227 let sortby = g:netrw_sort_by
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001228 if g:netrw_sort_direction =~ "^r"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001229 let sortby = sortby." reversed"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001230 endif
1231
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001232 if g:netrw_sort_by =~ "^n"
1233 " sorted by name
Bram Moolenaar488c6512005-08-11 20:09:58 +00001234 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001235 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001236 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1237 else
1238 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001239 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001240 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001241 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001242 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001243 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001244 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001245 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001246 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001247 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001248 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001249 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1250 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001251
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001252 " remote read the requested directory listing
1253 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1254 " Note that not all ftp servers honor the options for ls
1255 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001256 " use ftp to get remote file listing
1257" call Decho("use ftp to get remote file listing")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001258 call s:NetBrowseFtpCmd(path,listcmd)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001259 keepjumps 1d
1260
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001261 if w:netrw_longlist == 0 || w:netrw_longlist == 2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001262 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001263" call Decho("generate short listing")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001264 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001265
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001266 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001267 if g:netrw_ftp_browse_reject != ""
1268 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1269 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001270 silent! keepjumps %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001271
1272 " if there's no ../ listed, then put ./ and ../ in
1273 let line1= line(".")
1274 keepjumps 1
1275 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1276 let line2= line(".")
1277 if line2 == 0
1278 keepjumps put='../'
1279 keepjumps put='./'
1280 endif
1281 exe "keepjumps ".line1
1282 keepjumps norm! 0
1283
1284 " more cleanup
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001285 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1286 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
1287 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001288 endif
1289
1290 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001291 " use ssh to get remote file listing
1292" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001293 let shq= &shq? &shq : ( &sxq? &sxq : "'")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001294" call Decho("exe silent r! ".listcmd." '".shq.escape(path,s:netrw_cd_escape).shq."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001295 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1296 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001297 " cleanup
1298 if g:netrw_ftp_browse_reject != ""
1299 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001300 endif
1301 endif
1302
1303 " set up syntax highlighting
1304 if has("syntax")
1305 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00001306 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001307 setlocal ft=
Bram Moolenaar572cb562005-08-05 21:35:02 +00001308 " Ugly workaround -- when syntax highlighting is off and laststatus==2,
1309 " sometimes the laststatus highlight bleeds into the entire display.
1310 " Only seems to happen with remote browsing. Weird.
1311 redraw
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001312 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001313 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001314
1315 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001316 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001317 if g:netrw_hide && g:netrw_list_hide != ""
1318 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001319 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001320
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001321 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00001322 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001323" call Decho("manipulate long listing")
1324
1325 if method == "ftp"
1326 " cleanup
Bram Moolenaar488c6512005-08-11 20:09:58 +00001327 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001328 while getline(".") =~ g:netrw_ftp_browse_reject
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001329 keepjumps d
1330 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001331 " if there's no ../ listed, then put ./ and ../ in
1332 let line1= line(".")
1333 keepjumps 1
1334 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1335 let line2= line(".")
1336 if line2 == 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00001337 exe 'keepjumps '.w:netrw_bannercnt."put='./'"
1338 exe 'keepjumps '.w:netrw_bannercnt."put='../'"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001339 endif
1340 exe "keepjumps ".line1
1341 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001342 endif
1343
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001344 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e'
1345 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1346 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001347 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001348
Bram Moolenaar488c6512005-08-11 20:09:58 +00001349 if line("$") >= w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001350 if g:netrw_sort_by =~ "^n"
1351 call s:SetSort()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001352 if g:netrw_sort_direction =~ 'n'
1353 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001354 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001355 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001356 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001357 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001358 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001359 if w:netrw_longlist == 1
1360 " shorten the list to keep its width <= winwidth characters
1361 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001362 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001363 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001364 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001365
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001366 call s:NetrwWideListing()
1367 if line("$") >= w:netrw_bannercnt
1368 " place cursor on the top-left corner of the file listing
1369 exe "keepjumps ".w:netrw_bannercnt
1370 norm! 0
1371 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001372
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001373 call s:NetOptionRestore()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001374 setlocal nomod noma nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001375
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001376" call Dret("NetBrowse")
1377 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001378endfun
1379
1380" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001381" NetBrowseChgDir: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001382fun! s:NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001383" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001384
1385 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001386 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001387
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001388 if newdir !~ '[\/]$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001389 " handling a file
1390 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001391" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001392
1393 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001394 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001395" call Decho("refresh directory listing")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001396 setlocal ma nobl bh=hide
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001397 %d
1398
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001399 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001400 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001401 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001402
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001403 if trailer =~ '^\%(\.\./\)*$'
1404 " tack on a ../"
1405 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001406
1407 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001408 " strip off a directory name from dirname
1409 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001410 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001411" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001412
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001413 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001414 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001415 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001416" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001417 endif
1418
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001419" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001420 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001421endfun
1422
Bram Moolenaar843ee412004-06-30 16:16:41 +00001423" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001424" NetGetWord: it gets the directory named under the cursor
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001425fun! s:NetGetWord()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001426" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001427 call s:UseBufWinVars()
1428
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001429 " insure that w:netrw_longlist is set up
1430 if !exists("w:netrw_longlist")
1431 if exists("g:netrw_longlist")
1432 let w:netrw_longlist= g:netrw_longlist
1433 else
1434 let w:netrw_longlist= 0
1435 endif
1436 endif
1437
Bram Moolenaar488c6512005-08-11 20:09:58 +00001438 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001439 " Active Banner support
1440" call Decho("active banner handling")
1441 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001442 let dirname= "./"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001443 let curline= getline(".")
1444 if curline =~ '"\s*Sorted by\s'
1445 norm s
1446 let s:netrw_skipbrowse= 1
1447 echo 'Pressing "s" also works'
1448 elseif curline =~ '"\s*Sort sequence:'
1449 let s:netrw_skipbrowse= 1
1450 echo 'Press "S" to edit sorting sequence'
1451 elseif curline =~ '"\s*Quick Help:'
1452 norm ?
1453 let s:netrw_skipbrowse= 1
1454 echo 'Pressing "?" also works'
1455 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
1456 norm a
1457 let s:netrw_skipbrowse= 1
1458 echo 'Pressing "a" also works'
1459 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001460 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00001461 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001462
1463 elseif w:netrw_longlist == 0
1464" call Decho("thin column handling")
1465 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001466 let dirname= getline(".")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001467
1468 elseif w:netrw_longlist == 1
1469" call Decho("long column handling")
1470 norm! 0
1471 let dirname= substitute(getline("."),'^\(\%(\S\+\s\)*\S\+\).\{-}$','\1','e')
1472
1473 else
1474" call Decho("obtain word from wide listing")
1475 let dirname= getline(".")
1476
1477 if !exists("b:netrw_cpf")
1478 let b:netrw_cpf= 0
1479 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
1480" call Decho("computed cpf")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001481 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001482
1483 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
1484" call Decho("virtcol=".virtcol(".")." cpf=".b:netrw_cpf." bannercnt=".w:netrw_bannercnt." filestart=".filestart)
1485" call Decho("1: dirname<".dirname.">")
1486 if filestart > 0|let dirname= substitute(dirname,'^.\{'.filestart.'}','','')|endif
1487" call Decho("2: dirname<".dirname.">")
1488 let dirname = substitute(dirname,'^\(.\{'.b:netrw_cpf.'}\).*$','\1','e')
1489" call Decho("3: dirname<".dirname.">")
1490 let dirname = substitute(dirname,'\s\+$','','e')
1491" call Decho("4: dirname<".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001492 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001493
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001494" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001495 return dirname
1496endfun
1497
1498" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001499" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001500fun! s:NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001501" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1502" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001503
1504 " preparation for removing multiple files/directories
1505 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001506 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001507
1508 " remove multiple files and directories
1509 while ctr <= a:lastline
1510 exe ctr
1511
1512 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001513 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001514" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001515
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001516 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001517 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001518 if !all
1519 echohl Statement
1520 call inputsave()
1521 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1522 call inputrestore()
1523 echohl NONE
1524 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1525 if ok =~ 'a\%[ll]'
1526 let all= 1
1527 endif
1528 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001529
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001530 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001531 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001532 silent! keepjumps .,$d
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001533 call s:NetBrowseFtpCmd(a:path,"delete ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001534 else
1535 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1536" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1537 let ret= system(netrw_rm_cmd)
1538" call Decho("returned=".ret." errcode=".v:shell_error)
1539 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001540 elseif ok =~ 'q\%[uit]'
1541 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001542 endif
1543
1544 else
1545 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001546 if !all
1547 call inputsave()
1548 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1549 call inputrestore()
1550 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1551 if ok =~ 'a\%[ll]'
1552 let all= 1
1553 endif
1554 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001555
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001556 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001557 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001558 call s:NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001559 else
1560 let rmfile = a:path.rmfile
1561 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1562" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1563 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001564" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001565
1566 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001567 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001568" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1569 let ret= system(netrw_rmf_cmd)
1570" call Decho("returned=".ret." errcode=".v:shell_error)
1571
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001572 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001573 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001574 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001575 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001576 endif
1577 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001578
1579 elseif ok =~ 'q\%[uit]'
1580 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001581 endif
1582 endif
1583
1584 let ctr= ctr + 1
1585 endwhile
1586
1587 " refresh the directory
1588 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001589" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001590 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1591 exe curline
1592
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001593" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001594endfun
1595
1596" ---------------------------------------------------------------------
1597" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001598fun! s:NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001599" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001600
1601 " preparation for removing multiple files/directories
1602 let ctr = a:firstline
1603 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1604
1605 " attempt to rename files/directories
1606 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001607 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001608
1609 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001610 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001611" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001612
1613 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001614 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001615 call inputrestore()
1616
Bram Moolenaar488c6512005-08-11 20:09:58 +00001617 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001618 call s:NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001619 else
1620 let oldname= a:path.oldname
1621 let newname= a:path.newname
1622" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1623 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1624 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001625
1626 let ctr= ctr + 1
1627 endwhile
1628
1629 " refresh the directory
1630 let curline= line(".")
1631 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001632 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001633" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001634endfun
1635
1636" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00001637" NetRefresh: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001638fun! s:NetRefresh(dirname)
Bram Moolenaar572cb562005-08-05 21:35:02 +00001639" call Dfunc("NetRefresh(dirname<".a:dirname.">)")
1640 set ma
1641 %d
1642 call <SID>NetBrowse(dirname)
1643 redraw!
1644" call Dret("NetRefresh")
1645endfun
1646
1647" ---------------------------------------------------------------------
Bram Moolenaar488c6512005-08-11 20:09:58 +00001648" NetSplit: mode {{{2
1649" =0 : net and o
1650" =1 : net and v
1651" =2 : local and o
1652" =3 : local and v
1653fun! s:NetSplit(mode)
1654" call Dfunc("NetSplit(mode=".a:mode.")")
1655
1656 call s:SaveWinVars()
1657 if a:mode == 0
1658 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1659 call s:CopyWinVars()
1660 exe "norm! 0"
1661 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
1662 elseif a:mode ==1
1663 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1664 call s:CopyWinVars()
1665 exe "norm! 0"
1666 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
1667 elseif a:mode ==2
1668 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1669 call s:CopyWinVars()
1670 exe "norm! 0"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001671 call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001672 else
1673 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1674 call s:CopyWinVars()
1675 exe "norm! 0"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001676 call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001677 endif
1678
1679" call Dret("NetSplit")
1680endfun
1681
1682" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001683" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001684" files given their extension. Passes 0=local, 1=remote
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001685fun! s:NetBrowseX(fname,remote)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001686" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001687
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001688 " set up the filename
1689 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001690 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001691 if has("win32") || has("win95") || has("win64") || has("win16")
1692 let exten= substitute(exten,'^.*$','\L&\E','')
1693 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001694 let fname= escape(a:fname,"%#")
1695" call Decho("fname<".fname."> after escape()")
1696
1697 if a:remote == 1
1698 " create a local copy
1699 let fname= tempname().".".exten
1700" call Decho("create a local copy of <".a:fname."> as <".fname.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001701 exe "silent keepjumps bot 1new ".a:fname
Bram Moolenaar572cb562005-08-05 21:35:02 +00001702 set bh=delete
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001703 exe "w! ".fname
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001704 q
1705 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001706" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001707
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001708 " set up redirection
1709 if &srr =~ "%s"
1710 let redir= substitute(&srr,"%s","/dev/null"."")
1711 else
1712 let redir= &srr . "/dev/null"
1713 endif
1714" call Decho("redir:".redir.":")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001715
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001716 " execute the file handler
1717 if has("win32") || has("win64")
1718" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1719 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1720 let ret= v:shell_error
1721
1722 elseif has("unix") && executable("kfmclient")
1723" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1724 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1725 let ret= v:shell_error
1726
1727 elseif has("unix") && executable("gnome-open")
1728" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1729 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1730 let ret= v:shell_error
1731
1732 elseif exten != "" && exists("*NetrwFileHandler_".exten)
1733" call Decho("let ret= NetrwFileHandler_".exten.'("'.fname.'")')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001734 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001735 endif
1736 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001737
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001738 " cleanup: remove temporary file,
1739 " delete current buffer if success with handler,
1740 " return to prior buffer (directory listing)
1741 if a:remote == 1 && fname != a:fname
1742" call Decho("deleting temporary file<".fname.">")
1743 call delete(fname)
1744 endif
1745
1746 if a:remote == 1
Bram Moolenaar572cb562005-08-05 21:35:02 +00001747 set bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001748 exe "norm! \<c-o>"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001749 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001750 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001751
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001752" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001753endfun
1754
1755" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001756" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1757" This function assumes that a long listing will be received. Size, time,
1758" and reverse sorts will be requested of the server but not otherwise
1759" enforced here.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001760fun! s:NetBrowseFtpCmd(path,cmd)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001761" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".w:netrw_method)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001762
1763 " because WinXX ftp uses unix style input
1764 " curline is one more than the bannercnt in order to account
1765 " for the unwanted first blank line (doing a :put to an empty
1766 " buffer yields a blank first line)
1767 let ffkeep= &ff
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001768 setlocal ma ff=unix
Bram Moolenaar488c6512005-08-11 20:09:58 +00001769 let curline= w:netrw_bannercnt+1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001770 exe "silent! keepjumps ".curline.",$d"
1771
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001772 ".........................................
1773 if w:netrw_method == 2 || w:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001774 " ftp + <.netrc>: Method #2
1775 if a:path != ""
1776 put ='cd '.a:path
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001777" call Decho("ftp: cd ".a:path)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001778 endif
1779 exe "put ='".a:cmd."'"
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001780" call Decho("ftp: ".a:cmd)
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001781" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001782 if exists("g:netrw_port") && g:netrw_port != ""
1783" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1784 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1785 else
1786" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1787 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1788 endif
1789
1790 ".........................................
Bram Moolenaar488c6512005-08-11 20:09:58 +00001791 elseif w:netrw_method == 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001792 " ftp + machine,id,passwd,filename: Method #3
1793 setlocal ff=unix
1794 if exists("g:netrw_port") && g:netrw_port != ""
1795 put ='open '.g:netrw_machine.' '.g:netrw_port
1796 else
1797 put ='open '.g:netrw_machine
1798 endif
1799
1800 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1801 put =g:netrw_uid
1802 put =g:netrw_passwd
1803 else
1804 put ='user '.g:netrw_uid.' '.g:netrw_passwd
1805 endif
1806
1807 if a:path != ""
1808 put ='cd '.a:path
1809 endif
1810 exe "put ='".a:cmd."'"
1811
1812 " perform ftp:
1813 " -i : turns off interactive prompting from ftp
1814 " -n unix : DON'T use <.netrc>, even though it exists
1815 " -n win32: quit being obnoxious about password
1816" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1817 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1818
1819 ".........................................
1820 else
1821 echo "***warning*** unable to comply with your request<" . choice . ">"
1822 endif
1823
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001824 " cleanup for Windows
1825 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001826 silent! keepjumps! %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001827 endif
1828 if a:cmd == "dir"
1829 " infer directory/link based on the file permission string
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001830 silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1831 silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/
1832 if w:netrw_longlist == 0 || w:netrw_longlist == 2
1833 exe "silent! keepjumps ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001834 endif
1835 endif
1836
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001837 " ftp's ls doesn't seem to include ./ or ../
1838 if !search('^\.\/$','wn')
1839 exe 'keepjumps '.curline
1840 if a:path !~ '^$'
1841 put ='../'
1842 endif
1843 put ='./'
1844 exe 'keepjumps '.curline
1845 endif
1846
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001847 " restore settings
1848 let &ff= ffkeep
1849" call Dret("NetBrowseFtpCmd")
1850endfun
1851
1852" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001853" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1854" separated patterns given in g:netrw_list_hide
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001855fun! s:NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001856" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001857
1858 let listhide= g:netrw_list_hide
1859 while listhide != ""
1860 if listhide =~ ','
1861 let hide = substitute(listhide,',.*$','','e')
1862 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1863 else
1864 let hide = listhide
1865 let listhide= ""
1866 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001867
1868 " Prune the list by hiding any files which match
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001869" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001870 if g:netrw_hide == 1
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001871 exe 'silent keepjumps '.w:netrw_bannercnt.',$g~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001872 elseif g:netrw_hide == 2
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001873 exe 'silent keepjumps '.w:netrw_bannercnt.',$v~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001874 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001875 endwhile
1876
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001877" call Dret("NetrwListHide")
1878endfun
1879
1880" ---------------------------------------------------------------------
1881" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001882fun! s:NetHideEdit(mode)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001883" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001884
1885 call inputsave()
1886 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1887 call inputrestore()
1888
1889 " refresh the listing
1890 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001891 if a:mode == 0
1892 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1893 else
Bram Moolenaar572cb562005-08-05 21:35:02 +00001894 silent call s:LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001895 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001896
1897" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001898endfun
1899
Bram Moolenaar8299df92004-07-10 09:47:34 +00001900" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001901" NetSortSequence: allows user to edit the sorting sequence
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001902fun! s:NetSortSequence(mode)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001903" call Dfunc("NetSortSequence(mode=".a:mode.")")
1904
1905 call inputsave()
1906 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
1907 call inputrestore()
1908
1909 " refresh the listing
1910 let g:netrw_sort_sequence= newsortseq
1911 if a:mode == 0
1912 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1913 else
1914 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
1915 endif
1916
1917" call Dret("NetSortSequence")
1918endfun
1919
1920" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001921" NetLongList: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001922fun! s:NetLongList(mode)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001923" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".w:netrw_longlist)
1924 let fname = s:NetGetWord()
1925 let w:netrw_longlist = (w:netrw_longlist + 1) % 3
1926" call Decho("fname<".fname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001927
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001928 if w:netrw_longlist == 0
1929 " use one column listing
1930" call Decho("use one column list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001931 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1932
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001933 elseif w:netrw_longlist == 1
1934 " use long list
1935" call Decho("use long list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001936 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001937
1938 else
1939 " give wide list
1940" call Decho("use wide list")
1941 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001942 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001943 setlocal ma
Bram Moolenaar572cb562005-08-05 21:35:02 +00001944
1945 " clear buffer - this will cause NetBrowse/LocalBrowse to do a refresh
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001946 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00001947
1948 " refresh the listing
1949 if a:mode == 0
1950 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1951 else
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001952 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001953 endif
1954
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001955 " keep cursor on the filename
1956 silent keepjumps $
1957 if fname =~ '/$'
1958 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
1959 else
1960 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
1961 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001962
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001963" call Dret("NetLongList : w:netrw_longlist=".w:netrw_longlist)
1964endfun
1965
1966" ---------------------------------------------------------------------
1967" NetrwWideListing: {{{2
1968fun! s:NetrwWideListing()
1969" call Dfunc("NetrwWideListing()")
1970
1971 if w:netrw_longlist == 2
1972 " look for longest filename (cpf=characters per filename)
1973 " cpf: characters per file
1974 " fpl: files per line
1975 " fpc: files per column
1976 set ma
1977 let b:netrw_cpf= 0
1978 if line("$") >= w:netrw_bannercnt
1979 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
1980 else
1981" call Dret("NetrwWideListing")
1982 return
1983 endif
1984" call Decho("max file strlen+1=".b:netrw_cpf)
1985 let b:netrw_cpf= b:netrw_cpf + 1
1986
1987 " determine qty files per line (fpl)
1988 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
1989" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
1990
1991 " make wide display
1992 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=printf("%-'.b:netrw_cpf.'s",submatch(0))/'
1993 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
1994 let newcolstart = w:netrw_bannercnt + fpc
1995 let newcolend = newcolstart + fpc - 1
1996" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
1997 while line("$") >= newcolstart
1998 if newcolend > line("$") | let newcolend= line("$") | endif
1999 let newcolqty= newcolend - newcolstart
2000 exe newcolstart
2001 if newcolqty == 0
2002 exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
2003 else
2004 exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
2005 endif
2006 exe "silent keepjumps ".newcolstart.','.newcolend.'d'
2007 exe 'silent keepjumps '.w:netrw_bannercnt
2008 endwhile
2009 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
2010 set noma nomod
2011 endif
2012
2013" call Dret("NetrwWideListing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002014endfun
2015
2016" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002017" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002018" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
2019" the same word even though the sorting has changed its order of appearance.
2020fun! s:NetSaveWordPosn()
2021" call Dfunc("NetSaveWordPosn()")
2022 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
2023" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
2024endfun
2025
2026" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002027" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002028fun! s:NetRestoreWordPosn()
2029" call Dfunc("NetRestoreWordPosn()")
2030 silent! call search(s:netrw_saveword,'w')
2031" call Dret("NetRestoreWordPosn")
2032endfun
2033
2034" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002035" NetMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002036fun! s:NetMakeDir(usrhost)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002037" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
2038
2039 " get name of new directory from user. A bare <CR> will skip.
2040 " if its currently a directory, also request will be skipped, but with
2041 " a message.
2042 call inputsave()
2043 let newdirname= input("Please give directory name: ")
2044 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002045" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002046
2047 if newdirname == ""
2048" call Dret("NetMakeDir : user aborted with bare <cr>")
2049 return
2050 endif
2051
2052 if a:usrhost == ""
2053
2054 " Local mkdir:
2055 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002056 let fullnewdir= b:netrw_curdir.'/'.newdirname
2057" call Decho("fullnewdir<".fullnewdir.">")
2058 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002059 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002060 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a directory!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002061 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002062 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002063" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
2064 return
2065 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002066 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002067 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002068 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a file!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002069 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002070 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002071" call Dret("NetMakeDir : file<".newdirname."> exists previously")
2072 return
2073 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002074
2075 " requested new local directory is neither a pre-existing file or
2076 " directory, so make it!
2077 if exists("*mkdir")
2078 call mkdir(fullnewdir,"p")
2079 else
2080 let netrw_origdir= s:NetGetcwd(1)
2081 exe 'cd '.b:netrw_curdir
2082" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
2083" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
2084 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002085 if !g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002086 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002087
Bram Moolenaar8299df92004-07-10 09:47:34 +00002088 if v:shell_error == 0
2089 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002090" call Decho("refresh listing")
2091 let linenum= line(".")
2092 norm! H0
2093 let hline = line(".")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002094 set ma|norm! 2D
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002095 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
2096 exe "norm! ".hline."G0z\<CR>"
2097 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002098 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002099 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002100 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002101 endif
2102 redraw!
2103
2104 else
2105 " Remote mkdir:
2106 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002107 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002108" call Decho("exe silent! !".mkdircmd." ".newdirname)
2109 exe "silent! !".mkdircmd." ".newdirname
2110 if v:shell_error == 0
2111 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002112 let linenum= line(".")
2113 norm! H0
2114 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002115 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002116 exe "norm! ".hline."G0z\<CR>"
2117 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002118 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002119 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002120 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002121 endif
2122 redraw!
2123 endif
2124
2125" call Dret("NetMakeDir")
2126endfun
2127
2128" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002129" NetBookmarkDir: {{{2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002130" 0: (user: <b>) bookmark current directory
2131" 1: (user: <B>) change to the bookmarked directory
2132" 2: (user: <q>) list bookmarks
2133" 3: (LocalBrowse) record current directory history
2134" 4: (user: <u>) go up (previous) bookmark
2135" 5: (user: <U>) go down (next) bookmark
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002136fun! s:NetBookmarkDir(chg,curdir)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002137" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002138 if exists("w:netrw_bannercnt") && line(".") <= w:netrw_bannercnt
2139 " looks like a "b" was pressed while in the banner region
2140 if line("$") > w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002141 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00002142 endif
2143 echo ""
2144" call Dret("NetBookmarkDir - ignoring")
2145 return
2146 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002147
2148 if a:chg == 0
2149 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002150 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
2151 if !exists("g:NETRW_BOOKMARKMAX")
2152 let g:NETRW_BOOKMARKMAX= v:count
2153 elseif v:count > g:NETRW_BOOKMARKMAX
2154 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002155 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002156 echo "bookmarked the current directory"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002157
2158 elseif a:chg == 1
2159 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002160 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
2161 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002162 else
2163 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2164 endif
2165
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002166 elseif a:chg == 2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002167 " list user's bookmarks
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002168 if exists("g:NETRW_BOOKMARKMAX")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002169" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
2170 let cnt= 0
2171 while cnt <= g:NETRW_BOOKMARKMAX
2172 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
2173" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
2174 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
2175 endif
2176 let cnt= cnt + 1
2177 endwhile
2178 endif
2179
2180 " list directory history
2181 let cnt = g:NETRW_DIRHIST_CNT
2182 let first = 1
2183 let histcnt = 0
2184 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2185" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
2186 let histcnt= histcnt + 1
2187 if exists("g:NETRW_DIRHIST_{cnt}")
2188" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
2189 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002190 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002191 let first = 0
2192 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2193 if cnt < 0
2194 let cnt= cnt + g:netrw_dirhistmax
2195 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002196 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002197
2198 elseif a:chg == 3
Bram Moolenaar572cb562005-08-05 21:35:02 +00002199 " saves most recently visited directories (when they differ)
2200 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
2201 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2202 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
2203" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2204 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002205
2206 elseif a:chg == 4
2207 " u: change to the previous directory stored on the history list
2208 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2209 if g:NETRW_DIRHIST_CNT < 0
2210 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2211 endif
2212 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2213" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2214 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2215 else
2216 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2217 echo "Sorry, no predecessor directory exists yet"
2218 endif
2219
2220 elseif a:chg == 5
2221 " U: change to the subsequent directory stored on the history list
2222 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2223 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2224" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2225 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2226 else
2227 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2228 if g:NETRW_DIRHIST_CNT < 0
2229 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2230 endif
2231 echo "Sorry, no successor directory exists yet"
2232 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002233 endif
2234" call Dret("NetBookmarkDir")
2235endfun
2236
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002237" ---------------------------------------------------------------------
2238" NetObtain: obtain file under cursor (for remote browsing support) {{{2
2239fun! s:NetObtain()
2240 if !exists("s:netrw_users_stl")
2241 let s:netrw_users_stl= &stl
2242 endif
2243 let fname= expand("<cWORD>")
2244 exe 'set stl=%f\ %h%m%r%=Obtaining\ '.escape(fname,' ')
2245 redraw!
2246
2247" call Dfunc("NetObtain() method=".w:netrw_method)
2248 if exists("w:netrw_method") && w:netrw_method =~ '[235]'
2249 if executable("ftp")
2250 let curdir = expand("%")
2251 let path = substitute(curdir,'ftp://[^/]\+/','','e')
2252 let curline= line(".")
2253 let endline= line("$")+1
2254 set ma
2255 keepjumps $
2256
2257 ".........................................
2258 if w:netrw_method == 2
2259 " ftp + <.netrc>: Method #2
2260 if path != ""
2261 put ='cd '.path
2262" call Decho("ftp: cd ".path)
2263 endif
2264 put ='get '.fname
2265" call Decho("ftp: get ".fname)
2266 if exists("g:netrw_port") && g:netrw_port != ""
2267" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
2268 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
2269 else
2270" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
2271 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
2272 endif
2273
2274 ".........................................
2275 elseif w:netrw_method == 3
2276 " ftp + machine,id,passwd,filename: Method #3
2277 setlocal ff=unix
2278 if exists("g:netrw_port") && g:netrw_port != ""
2279 put ='open '.g:netrw_machine.' '.g:netrw_port
2280" call Decho('ftp: open '.g:netrw_machine.' '.g:netrw_port)
2281 else
2282 put ='open '.g:netrw_machine
2283" call Decho('ftp: open '.g:netrw_machine
2284 endif
2285
2286 if exists("g:netrw_ftp") && g:netrw_ftp == 1
2287 put =g:netrw_uid
2288 put =g:netrw_passwd
2289" call Decho('ftp: g:netrw_uid')
2290" call Decho('ftp: g:netrw_passwd')
2291 else
2292 put ='user '.g:netrw_uid.' '.g:netrw_passwd
2293" call Decho('user '.g:netrw_uid.' '.g:netrw_passwd)
2294 endif
2295
2296 if a:path != ""
2297 put ='cd '.a:path
2298" call Decho('cd '.a:path)
2299 endif
2300 exe "put ='".a:cmd."'"
2301" call Decho("ftp: ".a:cmd)
2302
2303 " perform ftp:
2304 " -i : turns off interactive prompting from ftp
2305 " -n unix : DON'T use <.netrc>, even though it exists
2306 " -n win32: quit being obnoxious about password
2307" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
2308 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i -n"
2309
2310 ".........................................
2311 else
2312 echo "***warning*** unable to comply with your request<" . choice . ">"
2313 endif
2314 " restore
2315 exe "silent! ".endline.",$d"
2316 exe "keepjumps ".curline
2317 set noma nomod
2318 else
2319 if !exists("g:netrw_quiet")
2320 echohl Error | echo "***netrw*** this system doesn't support ftp" | echohl None
2321 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2322 endif
2323" call Dret("NetObtain")
2324 return
2325 endif
2326
2327 ".........................................
2328 else
2329 " scp: Method#4
2330 if exists("g:netrw_port") && g:netrw_port != ""
2331 let useport= " -P ".g:netrw_port
2332 else
2333 let useport= ""
2334 endif
2335 if g:netrw_cygwin == 1
2336 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
2337" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." .")
2338 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." ."
2339 else
2340" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." .")
2341 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." ."
2342 endif
2343 endif
2344
2345 " restore status line
2346 let &stl= s:netrw_users_stl
2347 redraw!
2348
2349" call Dret("NetObtain")
2350endfun
2351
Bram Moolenaar83bab712005-08-01 21:58:57 +00002352" ==========================================
2353" Local Directory Browsing Support: {{{1
2354" ==========================================
Bram Moolenaar8299df92004-07-10 09:47:34 +00002355
2356" ---------------------------------------------------------------------
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002357" LocalBrowse: {{{2
2358fun! s:LocalBrowse(dirname)
2359 " unfortunate interaction -- debugging calls can't be used here;
2360 " the BufEnter event causes triggering when attempts to write to
2361 " the DBG buffer are made.
2362 if isdirectory(a:dirname)
2363 call netrw#DirBrowse(a:dirname)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002364 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002365 " not a directory, ignore it
2366endfun
Bram Moolenaar8299df92004-07-10 09:47:34 +00002367
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002368" ---------------------------------------------------------------------
2369" DirBrowse: supports local file/directory browsing {{{2
2370fun! netrw#DirBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002371 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002372" call Dfunc("DirBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr()." sortby=".g:netrw_sort_by)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002373" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002374
Bram Moolenaar488c6512005-08-11 20:09:58 +00002375 if exists("s:netrw_skipbrowse")
2376 unlet s:netrw_skipbrowse
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002377" call Dret("DirBrowse")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002378 return
2379 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002380 call s:NetOptionSave()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002381
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002382 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002383 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002384 echohl Error | echo "***netrw*** vim version<".v:version."> too old for browsing with netrw" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002385 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002386 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002387 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002388" call Dret("DirBrowse : vim version<".v:version."> too old")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002389 return
2390 endif
2391
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002392 " use buffer-oriented WinVars if buffer ones exist but window ones don't
2393 call s:UseBufWinVars()
2394
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002395 " find buffer number of buffer named precisely the same as a:dirname
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002396 let bufnum= bufnr(escape(a:dirname,'\'))
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002397" call Decho("findbuf: bufnum=".bufnum)
2398 if bufnum > 0 && bufname(bufnum) != a:dirname
2399 let ibuf= 1
2400 let buflast= bufnr("$")
2401 while bufname(ibuf) !~ '^'.a:dirname.'\=$' && ibuf <= buflast
2402" call Decho("findbuf: ibuf=".ibuf. " bufname<".bufname(ibuf)."> dirname<".a:dirname.">")
2403 let ibuf= ibuf + 1
2404 endwhile
2405 if ibuf > buflast
2406 let bufnum= -1
2407 else
2408 let bufnum= ibuf
2409 endif
2410" call Decho("findbuf: bufnum=".bufnum." (final)")
2411 endif
2412
2413 " get cleared buffer
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002414 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002415 keepjumps keepalt enew!
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002416" call Decho("enew buffer")
2417 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002418 exe "keepalt b ".bufnum
Bram Moolenaar572cb562005-08-05 21:35:02 +00002419 if exists("s:last_sort_by") && g:netrw_sort_by == s:last_sort_by
2420 if getline(2) =~ '^" Directory Listing '
2421 if !g:netrw_keepdir
2422" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002423 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002424 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002425 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002426" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002427 return
2428 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002429 endif
2430 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002431 let s:last_sort_by= g:netrw_sort_by
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002432
2433 " get the new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002434 if has("win32") || has("win95") || has("win64") || has("win16")
2435 let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
2436 else
2437 let b:netrw_curdir= a:dirname
2438 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002439 if b:netrw_curdir =~ '[/\\]$'
2440 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2441 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002442 if b:netrw_curdir == ''
2443 " under unix, when the root directory is encountered, the result
2444 " from the preceding substitute is an empty string.
2445 let b:netrw_curdir= '/'
2446 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002447" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002448
Bram Moolenaar83bab712005-08-01 21:58:57 +00002449 " make netrw's idea of the current directory vim's if the user wishes
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002450 if !g:netrw_keepdir
Bram Moolenaar83bab712005-08-01 21:58:57 +00002451" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002452 try
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002453 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002454 catch /^Vim\%((\a\+)\)\=:E472/
2455 echohl Error | echo "***netrw*** unable to change directory to <".b:netrw_curdir."> (permissions?)" | echohl None
2456 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2457 if exists("w:netrw_prvdir")
2458 let b:netrw_curdir= w:netrw_prvdir
2459 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002460 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002461" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002462 return
2463 endif
2464 endtry
Bram Moolenaar83bab712005-08-01 21:58:57 +00002465 endif
2466
2467 " change the name of the buffer to reflect the b:netrw_curdir
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002468 exe 'silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002469
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002470 " make this buffer not-a-file, modifiable, not line-numbered, etc
2471 setlocal bh=hide bt=nofile nobl ma nonu
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002472 keepalt silent! %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002473
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002474 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002475 " Perform Directory Listing:
Bram Moolenaar8299df92004-07-10 09:47:34 +00002476
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002477 " save current directory on directory history list
Bram Moolenaar83bab712005-08-01 21:58:57 +00002478 call <SID>NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002479
Bram Moolenaar8299df92004-07-10 09:47:34 +00002480 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002481" call Decho("Setting up local browser maps")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002482 nnoremap <buffer> <silent> <cr> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002483 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 +00002484 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002485 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 +00002486 if w:netrw_longlist != 2
2487 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2488 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2489 endif
2490 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2491 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002492 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2493 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2494 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002495 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002496 nnoremap <buffer> <silent> o :call <SID>NetSplit(2)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002497 nnoremap <buffer> <silent> O :call <SID>LocalObtain()<cr>
2498 nnoremap <buffer> <silent> p :call <SID>LocalPreview(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),1))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002499 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002500 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 +00002501 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>
2502 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002503 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2504 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002505 nnoremap <buffer> <silent> v :call <SID>NetSplit(3)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002506 nnoremap <buffer> <silent> x :call <SID>NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)"<cr>
2507 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002508 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
2509 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002510 exe 'nnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002511 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002512 exe 'nnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002513 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002514 exe 'nnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002515 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002516 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002517 nnoremap <buffer> ? :he netrw-dir<cr>
2518
2519 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002520" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002521 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002522 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002523 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002524 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar488c6512005-08-11 20:09:58 +00002525 let w:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002526
2527 let sortby= g:netrw_sort_by
2528 if g:netrw_sort_direction =~ "^r"
2529 let sortby= sortby." reversed"
2530 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002531
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002532 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002533 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002534" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002535 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002536 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002537 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar488c6512005-08-11 20:09:58 +00002538 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002539 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002540" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002541 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002542 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar488c6512005-08-11 20:09:58 +00002543 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002544 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002545
2546 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002547 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002548 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002549 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002550 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002551 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002552 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002553 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002554 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002555 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2556 keepjumps put ='\" ============================================================================'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002557 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002558
2559 " bannercnt should index the line just after the banner
Bram Moolenaar488c6512005-08-11 20:09:58 +00002560 let w:netrw_bannercnt= w:netrw_bannercnt + 1
2561" call Decho("bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002562
2563 " generate the requested directory listing
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002564 call s:LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002565
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002566 " set up syntax highlighting
2567 if has("syntax")
2568 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00002569 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002570 setlocal ft=
2571 endif
2572 endif
2573
Bram Moolenaar8299df92004-07-10 09:47:34 +00002574 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002575 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002576 if g:netrw_hide && g:netrw_list_hide != ""
2577 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002578 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002579 if line("$") >= w:netrw_bannercnt
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002580
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002581 if g:netrw_sort_by =~ "^n"
2582 call s:SetSort()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002583
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002584 if g:netrw_sort_direction =~ 'n'
2585 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002586 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002587 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002588 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002589 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002590
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002591 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002592 if g:netrw_sort_direction =~ 'n'
2593 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002594 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002595 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002596 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002597 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002598 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002599
Bram Moolenaar8299df92004-07-10 09:47:34 +00002600 endif
2601 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002602
2603 call s:NetrwWideListing()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002604 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002605 " place cursor on the top-left corner of the file listing
2606 exe 'silent '.w:netrw_bannercnt
2607 norm! 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00002608 endif
2609
2610 " record previous current directory
2611 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaar8299df92004-07-10 09:47:34 +00002612
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002613 " save certain window-oriented variables into buffer-oriented variables
2614 call s:BufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002615 call s:NetOptionRestore()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002616 setlocal noma nomod nonu bh=hide nobl
Bram Moolenaar8299df92004-07-10 09:47:34 +00002617
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002618" call Dret("DirBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002619endfun
2620
2621" ---------------------------------------------------------------------
2622" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002623fun! s:LocalBrowseList()
Bram Moolenaar83bab712005-08-01 21:58:57 +00002624" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002625
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002626 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00002627 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
2628 let dirnamelen = strlen(b:netrw_curdir)
2629 let filelist = glob(dirname."/*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002630" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002631 if filelist != ""
2632 let filelist= filelist."\n"
2633 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002634 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002635" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2636
2637 " if the directory name includes a "$", and possibly other characters,
2638 " the glob() doesn't include "." and ".." entries.
2639 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2640" call Decho("forcibly tacking on .")
2641 if filelist == ""
2642 let filelist= dirname."."
2643 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002644 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002645 endif
2646" call Decho("filelist<".filelist.">")
2647 endif
2648 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2649" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002650 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002651" call Decho("filelist<".filelist.">")
2652 endif
2653 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002654 let filelist= substitute(filelist,'\','/','ge')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002655
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002656" call Decho("dirname<".dirname.">")
2657" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002658" call Decho("filelist<".filelist.">")
2659
2660 while filelist != ""
2661 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002662 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002663 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2664 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002665 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002666 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00002667 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002668 let pfile= filename
2669 if isdirectory(filename)
2670 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002671 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002672 if pfile =~ '//$'
2673 let pfile= substitute(pfile,'//$','/','e')
2674 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002675 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002676 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaar83bab712005-08-01 21:58:57 +00002677" call Decho(" ")
2678" call Decho("filename<".filename.">")
2679" call Decho("pfile <".pfile.">")
2680
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002681 if w:netrw_longlist == 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002682 let sz = getfsize(filename)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002683 let fsz = strpart(" ",1,15-strlen(sz)).sz
2684 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaar83bab712005-08-01 21:58:57 +00002685" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002686 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002687
Bram Moolenaar8299df92004-07-10 09:47:34 +00002688 if g:netrw_sort_by =~ "^t"
2689 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002690" call Decho("getftime(".filename.")=".getftime(filename))
2691 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002692 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00002693" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002694 let ftpfile= ft.'/'.pfile
2695 keepjumps put=ftpfile
2696
Bram Moolenaar8299df92004-07-10 09:47:34 +00002697 elseif g:netrw_sort_by =~ "^s"
2698 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002699" call Decho("getfsize(".filename.")=".getfsize(filename))
2700 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002701 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00002702" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002703 let fszpfile= fsz.'/'.pfile
2704 keepjumps put =fszpfile
2705
Bram Moolenaar8299df92004-07-10 09:47:34 +00002706 else
2707 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002708" call Decho("exe keepjumps put ='".pfile."'")
2709 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002710 endif
2711 endwhile
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002712
2713 " cleanup any windows mess at end-of-line
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002714 silent! keepjumps %s/\r$//e
Bram Moolenaar83bab712005-08-01 21:58:57 +00002715 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00002716
2717" call Dret("LocalBrowseList")
2718endfun
2719
2720" ---------------------------------------------------------------------
2721" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2722" directory and a new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002723fun! s:LocalBrowseChgDir(dirname,newdir,...)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002724" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002725
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002726 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002727 let newdir = a:newdir
2728
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002729 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002730 " apparently vim is "recognizing" that it is in the home directory and
2731 " is removing the "/". Bad idea, so I have to put it back.
2732 let dirname= dirname.'/'
2733" call Decho("adjusting dirname<".dirname.">")
2734 endif
2735
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002736 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002737 " handling a file
2738 let dirname= dirname.newdir
2739" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002740 " this lets NetBrowseX avoid the edit
2741 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002742" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
2743" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
2744 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002745 set ma nomod
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002746 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002747
2748 elseif newdir == './'
2749 " refresh the directory list
2750" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002751
2752 elseif newdir == '../'
2753 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002754 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002755" call Decho("go up one dir: dirname<".dirname.">")
2756
2757 else
2758 " go down one directory
2759 let dirname= dirname.newdir
2760" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2761 endif
2762
2763" call Dret("LocalBrowseChgDir <".dirname.">")
2764 return dirname
2765endfun
2766
2767" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002768" LocalBrowseRm: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002769fun! s:LocalBrowseRm(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002770" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2771" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2772
2773 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002774 let ctr = a:firstline
2775 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002776 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002777
2778 " remove multiple files and directories
2779 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002780 exe "keepjumps ".ctr
2781
2782 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00002783 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002784 let ctr= ctr + 1
2785 continue
2786 endif
2787 let curword= s:NetGetWord()
2788 if curword == "./" || curword == "../"
2789 let ctr= ctr + 1
2790 continue
2791 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002792
2793 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00002794 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002795" call Decho("rmfile<".rmfile.">")
2796
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002797 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002798 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002799 if !all
2800 echohl Statement
2801 call inputsave()
2802 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2803 call inputrestore()
2804 echohl NONE
2805 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2806 if ok =~ 'a\%[ll]'
2807 let all= 1
2808 endif
2809 endif
2810
2811 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002812 let ret= delete(rmfile)
2813" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002814 elseif ok =~ 'q\%[uit]'
2815 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002816 endif
2817
2818 else
2819 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002820 if !all
2821 echohl Statement
2822 call inputsave()
2823 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2824 call inputrestore()
2825 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2826 if ok =~ 'a\%[ll]'
2827 let all= 1
2828 endif
2829 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002830 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002831
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002832 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002833" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2834 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002835" call Decho("v:shell_error=".v:shell_error)
2836
2837 if v:shell_error != 0
2838" call Decho("2nd attempt to remove directory<".rmfile.">")
2839 let errcode= delete(rmfile)
2840" call Decho("errcode=".errcode)
2841
2842 if errcode != 0
2843 if has("unix")
2844" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002845call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002846 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002847 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002848 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002849endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002850 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002851 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002852 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002853 endif
2854 endif
2855 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002856
2857 elseif ok =~ 'q\%[uit]'
2858 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002859 endif
2860 endif
2861
2862 let ctr= ctr + 1
2863 endwhile
2864
2865 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002866 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002867" call Decho("refresh the directory")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002868 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002869 exe curline
2870
2871" call Dret("LocalBrowseRm")
2872endfun
2873
2874" ---------------------------------------------------------------------
2875" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002876fun! s:LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002877" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2878
2879 " preparation for removing multiple files/directories
2880 let ctr= a:firstline
2881
2882 " attempt to rename files/directories
2883 while ctr <= a:lastline
2884 exe "keepjumps ".ctr
2885
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002886 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00002887 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002888 let ctr= ctr + 1
2889 continue
2890 endif
2891 let curword= s:NetGetWord()
2892 if curword == "./" || curword == "../"
2893 let ctr= ctr + 1
2894 continue
2895 endif
2896
Bram Moolenaar8299df92004-07-10 09:47:34 +00002897 norm! 0
Bram Moolenaar572cb562005-08-05 21:35:02 +00002898 let oldname= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002899" call Decho("oldname<".oldname.">")
2900
2901 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002902 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002903 call inputrestore()
2904
Bram Moolenaar83bab712005-08-01 21:58:57 +00002905 let ret= rename(oldname,newname)
2906" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002907
2908 let ctr= ctr + 1
2909 endwhile
2910
2911 " refresh the directory
2912 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002913" call Decho("refresh the directory listing")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002914 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002915 exe "keepjumps ".curline
2916" call Dret("LocalBrowseRename")
2917endfun
2918
2919" ---------------------------------------------------------------------
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002920" LocalObtain: copy selected file to current working directory {{{2
2921fun! s:LocalObtain()
2922" call Dfunc("LocalObtain()")
2923 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
2924 let fname= expand("<cWORD>")
2925 let fcopy= readfile(b:netrw_curdir."/".fname,"b")
2926 call writefile(fcopy,getcwd()."/".fname,"b")
2927 elseif !exists("b:netrw_curdir")
2928 echohl Error | echo "***netrw*** local browsing directory doesn't exist!"
2929 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2930 else
2931 echohl Error | echo "***netrw*** local browsing directory and current directory are identical"
2932 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2933 endif
2934" call Dret("LocalObtain")
2935endfun
2936
2937" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002938" LocalPreview: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002939fun! s:LocalPreview(path) range
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002940" call Dfunc("LocalPreview(path<".a:path.">)")
2941 if has("quickfix")
2942 if !isdirectory(a:path)
2943 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002944 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002945 echohl WarningMsg | echo "***netrw*** sorry, cannot preview a directory such as <".a:path.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002946 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002947 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002948 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002949 echohl WarningMsg | echo "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002950 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002951 endif
2952" call Dret("LocalPreview")
2953endfun
2954
2955" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002956" LocalRefresh: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002957fun! s:LocalRefresh(dirname)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002958" call Dfunc("LocalRefresh(dirname<".a:dirname.">)")
2959 set ma
2960 %d
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002961 call s:LocalBrowse(a:dirname)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002962 redraw!
2963" call Dret("LocalRefresh")
2964endfun
2965
2966" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002967" Explore: launch the local browser in the directory of the current file {{{2
2968" dosplit==0: the window will be split iff the current file has
2969" been modified
2970" dosplit==1: the window will be split before running the local
2971" browser
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002972fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002973" call Dfunc("Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.")")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002974
2975 " if dosplit or file has been modified
2976 if a:dosplit || &modified
Bram Moolenaar488c6512005-08-11 20:09:58 +00002977 call <SID>SaveWinVars()
2978
Bram Moolenaar83bab712005-08-01 21:58:57 +00002979 if a:style == 0 " Explore, Sexplore
2980 exe g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002981" call Decho("style=0: Explore or Sexplore")
2982
Bram Moolenaar83bab712005-08-01 21:58:57 +00002983 elseif a:style == 1 "Explore!, Sexplore!
2984 exe g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002985" call Decho("style=1: Explore! or Sexplore!")
2986
Bram Moolenaar83bab712005-08-01 21:58:57 +00002987 elseif a:style == 2 " Hexplore
2988 exe "bel ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002989" call Decho("style=2: Hexplore")
2990
Bram Moolenaar83bab712005-08-01 21:58:57 +00002991 elseif a:style == 3 " Hexplore!
2992 exe "abo ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002993" call Decho("style=3: Hexplore!")
2994
Bram Moolenaar83bab712005-08-01 21:58:57 +00002995 elseif a:style == 4 " Vexplore
2996 exe "lefta ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00002997" call Decho("style=4: Vexplore")
2998
Bram Moolenaar83bab712005-08-01 21:58:57 +00002999 elseif a:style == 5 " Vexplore!
3000 exe "rightb ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003001" call Decho("style=5: Vexplore!")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003002 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003003 call s:CopyWinVars()
Bram Moolenaar83bab712005-08-01 21:58:57 +00003004 endif
3005 norm! 0
3006
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003007 if a:1 == "" && a:indx >= 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003008 " Explore Hexplore Vexplore Sexplore
3009 let newdir= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3010 if newdir =~ '^scp:' || newdir =~ '^ftp:'
3011" call Decho("calling NetBrowse(newdir<".newdir.">)")
3012 call s:NetBrowse(newdir)
3013 else
3014" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3015 call s:LocalBrowse(newdir)
3016 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003017
Bram Moolenaar572cb562005-08-05 21:35:02 +00003018 elseif a:1 =~ '\*\*/' || a:indx < 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003019 " Nexplore Pexplore -or- Explore **/...
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003020
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003021 if has("path_extra")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003022 if !exists("w:netrw_explore_indx")
3023 let w:netrw_explore_indx= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003024 endif
3025 let indx = a:indx
3026 if indx == -1
Bram Moolenaar488c6512005-08-11 20:09:58 +00003027 let indx= w:netrw_explore_indx + 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003028 elseif indx == -2
Bram Moolenaar488c6512005-08-11 20:09:58 +00003029 let indx= w:netrw_explore_indx - 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003030 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003031 let w:netrw_explore_indx = 0
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003032 if !exists("b:netrw_curdir")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003033 let b:netrw_curdir= getcwd()
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003034 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003035 let w:netrw_explore_list = split(expand(b:netrw_curdir."/".a:1),'\n')
3036 let w:netrw_explore_listlen = len(w:netrw_explore_list)
3037 if w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/'
Bram Moolenaar572cb562005-08-05 21:35:02 +00003038 echohl WarningMsg | echo "***netrw*** no files matched" | echohl None
3039 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3040" call Dret("Explore")
3041 return
3042 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003043 endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003044
3045 " NetrwStatusLine support
Bram Moolenaar488c6512005-08-11 20:09:58 +00003046 let w:netrw_explore_indx= indx
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003047 if !exists("s:netrw_users_stl")
3048 let s:netrw_users_stl= &stl
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003049 endif
3050 set stl=%f\ %h%m%r%=%{NetrwStatusLine()}
Bram Moolenaar488c6512005-08-11 20:09:58 +00003051" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003052
3053 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00003054 if indx >= w:netrw_explore_listlen || indx < 0
3055 let indx= (indx < 0)? 0 : ( w:netrw_explore_listlen - 1 )
Bram Moolenaar572cb562005-08-05 21:35:02 +00003056 echohl WarningMsg | echo "***netrw*** no more files match Explore pattern" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003057 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3058" call Dret("Explore")
3059 return
3060 endif
3061
Bram Moolenaar488c6512005-08-11 20:09:58 +00003062 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003063" call Decho("dirfile<".dirfile."> indx=".indx)
3064 let newdir= substitute(dirfile,'/[^/]*$','','e')
3065" call Decho("newdir<".newdir.">")
3066" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3067 call s:LocalBrowse(newdir)
3068 call search(substitute(dirfile,"^.*/","",""),"W")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003069 let w:netrw_explore_mtchcnt = indx + 1
3070 let w:netrw_explore_bufnr = bufnr(".")
3071 let w:netrw_explore_line = line(".")
3072" 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 +00003073
3074 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003075 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003076 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 +00003077 endif
3078 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3079 endif
3080
Bram Moolenaar83bab712005-08-01 21:58:57 +00003081 else
3082 let newdir= a:1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003083" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3084 call s:LocalBrowse(newdir)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003085 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003086
3087" call Dret("Explore")
3088endfun
3089
3090" ---------------------------------------------------------------------
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003091" NetrwStatusLine: {{{2
3092fun! NetrwStatusLine()
Bram Moolenaar488c6512005-08-11 20:09:58 +00003093" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr(".")." Xline#".w:netrw_explore_line." line#".line(".")
3094 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 +00003095 " restore user's status line
3096 let &stl= s:netrw_users_stl
Bram Moolenaar488c6512005-08-11 20:09:58 +00003097 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
3098 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003099 return ""
3100 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003101 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003102 endif
3103endfun
3104
3105" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003106" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003107" Change backslashes to forward slashes, if any.
3108" If doesc is true, escape certain troublesome characters
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003109fun! s:NetGetcwd(doesc)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003110" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
3111 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003112 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003113 let curdir= curdir.'/'
3114 endif
3115 if a:doesc
3116 let curdir= escape(curdir,s:netrw_cd_escape)
3117 endif
3118" call Dret("NetGetcwd <".curdir.">")
3119 return curdir
3120endfun
3121
3122" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00003123" NetMethod: determine method of transfer {{{1
3124" method == 1: rcp
3125" 2: ftp + <.netrc>
3126" 3: ftp + machine, id, password, and [path]filename
3127" 4: scp
3128" 5: http (wget)
3129" 6: cadaver
3130" 7: rsync
3131" 8: fetch
3132" 9: sftp
3133fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003134" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003135
3136 " initialization
3137 let b:netrw_method = 0
3138 let g:netrw_machine = ""
3139 let b:netrw_fname = ""
3140 let g:netrw_port = ""
3141
3142 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003143 " mipf : a:machine a:id password filename Use ftp
3144 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003145 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003146 " rcpurm : rcp://[user@]host/filename Use rcp
3147 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003148 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003149 " httpurm : http://[user@]host/filename Use wget
3150 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003151 " rsyncurm : rsync://host[:port]/path Use rsync
3152 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
3153 " sftpurm : sftp://[user@]host/filename Use scp
3154 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
3155 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
3156 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00003157 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003158 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
3159 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
3160 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003161 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003162 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
3163 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
3164 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
3165
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003166" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003167 " Determine Method
3168 " rcp://user@hostname/...path-to-file
3169 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003170" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003171 let b:netrw_method = 1
3172 let userid = substitute(a:choice,rcpurm,'\1',"")
3173 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
3174 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003175 if userid != ""
3176 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00003177 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003178
3179 " scp://user@hostname/...path-to-file
3180 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003181" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003182 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00003183 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
3184 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
3185 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003186
3187 " http://user@hostname/...path-to-file
3188 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003189" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003190 let b:netrw_method = 5
3191 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
3192 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
3193
3194 " dav://hostname[:port]/..path-to-file..
3195 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003196" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003197 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003198 if a:choice =~ '^s'
3199 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
3200 else
3201 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
3202 endif
3203 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003204
3205 " rsync://user@hostname/...path-to-file
3206 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003207" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003208 let b:netrw_method = 7
3209 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
3210 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
3211
3212 " ftp://[user@]hostname[[:#]port]/...path-to-file
3213 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003214" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003215 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003216 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
3217 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
3218 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003219 if userid != ""
3220 let g:netrw_uid= userid
3221 endif
3222 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3223 let b:netrw_method = 3
3224 else
3225 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
3226 let b:netrw_method= 2
3227 else
3228 if !exists("g:netrw_uid") || g:netrw_uid == ""
3229 call NetUserPass()
3230 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
3231 call NetUserPass(g:netrw_uid)
3232 " else just use current g:netrw_uid and g:netrw_passwd
3233 endif
3234 let b:netrw_method= 3
3235 endif
3236 endif
3237
3238 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003239" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003240 let b:netrw_method = 8
3241 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
3242 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
3243 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
3244 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
3245
3246 " Issue an ftp : "machine id password [path/]filename"
3247 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003248" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003249 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003250 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
3251 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
3252 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
3253 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
3254
3255 " Issue an ftp: "hostname [path/]filename"
3256 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003257" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003258 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3259 let b:netrw_method = 3
3260 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3261 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3262
3263 elseif filereadable(expand("$HOME/.netrc"))
3264 let b:netrw_method = 2
3265 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3266 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3267 endif
3268
3269 " sftp://user@hostname/...path-to-file
3270 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003271" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003272 let b:netrw_method = 9
3273 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
3274 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
3275
3276 " Issue an rcp: hostname:filename" (this one should be last)
3277 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003278" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003279 let b:netrw_method = 1
3280 let userid = substitute(a:choice,rcphf,'\2',"")
3281 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
3282 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003283" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
3284" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
3285" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
3286" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003287 if userid != ""
3288 let g:netrw_uid= userid
3289 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003290 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003291 " don't let PCs try <.netrc>
3292 let b:netrw_method = 3
3293 endif
3294
3295 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003296 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003297 echohl Error | echo "***netrw*** cannot determine method" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003298 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003299 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003300 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003301 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00003302
3303 " remove any leading [:#] from port number
3304 if g:netrw_port != ""
3305 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
3306 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003307
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003308" call Decho("a:choice <".a:choice.">")
3309" call Decho("b:netrw_method <".b:netrw_method.">")
3310" call Decho("g:netrw_machine<".g:netrw_machine.">")
3311" call Decho("g:netrw_port <".g:netrw_port.">")
3312" if exists("g:netrw_uid") "Decho
3313" call Decho("g:netrw_uid <".g:netrw_uid.">")
3314" endif "Decho
3315" if exists("g:netrw_passwd") "Decho
3316" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
3317" endif "Decho
3318" call Decho("b:netrw_fname <".b:netrw_fname.">")
3319" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003320endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003321
3322" ------------------------------------------------------------------------
3323" NetUserPass: set username and password for subsequent ftp transfer {{{1
3324" Usage: :call NetUserPass() -- will prompt for userid and password
3325" :call NetUserPass("uid") -- will prompt for password
3326" :call NetUserPass("uid","password") -- sets global userid and password
3327fun! NetUserPass(...)
3328
3329 " get/set userid
3330 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003331" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003332 if !exists("g:netrw_uid") || g:netrw_uid == ""
3333 " via prompt
3334 let g:netrw_uid= input('Enter username: ')
3335 endif
3336 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003337" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003338 let g:netrw_uid= a:1
3339 endif
3340
3341 " get password
3342 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003343" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003344 let g:netrw_passwd= inputsecret("Enter Password: ")
3345 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003346" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003347 let g:netrw_passwd=a:2
3348 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003349
3350 " surround password with double-quotes if it contains embedded blanks
3351 if g:netrw_passwd !~ '^"' && g:netrw_passwd =~ ' '
3352 let g:netrw_passwd= '"'.g:netrw_passwd.'"'
3353 endif
3354
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003355" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003356endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003357
3358" ------------------------------------------------------------------------
3359" NetOptionSave: save options and set to "standard" form {{{1
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003360fun! s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003361" call Dfunc("NetOptionSave()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003362 if !exists("w:netoptionsave")
3363 let w:netoptionsave= 1
3364 else
3365" call Dret("NetOptionSave : netoptionsave=".w:netoptionsave)
3366 return
3367 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003368
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003369 " Get Temporary Filename
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003370 let w:aikeep = &ai
3371 " record autochdir setting and then insure its unset (tnx to David Fishburn)
3372 if has("netbeans_intg") || has("sun_workshop")
3373 let w:acdkeep = &autochdir
3374 set noautochdir
3375 endif
3376 let w:cinkeep = &cin
3377 let w:cinokeep = &cino
3378 let w:comkeep = &com
3379 let w:cpokeep = &cpo
3380 if !g:netrw_keepdir
3381 let w:dirkeep = getcwd()
3382 endif
3383 let w:gdkeep = &gd
3384 let w:repkeep = &report
3385 let w:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00003386 setlocal cino =
3387 setlocal com =
3388 setlocal cpo -=aA
3389 setlocal nocin noai
3390 setlocal tw =0
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003391 setlocal report=10000
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003392 if has("win32") && !has("win95")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003393 let w:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00003394 setlocal noswf
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003395" call Decho("setting w:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003396 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003397
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003398" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003399endfun
3400
3401" ------------------------------------------------------------------------
3402" NetOptionRestore: restore options {{{1
3403fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003404" call Dfunc("NetOptionRestore()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003405 if !exists("w:netoptionsave")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003406" call Dret("NetOptionRestore : w:netoptionsave doesn't exist")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003407 return
3408 endif
3409 unlet w:netoptionsave
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003410
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003411 if exists("w:aikeep")| let &ai= w:aikeep|endif
3412 if (has("netbeans_intg") || has("sun_workshop")) && exists("w:acdkeep")
3413 let &acd= w:acdkeep
3414 unlet w:acdkeep
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003415 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003416 if exists("w:cinkeep") |let &cin = w:cinkeep |unlet w:cinkeep |endif
3417 if exists("w:cinokeep")|let &cino = w:cinokeep|unlet w:cinokeep|endif
3418 if exists("w:comkeep") |let &com = w:comkeep |unlet w:comkeep |endif
3419 if exists("w:cpokeep") |let &cpo = w:cpokeep |unlet w:cpokeep |endif
3420 if exists("w:dirkeep") |exe "lcd ".w:dirkeep |unlet w:dirkeep |endif
3421 if exists("w:gdkeep") |let &gd = w:gdkeep |unlet w:gdkeep |endif
3422 if exists("w:repkeep") |let &report = w:repkeep |unlet w:repkeep |endif
3423 if exists("w:twkeep") |let &tw = w:twkeep |unlet w:twkeep |endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003424 if exists("w:swfkeep")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003425 if &directory == "" && exists("w:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003426 " user hasn't specified a swapfile directory;
3427 " netrw will temporarily make the swapfile
3428 " directory the current local one.
3429 let &directory = getcwd()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003430 silent! let &swf = w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003431 set directory=
3432 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003433 let &swf= w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003434 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003435 unlet w:swfkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003436 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003437
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003438" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003439endfun
3440
3441" ------------------------------------------------------------------------
3442" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003443" to handle extra junk that their system's ftp dumps
3444" into the transfer. This function is provided as an
3445" example and as a fix for a Windows 95 problem: in my
3446" experience, win95's ftp always dumped four blank lines
3447" at the end of the transfer.
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003448if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
Bram Moolenaar071d4272004-06-13 20:20:40 +00003449 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003450" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003451 if method == 3 " ftp (no <.netrc>)
3452 let fourblanklines= line2 - 3
3453 silent fourblanklines.",".line2."g/^\s*/d"
3454 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003455" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003456 endfun
3457endif
3458
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003459" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003460" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003461if v:version < 700
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003462 fun! s:NetSort() range
Bram Moolenaar83bab712005-08-01 21:58:57 +00003463" " call Dfunc("NetSort()")
3464
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003465 let i = a:firstline + 1
3466 while i <= a:lastline
3467 " find insertion point via binary search
3468 let i_val = getline(i)
3469 let lo = a:firstline
3470 let hi = i
3471 while lo < hi
Bram Moolenaar83bab712005-08-01 21:58:57 +00003472 let mid = (lo + hi) / 2
3473 let mid_val = getline(mid)
3474 if g:netrw_sort_direction =~ '^n'
3475 " normal sorting order
3476 if i_val < mid_val
3477 let hi = mid
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003478 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003479 let lo = mid + 1
3480 if i_val == mid_val | break | endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003481 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003482 else
3483 " reverse sorting order
3484 if i_val > mid_val
3485 let hi = mid
3486 else
3487 let lo = mid + 1
3488 if i_val == mid_val | break | endif
3489 endif
3490 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003491 endwhile
3492 " do insert
3493 if lo < i
Bram Moolenaar83bab712005-08-01 21:58:57 +00003494 exe 'keepjumps '.i.'d_'
3495 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003496 endif
3497 let i = i + 1
3498 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00003499
3500" " call Dret("NetSort")
3501 endfun
3502endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003503
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003504" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00003505" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
3506" What this function does is to compute a priority for the patterns
3507" in the g:netrw_sort_sequence. It applies a substitute to any
3508" "files" that satisfy each pattern, putting the priority / in
3509" front. An "*" pattern handles the default priority.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003510fun! s:SetSort()
Bram Moolenaar488c6512005-08-11 20:09:58 +00003511" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003512 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00003513 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
3514 else
3515 let seqlist = g:netrw_sort_sequence
3516 endif
3517 " sanity check -- insure that * appears somewhere
3518 if seqlist == ""
3519 let seqlist= '*'
3520 elseif seqlist !~ '\*'
3521 let seqlist= seqlist.',*'
3522 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003523 let priority = 1
3524 while seqlist != ""
3525 if seqlist =~ ','
3526 let seq = substitute(seqlist,',.*$','','e')
3527 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
3528 else
3529 let seq = seqlist
3530 let seqlist = ""
3531 endif
3532 let eseq= escape(seq,'/')
3533 if priority < 10
3534 let spriority= "00".priority.'\/'
3535 elseif priority < 100
3536 let spriority= "0".priority.'\/'
3537 else
3538 let spriority= priority.'\/'
3539 endif
3540" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
3541
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003542 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00003543 if w:netrw_bannercnt > line("$")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003544 " apparently no files were left after a Hiding pattern was used
3545" call Dret("SetSort : no files left after hiding")
3546 return
3547 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003548 if seq == '*'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003549 exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003550 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003551 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003552 endif
3553 let priority = priority + 1
3554 endwhile
3555
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003556 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003557
3558" call Dret("SetSort")
3559endfun
3560
Bram Moolenaar488c6512005-08-11 20:09:58 +00003561" ---------------------------------------------------------------------
3562" SaveWinVars: (used by Explore()) {{{1
3563fun! s:SaveWinVars()
3564" call Dfunc("SaveWinVars()")
3565 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
3566 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
3567 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
3568 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
3569 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
3570 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
3571 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
3572 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003573 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003574" call Dret("SaveWinVars")
3575endfun
3576
3577" ---------------------------------------------------------------------
3578" CopyWinVars: (used by Explore()) {{{1
3579fun! s:CopyWinVars()
3580" call Dfunc("CopyWinVars()")
3581 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
3582 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
3583 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
3584 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
3585 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
3586 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
3587 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
3588 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 +00003589 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 +00003590" call Dret("CopyWinVars")
3591endfun
3592
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003593" ---------------------------------------------------------------------
3594" BufWinVars: (used by NetBrowse() and LocalBrowse()) {{{1
3595" To allow separate windows to have their own activities, such as
3596" Explore **/pattern, several variables have been made window-oriented.
3597" However, when the user splits a browser window (ex: ctrl-w s), these
3598" variables are not inherited by the new window. BufWinVars() and
3599" UseBufWinVars() get around that.
3600fun! s:BufWinVars()
3601" call Dfunc("BufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003602 if exists("w:netrw_longlist") |let b:netrw_longlist = w:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003603 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
3604 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
3605 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
3606 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
3607 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen = w:netrw_explore_listlen|endif
3608 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = w:netrw_explore_mtchcnt|endif
3609 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
3610 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
3611 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
3612" call Dret("BufWinVars")
3613endfun
3614
3615" ---------------------------------------------------------------------
3616" UseBufWinVars: (used by NetBrowse() and LocalBrowse() {{{1
3617" Matching function to BufferWinVars()
3618fun! s:UseBufWinVars()
3619" call Dfunc("UseBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003620 if exists("b:netrw_longlist") && !exists("w:netrw_longlist") |let w:netrw_longlist = b:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003621 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
3622 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
3623 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
3624 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
3625 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
3626 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
3627 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
3628 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
3629 if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif
3630" call Dret("UseBufWinVars")
3631endfun
3632
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003633" ------------------------------------------------------------------------
3634" Settings Restoration: {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003635let &cpo= s:keepcpo
3636unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003637
Bram Moolenaar071d4272004-06-13 20:20:40 +00003638" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00003639" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003640" vim:ts=8 fdm=marker