blob: c515b8b9dc37ef8f96ad1a33e8df4c9f9bd42688 [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002" Last Change: Aug 02, 2005
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00004" Version: 58b NOT RELEASED
Bram Moolenaar071d4272004-06-13 20:20:40 +00005" License: Vim License (see vim's :help license)
6"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00007" But be doers of the Word, and not only hearers, deluding your own selves
Bram Moolenaar071d4272004-06-13 20:20:40 +00008" (James 1:22 RSV)
9" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bram Moolenaard4755bb2004-09-02 19:12:26 +000010" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000011
Bram Moolenaard4755bb2004-09-02 19:12:26 +000012" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +000013" Load Once: {{{1
Bram Moolenaarc0197e22004-09-13 20:26:32 +000014if exists("g:loaded_netrw") || &cp
Bram Moolenaar071d4272004-06-13 20:20:40 +000015 finish
16endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +000017let g:loaded_netrw = "v58b"
Bram Moolenaar8299df92004-07-10 09:47:34 +000018let loaded_explorer = 1
Bram Moolenaar83bab712005-08-01 21:58:57 +000019let s:keepcpo = &cpo
Bram Moolenaar071d4272004-06-13 20:20:40 +000020set cpo&vim
21
22" ---------------------------------------------------------------------
23" Default values for global netrw variables {{{1
24if !exists("g:netrw_ftpmode")
25 let g:netrw_ftpmode= "binary"
26endif
27if !exists("g:netrw_win95ftp")
28 let g:netrw_win95ftp= 1
29endif
30if !exists("g:netrw_cygwin")
Bram Moolenaard4755bb2004-09-02 19:12:26 +000031 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000032 if &shell == "bash"
33 let g:netrw_cygwin= 1
34 else
35 let g:netrw_cygwin= 0
36 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000037 else
38 let g:netrw_cygwin= 0
39 endif
40endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000041if !exists("g:netrw_list_cmd")
42 if executable("ssh")
43 " provide a default listing command
44 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
45 else
Bram Moolenaar83bab712005-08-01 21:58:57 +000046" call Decho("ssh is not executable, can't do remote directory exploring with ssh")
Bram Moolenaar843ee412004-06-30 16:16:41 +000047 let g:netrw_list_cmd= ""
48 endif
49endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +000050if !exists("g:netrw_ftp_list_cmd")
51 if has("unix") || exists("g:netrw_cygwin")
52 let g:netrw_ftp_list_cmd= "ls -lF"
53 else
54 let g:netrw_ftp_list_cmd= "dir"
55 endif
56endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000057if !exists("g:netrw_rm_cmd")
58 let g:netrw_rm_cmd = "ssh HOSTNAME rm"
59endif
60if !exists("g:netrw_rmf_cmd")
61 let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
62endif
63if !exists("g:netrw_rmdir_cmd")
64 let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
65endif
66if !exists("g:netrw_rename_cmd")
67 let g:netrw_rename_cmd= "ssh HOSTNAME mv"
68endif
69if exists("g:netrw_silent") && g:netrw_silent != 0
70 let g:netrw_silentxfer= "silent "
71else
72 let g:netrw_silentxfer= ""
73endif
74if !exists("g:netrw_winsize")
75 let g:netrw_winsize= ""
76endif
77if !exists("g:netrw_list_hide")
78 let g:netrw_list_hide= ""
79endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000080if !exists("g:netrw_sort_by")
81 " alternatives: date size
82 let g:netrw_sort_by= "name"
83endif
84if !exists("g:netrw_sort_sequence")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000085 let g:netrw_sort_sequence= '[\/]$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000086endif
87if !exists("g:netrw_sort_direction")
88 " alternative: reverse (z y x ...)
89 let g:netrw_sort_direction= "normal"
90endif
Bram Moolenaar8299df92004-07-10 09:47:34 +000091if !exists("g:netrw_longlist") || g:netrw_longlist == 0
92 let g:netrw_longlist= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +000093 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
Bram Moolenaar8299df92004-07-10 09:47:34 +000094else
95 let g:netrw_longlist= 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +000096 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -l"
97endif
98if !exists("g:netrw_list_cmd")
Bram Moolenaar8299df92004-07-10 09:47:34 +000099endif
100if !exists("g:netrw_timefmt")
101 let g:netrw_timefmt= "%c"
102endif
103if !exists("g:netrw_local_rmdir")
104 let g:netrw_local_rmdir= "rmdir"
105endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000106if !exists("g:netrw_local_mkdir")
107 let g:netrw_local_mkdir= "mkdir"
108endif
109if !exists("g:netrw_mkdir_cmd")
110 let g:netrw_mkdir_cmd= "ssh HOSTNAME mkdir"
111endif
Bram Moolenaar269ec652004-07-29 08:43:53 +0000112if !exists("g:netrw_hide")
113 let g:netrw_hide= 1
114endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000115if !exists("g:netrw_ftp_browse_reject")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000116 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 +0000117endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000118if !exists("g:netrw_ssh_browse_reject")
119 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
120endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000121if !exists("g:netrw_keepdir")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000122 let g:netrw_keepdir= 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000123endif
124if !exists("s:netrw_cd_escape")
125 if has("win32") || has("win95") || has("win64") || has("win16")
126 let s:netrw_cd_escape="#% "
127 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000128 let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000129 endif
130endif
131if !exists("s:netrw_glob_escape")
132 if has("win32") || has("win95") || has("win64") || has("win16")
133 let s:netrw_glob_escape= ""
134 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000135 let s:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000136 endif
137endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000138if !exists("g:netrw_alto")
139 let g:netrw_alto= 0
140endif
141if !exists("g:netrw_altv")
142 let g:netrw_altv= 0
143endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000144if !exists("g:netrw_maxfilenamelen")
145 let g:netrw_maxfilenamelen= 32
146endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000147if !exists("g:netrw_dirhistmax")
148 let g:netrw_dirhistmax= 10
149endif
150if !exists("g:NETRW_DIRHIST_CNT")
151 let g:NETRW_DIRHIST_CNT= 0
152endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000153
154" BufEnter event ignored by decho when following variable is true
155" Has a side effect that doau BufReadPost doesn't work, so
156" files read by network transfer aren't appropriately highlighted.
157"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000158
159" ---------------------------------------------------------------------
160" Default values for global protocol variables {{{1
161if !exists("g:netrw_rcp_cmd")
162 let g:netrw_rcp_cmd = "rcp"
163endif
164if !exists("g:netrw_ftp_cmd")
165 let g:netrw_ftp_cmd = "ftp"
166endif
167if !exists("g:netrw_scp_cmd")
168 let g:netrw_scp_cmd = "scp -q"
169endif
170if !exists("g:netrw_sftp_cmd")
171 let g:netrw_sftp_cmd = "sftp"
172endif
173if !exists("g:netrw_http_cmd")
174 if executable("wget")
175 let g:netrw_http_cmd = "wget -q -O"
176 elseif executable("fetch")
177 let g:netrw_http_cmd = "fetch -o"
178 else
179 let g:netrw_http_cmd = ""
180 endif
181endif
182if !exists("g:netrw_dav_cmd")
183 let g:netrw_dav_cmd = "cadaver"
184endif
185if !exists("g:netrw_rsync_cmd")
186 let g:netrw_rsync_cmd = "rsync"
187endif
188if !exists("g:netrw_fetch_cmd")
189 if executable("fetch")
190 let g:netrw_fetch_cmd = "fetch -o"
191 else
192 let g:netrw_fetch_cmd = ""
193 endif
194endif
195
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000196if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000197 \ && exists("g:netrw_use_nt_rcp")
198 \ && g:netrw_use_nt_rcp
199 \ && executable( $SystemRoot .'/system32/rcp.exe')
200 let s:netrw_has_nt_rcp = 1
201 let s:netrw_rcpmode = '-b'
202 else
203 let s:netrw_has_nt_rcp = 0
204 let s:netrw_rcpmode = ''
205endif
206
207" ---------------------------------------------------------------------
208" Transparency Support: {{{1
Bram Moolenaar8299df92004-07-10 09:47:34 +0000209 " File Explorer: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000210if version >= 600
Bram Moolenaar8299df92004-07-10 09:47:34 +0000211 augroup FileExplorer
212 au!
Bram Moolenaar83bab712005-08-01 21:58:57 +0000213 au BufEnter * call <SID>LocalBrowse(expand("<amatch>"))
Bram Moolenaar8299df92004-07-10 09:47:34 +0000214 augroup END
215 " Network Handler: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000216 augroup Network
217 au!
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000218 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000219 au BufReadCmd file://* exe "silent doau BufReadPre ".expand("<amatch>")|exe 'e '.substitute(expand("<amatch>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<amatch>")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000220 else
Bram Moolenaar83bab712005-08-01 21:58:57 +0000221 au BufReadCmd file:///* exe "silent doau BufReadPre ".expand("<amatch>")|exe 'e /'.substitute(expand("<amatch>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<amatch>")
222 au BufReadCmd file://localhost/* exe "silent doau BufReadPre ".expand("<amatch>")|exe 'e /'.substitute(expand("<amatch>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<amatch>")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000223 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000224 au BufReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau BufReadPre ".expand("<amatch>")|exe "Nread 0r ".expand("<amatch>")|exe "silent doau BufReadPost ".expand("<amatch>")
225 au FileReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau BufReadPre ".expand("<amatch>")|exe "Nread " .expand("<amatch>")|exe "silent doau FileReadPost ".expand("<amatch>")
226 au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("<amatch>")|exe "Nwrite " .expand("<amatch>")|exe "silent doau BufWritePost ".expand("<amatch>")
227 au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("<amatch>")|exe "'[,']Nwrite " .expand("<amatch>")|exe "silent doau FileWritePost ".expand("<amatch>")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000228 augroup END
229endif
230
231" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +0000232" Commands: :Nread, :Nwrite, :NetUserPass {{{1
233com! -nargs=* Nread call s:NetSavePosn()<bar>call s:NetRead(<f-args>)<bar>call s:NetRestorePosn()
234com! -range=% -nargs=* Nwrite call s:NetSavePosn()<bar><line1>,<line2>call s:NetWrite(<f-args>)<bar>call s:NetRestorePosn()
Bram Moolenaar071d4272004-06-13 20:20:40 +0000235com! -nargs=* NetUserPass call NetUserPass(<f-args>)
236
Bram Moolenaar83bab712005-08-01 21:58:57 +0000237" Commands: :Explore, :Sexplore, Hexplore, Vexplore {{{1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000238com! -nargs=? -bar -bang -count=0 Explore call s:Explore(<count>,0,0+<bang>0,<q-args>)
239com! -nargs=? -bar -bang -count=0 Sexplore call s:Explore(<count>,1,0+<bang>0,<q-args>)
240com! -nargs=? -bar -bang -count=0 Hexplore call s:Explore(<count>,1,2+<bang>0,<q-args>)
241com! -nargs=? -bar -bang -count=0 Vexplore call s:Explore(<count>,1,4+<bang>0,<q-args>)
242com! -nargs=? -bar -bang Nexplore call s:Explore(-1,0,0,<q-args>)
243com! -nargs=? -bar -bang Pexplore call s:Explore(-2,0,0,<q-args>)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000244
Bram Moolenaar071d4272004-06-13 20:20:40 +0000245" ------------------------------------------------------------------------
246" NetSavePosn: saves position of cursor on screen {{{1
247fun! s:NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000248" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000249 " Save current line and column
250 let s:netrw_winnr= winnr()
251 let s:netrw_line = line(".")
252 let s:netrw_col = virtcol(".")
253
254 " Save top-of-screen line
255 norm! H0
256 let s:netrw_hline= line(".")
257
258 call s:NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000259" call Dret("NetSavePosn : winnr=".s:netrw_winnr." line=".s:netrw_line." col=".s:netrw_col." hline=".s:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000260endfun
261
262" ------------------------------------------------------------------------
263" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
264fun! <SID>NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000265" call Dfunc("NetRestorePosn() winnr=".s:netrw_winnr." line=".s:netrw_line." col=".s:netrw_col." hline=".s:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000266
Bram Moolenaar81695252004-12-29 20:58:21 +0000267 " restore window
268" call Decho("restore window: exe silent! ".s:netrw_winnr."wincmd w")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000269 exe "silent! ".s:netrw_winnr."wincmd w"
270 if v:shell_error == 0
271 " as suggested by Bram M: redraw on no error
272 " allows protocol error messages to remain visible
273 redraw!
274 endif
Bram Moolenaar81695252004-12-29 20:58:21 +0000275
Bram Moolenaar071d4272004-06-13 20:20:40 +0000276 " restore top-of-screen line
Bram Moolenaar81695252004-12-29 20:58:21 +0000277" call Decho("restore topofscreen: exe norm! ".s:netrw_hline."G0z")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000278 exe "norm! ".s:netrw_hline."G0z\<CR>"
Bram Moolenaar81695252004-12-29 20:58:21 +0000279
Bram Moolenaar071d4272004-06-13 20:20:40 +0000280 " restore position
Bram Moolenaar81695252004-12-29 20:58:21 +0000281" call Decho("restore posn: exe norm! ".s:netrw_line."G0".s:netrw_col."|")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000282 exe "norm! ".s:netrw_line."G0".s:netrw_col."\<bar>"
283
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000284" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000285endfun
286
287" ------------------------------------------------------------------------
288" NetRead: responsible for reading a file over the net {{{1
289fun! s:NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000290" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000291
292 " save options
293 call s:NetOptionSave()
294
295 " Special Exception: if a file is named "0r", then
296 " "0r" will be used to read the
297 " following files instead of "r"
298 if a:0 == 0
299 let readcmd= "r"
300 let ichoice= 0
301 elseif a:1 == "0r"
302 let readcmd = "0r"
303 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000304 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000305 let readcmd = "r"
306 let ichoice = 1
307 endif
308
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000309 " get name of a temporary file and set up shell-quoting character
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000310 let tmpfile= tempname()
311
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000312" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000313 while ichoice <= a:0
314
315 " attempt to repeat with previous host-file-etc
316 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000317" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000318 let choice = b:netrw_lastfile
319 let ichoice= ichoice + 1
320
321 else
322 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000323" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000324
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000325 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000326 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000327 echomsg 'NetRead Usage:'
328 echomsg ':Nread machine:path uses rcp'
329 echomsg ':Nread "machine path" uses ftp with <.netrc>'
330 echomsg ':Nread "machine id password path" uses ftp'
331 echomsg ':Nread dav://machine[:port]/path uses cadaver'
332 echomsg ':Nread fetch://machine/path uses fetch'
333 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
334 echomsg ':Nread http://[user@]machine/path uses http wget'
335 echomsg ':Nread rcp://[user@]machine/path uses rcp'
336 echomsg ':Nread rsync://machine[:port]/path uses rsync'
337 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
338 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000339 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000340
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000341 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000342 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000343" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000344 if match(choice,"\"$") != -1
345 " case "..."
346 let choice=strpart(choice,1,strlen(choice)-2)
347 else
348 " case "... ... ..."
349 let choice = strpart(choice,1,strlen(choice)-1)
350 let wholechoice = ""
351
352 while match(choice,"\"$") == -1
353 let wholechoice = wholechoice . " " . choice
354 let ichoice = ichoice + 1
355 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000356 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000357 echoerr "***netrw*** Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000358 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000359 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000360" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000361 return
362 endif
363 let choice= a:{ichoice}
364 endwhile
365 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
366 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000367 endif
368 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000369
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000370" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000371 let ichoice= ichoice + 1
372
373 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000374 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000375 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000376" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000377
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000378 exe 'lcd ' . fnamemodify(tmpfile,':h')
379 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000380 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000381
382 " Determine method of read (ftp, rcp, etc)
383 call s:NetMethod(choice)
384
Bram Moolenaar843ee412004-06-30 16:16:41 +0000385 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000386" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000387 if choice =~ "^.*[\/]$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000388 keepjumps call s:NetBrowse(choice)
389" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000390 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000391 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000392
393 " ============
394 " Perform Read
395 " ============
396
397 ".........................................
398 " rcp: NetRead Method #1
399 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000400" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000401 " ER: noting done with g:netrw_uid yet?
402 " ER: on Win2K" rcp machine[.user]:file tmpfile
403 " ER: if machine contains '.' adding .user is required (use $USERNAME)
404 " ER: the tmpfile is full path: rcp sees C:\... as host C
405 if s:netrw_has_nt_rcp == 1
406 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
407 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
408 else
409 " Any way needed it machine contains a '.'
410 let uid_machine = g:netrw_machine .'.'. $USERNAME
411 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000412 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000413 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
414 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
415 else
416 let uid_machine = g:netrw_machine
417 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000418 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000419" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000420 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
421 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
422 let b:netrw_lastfile = choice
423
424 ".........................................
425 " ftp + <.netrc>: NetRead Method #2
426 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000427" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000428 let netrw_fname= b:netrw_fname
429 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000430 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000431 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000432 exe "put ='"."get ".netrw_fname." ".tmpfile."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000433 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000434" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000435 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
436 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000437" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000438 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
439 endif
440 " 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 +0000441 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000442 let debugkeep= &debug
443 set debug=msg
Bram Moolenaar83bab712005-08-01 21:58:57 +0000444 echoerr "***netrw*** ".getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000445 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000446 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000447 endif
448 bd!
449 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
450 let b:netrw_lastfile = choice
451
452 ".........................................
453 " ftp + machine,id,passwd,filename: NetRead Method #3
454 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
455 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000456" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000457 let netrw_fname= b:netrw_fname
458 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000459 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000460 if exists("g:netrw_port") && g:netrw_port != ""
461 put ='open '.g:netrw_machine.' '.g:netrw_port
462 else
463 put ='open '.g:netrw_machine
464 endif
465
466 if exists("g:netrw_ftp") && g:netrw_ftp == 1
467 put =g:netrw_uid
468 put =g:netrw_passwd
469 else
470 put ='user '.g:netrw_uid.' '.g:netrw_passwd
471 endif
472
473 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
474 put =g:netrw_ftpmode
475 endif
476 put ='get '.netrw_fname.' '.tmpfile
477
478 " perform ftp:
479 " -i : turns off interactive prompting from ftp
480 " -n unix : DON'T use <.netrc>, even though it exists
481 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000482" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000483 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000484" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000485 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
486 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
487 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000488" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000489 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000490 echoerr "***netrw*** ".getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000491 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000492 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000493 endif
494 bd!
495 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
496 let b:netrw_lastfile = choice
497
498 ".........................................
499 " scp: NetRead Method #4
500 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000501" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000502 if exists("g:netrw_port") && g:netrw_port != ""
503 let useport= " -P ".g:netrw_port
504 else
505 let useport= ""
506 endif
507 if g:netrw_cygwin == 1
508 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000509" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000510 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
511 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000512" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000513 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
514 endif
515 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
516 let b:netrw_lastfile = choice
517
518 ".........................................
519 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000520" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000521 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000522 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000523 echoerr "***netrw*** neither wget nor fetch command is available"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000524 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000525 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000526 exit
527 endif
528
529 if match(b:netrw_fname,"#") == -1
530 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000531" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000532 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
533 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
534
535 else
536 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
537 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
538 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000539" call Decho("netrw_html<".netrw_html.">")
540" call Decho("netrw_tag <".netrw_tag.">")
541" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000542 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
543 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000544" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000545 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
546 endif
547 let b:netrw_lastfile = choice
548
549 ".........................................
550 " cadaver: NetRead Method #6
551 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000552" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000553
554 " Construct execution string (four lines) which will be passed through filter
555 let netrw_fname= b:netrw_fname
556 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000557 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000558 if exists("g:netrw_port") && g:netrw_port != ""
559 put ='open '.g:netrw_machine.' '.g:netrw_port
560 else
561 put ='open '.g:netrw_machine
562 endif
563 put ='user '.g:netrw_uid.' '.g:netrw_passwd
564
565 if g:netrw_cygwin == 1
566 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
567 put ='get '.netrw_fname.' '.cygtmpfile
568 else
569 put ='get '.netrw_fname.' '.tmpfile
570 endif
571
572 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000573 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000574" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000575 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
576 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000577 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000578 let b:netrw_lastfile = choice
579
580 ".........................................
581 " rsync: NetRead Method #7
582 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000583" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000584 if g:netrw_cygwin == 1
585 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000586" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000587 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
588 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000589" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000590 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
591 endif
592 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
593 let b:netrw_lastfile = choice
594
595 ".........................................
596 " fetch: NetRead Method #8
597 " fetch://[user@]host[:http]/path
598 elseif b:netrw_method == 8 " read with fetch
599 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000600 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000601 echoerr "***netrw*** fetch command not available"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000602 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000603 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000604 exit
605 endif
606 if exists("g:netrw_option") && g:netrw_option == ":http"
607 let netrw_option= "http"
608 else
609 let netrw_option= "ftp"
610 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000611" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000612
613 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000614" 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 +0000615 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
616 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000617" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000618 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
619 endif
620
621 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
622 let b:netrw_lastfile = choice
623
624 ".........................................
625 " sftp: NetRead Method #9
626 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000627" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000628 if g:netrw_cygwin == 1
629 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000630" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
631" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000632 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
633 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000634" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000635 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
636 endif
637 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
638 let b:netrw_lastfile = choice
639
640 ".........................................
641 else " Complain
642 echo "***warning*** unable to comply with your request<" . choice . ">"
643 endif
644 endwhile
645
646 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000647" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000648 if exists("b:netrw_method")
649 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000650 unlet b:netrw_fname
651 endif
652 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000653
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000654" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000655endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000656
657" ------------------------------------------------------------------------
658" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
659fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000660" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000661
662 if exists("*NetReadFixup")
663 " for the use of NetReadFixup (not otherwise used internally)
664 let line2= line("$")
665 endif
666
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000667 " transform paths from / to \ for Windows (except for cygwin)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000668 if &term == "win32"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000669 if g:netrw_cygwin
670 let fname= a:fname
671" call Decho("(win32 && cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000672 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000673 let fname= substitute(a:fname,'/','\\\\','ge')
674" call Decho("(win32 && !cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000675 endif
676 else
677 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000678" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000679 endif
680
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000681 if a:readcmd[0] == '0'
Bram Moolenaar81695252004-12-29 20:58:21 +0000682 " get file into buffer
Bram Moolenaar83bab712005-08-01 21:58:57 +0000683
Bram Moolenaar81695252004-12-29 20:58:21 +0000684 " record remote filename
Bram Moolenaar83bab712005-08-01 21:58:57 +0000685 let rfile= bufname(".")
686" call Decho("remotefile<".rfile.">")
687" call Dredir("ls!","starting buffer list")
688
Bram Moolenaar81695252004-12-29 20:58:21 +0000689 " rename the current buffer to the temp file (ie. fname)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000690 if v:version < 700
691 exe "file ".fname
692 else
693 keepalt exe "file ".fname
694 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000695" call Dredir("ls!","after renaming current buffer to <".fname.">")
696
Bram Moolenaar81695252004-12-29 20:58:21 +0000697 " edit temporary file
698 e
Bram Moolenaar83bab712005-08-01 21:58:57 +0000699" call Dredir("ls!","after editing temporary file")
700
Bram Moolenaar81695252004-12-29 20:58:21 +0000701 " rename buffer back to remote filename
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000702 if v:version < 700
703 exe "file ".rfile
704 else
705 keepalt exe "file ".rfile
706 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +0000707" call Dredir("ls!","renaming buffer back to remote filename<".rfile.">")
Bram Moolenaar81695252004-12-29 20:58:21 +0000708 let line1 = 1
709 let line2 = line("$")
710
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000711 elseif filereadable(fname)
Bram Moolenaar81695252004-12-29 20:58:21 +0000712 " read file after current line
713 let curline = line(".")
714 let lastline= line("$")
715" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname."> line#".curline)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000716 exe a:readcmd." ".v:cmdarg." ".fname
Bram Moolenaar81695252004-12-29 20:58:21 +0000717 let line1 = curline + 1
718 let line2 = line("$") - lastline + 1
719 let s:netrw_line = s:netrw_line + 1
720 let s:netrw_col = 1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000721 else
Bram Moolenaar81695252004-12-29 20:58:21 +0000722 " not readable
723" call Dret("NetGetFile : fname<".fname."> not readable")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000724 return
725 endif
726
727 " User-provided (ie. optional) fix-it-up command
728 if exists("*NetReadFixup")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000729" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000730 call NetReadFixup(a:method, line1, line2)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000731" else " Decho
732" call Decho("NetReadFixup() not called, doesn't exist")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000733 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000734
735 " update the Buffers menu
736 if has("gui") && has("gui_running")
737 silent! emenu Buffers.Refresh\ menu
738 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000739
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000740" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000741
742 " insure that we have the right filetype and that its being displayed
743 filetype detect
744 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000745" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000746endfun
747
748" ------------------------------------------------------------------------
749" NetWrite: responsible for writing a file over the net {{{1
750fun! s:NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000751" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000752
753 " option handling
754 let mod= 0
755 call s:NetOptionSave()
756
757 " Get Temporary Filename
758 let tmpfile= tempname()
759
760 if a:0 == 0
761 let ichoice = 0
762 else
763 let ichoice = 1
764 endif
765
766 " write (selected portion of) file to temporary
767 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
768
769 while ichoice <= a:0
770
771 " attempt to repeat with previous host-file-etc
772 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000773" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000774 let choice = b:netrw_lastfile
775 let ichoice= ichoice + 1
776 else
777 exe "let choice= a:" . ichoice
778
779 " Reconstruct Choice if choice starts with '"'
780 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000781 echomsg 'NetWrite Usage:"'
782 echomsg ':Nwrite machine:path uses rcp'
783 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
784 echomsg ':Nwrite "machine id password path" uses ftp'
785 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
786 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
787 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
788 echomsg ':Nwrite rcp://machine/path uses rcp'
789 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
790 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
791 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000792 break
793
794 elseif match(choice,"^\"") != -1
795 if match(choice,"\"$") != -1
796 " case "..."
797 let choice=strpart(choice,1,strlen(choice)-2)
798 else
799 " case "... ... ..."
800 let choice = strpart(choice,1,strlen(choice)-1)
801 let wholechoice = ""
802
803 while match(choice,"\"$") == -1
804 let wholechoice= wholechoice . " " . choice
805 let ichoice = ichoice + 1
806 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000807 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000808 echoerr "***netrw*** Unbalanced string in filename '". wholechoice ."'"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000809 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000810 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000811" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000812 return
813 endif
814 let choice= a:{ichoice}
815 endwhile
816 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
817 endif
818 endif
819 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000820" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000821 let ichoice= ichoice + 1
822
823 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000824 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000825 let choice= substitute(choice,'\\','/','ge')
826 "ER: see NetRead()
827 exe 'lcd ' . fnamemodify(tmpfile,':h')
828 let tmpfile = fnamemodify(tmpfile,':t')
829 endif
830
831 " Determine method of read (ftp, rcp, etc)
832 call s:NetMethod(choice)
833
834 " =============
835 " Perform Write
836 " =============
837
838 ".........................................
839 " rcp: NetWrite Method #1
840 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000841" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000842 if s:netrw_has_nt_rcp == 1
843 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
844 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
845 else
846 let uid_machine = g:netrw_machine .'.'. $USERNAME
847 endif
848 else
849 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
850 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
851 else
852 let uid_machine = g:netrw_machine
853 endif
854 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000855" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000856 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
857 let b:netrw_lastfile = choice
858
859 ".........................................
860 " ftp + <.netrc>: NetWrite Method #2
861 elseif b:netrw_method == 2 " write with ftp + <.netrc>
862 let netrw_fname = b:netrw_fname
863 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000864 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000865 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000866" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000867 exe "put ='"."put ".tmpfile." ".netrw_fname."'"
868" call Decho("put ='"."put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000869 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000870" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000871 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000872 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000873" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000874 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000875 endif
876 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
877 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000878 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000879 echoerr "***netrw*** ".getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000880 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000881 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000882 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000883 endif
884 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000885 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000886
887 ".........................................
888 " ftp + machine, id, passwd, filename: NetWrite Method #3
889 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
890 let netrw_fname= b:netrw_fname
891 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000892 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000893 if exists("g:netrw_port") && g:netrw_port != ""
894 put ='open '.g:netrw_machine.' '.g:netrw_port
895 else
896 put ='open '.g:netrw_machine
897 endif
898 if exists("g:netrw_ftp") && g:netrw_ftp == 1
899 put =g:netrw_uid
900 put =g:netrw_passwd
901 else
902 put ='user '.g:netrw_uid.' '.g:netrw_passwd
903 endif
904 put ='put '.tmpfile.' '.netrw_fname
905 " save choice/id/password for future use
906 let b:netrw_lastfile = choice
907
908 " perform ftp:
909 " -i : turns off interactive prompting from ftp
910 " -n unix : DON'T use <.netrc>, even though it exists
911 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000912" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000913 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000914" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000915 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
916 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
917 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000918 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000919 echoerr "***netrw*** ".getline(1)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000920 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000921 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000922 let mod=1
923 endif
924 bd!
925
926 ".........................................
927 " scp: NetWrite Method #4
928 elseif b:netrw_method == 4 " write with scp
929 if exists("g:netrw_port") && g:netrw_port != ""
930 let useport= " -P ".g:netrw_port
931 else
932 let useport= ""
933 endif
934 if g:netrw_cygwin == 1
935 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000936" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000937 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
938 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000939" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000940 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
941 endif
942 let b:netrw_lastfile = choice
943
944 ".........................................
945 " http: NetWrite Method #5
946 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000947 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +0000948 echoerr "***netrw*** currently <netrw.vim> does not support writing using http:"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000949 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000950 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000951
952 ".........................................
953 " dav: NetWrite Method #6
954 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000955" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000956
957 " Construct execution string (four lines) which will be passed through filter
958 let netrw_fname= b:netrw_fname
959 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000960 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000961 if exists("g:netrw_port") && g:netrw_port != ""
962 put ='open '.g:netrw_machine.' '.g:netrw_port
963 else
964 put ='open '.g:netrw_machine
965 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000966 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000967
968 if g:netrw_cygwin == 1
969 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
970 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000971 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000972 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000973 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000974
975 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000976 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000977" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000978 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
979 bd!
980 let b:netrw_lastfile = choice
981
982 ".........................................
983 " rsync: NetWrite Method #7
984 elseif b:netrw_method == 7 " write with rsync
985 if g:netrw_cygwin == 1
986 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000987" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000988 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000989 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000990" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000991 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000992 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000993 let b:netrw_lastfile = choice
994
995 ".........................................
996 " scp: NetWrite Method #9
997 elseif b:netrw_method == 9 " write with sftp
998 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000999 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1000 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1001 else
1002 let uid_machine = g:netrw_machine
1003 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001004 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001005 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +00001006 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001007 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001008" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001009 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
1010 bd!
1011 let b:netrw_lastfile= choice
1012
1013 ".........................................
1014 else " Complain
1015 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001016 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001017 endwhile
1018
1019 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001020" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001021 let result=delete(tmpfile)
1022 call s:NetOptionRestore()
1023
1024 if a:firstline == 1 && a:lastline == line("$")
1025 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001026 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001027
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001028" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001029endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001030
Bram Moolenaar83bab712005-08-01 21:58:57 +00001031" ===========================================
1032" Remote Directory Browsing Support: {{{1
1033" ===========================================
1034
Bram Moolenaar843ee412004-06-30 16:16:41 +00001035" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001036" of the contents of a remote directory. It is assumed that the
1037" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1038" with the requested remote hostname first.
Bram Moolenaar843ee412004-06-30 16:16:41 +00001039fun! <SID>NetBrowse(dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001040" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".g:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001041
1042 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001043 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1044" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001045 if !executable("ftp")
1046 if !exists("g:netrw_quiet")
1047 echoerr "***netrw*** this system doesn't support remote directory listing via ftp"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001048 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001049 endif
1050" call Dret("NetBrowse")
1051 return
1052 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001053 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001054 if !exists("g:netrw_quiet")
1055 echoerr "***netrw*** this system doesn't support remote directory listing via ssh"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001056 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001057 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001058" call Dret("NetBrowse")
1059 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001060 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001061
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001062 " make this buffer modifiable
Bram Moolenaar83bab712005-08-01 21:58:57 +00001063 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001064
1065 " analyze a:dirname and g:netrw_list_cmd
1066 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001067 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001068" call Decho("dirpat<".dirpat.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001069 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001070 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001071 echoerr "***netrw*** netrw doesn't understand your dirname<".dirname.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001072 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001073 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001074" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001075 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001076 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001077
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001078 let method = substitute(dirname,dirpat,'\1','')
1079 let user = substitute(dirname,dirpat,'\2','')
1080 let machine = substitute(dirname,dirpat,'\3','')
1081 let path = substitute(dirname,dirpat,'\4','')
1082 let fname = substitute(dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001083" call Decho("set up method <".method .">")
1084" call Decho("set up user <".user .">")
1085" call Decho("set up machine<".machine.">")
1086" call Decho("set up path <".path .">")
1087" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001088
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001089 if method == "ftp" || method == "http"
1090 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001091 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001092 else
1093 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1094 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001095
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001096 if exists("b:netrw_method")
1097" call Decho("setting s:netrw_method<".b:netrw_method.">")
1098 let s:netrw_method= b:netrw_method
1099 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001100
Bram Moolenaar8299df92004-07-10 09:47:34 +00001101 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001102 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
Bram Moolenaar83bab712005-08-01 21:58:57 +00001103 echoerr "***netrw*** windows' ftp doesn't support time/size sorts (get cygwin, set g:netrw_cygwin)"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001104 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001105 else
1106 if g:netrw_sort_by =~ "^t"
1107 let listcmd= listcmd."t"
1108 elseif g:netrw_sort_by =~ "^s"
1109 let listcmd= listcmd."S"
1110 endif
1111 " optionally sort in reverse
1112 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1113 let listcmd= listcmd."r"
1114 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001115 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001116
1117" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001118 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001119" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001120 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001121 redraw!
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.
1132 let path= substitute(path,'[*=@|]$','','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 Moolenaar69a7cb42004-06-20 12:51:53 +00001136 enew!
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001137" call Decho("exe file .method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001138 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001139 exe "silent doau BufReadPre ".fname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001140 silent call s:NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001141 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001142 keepjumps 1d
1143 setlocal nomod
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001144
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001145" call Dret("NetBrowse : file<".fname.">")
1146 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001147 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001148
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001149 " ---------------------------------------------------------------------
1150 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001151" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001152 " set up new buffer and map
1153 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001154 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001155" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001156 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001157 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001158" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001159 exe "b ".bufnamenr
1160 if line("$") >= 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001161" call Dret("NetBrowse")
1162 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001163 endif
1164 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001165" call Decho("generate a new buffer")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001166 enew!
1167 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001168
1169 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001170 setlocal bt=nofile bh=wipe nobl noswf
1171 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001172" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001173 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001174" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001175 setlocal bh=hide nobl nonu
1176
1177 " save current directory on directory history list
1178 call <SID>NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001179
1180 " set up buffer-local mappings
1181" call Decho("set up buffer-local mappings")
1182 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001183 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
1184 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001185 nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001186 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1187 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1188 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1189 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001190 nnoremap <buffer> <silent> o :exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001191 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1192 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>
1193 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>
1194 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001195 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1196 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001197 nnoremap <buffer> <silent> v :exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001198 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
1199 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001200 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1201 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001202 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001203 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1204 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1205 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001206 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001207 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaar83bab712005-08-01 21:58:57 +00001208 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001209
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001210 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001211" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1212 keepjumps put ='\" ==========================================================================='
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001213 keepjumps put ='\" Netrw Remote Directory Listing'
1214 keepjumps put ='\" '.bufname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001215 let s:netrw_bannercnt= 7
1216 let sortby= g:netrw_sort_by
1217 if g:netrw_sort_direction =~ "^r"
1218 let sortby= sortby." reversed"
1219 endif
1220
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001221 if g:netrw_sort_by =~ "^n"
1222 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001223 let s:netrw_bannercnt= s:netrw_bannercnt + 1
1224 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001225 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1226 else
1227 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001228 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001229 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001230 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001231 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001232 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001233 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001234 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001235 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001236 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001237 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001238 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1239 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001240
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001241 " remote read the requested directory listing
1242 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1243 " Note that not all ftp servers honor the options for ls
1244 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001245 " use ftp to get remote file listing
1246" call Decho("use ftp to get remote file listing")
1247 call NetBrowseFtpCmd(path,listcmd)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001248 keepjumps 1d
1249
1250 if !g:netrw_longlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001251 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001252" call Decho("generate short listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001253 exe "keepjumps ".s:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001254
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001255 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001256 if g:netrw_ftp_browse_reject != ""
1257 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1258 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001259
1260 " if there's no ../ listed, then put ./ and ../ in
1261 let line1= line(".")
1262 keepjumps 1
1263 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1264 let line2= line(".")
1265 if line2 == 0
1266 keepjumps put='../'
1267 keepjumps put='./'
1268 endif
1269 exe "keepjumps ".line1
1270 keepjumps norm! 0
1271
1272 " more cleanup
Bram Moolenaar83bab712005-08-01 21:58:57 +00001273 exe 'keepjumps silent! '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1274 exe "keepjumps silent! ".s:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
1275 exe "keepjumps silent! ".s:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001276 endif
1277
1278 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001279 " use ssh to get remote file listing
1280" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001281 let shq= &shq? &shq : ( &sxq? &sxq : "'")
1282" call Decho("exe silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq)
1283 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001284if !exists("g:junk")
1285 let g:junk=1
1286else
1287 put ='testing'
1288 return
1289endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001290 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001291 " cleanup
1292 if g:netrw_ftp_browse_reject != ""
1293 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001294 endif
1295 endif
1296
1297 " set up syntax highlighting
1298 if has("syntax")
1299 setlocal ft=netrwlist
1300 if !has("syntax_items")
1301 setlocal ft=
1302 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001303 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001304
1305 " manipulate the directory listing (hide, sort)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001306 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001307 if g:netrw_hide && g:netrw_list_hide != ""
1308 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001309 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001310
Bram Moolenaar8299df92004-07-10 09:47:34 +00001311 if g:netrw_longlist
1312 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001313" call Decho("manipulate long listing")
1314
1315 if method == "ftp"
1316 " cleanup
1317 exe "keepjumps ".s:netrw_bannercnt
1318 while getline(".") =~ '^total\s\+\d\+$' || getline(".") =~ 'Trying\s\+\d\+.*$'
1319 keepjumps d
1320 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001321 " if there's no ../ listed, then put ./ and ../ in
1322 let line1= line(".")
1323 keepjumps 1
1324 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1325 let line2= line(".")
1326 if line2 == 0
1327 exe 'keepjumps '.s:netrw_bannercnt."put='./'"
1328 exe 'keepjumps '.s:netrw_bannercnt."put='../'"
1329 endif
1330 exe "keepjumps ".line1
1331 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001332 endif
1333
1334 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/ -> .*$//e'
1335 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1336 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001337 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001338
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001339 if line("$") >= s:netrw_bannercnt
1340 if g:netrw_sort_by =~ "^n"
1341 call s:SetSort()
Bram Moolenaar83bab712005-08-01 21:58:57 +00001342 if v:version < 700
1343 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001344 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001345 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001346 else
1347 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001348 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001349 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
1350 endif
1351 if g:netrw_longlist
1352 " shorten the list to keep its width <= 80 characters
1353 exe "keepjumps silent ".s:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
1354 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001355 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001356 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001357 exe "keepjumps ".s:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001358 setlocal nomod
1359 setlocal noma
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001360 setlocal nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001361
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001362" call Dret("NetBrowse")
1363 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001364endfun
1365
1366" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001367" NetBrowseChgDir: {{{2
1368fun! <SID>NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001369" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001370
1371 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001372 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001373
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001374 if newdir !~ '[\/]$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001375 " handling a file
1376 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001377" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001378
1379 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001380 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001381" call Decho("refresh directory listing")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001382 setlocal ma nobl bh=hide
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001383 %d
1384
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001385 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001386 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001387 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001388
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001389 if trailer =~ '^\%(\.\./\)*$'
1390 " tack on a ../"
1391 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001392
1393 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001394 " strip off a directory name from dirname
1395 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001396 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001397" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001398
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001399 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001400 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001401 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001402" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001403 endif
1404
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001405" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001406 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001407endfun
1408
Bram Moolenaar843ee412004-06-30 16:16:41 +00001409" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001410" NetGetWord: it gets the directory named under the cursor
1411fun! <SID>NetGetWord()
1412" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001413 if line(".") < s:netrw_bannercnt
1414 let dirname= "./"
1415 else
1416 let dirname= getline(".")
1417 if dirname =~ '\t'
1418 let dirname= substitute(dirname,'\t.*$','','e')
1419 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001420 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001421" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001422 return dirname
1423endfun
1424
1425" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001426" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar843ee412004-06-30 16:16:41 +00001427fun! <SID>NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001428" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1429" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001430
1431 " preparation for removing multiple files/directories
1432 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001433 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001434
1435 " remove multiple files and directories
1436 while ctr <= a:lastline
1437 exe ctr
1438
1439 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001440 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001441" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001442
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001443 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001444 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001445 if !all
1446 echohl Statement
1447 call inputsave()
1448 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1449 call inputrestore()
1450 echohl NONE
1451 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1452 if ok =~ 'a\%[ll]'
1453 let all= 1
1454 endif
1455 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001456
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001457 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001458 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1459 silent! keepjumps .,$d
1460 call NetBrowseFtpCmd(a:path,"delete ".rmfile)
1461 else
1462 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1463" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1464 let ret= system(netrw_rm_cmd)
1465" call Decho("returned=".ret." errcode=".v:shell_error)
1466 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001467 elseif ok =~ 'q\%[uit]'
1468 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001469 endif
1470
1471 else
1472 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001473 if !all
1474 call inputsave()
1475 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1476 call inputrestore()
1477 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1478 if ok =~ 'a\%[ll]'
1479 let all= 1
1480 endif
1481 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001482
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001483 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001484 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1485 call NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
1486 else
1487 let rmfile = a:path.rmfile
1488 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1489" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1490 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001491" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001492
1493 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001494 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001495" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1496 let ret= system(netrw_rmf_cmd)
1497" call Decho("returned=".ret." errcode=".v:shell_error)
1498
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001499 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001500 echoerr "***netrw*** unable to remove directory<".rmfile."> -- is it empty?"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001501 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001502 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001503 endif
1504 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001505
1506 elseif ok =~ 'q\%[uit]'
1507 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001508 endif
1509 endif
1510
1511 let ctr= ctr + 1
1512 endwhile
1513
1514 " refresh the directory
1515 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001516" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001517 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1518 exe curline
1519
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001520" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001521endfun
1522
1523" ---------------------------------------------------------------------
1524" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00001525fun! <SID>NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001526" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001527
1528 " preparation for removing multiple files/directories
1529 let ctr = a:firstline
1530 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1531
1532 " attempt to rename files/directories
1533 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001534 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001535
1536 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001537 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001538" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001539
1540 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001541 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001542 call inputrestore()
1543
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001544 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1545 call NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
1546 else
1547 let oldname= a:path.oldname
1548 let newname= a:path.newname
1549" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1550 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1551 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001552
1553 let ctr= ctr + 1
1554 endwhile
1555
1556 " refresh the directory
1557 let curline= line(".")
1558 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001559 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001560" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001561endfun
1562
1563" ---------------------------------------------------------------------
1564" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001565" files given their extension. Passes 0=local, 1=remote
1566fun! <SID>NetBrowseX(fname,remote)
1567" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001568
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001569 " set up the filename
1570 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001571 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001572 if has("win32") || has("win95") || has("win64") || has("win16")
1573 let exten= substitute(exten,'^.*$','\L&\E','')
1574 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001575 let fname= escape(a:fname,"%#")
1576" call Decho("fname<".fname."> after escape()")
1577
1578 if a:remote == 1
1579 " create a local copy
1580 let fname= tempname().".".exten
1581" call Decho("create a local copy of <".a:fname."> as <".fname.">")
1582 exe "keepjumps silent bot 1new ".a:fname
1583 let eikeep= &ei
1584 set ei=all bh=delete
1585 exe "w! ".fname
1586 let &ei= eikeep
1587 q
1588 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001589" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001590
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001591 " set up redirection
1592 if &srr =~ "%s"
1593 let redir= substitute(&srr,"%s","/dev/null"."")
1594 else
1595 let redir= &srr . "/dev/null"
1596 endif
1597" call Decho("redir:".redir.":")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001598
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001599 " execute the file handler
1600 if has("win32") || has("win64")
1601" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1602 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1603 let ret= v:shell_error
1604
1605 elseif has("unix") && executable("kfmclient")
1606" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1607 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1608 let ret= v:shell_error
1609
1610 elseif has("unix") && executable("gnome-open")
1611" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1612 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1613 let ret= v:shell_error
1614
1615 elseif exten != "" && exists("*NetrwFileHandler_".exten)
1616" call Decho("let ret= NetrwFileHandler_".exten.'("'.fname.'")')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001617 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001618 endif
1619 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001620
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001621 " cleanup: remove temporary file,
1622 " delete current buffer if success with handler,
1623 " return to prior buffer (directory listing)
1624 if a:remote == 1 && fname != a:fname
1625" call Decho("deleting temporary file<".fname.">")
1626 call delete(fname)
1627 endif
1628
1629 if a:remote == 1
1630 let eikeep= &ei
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001631 set ei=all bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001632 exe "norm! \<c-o>"
1633 let &ei= eikeep
1634 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001635 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001636
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001637" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001638endfun
1639
1640" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001641" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1642" This function assumes that a long listing will be received. Size, time,
1643" and reverse sorts will be requested of the server but not otherwise
1644" enforced here.
1645fun! NetBrowseFtpCmd(path,cmd)
1646" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".s:netrw_method)
1647
1648 " because WinXX ftp uses unix style input
1649 " curline is one more than the bannercnt in order to account
1650 " for the unwanted first blank line (doing a :put to an empty
1651 " buffer yields a blank first line)
1652 let ffkeep= &ff
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001653 setlocal ma ff=unix
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001654 let curline= s:netrw_bannercnt+1
1655 exe "silent! keepjumps ".curline.",$d"
1656
1657 ".........................................
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001658 if s:netrw_method == 2 || s:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001659 " ftp + <.netrc>: Method #2
1660 if a:path != ""
1661 put ='cd '.a:path
1662 endif
1663 exe "put ='".a:cmd."'"
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001664" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001665 if exists("g:netrw_port") && g:netrw_port != ""
1666" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1667 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1668 else
1669" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1670 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1671 endif
1672
1673 ".........................................
1674 elseif s:netrw_method == 3
1675 " ftp + machine,id,passwd,filename: Method #3
1676 setlocal ff=unix
1677 if exists("g:netrw_port") && g:netrw_port != ""
1678 put ='open '.g:netrw_machine.' '.g:netrw_port
1679 else
1680 put ='open '.g:netrw_machine
1681 endif
1682
1683 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1684 put =g:netrw_uid
1685 put =g:netrw_passwd
1686 else
1687 put ='user '.g:netrw_uid.' '.g:netrw_passwd
1688 endif
1689
1690 if a:path != ""
1691 put ='cd '.a:path
1692 endif
1693 exe "put ='".a:cmd."'"
1694
1695 " perform ftp:
1696 " -i : turns off interactive prompting from ftp
1697 " -n unix : DON'T use <.netrc>, even though it exists
1698 " -n win32: quit being obnoxious about password
1699" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1700 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1701
1702 ".........................................
1703 else
1704 echo "***warning*** unable to comply with your request<" . choice . ">"
1705 endif
1706
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001707 " cleanup for Windows
1708 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001709 keepjumps silent!! %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001710 endif
1711 if a:cmd == "dir"
1712 " infer directory/link based on the file permission string
Bram Moolenaar83bab712005-08-01 21:58:57 +00001713 keepjumps silent! g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1714 keepjumps silent! g/l\%([-r][-w][-x]\)\{3}/s/$/@/
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001715 if !g:netrw_longlist
Bram Moolenaar83bab712005-08-01 21:58:57 +00001716 exe "keepjumps silent! ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001717 endif
1718 endif
1719
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001720 " restore settings
1721 let &ff= ffkeep
1722" call Dret("NetBrowseFtpCmd")
1723endfun
1724
1725" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001726" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1727" separated patterns given in g:netrw_list_hide
1728fun! <SID>NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001729" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001730
1731 let listhide= g:netrw_list_hide
1732 while listhide != ""
1733 if listhide =~ ','
1734 let hide = substitute(listhide,',.*$','','e')
1735 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1736 else
1737 let hide = listhide
1738 let listhide= ""
1739 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001740
1741 " Prune the list by hiding any files which match
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001742" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001743 if g:netrw_hide == 1
1744 exe 'keepjumps silent '.s:netrw_bannercnt.',$g~'.hide.'~d'
1745 elseif g:netrw_hide == 2
1746 exe 'keepjumps silent '.s:netrw_bannercnt.',$v~'.hide.'~d'
1747 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001748 endwhile
1749
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001750" call Dret("NetrwListHide")
1751endfun
1752
1753" ---------------------------------------------------------------------
1754" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar8299df92004-07-10 09:47:34 +00001755fun! <SID>NetHideEdit(mode)
1756" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001757
1758 call inputsave()
1759 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1760 call inputrestore()
1761
1762 " refresh the listing
1763 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001764 if a:mode == 0
1765 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1766 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001767 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001768 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001769
1770" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001771endfun
1772
Bram Moolenaar8299df92004-07-10 09:47:34 +00001773" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001774" NetSortSequence: allows user to edit the sorting sequence
1775fun! <SID>NetSortSequence(mode)
1776" call Dfunc("NetSortSequence(mode=".a:mode.")")
1777
1778 call inputsave()
1779 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
1780 call inputrestore()
1781
1782 " refresh the listing
1783 let g:netrw_sort_sequence= newsortseq
1784 if a:mode == 0
1785 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1786 else
1787 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
1788 endif
1789
1790" call Dret("NetSortSequence")
1791endfun
1792
1793" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001794" NetLongList: {{{2
1795fun! <SID>NetLongList(mode)
1796" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".g:netrw_longlist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001797 call s:NetSavePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001798
1799 if g:netrw_longlist != 0
1800 " turn long listing off
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001801" call Decho("turn long listing off")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001802 let g:netrw_longlist = 0
1803 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1804
1805 else
1806 " turn long listing on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001807" call Decho("turn long listing on")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001808 let g:netrw_longlist = 1
1809 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
1810 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001811 setlocal ma
1812 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00001813
1814 " refresh the listing
1815 if a:mode == 0
1816 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1817 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001818 silent call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001819 endif
1820
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001821 call s:NetRestorePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001822" call Dret("NetLongList : g:netrw_longlist=".g:netrw_longlist)
1823endfun
1824
1825" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001826" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001827" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
1828" the same word even though the sorting has changed its order of appearance.
1829fun! s:NetSaveWordPosn()
1830" call Dfunc("NetSaveWordPosn()")
1831 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
1832" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
1833endfun
1834
1835" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001836" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001837fun! s:NetRestoreWordPosn()
1838" call Dfunc("NetRestoreWordPosn()")
1839 silent! call search(s:netrw_saveword,'w')
1840" call Dret("NetRestoreWordPosn")
1841endfun
1842
1843" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001844" NetMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001845fun! <SID>NetMakeDir(usrhost)
1846" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
1847
1848 " get name of new directory from user. A bare <CR> will skip.
1849 " if its currently a directory, also request will be skipped, but with
1850 " a message.
1851 call inputsave()
1852 let newdirname= input("Please give directory name: ")
1853 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001854" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001855
1856 if newdirname == ""
1857" call Dret("NetMakeDir : user aborted with bare <cr>")
1858 return
1859 endif
1860
1861 if a:usrhost == ""
1862
1863 " Local mkdir:
1864 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001865 let fullnewdir= b:netrw_curdir.'/'.newdirname
1866" call Decho("fullnewdir<".fullnewdir.">")
1867 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001868 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001869 echoerr "***netrw*** <".newdirname."> is already a directory!"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001870 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001871 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001872" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
1873 return
1874 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001875 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001876 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001877 echoerr "***netrw*** <".newdirname."> is already a file!"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001878 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001879 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001880" call Dret("NetMakeDir : file<".newdirname."> exists previously")
1881 return
1882 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00001883
1884 " requested new local directory is neither a pre-existing file or
1885 " directory, so make it!
1886 if exists("*mkdir")
1887 call mkdir(fullnewdir,"p")
1888 else
1889 let netrw_origdir= s:NetGetcwd(1)
1890 exe 'cd '.b:netrw_curdir
1891" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
1892" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
1893 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001894 if !g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00001895 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001896
Bram Moolenaar8299df92004-07-10 09:47:34 +00001897 if v:shell_error == 0
1898 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001899" call Decho("refresh listing")
1900 let linenum= line(".")
1901 norm! H0
1902 let hline = line(".")
1903 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
1904 exe "norm! ".hline."G0z\<CR>"
1905 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001906 elseif !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001907 echoerr "***netrw*** unable to make directory<".newdirname.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001908 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001909 endif
1910 redraw!
1911
1912 else
1913 " Remote mkdir:
1914 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001915 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00001916" call Decho("exe silent! !".mkdircmd." ".newdirname)
1917 exe "silent! !".mkdircmd." ".newdirname
1918 if v:shell_error == 0
1919 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001920 let linenum= line(".")
1921 norm! H0
1922 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001923 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001924 exe "norm! ".hline."G0z\<CR>"
1925 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001926 elseif !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00001927 echoerr "***netrw*** unable to make directory<".newdirname.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001928 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001929 endif
1930 redraw!
1931 endif
1932
1933" call Dret("NetMakeDir")
1934endfun
1935
1936" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00001937" NetBookmarkDir: {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001938" 0: bookmark the current directory
1939" 1: change to the bookmarked directory
1940fun! <SID>NetBookmarkDir(chg,curdir)
1941" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
1942
1943 if a:chg == 0
1944 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001945 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
1946 if !exists("g:NETRW_BOOKMARKMAX")
1947 let g:NETRW_BOOKMARKMAX= v:count
1948 elseif v:count > g:NETRW_BOOKMARKMAX
1949 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001950 endif
1951
1952 elseif a:chg == 1
1953 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001954 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
1955 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001956 else
1957 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
1958 endif
1959
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001960 elseif a:chg == 2
1961 if exists("g:NETRW_BOOKMARKMAX")
1962 " list user's bookmarks
1963" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
1964 let cnt= 0
1965 while cnt <= g:NETRW_BOOKMARKMAX
1966 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
1967" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
1968 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
1969 endif
1970 let cnt= cnt + 1
1971 endwhile
1972 endif
1973
1974 " list directory history
1975 let cnt = g:NETRW_DIRHIST_CNT
1976 let first = 1
1977 let histcnt = 0
1978 while ( first || cnt != g:NETRW_DIRHIST_CNT )
1979" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
1980 let histcnt= histcnt + 1
1981 if exists("g:NETRW_DIRHIST_{cnt}")
1982" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
1983 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001984 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001985 let first = 0
1986 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
1987 if cnt < 0
1988 let cnt= cnt + g:netrw_dirhistmax
1989 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001990 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001991
1992 elseif a:chg == 3
1993 " saves most recently visited directories
1994 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1995 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
1996" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1997
1998 elseif a:chg == 4
1999 " u: change to the previous directory stored on the history list
2000 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2001 if g:NETRW_DIRHIST_CNT < 0
2002 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2003 endif
2004 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2005" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2006 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2007 else
2008 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2009 echo "Sorry, no predecessor directory exists yet"
2010 endif
2011
2012 elseif a:chg == 5
2013 " U: change to the subsequent directory stored on the history list
2014 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2015 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2016" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2017 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2018 else
2019 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2020 if g:NETRW_DIRHIST_CNT < 0
2021 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2022 endif
2023 echo "Sorry, no successor directory exists yet"
2024 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002025 endif
2026" call Dret("NetBookmarkDir")
2027endfun
2028
Bram Moolenaar83bab712005-08-01 21:58:57 +00002029" ==========================================
2030" Local Directory Browsing Support: {{{1
2031" ==========================================
Bram Moolenaar8299df92004-07-10 09:47:34 +00002032
2033" ---------------------------------------------------------------------
2034" LocalBrowse: supports local file/directory browsing {{{2
2035fun! <SID>LocalBrowse(dirname)
2036
2037" let dirname= (a:dirname == "")? expand("%:p") : a:dirname
2038 if !isdirectory(a:dirname)
2039 " not a directory, ignore it
2040 return
2041 endif
2042
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002043 " unfortunate interaction -- when putting debugging calls
2044 " above one can no longer enter the DBG buffer.
2045" call Dfunc("LocalBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr())
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002046" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002047
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002048 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002049 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002050 echoerr "***netrw*** vim version<".v:version."> too old for browsing with netrw"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002051 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002052 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002053" call Dret("LocalBrowse : vim version<".v:version."> too old")
2054 return
2055 endif
2056
Bram Moolenaar83bab712005-08-01 21:58:57 +00002057 " record autochdir setting and then insure its unset (tnx to David Fishburn)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002058 if has("netbeans_intg") || has("sun_workshop")
2059 let keep_autochdir= &autochdir
2060 set noautochdir
2061 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002062
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002063 " find buffer number of buffer named precisely the same as a:dirname
2064 let bufnum= bufnr(a:dirname)
2065" call Decho("findbuf: bufnum=".bufnum)
2066 if bufnum > 0 && bufname(bufnum) != a:dirname
2067 let ibuf= 1
2068 let buflast= bufnr("$")
2069 while bufname(ibuf) !~ '^'.a:dirname.'\=$' && ibuf <= buflast
2070" call Decho("findbuf: ibuf=".ibuf. " bufname<".bufname(ibuf)."> dirname<".a:dirname.">")
2071 let ibuf= ibuf + 1
2072 endwhile
2073 if ibuf > buflast
2074 let bufnum= -1
2075 else
2076 let bufnum= ibuf
2077 endif
2078" call Decho("findbuf: bufnum=".bufnum." (final)")
2079 endif
2080
2081 " get cleared buffer
2082 if bufnum < 0
2083 if v:version < 700
2084 enew!
2085 else
2086 keepalt enew!
2087 endif
2088" call Decho("enew buffer")
2089 else
2090 let eikeep= &ei
2091 set ei=BufEnter
2092 if v:version < 700
2093 exe "b ".bufnum
2094 else
2095 exe "keepalt b ".bufnum
2096 endif
2097 let &ei= eikeep
2098 if getline(2) =~ '^" Directory Listing '
2099" call Dret("LocalBrowse : reusing buffer#".bufnum."<".a:dirname.">")
2100 return
2101 endif
2102 endif
2103
2104 " get the new directory name
Bram Moolenaar83bab712005-08-01 21:58:57 +00002105 let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
2106 if b:netrw_curdir =~ '[/\\]$'
2107 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2108 endif
2109" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002110
Bram Moolenaar83bab712005-08-01 21:58:57 +00002111 " make netrw's idea of the current directory vim's if the user wishes
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002112 if !g:netrw_keepdir
Bram Moolenaar83bab712005-08-01 21:58:57 +00002113" call Decho("change directory: cd ".b:netrw_curdir)
2114 exe 'cd '.b:netrw_curdir
2115 endif
2116
2117 " change the name of the buffer to reflect the b:netrw_curdir
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002118 exe 'silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002119
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002120 " make this buffer modifiable and hidden
2121 setlocal ma hidden nonu
Bram Moolenaar8299df92004-07-10 09:47:34 +00002122
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002123 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002124 " Perform Directory Listing:
Bram Moolenaar8299df92004-07-10 09:47:34 +00002125
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002126 " save current directory on directory history list
Bram Moolenaar83bab712005-08-01 21:58:57 +00002127 call <SID>NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002128
Bram Moolenaar8299df92004-07-10 09:47:34 +00002129 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002130" call Decho("Setting up local browser maps")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002131 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2132 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
2133 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002134 nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002135 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2136 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2137 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2138 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2139 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002140 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002141 nnoremap <buffer> <silent> o :exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2142 nnoremap <buffer> <silent> p :exe "norm! 0"<bar>call <SID>LocalPreview(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),1))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002143 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
2144 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
2145 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>
2146 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002147 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2148 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002149 nnoremap <buffer> <silent> v :exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002150 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)<cr>
2151 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2152 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2153 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2154 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2155 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2156 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
2157 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002158 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002159 nnoremap <buffer> ? :he netrw-dir<cr>
2160
2161 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002162" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002163 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002164 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002165 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002166 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002167 let s:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002168
2169 let sortby= g:netrw_sort_by
2170 if g:netrw_sort_direction =~ "^r"
2171 let sortby= sortby." reversed"
2172 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002173
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002174 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002175 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002176" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002177 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002178 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002179 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002180 let s:netrw_bannercnt= s:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002181 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002182" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002183 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002184 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002185 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002186 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002187
2188 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002189 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002190 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002191 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002192 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002193 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002194 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002195 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002196 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002197 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2198 keepjumps put ='\" ============================================================================'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002199 let s:netrw_bannercnt= s:netrw_bannercnt + 2
2200
2201 " bannercnt should index the line just after the banner
2202 let s:netrw_bannercnt= s:netrw_bannercnt + 1
2203" call Decho("bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002204
2205 " generate the requested directory listing
Bram Moolenaar83bab712005-08-01 21:58:57 +00002206 call LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002207
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002208 " set up syntax highlighting
2209 if has("syntax")
2210 setlocal ft=netrwlist
2211 if !has("syntax_items")
2212 setlocal ft=
2213 endif
2214 endif
2215
Bram Moolenaar8299df92004-07-10 09:47:34 +00002216 " manipulate the directory listing (hide, sort)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002217 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002218 if g:netrw_hide && g:netrw_list_hide != ""
2219 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002220 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002221 if line("$") >= s:netrw_bannercnt
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002222
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002223 if g:netrw_sort_by =~ "^n"
2224 call s:SetSort()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002225
Bram Moolenaar83bab712005-08-01 21:58:57 +00002226 if v:version < 700
2227 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002228 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002229 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002230 else
2231 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002232 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002233 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002234
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002235 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002236 if v:version < 700
2237 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002238 elseif g:netrw_sort_direction =~ 'n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002239 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002240 else
2241 exe 'keepjumps silent '.s:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002242 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002243 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{-}\///e'
2244 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002245
Bram Moolenaar8299df92004-07-10 09:47:34 +00002246 endif
2247 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002248 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00002249
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002250 setlocal noma nomod nonu bh=hide nobl
2251 if has("netbeans_intg") || has("sun_workshop")
2252 let &autochdir= keep_autochdir
2253 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002254
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002255" call Dret("LocalBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002256endfun
2257
2258" ---------------------------------------------------------------------
2259" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar83bab712005-08-01 21:58:57 +00002260fun! LocalBrowseList()
2261" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002262
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002263 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00002264 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
2265 let dirnamelen = strlen(b:netrw_curdir)
2266 let filelist = glob(dirname."/*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002267" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002268 if filelist != ""
2269 let filelist= filelist."\n"
2270 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002271 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002272" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2273
2274 " if the directory name includes a "$", and possibly other characters,
2275 " the glob() doesn't include "." and ".." entries.
2276 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2277" call Decho("forcibly tacking on .")
2278 if filelist == ""
2279 let filelist= dirname."."
2280 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002281 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002282 endif
2283" call Decho("filelist<".filelist.">")
2284 endif
2285 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2286" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002287 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002288" call Decho("filelist<".filelist.">")
2289 endif
2290 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
2291
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002292" call Decho("dirname<".dirname.">")
2293" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002294" call Decho("filelist<".filelist.">")
2295
2296 while filelist != ""
2297 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002298 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002299 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2300 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002301 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002302 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00002303 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002304 let pfile= filename
2305 if isdirectory(filename)
2306 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002307 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002308 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002309 if pfile =~ '//$'
2310 let pfile= substitute(pfile,'//$','/','e')
2311 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002312 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002313" call Decho(" ")
2314" call Decho("filename<".filename.">")
2315" call Decho("pfile <".pfile.">")
2316
Bram Moolenaar8299df92004-07-10 09:47:34 +00002317 if g:netrw_longlist
Bram Moolenaar83bab712005-08-01 21:58:57 +00002318 let sz = getfsize(filename)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002319 if v:version <= 700
2320 let fsz = strpart(" ",1,15-strlen(sz)).sz
2321 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
2322 else
2323 let pfile= printf('%-'.g:netrw_maxfilenamelen.'s%15d%s',pfile,sz,getftime(filename))
2324 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002325" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002326 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002327
Bram Moolenaar8299df92004-07-10 09:47:34 +00002328 if g:netrw_sort_by =~ "^t"
2329 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002330" call Decho("getftime(".filename.")=".getftime(filename))
2331 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002332 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00002333" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002334 let ftpfile= ft.'/'.pfile
2335 keepjumps put=ftpfile
2336
Bram Moolenaar8299df92004-07-10 09:47:34 +00002337 elseif g:netrw_sort_by =~ "^s"
2338 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002339" call Decho("getfsize(".filename.")=".getfsize(filename))
2340 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002341 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00002342" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002343 let fszpfile= fsz.'/'.pfile
2344 keepjumps put =fszpfile
2345
Bram Moolenaar8299df92004-07-10 09:47:34 +00002346 else
2347 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002348" call Decho("exe keepjumps put ='".pfile."'")
2349 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002350 endif
2351 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00002352 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00002353
2354" call Dret("LocalBrowseList")
2355endfun
2356
2357" ---------------------------------------------------------------------
2358" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2359" directory and a new directory name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002360fun! <SID>LocalBrowseChgDir(dirname,newdir,...)
2361" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002362
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002363 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002364 let newdir = a:newdir
2365
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002366 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002367 " apparently vim is "recognizing" that it is in the home directory and
2368 " is removing the "/". Bad idea, so I have to put it back.
2369 let dirname= dirname.'/'
2370" call Decho("adjusting dirname<".dirname.">")
2371 endif
2372
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002373 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002374 " handling a file
2375 let dirname= dirname.newdir
2376" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002377 " this lets NetBrowseX avoid the edit
2378 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002379" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
2380" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
2381 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002382 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002383
2384 elseif newdir == './'
2385 " refresh the directory list
2386" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002387
2388 elseif newdir == '../'
2389 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002390 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002391" call Decho("go up one dir: dirname<".dirname.">")
2392
2393 else
2394 " go down one directory
2395 let dirname= dirname.newdir
2396" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2397 endif
2398
2399" call Dret("LocalBrowseChgDir <".dirname.">")
2400 return dirname
2401endfun
2402
2403" ---------------------------------------------------------------------
2404" LocalBrowseRm:
2405fun! <SID>LocalBrowseRm(path) range
2406" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2407" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2408
2409 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002410 let ctr = a:firstline
2411 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002412 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002413
2414 " remove multiple files and directories
2415 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002416 exe "keepjumps ".ctr
2417
2418 " sanity checks
2419 if line(".") < s:netrw_bannercnt
2420 let ctr= ctr + 1
2421 continue
2422 endif
2423 let curword= s:NetGetWord()
2424 if curword == "./" || curword == "../"
2425 let ctr= ctr + 1
2426 continue
2427 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002428
2429 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00002430 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002431" call Decho("rmfile<".rmfile.">")
2432
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002433 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002434 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002435 if !all
2436 echohl Statement
2437 call inputsave()
2438 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2439 call inputrestore()
2440 echohl NONE
2441 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2442 if ok =~ 'a\%[ll]'
2443 let all= 1
2444 endif
2445 endif
2446
2447 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002448 let ret= delete(rmfile)
2449" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002450 elseif ok =~ 'q\%[uit]'
2451 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002452 endif
2453
2454 else
2455 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002456 if !all
2457 echohl Statement
2458 call inputsave()
2459 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2460 call inputrestore()
2461 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2462 if ok =~ 'a\%[ll]'
2463 let all= 1
2464 endif
2465 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002466 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002467
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002468 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002469" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2470 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002471" call Decho("v:shell_error=".v:shell_error)
2472
2473 if v:shell_error != 0
2474" call Decho("2nd attempt to remove directory<".rmfile.">")
2475 let errcode= delete(rmfile)
2476" call Decho("errcode=".errcode)
2477
2478 if errcode != 0
2479 if has("unix")
2480" call Decho("3rd attempt to remove directory<".rmfile.">")
2481 call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002482 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002483 echoerr "***netrw*** unable to remove directory<".rmfile."> -- is it empty?"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002484 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002485 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002486 elseif !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002487 echoerr "***netrw*** unable to remove directory<".rmfile."> -- is it empty?"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002488 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002489 endif
2490 endif
2491 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002492
2493 elseif ok =~ 'q\%[uit]'
2494 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002495 endif
2496 endif
2497
2498 let ctr= ctr + 1
2499 endwhile
2500
2501 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002502 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002503" call Decho("refresh the directory")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002504 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002505 exe curline
2506
2507" call Dret("LocalBrowseRm")
2508endfun
2509
2510" ---------------------------------------------------------------------
2511" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00002512fun! <SID>LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002513" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2514
2515 " preparation for removing multiple files/directories
2516 let ctr= a:firstline
2517
2518 " attempt to rename files/directories
2519 while ctr <= a:lastline
2520 exe "keepjumps ".ctr
2521
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002522 " sanity checks
2523 if line(".") < s:netrw_bannercnt
2524 let ctr= ctr + 1
2525 continue
2526 endif
2527 let curword= s:NetGetWord()
2528 if curword == "./" || curword == "../"
2529 let ctr= ctr + 1
2530 continue
2531 endif
2532
Bram Moolenaar8299df92004-07-10 09:47:34 +00002533 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002534 let oldname= a:path.curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002535" call Decho("oldname<".oldname.">")
2536
2537 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002538 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002539 call inputrestore()
2540
Bram Moolenaar83bab712005-08-01 21:58:57 +00002541 let ret= rename(oldname,newname)
2542" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002543
2544 let ctr= ctr + 1
2545 endwhile
2546
2547 " refresh the directory
2548 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002549" call Decho("refresh the directory listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002550 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002551 exe "keepjumps ".curline
2552" call Dret("LocalBrowseRename")
2553endfun
2554
2555" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002556" LocalPreview: {{{2
2557fun! <SID>LocalPreview(path) range
2558" call Dfunc("LocalPreview(path<".a:path.">)")
2559 if has("quickfix")
2560 if !isdirectory(a:path)
2561 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002562 elseif !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002563 echoerr "***netrw*** sorry, cannot preview a directory such as <".a:path.">"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002564 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002565 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002566 elseif !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002567 echoerr "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002568 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002569 endif
2570" call Dret("LocalPreview")
2571endfun
2572
2573" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002574" Explore: launch the local browser in the directory of the current file {{{2
2575" dosplit==0: the window will be split iff the current file has
2576" been modified
2577" dosplit==1: the window will be split before running the local
2578" browser
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002579fun! s:Explore(indx,dosplit,style,...)
2580" call Dfunc("Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.")")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002581
2582 " if dosplit or file has been modified
2583 if a:dosplit || &modified
2584 if a:style == 0 " Explore, Sexplore
2585 exe g:netrw_winsize."wincmd s"
2586 elseif a:style == 1 "Explore!, Sexplore!
2587 exe g:netrw_winsize."wincmd v"
2588 elseif a:style == 2 " Hexplore
2589 exe "bel ".g:netrw_winsize."wincmd s"
2590 elseif a:style == 3 " Hexplore!
2591 exe "abo ".g:netrw_winsize."wincmd s"
2592 elseif a:style == 4 " Vexplore
2593 exe "lefta ".g:netrw_winsize."wincmd v"
2594 elseif a:style == 5 " Vexplore!
2595 exe "rightb ".g:netrw_winsize."wincmd v"
2596 endif
2597 endif
2598 norm! 0
2599
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002600 if a:1 == "" && a:indx >= 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00002601 let newdir= substitute(expand("%:p"),'^\(.*\)[/\\][^/\\]*$','\1','e')
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002602" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2603 call s:LocalBrowse(newdir)
2604
2605 elseif a:1 =~ '\*\*' || a:indx < 0
2606
2607 if has("path_extra")
2608 if !exists("s:indx")
2609 let s:indx= 0
2610 endif
2611 let indx = a:indx
2612 if indx == -1
2613 let indx= s:indx + 1
2614 elseif indx == -2
2615 let indx= s:indx - 1
2616 else
2617 let s:indx = 0
2618 let s:explorelist = split(expand(b:netrw_curdir."/".a:1),'\n')
2619 let s:listlen = len(s:explorelist)
2620 endif
2621 let s:indx = indx
2622" call Decho("explorelist<".join(s:explorelist,',')."> len=".s:listlen)
2623
2624 " sanity check
2625 if indx >= s:listlen
2626 echoerr "***netrw*** no more directories with matching files"
2627 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2628" call Dret("Explore")
2629 return
2630 endif
2631
2632 exe "let dirfile= s:explorelist[".indx."]"
2633" call Decho("dirfile<".dirfile."> indx=".indx)
2634 let newdir= substitute(dirfile,'/[^/]*$','','e')
2635" call Decho("newdir<".newdir.">")
2636" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2637 call s:LocalBrowse(newdir)
2638 call search(substitute(dirfile,"^.*/","",""),"W")
2639
2640 else
2641 if v:version < 700
2642 echoerr "***netrw*** you need vim version 7.0 or later for Exploring with **!"
2643 elseif !exists("g:netrw_quiet")
2644 echoerr "***netrw*** your vim needs the path_extra feature for Exploring with **!"
2645 endif
2646 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2647 endif
2648
Bram Moolenaar83bab712005-08-01 21:58:57 +00002649 else
2650 let newdir= a:1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002651" call Decho("calling LocalBrowse(newdir<".newdir.">)")
2652 call s:LocalBrowse(newdir)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002653 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002654
2655" call Dret("Explore")
2656endfun
2657
2658" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002659" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002660" Change backslashes to forward slashes, if any.
2661" If doesc is true, escape certain troublesome characters
2662fun! <SID>NetGetcwd(doesc)
2663" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
2664 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002665 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002666 let curdir= curdir.'/'
2667 endif
2668 if a:doesc
2669 let curdir= escape(curdir,s:netrw_cd_escape)
2670 endif
2671" call Dret("NetGetcwd <".curdir.">")
2672 return curdir
2673endfun
2674
2675" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00002676" NetMethod: determine method of transfer {{{1
2677" method == 1: rcp
2678" 2: ftp + <.netrc>
2679" 3: ftp + machine, id, password, and [path]filename
2680" 4: scp
2681" 5: http (wget)
2682" 6: cadaver
2683" 7: rsync
2684" 8: fetch
2685" 9: sftp
2686fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002687" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002688
2689 " initialization
2690 let b:netrw_method = 0
2691 let g:netrw_machine = ""
2692 let b:netrw_fname = ""
2693 let g:netrw_port = ""
2694
2695 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002696 " mipf : a:machine a:id password filename Use ftp
2697 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002698 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002699 " rcpurm : rcp://[user@]host/filename Use rcp
2700 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002701 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002702 " httpurm : http://[user@]host/filename Use wget
2703 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002704 " rsyncurm : rsync://host[:port]/path Use rsync
2705 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2706 " sftpurm : sftp://[user@]host/filename Use scp
2707 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2708 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
2709 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002710 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002711 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
2712 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2713 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002714 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002715 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
2716 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2717 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
2718
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002719" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002720 " Determine Method
2721 " rcp://user@hostname/...path-to-file
2722 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002723" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002724 let b:netrw_method = 1
2725 let userid = substitute(a:choice,rcpurm,'\1',"")
2726 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
2727 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002728 if userid != ""
2729 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002730 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002731
2732 " scp://user@hostname/...path-to-file
2733 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002734" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002735 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00002736 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
2737 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
2738 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002739
2740 " http://user@hostname/...path-to-file
2741 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002742" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002743 let b:netrw_method = 5
2744 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2745 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
2746
2747 " dav://hostname[:port]/..path-to-file..
2748 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002749" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002750 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002751 if a:choice =~ '^s'
2752 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2753 else
2754 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2755 endif
2756 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002757
2758 " rsync://user@hostname/...path-to-file
2759 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002760" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002761 let b:netrw_method = 7
2762 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2763 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
2764
2765 " ftp://[user@]hostname[[:#]port]/...path-to-file
2766 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002767" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002768 let userid = substitute(a:choice,ftpurm,'\2',"")
2769 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2770 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2771 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002772 if userid != ""
2773 let g:netrw_uid= userid
2774 endif
2775 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2776 let b:netrw_method = 3
2777 else
2778 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
2779 let b:netrw_method= 2
2780 else
2781 if !exists("g:netrw_uid") || g:netrw_uid == ""
2782 call NetUserPass()
2783 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
2784 call NetUserPass(g:netrw_uid)
2785 " else just use current g:netrw_uid and g:netrw_passwd
2786 endif
2787 let b:netrw_method= 3
2788 endif
2789 endif
2790
2791 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002792" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002793 let b:netrw_method = 8
2794 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
2795 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
2796 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
2797 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
2798
2799 " Issue an ftp : "machine id password [path/]filename"
2800 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002801" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002802 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002803 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
2804 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
2805 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
2806 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
2807
2808 " Issue an ftp: "hostname [path/]filename"
2809 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002810" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002811 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2812 let b:netrw_method = 3
2813 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2814 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2815
2816 elseif filereadable(expand("$HOME/.netrc"))
2817 let b:netrw_method = 2
2818 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2819 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2820 endif
2821
2822 " sftp://user@hostname/...path-to-file
2823 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002824" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002825 let b:netrw_method = 9
2826 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
2827 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
2828
2829 " Issue an rcp: hostname:filename" (this one should be last)
2830 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002831" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002832 let b:netrw_method = 1
2833 let userid = substitute(a:choice,rcphf,'\2',"")
2834 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
2835 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002836" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
2837" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
2838" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
2839" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002840 if userid != ""
2841 let g:netrw_uid= userid
2842 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002843 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002844 " don't let PCs try <.netrc>
2845 let b:netrw_method = 3
2846 endif
2847
2848 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002849 if !exists("g:netrw_quiet")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002850 echoerr "***netrw*** cannot determine method"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002851 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002852 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002853 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002854 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00002855
2856 " remove any leading [:#] from port number
2857 if g:netrw_port != ""
2858 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
2859 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002860
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002861" call Decho("a:choice <".a:choice.">")
2862" call Decho("b:netrw_method <".b:netrw_method.">")
2863" call Decho("g:netrw_machine<".g:netrw_machine.">")
2864" call Decho("g:netrw_port <".g:netrw_port.">")
2865" if exists("g:netrw_uid") "Decho
2866" call Decho("g:netrw_uid <".g:netrw_uid.">")
2867" endif "Decho
2868" if exists("g:netrw_passwd") "Decho
2869" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
2870" endif "Decho
2871" call Decho("b:netrw_fname <".b:netrw_fname.">")
2872" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002873endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002874
2875" ------------------------------------------------------------------------
2876" NetUserPass: set username and password for subsequent ftp transfer {{{1
2877" Usage: :call NetUserPass() -- will prompt for userid and password
2878" :call NetUserPass("uid") -- will prompt for password
2879" :call NetUserPass("uid","password") -- sets global userid and password
2880fun! NetUserPass(...)
2881
2882 " get/set userid
2883 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002884" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002885 if !exists("g:netrw_uid") || g:netrw_uid == ""
2886 " via prompt
2887 let g:netrw_uid= input('Enter username: ')
2888 endif
2889 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002890" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002891 let g:netrw_uid= a:1
2892 endif
2893
2894 " get password
2895 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002896" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002897 let g:netrw_passwd= inputsecret("Enter Password: ")
2898 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002899" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002900 let g:netrw_passwd=a:2
2901 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002902" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002903endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002904
2905" ------------------------------------------------------------------------
2906" NetOptionSave: save options and set to "standard" form {{{1
2907fun!s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002908" call Dfunc("NetOptionSave()")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002909
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002910 " Get Temporary Filename
2911 let s:aikeep = &ai
2912 let s:cinkeep = &cin
2913 let s:cinokeep = &cino
2914 let s:comkeep = &com
2915 let s:cpokeep = &cpo
2916 let s:dirkeep = getcwd()
2917 let s:gdkeep = &gd
2918 let s:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00002919 setlocal cino =
2920 setlocal com =
2921 setlocal cpo -=aA
2922 setlocal nocin noai
2923 setlocal tw =0
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002924 if has("win32") && !has("win95")
2925 let s:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00002926 setlocal noswf
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002927" call Decho("setting s:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002928 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002929
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002930" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002931endfun
2932
2933" ------------------------------------------------------------------------
2934" NetOptionRestore: restore options {{{1
2935fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002936" call Dfunc("NetOptionRestore()")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002937
2938 let &ai = s:aikeep
2939 let &cin = s:cinkeep
2940 let &cino = s:cinokeep
2941 let &com = s:comkeep
2942 let &cpo = s:cpokeep
2943 exe "lcd ".s:dirkeep
2944 let &gd = s:gdkeep
2945 let &tw = s:twkeep
2946 if exists("s:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002947 if &directory == ""
2948 " user hasn't specified a swapfile directory;
2949 " netrw will temporarily make the swapfile
2950 " directory the current local one.
2951 let &directory = getcwd()
2952 silent! let &swf = s:swfkeep
2953 set directory=
2954 else
2955 let &swf= s:swfkeep
2956 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002957 unlet s:swfkeep
2958 endif
2959 unlet s:aikeep
2960 unlet s:cinkeep
2961 unlet s:cinokeep
2962 unlet s:comkeep
2963 unlet s:cpokeep
2964 unlet s:gdkeep
2965 unlet s:twkeep
2966 unlet s:dirkeep
2967
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002968" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002969endfun
2970
2971" ------------------------------------------------------------------------
2972" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002973" to handle extra junk that their system's ftp dumps
2974" into the transfer. This function is provided as an
2975" example and as a fix for a Windows 95 problem: in my
2976" experience, win95's ftp always dumped four blank lines
2977" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002978if has("win95") && g:netrw_win95ftp
2979 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002980" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002981 if method == 3 " ftp (no <.netrc>)
2982 let fourblanklines= line2 - 3
2983 silent fourblanklines.",".line2."g/^\s*/d"
2984 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002985" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002986 endfun
2987endif
2988
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002989" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002990" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002991if v:version < 700
2992 fun! <SID>NetSort() range
2993" " call Dfunc("NetSort()")
2994
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002995 let i = a:firstline + 1
2996 while i <= a:lastline
2997 " find insertion point via binary search
2998 let i_val = getline(i)
2999 let lo = a:firstline
3000 let hi = i
3001 while lo < hi
Bram Moolenaar83bab712005-08-01 21:58:57 +00003002 let mid = (lo + hi) / 2
3003 let mid_val = getline(mid)
3004 if g:netrw_sort_direction =~ '^n'
3005 " normal sorting order
3006 if i_val < mid_val
3007 let hi = mid
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003008 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003009 let lo = mid + 1
3010 if i_val == mid_val | break | endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003011 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003012 else
3013 " reverse sorting order
3014 if i_val > mid_val
3015 let hi = mid
3016 else
3017 let lo = mid + 1
3018 if i_val == mid_val | break | endif
3019 endif
3020 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003021 endwhile
3022 " do insert
3023 if lo < i
Bram Moolenaar83bab712005-08-01 21:58:57 +00003024 exe 'keepjumps '.i.'d_'
3025 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003026 endif
3027 let i = i + 1
3028 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00003029
3030" " call Dret("NetSort")
3031 endfun
3032endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003033
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003034" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00003035" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
3036" What this function does is to compute a priority for the patterns
3037" in the g:netrw_sort_sequence. It applies a substitute to any
3038" "files" that satisfy each pattern, putting the priority / in
3039" front. An "*" pattern handles the default priority.
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003040fun! <SID>SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003041" call Dfunc("SetSort() bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00003042 if g:netrw_longlist
3043 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
3044 else
3045 let seqlist = g:netrw_sort_sequence
3046 endif
3047 " sanity check -- insure that * appears somewhere
3048 if seqlist == ""
3049 let seqlist= '*'
3050 elseif seqlist !~ '\*'
3051 let seqlist= seqlist.',*'
3052 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003053 let priority = 1
3054 while seqlist != ""
3055 if seqlist =~ ','
3056 let seq = substitute(seqlist,',.*$','','e')
3057 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
3058 else
3059 let seq = seqlist
3060 let seqlist = ""
3061 endif
3062 let eseq= escape(seq,'/')
3063 if priority < 10
3064 let spriority= "00".priority.'\/'
3065 elseif priority < 100
3066 let spriority= "0".priority.'\/'
3067 else
3068 let spriority= priority.'\/'
3069 endif
3070" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
3071
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003072 " sanity check
3073 if s:netrw_bannercnt > line("$")
3074 " apparently no files were left after a Hiding pattern was used
3075" call Dret("SetSort : no files left after hiding")
3076 return
3077 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003078 if seq == '*'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003079 exe 'keepjumps silent '.s:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003080 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003081 exe 'keepjumps silent '.s:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003082 endif
3083 let priority = priority + 1
3084 endwhile
3085
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003086 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003087
3088" call Dret("SetSort")
3089endfun
3090
Bram Moolenaar83bab712005-08-01 21:58:57 +00003091let &cpo= s:keepcpo
3092unlet s:keepcpo
Bram Moolenaar071d4272004-06-13 20:20:40 +00003093" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00003094" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003095" vim:ts=8 fdm=marker