blob: efd528a153d759fe5fd51607968905211d9b7262 [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002" AUTOLOAD PORTION
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003" Date: Sep 29, 2005
4" Version: 72
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00005" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00006" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
7" Copyright: Copyright (C) 1999-2005 Charles E. Campbell, Jr. {{{1
Bram Moolenaar572cb562005-08-05 21:35:02 +00008" Permission is hereby granted to use and distribute this code,
9" with or without modifications, provided that this copyright
10" notice is copied with it. Like anything else that's free,
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000011" netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided
12" *as is* and comes with no warranty of any kind, either
13" expressed or implied. By using this plugin, you agree that
14" in no event will the copyright holder be liable for any damages
15" resulting from the use of this software.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000016" of this software.
Bram Moolenaar071d4272004-06-13 20:20:40 +000017"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000018" But be doers of the Word, and not only hearers, deluding your own selves {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000019" (James 1:22 RSV)
20" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000021
22" Exception for &cp: {{{1
23if &cp || exists("g:loaded_netrw")
24 finish
25endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +000026if v:version < 700
27 echohl WarningMsg | echo "***netrw*** you need vim version 7.0 or later for version ".g:loaded_netrw." of netrw" | echohl None
28 finish
29endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +000030let g:loaded_netrw = "v72"
31let s:keepcpo = &cpo
32set cpo&vim
33" call Decho("doing autoload/netrw.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +000034
35" ---------------------------------------------------------------------
36" Default values for global netrw variables {{{1
37if !exists("g:netrw_ftpmode")
38 let g:netrw_ftpmode= "binary"
39endif
40if !exists("g:netrw_win95ftp")
41 let g:netrw_win95ftp= 1
42endif
43if !exists("g:netrw_cygwin")
Bram Moolenaard4755bb2004-09-02 19:12:26 +000044 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000045 if &shell == "bash"
46 let g:netrw_cygwin= 1
47 else
48 let g:netrw_cygwin= 0
49 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000050 else
51 let g:netrw_cygwin= 0
52 endif
53endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000054if !exists("g:netrw_list_cmd")
55 if executable("ssh")
56 " provide a default listing command
57 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
58 else
Bram Moolenaar83bab712005-08-01 21:58:57 +000059" call Decho("ssh is not executable, can't do remote directory exploring with ssh")
Bram Moolenaar843ee412004-06-30 16:16:41 +000060 let g:netrw_list_cmd= ""
61 endif
62endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +000063if !exists("g:netrw_ftp_list_cmd")
64 if has("unix") || exists("g:netrw_cygwin")
65 let g:netrw_ftp_list_cmd= "ls -lF"
66 else
67 let g:netrw_ftp_list_cmd= "dir"
68 endif
69endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000070if !exists("g:netrw_rm_cmd")
71 let g:netrw_rm_cmd = "ssh HOSTNAME rm"
72endif
73if !exists("g:netrw_rmf_cmd")
74 let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
75endif
76if !exists("g:netrw_rmdir_cmd")
77 let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
78endif
79if !exists("g:netrw_rename_cmd")
80 let g:netrw_rename_cmd= "ssh HOSTNAME mv"
81endif
82if exists("g:netrw_silent") && g:netrw_silent != 0
83 let g:netrw_silentxfer= "silent "
84else
85 let g:netrw_silentxfer= ""
86endif
87if !exists("g:netrw_winsize")
88 let g:netrw_winsize= ""
89endif
90if !exists("g:netrw_list_hide")
91 let g:netrw_list_hide= ""
92endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000093if !exists("g:netrw_sort_by")
94 " alternatives: date size
95 let g:netrw_sort_by= "name"
96endif
97if !exists("g:netrw_sort_sequence")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000098 let g:netrw_sort_sequence= '[\/]$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000099endif
100if !exists("g:netrw_sort_direction")
101 " alternative: reverse (z y x ...)
102 let g:netrw_sort_direction= "normal"
103endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000104if !exists("g:netrw_longlist")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000105 let g:netrw_longlist= 0
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000106endif
107if g:netrw_longlist == 0 || g:netrw_longlist == 2
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000108 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
Bram Moolenaar8299df92004-07-10 09:47:34 +0000109else
110 let g:netrw_longlist= 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +0000111 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -l"
112endif
113if !exists("g:netrw_list_cmd")
Bram Moolenaar8299df92004-07-10 09:47:34 +0000114endif
115if !exists("g:netrw_timefmt")
116 let g:netrw_timefmt= "%c"
117endif
118if !exists("g:netrw_local_rmdir")
119 let g:netrw_local_rmdir= "rmdir"
120endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000121if !exists("g:netrw_local_mkdir")
122 let g:netrw_local_mkdir= "mkdir"
123endif
124if !exists("g:netrw_mkdir_cmd")
125 let g:netrw_mkdir_cmd= "ssh HOSTNAME mkdir"
126endif
Bram Moolenaar269ec652004-07-29 08:43:53 +0000127if !exists("g:netrw_hide")
128 let g:netrw_hide= 1
129endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000130if !exists("g:netrw_ftp_browse_reject")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000131 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 +0000132endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000133if !exists("g:netrw_ssh_browse_reject")
134 let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
135endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000136if !exists("g:netrw_keepdir")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000137 let g:netrw_keepdir= 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000138endif
139if !exists("s:netrw_cd_escape")
140 if has("win32") || has("win95") || has("win64") || has("win16")
141 let s:netrw_cd_escape="#% "
142 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000143 let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000144 endif
145endif
146if !exists("s:netrw_glob_escape")
147 if has("win32") || has("win95") || has("win64") || has("win16")
148 let s:netrw_glob_escape= ""
149 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000150 let s:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000151 endif
152endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000153if !exists("g:netrw_alto")
154 let g:netrw_alto= 0
155endif
156if !exists("g:netrw_altv")
157 let g:netrw_altv= 0
158endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000159if !exists("g:netrw_maxfilenamelen")
160 let g:netrw_maxfilenamelen= 32
161endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000162if !exists("g:netrw_dirhistmax")
163 let g:netrw_dirhistmax= 10
164endif
165if !exists("g:NETRW_DIRHIST_CNT")
166 let g:NETRW_DIRHIST_CNT= 0
167endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000168
169" BufEnter event ignored by decho when following variable is true
170" Has a side effect that doau BufReadPost doesn't work, so
171" files read by network transfer aren't appropriately highlighted.
172"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000173
174" ---------------------------------------------------------------------
175" Default values for global protocol variables {{{1
176if !exists("g:netrw_rcp_cmd")
177 let g:netrw_rcp_cmd = "rcp"
178endif
179if !exists("g:netrw_ftp_cmd")
180 let g:netrw_ftp_cmd = "ftp"
181endif
182if !exists("g:netrw_scp_cmd")
183 let g:netrw_scp_cmd = "scp -q"
184endif
185if !exists("g:netrw_sftp_cmd")
186 let g:netrw_sftp_cmd = "sftp"
187endif
188if !exists("g:netrw_http_cmd")
189 if executable("wget")
190 let g:netrw_http_cmd = "wget -q -O"
191 elseif executable("fetch")
192 let g:netrw_http_cmd = "fetch -o"
193 else
194 let g:netrw_http_cmd = ""
195 endif
196endif
197if !exists("g:netrw_dav_cmd")
198 let g:netrw_dav_cmd = "cadaver"
199endif
200if !exists("g:netrw_rsync_cmd")
201 let g:netrw_rsync_cmd = "rsync"
202endif
203if !exists("g:netrw_fetch_cmd")
204 if executable("fetch")
205 let g:netrw_fetch_cmd = "fetch -o"
206 else
207 let g:netrw_fetch_cmd = ""
208 endif
209endif
210
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000211if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000212 \ && exists("g:netrw_use_nt_rcp")
213 \ && g:netrw_use_nt_rcp
214 \ && executable( $SystemRoot .'/system32/rcp.exe')
215 let s:netrw_has_nt_rcp = 1
216 let s:netrw_rcpmode = '-b'
217 else
218 let s:netrw_has_nt_rcp = 0
219 let s:netrw_rcpmode = ''
220endif
221
Bram Moolenaar071d4272004-06-13 20:20:40 +0000222" ------------------------------------------------------------------------
223" NetSavePosn: saves position of cursor on screen {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000224fun! netrw#NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000225" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000226 " Save current line and column
Bram Moolenaar488c6512005-08-11 20:09:58 +0000227 let w:netrw_winnr= winnr()
228 let w:netrw_line = line(".")
229 let w:netrw_col = virtcol(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000230
231 " Save top-of-screen line
232 norm! H0
Bram Moolenaar488c6512005-08-11 20:09:58 +0000233 let w:netrw_hline= line(".")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000234
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000235 call netrw#NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000236" call Dret("NetSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000237endfun
238
239" ------------------------------------------------------------------------
240" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000241fun! netrw#NetRestorePosn()
Bram Moolenaar488c6512005-08-11 20:09:58 +0000242" call Dfunc("NetRestorePosn() winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
Bram Moolenaar572cb562005-08-05 21:35:02 +0000243 let eikeep= &ei
244 set ei=all
Bram Moolenaar071d4272004-06-13 20:20:40 +0000245
Bram Moolenaar81695252004-12-29 20:58:21 +0000246 " restore window
Bram Moolenaar488c6512005-08-11 20:09:58 +0000247" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
248 exe "silent! ".w:netrw_winnr."wincmd w"
Bram Moolenaar572cb562005-08-05 21:35:02 +0000249" if v:shell_error == 0
250" " as suggested by Bram M: redraw on no error
251" " allows protocol error messages to remain visible
252" redraw!
253" endif
Bram Moolenaar81695252004-12-29 20:58:21 +0000254
Bram Moolenaar071d4272004-06-13 20:20:40 +0000255 " restore top-of-screen line
Bram Moolenaar488c6512005-08-11 20:09:58 +0000256" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
257 exe "norm! ".w:netrw_hline."G0z\<CR>"
Bram Moolenaar81695252004-12-29 20:58:21 +0000258
Bram Moolenaar071d4272004-06-13 20:20:40 +0000259 " restore position
Bram Moolenaar488c6512005-08-11 20:09:58 +0000260" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
261 exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000262
Bram Moolenaar572cb562005-08-05 21:35:02 +0000263 let &ei= eikeep
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000264" call Dret("NetRestorePosn")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000265endfun
266
267" ------------------------------------------------------------------------
268" NetRead: responsible for reading a file over the net {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000269fun! netrw#NetRead(...)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000270" call Dfunc("NetRead(a:1<".a:1.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000271
272 " save options
273 call s:NetOptionSave()
274
275 " Special Exception: if a file is named "0r", then
276 " "0r" will be used to read the
277 " following files instead of "r"
278 if a:0 == 0
279 let readcmd= "r"
280 let ichoice= 0
281 elseif a:1 == "0r"
282 let readcmd = "0r"
283 let ichoice = 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000284 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000285 let readcmd = "r"
286 let ichoice = 1
287 endif
288
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000289 " get name of a temporary file and set up shell-quoting character
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000290 let tmpfile= tempname()
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000291 let tmpfile= substitute(tmpfile,'\','/','ge')
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000292 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000293 echohl Error | echo "***netrw*** your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000294 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
295" call Dret("NetRead")
296 return
297 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000298
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000299" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000300 while ichoice <= a:0
301
302 " attempt to repeat with previous host-file-etc
303 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000304" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000305 let choice = b:netrw_lastfile
306 let ichoice= ichoice + 1
307
308 else
309 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000310" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000311
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000312 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000313 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000314 echomsg 'NetRead Usage:'
315 echomsg ':Nread machine:path uses rcp'
316 echomsg ':Nread "machine path" uses ftp with <.netrc>'
317 echomsg ':Nread "machine id password path" uses ftp'
318 echomsg ':Nread dav://machine[:port]/path uses cadaver'
319 echomsg ':Nread fetch://machine/path uses fetch'
320 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
321 echomsg ':Nread http://[user@]machine/path uses http wget'
322 echomsg ':Nread rcp://[user@]machine/path uses rcp'
323 echomsg ':Nread rsync://machine[:port]/path uses rsync'
324 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
325 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000326 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000327
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000328 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000329 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000330" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000331 if match(choice,"\"$") != -1
332 " case "..."
333 let choice=strpart(choice,1,strlen(choice)-2)
334 else
335 " case "... ... ..."
336 let choice = strpart(choice,1,strlen(choice)-1)
337 let wholechoice = ""
338
339 while match(choice,"\"$") == -1
340 let wholechoice = wholechoice . " " . choice
341 let ichoice = ichoice + 1
342 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000343 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000344 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000345 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000346 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000347" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000348 return
349 endif
350 let choice= a:{ichoice}
351 endwhile
352 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
353 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000354 endif
355 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000356
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000357" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000358 let ichoice= ichoice + 1
359
360 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000361 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000362 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000363" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000364
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000365 exe 'lcd ' . fnamemodify(tmpfile,':h')
366 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000367 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000368
369 " Determine method of read (ftp, rcp, etc)
370 call s:NetMethod(choice)
371
Bram Moolenaar843ee412004-06-30 16:16:41 +0000372 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000373" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000374 if choice =~ "^.*[\/]$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000375 keepjumps call s:NetBrowse(choice)
376" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000377 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000378 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000379
380 " ============
381 " Perform Read
382 " ============
383
384 ".........................................
385 " rcp: NetRead Method #1
386 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000387" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000388 " ER: noting done with g:netrw_uid yet?
389 " ER: on Win2K" rcp machine[.user]:file tmpfile
390 " ER: if machine contains '.' adding .user is required (use $USERNAME)
391 " ER: the tmpfile is full path: rcp sees C:\... as host C
392 if s:netrw_has_nt_rcp == 1
393 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
394 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
395 else
396 " Any way needed it machine contains a '.'
397 let uid_machine = g:netrw_machine .'.'. $USERNAME
398 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000399 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000400 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
401 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
402 else
403 let uid_machine = g:netrw_machine
404 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000405 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000406" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000407 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
408 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
409 let b:netrw_lastfile = choice
410
411 ".........................................
412 " ftp + <.netrc>: NetRead Method #2
413 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000414" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000415 let netrw_fname= b:netrw_fname
416 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000417 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000418 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000419" call Decho("filter input: ".getline("."))
420 exe "put ='".'get \"'.netrw_fname.'\" '.tmpfile."'"
421" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000422 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000423" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000424 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
425 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000426" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000427 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
428 endif
429 " 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 +0000430 if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000431 let debugkeep= &debug
432 set debug=msg
Bram Moolenaar572cb562005-08-05 21:35:02 +0000433 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000434 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000435 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000436 endif
437 bd!
438 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
439 let b:netrw_lastfile = choice
440
441 ".........................................
442 " ftp + machine,id,passwd,filename: NetRead Method #3
443 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
444 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000445" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000446 let netrw_fname= b:netrw_fname
447 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000448 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000449 if exists("g:netrw_port") && g:netrw_port != ""
450 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000451" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000452 else
453 put ='open '.g:netrw_machine
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000454" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000455 endif
456
457 if exists("g:netrw_ftp") && g:netrw_ftp == 1
458 put =g:netrw_uid
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000459" call Decho("filter input: ".getline("."))
460 put ='\"'.g:netrw_passwd.'\"'
461" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000462 else
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000463 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
464" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000465 endif
466
467 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
468 put =g:netrw_ftpmode
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000469" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000470 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000471 put ='get \"'.netrw_fname.'\" '.tmpfile
472" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000473
474 " perform ftp:
475 " -i : turns off interactive prompting from ftp
476 " -n unix : DON'T use <.netrc>, even though it exists
477 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000478 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000479" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000480 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
481 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
482 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000483" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000484 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000485 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000486 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000487 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000488 endif
489 bd!
490 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
491 let b:netrw_lastfile = choice
492
493 ".........................................
494 " scp: NetRead Method #4
495 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000496" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000497 if exists("g:netrw_port") && g:netrw_port != ""
498 let useport= " -P ".g:netrw_port
499 else
500 let useport= ""
501 endif
502 if g:netrw_cygwin == 1
503 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000504" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000505 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
506 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000507" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000508 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
509 endif
510 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
511 let b:netrw_lastfile = choice
512
513 ".........................................
514 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000515" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000516 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000517 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000518 echohl Error | echo "***netrw*** neither wget nor fetch command is available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000519 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000520 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000521" call Dret("NetRead")
522 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000523 endif
524
525 if match(b:netrw_fname,"#") == -1
526 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000527" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000528 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
529 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
530
531 else
532 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
533 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
534 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000535" call Decho("netrw_html<".netrw_html.">")
536" call Decho("netrw_tag <".netrw_tag.">")
537" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000538 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
539 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000540" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000541 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
542 endif
543 let b:netrw_lastfile = choice
544
545 ".........................................
546 " cadaver: NetRead Method #6
547 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000548" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000549
550 " Construct execution string (four lines) which will be passed through filter
551 let netrw_fname= b:netrw_fname
552 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000553 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000554 if exists("g:netrw_port") && g:netrw_port != ""
555 put ='open '.g:netrw_machine.' '.g:netrw_port
556 else
557 put ='open '.g:netrw_machine
558 endif
559 put ='user '.g:netrw_uid.' '.g:netrw_passwd
560
561 if g:netrw_cygwin == 1
562 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
563 put ='get '.netrw_fname.' '.cygtmpfile
564 else
565 put ='get '.netrw_fname.' '.tmpfile
566 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000567 put ='quit'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000568
569 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000570 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000571" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000572 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
573 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000574 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000575 let b:netrw_lastfile = choice
576
577 ".........................................
578 " rsync: NetRead Method #7
579 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000580" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000581 if g:netrw_cygwin == 1
582 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000583" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000584 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
585 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000586" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000587 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
588 endif
589 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
590 let b:netrw_lastfile = choice
591
592 ".........................................
593 " fetch: NetRead Method #8
594 " fetch://[user@]host[:http]/path
595 elseif b:netrw_method == 8 " read with fetch
596 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000597 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000598 echohl Error | echo "***netrw*** fetch command not available" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000599 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000600 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000601" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000602 endif
603 if exists("g:netrw_option") && g:netrw_option == ":http"
604 let netrw_option= "http"
605 else
606 let netrw_option= "ftp"
607 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000608" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000609
610 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000611" 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 +0000612 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
613 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000614" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".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_machine."/".escape(b:netrw_fname,' ?&')
616 endif
617
618 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
619 let b:netrw_lastfile = choice
620
621 ".........................................
622 " sftp: NetRead Method #9
623 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000624" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000625 if g:netrw_cygwin == 1
626 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000627" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
628" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000629 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
630 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000631" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000632 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
633 endif
634 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
635 let b:netrw_lastfile = choice
636
637 ".........................................
638 else " Complain
639 echo "***warning*** unable to comply with your request<" . choice . ">"
640 endif
641 endwhile
642
643 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000644" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000645 if exists("b:netrw_method")
646 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000647 unlet b:netrw_fname
648 endif
649 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000650
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000651" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000652endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000653
654" ------------------------------------------------------------------------
655" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
656fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000657" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000658
659 if exists("*NetReadFixup")
660 " for the use of NetReadFixup (not otherwise used internally)
661 let line2= line("$")
662 endif
663
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000664 " transform paths from / to \ for Windows (except for cygwin)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000665 if &term == "win32"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000666 if g:netrw_cygwin
667 let fname= a:fname
668" call Decho("(win32 && cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000669 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000670 let fname= substitute(a:fname,'/','\\\\','ge')
671" call Decho("(win32 && !cygwin) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000672 endif
673 else
674 let fname= a:fname
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000675" call Decho("fname=a:fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000676 endif
677
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000678 if a:readcmd[0] == '0'
Bram Moolenaar81695252004-12-29 20:58:21 +0000679 " get file into buffer
Bram Moolenaar83bab712005-08-01 21:58:57 +0000680
Bram Moolenaar81695252004-12-29 20:58:21 +0000681 " record remote filename
Bram Moolenaar83bab712005-08-01 21:58:57 +0000682 let rfile= bufname(".")
683" call Decho("remotefile<".rfile.">")
684" call Dredir("ls!","starting buffer list")
685
Bram Moolenaar81695252004-12-29 20:58:21 +0000686 " rename the current buffer to the temp file (ie. fname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000687 keepalt exe "file ".fname
Bram Moolenaar83bab712005-08-01 21:58:57 +0000688" call Dredir("ls!","after renaming current buffer to <".fname.">")
689
Bram Moolenaar81695252004-12-29 20:58:21 +0000690 " edit temporary file
691 e
Bram Moolenaar83bab712005-08-01 21:58:57 +0000692" call Dredir("ls!","after editing temporary file")
693
Bram Moolenaar81695252004-12-29 20:58:21 +0000694 " rename buffer back to remote filename
Bram Moolenaar578b49e2005-09-10 19:22:57 +0000695 keepalt exe "file ".rfile
Bram Moolenaar83bab712005-08-01 21:58:57 +0000696" call Dredir("ls!","renaming buffer back to remote filename<".rfile.">")
Bram Moolenaar81695252004-12-29 20:58:21 +0000697 let line1 = 1
698 let line2 = line("$")
699
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000700 elseif filereadable(fname)
Bram Moolenaar81695252004-12-29 20:58:21 +0000701 " read file after current line
702 let curline = line(".")
703 let lastline= line("$")
704" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname."> line#".curline)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000705 exe a:readcmd." ".v:cmdarg." ".fname
Bram Moolenaar81695252004-12-29 20:58:21 +0000706 let line1 = curline + 1
707 let line2 = line("$") - lastline + 1
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000708
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000709 else
Bram Moolenaar81695252004-12-29 20:58:21 +0000710 " not readable
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000711" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
712 echohl WarningMsg | echo "***netrw*** file <".fname."> not readable"| echohl None
713 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar81695252004-12-29 20:58:21 +0000714" call Dret("NetGetFile : fname<".fname."> not readable")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000715 return
716 endif
717
718 " User-provided (ie. optional) fix-it-up command
719 if exists("*NetReadFixup")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000720" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000721 call NetReadFixup(a:method, line1, line2)
Bram Moolenaar83bab712005-08-01 21:58:57 +0000722" else " Decho
723" call Decho("NetReadFixup() not called, doesn't exist")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000724 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000725
726 " update the Buffers menu
727 if has("gui") && has("gui_running")
728 silent! emenu Buffers.Refresh\ menu
729 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000730
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000731" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000732
733 " insure that we have the right filetype and that its being displayed
734 filetype detect
735 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000736" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000737endfun
738
739" ------------------------------------------------------------------------
740" NetWrite: responsible for writing a file over the net {{{1
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000741fun! netrw#NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000742" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000743
744 " option handling
745 let mod= 0
746 call s:NetOptionSave()
747
748 " Get Temporary Filename
749 let tmpfile= tempname()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000750 if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
751 echohl Error | echo "***netrw*** your ".substitute(tmpfile,'[^/]\+$','','e')." directory is missing!"
752 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000753" call Dret("NetWrite")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000754 return
755 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000756
757 if a:0 == 0
758 let ichoice = 0
759 else
760 let ichoice = 1
761 endif
762
763 " write (selected portion of) file to temporary
764 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
765
766 while ichoice <= a:0
767
768 " attempt to repeat with previous host-file-etc
769 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000770" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000771 let choice = b:netrw_lastfile
772 let ichoice= ichoice + 1
773 else
774 exe "let choice= a:" . ichoice
775
776 " Reconstruct Choice if choice starts with '"'
777 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000778 echomsg 'NetWrite Usage:"'
779 echomsg ':Nwrite machine:path uses rcp'
780 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
781 echomsg ':Nwrite "machine id password path" uses ftp'
782 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
783 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
784 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
785 echomsg ':Nwrite rcp://machine/path uses rcp'
786 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
787 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
788 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000789 break
790
791 elseif match(choice,"^\"") != -1
792 if match(choice,"\"$") != -1
793 " case "..."
794 let choice=strpart(choice,1,strlen(choice)-2)
795 else
796 " case "... ... ..."
797 let choice = strpart(choice,1,strlen(choice)-1)
798 let wholechoice = ""
799
800 while match(choice,"\"$") == -1
801 let wholechoice= wholechoice . " " . choice
802 let ichoice = ichoice + 1
803 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000804 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000805 echohl Error | echo "***netrw*** Unbalanced string in filename '". wholechoice ."'" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000806 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000807 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000808" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000809 return
810 endif
811 let choice= a:{ichoice}
812 endwhile
813 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
814 endif
815 endif
816 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000817" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000818 let ichoice= ichoice + 1
819
820 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000821 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000822 let choice= substitute(choice,'\\','/','ge')
823 "ER: see NetRead()
824 exe 'lcd ' . fnamemodify(tmpfile,':h')
825 let tmpfile = fnamemodify(tmpfile,':t')
826 endif
827
828 " Determine method of read (ftp, rcp, etc)
829 call s:NetMethod(choice)
830
831 " =============
832 " Perform Write
833 " =============
834
835 ".........................................
836 " rcp: NetWrite Method #1
837 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000838" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000839 if s:netrw_has_nt_rcp == 1
840 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
841 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
842 else
843 let uid_machine = g:netrw_machine .'.'. $USERNAME
844 endif
845 else
846 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
847 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
848 else
849 let uid_machine = g:netrw_machine
850 endif
851 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000852" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000853 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
854 let b:netrw_lastfile = choice
855
856 ".........................................
857 " ftp + <.netrc>: NetWrite Method #2
858 elseif b:netrw_method == 2 " write with ftp + <.netrc>
859 let netrw_fname = b:netrw_fname
860 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000861 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000862 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000863" call Decho(" filter input: ".getline("."))
864 exe "put ='"."put ".tmpfile.' \"'.netrw_fname.'\"'."'"
865" call Decho(" filter input: ".getline("."))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000866 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000867" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000868 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000869 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000870" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000871 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000872 endif
873 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
874 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000875 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000876 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000877 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000878 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000879 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000880 endif
881 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000882 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000883
884 ".........................................
885 " ftp + machine, id, passwd, filename: NetWrite Method #3
886 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
887 let netrw_fname= b:netrw_fname
888 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000889 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000890 if exists("g:netrw_port") && g:netrw_port != ""
891 put ='open '.g:netrw_machine.' '.g:netrw_port
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000892" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000893 else
894 put ='open '.g:netrw_machine
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000895" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000896 endif
897 if exists("g:netrw_ftp") && g:netrw_ftp == 1
898 put =g:netrw_uid
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000899" call Decho("filter input: ".getline("."))
900 put ='\"'.g:netrw_passwd.'\"'
901" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000902 else
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000903 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
904" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000905 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +0000906 put ='put '.tmpfile.' \"'.netrw_fname.'\"'
907" call Decho("filter input: ".getline("."))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000908 " save choice/id/password for future use
909 let b:netrw_lastfile = choice
910
911 " perform ftp:
912 " -i : turns off interactive prompting from ftp
913 " -n unix : DON'T use <.netrc>, even though it exists
914 " -n win32: quit being obnoxious about password
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000915 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000916" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000917 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
918 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
919 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000920 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000921 echohl Error | echo "***netrw*** ".getline(1) | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000922 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000923 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000924 let mod=1
925 endif
926 bd!
927
928 ".........................................
929 " scp: NetWrite Method #4
930 elseif b:netrw_method == 4 " write with scp
931 if exists("g:netrw_port") && g:netrw_port != ""
932 let useport= " -P ".g:netrw_port
933 else
934 let useport= ""
935 endif
936 if g:netrw_cygwin == 1
937 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000938" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000939 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
940 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000941" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000942 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
943 endif
944 let b:netrw_lastfile = choice
945
946 ".........................................
947 " http: NetWrite Method #5
948 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000949 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +0000950 echohl Error | echo "***netrw*** currently <netrw.vim> does not support writing using http:" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000951 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000952 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000953
954 ".........................................
955 " dav: NetWrite Method #6
956 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000957" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000958
959 " Construct execution string (four lines) which will be passed through filter
960 let netrw_fname= b:netrw_fname
961 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000962 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000963 if exists("g:netrw_port") && g:netrw_port != ""
964 put ='open '.g:netrw_machine.' '.g:netrw_port
965 else
966 put ='open '.g:netrw_machine
967 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000968 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000969
970 if g:netrw_cygwin == 1
971 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
972 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000973 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000974 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000975 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000976
977 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000978 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000979" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000980 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
981 bd!
982 let b:netrw_lastfile = choice
983
984 ".........................................
985 " rsync: NetWrite Method #7
986 elseif b:netrw_method == 7 " write with rsync
987 if g:netrw_cygwin == 1
988 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000989" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000990 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000991 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000992" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000993 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000994 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000995 let b:netrw_lastfile = choice
996
997 ".........................................
998 " scp: NetWrite Method #9
999 elseif b:netrw_method == 9 " write with sftp
1000 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +00001001 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1002 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1003 else
1004 let uid_machine = g:netrw_machine
1005 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001006 new
Bram Moolenaar8299df92004-07-10 09:47:34 +00001007 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +00001008 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001009 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001010" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001011 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
1012 bd!
1013 let b:netrw_lastfile= choice
1014
1015 ".........................................
1016 else " Complain
1017 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001018 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001019 endwhile
1020
1021 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001022" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001023 let result=delete(tmpfile)
1024 call s:NetOptionRestore()
1025
1026 if a:firstline == 1 && a:lastline == line("$")
1027 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001028 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001029
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001030" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001031endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001032
Bram Moolenaar83bab712005-08-01 21:58:57 +00001033" ===========================================
1034" Remote Directory Browsing Support: {{{1
1035" ===========================================
1036
Bram Moolenaar843ee412004-06-30 16:16:41 +00001037" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001038" of the contents of a remote directory. It is assumed that the
1039" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1040" with the requested remote hostname first.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001041fun! s:NetBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001042 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
1043" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".w:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001044
Bram Moolenaar488c6512005-08-11 20:09:58 +00001045 if exists("s:netrw_skipbrowse")
1046 unlet s:netrw_skipbrowse
1047" call Dret("NetBrowse")
1048 return
1049 endif
1050
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001051 call s:NetOptionSave()
1052
Bram Moolenaar843ee412004-06-30 16:16:41 +00001053 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001054 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1055" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001056 if !executable("ftp")
1057 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001058 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ftp" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001059 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001060 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001061 call s:NetOptionRestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001062" call Dret("NetBrowse")
1063 return
1064 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001065 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001066 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001067 echohl Error | echo "***netrw*** this system doesn't support remote directory listing via ssh" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001068 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001069 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001070
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001071 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001072" call Dret("NetBrowse")
1073 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001074 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001075
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001076 " use buffer-oriented WinVars if buffer ones exist but window ones don't
1077 call s:UseBufWinVars()
1078
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001079 " make this buffer modifiable
Bram Moolenaar83bab712005-08-01 21:58:57 +00001080 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001081
1082 " analyze a:dirname and g:netrw_list_cmd
1083 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001084 let dirname = substitute(a:dirname,'\\','/','ge')
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001085" call Decho("dirname<".dirname.">")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001086 if dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001087 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001088 echohl Error | echo "***netrw*** netrw doesn't understand your dirname<".dirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001089 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001090 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001091 call s:NetOptionRestore()
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001092" call Dret("NetBrowse : badly formatted dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001093 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001094 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001095
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001096 let method = substitute(dirname,dirpat,'\1','')
1097 let user = substitute(dirname,dirpat,'\2','')
1098 let machine = substitute(dirname,dirpat,'\3','')
1099 let path = substitute(dirname,dirpat,'\4','')
1100 let fname = substitute(dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001101" call Decho("set up method <".method .">")
1102" call Decho("set up user <".user .">")
1103" call Decho("set up machine<".machine.">")
1104" call Decho("set up path <".path .">")
1105" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001106
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001107 if method == "ftp" || method == "http"
1108 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001109 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001110 else
1111 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1112 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001113
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001114 if exists("b:netrw_method")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001115" call Decho("setting w:netrw_method<".b:netrw_method.">")
1116 let w:netrw_method= b:netrw_method
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001117 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001118
Bram Moolenaar8299df92004-07-10 09:47:34 +00001119 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001120 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
Bram Moolenaar572cb562005-08-05 21:35:02 +00001121 echohl WarningMsg | echo "***netrw*** windows' ftp doesn't support time/size sorts (get cygwin, set g:netrw_cygwin)" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001122 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001123 else
1124 if g:netrw_sort_by =~ "^t"
1125 let listcmd= listcmd."t"
1126 elseif g:netrw_sort_by =~ "^s"
1127 let listcmd= listcmd."S"
1128 endif
1129 " optionally sort in reverse
1130 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1131 let listcmd= listcmd."r"
1132 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001133 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001134
1135" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001136 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001137" call Decho("attempt transfer of symlink as file")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001138 call s:NetBrowse(substitute(dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001139 redraw!
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001140 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001141" call Dret("NetBrowse : symlink")
1142 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001143
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001144 elseif fname !~ '[\/]$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001145 " looks like a regular file, attempt transfer
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001146" call Decho("attempt transfer as regular file<".dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001147
1148 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001149 " "this is a directory" indicator (/). There shouldn't be one of those,
1150 " anyway.
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001151 let path= substitute(path,'[*=@|]\r\=$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001152" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001153
1154 " remote-read the requested file into current buffer
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001155 keepjumps keepalt enew!
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001156 set ma
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001157" call Decho("exe file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001158 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001159 exe "silent doau BufReadPre ".fname
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001160 silent call netrw#NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001161 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001162 keepjumps 1d
Bram Moolenaar572cb562005-08-05 21:35:02 +00001163
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001164 " save certain window-oriented variables into buffer-oriented variables
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001165 call s:SetBufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001166 call s:NetOptionRestore()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001167 setlocal nomod
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001168
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001169" call Dret("NetBrowse : file<".fname.">")
1170 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001171 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001172
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001173 " ---------------------------------------------------------------------
1174 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001175" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001176 " set up new buffer and map
1177 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001178 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001179" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001180 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001181 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001182" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001183 exe "b ".bufnamenr
1184 if line("$") >= 5
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001185 call s:NetOptionRestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001186" call Dret("NetBrowse")
1187 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001188 endif
1189 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001190" call Decho("generate a new buffer")
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001191 keepjumps keepalt enew!
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001192 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001193
1194 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001195 setlocal bt=nofile bh=wipe nobl noswf
1196 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001197" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001198 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001199" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001200 setlocal bh=hide bt=nofile nobl nonu
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001201
1202 " save current directory on directory history list
1203 call <SID>NetBookmarkDir(3,expand("%"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001204
1205 " set up buffer-local mappings
1206" call Decho("set up buffer-local mappings")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001207 nnoremap <buffer> <silent> <cr> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00001208 nnoremap <buffer> <silent> <c-l> :call <SID>NetRefresh(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001209 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001210 nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001211 if w:netrw_longlist != 2
1212 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1213 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1214 endif
1215 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1216 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001217 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1218 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001219 nnoremap <buffer> <silent> o :call <SID>NetSplit(0)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001220 nnoremap <buffer> <silent> O :call <SID>NetObtain()<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001221 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1222 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>
1223 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>
1224 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001225 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
1226 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00001227 nnoremap <buffer> <silent> v :call <SID>NetSplit(1)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001228 nnoremap <buffer> <silent> x :call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001229 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001230 exe 'nnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001231 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001232 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001233 exe 'nnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001234 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001235 exe 'nnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001236 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001237 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaar83bab712005-08-01 21:58:57 +00001238 setlocal ma nonu nowrap
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001239
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001240 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001241" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1242 keepjumps put ='\" ==========================================================================='
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001243 keepjumps put ='\" Netrw Remote Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001244 keepjumps put ='\" '.bufname
Bram Moolenaar488c6512005-08-11 20:09:58 +00001245 let w:netrw_bannercnt = 7
1246 let sortby = g:netrw_sort_by
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001247 if g:netrw_sort_direction =~ "^r"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001248 let sortby = sortby." reversed"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001249 endif
1250
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001251 if g:netrw_sort_by =~ "^n"
1252 " sorted by name
Bram Moolenaar488c6512005-08-11 20:09:58 +00001253 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001254 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001255 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1256 else
1257 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001258 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001259 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001260 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001261 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001262 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001263 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001264 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001265 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001266 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001267 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001268 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1269 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001270
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001271 " remote read the requested directory listing
1272 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1273 " Note that not all ftp servers honor the options for ls
1274 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001275 " use ftp to get remote file listing
1276" call Decho("use ftp to get remote file listing")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001277 call s:NetBrowseFtpCmd(path,listcmd)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001278 keepjumps 1d
1279
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001280 if w:netrw_longlist == 0 || w:netrw_longlist == 2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001281 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001282" call Decho("generate short listing")
Bram Moolenaar488c6512005-08-11 20:09:58 +00001283 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001284
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001285 " cleanup
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001286 if g:netrw_ftp_browse_reject != ""
1287 exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
1288 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001289 silent! keepjumps %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001290
1291 " if there's no ../ listed, then put ./ and ../ in
1292 let line1= line(".")
1293 keepjumps 1
1294 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1295 let line2= line(".")
1296 if line2 == 0
1297 keepjumps put='../'
1298 keepjumps put='./'
1299 endif
1300 exe "keepjumps ".line1
1301 keepjumps norm! 0
1302
1303 " more cleanup
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001304 exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1305 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
1306 exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001307 endif
1308
1309 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001310 " use ssh to get remote file listing
1311" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001312 let shq= &shq? &shq : ( &sxq? &sxq : "'")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001313" call Decho("exe silent r! ".listcmd." '".shq.escape(path,s:netrw_cd_escape).shq."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001314 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1315 keepjumps 1d
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001316 " cleanup
1317 if g:netrw_ftp_browse_reject != ""
1318 exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001319 endif
1320 endif
1321
1322 " set up syntax highlighting
1323 if has("syntax")
1324 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00001325 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001326 setlocal ft=
Bram Moolenaar572cb562005-08-05 21:35:02 +00001327 " Ugly workaround -- when syntax highlighting is off and laststatus==2,
1328 " sometimes the laststatus highlight bleeds into the entire display.
1329 " Only seems to happen with remote browsing. Weird.
1330 redraw
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001331 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001332 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001333
1334 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001335 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001336 if g:netrw_hide && g:netrw_list_hide != ""
1337 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001338 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001339
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001340 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00001341 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001342" call Decho("manipulate long listing")
1343
1344 if method == "ftp"
1345 " cleanup
Bram Moolenaar488c6512005-08-11 20:09:58 +00001346 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar572cb562005-08-05 21:35:02 +00001347 while getline(".") =~ g:netrw_ftp_browse_reject
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001348 keepjumps d
1349 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001350 " if there's no ../ listed, then put ./ and ../ in
1351 let line1= line(".")
1352 keepjumps 1
1353 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1354 let line2= line(".")
1355 if line2 == 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00001356 exe 'keepjumps '.w:netrw_bannercnt."put='./'"
1357 exe 'keepjumps '.w:netrw_bannercnt."put='../'"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001358 endif
1359 exe "keepjumps ".line1
1360 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001361 endif
1362
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001363 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e'
1364 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1365 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001366 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001367
Bram Moolenaar488c6512005-08-11 20:09:58 +00001368 if line("$") >= w:netrw_bannercnt
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001369 if g:netrw_sort_by =~ "^n"
1370 call s:SetSort()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001371 if g:netrw_sort_direction =~ 'n'
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001372 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001373 else
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001374 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00001375 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001376 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001377 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001378 if w:netrw_longlist == 1
1379 " shorten the list to keep its width <= winwidth characters
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001380 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001381 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001382 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001383 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001384
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001385 call s:NetrwWideListing()
1386 if line("$") >= w:netrw_bannercnt
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001387 " place cursor on the top-left corner of the file listing
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001388 exe "keepjumps ".w:netrw_bannercnt
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001389 norm! 0
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001390 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00001391
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001392 call s:NetOptionRestore()
Bram Moolenaar572cb562005-08-05 21:35:02 +00001393 setlocal nomod noma nonu
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001394
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001395" call Dret("NetBrowse")
1396 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001397endfun
1398
1399" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001400" NetBrowseChgDir: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001401fun! s:NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001402" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001403
1404 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001405 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001406
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001407 if newdir !~ '[\/]$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001408 " handling a file
1409 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001410" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001411
1412 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001413 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001414" call Decho("refresh directory listing")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001415 setlocal ma nobl bh=hide
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001416 %d
1417
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001418 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001419 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001420 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001421
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001422 if trailer =~ '^\%(\.\./\)*$'
1423 " tack on a ../"
1424 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001425
1426 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001427 " strip off a directory name from dirname
1428 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001429 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001430" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001431
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001432 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001433 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001434 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001435" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001436 endif
1437
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001438" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001439 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001440endfun
1441
Bram Moolenaar843ee412004-06-30 16:16:41 +00001442" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001443" NetGetWord: it gets the directory named under the cursor
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001444fun! s:NetGetWord()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001445" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00001446 call s:UseBufWinVars()
1447
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001448 " insure that w:netrw_longlist is set up
1449 if !exists("w:netrw_longlist")
1450 if exists("g:netrw_longlist")
1451 let w:netrw_longlist= g:netrw_longlist
1452 else
1453 let w:netrw_longlist= 0
1454 endif
1455 endif
1456
Bram Moolenaar488c6512005-08-11 20:09:58 +00001457 if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001458 " Active Banner support
1459" call Decho("active banner handling")
1460 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001461 let dirname= "./"
Bram Moolenaar488c6512005-08-11 20:09:58 +00001462 let curline= getline(".")
1463 if curline =~ '"\s*Sorted by\s'
1464 norm s
1465 let s:netrw_skipbrowse= 1
1466 echo 'Pressing "s" also works'
1467 elseif curline =~ '"\s*Sort sequence:'
1468 let s:netrw_skipbrowse= 1
1469 echo 'Press "S" to edit sorting sequence'
1470 elseif curline =~ '"\s*Quick Help:'
1471 norm ?
1472 let s:netrw_skipbrowse= 1
1473 echo 'Pressing "?" also works'
1474 elseif curline =~ '"\s*\%(Hiding\|Showing\):'
1475 norm a
1476 let s:netrw_skipbrowse= 1
1477 echo 'Pressing "a" also works'
1478 elseif line("$") > w:netrw_bannercnt
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001479 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00001480 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001481
1482 elseif w:netrw_longlist == 0
1483" call Decho("thin column handling")
1484 norm! 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001485 let dirname= getline(".")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001486
1487 elseif w:netrw_longlist == 1
1488" call Decho("long column handling")
1489 norm! 0
1490 let dirname= substitute(getline("."),'^\(\%(\S\+\s\)*\S\+\).\{-}$','\1','e')
1491
1492 else
1493" call Decho("obtain word from wide listing")
1494 let dirname= getline(".")
1495
1496 if !exists("b:netrw_cpf")
1497 let b:netrw_cpf= 0
1498 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
1499" call Decho("computed cpf")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001500 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001501
1502 let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
1503" call Decho("virtcol=".virtcol(".")." cpf=".b:netrw_cpf." bannercnt=".w:netrw_bannercnt." filestart=".filestart)
1504" call Decho("1: dirname<".dirname.">")
1505 if filestart > 0|let dirname= substitute(dirname,'^.\{'.filestart.'}','','')|endif
1506" call Decho("2: dirname<".dirname.">")
1507 let dirname = substitute(dirname,'^\(.\{'.b:netrw_cpf.'}\).*$','\1','e')
1508" call Decho("3: dirname<".dirname.">")
1509 let dirname = substitute(dirname,'\s\+$','','e')
1510" call Decho("4: dirname<".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001511 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001512
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001513" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001514 return dirname
1515endfun
1516
1517" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001518" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001519fun! s:NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001520" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1521" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001522
1523 " preparation for removing multiple files/directories
1524 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001525 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001526
1527 " remove multiple files and directories
1528 while ctr <= a:lastline
1529 exe ctr
1530
1531 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001532 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001533" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001534
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001535 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar843ee412004-06-30 16:16:41 +00001536 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001537 if !all
1538 echohl Statement
1539 call inputsave()
1540 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1541 call inputrestore()
1542 echohl NONE
1543 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1544 if ok =~ 'a\%[ll]'
1545 let all= 1
1546 endif
1547 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001548
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001549 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001550 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001551 silent! keepjumps .,$d
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001552 call s:NetBrowseFtpCmd(a:path,"delete ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001553 else
1554 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1555" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1556 let ret= system(netrw_rm_cmd)
1557" call Decho("returned=".ret." errcode=".v:shell_error)
1558 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001559 elseif ok =~ 'q\%[uit]'
1560 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001561 endif
1562
1563 else
1564 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001565 if !all
1566 call inputsave()
1567 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1568 call inputrestore()
1569 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1570 if ok =~ 'a\%[ll]'
1571 let all= 1
1572 endif
1573 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001574
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001575 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaar488c6512005-08-11 20:09:58 +00001576 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001577 call s:NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001578 else
1579 let rmfile = a:path.rmfile
1580 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1581" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1582 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001583" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001584
1585 if v:shell_error != 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001586 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'[\/]$','','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001587" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1588 let ret= system(netrw_rmf_cmd)
1589" call Decho("returned=".ret." errcode=".v:shell_error)
1590
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001591 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00001592 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00001593 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001594 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001595 endif
1596 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001597
1598 elseif ok =~ 'q\%[uit]'
1599 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001600 endif
1601 endif
1602
1603 let ctr= ctr + 1
1604 endwhile
1605
1606 " refresh the directory
1607 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001608" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001609 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1610 exe curline
1611
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001612" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001613endfun
1614
1615" ---------------------------------------------------------------------
1616" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001617fun! s:NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001618" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001619
1620 " preparation for removing multiple files/directories
1621 let ctr = a:firstline
1622 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1623
1624 " attempt to rename files/directories
1625 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001626 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001627
1628 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001629 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001630" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001631
1632 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001633 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001634 call inputrestore()
1635
Bram Moolenaar488c6512005-08-11 20:09:58 +00001636 if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001637 call s:NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001638 else
1639 let oldname= a:path.oldname
1640 let newname= a:path.newname
1641" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1642 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1643 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001644
1645 let ctr= ctr + 1
1646 endwhile
1647
1648 " refresh the directory
1649 let curline= line(".")
1650 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001651 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001652" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001653endfun
1654
1655" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00001656" NetRefresh: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001657fun! s:NetRefresh(dirname)
Bram Moolenaar572cb562005-08-05 21:35:02 +00001658" call Dfunc("NetRefresh(dirname<".a:dirname.">)")
1659 set ma
1660 %d
1661 call <SID>NetBrowse(dirname)
1662 redraw!
1663" call Dret("NetRefresh")
1664endfun
1665
1666" ---------------------------------------------------------------------
Bram Moolenaar488c6512005-08-11 20:09:58 +00001667" NetSplit: mode {{{2
1668" =0 : net and o
1669" =1 : net and v
1670" =2 : local and o
1671" =3 : local and v
1672fun! s:NetSplit(mode)
1673" call Dfunc("NetSplit(mode=".a:mode.")")
1674
1675 call s:SaveWinVars()
1676 if a:mode == 0
1677 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1678 call s:CopyWinVars()
1679 exe "norm! 0"
1680 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
1681 elseif a:mode ==1
1682 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1683 call s:CopyWinVars()
1684 exe "norm! 0"
1685 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))
1686 elseif a:mode ==2
1687 exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
1688 call s:CopyWinVars()
1689 exe "norm! 0"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001690 call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001691 else
1692 exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
1693 call s:CopyWinVars()
1694 exe "norm! 0"
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001695 call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))
Bram Moolenaar488c6512005-08-11 20:09:58 +00001696 endif
1697
1698" call Dret("NetSplit")
1699endfun
1700
1701" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001702" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001703" files given their extension. Passes 0=local, 1=remote
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001704fun! s:NetBrowseX(fname,remote)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001705" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001706
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001707 " set up the filename
1708 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001709 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001710 if has("win32") || has("win95") || has("win64") || has("win16")
1711 let exten= substitute(exten,'^.*$','\L&\E','')
1712 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001713 let fname= escape(a:fname,"%#")
1714" call Decho("fname<".fname."> after escape()")
1715
1716 if a:remote == 1
1717 " create a local copy
1718 let fname= tempname().".".exten
1719" call Decho("create a local copy of <".a:fname."> as <".fname.">")
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001720 exe "silent keepjumps bot 1new ".a:fname
Bram Moolenaar572cb562005-08-05 21:35:02 +00001721 set bh=delete
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001722 exe "w! ".fname
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001723 q
1724 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001725" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001726
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001727 " set up redirection
1728 if &srr =~ "%s"
1729 let redir= substitute(&srr,"%s","/dev/null"."")
1730 else
1731 let redir= &srr . "/dev/null"
1732 endif
1733" call Decho("redir:".redir.":")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001734
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001735 " execute the file handler
1736 if has("win32") || has("win64")
1737" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1738 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1739 let ret= v:shell_error
1740
1741 elseif has("unix") && executable("kfmclient")
1742" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1743 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1744 let ret= v:shell_error
1745
1746 elseif has("unix") && executable("gnome-open")
1747" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1748 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1749 let ret= v:shell_error
1750
1751 elseif exten != "" && exists("*NetrwFileHandler_".exten)
1752" call Decho("let ret= NetrwFileHandler_".exten.'("'.fname.'")')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001753 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001754 endif
1755 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001756
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001757 " cleanup: remove temporary file,
1758 " delete current buffer if success with handler,
1759 " return to prior buffer (directory listing)
1760 if a:remote == 1 && fname != a:fname
1761" call Decho("deleting temporary file<".fname.">")
1762 call delete(fname)
1763 endif
1764
1765 if a:remote == 1
Bram Moolenaar572cb562005-08-05 21:35:02 +00001766 set bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001767 exe "norm! \<c-o>"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001768 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001769 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001770
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001771" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001772endfun
1773
1774" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001775" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1776" This function assumes that a long listing will be received. Size, time,
1777" and reverse sorts will be requested of the server but not otherwise
1778" enforced here.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001779fun! s:NetBrowseFtpCmd(path,cmd)
Bram Moolenaar488c6512005-08-11 20:09:58 +00001780" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".w:netrw_method)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001781
1782 " because WinXX ftp uses unix style input
1783 " curline is one more than the bannercnt in order to account
1784 " for the unwanted first blank line (doing a :put to an empty
1785 " buffer yields a blank first line)
1786 let ffkeep= &ff
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001787 setlocal ma ff=unix
Bram Moolenaar488c6512005-08-11 20:09:58 +00001788 let curline= w:netrw_bannercnt+1
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001789 exe "silent! keepjumps ".curline.",$d"
1790
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001791 ".........................................
1792 if w:netrw_method == 2 || w:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001793 " ftp + <.netrc>: Method #2
1794 if a:path != ""
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001795 put ='cd \"'.a:path.'\"'
1796" call Decho('ftp: '.getline("."))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001797 endif
1798 exe "put ='".a:cmd."'"
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001799" call Decho("ftp: ".getline("."))
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001800" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001801 if exists("g:netrw_port") && g:netrw_port != ""
1802" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1803 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1804 else
1805" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1806 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1807 endif
1808
1809 ".........................................
Bram Moolenaar488c6512005-08-11 20:09:58 +00001810 elseif w:netrw_method == 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001811 " ftp + machine,id,passwd,filename: Method #3
1812 setlocal ff=unix
1813 if exists("g:netrw_port") && g:netrw_port != ""
1814 put ='open '.g:netrw_machine.' '.g:netrw_port
1815 else
1816 put ='open '.g:netrw_machine
1817 endif
1818
1819 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1820 put =g:netrw_uid
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001821 put ='\"'.g:netrw_passwd.'\"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001822 else
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001823 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001824 endif
1825
1826 if a:path != ""
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001827 put ='cd \"'.a:path.'\"'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001828 endif
1829 exe "put ='".a:cmd."'"
1830
1831 " perform ftp:
1832 " -i : turns off interactive prompting from ftp
1833 " -n unix : DON'T use <.netrc>, even though it exists
1834 " -n win32: quit being obnoxious about password
1835" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1836 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1837
1838 ".........................................
1839 else
1840 echo "***warning*** unable to comply with your request<" . choice . ">"
1841 endif
1842
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001843 " cleanup for Windows
1844 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001845 silent! keepjumps! %s/\r$//e
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001846 endif
1847 if a:cmd == "dir"
1848 " infer directory/link based on the file permission string
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001849 silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1850 silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001851 if w:netrw_longlist == 0 || w:netrw_longlist == 2
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001852 exe "silent! keepjumps ".curline.',$s/^\%(\S\+\s\+\)\{8}//e'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001853 endif
1854 endif
1855
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00001856 " ftp's ls doesn't seem to include ./ or ../
1857 if !search('^\.\/$','wn')
1858 exe 'keepjumps '.curline
1859 if a:path !~ '^$'
1860 put ='../'
1861 endif
1862 put ='./'
1863 exe 'keepjumps '.curline
1864 endif
1865
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001866 " restore settings
1867 let &ff= ffkeep
1868" call Dret("NetBrowseFtpCmd")
1869endfun
1870
1871" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001872" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1873" separated patterns given in g:netrw_list_hide
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001874fun! s:NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001875" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001876
1877 let listhide= g:netrw_list_hide
1878 while listhide != ""
1879 if listhide =~ ','
1880 let hide = substitute(listhide,',.*$','','e')
1881 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1882 else
1883 let hide = listhide
1884 let listhide= ""
1885 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001886
1887 " Prune the list by hiding any files which match
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001888" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001889 if g:netrw_hide == 1
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001890 exe 'silent keepjumps '.w:netrw_bannercnt.',$g~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001891 elseif g:netrw_hide == 2
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00001892 exe 'silent keepjumps '.w:netrw_bannercnt.',$v~'.hide.'~d'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001893 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001894 endwhile
1895
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001896" call Dret("NetrwListHide")
1897endfun
1898
1899" ---------------------------------------------------------------------
1900" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001901fun! s:NetHideEdit(mode)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001902" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001903
1904 call inputsave()
1905 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1906 call inputrestore()
1907
1908 " refresh the listing
1909 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001910 if a:mode == 0
1911 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1912 else
Bram Moolenaar572cb562005-08-05 21:35:02 +00001913 silent call s:LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001914 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001915
1916" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001917endfun
1918
Bram Moolenaar8299df92004-07-10 09:47:34 +00001919" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001920" NetSortSequence: allows user to edit the sorting sequence
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001921fun! s:NetSortSequence(mode)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001922" call Dfunc("NetSortSequence(mode=".a:mode.")")
1923
1924 call inputsave()
1925 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
1926 call inputrestore()
1927
1928 " refresh the listing
1929 let g:netrw_sort_sequence= newsortseq
1930 if a:mode == 0
1931 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1932 else
1933 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
1934 endif
1935
1936" call Dret("NetSortSequence")
1937endfun
1938
1939" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001940" NetLongList: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001941fun! s:NetLongList(mode)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001942" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".w:netrw_longlist)
1943 let fname = s:NetGetWord()
1944 let w:netrw_longlist = (w:netrw_longlist + 1) % 3
1945" call Decho("fname<".fname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001946
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001947 if w:netrw_longlist == 0
1948 " use one column listing
1949" call Decho("use one column list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001950 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1951
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001952 elseif w:netrw_longlist == 1
1953 " use long list
1954" call Decho("use long list")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001955 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001956
1957 else
1958 " give wide list
1959" call Decho("use wide list")
1960 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001961 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001962 setlocal ma
Bram Moolenaar572cb562005-08-05 21:35:02 +00001963
1964 " clear buffer - this will cause NetBrowse/LocalBrowse to do a refresh
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00001965 %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00001966
1967 " refresh the listing
1968 if a:mode == 0
1969 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1970 else
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00001971 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001972 endif
1973
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001974 " keep cursor on the filename
1975 silent keepjumps $
1976 if fname =~ '/$'
1977 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
1978 else
1979 silent call search('\%(^\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bW')
1980 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00001981
Bram Moolenaar578b49e2005-09-10 19:22:57 +00001982" call Dret("NetLongList : w:netrw_longlist=".w:netrw_longlist)
1983endfun
1984
1985" ---------------------------------------------------------------------
1986" NetrwWideListing: {{{2
1987fun! s:NetrwWideListing()
1988" call Dfunc("NetrwWideListing()")
1989
1990 if w:netrw_longlist == 2
1991 " look for longest filename (cpf=characters per filename)
1992 " cpf: characters per file
1993 " fpl: files per line
1994 " fpc: files per column
1995 set ma
1996 let b:netrw_cpf= 0
1997 if line("$") >= w:netrw_bannercnt
1998 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
1999 else
2000" call Dret("NetrwWideListing")
2001 return
2002 endif
2003" call Decho("max file strlen+1=".b:netrw_cpf)
2004 let b:netrw_cpf= b:netrw_cpf + 1
2005
2006 " determine qty files per line (fpl)
2007 let w:netrw_fpl= winwidth(0)/b:netrw_cpf
2008" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
2009
2010 " make wide display
2011 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=printf("%-'.b:netrw_cpf.'s",submatch(0))/'
2012 let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
2013 let newcolstart = w:netrw_bannercnt + fpc
2014 let newcolend = newcolstart + fpc - 1
2015" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
2016 while line("$") >= newcolstart
2017 if newcolend > line("$") | let newcolend= line("$") | endif
2018 let newcolqty= newcolend - newcolstart
2019 exe newcolstart
2020 if newcolqty == 0
2021 exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
2022 else
2023 exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
2024 endif
2025 exe "silent keepjumps ".newcolstart.','.newcolend.'d'
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002026 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002027 endwhile
2028 exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002029 setlocal noma nomod
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002030 endif
2031
2032" call Dret("NetrwWideListing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002033endfun
2034
2035" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002036" NetSaveWordPosn: used by the "s" command in both remote and local {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002037" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
2038" the same word even though the sorting has changed its order of appearance.
2039fun! s:NetSaveWordPosn()
2040" call Dfunc("NetSaveWordPosn()")
2041 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
2042" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
2043endfun
2044
2045" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002046" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002047fun! s:NetRestoreWordPosn()
2048" call Dfunc("NetRestoreWordPosn()")
2049 silent! call search(s:netrw_saveword,'w')
2050" call Dret("NetRestoreWordPosn")
2051endfun
2052
2053" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002054" NetMakeDir: this function makes a directory (both local and remote) {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002055fun! s:NetMakeDir(usrhost)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002056" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
2057
2058 " get name of new directory from user. A bare <CR> will skip.
2059 " if its currently a directory, also request will be skipped, but with
2060 " a message.
2061 call inputsave()
2062 let newdirname= input("Please give directory name: ")
2063 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002064" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002065
2066 if newdirname == ""
2067" call Dret("NetMakeDir : user aborted with bare <cr>")
2068 return
2069 endif
2070
2071 if a:usrhost == ""
2072
2073 " Local mkdir:
2074 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002075 let fullnewdir= b:netrw_curdir.'/'.newdirname
2076" call Decho("fullnewdir<".fullnewdir.">")
2077 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002078 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002079 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a directory!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002080 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002081 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002082" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
2083 return
2084 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002085 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002086 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002087 echohl WarningMsg | echo "***netrw*** <".newdirname."> is already a file!" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002088 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002089 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002090" call Dret("NetMakeDir : file<".newdirname."> exists previously")
2091 return
2092 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002093
2094 " requested new local directory is neither a pre-existing file or
2095 " directory, so make it!
2096 if exists("*mkdir")
2097 call mkdir(fullnewdir,"p")
2098 else
2099 let netrw_origdir= s:NetGetcwd(1)
2100 exe 'cd '.b:netrw_curdir
2101" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
2102" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
2103 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002104 if !g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002105 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002106
Bram Moolenaar8299df92004-07-10 09:47:34 +00002107 if v:shell_error == 0
2108 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002109" call Decho("refresh listing")
2110 let linenum= line(".")
2111 norm! H0
2112 let hline = line(".")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002113 set ma|norm! 2D
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002114 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
2115 exe "norm! ".hline."G0z\<CR>"
2116 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002117 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002118 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002119 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002120 endif
2121 redraw!
2122
2123 else
2124 " Remote mkdir:
2125 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002126 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002127" call Decho("exe silent! !".mkdircmd." ".newdirname)
2128 exe "silent! !".mkdircmd." ".newdirname
2129 if v:shell_error == 0
2130 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002131 let linenum= line(".")
2132 norm! H0
2133 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002134 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002135 exe "norm! ".hline."G0z\<CR>"
2136 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002137 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002138 echohl Error | echo "***netrw*** unable to make directory<".newdirname.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002139 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002140 endif
2141 redraw!
2142 endif
2143
2144" call Dret("NetMakeDir")
2145endfun
2146
2147" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002148" NetBookmarkDir: {{{2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002149" 0: (user: <b>) bookmark current directory
2150" 1: (user: <B>) change to the bookmarked directory
2151" 2: (user: <q>) list bookmarks
2152" 3: (LocalBrowse) record current directory history
2153" 4: (user: <u>) go up (previous) bookmark
2154" 5: (user: <U>) go down (next) bookmark
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002155fun! s:NetBookmarkDir(chg,curdir)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002156" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002157 if exists("w:netrw_bannercnt") && line(".") <= w:netrw_bannercnt
2158 " looks like a "b" was pressed while in the banner region
2159 if line("$") > w:netrw_bannercnt
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002160 exe 'silent keepjumps '.w:netrw_bannercnt
Bram Moolenaar488c6512005-08-11 20:09:58 +00002161 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002162 if &ch > 1
2163 " "clear" the message
2164 echo ""
2165 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002166" call Dret("NetBookmarkDir - ignoring")
2167 return
2168 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002169
2170 if a:chg == 0
2171 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002172 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
2173 if !exists("g:NETRW_BOOKMARKMAX")
2174 let g:NETRW_BOOKMARKMAX= v:count
2175 elseif v:count > g:NETRW_BOOKMARKMAX
2176 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002177 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002178 echo "bookmarked the current directory"
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002179
2180 elseif a:chg == 1
2181 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002182 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
2183 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002184 else
2185 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
2186 endif
2187
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002188 elseif a:chg == 2
Bram Moolenaar572cb562005-08-05 21:35:02 +00002189 " list user's bookmarks
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002190 if exists("g:NETRW_BOOKMARKMAX")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002191" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
2192 let cnt= 0
2193 while cnt <= g:NETRW_BOOKMARKMAX
2194 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
2195" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
2196 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
2197 endif
2198 let cnt= cnt + 1
2199 endwhile
2200 endif
2201
2202 " list directory history
2203 let cnt = g:NETRW_DIRHIST_CNT
2204 let first = 1
2205 let histcnt = 0
2206 while ( first || cnt != g:NETRW_DIRHIST_CNT )
2207" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
2208 let histcnt= histcnt + 1
2209 if exists("g:NETRW_DIRHIST_{cnt}")
2210" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
2211 echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002212 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002213 let first = 0
2214 let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2215 if cnt < 0
2216 let cnt= cnt + g:netrw_dirhistmax
2217 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002218 endwhile
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002219
2220 elseif a:chg == 3
Bram Moolenaar572cb562005-08-05 21:35:02 +00002221 " saves most recently visited directories (when they differ)
2222 if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
2223 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2224 let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
2225" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2226 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002227
2228 elseif a:chg == 4
2229 " u: change to the previous directory stored on the history list
2230 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2231 if g:NETRW_DIRHIST_CNT < 0
2232 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2233 endif
2234 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2235" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2236 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2237 else
2238 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2239 echo "Sorry, no predecessor directory exists yet"
2240 endif
2241
2242 elseif a:chg == 5
2243 " U: change to the subsequent directory stored on the history list
2244 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
2245 if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
2246" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
2247 exe "e ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
2248 else
2249 let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
2250 if g:NETRW_DIRHIST_CNT < 0
2251 let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
2252 endif
2253 echo "Sorry, no successor directory exists yet"
2254 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002255 endif
2256" call Dret("NetBookmarkDir")
2257endfun
2258
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002259" ---------------------------------------------------------------------
2260" NetObtain: obtain file under cursor (for remote browsing support) {{{2
2261fun! s:NetObtain()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002262 let fname= expand("<cWORD>")
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002263
2264 " NetrwStatusLine support - for obtaining support
2265 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.fname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002266
2267" call Dfunc("NetObtain() method=".w:netrw_method)
2268 if exists("w:netrw_method") && w:netrw_method =~ '[235]'
2269 if executable("ftp")
2270 let curdir = expand("%")
2271 let path = substitute(curdir,'ftp://[^/]\+/','','e')
2272 let curline= line(".")
2273 let endline= line("$")+1
2274 set ma
2275 keepjumps $
2276
2277 ".........................................
2278 if w:netrw_method == 2
2279 " ftp + <.netrc>: Method #2
2280 if path != ""
2281 put ='cd '.path
2282" call Decho("ftp: cd ".path)
2283 endif
2284 put ='get '.fname
2285" call Decho("ftp: get ".fname)
2286 if exists("g:netrw_port") && g:netrw_port != ""
2287" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
2288 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
2289 else
2290" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
2291 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
2292 endif
2293
2294 ".........................................
2295 elseif w:netrw_method == 3
2296 " ftp + machine,id,passwd,filename: Method #3
2297 setlocal ff=unix
2298 if exists("g:netrw_port") && g:netrw_port != ""
2299 put ='open '.g:netrw_machine.' '.g:netrw_port
2300" call Decho('ftp: open '.g:netrw_machine.' '.g:netrw_port)
2301 else
2302 put ='open '.g:netrw_machine
2303" call Decho('ftp: open '.g:netrw_machine
2304 endif
2305
2306 if exists("g:netrw_ftp") && g:netrw_ftp == 1
2307 put =g:netrw_uid
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002308 put ='\"'.g:netrw_passwd.'\"'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002309" call Decho('ftp: g:netrw_uid')
2310" call Decho('ftp: g:netrw_passwd')
2311 else
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002312 put ='user \"'.g:netrw_uid.'\" \"'.g:netrw_passwd.'\"'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002313" call Decho('user '.g:netrw_uid.' '.g:netrw_passwd)
2314 endif
2315
2316 if a:path != ""
2317 put ='cd '.a:path
2318" call Decho('cd '.a:path)
2319 endif
2320 exe "put ='".a:cmd."'"
2321" call Decho("ftp: ".a:cmd)
2322
2323 " perform ftp:
2324 " -i : turns off interactive prompting from ftp
2325 " -n unix : DON'T use <.netrc>, even though it exists
2326 " -n win32: quit being obnoxious about password
2327" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
2328 exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i -n"
2329
2330 ".........................................
2331 else
2332 echo "***warning*** unable to comply with your request<" . choice . ">"
2333 endif
2334 " restore
2335 exe "silent! ".endline.",$d"
2336 exe "keepjumps ".curline
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002337 setlocal noma nomod
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002338 else
2339 if !exists("g:netrw_quiet")
2340 echohl Error | echo "***netrw*** this system doesn't support ftp" | echohl None
2341 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2342 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002343 let &stl = s:netrw_users_stl
2344 let &laststatus = s:netrw_users_ls
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002345" call Dret("NetObtain")
2346 return
2347 endif
2348
2349 ".........................................
2350 else
2351 " scp: Method#4
2352 if exists("g:netrw_port") && g:netrw_port != ""
2353 let useport= " -P ".g:netrw_port
2354 else
2355 let useport= ""
2356 endif
2357 if g:netrw_cygwin == 1
2358 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
2359" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." .")
2360 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." ."
2361 else
2362" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." .")
2363 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(fname,' ?&')." ."
2364 endif
2365 endif
2366
2367 " restore status line
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002368 let &stl = s:netrw_users_stl
2369 let &laststatus = s:netrw_users_ls
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002370 redraw!
2371
2372" call Dret("NetObtain")
2373endfun
2374
Bram Moolenaar83bab712005-08-01 21:58:57 +00002375" ==========================================
2376" Local Directory Browsing Support: {{{1
2377" ==========================================
Bram Moolenaar8299df92004-07-10 09:47:34 +00002378
2379" ---------------------------------------------------------------------
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002380" LocalBrowse: {{{2
2381fun! s:LocalBrowse(dirname)
2382 " unfortunate interaction -- debugging calls can't be used here;
2383 " the BufEnter event causes triggering when attempts to write to
2384 " the DBG buffer are made.
2385 if isdirectory(a:dirname)
2386 call netrw#DirBrowse(a:dirname)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002387 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002388 " not a directory, ignore it
2389endfun
Bram Moolenaar8299df92004-07-10 09:47:34 +00002390
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002391" ---------------------------------------------------------------------
2392" DirBrowse: supports local file/directory browsing {{{2
2393fun! netrw#DirBrowse(dirname)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002394 if !exists("w:netrw_longlist")|let w:netrw_longlist= g:netrw_longlist|endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002395" call Dfunc("DirBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr()." sortby=".g:netrw_sort_by)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002396" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002397
Bram Moolenaar488c6512005-08-11 20:09:58 +00002398 if exists("s:netrw_skipbrowse")
2399 unlet s:netrw_skipbrowse
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002400" call Dret("DirBrowse")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002401 return
2402 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002403 call s:NetOptionSave()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002404
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002405 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002406 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002407 echohl Error | echo "***netrw*** vim version<".v:version."> too old for browsing with netrw" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002408 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002409 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002410 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002411" call Dret("DirBrowse : vim version<".v:version."> too old")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002412 return
2413 endif
2414
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002415 " use buffer-oriented WinVars if buffer ones exist but window ones don't
2416 call s:UseBufWinVars()
2417
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002418 " find buffer number of buffer named precisely the same as a:dirname
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002419 let bufnum= bufnr(escape(a:dirname,'\'))
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002420" call Decho("findbuf: bufnum=".bufnum)
2421 if bufnum > 0 && bufname(bufnum) != a:dirname
2422 let ibuf= 1
2423 let buflast= bufnr("$")
2424 while bufname(ibuf) !~ '^'.a:dirname.'\=$' && ibuf <= buflast
2425" call Decho("findbuf: ibuf=".ibuf. " bufname<".bufname(ibuf)."> dirname<".a:dirname.">")
2426 let ibuf= ibuf + 1
2427 endwhile
2428 if ibuf > buflast
2429 let bufnum= -1
2430 else
2431 let bufnum= ibuf
2432 endif
2433" call Decho("findbuf: bufnum=".bufnum." (final)")
2434 endif
2435
2436 " get cleared buffer
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002437 if bufnum < 0 || !bufexists(bufnum)
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002438 keepjumps keepalt enew!
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002439" call Decho("enew buffer")
2440 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002441 exe "keepalt b ".bufnum
Bram Moolenaar572cb562005-08-05 21:35:02 +00002442 if exists("s:last_sort_by") && g:netrw_sort_by == s:last_sort_by
2443 if getline(2) =~ '^" Directory Listing '
2444 if !g:netrw_keepdir
2445" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002446 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002447 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002448 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002449" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002450 return
2451 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002452 endif
2453 endif
Bram Moolenaar572cb562005-08-05 21:35:02 +00002454 let s:last_sort_by= g:netrw_sort_by
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002455
2456 " get the new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002457 if has("win32") || has("win95") || has("win64") || has("win16")
2458 let b:netrw_curdir= substitute(a:dirname,'\\','/','ge')
2459 else
2460 let b:netrw_curdir= a:dirname
2461 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002462 if b:netrw_curdir =~ '[/\\]$'
2463 let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2464 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002465 if b:netrw_curdir == ''
2466 " under unix, when the root directory is encountered, the result
2467 " from the preceding substitute is an empty string.
2468 let b:netrw_curdir= '/'
2469 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002470" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002471
Bram Moolenaar83bab712005-08-01 21:58:57 +00002472 " make netrw's idea of the current directory vim's if the user wishes
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002473 if !g:netrw_keepdir
Bram Moolenaar83bab712005-08-01 21:58:57 +00002474" call Decho("change directory: cd ".b:netrw_curdir)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002475 try
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002476 exe 'cd '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002477 catch /^Vim\%((\a\+)\)\=:E472/
2478 echohl Error | echo "***netrw*** unable to change directory to <".b:netrw_curdir."> (permissions?)" | echohl None
2479 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2480 if exists("w:netrw_prvdir")
2481 let b:netrw_curdir= w:netrw_prvdir
2482 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002483 call s:NetOptionRestore()
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002484" call Dret("DirBrowse : reusing buffer#".bufnum."<".a:dirname.">")
Bram Moolenaar488c6512005-08-11 20:09:58 +00002485 return
2486 endif
2487 endtry
Bram Moolenaar83bab712005-08-01 21:58:57 +00002488 endif
2489
2490 " change the name of the buffer to reflect the b:netrw_curdir
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002491 exe 'silent! file '.escape(b:netrw_curdir,s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002492
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002493 " make this buffer not-a-file, modifiable, not line-numbered, etc
2494 setlocal bh=hide bt=nofile nobl ma nonu
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002495 keepalt silent! %d
Bram Moolenaar8299df92004-07-10 09:47:34 +00002496
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002497 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002498 " Perform Directory Listing:
Bram Moolenaar8299df92004-07-10 09:47:34 +00002499
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002500 " save current directory on directory history list
Bram Moolenaar83bab712005-08-01 21:58:57 +00002501 call <SID>NetBookmarkDir(3,b:netrw_curdir)
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002502
Bram Moolenaar8299df92004-07-10 09:47:34 +00002503 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002504" call Decho("Setting up local browser maps")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002505 nnoremap <buffer> <silent> <cr> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002506 nnoremap <buffer> <silent> <c-l> :set ma<bar>%d<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<bar>redraw!<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002507 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002508 nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002509 if w:netrw_longlist != 2
2510 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2511 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2512 endif
2513 nnoremap <buffer> <silent> Nb :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2514 nnoremap <buffer> <silent> NB :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002515 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2516 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2517 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002518 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002519 nnoremap <buffer> <silent> o :call <SID>NetSplit(2)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002520 nnoremap <buffer> <silent> O :call <SID>LocalObtain()<cr>
2521 nnoremap <buffer> <silent> p :call <SID>LocalPreview(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),1))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002522 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002523 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>LocalRefresh(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002524 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>
2525 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002526 nnoremap <buffer> <silent> u :<c-u>call <SID>NetBookmarkDir(4,expand("%"))<cr>
2527 nnoremap <buffer> <silent> U :<c-u>call <SID>NetBookmarkDir(5,expand("%"))<cr>
Bram Moolenaar488c6512005-08-11 20:09:58 +00002528 nnoremap <buffer> <silent> v :call <SID>NetSplit(3)<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002529 nnoremap <buffer> <silent> x :call <SID>NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)"<cr>
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002530 nnoremap <buffer> <silent> <2-leftmouse> :call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaar572cb562005-08-05 21:35:02 +00002531 nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
2532 nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002533 exe 'nnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002534 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002535 exe 'nnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002536 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002537 exe 'nnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002538 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002539 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002540 nnoremap <buffer> ? :he netrw-dir<cr>
2541
2542 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002543" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002544 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002545 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002546 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002547 keepjumps put ='\" '.b:netrw_curdir
Bram Moolenaar488c6512005-08-11 20:09:58 +00002548 let w:netrw_bannercnt= 3
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002549
2550 let sortby= g:netrw_sort_by
2551 if g:netrw_sort_direction =~ "^r"
2552 let sortby= sortby." reversed"
2553 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002554
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002555 " Sorted by...
Bram Moolenaar8299df92004-07-10 09:47:34 +00002556 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002557" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002558 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002559 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002560 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
Bram Moolenaar488c6512005-08-11 20:09:58 +00002561 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar8299df92004-07-10 09:47:34 +00002562 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002563" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002564 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002565 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar488c6512005-08-11 20:09:58 +00002566 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002567 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002568
2569 " Hiding... -or- Showing...
Bram Moolenaar269ec652004-07-29 08:43:53 +00002570 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002571 if g:netrw_hide == 1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002572 keepjumps put ='\" Hiding: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002573 else
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002574 keepjumps put ='\" Showing: '.g:netrw_list_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002575 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002576 let w:netrw_bannercnt= w:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002577 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002578 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2579 keepjumps put ='\" ============================================================================'
Bram Moolenaar488c6512005-08-11 20:09:58 +00002580 let w:netrw_bannercnt= w:netrw_bannercnt + 2
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002581
2582 " bannercnt should index the line just after the banner
Bram Moolenaar488c6512005-08-11 20:09:58 +00002583 let w:netrw_bannercnt= w:netrw_bannercnt + 1
2584" call Decho("bannercnt=".w:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002585
2586 " generate the requested directory listing
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002587 call s:LocalBrowseList()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002588
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002589 " set up syntax highlighting
2590 if has("syntax")
2591 setlocal ft=netrwlist
Bram Moolenaar572cb562005-08-05 21:35:02 +00002592 if !exists("g:syntax_on") || !g:syntax_on
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002593 setlocal ft=
2594 endif
2595 endif
2596
Bram Moolenaar8299df92004-07-10 09:47:34 +00002597 " manipulate the directory listing (hide, sort)
Bram Moolenaar488c6512005-08-11 20:09:58 +00002598 if line("$") >= w:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002599 if g:netrw_hide && g:netrw_list_hide != ""
2600 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002601 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00002602 if line("$") >= w:netrw_bannercnt
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002603
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002604 if g:netrw_sort_by =~ "^n"
2605 call s:SetSort()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002606
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002607 if g:netrw_sort_direction =~ 'n'
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002608 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002609 else
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002610 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002611 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002612 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002613
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002614 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002615 if g:netrw_sort_direction =~ 'n'
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002616 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002617 else
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002618 exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002619 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002620 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002621 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002622
Bram Moolenaar8299df92004-07-10 09:47:34 +00002623 endif
2624 endif
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002625
2626 call s:NetrwWideListing()
Bram Moolenaar488c6512005-08-11 20:09:58 +00002627 if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002628 " place cursor on the top-left corner of the file listing
2629 exe 'silent '.w:netrw_bannercnt
2630 norm! 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00002631 endif
2632
2633 " record previous current directory
2634 let w:netrw_prvdir= b:netrw_curdir
Bram Moolenaar8299df92004-07-10 09:47:34 +00002635
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00002636 " save certain window-oriented variables into buffer-oriented variables
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002637 call s:SetBufWinVars()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002638 call s:NetOptionRestore()
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002639 setlocal noma nomod nonu bh=hide nobl
Bram Moolenaar8299df92004-07-10 09:47:34 +00002640
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002641" call Dret("DirBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002642endfun
2643
2644" ---------------------------------------------------------------------
2645" LocalBrowseList: does the job of "ls" for local directories {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002646fun! s:LocalBrowseList()
Bram Moolenaar83bab712005-08-01 21:58:57 +00002647" call Dfunc("LocalBrowseList() b:netrw_curdir<".b:netrw_curdir.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002648
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002649 " get the list of files contained in the current directory
Bram Moolenaar83bab712005-08-01 21:58:57 +00002650 let dirname = escape(b:netrw_curdir,s:netrw_glob_escape)
2651 let dirnamelen = strlen(b:netrw_curdir)
2652 let filelist = glob(dirname."/*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002653" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002654 if filelist != ""
2655 let filelist= filelist."\n"
2656 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002657 let filelist= filelist.glob(dirname."/.*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002658" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2659
2660 " if the directory name includes a "$", and possibly other characters,
2661 " the glob() doesn't include "." and ".." entries.
2662 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2663" call Decho("forcibly tacking on .")
2664 if filelist == ""
2665 let filelist= dirname."."
2666 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002667 let filelist= filelist."\n".b:netrw_curdir."."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002668 endif
2669" call Decho("filelist<".filelist.">")
2670 endif
2671 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2672" call Decho("forcibly tacking on ..")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002673 let filelist= filelist."\n".b:netrw_curdir.".."
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002674" call Decho("filelist<".filelist.">")
2675 endif
2676 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002677 let filelist= substitute(filelist,'\','/','ge')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002678
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002679" call Decho("dirname<".dirname.">")
2680" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002681" call Decho("filelist<".filelist.">")
2682
2683 while filelist != ""
2684 if filelist =~ '\n'
Bram Moolenaar83bab712005-08-01 21:58:57 +00002685 let filename = substitute(filelist,'\n.*$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002686 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2687 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00002688 let filename = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002689 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00002690 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00002691 let pfile= filename
2692 if isdirectory(filename)
2693 let pfile= filename."/"
Bram Moolenaar8299df92004-07-10 09:47:34 +00002694 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002695 if pfile =~ '//$'
2696 let pfile= substitute(pfile,'//$','/','e')
2697 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002698 let pfile= strpart(pfile,dirnamelen)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002699 let pfile= substitute(pfile,'^/','','e')
Bram Moolenaar83bab712005-08-01 21:58:57 +00002700" call Decho(" ")
2701" call Decho("filename<".filename.">")
2702" call Decho("pfile <".pfile.">")
2703
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002704 if w:netrw_longlist == 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002705 let sz = getfsize(filename)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002706 let fsz = strpart(" ",1,15-strlen(sz)).sz
2707 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
Bram Moolenaar83bab712005-08-01 21:58:57 +00002708" call Decho("sz=".sz." fsz=".fsz)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002709 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002710
Bram Moolenaar8299df92004-07-10 09:47:34 +00002711 if g:netrw_sort_by =~ "^t"
2712 " sort by time (handles time up to 1 quintillion seconds, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002713" call Decho("getftime(".filename.")=".getftime(filename))
2714 let t = getftime(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002715 let ft = strpart("000000000000000000",1,18-strlen(t)).t
Bram Moolenaar83bab712005-08-01 21:58:57 +00002716" call Decho("exe keepjumps put ='".ft.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002717 let ftpfile= ft.'/'.pfile
2718 keepjumps put=ftpfile
2719
Bram Moolenaar8299df92004-07-10 09:47:34 +00002720 elseif g:netrw_sort_by =~ "^s"
2721 " sort by size (handles file sizes up to 1 quintillion bytes, US)
Bram Moolenaar83bab712005-08-01 21:58:57 +00002722" call Decho("getfsize(".filename.")=".getfsize(filename))
2723 let sz = getfsize(filename)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002724 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
Bram Moolenaar83bab712005-08-01 21:58:57 +00002725" call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002726 let fszpfile= fsz.'/'.pfile
2727 keepjumps put =fszpfile
2728
Bram Moolenaar8299df92004-07-10 09:47:34 +00002729 else
2730 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002731" call Decho("exe keepjumps put ='".pfile."'")
2732 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002733 endif
2734 endwhile
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002735
2736 " cleanup any windows mess at end-of-line
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00002737 silent! keepjumps %s/\r$//e
Bram Moolenaar83bab712005-08-01 21:58:57 +00002738 setlocal ts=32
Bram Moolenaar8299df92004-07-10 09:47:34 +00002739
2740" call Dret("LocalBrowseList")
2741endfun
2742
2743" ---------------------------------------------------------------------
2744" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2745" directory and a new directory name
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002746fun! s:LocalBrowseChgDir(dirname,newdir,...)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002747" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002748
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002749 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002750 let newdir = a:newdir
2751
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002752 if dirname !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002753 " apparently vim is "recognizing" that it is in the home directory and
2754 " is removing the "/". Bad idea, so I have to put it back.
2755 let dirname= dirname.'/'
2756" call Decho("adjusting dirname<".dirname.">")
2757 endif
2758
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002759 if newdir !~ '[\/]$'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002760 " handling a file
2761 let dirname= dirname.newdir
2762" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002763 " this lets NetBrowseX avoid the edit
2764 if a:0 < 1
Bram Moolenaar83bab712005-08-01 21:58:57 +00002765" call Decho("dirname<".dirname."> netrw_cd_escape<".s:netrw_cd_escape.">")
2766" call Decho("about to edit<".escape(dirname,s:netrw_cd_escape).">")
2767 exe "e! ".escape(dirname,s:netrw_cd_escape)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002768 set ma nomod
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002769 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002770
2771 elseif newdir == './'
2772 " refresh the directory list
2773" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002774
2775 elseif newdir == '../'
2776 " go up one directory
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002777 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+[\/]$\)','\1','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002778" call Decho("go up one dir: dirname<".dirname.">")
2779
2780 else
2781 " go down one directory
2782 let dirname= dirname.newdir
2783" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2784 endif
2785
2786" call Dret("LocalBrowseChgDir <".dirname.">")
2787 return dirname
2788endfun
2789
2790" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002791" LocalBrowseRm: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002792fun! s:LocalBrowseRm(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002793" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2794" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2795
2796 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002797 let ctr = a:firstline
2798 let ret = 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002799 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002800
2801 " remove multiple files and directories
2802 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002803 exe "keepjumps ".ctr
2804
2805 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00002806 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002807 let ctr= ctr + 1
2808 continue
2809 endif
2810 let curword= s:NetGetWord()
2811 if curword == "./" || curword == "../"
2812 let ctr= ctr + 1
2813 continue
2814 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002815
2816 norm! 0
Bram Moolenaar83bab712005-08-01 21:58:57 +00002817 let rmfile= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002818" call Decho("rmfile<".rmfile.">")
2819
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002820 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002821 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002822 if !all
2823 echohl Statement
2824 call inputsave()
2825 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2826 call inputrestore()
2827 echohl NONE
2828 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2829 if ok =~ 'a\%[ll]'
2830 let all= 1
2831 endif
2832 endif
2833
2834 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002835 let ret= delete(rmfile)
2836" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002837 elseif ok =~ 'q\%[uit]'
2838 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002839 endif
2840
2841 else
2842 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002843 if !all
2844 echohl Statement
2845 call inputsave()
2846 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2847 call inputrestore()
2848 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2849 if ok =~ 'a\%[ll]'
2850 let all= 1
2851 endif
2852 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002853 let rmfile= substitute(rmfile,'[\/]$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002854
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002855 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002856" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2857 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002858" call Decho("v:shell_error=".v:shell_error)
2859
2860 if v:shell_error != 0
2861" call Decho("2nd attempt to remove directory<".rmfile.">")
2862 let errcode= delete(rmfile)
2863" call Decho("errcode=".errcode)
2864
2865 if errcode != 0
2866 if has("unix")
2867" call Decho("3rd attempt to remove directory<".rmfile.">")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002868call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002869 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002870 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002871 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002872endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002873 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002874 echohl Error | echo "***netrw*** unable to remove directory<".rmfile."> -- is it empty?" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002875 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002876 endif
2877 endif
2878 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002879
2880 elseif ok =~ 'q\%[uit]'
2881 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002882 endif
2883 endif
2884
2885 let ctr= ctr + 1
2886 endwhile
2887
2888 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002889 let curline= line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002890" call Decho("refresh the directory")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002891 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002892 exe curline
2893
2894" call Dret("LocalBrowseRm")
2895endfun
2896
2897" ---------------------------------------------------------------------
2898" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002899fun! s:LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002900" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2901
2902 " preparation for removing multiple files/directories
2903 let ctr= a:firstline
2904
2905 " attempt to rename files/directories
2906 while ctr <= a:lastline
2907 exe "keepjumps ".ctr
2908
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002909 " sanity checks
Bram Moolenaar488c6512005-08-11 20:09:58 +00002910 if line(".") < w:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002911 let ctr= ctr + 1
2912 continue
2913 endif
2914 let curword= s:NetGetWord()
2915 if curword == "./" || curword == "../"
2916 let ctr= ctr + 1
2917 continue
2918 endif
2919
Bram Moolenaar8299df92004-07-10 09:47:34 +00002920 norm! 0
Bram Moolenaar572cb562005-08-05 21:35:02 +00002921 let oldname= a:path."/".curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002922" call Decho("oldname<".oldname.">")
2923
2924 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002925 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002926 call inputrestore()
2927
Bram Moolenaar83bab712005-08-01 21:58:57 +00002928 let ret= rename(oldname,newname)
2929" call Decho("renaming <".oldname."> to <".newname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002930
2931 let ctr= ctr + 1
2932 endwhile
2933
2934 " refresh the directory
2935 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002936" call Decho("refresh the directory listing")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002937 call s:LocalRefresh(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002938 exe "keepjumps ".curline
2939" call Dret("LocalBrowseRename")
2940endfun
2941
2942" ---------------------------------------------------------------------
Bram Moolenaar578b49e2005-09-10 19:22:57 +00002943" LocalObtain: copy selected file to current working directory {{{2
2944fun! s:LocalObtain()
2945" call Dfunc("LocalObtain()")
2946 if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
2947 let fname= expand("<cWORD>")
2948 let fcopy= readfile(b:netrw_curdir."/".fname,"b")
2949 call writefile(fcopy,getcwd()."/".fname,"b")
2950 elseif !exists("b:netrw_curdir")
2951 echohl Error | echo "***netrw*** local browsing directory doesn't exist!"
2952 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2953 else
2954 echohl Error | echo "***netrw*** local browsing directory and current directory are identical"
2955 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2956 endif
2957" call Dret("LocalObtain")
2958endfun
2959
2960" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002961" LocalPreview: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002962fun! s:LocalPreview(path) range
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002963" call Dfunc("LocalPreview(path<".a:path.">)")
2964 if has("quickfix")
2965 if !isdirectory(a:path)
2966 exe "pedit ".a:path
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002967 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002968 echohl WarningMsg | echo "***netrw*** sorry, cannot preview a directory such as <".a:path.">" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002969 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002970 endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002971 elseif !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00002972 echohl WarningMsg | echo "***netrw*** sorry, to preview your vim needs the quickfix feature compiled in" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00002973 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002974 endif
2975" call Dret("LocalPreview")
2976endfun
2977
2978" ---------------------------------------------------------------------
Bram Moolenaar572cb562005-08-05 21:35:02 +00002979" LocalRefresh: {{{2
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002980fun! s:LocalRefresh(dirname)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002981" call Dfunc("LocalRefresh(dirname<".a:dirname.">)")
2982 set ma
2983 %d
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002984 call s:LocalBrowse(a:dirname)
Bram Moolenaar572cb562005-08-05 21:35:02 +00002985 redraw!
2986" call Dret("LocalRefresh")
2987endfun
2988
2989" ---------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00002990" Explore: launch the local browser in the directory of the current file {{{2
2991" dosplit==0: the window will be split iff the current file has
2992" been modified
2993" dosplit==1: the window will be split before running the local
2994" browser
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002995fun! netrw#Explore(indx,dosplit,style,...)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00002996" call Dfunc("Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.")")
Bram Moolenaar83bab712005-08-01 21:58:57 +00002997
2998 " if dosplit or file has been modified
2999 if a:dosplit || &modified
Bram Moolenaar488c6512005-08-11 20:09:58 +00003000 call <SID>SaveWinVars()
3001
Bram Moolenaar83bab712005-08-01 21:58:57 +00003002 if a:style == 0 " Explore, Sexplore
3003 exe g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003004" call Decho("style=0: Explore or Sexplore")
3005
Bram Moolenaar83bab712005-08-01 21:58:57 +00003006 elseif a:style == 1 "Explore!, Sexplore!
3007 exe g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003008" call Decho("style=1: Explore! or Sexplore!")
3009
Bram Moolenaar83bab712005-08-01 21:58:57 +00003010 elseif a:style == 2 " Hexplore
3011 exe "bel ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003012" call Decho("style=2: Hexplore")
3013
Bram Moolenaar83bab712005-08-01 21:58:57 +00003014 elseif a:style == 3 " Hexplore!
3015 exe "abo ".g:netrw_winsize."wincmd s"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003016" call Decho("style=3: Hexplore!")
3017
Bram Moolenaar83bab712005-08-01 21:58:57 +00003018 elseif a:style == 4 " Vexplore
3019 exe "lefta ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003020" call Decho("style=4: Vexplore")
3021
Bram Moolenaar83bab712005-08-01 21:58:57 +00003022 elseif a:style == 5 " Vexplore!
3023 exe "rightb ".g:netrw_winsize."wincmd v"
Bram Moolenaar488c6512005-08-11 20:09:58 +00003024" call Decho("style=5: Vexplore!")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003025 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003026 call s:CopyWinVars()
Bram Moolenaar83bab712005-08-01 21:58:57 +00003027 endif
3028 norm! 0
3029
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003030 if a:1 == "" && a:indx >= 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003031 " Explore Hexplore Vexplore Sexplore
3032 let newdir= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3033 if newdir =~ '^scp:' || newdir =~ '^ftp:'
3034" call Decho("calling NetBrowse(newdir<".newdir.">)")
3035 call s:NetBrowse(newdir)
3036 else
3037" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3038 call s:LocalBrowse(newdir)
3039 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003040
Bram Moolenaar572cb562005-08-05 21:35:02 +00003041 elseif a:1 =~ '\*\*/' || a:indx < 0
Bram Moolenaar488c6512005-08-11 20:09:58 +00003042 " Nexplore Pexplore -or- Explore **/...
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003043
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003044 if has("path_extra")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003045 if !exists("w:netrw_explore_indx")
3046 let w:netrw_explore_indx= 0
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003047 endif
3048 let indx = a:indx
3049 if indx == -1
Bram Moolenaar488c6512005-08-11 20:09:58 +00003050 let indx= w:netrw_explore_indx + 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003051 elseif indx == -2
Bram Moolenaar488c6512005-08-11 20:09:58 +00003052 let indx= w:netrw_explore_indx - 1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003053 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003054 let w:netrw_explore_indx = 0
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003055 if !exists("b:netrw_curdir")
Bram Moolenaar488c6512005-08-11 20:09:58 +00003056 let b:netrw_curdir= getcwd()
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003057 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003058 let w:netrw_explore_list = split(expand(b:netrw_curdir."/".a:1),'\n')
3059 let w:netrw_explore_listlen = len(w:netrw_explore_list)
3060 if w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/'
Bram Moolenaar572cb562005-08-05 21:35:02 +00003061 echohl WarningMsg | echo "***netrw*** no files matched" | echohl None
3062 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3063" call Dret("Explore")
3064 return
3065 endif
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003066 endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003067
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003068 " NetrwStatusLine support - for exploring support
Bram Moolenaar488c6512005-08-11 20:09:58 +00003069 let w:netrw_explore_indx= indx
Bram Moolenaar488c6512005-08-11 20:09:58 +00003070" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003071
3072 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00003073 if indx >= w:netrw_explore_listlen || indx < 0
3074 let indx= (indx < 0)? 0 : ( w:netrw_explore_listlen - 1 )
Bram Moolenaar572cb562005-08-05 21:35:02 +00003075 echohl WarningMsg | echo "***netrw*** no more files match Explore pattern" | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003076 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3077" call Dret("Explore")
3078 return
3079 endif
3080
Bram Moolenaar488c6512005-08-11 20:09:58 +00003081 exe "let dirfile= w:netrw_explore_list[".indx."]"
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003082" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003083 let newdir= substitute(dirfile,'/[^/]*$','','e')
3084" call Decho("newdir<".newdir.">")
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003085
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003086" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3087 call s:LocalBrowse(newdir)
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003088 if w:netrw_longlist == 0 || w:netrw_longlist == 1
3089 call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
3090 else
3091 call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
3092 endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003093 let w:netrw_explore_mtchcnt = indx + 1
3094 let w:netrw_explore_bufnr = bufnr(".")
3095 let w:netrw_explore_line = line(".")
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003096 call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
Bram Moolenaar488c6512005-08-11 20:09:58 +00003097" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003098
3099 else
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003100 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003101 echohl WarningMsg | echo "***netrw*** your vim needs the +path_extra feature for Exploring with **!" | echohl None | echohl None
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003102 endif
3103 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3104 endif
3105
Bram Moolenaar83bab712005-08-01 21:58:57 +00003106 else
3107 let newdir= a:1
Bram Moolenaar1d94f9b2005-08-04 21:29:45 +00003108" call Decho("calling LocalBrowse(newdir<".newdir.">)")
3109 call s:LocalBrowse(newdir)
Bram Moolenaar83bab712005-08-01 21:58:57 +00003110 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003111
3112" call Dret("Explore")
3113endfun
3114
3115" ---------------------------------------------------------------------
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003116" SetupNetrwStatusLine: {{{2
3117fun! s:SetupNetrwStatusLine(statline)
3118" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
3119
3120 if !exists("s:netrw_setup_statline")
3121 let s:netrw_setup_statline= 1
3122" call Decho("do first-time status line setup")
3123
3124 if !exists("s:netrw_users_stl")
3125 let s:netrw_users_stl= &stl
3126 endif
3127 if !exists("s:netrw_users_ls")
3128 let s:netrw_users_ls= &laststatus
3129 endif
3130
3131 " set up User9 highlighting as needed
3132 let keepa= @a
3133 redir @a
3134 try
3135 hi User9
3136 catch /^Vim\%((\a\+)\)\=:E411/
3137 if &bg == "dark"
3138 hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
3139 else
3140 hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
3141 endif
3142 endtry
3143 redir END
3144 let @a= keepa
3145 endif
3146
3147 " set up status line (may use User9 highlighting)
3148 " insure that windows have a statusline
3149 " make sure statusline is displayed
3150 let &stl=a:statline
3151 set laststatus=2
3152" call Decho("stl=".&stl)
3153 redraw!
3154
3155" call Dret("SetupNetrwStatusLine : stl=".&stl)
3156endfun
3157
3158" ---------------------------------------------------------------------
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003159" NetrwStatusLine: {{{2
3160fun! NetrwStatusLine()
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003161
3162 " vvv NetrwStatusLine() debugging vvv
3163" let g:stlmsg=""
3164" if !exists("w:netrw_explore_bufnr")
3165" let g:stlmsg="!X<explore_bufnr>"
3166" elseif w:netrw_explore_bufnr != bufnr(".")
3167" let g:stlmsg="explore_bufnr!=".bufnr(".")
3168" endif
3169" if !exists("w:netrw_explore_line")
3170" let g:stlmsg=" !X<explore_line>"
3171" elseif w:netrw_explore_line != line(".")
3172" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
3173" endif
3174" if !exists("w:netrw_explore_list")
3175" let g:stlmsg=" !X<explore_list>"
3176" endif
3177 " ^^^ NetrwStatusLine() debugging ^^^
3178
Bram Moolenaar488c6512005-08-11 20:09:58 +00003179 if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr(".") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003180 " restore user's status line
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003181 let &stl = s:netrw_users_stl
3182 let &laststatus = s:netrw_users_ls
Bram Moolenaar488c6512005-08-11 20:09:58 +00003183 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
3184 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003185 return ""
3186 else
Bram Moolenaar488c6512005-08-11 20:09:58 +00003187 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
Bram Moolenaarf6cf9872005-08-08 22:00:59 +00003188 endif
3189endfun
3190
3191" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003192" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003193" Change backslashes to forward slashes, if any.
3194" If doesc is true, escape certain troublesome characters
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003195fun! s:NetGetcwd(doesc)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003196" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
3197 let curdir= substitute(getcwd(),'\\','/','ge')
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003198 if curdir !~ '[\/]$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003199 let curdir= curdir.'/'
3200 endif
3201 if a:doesc
3202 let curdir= escape(curdir,s:netrw_cd_escape)
3203 endif
3204" call Dret("NetGetcwd <".curdir.">")
3205 return curdir
3206endfun
3207
3208" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00003209" NetMethod: determine method of transfer {{{1
3210" method == 1: rcp
3211" 2: ftp + <.netrc>
3212" 3: ftp + machine, id, password, and [path]filename
3213" 4: scp
3214" 5: http (wget)
3215" 6: cadaver
3216" 7: rsync
3217" 8: fetch
3218" 9: sftp
3219fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003220" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003221
3222 " initialization
3223 let b:netrw_method = 0
3224 let g:netrw_machine = ""
3225 let b:netrw_fname = ""
3226 let g:netrw_port = ""
3227
3228 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003229 " mipf : a:machine a:id password filename Use ftp
3230 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003231 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003232 " rcpurm : rcp://[user@]host/filename Use rcp
3233 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003234 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003235 " httpurm : http://[user@]host/filename Use wget
3236 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003237 " rsyncurm : rsync://host[:port]/path Use rsync
3238 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
3239 " sftpurm : sftp://[user@]host/filename Use scp
3240 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
3241 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
3242 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
Bram Moolenaar83bab712005-08-01 21:58:57 +00003243 let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003244 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003245 let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003246 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003247 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003248 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
3249 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
3250 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
3251
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003252" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003253 " Determine Method
3254 " rcp://user@hostname/...path-to-file
3255 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003256" call Decho("rcp://...")
Bram Moolenaar83bab712005-08-01 21:58:57 +00003257 let b:netrw_method = 1
3258 let userid = substitute(a:choice,rcpurm,'\1',"")
3259 let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
3260 let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003261 if userid != ""
3262 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00003263 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003264
3265 " scp://user@hostname/...path-to-file
3266 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003267" call Decho("scp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003268 let b:netrw_method = 4
Bram Moolenaar83bab712005-08-01 21:58:57 +00003269 let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
3270 let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
3271 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003272
3273 " http://user@hostname/...path-to-file
3274 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003275" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003276 let b:netrw_method = 5
3277 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
3278 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
3279
3280 " dav://hostname[:port]/..path-to-file..
3281 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003282" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003283 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003284 if a:choice =~ '^s'
3285 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
3286 else
3287 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
3288 endif
3289 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003290
3291 " rsync://user@hostname/...path-to-file
3292 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003293" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003294 let b:netrw_method = 7
3295 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
3296 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
3297
3298 " ftp://[user@]hostname[[:#]port]/...path-to-file
3299 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003300" call Decho("ftp://...")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003301 let userid = substitute(a:choice,ftpurm,'\2',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003302 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
3303 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
3304 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003305 if userid != ""
3306 let g:netrw_uid= userid
3307 endif
3308 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3309 let b:netrw_method = 3
3310 else
3311 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
3312 let b:netrw_method= 2
3313 else
3314 if !exists("g:netrw_uid") || g:netrw_uid == ""
3315 call NetUserPass()
3316 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
3317 call NetUserPass(g:netrw_uid)
3318 " else just use current g:netrw_uid and g:netrw_passwd
3319 endif
3320 let b:netrw_method= 3
3321 endif
3322 endif
3323
3324 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003325" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003326 let b:netrw_method = 8
3327 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
3328 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
3329 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
3330 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
3331
3332 " Issue an ftp : "machine id password [path/]filename"
3333 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003334" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003335 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003336 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
3337 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
3338 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
3339 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
3340
3341 " Issue an ftp: "hostname [path/]filename"
3342 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003343" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003344 if exists("g:netrw_uid") && exists("g:netrw_passwd")
3345 let b:netrw_method = 3
3346 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3347 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3348
3349 elseif filereadable(expand("$HOME/.netrc"))
3350 let b:netrw_method = 2
3351 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
3352 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
3353 endif
3354
3355 " sftp://user@hostname/...path-to-file
3356 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003357" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003358 let b:netrw_method = 9
3359 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
3360 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
3361
3362 " Issue an rcp: hostname:filename" (this one should be last)
3363 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003364" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003365 let b:netrw_method = 1
3366 let userid = substitute(a:choice,rcphf,'\2',"")
3367 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
3368 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003369" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
3370" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
3371" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
3372" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003373 if userid != ""
3374 let g:netrw_uid= userid
3375 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00003376 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003377 " don't let PCs try <.netrc>
3378 let b:netrw_method = 3
3379 endif
3380
3381 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003382 if !exists("g:netrw_quiet")
Bram Moolenaar572cb562005-08-05 21:35:02 +00003383 echohl Error | echo "***netrw*** cannot determine method" | echohl None
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003384 call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaarc0197e22004-09-13 20:26:32 +00003385 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003386 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003387 endif
Bram Moolenaar81695252004-12-29 20:58:21 +00003388
3389 " remove any leading [:#] from port number
3390 if g:netrw_port != ""
3391 let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
3392 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003393
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003394" call Decho("a:choice <".a:choice.">")
3395" call Decho("b:netrw_method <".b:netrw_method.">")
3396" call Decho("g:netrw_machine<".g:netrw_machine.">")
3397" call Decho("g:netrw_port <".g:netrw_port.">")
3398" if exists("g:netrw_uid") "Decho
3399" call Decho("g:netrw_uid <".g:netrw_uid.">")
3400" endif "Decho
3401" if exists("g:netrw_passwd") "Decho
3402" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
3403" endif "Decho
3404" call Decho("b:netrw_fname <".b:netrw_fname.">")
3405" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003406endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003407
3408" ------------------------------------------------------------------------
3409" NetUserPass: set username and password for subsequent ftp transfer {{{1
3410" Usage: :call NetUserPass() -- will prompt for userid and password
3411" :call NetUserPass("uid") -- will prompt for password
3412" :call NetUserPass("uid","password") -- sets global userid and password
3413fun! NetUserPass(...)
3414
3415 " get/set userid
3416 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003417" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003418 if !exists("g:netrw_uid") || g:netrw_uid == ""
3419 " via prompt
3420 let g:netrw_uid= input('Enter username: ')
3421 endif
3422 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003423" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003424 let g:netrw_uid= a:1
3425 endif
3426
3427 " get password
3428 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003429" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003430 let g:netrw_passwd= inputsecret("Enter Password: ")
3431 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003432" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003433 let g:netrw_passwd=a:2
3434 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003435
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003436" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003437endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00003438
3439" ------------------------------------------------------------------------
3440" NetOptionSave: save options and set to "standard" form {{{1
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003441fun! s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003442" call Dfunc("NetOptionSave()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003443 if !exists("w:netoptionsave")
3444 let w:netoptionsave= 1
3445 else
3446" call Dret("NetOptionSave : netoptionsave=".w:netoptionsave)
3447 return
3448 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003449
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003450 " Get Temporary Filename
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003451 let w:aikeep = &ai
3452 " record autochdir setting and then insure its unset (tnx to David Fishburn)
3453 if has("netbeans_intg") || has("sun_workshop")
3454 let w:acdkeep = &autochdir
3455 set noautochdir
3456 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003457 let w:cinkeep = &cin
3458 let w:cinokeep = &cino
3459 let w:comkeep = &com
3460 let w:cpokeep = &cpo
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003461 if !g:netrw_keepdir
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003462 let w:dirkeep = getcwd()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003463 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003464 let w:gdkeep = &gd
3465 let w:repkeep = &report
3466 let w:spellkeep = &spell
3467 let w:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00003468 setlocal cino =
3469 setlocal com =
3470 setlocal cpo -=aA
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003471 setlocal nocin noai nospell
Bram Moolenaar8299df92004-07-10 09:47:34 +00003472 setlocal tw =0
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003473 setlocal report=10000
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003474 if has("win32") && !has("win95")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003475 let w:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00003476 setlocal noswf
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003477" call Decho("setting w:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003478 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003479
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003480" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003481endfun
3482
3483" ------------------------------------------------------------------------
3484" NetOptionRestore: restore options {{{1
3485fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003486" call Dfunc("NetOptionRestore()")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003487 if !exists("w:netoptionsave")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003488" call Dret("NetOptionRestore : w:netoptionsave doesn't exist")
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003489 return
3490 endif
3491 unlet w:netoptionsave
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003492
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003493 if exists("w:aikeep")| let &ai= w:aikeep|endif
3494 if (has("netbeans_intg") || has("sun_workshop")) && exists("w:acdkeep")
3495 let &acd= w:acdkeep
3496 unlet w:acdkeep
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003497 endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003498 if exists("w:cinkeep") |let &cin = w:cinkeep |unlet w:cinkeep |endif
3499 if exists("w:cinokeep") |let &cino = w:cinokeep |unlet w:cinokeep |endif
3500 if exists("w:comkeep") |let &com = w:comkeep |unlet w:comkeep |endif
3501 if exists("w:cpokeep") |let &cpo = w:cpokeep |unlet w:cpokeep |endif
3502 if exists("w:dirkeep") |exe "lcd ".w:dirkeep |unlet w:dirkeep |endif
3503 if exists("w:gdkeep") |let &gd = w:gdkeep |unlet w:gdkeep |endif
3504 if exists("w:repkeep") |let &report = w:repkeep |unlet w:repkeep |endif
3505 if exists("w:spellkeep")|let &spell = w:spellkeep |unlet w:spellkeep|endif
3506 if exists("w:twkeep") |let &tw = w:twkeep |unlet w:twkeep |endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003507 if exists("w:swfkeep")
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003508 if &directory == "" && exists("w:swfkeep")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003509 " user hasn't specified a swapfile directory;
3510 " netrw will temporarily make the swapfile
3511 " directory the current local one.
3512 let &directory = getcwd()
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003513 silent! let &swf = w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003514 set directory=
3515 else
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003516 let &swf= w:swfkeep
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003517 endif
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00003518 unlet w:swfkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003519 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00003520
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003521" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003522endfun
3523
3524" ------------------------------------------------------------------------
3525" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003526" to handle extra junk that their system's ftp dumps
3527" into the transfer. This function is provided as an
3528" example and as a fix for a Windows 95 problem: in my
3529" experience, win95's ftp always dumped four blank lines
3530" at the end of the transfer.
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003531if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
Bram Moolenaar071d4272004-06-13 20:20:40 +00003532 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003533" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003534 if method == 3 " ftp (no <.netrc>)
3535 let fourblanklines= line2 - 3
3536 silent fourblanklines.",".line2."g/^\s*/d"
3537 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003538" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00003539 endfun
3540endif
3541
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003542" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003543" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003544if v:version < 700
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003545 fun! s:NetSort() range
Bram Moolenaar83bab712005-08-01 21:58:57 +00003546" " call Dfunc("NetSort()")
3547
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003548 let i = a:firstline + 1
3549 while i <= a:lastline
3550 " find insertion point via binary search
3551 let i_val = getline(i)
3552 let lo = a:firstline
3553 let hi = i
3554 while lo < hi
Bram Moolenaar83bab712005-08-01 21:58:57 +00003555 let mid = (lo + hi) / 2
3556 let mid_val = getline(mid)
3557 if g:netrw_sort_direction =~ '^n'
3558 " normal sorting order
3559 if i_val < mid_val
3560 let hi = mid
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003561 else
Bram Moolenaar83bab712005-08-01 21:58:57 +00003562 let lo = mid + 1
3563 if i_val == mid_val | break | endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003564 endif
Bram Moolenaar83bab712005-08-01 21:58:57 +00003565 else
3566 " reverse sorting order
3567 if i_val > mid_val
3568 let hi = mid
3569 else
3570 let lo = mid + 1
3571 if i_val == mid_val | break | endif
3572 endif
3573 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003574 endwhile
3575 " do insert
3576 if lo < i
Bram Moolenaar83bab712005-08-01 21:58:57 +00003577 exe 'keepjumps '.i.'d_'
3578 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003579 endif
3580 let i = i + 1
3581 endwhile
Bram Moolenaar83bab712005-08-01 21:58:57 +00003582
3583" " call Dret("NetSort")
3584 endfun
3585endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00003586
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003587" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00003588" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
3589" What this function does is to compute a priority for the patterns
3590" in the g:netrw_sort_sequence. It applies a substitute to any
3591" "files" that satisfy each pattern, putting the priority / in
3592" front. An "*" pattern handles the default priority.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003593fun! s:SetSort()
Bram Moolenaar488c6512005-08-11 20:09:58 +00003594" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003595 if w:netrw_longlist == 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00003596 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
3597 else
3598 let seqlist = g:netrw_sort_sequence
3599 endif
3600 " sanity check -- insure that * appears somewhere
3601 if seqlist == ""
3602 let seqlist= '*'
3603 elseif seqlist !~ '\*'
3604 let seqlist= seqlist.',*'
3605 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003606 let priority = 1
3607 while seqlist != ""
3608 if seqlist =~ ','
3609 let seq = substitute(seqlist,',.*$','','e')
3610 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
3611 else
3612 let seq = seqlist
3613 let seqlist = ""
3614 endif
3615 let eseq= escape(seq,'/')
3616 if priority < 10
3617 let spriority= "00".priority.'\/'
3618 elseif priority < 100
3619 let spriority= "0".priority.'\/'
3620 else
3621 let spriority= priority.'\/'
3622 endif
3623" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
3624
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003625 " sanity check
Bram Moolenaar488c6512005-08-11 20:09:58 +00003626 if w:netrw_bannercnt > line("$")
Bram Moolenaar293ee4d2004-12-09 21:34:53 +00003627 " apparently no files were left after a Hiding pattern was used
3628" call Dret("SetSort : no files left after hiding")
3629 return
3630 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003631 if seq == '*'
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003632 exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003633 else
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003634 exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003635 endif
3636 let priority = priority + 1
3637 endwhile
3638
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003639 exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00003640
3641" call Dret("SetSort")
3642endfun
3643
Bram Moolenaar488c6512005-08-11 20:09:58 +00003644" ---------------------------------------------------------------------
3645" SaveWinVars: (used by Explore()) {{{1
3646fun! s:SaveWinVars()
3647" call Dfunc("SaveWinVars()")
3648 if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
3649 if exists("w:netrw_method") |let s:method = w:netrw_method |endif
3650 if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
3651 if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
3652 if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
3653 if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
3654 if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
3655 if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003656 if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003657" call Dret("SaveWinVars")
3658endfun
3659
3660" ---------------------------------------------------------------------
3661" CopyWinVars: (used by Explore()) {{{1
3662fun! s:CopyWinVars()
3663" call Dfunc("CopyWinVars()")
3664 if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
3665 if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
3666 if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
3667 if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
3668 if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
3669 if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
3670 if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
3671 if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003672 if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
Bram Moolenaar488c6512005-08-11 20:09:58 +00003673" call Dret("CopyWinVars")
3674endfun
3675
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003676" ---------------------------------------------------------------------
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003677" SetBufWinVars: (used by NetBrowse() and LocalBrowse()) {{{1
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003678" To allow separate windows to have their own activities, such as
3679" Explore **/pattern, several variables have been made window-oriented.
3680" However, when the user splits a browser window (ex: ctrl-w s), these
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003681" variables are not inherited by the new window. SetBufWinVars() and
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003682" UseBufWinVars() get around that.
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003683fun! s:SetBufWinVars()
3684" call Dfunc("SetBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003685 if exists("w:netrw_longlist") |let b:netrw_longlist = w:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003686 if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
3687 if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
3688 if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
3689 if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
3690 if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen = w:netrw_explore_listlen|endif
3691 if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = w:netrw_explore_mtchcnt|endif
3692 if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
3693 if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
3694 if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
Bram Moolenaar482aaeb2005-09-29 18:26:07 +00003695" call Dret("SetBufWinVars")
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003696endfun
3697
3698" ---------------------------------------------------------------------
3699" UseBufWinVars: (used by NetBrowse() and LocalBrowse() {{{1
3700" Matching function to BufferWinVars()
3701fun! s:UseBufWinVars()
3702" call Dfunc("UseBufWinVars()")
Bram Moolenaar578b49e2005-09-10 19:22:57 +00003703 if exists("b:netrw_longlist") && !exists("w:netrw_longlist") |let w:netrw_longlist = b:netrw_longlist |endif
Bram Moolenaar90cfdbe2005-08-12 19:59:19 +00003704 if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
3705 if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
3706 if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
3707 if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
3708 if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
3709 if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
3710 if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
3711 if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
3712 if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif
3713" call Dret("UseBufWinVars")
3714endfun
3715
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003716" ------------------------------------------------------------------------
3717" Settings Restoration: {{{1
Bram Moolenaar83bab712005-08-01 21:58:57 +00003718let &cpo= s:keepcpo
3719unlet s:keepcpo
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00003720
Bram Moolenaar071d4272004-06-13 20:20:40 +00003721" ------------------------------------------------------------------------
Bram Moolenaar83bab712005-08-01 21:58:57 +00003722" Modelines: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +00003723" vim:ts=8 fdm=marker