blob: 608cc7d21e953e6668691eee8e1a05c160981b7c [file] [log] [blame]
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001" netrw.vim: Handles file transfer and remote directory listing across a network
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002" Last Change: Sep 14, 2004
Bram Moolenaar071d4272004-06-13 20:20:40 +00003" Maintainer: Charles E. Campbell, Jr. PhD <drchipNOSPAM at campbellfamily.biz>
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00004" Version: 51a NOT RELEASED
Bram Moolenaar071d4272004-06-13 20:20:40 +00005" License: Vim License (see vim's :help license)
6"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00007" But be doers of the Word, and not only hearers, deluding your own selves
Bram Moolenaar071d4272004-06-13 20:20:40 +00008" (James 1:22 RSV)
9" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bram Moolenaard4755bb2004-09-02 19:12:26 +000010" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000011
Bram Moolenaard4755bb2004-09-02 19:12:26 +000012" ---------------------------------------------------------------------
13" Prevent Reloading: {{{1
Bram Moolenaarc0197e22004-09-13 20:26:32 +000014if exists("g:loaded_netrw") || &cp
Bram Moolenaar071d4272004-06-13 20:20:40 +000015 finish
16endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +000017let g:loaded_netrw = "v51a"
Bram Moolenaar8299df92004-07-10 09:47:34 +000018let s:save_cpo = &cpo
19let loaded_explorer = 1
Bram Moolenaar071d4272004-06-13 20:20:40 +000020set cpo&vim
21
22" ---------------------------------------------------------------------
23" Default values for global netrw variables {{{1
24if !exists("g:netrw_ftpmode")
25 let g:netrw_ftpmode= "binary"
26endif
27if !exists("g:netrw_win95ftp")
28 let g:netrw_win95ftp= 1
29endif
30if !exists("g:netrw_cygwin")
Bram Moolenaard4755bb2004-09-02 19:12:26 +000031 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar071d4272004-06-13 20:20:40 +000032 let g:netrw_cygwin= 1
33 else
34 let g:netrw_cygwin= 0
35 endif
36endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000037if !exists("g:netrw_list_cmd")
38 if executable("ssh")
39 " provide a default listing command
40 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
41 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000042" call Decho("ssh is not executable, can't do remote directory exploring")
Bram Moolenaar843ee412004-06-30 16:16:41 +000043 let g:netrw_list_cmd= ""
44 endif
45endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +000046if !exists("g:netrw_ftp_list_cmd")
47 if has("unix") || exists("g:netrw_cygwin")
48 let g:netrw_ftp_list_cmd= "ls -lF"
49 else
50 let g:netrw_ftp_list_cmd= "dir"
51 endif
52endif
Bram Moolenaar843ee412004-06-30 16:16:41 +000053if !exists("g:netrw_rm_cmd")
54 let g:netrw_rm_cmd = "ssh HOSTNAME rm"
55endif
56if !exists("g:netrw_rmf_cmd")
57 let g:netrw_rmf_cmd = "ssh HOSTNAME rm -f"
58endif
59if !exists("g:netrw_rmdir_cmd")
60 let g:netrw_rmdir_cmd = "ssh HOSTNAME rmdir"
61endif
62if !exists("g:netrw_rename_cmd")
63 let g:netrw_rename_cmd= "ssh HOSTNAME mv"
64endif
65if exists("g:netrw_silent") && g:netrw_silent != 0
66 let g:netrw_silentxfer= "silent "
67else
68 let g:netrw_silentxfer= ""
69endif
70if !exists("g:netrw_winsize")
71 let g:netrw_winsize= ""
72endif
73if !exists("g:netrw_list_hide")
74 let g:netrw_list_hide= ""
75endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +000076if !exists("g:netrw_sort_by")
77 " alternatives: date size
78 let g:netrw_sort_by= "name"
79endif
80if !exists("g:netrw_sort_sequence")
81 let g:netrw_sort_sequence= '/$,*,\.bak$,\.o$,\.h$,\.info$,\.swp$,\.obj$'
82endif
83if !exists("g:netrw_sort_direction")
84 " alternative: reverse (z y x ...)
85 let g:netrw_sort_direction= "normal"
86endif
Bram Moolenaar8299df92004-07-10 09:47:34 +000087if !exists("g:netrw_longlist") || g:netrw_longlist == 0
88 let g:netrw_longlist= 0
89else
90 let g:netrw_longlist= 1
Bram Moolenaar269ec652004-07-29 08:43:53 +000091 let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa -lk"
Bram Moolenaar8299df92004-07-10 09:47:34 +000092endif
93if !exists("g:netrw_timefmt")
94 let g:netrw_timefmt= "%c"
95endif
96if !exists("g:netrw_local_rmdir")
97 let g:netrw_local_rmdir= "rmdir"
98endif
99if !exists("g:netrw_local_rename")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000100 if g:netrw_cygwin
101 let g:netrw_local_rename= "mv"
102 elseif has("win32") || has("win95") || has("win64") || has("win16")
103 let g:netrw_local_rename= "rename"
Bram Moolenaar8299df92004-07-10 09:47:34 +0000104 elseif has("unix")
105 let g:netrw_local_rename= "mv"
106 endif
107endif
108if !exists("g:netrw_local_mkdir")
109 let g:netrw_local_mkdir= "mkdir"
110endif
111if !exists("g:netrw_mkdir_cmd")
112 let g:netrw_mkdir_cmd= "ssh HOSTNAME mkdir"
113endif
Bram Moolenaar269ec652004-07-29 08:43:53 +0000114if !exists("g:netrw_hide")
115 let g:netrw_hide= 1
116endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000117if !exists("g:netrw_ftp_browse_reject")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000118 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 +0000119endif
120if !exists("g:netrw_keepdir")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000121 let g:netrw_keepdir= 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000122endif
123if !exists("s:netrw_cd_escape")
124 if has("win32") || has("win95") || has("win64") || has("win16")
125 let s:netrw_cd_escape="#% "
126 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000127 let s:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000128 endif
129endif
130if !exists("s:netrw_glob_escape")
131 if has("win32") || has("win95") || has("win64") || has("win16")
132 let s:netrw_glob_escape= ""
133 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000134 let s:netrw_glob_escape= '[]*?`{~$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000135 endif
136endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000137if !exists("g:netrw_alto")
138 let g:netrw_alto= 0
139endif
140if !exists("g:netrw_altv")
141 let g:netrw_altv= 0
142endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000143if !exists("g:netrw_maxfilenamelen")
144 let g:netrw_maxfilenamelen= 32
145endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000146
147" BufEnter event ignored by decho when following variable is true
148" Has a side effect that doau BufReadPost doesn't work, so
149" files read by network transfer aren't appropriately highlighted.
150"let g:decho_bufenter = 1 "Decho
Bram Moolenaar071d4272004-06-13 20:20:40 +0000151
152" ---------------------------------------------------------------------
153" Default values for global protocol variables {{{1
154if !exists("g:netrw_rcp_cmd")
155 let g:netrw_rcp_cmd = "rcp"
156endif
157if !exists("g:netrw_ftp_cmd")
158 let g:netrw_ftp_cmd = "ftp"
159endif
160if !exists("g:netrw_scp_cmd")
161 let g:netrw_scp_cmd = "scp -q"
162endif
163if !exists("g:netrw_sftp_cmd")
164 let g:netrw_sftp_cmd = "sftp"
165endif
166if !exists("g:netrw_http_cmd")
167 if executable("wget")
168 let g:netrw_http_cmd = "wget -q -O"
169 elseif executable("fetch")
170 let g:netrw_http_cmd = "fetch -o"
171 else
172 let g:netrw_http_cmd = ""
173 endif
174endif
175if !exists("g:netrw_dav_cmd")
176 let g:netrw_dav_cmd = "cadaver"
177endif
178if !exists("g:netrw_rsync_cmd")
179 let g:netrw_rsync_cmd = "rsync"
180endif
181if !exists("g:netrw_fetch_cmd")
182 if executable("fetch")
183 let g:netrw_fetch_cmd = "fetch -o"
184 else
185 let g:netrw_fetch_cmd = ""
186 endif
187endif
188
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000189if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000190 \ && exists("g:netrw_use_nt_rcp")
191 \ && g:netrw_use_nt_rcp
192 \ && executable( $SystemRoot .'/system32/rcp.exe')
193 let s:netrw_has_nt_rcp = 1
194 let s:netrw_rcpmode = '-b'
195 else
196 let s:netrw_has_nt_rcp = 0
197 let s:netrw_rcpmode = ''
198endif
199
200" ---------------------------------------------------------------------
201" Transparency Support: {{{1
Bram Moolenaar8299df92004-07-10 09:47:34 +0000202 " File Explorer: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000203if version >= 600
Bram Moolenaar8299df92004-07-10 09:47:34 +0000204 augroup FileExplorer
205 au!
206 au BufEnter * call <SID>LocalBrowse(expand("<afile>"))
207 augroup END
208 " Network Handler: {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000209 augroup Network
210 au!
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000211 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000212 au BufReadCmd file://* exe "silent doau BufReadPre ".expand("<afile>")|exe 'e '.substitute(expand("<afile>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<afile>")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000213 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000214 au BufReadCmd file:///* exe "silent doau BufReadPre ".expand("<afile>")|exe 'e /'.substitute(expand("<afile>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<afile>")
215 au BufReadCmd file://localhost/* exe "silent doau BufReadPre ".expand("<afile>")|exe 'e /'.substitute(expand("<afile>"),"file:/*","","")|exe "silent doau BufReadPost ".expand("<afile>")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000216 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000217 au BufReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau BufReadPre ".expand("<afile>")|exe "Nread 0r ".expand("<afile>")|exe "silent doau BufReadPost ".expand("<afile>")
218 au FileReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau BufReadPre ".expand("<afile>")|exe "Nread " .expand("<afile>")|exe "silent doau BufReadPost ".expand("<afile>")
219 au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("<afile>")|exe "Nwrite " .expand("<afile>")|exe "silent doau BufWritePost ".expand("<afile>")
220 au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("<afile>")|exe "'[,']Nwrite " .expand("<afile>")|exe "silent doau BufWritePost ".expand("<afile>")
221" au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* if exists("vcount")|call Decho("vcount=".vcount)|else|call Decho("no vcount")|endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000222 augroup END
223endif
224
225" ------------------------------------------------------------------------
226" Commands: :Nread, :Nwrite, and :NetUserPass {{{1
227com! -nargs=* Nread call <SID>NetSavePosn()<bar>call <SID>NetRead(<f-args>)<bar>call <SID>NetRestorePosn()
228com! -range=% -nargs=* Nwrite call <SID>NetSavePosn()<bar><line1>,<line2>call <SID>NetWrite(<f-args>)<bar>call <SID>NetRestorePosn()
229com! -nargs=* NetUserPass call NetUserPass(<f-args>)
230
231" ------------------------------------------------------------------------
232" NetSavePosn: saves position of cursor on screen {{{1
233fun! s:NetSavePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000234" call Dfunc("NetSavePosn()")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000235 " Save current line and column
236 let s:netrw_winnr= winnr()
237 let s:netrw_line = line(".")
238 let s:netrw_col = virtcol(".")
239
240 " Save top-of-screen line
241 norm! H0
242 let s:netrw_hline= line(".")
243
244 call s:NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000245" call Dret("NetSavePosn : winnr=".s:netrw_winnr." line=".s:netrw_line." col=".s:netrw_col." hline=".s:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000246endfun
247
248" ------------------------------------------------------------------------
249" NetRestorePosn: restores the cursor and file position as saved by NetSavePosn() {{{1
250fun! <SID>NetRestorePosn()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000251" call Dfunc("NetRestorePosn() winnr=".s:netrw_winnr." line=".s:netrw_line." col=".s:netrw_col." hline=".s:netrw_hline)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000252
253 exe "silent! ".s:netrw_winnr."wincmd w"
254 if v:shell_error == 0
255 " as suggested by Bram M: redraw on no error
256 " allows protocol error messages to remain visible
257 redraw!
258 endif
259 " restore top-of-screen line
260 exe "norm! ".s:netrw_hline."G0z\<CR>"
261 " restore position
262 exe "norm! ".s:netrw_line."G0".s:netrw_col."\<bar>"
263
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
269fun! s: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()
291
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000292" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000293 while ichoice <= a:0
294
295 " attempt to repeat with previous host-file-etc
296 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000297" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000298 let choice = b:netrw_lastfile
299 let ichoice= ichoice + 1
300
301 else
302 exe "let choice= a:" . ichoice
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000303" call Decho("no lastfile: choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000304
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000305 if match(choice,"?") == 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000306 " give help
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000307 echomsg 'NetRead Usage:'
308 echomsg ':Nread machine:path uses rcp'
309 echomsg ':Nread "machine path" uses ftp with <.netrc>'
310 echomsg ':Nread "machine id password path" uses ftp'
311 echomsg ':Nread dav://machine[:port]/path uses cadaver'
312 echomsg ':Nread fetch://machine/path uses fetch'
313 echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
314 echomsg ':Nread http://[user@]machine/path uses http wget'
315 echomsg ':Nread rcp://[user@]machine/path uses rcp'
316 echomsg ':Nread rsync://machine[:port]/path uses rsync'
317 echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
318 echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000319 break
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000320
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000321 elseif match(choice,"^\"") != -1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000322 " Reconstruct Choice if choice starts with '"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000323" call Decho("reconstructing choice")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000324 if match(choice,"\"$") != -1
325 " case "..."
326 let choice=strpart(choice,1,strlen(choice)-2)
327 else
328 " case "... ... ..."
329 let choice = strpart(choice,1,strlen(choice)-1)
330 let wholechoice = ""
331
332 while match(choice,"\"$") == -1
333 let wholechoice = wholechoice . " " . choice
334 let ichoice = ichoice + 1
335 if ichoice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000336 if !exists("g:netrw_quiet")
337 echoerr "Unbalanced string in filename '". wholechoice ."'"
338 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000339" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000340 return
341 endif
342 let choice= a:{ichoice}
343 endwhile
344 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
345 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000346 endif
347 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000348
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000349" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000350 let ichoice= ichoice + 1
351
352 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000353 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000354 let choice = substitute(choice,'\\','/','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000355" call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000356
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000357 exe 'lcd ' . fnamemodify(tmpfile,':h')
358 let tmpfile = fnamemodify(tmpfile,':t')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000359 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000360
361 " Determine method of read (ftp, rcp, etc)
362 call s:NetMethod(choice)
363
Bram Moolenaar843ee412004-06-30 16:16:41 +0000364 " Check if NetBrowse() should be handling this request
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000365" call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000366 if choice =~ "^.*/$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000367 keepjumps call s:NetBrowse(choice)
368" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000369 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000370 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000371
372 " ============
373 " Perform Read
374 " ============
375
376 ".........................................
377 " rcp: NetRead Method #1
378 if b:netrw_method == 1 " read with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000379" call Decho("read via rcp (method #1)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000380 " ER: noting done with g:netrw_uid yet?
381 " ER: on Win2K" rcp machine[.user]:file tmpfile
382 " ER: if machine contains '.' adding .user is required (use $USERNAME)
383 " ER: the tmpfile is full path: rcp sees C:\... as host C
384 if s:netrw_has_nt_rcp == 1
385 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
386 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
387 else
388 " Any way needed it machine contains a '.'
389 let uid_machine = g:netrw_machine .'.'. $USERNAME
390 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000391 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000392 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
393 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
394 else
395 let uid_machine = g:netrw_machine
396 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000397 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000398" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000399 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
400 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
401 let b:netrw_lastfile = choice
402
403 ".........................................
404 " ftp + <.netrc>: NetRead Method #2
405 elseif b:netrw_method == 2 " read with ftp + <.netrc>
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000406" call Decho("read via ftp+.netrc (method #2)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000407 let netrw_fname= b:netrw_fname
408 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000409 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000410 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000411 exe "put ='"."get ".netrw_fname." ".tmpfile."'"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000412 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000413" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000414 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
415 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000416" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000417 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
418 endif
419 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000420 if getline(1) !~ "^$" && !exists("g:netrw_quiet")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000421 let debugkeep= &debug
422 set debug=msg
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000423 echoerr getline(1)
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000424 let &debug= debugkeep
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000425 endif
426 bd!
427 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
428 let b:netrw_lastfile = choice
429
430 ".........................................
431 " ftp + machine,id,passwd,filename: NetRead Method #3
432 elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
433 " Construct execution string (four lines) which will be passed through filter
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000434" call Decho("read via ftp+mipf (method #3)")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000435 let netrw_fname= b:netrw_fname
436 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000437 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000438 if exists("g:netrw_port") && g:netrw_port != ""
439 put ='open '.g:netrw_machine.' '.g:netrw_port
440 else
441 put ='open '.g:netrw_machine
442 endif
443
444 if exists("g:netrw_ftp") && g:netrw_ftp == 1
445 put =g:netrw_uid
446 put =g:netrw_passwd
447 else
448 put ='user '.g:netrw_uid.' '.g:netrw_passwd
449 endif
450
451 if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
452 put =g:netrw_ftpmode
453 endif
454 put ='get '.netrw_fname.' '.tmpfile
455
456 " perform ftp:
457 " -i : turns off interactive prompting from ftp
458 " -n unix : DON'T use <.netrc>, even though it exists
459 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000460" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000461 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000462" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000463 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
464 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
465 if getline(1) !~ "^$"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000466" call Decho("error<".getline(1).">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000467 if !exists("g:netrw_quiet")
468 echoerr getline(1)
469 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000470 endif
471 bd!
472 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
473 let b:netrw_lastfile = choice
474
475 ".........................................
476 " scp: NetRead Method #4
477 elseif b:netrw_method == 4 " read with scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000478" call Decho("read via scp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000479 if exists("g:netrw_port") && g:netrw_port != ""
480 let useport= " -P ".g:netrw_port
481 else
482 let useport= ""
483 endif
484 if g:netrw_cygwin == 1
485 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000486" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000487 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
488 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000489" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000490 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
491 endif
492 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
493 let b:netrw_lastfile = choice
494
495 ".........................................
496 elseif b:netrw_method == 5 " read with http (wget)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000497" call Decho("read via http (method #5)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000498 if g:netrw_http_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000499 if !exists("g:netrw_quiet")
500 echoerr "neither wget nor fetch command is available"
501 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000502 exit
503 endif
504
505 if match(b:netrw_fname,"#") == -1
506 " simple wget
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000507" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000508 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
509 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
510
511 else
512 " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
513 let netrw_html= substitute(b:netrw_fname,"#.*$","","")
514 let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000515" call Decho("netrw_html<".netrw_html.">")
516" call Decho("netrw_tag <".netrw_tag.">")
517" call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000518 exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
519 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000520" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000521 exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
522 endif
523 let b:netrw_lastfile = choice
524
525 ".........................................
526 " cadaver: NetRead Method #6
527 elseif b:netrw_method == 6 " read with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000528" call Decho("read via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000529
530 " Construct execution string (four lines) which will be passed through filter
531 let netrw_fname= b:netrw_fname
532 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000533 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000534 if exists("g:netrw_port") && g:netrw_port != ""
535 put ='open '.g:netrw_machine.' '.g:netrw_port
536 else
537 put ='open '.g:netrw_machine
538 endif
539 put ='user '.g:netrw_uid.' '.g:netrw_passwd
540
541 if g:netrw_cygwin == 1
542 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
543 put ='get '.netrw_fname.' '.cygtmpfile
544 else
545 put ='get '.netrw_fname.' '.tmpfile
546 endif
547
548 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000549 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000550" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000551 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
552 bd!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000553 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000554 let b:netrw_lastfile = choice
555
556 ".........................................
557 " rsync: NetRead Method #7
558 elseif b:netrw_method == 7 " read with rsync
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000559" call Decho("read via rsync (method #7)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000560 if g:netrw_cygwin == 1
561 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000562" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000563 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
564 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000565" call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000566 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
567 endif
568 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
569 let b:netrw_lastfile = choice
570
571 ".........................................
572 " fetch: NetRead Method #8
573 " fetch://[user@]host[:http]/path
574 elseif b:netrw_method == 8 " read with fetch
575 if g:netrw_fetch_cmd == ""
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000576 if !exists("g:netrw_quiet")
577 echoerr "fetch command not available"
578 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000579 exit
580 endif
581 if exists("g:netrw_option") && g:netrw_option == ":http"
582 let netrw_option= "http"
583 else
584 let netrw_option= "ftp"
585 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000586" call Decho("read via fetch for ".netrw_option)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000587
588 if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000589" 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 +0000590 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
591 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000592" call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000593 exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
594 endif
595
596 let result = s:NetGetFile(readcmd,tmpfile, b:netrw_method)
597 let b:netrw_lastfile = choice
598
599 ".........................................
600 " sftp: NetRead Method #9
601 elseif b:netrw_method == 9 " read with sftp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000602" call Decho("read via sftp (method #4)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000603 if g:netrw_cygwin == 1
604 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000605" call Decho("!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
606" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000607 exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
608 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000609" call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000610 exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
611 endif
612 let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
613 let b:netrw_lastfile = choice
614
615 ".........................................
616 else " Complain
617 echo "***warning*** unable to comply with your request<" . choice . ">"
618 endif
619 endwhile
620
621 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000622" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000623 if exists("b:netrw_method")
624 unlet b:netrw_method
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000625 unlet b:netrw_fname
626 endif
627 call s:NetOptionRestore()
Bram Moolenaar8299df92004-07-10 09:47:34 +0000628
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000629" call Dret("NetRead")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000630endfun
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000631
632" ------------------------------------------------------------------------
633" NetGetFile: Function to read file "fname" with command "readcmd". {{{1
634fun! s:NetGetFile(readcmd, fname, method)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000635" call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000636
637 if exists("*NetReadFixup")
638 " for the use of NetReadFixup (not otherwise used internally)
639 let line2= line("$")
640 endif
641
642 " transform paths from / to \ for Windows, unless the shell is bash
643 if &term == "win32"
644 if &shell == "bash"
645 let fname=a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000646" call Decho("(win32 && bash) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000647 else
648 let fname=substitute(a:fname,'/','\\\\','ge')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000649" call Decho("(win32 && !bash) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000650 endif
651 else
652 let fname= a:fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000653" call Decho("(copied) fname<".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000654 endif
655
656 " get the file, but disable undo when reading a new buffer
657 if a:readcmd[0] == '0'
658 let use_e_cmd = 0 " 1 when using ':edit'
659 let delline = 0 " 1 when have to delete empty last line
660 if line("$") == 1 && getline(1) == ""
661 " Now being asked to 0r a file into an empty file.
662 " Safe to :e it instead, unless there is another window on the same buffer.
663 let curbufnr = bufnr("%")
664 let use_e_cmd = 1
665 let delline = 1
666 " Loop over all windows,
667 " reset use_e_cmd when another one is editing the current buffer.
668 let i = 1
669 while 1
670 if i != winnr() && winbufnr(i) == curbufnr
671 let use_e_cmd = 0
672 break
673 endif
674 let i = i + 1
675 if winbufnr(i) < 0
676 break
677 endif
678 endwhile
679 endif
680
681 if use_e_cmd > 0
682 " ':edit' the temp file, wipe out the old buffer and rename the buffer
683 let curfilename = expand("%")
684
685 let binlocal = &l:bin
686 let binglobal = &g:bin
687 if binlocal
688 setglobal bin " Need to set 'bin' globally for ":e" command.
689 endif
690 silent exe "e! ".v:cmdarg." ".fname
691 if binlocal && !binglobal
692 setglobal nobin
693 setlocal bin
694 endif
695
696 exe curbufnr . "bwipe!"
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000697 exe "f ".escape(curfilename," ")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000698 " the ":f newname" apparently leaves the temporary file as the alternate
699 " file in the buffer list (see :ls!). The following command wipes it out.
700 exe bufnr("#")."bwipe!"
701 else
702 let oldul= &ul
Bram Moolenaar8299df92004-07-10 09:47:34 +0000703 setlocal ul=-1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000704 exe a:readcmd." ".v:cmdarg." ".escape(fname," ")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000705 if delline > 0
706 " wipe out last line, which should be a blank line anyway
707 $del
708 endif
709 let &ul= oldul
710 endif
711 elseif filereadable(fname)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000712" call Decho("exe<".a:readcmd." ".v:cmdarg." ".fname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000713 exe a:readcmd." ".v:cmdarg." ".fname
714 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000715" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000716 return
717 endif
718
719 " User-provided (ie. optional) fix-it-up command
720 if exists("*NetReadFixup")
721 let line1= line(".")
722 if a:readcmd == "r"
723 let line2= line("$") - line2 + line1
724 else
725 let line2= line("$") - line2
726 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000727" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000728 call NetReadFixup(a:method, line1, line2)
729 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +0000730
731 " update the Buffers menu
732 if has("gui") && has("gui_running")
733 silent! emenu Buffers.Refresh\ menu
734 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000735
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000736" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000737
738 " insure that we have the right filetype and that its being displayed
739 filetype detect
740 redraw!
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000741" call Dret("NetGetFile")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000742endfun
743
744" ------------------------------------------------------------------------
745" NetWrite: responsible for writing a file over the net {{{1
746fun! s:NetWrite(...) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000747" call Dfunc("NetWrite(a:0=".a:0.")")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000748
749 " option handling
750 let mod= 0
751 call s:NetOptionSave()
752
753 " Get Temporary Filename
754 let tmpfile= tempname()
755
756 if a:0 == 0
757 let ichoice = 0
758 else
759 let ichoice = 1
760 endif
761
762 " write (selected portion of) file to temporary
763 silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile
764
765 while ichoice <= a:0
766
767 " attempt to repeat with previous host-file-etc
768 if exists("b:netrw_lastfile") && a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000769" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000770 let choice = b:netrw_lastfile
771 let ichoice= ichoice + 1
772 else
773 exe "let choice= a:" . ichoice
774
775 " Reconstruct Choice if choice starts with '"'
776 if match(choice,"?") == 0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000777 echomsg 'NetWrite Usage:"'
778 echomsg ':Nwrite machine:path uses rcp'
779 echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
780 echomsg ':Nwrite "machine id password path" uses ftp'
781 echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
782 echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
783 echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
784 echomsg ':Nwrite rcp://machine/path uses rcp'
785 echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
786 echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
787 echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000788 break
789
790 elseif match(choice,"^\"") != -1
791 if match(choice,"\"$") != -1
792 " case "..."
793 let choice=strpart(choice,1,strlen(choice)-2)
794 else
795 " case "... ... ..."
796 let choice = strpart(choice,1,strlen(choice)-1)
797 let wholechoice = ""
798
799 while match(choice,"\"$") == -1
800 let wholechoice= wholechoice . " " . choice
801 let ichoice = ichoice + 1
802 if choice > a:0
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000803 if !exists("g:netrw_quiet")
804 echoerr "Unbalanced string in filename '". wholechoice ."'"
805 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000806" call Dret("NetWrite")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000807 return
808 endif
809 let choice= a:{ichoice}
810 endwhile
811 let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
812 endif
813 endif
814 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000815" call Decho("choice<" . choice . ">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000816 let ichoice= ichoice + 1
817
818 " fix up windows urls
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000819 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000820 let choice= substitute(choice,'\\','/','ge')
821 "ER: see NetRead()
822 exe 'lcd ' . fnamemodify(tmpfile,':h')
823 let tmpfile = fnamemodify(tmpfile,':t')
824 endif
825
826 " Determine method of read (ftp, rcp, etc)
827 call s:NetMethod(choice)
828
829 " =============
830 " Perform Write
831 " =============
832
833 ".........................................
834 " rcp: NetWrite Method #1
835 if b:netrw_method == 1 " write with rcp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000836" Decho "write via rcp (method #1)"
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000837 if s:netrw_has_nt_rcp == 1
838 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
839 let uid_machine = g:netrw_machine .'.'. g:netrw_uid
840 else
841 let uid_machine = g:netrw_machine .'.'. $USERNAME
842 endif
843 else
844 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
845 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
846 else
847 let uid_machine = g:netrw_machine
848 endif
849 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000850" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000851 exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
852 let b:netrw_lastfile = choice
853
854 ".........................................
855 " ftp + <.netrc>: NetWrite Method #2
856 elseif b:netrw_method == 2 " write with ftp + <.netrc>
857 let netrw_fname = b:netrw_fname
858 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000859 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000860 exe "put ='".g:netrw_ftpmode."'"
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000861" call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000862 exe "put ='"."put ".tmpfile." ".netrw_fname."'"
863" call Decho("put ='"."put ".tmpfile." ".netrw_fname."'")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000864 if exists("g:netrw_port") && g:netrw_port != ""
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000865" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000866 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
Bram Moolenaar071d4272004-06-13 20:20:40 +0000867 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000868" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +0000869 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000870 endif
871 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
872 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000873 if !exists("g:netrw_quiet")
874 echoerr getline(1)
875 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000876 let mod=1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000877 endif
878 bd!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000879 let b:netrw_lastfile = choice
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000880
881 ".........................................
882 " ftp + machine, id, passwd, filename: NetWrite Method #3
883 elseif b:netrw_method == 3 " write with ftp + machine, id, passwd, and fname
884 let netrw_fname= b:netrw_fname
885 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000886 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000887 if exists("g:netrw_port") && g:netrw_port != ""
888 put ='open '.g:netrw_machine.' '.g:netrw_port
889 else
890 put ='open '.g:netrw_machine
891 endif
892 if exists("g:netrw_ftp") && g:netrw_ftp == 1
893 put =g:netrw_uid
894 put =g:netrw_passwd
895 else
896 put ='user '.g:netrw_uid.' '.g:netrw_passwd
897 endif
898 put ='put '.tmpfile.' '.netrw_fname
899 " save choice/id/password for future use
900 let b:netrw_lastfile = choice
901
902 " perform ftp:
903 " -i : turns off interactive prompting from ftp
904 " -n unix : DON'T use <.netrc>, even though it exists
905 " -n win32: quit being obnoxious about password
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000906" call Decho('performing ftp -i -n')
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000907 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000908" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000909 exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
910 " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
911 if getline(1) !~ "^$"
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000912 if !exists("g:netrw_quiet")
913 echoerr getline(1)
914 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000915 let mod=1
916 endif
917 bd!
918
919 ".........................................
920 " scp: NetWrite Method #4
921 elseif b:netrw_method == 4 " write with scp
922 if exists("g:netrw_port") && g:netrw_port != ""
923 let useport= " -P ".g:netrw_port
924 else
925 let useport= ""
926 endif
927 if g:netrw_cygwin == 1
928 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000929" call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000930 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
931 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000932" call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000933 exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
934 endif
935 let b:netrw_lastfile = choice
936
937 ".........................................
938 " http: NetWrite Method #5
939 elseif b:netrw_method == 5
Bram Moolenaarc0197e22004-09-13 20:26:32 +0000940 if !exists("g:netrw_quiet")
941 echoerr "***warning*** currently <netrw.vim> does not support writing using http:"
942 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000943
944 ".........................................
945 " dav: NetWrite Method #6
946 elseif b:netrw_method == 6 " write with cadaver
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000947" call Decho("write via cadaver (method #6)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000948
949 " Construct execution string (four lines) which will be passed through filter
950 let netrw_fname= b:netrw_fname
951 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000952 setlocal ff=unix
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000953 if exists("g:netrw_port") && g:netrw_port != ""
954 put ='open '.g:netrw_machine.' '.g:netrw_port
955 else
956 put ='open '.g:netrw_machine
957 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000958 put ='user '.g:netrw_uid.' '.g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000959
960 if g:netrw_cygwin == 1
961 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
962 put ='put '.cygtmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000963 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000964 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000965 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000966
967 " perform cadaver operation:
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000968 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000969" call Decho("executing: %!".g:netrw_dav_cmd)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000970 exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
971 bd!
972 let b:netrw_lastfile = choice
973
974 ".........................................
975 " rsync: NetWrite Method #7
976 elseif b:netrw_method == 7 " write with rsync
977 if g:netrw_cygwin == 1
978 let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000979" call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000980 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000981 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000982" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000983 exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000984 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000985 let b:netrw_lastfile = choice
986
987 ".........................................
988 " scp: NetWrite Method #9
989 elseif b:netrw_method == 9 " write with sftp
990 let netrw_fname= b:netrw_fname
Bram Moolenaar071d4272004-06-13 20:20:40 +0000991 if exists("g:netrw_uid") && ( g:netrw_uid != "" )
992 let uid_machine = g:netrw_uid .'@'. g:netrw_machine
993 else
994 let uid_machine = g:netrw_machine
995 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +0000996 new
Bram Moolenaar8299df92004-07-10 09:47:34 +0000997 setlocal ff=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +0000998 put ='put '.tmpfile.' '.netrw_fname
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000999 norm! 1Gdd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001000" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001001 exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
1002 bd!
1003 let b:netrw_lastfile= choice
1004
1005 ".........................................
1006 else " Complain
1007 echo "***warning*** unable to comply with your request<" . choice . ">"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001008 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001009 endwhile
1010
1011 " cleanup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001012" call Decho("cleanup")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001013 let result=delete(tmpfile)
1014 call s:NetOptionRestore()
1015
1016 if a:firstline == 1 && a:lastline == line("$")
1017 let &mod= mod " usually equivalent to set nomod
Bram Moolenaar071d4272004-06-13 20:20:40 +00001018 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001019
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001020" call Dret("NetWrite")
Bram Moolenaar071d4272004-06-13 20:20:40 +00001021endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00001022
1023" ------------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001024" Browsing Support For Remote Directories And Files: {{{1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001025" NetBrowse: This function uses the command in g:netrw_list_cmd to get a list {{{2
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001026" of the contents of a remote directory. It is assumed that the
1027" g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
1028" with the requested remote hostname first.
Bram Moolenaar843ee412004-06-30 16:16:41 +00001029fun! <SID>NetBrowse(dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001030" call Dfunc("NetBrowse(dirname<".a:dirname.">) longlist=".g:netrw_longlist)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001031
1032 " sanity check
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001033 if exists("b:netrw_method") && b:netrw_method =~ '[235]'
1034" call Decho("b:netrw_method=".b:netrw_method)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001035 if !executable("ftp")
1036 if !exists("g:netrw_quiet")
1037 echoerr "***netrw*** this system doesn't support remote directory listing via ftp"
1038 endif
1039" call Dret("NetBrowse")
1040 return
1041 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001042 elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001043 if !exists("g:netrw_quiet")
1044 echoerr "***netrw*** this system doesn't support remote directory listing via ssh"
1045 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001046" call Dret("NetBrowse")
1047 return
Bram Moolenaar843ee412004-06-30 16:16:41 +00001048 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001049
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001050 " make this buffer modifiable
1051 setlocal ma
1052
1053 " analyze a:dirname and g:netrw_list_cmd
1054 let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001055" call Decho("dirpat<".dirpat.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001056 if a:dirname !~ dirpat
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001057 if !exists("g:netrw_quiet")
1058 echoerr "NetBrowse: I don't understand your dirname<".a:dirname.">"
1059 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001060" call Dret("NetBrowse : badly formatted dirname<".a:dirname.">")
1061 return
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001062 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001063
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001064 let method = substitute(a:dirname,dirpat,'\1','')
1065 let user = substitute(a:dirname,dirpat,'\2','')
1066 let machine = substitute(a:dirname,dirpat,'\3','')
1067 let path = substitute(a:dirname,dirpat,'\4','')
1068 let fname = substitute(a:dirname,'^.*/\ze.','','')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001069" call Decho("set up method <".method .">")
1070" call Decho("set up user <".user .">")
1071" call Decho("set up machine<".machine.">")
1072" call Decho("set up path <".path .">")
1073" call Decho("set up fname <".fname .">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001074
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001075 if method == "ftp" || method == "http"
1076 let method = "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001077 let listcmd = g:netrw_ftp_list_cmd
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001078 else
1079 let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',user.machine,'')
1080 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001081
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001082 if exists("b:netrw_method")
1083" call Decho("setting s:netrw_method<".b:netrw_method.">")
1084 let s:netrw_method= b:netrw_method
1085 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001086
Bram Moolenaar8299df92004-07-10 09:47:34 +00001087 " optionally sort by time (-t) or by size (-S)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001088 if listcmd == "dir" && g:netrw_sort_by =~ "^[ts]"
1089 echoerr "***warning*** windows' ftp doesn't support time/size sorts (get cygwin, set g:netrw_cygwin)"
1090 else
1091 if g:netrw_sort_by =~ "^t"
1092 let listcmd= listcmd."t"
1093 elseif g:netrw_sort_by =~ "^s"
1094 let listcmd= listcmd."S"
1095 endif
1096 " optionally sort in reverse
1097 if g:netrw_sort_direction =~ "^r" && listcmd == "dir"
1098 let listcmd= listcmd."r"
1099 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001100 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001101
1102" call Decho("set up listcmd<".listcmd.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001103 if fname =~ '@$' && fname !~ '^"'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001104" call Decho("attempt transfer of symlink as file")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001105 call s:NetBrowse(substitute(a:dirname,'@$','','e'))
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001106 redraw!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001107" call Dret("NetBrowse : symlink")
1108 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001109
1110 elseif fname !~ '/$' && fname !~ '^"'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001111 " looks like a regular file, attempt transfer
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001112" call Decho("attempt transfer as regular file<".a:dirname.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001113
1114 " remove any filetype indicator from end of dirname, except for the
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001115 " "this is a directory" indicator (/). There shouldn't be one of those,
1116 " anyway.
1117 let path= substitute(path,'[*=@|]$','','e')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001118" call Decho("new path<".path.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001119
1120 " remote-read the requested file into current buffer
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001121 enew!
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001122" call Decho("exe file .method."://".user.machine."/".escape(path,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001123 exe "file ".method."://".user.machine."/".escape(path,s:netrw_cd_escape)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001124 exe "silent doau BufReadPre ".fname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001125 silent call s:NetRead(method."://".user.machine."/".path)
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001126 exe "silent doau BufReadPost ".fname
Bram Moolenaar8299df92004-07-10 09:47:34 +00001127 keepjumps 1d
1128 setlocal nomod
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001129
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001130" call Dret("NetBrowse : file<".fname.">")
1131 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001132 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001133
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001134 " ---------------------------------------------------------------------
1135 " Perform Directory Listing:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001136" call Decho("Perform directory listing...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001137 " set up new buffer and map
1138 let bufname = method.'://'.user.machine.'/'.path
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001139 let bufnamenr = bufnr(bufname.'$')
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001140" call Decho("bufname<".bufname."> bufnamenr=".bufnamenr)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001141 if bufnamenr != -1
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001142 " buffer already exists, switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001143" call Decho("buffer already exists, switching to it")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001144 exe "b ".bufnamenr
1145 if line("$") >= 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001146" call Dret("NetBrowse")
1147 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001148 endif
1149 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001150" call Decho("generate a new buffer")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001151 enew!
1152 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001153
1154 " rename file to reflect where its from
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001155 setlocal bt=nofile bh=wipe nobl noswf
1156 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001157" call Decho("exe file ".escape(bufname,s:netrw_cd_escape))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001158 exe 'file '.escape(bufname,s:netrw_cd_escape)
Bram Moolenaar269ec652004-07-29 08:43:53 +00001159" call Decho("renaming file to bufname<".bufname.">")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001160 setlocal bh=hide nobl
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001161
1162 " set up buffer-local mappings
1163" call Decho("set up buffer-local mappings")
1164 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001165 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
1166 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001167 nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001168 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,expand("%"))<cr>
1169 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,expand("%"))<cr>
1170 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(0)<cr>
1171 nnoremap <buffer> <silent> i :call <SID>NetLongList(0)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001172 nnoremap <buffer> <silent> o :exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001173 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,expand("%"))<cr>
1174 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>
1175 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>
1176 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001177 nnoremap <buffer> <silent> v :exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001178 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()),1)<cr>
1179 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),<SID>NetGetWord()))<cr>
Bram Moolenaar843ee412004-06-30 16:16:41 +00001180 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1181 exe 'vnoremap <buffer> <silent> <del> :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001182 exe 'nnoremap <buffer> <silent> d :call <SID>NetMakeDir("'.user.machine.'")<cr>'
Bram Moolenaar843ee412004-06-30 16:16:41 +00001183 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1184 exe 'vnoremap <buffer> <silent> D :call <SID>NetBrowseRm("'.user.machine.'","'.path.'")<cr>'
1185 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001186 exe 'vnoremap <buffer> <silent> R :call <SID>NetBrowseRename("'.user.machine.'","'.path.'")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00001187 nnoremap <buffer> ? :he netrw-browse-cmds<cr>
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001188 setlocal ma
1189
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001190 " Set up the banner
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001191" call Decho("set up the banner: sortby<".g:netrw_sort_by."> method<".method.">")
1192 keepjumps put ='\" ==========================================================================='
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001193 keepjumps put ='\" Netrw Remote Directory Listing'
1194 keepjumps put ='\" '.bufname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001195 let s:netrw_bannercnt= 7
1196 let sortby= g:netrw_sort_by
1197 if g:netrw_sort_direction =~ "^r"
1198 let sortby= sortby." reversed"
1199 endif
1200
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001201 if g:netrw_sort_by =~ "^n"
1202 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001203 let s:netrw_bannercnt= s:netrw_bannercnt + 1
1204 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001205 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
1206 else
1207 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001208 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001209 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001210 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001211 if g:netrw_hide == 1
1212 keepjumps put ='\" Hiding: '.g:netrw_list_hide
1213 else
1214 keepjumps put ='\" Showing: '.g:netrw_list_hide
1215 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001216 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar843ee412004-06-30 16:16:41 +00001217 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001218 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
1219 keepjumps put ='\" ==========================================================================='
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001220
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001221 " remote read the requested directory listing
1222 " Use ftp if that was the file-transfer method selected, otherwise use ssh
1223 " Note that not all ftp servers honor the options for ls
1224 if method == "ftp"
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001225 " use ftp to get remote file listing
1226" call Decho("use ftp to get remote file listing")
1227 call NetBrowseFtpCmd(path,listcmd)
1228
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001229 keepjumps 1d
1230
1231 if !g:netrw_longlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001232 " shorten the listing
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001233" call Decho("generate short listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001234 exe "keepjumps ".s:netrw_bannercnt
1235 " cleanup
1236 while getline(".") =~ g:netrw_ftp_browse_reject
1237 keepjumps d
1238 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001239
1240 " if there's no ../ listed, then put ./ and ../ in
1241 let line1= line(".")
1242 keepjumps 1
1243 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1244 let line2= line(".")
1245 if line2 == 0
1246 keepjumps put='../'
1247 keepjumps put='./'
1248 endif
1249 exe "keepjumps ".line1
1250 keepjumps norm! 0
1251
1252 " more cleanup
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001253 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
1254 exe "keepjumps silent ".s:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#'
1255 exe "keepjumps silent ".s:netrw_bannercnt.',$g/ -> /s# -> .*$#/#'
1256 endif
1257
1258 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001259 " use ssh to get remote file listing
1260" call Decho("use ssh to get remote file listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001261 let shq= &shq? &shq : ( &sxq? &sxq : "'")
1262" call Decho("exe silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq)
1263 exe "silent r! ".listcmd." ".shq.escape(path,s:netrw_cd_escape).shq
1264 keepjumps 1d
1265 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001266
1267 " manipulate the directory listing (hide, sort)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001268 setlocal ft=netrwlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001269 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00001270 if g:netrw_hide && g:netrw_list_hide != ""
1271 call s:NetrwListHide()
Bram Moolenaar843ee412004-06-30 16:16:41 +00001272 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001273
Bram Moolenaar8299df92004-07-10 09:47:34 +00001274 if g:netrw_longlist
1275 " do a long listing; these substitutions need to be done prior to sorting
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001276" call Decho("manipulate long listing")
1277
1278 if method == "ftp"
1279 " cleanup
1280 exe "keepjumps ".s:netrw_bannercnt
1281 while getline(".") =~ '^total\s\+\d\+$' || getline(".") =~ 'Trying\s\+\d\+.*$'
1282 keepjumps d
1283 endwhile
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001284 " if there's no ../ listed, then put ./ and ../ in
1285 let line1= line(".")
1286 keepjumps 1
1287 silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
1288 let line2= line(".")
1289 if line2 == 0
1290 exe 'keepjumps '.s:netrw_bannercnt."put='./'"
1291 exe 'keepjumps '.s:netrw_bannercnt."put='../'"
1292 endif
1293 exe "keepjumps ".line1
1294 keepjumps norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001295 endif
1296
1297 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/ -> .*$//e'
1298 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
1299 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00001300 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001301
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001302 if g:netrw_sort_by =~ "^n"
1303 call s:SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001304 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
1305 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001306 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00001307 if g:netrw_longlist
1308 " shorten the list to keep its width <= 80 characters
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001309 exe "keepjumps silent ".s:netrw_bannercnt.',$s/\t[-dstrwx]\+/\t/e'
Bram Moolenaar269ec652004-07-29 08:43:53 +00001310 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001311 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001312 exe "keepjumps ".s:netrw_bannercnt
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001313 setlocal nomod
1314 setlocal noma
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001315
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001316" call Dret("NetBrowse")
1317 return
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001318endfun
1319
1320" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001321" NetBrowseChgDir: {{{2
1322fun! <SID>NetBrowseChgDir(dirname,newdir)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001323" call Dfunc("NetBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001324
1325 let dirname= a:dirname
Bram Moolenaar843ee412004-06-30 16:16:41 +00001326 let newdir = a:newdir
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001327
1328 if newdir !~ '/$'
1329 " handling a file
1330 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001331" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001332
1333 elseif newdir == './'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001334 " refresh the directory list
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001335" call Decho("refresh directory listing")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001336 setlocal ma
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001337 %d
1338
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001339 elseif newdir == '../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001340 " go up one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001341 let trailer= substitute(a:dirname,'^\(\w\+://\%(\w\+@\)\=\w\+/\)\(.*\)$','\2','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001342
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001343 if trailer =~ '^\%(\.\./\)*$'
1344 " tack on a ../"
1345 let dirname= dirname.'../'
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001346
1347 else
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001348 " strip off a directory name from dirname
1349 let dirname= substitute(dirname,'^\(.*/\)[^/]\+/','\1','')
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001350 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001351" call Decho("go up one dir: dirname<".dirname."> trailer<".trailer.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001352
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001353 else
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001354 " go down one directory
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001355 let dirname= dirname.newdir
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001356" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001357 endif
1358
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001359" call Dret("NetBrowseChgDir <".dirname.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00001360 return dirname
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001361endfun
1362
Bram Moolenaar843ee412004-06-30 16:16:41 +00001363" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001364" NetGetWord: it gets the directory named under the cursor
1365fun! <SID>NetGetWord()
1366" call Dfunc("NetGetWord() line#".line("."))
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001367 if line(".") < s:netrw_bannercnt
1368 let dirname= "./"
1369 else
1370 let dirname= getline(".")
1371 if dirname =~ '\t'
1372 let dirname= substitute(dirname,'\t.*$','','e')
1373 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001374 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001375" call Dret("NetGetWord <".dirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001376 return dirname
1377endfun
1378
1379" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001380" NetBrowseRm: remove/delete a remote file or directory {{{2
Bram Moolenaar843ee412004-06-30 16:16:41 +00001381fun! <SID>NetBrowseRm(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001382" call Dfunc("NetBrowseRm(usrhost<".a:usrhost."> path<".a:path.">)")
1383" call Decho("firstline=".a:firstline." lastline=".a:lastline)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001384
1385 " preparation for removing multiple files/directories
1386 let ctr= a:firstline
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001387 let all= 0
Bram Moolenaar843ee412004-06-30 16:16:41 +00001388
1389 " remove multiple files and directories
1390 while ctr <= a:lastline
1391 exe ctr
1392
1393 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001394 let rmfile= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001395" call Decho("rmfile<".rmfile.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001396
1397 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '/$')
1398 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001399 if !all
1400 echohl Statement
1401 call inputsave()
1402 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1403 call inputrestore()
1404 echohl NONE
1405 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1406 if ok =~ 'a\%[ll]'
1407 let all= 1
1408 endif
1409 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001410
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001411 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001412 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1413 silent! keepjumps .,$d
1414 call NetBrowseFtpCmd(a:path,"delete ".rmfile)
1415 else
1416 let netrw_rm_cmd= substitute(g:netrw_rm_cmd,'HOSTNAME',a:usrhost,'').' "'.escape(a:path.rmfile,s:netrw_cd_escape).'"'
1417" call Decho("attempt to remove file: system(".netrw_rm_cmd.")")
1418 let ret= system(netrw_rm_cmd)
1419" call Decho("returned=".ret." errcode=".v:shell_error)
1420 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001421 elseif ok =~ 'q\%[uit]'
1422 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001423 endif
1424
1425 else
1426 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001427 if !all
1428 call inputsave()
1429 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
1430 call inputrestore()
1431 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
1432 if ok =~ 'a\%[ll]'
1433 let all= 1
1434 endif
1435 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001436
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001437 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001438 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1439 call NetBrowseFtpCmd(a:path,"rmdir ".rmfile)
1440 else
1441 let rmfile = a:path.rmfile
1442 let netrw_rmdir_cmd= substitute(g:netrw_rmdir_cmd,'HOSTNAME',a:usrhost,'').' '."'".'"'.rmfile.'"'."'"
1443" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
1444 let ret= system(netrw_rmdir_cmd)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001445" call Decho("returned=".ret." errcode=".v:shell_error)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001446
1447 if v:shell_error != 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001448 let netrw_rmf_cmd= substitute(g:netrw_rmf_cmd,'HOSTNAME',a:usrhost,'').' '.substitute(rmfile,'/$','','e')
1449" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
1450 let ret= system(netrw_rmf_cmd)
1451" call Decho("returned=".ret." errcode=".v:shell_error)
1452
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001453 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001454 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
1455 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001456 endif
1457 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001458
1459 elseif ok =~ 'q\%[uit]'
1460 break
Bram Moolenaar843ee412004-06-30 16:16:41 +00001461 endif
1462 endif
1463
1464 let ctr= ctr + 1
1465 endwhile
1466
1467 " refresh the directory
1468 let curline= line(".")-1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001469" call Decho("refresh the directory")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001470 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
1471 exe curline
1472
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001473" call Dret("NetBrowseRm")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001474endfun
1475
1476" ---------------------------------------------------------------------
1477" NetBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00001478fun! <SID>NetBrowseRename(usrhost,path) range
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001479" call Dfunc("NetBrowseRename(usrhost<".a:usrhost."> path<".a:path.">)")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001480
1481 " preparation for removing multiple files/directories
1482 let ctr = a:firstline
1483 let rename_cmd = substitute(g:netrw_rename_cmd,'\<HOSTNAME\>',a:usrhost,'')
1484
1485 " attempt to rename files/directories
1486 while ctr <= a:lastline
Bram Moolenaar8299df92004-07-10 09:47:34 +00001487 exe "keepjumps ".ctr
Bram Moolenaar843ee412004-06-30 16:16:41 +00001488
1489 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001490 let oldname= s:NetGetWord()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001491" call Decho("oldname<".oldname.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001492
1493 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001494 let newname= input("Moving ".oldname." to : ",oldname)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001495 call inputrestore()
1496
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001497 if exists("s:netrw_method") && (s:netrw_method == 2 || s:netrw_method == 3)
1498 call NetBrowseFtpCmd(a:path,"rename ".oldname." ".newname)
1499 else
1500 let oldname= a:path.oldname
1501 let newname= a:path.newname
1502" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,s:netrw_cd_escape).'"')
1503 let ret= system(rename_cmd.' "'.escape(oldname,s:netrw_cd_escape).'" "'.escape(newname,s:netrw_cd_escape).'"')
1504 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001505
1506 let ctr= ctr + 1
1507 endwhile
1508
1509 " refresh the directory
1510 let curline= line(".")
1511 call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001512 exe "keepjumps ".curline
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001513" call Dret("NetBrowseRename")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001514endfun
1515
1516" ---------------------------------------------------------------------
1517" NetBrowseX: allows users to write custom functions to operate on {{{2
Bram Moolenaar8299df92004-07-10 09:47:34 +00001518" files given their extension. Passes 0=local, 1=remote
1519fun! <SID>NetBrowseX(fname,remote)
1520" call Dfunc("NetBrowseX(".a:fname." remote=".a:remote.")")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001521
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001522 " set up the filename
1523 " (lower case the extension, make a local copy of a remote file)
Bram Moolenaar843ee412004-06-30 16:16:41 +00001524 let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001525 if has("win32") || has("win95") || has("win64") || has("win16")
1526 let exten= substitute(exten,'^.*$','\L&\E','')
1527 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001528 let fname= escape(a:fname,"%#")
1529" call Decho("fname<".fname."> after escape()")
1530
1531 if a:remote == 1
1532 " create a local copy
1533 let fname= tempname().".".exten
1534" call Decho("create a local copy of <".a:fname."> as <".fname.">")
1535 exe "keepjumps silent bot 1new ".a:fname
1536 let eikeep= &ei
1537 set ei=all bh=delete
1538 exe "w! ".fname
1539 let &ei= eikeep
1540 q
1541 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001542" call Decho("exten<".exten."> "."NetrwFileHandler_".exten."():exists=".exists("*NetrwFileHandler_".exten))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001543
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001544 " set up redirection
1545 if &srr =~ "%s"
1546 let redir= substitute(&srr,"%s","/dev/null"."")
1547 else
1548 let redir= &srr . "/dev/null"
1549 endif
1550" call Decho("redir:".redir.":")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001551
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001552 " execute the file handler
1553 if has("win32") || has("win64")
1554" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"')
1555 exe 'silent !start rundll32 url.dll,FileProtocolHandler "'.escape(fname, '%#').'"'
1556 let ret= v:shell_error
1557
1558 elseif has("unix") && executable("kfmclient")
1559" call Decho("exe silent !kfmclient exec '".escape(fname,'%#')."' ".redir)
1560 exe "silent !kfmclient exec '".escape(fname,'%#')."' ".redir
1561 let ret= v:shell_error
1562
1563 elseif has("unix") && executable("gnome-open")
1564" call Decho("exe silent !gnome-open '".escape(fname,'%#')."' ".redir)
1565 exe "silent !gnome-open '".escape(fname,'%#')."'".redir
1566 let ret= v:shell_error
1567
1568 elseif exten != "" && exists("*NetrwFileHandler_".exten)
1569" call Decho("let ret= NetrwFileHandler_".exten.'("'.fname.'")')
Bram Moolenaar8299df92004-07-10 09:47:34 +00001570 exe "let ret= NetrwFileHandler_".exten.'("'.fname.'")'
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001571 endif
1572 redraw!
Bram Moolenaar8299df92004-07-10 09:47:34 +00001573
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001574 " cleanup: remove temporary file,
1575 " delete current buffer if success with handler,
1576 " return to prior buffer (directory listing)
1577 if a:remote == 1 && fname != a:fname
1578" call Decho("deleting temporary file<".fname.">")
1579 call delete(fname)
1580 endif
1581
1582 if a:remote == 1
1583 let eikeep= &ei
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001584 set ei=all bh=delete bt=nofile noswf
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001585 exe "norm! \<c-o>"
1586 let &ei= eikeep
1587 redraw!
Bram Moolenaar843ee412004-06-30 16:16:41 +00001588 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001589
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001590" call Dret("NetBrowseX")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001591endfun
1592
1593" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001594" NetBrowseFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
1595" This function assumes that a long listing will be received. Size, time,
1596" and reverse sorts will be requested of the server but not otherwise
1597" enforced here.
1598fun! NetBrowseFtpCmd(path,cmd)
1599" call Dfunc("NetBrowseFtpCmd(path<".a:path."> cmd<".a:cmd.">) netrw_method=".s:netrw_method)
1600
1601 " because WinXX ftp uses unix style input
1602 " curline is one more than the bannercnt in order to account
1603 " for the unwanted first blank line (doing a :put to an empty
1604 " buffer yields a blank first line)
1605 let ffkeep= &ff
1606 setlocal ma
1607 setlocal ff=unix
1608 let curline= s:netrw_bannercnt+1
1609 exe "silent! keepjumps ".curline.",$d"
1610
1611 ".........................................
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001612 if s:netrw_method == 2 || s:netrw_method == 5
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001613 " ftp + <.netrc>: Method #2
1614 if a:path != ""
1615 put ='cd '.a:path
1616 endif
1617 exe "put ='".a:cmd."'"
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001618" redraw!|call inputsave()|call input("Pausing...")|call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001619 if exists("g:netrw_port") && g:netrw_port != ""
1620" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1621 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1622 else
1623" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1624 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1625 endif
1626
1627 ".........................................
1628 elseif s:netrw_method == 3
1629 " ftp + machine,id,passwd,filename: Method #3
1630 setlocal ff=unix
1631 if exists("g:netrw_port") && g:netrw_port != ""
1632 put ='open '.g:netrw_machine.' '.g:netrw_port
1633 else
1634 put ='open '.g:netrw_machine
1635 endif
1636
1637 if exists("g:netrw_ftp") && g:netrw_ftp == 1
1638 put =g:netrw_uid
1639 put =g:netrw_passwd
1640 else
1641 put ='user '.g:netrw_uid.' '.g:netrw_passwd
1642 endif
1643
1644 if a:path != ""
1645 put ='cd '.a:path
1646 endif
1647 exe "put ='".a:cmd."'"
1648
1649 " perform ftp:
1650 " -i : turns off interactive prompting from ftp
1651 " -n unix : DON'T use <.netrc>, even though it exists
1652 " -n win32: quit being obnoxious about password
1653" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
1654 exe g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n"
1655
1656 ".........................................
1657 else
1658 echo "***warning*** unable to comply with your request<" . choice . ">"
1659 endif
1660
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001661 " cleanup for Windows
1662 if has("win32") || has("win95") || has("win64") || has("win16")
1663 keepjumps silent! %s/\r$//
1664 endif
1665 if a:cmd == "dir"
1666 " infer directory/link based on the file permission string
1667 keepjumps silent g/d\%([-r][-w][-x]\)\{3}/s@$@/@
1668 keepjumps silent g/l\%([-r][-w][-x]\)\{3}/s/$/@/
1669 if !g:netrw_longlist
1670 exe "keepjumps silent ".curline.',$s/^\%(\S\+\s\+\)\{8}//'
1671 endif
1672 endif
1673
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001674 " restore settings
1675 let &ff= ffkeep
1676" call Dret("NetBrowseFtpCmd")
1677endfun
1678
1679" ---------------------------------------------------------------------
Bram Moolenaar843ee412004-06-30 16:16:41 +00001680" NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
1681" separated patterns given in g:netrw_list_hide
1682fun! <SID>NetrwListHide()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001683" call Dfunc("NetrwListHide() listhide<".g:netrw_list_hide.">")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001684
1685 let listhide= g:netrw_list_hide
1686 while listhide != ""
1687 if listhide =~ ','
1688 let hide = substitute(listhide,',.*$','','e')
1689 let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
1690 else
1691 let hide = listhide
1692 let listhide= ""
1693 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001694
1695 " Prune the list by hiding any files which match
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001696" call Decho("pruning <".hide."> listhide<".listhide.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001697 if g:netrw_hide == 1
1698 exe 'keepjumps silent '.s:netrw_bannercnt.',$g~'.hide.'~d'
1699 elseif g:netrw_hide == 2
1700 exe 'keepjumps silent '.s:netrw_bannercnt.',$v~'.hide.'~d'
1701 endif
Bram Moolenaar843ee412004-06-30 16:16:41 +00001702 endwhile
1703
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001704" call Dret("NetrwListHide")
1705endfun
1706
1707" ---------------------------------------------------------------------
1708" NetHideEdit: allows user to edit the file/directory hiding list
Bram Moolenaar8299df92004-07-10 09:47:34 +00001709fun! <SID>NetHideEdit(mode)
1710" call Dfunc("NetHideEdit(mode=".a:mode.")")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001711
1712 call inputsave()
1713 let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
1714 call inputrestore()
1715
1716 " refresh the listing
1717 let g:netrw_list_hide= newhide
Bram Moolenaar8299df92004-07-10 09:47:34 +00001718 if a:mode == 0
1719 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1720 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001721 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001722 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00001723
1724" call Dret("NetHideEdit")
Bram Moolenaar843ee412004-06-30 16:16:41 +00001725endfun
1726
Bram Moolenaar8299df92004-07-10 09:47:34 +00001727" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001728" NetSortSequence: allows user to edit the sorting sequence
1729fun! <SID>NetSortSequence(mode)
1730" call Dfunc("NetSortSequence(mode=".a:mode.")")
1731
1732 call inputsave()
1733 let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
1734 call inputrestore()
1735
1736 " refresh the listing
1737 let g:netrw_sort_sequence= newsortseq
1738 if a:mode == 0
1739 silent call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
1740 else
1741 silent call s:LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
1742 endif
1743
1744" call Dret("NetSortSequence")
1745endfun
1746
1747" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001748" NetLongList: {{{2
1749fun! <SID>NetLongList(mode)
1750" call Dfunc("NetLongList(mode=".a:mode.") netrw_longlist=".g:netrw_longlist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001751 call s:NetSavePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001752
1753 if g:netrw_longlist != 0
1754 " turn long listing off
1755 let g:netrw_longlist = 0
1756 let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
1757
1758 else
1759 " turn long listing on
1760 let g:netrw_longlist = 1
1761 let g:netrw_list_cmd = g:netrw_list_cmd." -l"
1762 endif
1763
1764 " refresh the listing
1765 if a:mode == 0
1766 silent call <SID>NetBrowse(<SID>NetBrowseChgDir(expand("%"),"./"))
1767 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001768 silent call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,"./"))
Bram Moolenaar8299df92004-07-10 09:47:34 +00001769 endif
1770
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001771 call s:NetRestorePosn()
Bram Moolenaar8299df92004-07-10 09:47:34 +00001772" call Dret("NetLongList : g:netrw_longlist=".g:netrw_longlist)
1773endfun
1774
1775" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001776" NetSaveWordPosn: used by the "s" command in both remote and local
1777" browsing. Along with NetRestoreWordPosn(), it keeps the cursor on
1778" the same word even though the sorting has changed its order of appearance.
1779fun! s:NetSaveWordPosn()
1780" call Dfunc("NetSaveWordPosn()")
1781 let s:netrw_saveword= '^'.escape(getline("."),s:netrw_cd_escape).'$'
1782" call Dret("NetSaveWordPosn : saveword<".s:netrw_saveword.">")
1783endfun
1784
1785" ---------------------------------------------------------------------
1786" NetRestoreWordPosn: used by the "s" command; see NetSaveWordPosn() above
1787fun! s:NetRestoreWordPosn()
1788" call Dfunc("NetRestoreWordPosn()")
1789 silent! call search(s:netrw_saveword,'w')
1790" call Dret("NetRestoreWordPosn")
1791endfun
1792
1793" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001794" NetMakeDir: this function makes a directory (both local and remote)
1795fun! <SID>NetMakeDir(usrhost)
1796" call Dfunc("NetMakeDir(usrhost<".a:usrhost.">)")
1797
1798 " get name of new directory from user. A bare <CR> will skip.
1799 " if its currently a directory, also request will be skipped, but with
1800 " a message.
1801 call inputsave()
1802 let newdirname= input("Please give directory name: ")
1803 call inputrestore()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001804" call Decho("newdirname<".newdirname.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001805
1806 if newdirname == ""
1807" call Dret("NetMakeDir : user aborted with bare <cr>")
1808 return
1809 endif
1810
1811 if a:usrhost == ""
1812
1813 " Local mkdir:
1814 " sanity checks
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001815 let fullnewdir= b:netrw_curdir.'/'.newdirname
1816" call Decho("fullnewdir<".fullnewdir.">")
1817 if isdirectory(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001818 if !exists("g:netrw_quiet")
1819 echoerr "***warning*** <".newdirname."> is already a directory!"
1820 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001821" call Dret("NetMakeDir : directory<".newdirname."> exists previously")
1822 return
1823 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001824 if filereadable(fullnewdir)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001825 if !exists("g:netrw_quiet")
1826 echoerr "***warning*** <".newdirname."> is already a file!"
1827 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001828" call Dret("NetMakeDir : file<".newdirname."> exists previously")
1829 return
1830 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001831 let netrw_origdir= s:NetGetcwd(1)
1832 exe 'cd '.b:netrw_curdir
1833" call Decho("netrw_origdir<".netrw_origdir."> b:netrw_curdir<".b:netrw_curdir.">")
1834" call Decho("exe silent! !".g:netrw_local_mkdir.' "'.newdirname.'"')
1835 exe "silent! !".g:netrw_local_mkdir.' "'.newdirname.'"'
1836 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
1837
Bram Moolenaar8299df92004-07-10 09:47:34 +00001838 if v:shell_error == 0
1839 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001840" call Decho("refresh listing")
1841 let linenum= line(".")
1842 norm! H0
1843 let hline = line(".")
1844 call s:LocalBrowse(s:LocalBrowseChgDir(b:netrw_curdir,'./'))
1845 exe "norm! ".hline."G0z\<CR>"
1846 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001847 elseif !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001848 echoerr "***warning*** unable to make directory<".newdirname.">"
1849 endif
1850 redraw!
1851
1852 else
1853 " Remote mkdir:
1854 let mkdircmd = substitute(g:netrw_mkdir_cmd,'\<HOSTNAME\>',a:usrhost,'')
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001855 let newdirname= "'".'"'.substitute(expand("%"),'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname.'"'."'"
Bram Moolenaar8299df92004-07-10 09:47:34 +00001856" call Decho("exe silent! !".mkdircmd." ".newdirname)
1857 exe "silent! !".mkdircmd." ".newdirname
1858 if v:shell_error == 0
1859 " refresh listing
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001860 let linenum= line(".")
1861 norm! H0
1862 let hline = line(".")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001863 call s:NetBrowse(s:NetBrowseChgDir(expand("%"),'./'))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001864 exe "norm! ".hline."G0z\<CR>"
1865 exe linenum
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001866 elseif !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001867 echoerr "***warning*** unable to make directory<".newdirname.">"
1868 endif
1869 redraw!
1870 endif
1871
1872" call Dret("NetMakeDir")
1873endfun
1874
1875" ---------------------------------------------------------------------
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001876" NetBookmarkDir:
1877" 0: bookmark the current directory
1878" 1: change to the bookmarked directory
1879fun! <SID>NetBookmarkDir(chg,curdir)
1880" call Dfunc("NetBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count)
1881
1882 if a:chg == 0
1883 " bookmark the current directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001884 let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
1885 if !exists("g:NETRW_BOOKMARKMAX")
1886 let g:NETRW_BOOKMARKMAX= v:count
1887 elseif v:count > g:NETRW_BOOKMARKMAX
1888 let g:NETRW_BOOKMARKMAX= v:count
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001889 endif
1890
1891 elseif a:chg == 1
1892 " change to the bookmarked directory
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001893 if exists("g:NETRW_BOOKMARKDIR_{v:count}")
1894 exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001895 else
1896 echomsg "Sorry, bookmark#".v:count." doesn't exist!"
1897 endif
1898
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001899 elseif exists("g:NETRW_BOOKMARKMAX")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001900 " list bookmarks
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001901" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001902 let cnt= 0
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001903 while cnt <= g:NETRW_BOOKMARKMAX
1904 if exists("g:NETRW_BOOKMARKDIR_{cnt}")
1905 echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
1906" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001907 endif
1908 let cnt= cnt + 1
1909 endwhile
1910 endif
1911" call Dret("NetBookmarkDir")
1912endfun
1913
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001914" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001915" Browsing Support For Local Directories And Files: {{{1
1916
1917" ---------------------------------------------------------------------
1918" LocalBrowse: supports local file/directory browsing {{{2
1919fun! <SID>LocalBrowse(dirname)
1920
1921" let dirname= (a:dirname == "")? expand("%:p") : a:dirname
1922 if !isdirectory(a:dirname)
1923 " not a directory, ignore it
1924 return
1925 endif
1926
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001927 " unfortunate interaction -- when putting debugging calls
1928 " above one can no longer enter the DBG buffer.
1929" call Dfunc("LocalBrowse(dirname<".a:dirname.">) buf#".bufnr("%")." winnr=".winnr())
1930" call Decho("winbufnr1=".winbufnr(1)." winbufnr2=".winbufnr(2)." winbufnr3=".winbufnr(3))
1931" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001932
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001933 if v:version < 603
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001934 if !exists("g:netrw_quiet")
1935 echoerr "vim version<".v:version."> too old for browsing with netrw"
1936 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001937" call Dret("LocalBrowse : vim version<".v:version."> too old")
1938 return
1939 endif
1940
1941 " record and change current directory
1942 let netrw_origdir= s:NetGetcwd(1)
1943 exe 'cd '.escape(substitute(a:dirname,'\\','/','ge'),s:netrw_cd_escape)
1944 let dirname= s:NetGetcwd(0)
1945" call Decho("dirname<".dirname."> buf#".bufnr("%")." winnr=".winnr())
Bram Moolenaar8299df92004-07-10 09:47:34 +00001946
1947 " make this buffer modifiable
1948 setlocal ma
1949
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001950 " ---------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00001951 " Perform Directory Listing:
1952" call Decho("Perform directory listing...")
1953 " set up new buffer and map
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001954 " remove the trailing "/"
1955 let dirnamens= substitute(dirname,'/$','','e')
1956 let dirnamenr= bufnr(dirnamens.'$')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001957" call Decho("dirnamenr= bufnr(".dirnamens.")=".dirnamenr." bufname(".dirnamenr.")=".bufname(dirnamenr))
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001958
1959 if dirnamenr != 0 && bufname(dirnamenr) != dirnamens
1960 " try keeping the trailing slash
1961 let dirnamenr = bufnr(dirname.'$')
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001962" call Decho("dirnamenr= bufnr(".dirname.")=".dirnamenr." bufname(".dirnamenr.")=".bufname(dirnamenr)." (retry with /)")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001963 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001964
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001965 if dirnamenr != -1
Bram Moolenaar8299df92004-07-10 09:47:34 +00001966 " buffer already exists (hidden), so switch to it!
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001967" call Decho("buffer already exists: dirnamenr=".dirnamenr." dirname<".dirname."> pre-exists")
1968" call Dredir("ls!")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001969 exe "b ".dirnamenr
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001970 exe 'silent! cd '.escape(substitute(a:dirname,'\\','/','ge'),s:netrw_cd_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00001971" call Decho("changed directory to<".dirname.">")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001972 if a:dirname != "." && line("$") >= 5 && exists("b:netrw_curdir")
1973 if b:netrw_curdir == dirname
1974" call Dret("LocalBrowse : buffer already exists with info, #".dirnamenr)
1975 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
1976 return
1977 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001978 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00001979" call Decho("buffer already exists, but needs re-listing (buf#".dirnamenr.")")
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001980" call Decho("buffer name<".bufname("%")."> dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001981 setlocal ma
Bram Moolenaar8299df92004-07-10 09:47:34 +00001982 keepjumps %d
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001983 if expand("%") != dirname
1984 " set standard browser options on buffer
1985 setlocal bt=nofile bh=hide nobl noswf
1986 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001987 exe 'silent! file '.escape(dirname,s:netrw_cd_escape)
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001988" call Decho("renamed buffer to<".escape(dirname,s:netrw_cd_escape).">")
1989" call Decho("yielding actual bufname<".bufname("%").">")
Bram Moolenaar269ec652004-07-29 08:43:53 +00001990 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00001991 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001992" call Decho("generate new buffer named<".escape(dirname,' #').">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00001993 silent! enew!
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001994 " set standard browser options on buffer
1995 setlocal bt=nofile bh=hide nobl noswf
1996 exe "setlocal ts=".g:netrw_maxfilenamelen
Bram Moolenaard4755bb2004-09-02 19:12:26 +00001997 exe 'silent! file '.substitute(escape(dirname,s:netrw_cd_escape),'/$','','e')
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001998" call Decho("renamed buffer to<".substitute(escape(dirname,s:netrw_cd_escape),'/$','','e').">")
1999" call Decho("yielding actual bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002000 endif
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002001 if bufname("#") == "" && bufnr("#") != -1
2002 " the file command produces a lot of [No File] buffers
2003" call Decho("wiping out nofile buffer#".bufnr("#"))
2004 exe bufnr("#")."bwipe"
2005 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002006
2007 " set up all the maps
Bram Moolenaar269ec652004-07-29 08:43:53 +00002008" call Decho("Setting up local browser maps")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002009 let b:netrw_curdir= s:NetGetcwd(1)
2010 nnoremap <buffer> <silent> <cr> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2011 nnoremap <buffer> <silent> <c-l> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
2012 nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'../'))<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002013 nnoremap <buffer> <silent> a :let g:netrw_hide=(g:netrw_hide+1)%3<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002014 nnoremap <buffer> <silent> b :<c-u>call <SID>NetBookmarkDir(0,b:netrw_curdir)<cr>
2015 nnoremap <buffer> <silent> B :<c-u>call <SID>NetBookmarkDir(1,b:netrw_curdir)<cr>
2016 nnoremap <buffer> <silent> c :exe "cd ".b:netrw_curdir<cr>
2017 nnoremap <buffer> <silent> d :call <SID>NetMakeDir("")<cr>
2018 nnoremap <buffer> <silent> <c-h> :call <SID>NetHideEdit(1)<cr>
Bram Moolenaar8299df92004-07-10 09:47:34 +00002019 nnoremap <buffer> <silent> i :call <SID>NetLongList(1)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002020 nnoremap <buffer> <silent> o :exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2021 nnoremap <buffer> <silent> p :exe "norm! 0"<bar>call <SID>LocalPreview(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),1))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002022 nnoremap <buffer> <silent> q :<c-u>call <SID>NetBookmarkDir(2,b:netrw_curdir)<cr>
2023 nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))<cr>
2024 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>
2025 nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr>
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002026 nnoremap <buffer> <silent> v :exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"<bar>exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002027 nnoremap <buffer> <silent> x :exe "norm! 0"<bar>call <SID>NetBrowseX(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord(),0),0)<cr>
2028 nnoremap <buffer> <silent> <2-leftmouse> :exe "norm! 0"<bar>call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,<SID>NetGetWord()))<cr>
2029 exe 'nnoremap <buffer> <silent> <del> :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2030 exe 'vnoremap <buffer> <silent> <del> :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2031 exe 'nnoremap <buffer> <silent> D :exe "norm! 0"<bar>call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2032 exe 'vnoremap <buffer> <silent> D :call <SID>LocalBrowseRm("'.b:netrw_curdir.'")<cr>'
2033 exe 'nnoremap <buffer> <silent> R :exe "norm! 0"<bar>call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
2034 exe 'vnoremap <buffer> <silent> R :call <SID>LocalBrowseRename("'.b:netrw_curdir.'")<cr>'
Bram Moolenaar269ec652004-07-29 08:43:53 +00002035 exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetMakeDir("")<cr>'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002036 nnoremap <buffer> ? :he netrw-dir<cr>
2037
2038 " Set up the banner
Bram Moolenaar269ec652004-07-29 08:43:53 +00002039" call Decho("set up banner")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002040 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002041 keepjumps 1d
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002042 keepjumps put ='\" Directory Listing (netrw '.g:loaded_netrw.')'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002043 keepjumps put ='\" '.dirname
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002044 let s:netrw_bannercnt= 7
2045
2046 let sortby= g:netrw_sort_by
2047 if g:netrw_sort_direction =~ "^r"
2048 let sortby= sortby." reversed"
2049 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002050
Bram Moolenaar8299df92004-07-10 09:47:34 +00002051 if g:netrw_sort_by =~ "^n"
Bram Moolenaar269ec652004-07-29 08:43:53 +00002052" call Decho("directories will be sorted by name")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002053 " sorted by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002054 let s:netrw_bannercnt= s:netrw_bannercnt + 1
2055 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002056 keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
2057 else
Bram Moolenaar269ec652004-07-29 08:43:53 +00002058" call Decho("directories will be sorted by size or date")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002059 " sorted by size or date
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002060 keepjumps put ='\" Sorted by '.sortby
Bram Moolenaar8299df92004-07-10 09:47:34 +00002061 endif
Bram Moolenaar269ec652004-07-29 08:43:53 +00002062 if g:netrw_list_hide != "" && g:netrw_hide
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002063 if g:netrw_hide == 1
2064 keepjumps put ='\" Hiding: '.g:netrw_list_hide
2065 else
2066 keepjumps put ='\" Showing: '.g:netrw_list_hide
2067 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002068 let s:netrw_bannercnt= s:netrw_bannercnt + 1
Bram Moolenaar8299df92004-07-10 09:47:34 +00002069 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002070 keepjumps put ='\" Quick Help: ?:help -:go up dir D:delete R:rename s:sort-by x:exec'
2071 keepjumps put ='\" ============================================================================'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002072
2073 " generate the requested directory listing
2074 call LocalBrowseList(dirname)
2075
2076 " manipulate the directory listing (hide, sort)
2077 setlocal ft=netrwlist
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002078 if line("$") >= s:netrw_bannercnt
Bram Moolenaar269ec652004-07-29 08:43:53 +00002079 if g:netrw_hide && g:netrw_list_hide != ""
2080 call s:NetrwListHide()
Bram Moolenaar8299df92004-07-10 09:47:34 +00002081 endif
2082 if g:netrw_sort_by =~ "^n"
2083 call s:SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002084 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
2085 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{3}\///e'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002086 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002087 exe 'keepjumps silent '.s:netrw_bannercnt.',$call s:NetSort()'
2088 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\d\{-}\///e'
Bram Moolenaar8299df92004-07-10 09:47:34 +00002089 endif
2090 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002091 exe s:netrw_bannercnt
Bram Moolenaar8299df92004-07-10 09:47:34 +00002092
2093 setlocal noma nomod
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002094 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002095
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002096" call Dret("LocalBrowse : file<".expand("%:p")."> bufname<".bufname("%").">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002097endfun
2098
2099" ---------------------------------------------------------------------
2100" LocalBrowseList: does the job of "ls" for local directories {{{2
2101fun! LocalBrowseList(dirname)
2102" call Dfunc("LocalBrowseList(dirname<".a:dirname.">)")
2103
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002104 " get the list of files contained in the current directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002105 let dirname = escape(a:dirname,s:netrw_glob_escape)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002106 let dirnamelen = strlen(a:dirname)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002107 let filelist = glob(dirname."*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002108" call Decho("glob(dirname<".dirname.">,*)=".filelist)
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002109 if filelist != ""
2110 let filelist= filelist."\n"
2111 endif
2112 let filelist= filelist.glob(dirname.".*")
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002113" call Decho("glob(dirname<".dirname.">,.*)=".glob(dirname.".*"))
2114
2115 " if the directory name includes a "$", and possibly other characters,
2116 " the glob() doesn't include "." and ".." entries.
2117 if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
2118" call Decho("forcibly tacking on .")
2119 if filelist == ""
2120 let filelist= dirname."."
2121 else
2122 let filelist= filelist."\n".a:dirname."."
2123 endif
2124" call Decho("filelist<".filelist.">")
2125 endif
2126 if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
2127" call Decho("forcibly tacking on ..")
2128 let filelist= filelist."\n".a:dirname.".."
2129" call Decho("filelist<".filelist.">")
2130 endif
2131 let filelist= substitute(filelist,'\n\{2,}','\n','ge')
2132
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002133" call Decho("dirname<".dirname.">")
2134" call Decho("dirnamelen<".dirnamelen.">")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002135" call Decho("filelist<".filelist.">")
2136
2137 while filelist != ""
2138 if filelist =~ '\n'
2139 let file = substitute(filelist,'\n.*$','','e')
2140 let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
2141 else
2142 let file = filelist
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00002143 let filelist = ""
Bram Moolenaar8299df92004-07-10 09:47:34 +00002144 endif
2145 let pfile= file
2146 if isdirectory(file)
2147 let pfile= file."/"
2148 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002149 if pfile =~ '//$'
2150 let pfile= substitute(pfile,'//$','/','e')
2151 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002152 let pfile= strpart(pfile,dirnamelen)
2153 if g:netrw_longlist
Bram Moolenaar269ec652004-07-29 08:43:53 +00002154 let sz = getfsize(file)
2155 let fsz = strpart(" ",1,15-strlen(sz)).sz
2156 let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(file))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002157 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002158
Bram Moolenaar8299df92004-07-10 09:47:34 +00002159 if g:netrw_sort_by =~ "^t"
2160 " sort by time (handles time up to 1 quintillion seconds, US)
2161" call Decho("getftime(".file.")=".getftime(file))
2162 let t = getftime(file)
2163 let ft = strpart("000000000000000000",1,18-strlen(t)).t
2164" call Decho("exe keepjumps put ='".ft.'/'.file."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002165 let ftpfile= ft.'/'.pfile
2166 keepjumps put=ftpfile
2167
Bram Moolenaar8299df92004-07-10 09:47:34 +00002168 elseif g:netrw_sort_by =~ "^s"
2169 " sort by size (handles file sizes up to 1 quintillion bytes, US)
2170" call Decho("getfsize(".file.")=".getfsize(file))
2171 let sz = getfsize(file)
2172 let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
2173" call Decho("exe keepjumps put ='".fsz.'/'.file."'")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002174 let fszpfile= fsz.'/'.pfile
2175 keepjumps put =fszpfile
2176
Bram Moolenaar8299df92004-07-10 09:47:34 +00002177 else
2178 " sort by name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002179" call Decho("exe keepjumps put ='".pfile."'")
2180 keepjumps put=pfile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002181 endif
2182 endwhile
2183
2184" call Dret("LocalBrowseList")
2185endfun
2186
2187" ---------------------------------------------------------------------
2188" LocalBrowseChgDir: constructs a new directory based on the current {{{2
2189" directory and a new directory name
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002190fun! <SID>LocalBrowseChgDir(dirname,newdir,...)
2191" call Dfunc("LocalBrowseChgDir(dirname<".a:dirname."> newdir<".a:newdir.">) a:0=".a:0)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002192
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002193 let dirname= substitute(a:dirname,'\\','','ge')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002194 let newdir = a:newdir
2195
2196 if dirname !~ '/$'
2197 " apparently vim is "recognizing" that it is in the home directory and
2198 " is removing the "/". Bad idea, so I have to put it back.
2199 let dirname= dirname.'/'
2200" call Decho("adjusting dirname<".dirname.">")
2201 endif
2202
2203 if newdir !~ '/$'
2204 " handling a file
2205 let dirname= dirname.newdir
2206" call Decho("handling a file: dirname<".dirname.">")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002207 " this lets NetBrowseX avoid the edit
2208 if a:0 < 1
2209 exe "e ".escape(dirname,s:netrw_cd_escape)
2210 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002211
2212 elseif newdir == './'
2213 " refresh the directory list
2214" call Decho("refresh directory listing")
2215 setlocal ma
2216 %d
2217
2218 elseif newdir == '../'
2219 " go up one directory
2220 let dirname= substitute(dirname,'^\(.*/\)\([^/]\+/$\)','\1','e')
2221" call Decho("go up one dir: dirname<".dirname.">")
2222
2223 else
2224 " go down one directory
2225 let dirname= dirname.newdir
2226" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2227 endif
2228
2229" call Dret("LocalBrowseChgDir <".dirname.">")
2230 return dirname
2231endfun
2232
2233" ---------------------------------------------------------------------
2234" LocalBrowseRm:
2235fun! <SID>LocalBrowseRm(path) range
2236" call Dfunc("LocalBrowseRm(path<".a:path.">)")
2237" call Decho("firstline=".a:firstline." lastline=".a:lastline)
2238
2239 " preparation for removing multiple files/directories
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002240 let ctr = a:firstline
2241 let ret = 0
2242 let netrw_origdir = s:NetGetcwd(1)
2243 exe 'cd '.b:netrw_curdir
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002244 let all= 0
Bram Moolenaar8299df92004-07-10 09:47:34 +00002245
2246 " remove multiple files and directories
2247 while ctr <= a:lastline
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002248 exe "keepjumps ".ctr
2249
2250 " sanity checks
2251 if line(".") < s:netrw_bannercnt
2252 let ctr= ctr + 1
2253 continue
2254 endif
2255 let curword= s:NetGetWord()
2256 if curword == "./" || curword == "../"
2257 let ctr= ctr + 1
2258 continue
2259 endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002260
2261 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002262 let rmfile= a:path.curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002263" call Decho("rmfile<".rmfile.">")
2264
2265 if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '/$')
2266 " attempt to remove file
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002267 if !all
2268 echohl Statement
2269 call inputsave()
2270 let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2271 call inputrestore()
2272 echohl NONE
2273 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2274 if ok =~ 'a\%[ll]'
2275 let all= 1
2276 endif
2277 endif
2278
2279 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002280 let ret= delete(rmfile)
2281" call Decho("errcode=".v:shell_error." ret=".ret)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002282 elseif ok =~ 'q\%[uit]'
2283 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002284 endif
2285
2286 else
2287 " attempt to remove directory
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002288 if !all
2289 echohl Statement
2290 call inputsave()
2291 let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
2292 call inputrestore()
2293 let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
2294 if ok =~ 'a\%[ll]'
2295 let all= 1
2296 endif
2297 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002298 let rmfile= substitute(rmfile,'/$','','e')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002299
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002300 if all || ok =~ 'y\%[es]' || ok == ""
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002301" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
2302 call system(g:netrw_local_rmdir.' "'.rmfile.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002303" call Decho("v:shell_error=".v:shell_error)
2304
2305 if v:shell_error != 0
2306" call Decho("2nd attempt to remove directory<".rmfile.">")
2307 let errcode= delete(rmfile)
2308" call Decho("errcode=".errcode)
2309
2310 if errcode != 0
2311 if has("unix")
2312" call Decho("3rd attempt to remove directory<".rmfile.">")
2313 call system("rm ".rmfile)
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002314 if v:shell_error != 0 && !exists("g:netrw_quiet")
Bram Moolenaar8299df92004-07-10 09:47:34 +00002315 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
2316 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002317 elseif !exist("g:netrw_quiet")s
Bram Moolenaar8299df92004-07-10 09:47:34 +00002318 echoerr "unable to remove directory<".rmfile."> -- is it empty?"
2319 endif
2320 endif
2321 endif
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002322
2323 elseif ok =~ 'q\%[uit]'
2324 break
Bram Moolenaar8299df92004-07-10 09:47:34 +00002325 endif
2326 endif
2327
2328 let ctr= ctr + 1
2329 endwhile
2330
2331 " refresh the directory
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002332 let curline= line(".")
2333 if g:netrw_keepdir | exe 'keepjumps cd '.netrw_origdir | endif
Bram Moolenaar8299df92004-07-10 09:47:34 +00002334" call Decho("refresh the directory")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002335 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002336 exe curline
2337
2338" call Dret("LocalBrowseRm")
2339endfun
2340
2341" ---------------------------------------------------------------------
2342" LocalBrowseRename: rename a remote file or directory {{{2
Bram Moolenaar269ec652004-07-29 08:43:53 +00002343fun! <SID>LocalBrowseRename(path) range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002344" call Dfunc("LocalBrowseRename(path<".a:path.">)")
2345
2346 " preparation for removing multiple files/directories
2347 let ctr= a:firstline
2348
2349 " attempt to rename files/directories
2350 while ctr <= a:lastline
2351 exe "keepjumps ".ctr
2352
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002353 " sanity checks
2354 if line(".") < s:netrw_bannercnt
2355 let ctr= ctr + 1
2356 continue
2357 endif
2358 let curword= s:NetGetWord()
2359 if curword == "./" || curword == "../"
2360 let ctr= ctr + 1
2361 continue
2362 endif
2363
Bram Moolenaar8299df92004-07-10 09:47:34 +00002364 norm! 0
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002365 let oldname= a:path.curword
Bram Moolenaar8299df92004-07-10 09:47:34 +00002366" call Decho("oldname<".oldname.">")
2367
2368 call inputsave()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002369 let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002370 call inputrestore()
2371
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002372 let ret= system(g:netrw_local_rename.' "'.oldname.'" "'.newname.'"')
Bram Moolenaar8299df92004-07-10 09:47:34 +00002373" call Decho("executing system(".g:netrw_local_rename." ".oldname." ".newname)
2374
2375 let ctr= ctr + 1
2376 endwhile
2377
2378 " refresh the directory
2379 let curline= line(".")
Bram Moolenaar269ec652004-07-29 08:43:53 +00002380" call Decho("refresh the directory listing")
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002381 call <SID>LocalBrowse(<SID>LocalBrowseChgDir(b:netrw_curdir,'./'))
Bram Moolenaar8299df92004-07-10 09:47:34 +00002382 exe "keepjumps ".curline
2383" call Dret("LocalBrowseRename")
2384endfun
2385
2386" ---------------------------------------------------------------------
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002387" LocalPreview: {{{2
2388fun! <SID>LocalPreview(path) range
2389" call Dfunc("LocalPreview(path<".a:path.">)")
2390 if has("quickfix")
2391 if !isdirectory(a:path)
2392 exe "pedit ".a:path
2393 elseif !exist("g:netrw_quiet")s
2394 echoerr "sorry, cannot preview a directory such as <".a:path.">"
2395 endif
2396 elseif !exist("g:netrw_quiet")s
2397 echoerr "sorry, to preview your vim needs the quickfix feature compiled in"
2398 endif
2399" call Dret("LocalPreview")
2400endfun
2401
2402" ---------------------------------------------------------------------
2403" NetGetcwd: get the current directory. {{{2
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002404" Change backslashes to forward slashes, if any.
2405" If doesc is true, escape certain troublesome characters
2406fun! <SID>NetGetcwd(doesc)
2407" call Dfunc("NetGetcwd(doesc=".a:doesc.")")
2408 let curdir= substitute(getcwd(),'\\','/','ge')
2409 if curdir !~ '/$'
2410 let curdir= curdir.'/'
2411 endif
2412 if a:doesc
2413 let curdir= escape(curdir,s:netrw_cd_escape)
2414 endif
2415" call Dret("NetGetcwd <".curdir.">")
2416 return curdir
2417endfun
2418
2419" ---------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +00002420" NetMethod: determine method of transfer {{{1
2421" method == 1: rcp
2422" 2: ftp + <.netrc>
2423" 3: ftp + machine, id, password, and [path]filename
2424" 4: scp
2425" 5: http (wget)
2426" 6: cadaver
2427" 7: rsync
2428" 8: fetch
2429" 9: sftp
2430fun! s:NetMethod(choice) " globals: method machine id passwd fname
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002431" call Dfunc("NetMethod(a:choice<".a:choice.">)")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002432
2433 " initialization
2434 let b:netrw_method = 0
2435 let g:netrw_machine = ""
2436 let b:netrw_fname = ""
2437 let g:netrw_port = ""
2438
2439 " Patterns:
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002440 " mipf : a:machine a:id password filename Use ftp
2441 " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002442 " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid g:netrw_passwd
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002443 " rcpurm : rcp://[user@]host/filename Use rcp
2444 " rcphf : [user@]host:filename Use rcp
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002445 " scpurm : scp://[user@]host[[#:]port]/filename Use scp
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002446 " httpurm : http://[user@]host/filename Use wget
2447 " davurm : [s]dav://host[:port]/path Use cadaver
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002448 " rsyncurm : rsync://host[:port]/path Use rsync
2449 " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
2450 " sftpurm : sftp://[user@]host/filename Use scp
2451 let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2452 let mf = '^\(\S\+\)\s\+\(\S\+\)$'
2453 let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2454 let rcpurm = '^rcp://\(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
2455 let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
2456 let scpurm = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2457 let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002458 let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002459 let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
2460 let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2461 let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
2462
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002463" call Decho("determine method:")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002464 " Determine Method
2465 " rcp://user@hostname/...path-to-file
2466 if match(a:choice,rcpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002467" call Decho("rcp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002468 let b:netrw_method = 1
2469 let userid = substitute(a:choice,rcpurm,'\2',"")
2470 let g:netrw_machine= substitute(a:choice,rcpurm,'\3',"")
2471 let b:netrw_fname = substitute(a:choice,rcpurm,'\4',"")
2472 if userid != ""
2473 let g:netrw_uid= userid
Bram Moolenaar071d4272004-06-13 20:20:40 +00002474 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002475
2476 " scp://user@hostname/...path-to-file
2477 elseif match(a:choice,scpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002478" call Decho("scp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002479 let b:netrw_method = 4
2480 let g:netrw_machine= substitute(a:choice,scpurm,'\1',"")
2481 let b:netrw_port = substitute(a:choice,scpurm,'\2',"")
2482 let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
2483
2484 " http://user@hostname/...path-to-file
2485 elseif match(a:choice,httpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002486" call Decho("http://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002487 let b:netrw_method = 5
2488 let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2489 let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
2490
2491 " dav://hostname[:port]/..path-to-file..
2492 elseif match(a:choice,davurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002493" call Decho("dav://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002494 let b:netrw_method= 6
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002495 if a:choice =~ '^s'
2496 let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2497 else
2498 let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2499 endif
2500 let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002501
2502 " rsync://user@hostname/...path-to-file
2503 elseif match(a:choice,rsyncurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002504" call Decho("rsync://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002505 let b:netrw_method = 7
2506 let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2507 let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
2508
2509 " ftp://[user@]hostname[[:#]port]/...path-to-file
2510 elseif match(a:choice,ftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002511" call Decho("ftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002512 let userid = substitute(a:choice,ftpurm,'\2',"")
2513 let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2514 let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
2515 let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
2516 if g:netrw_port != ""
2517 let g:netrw_port = substitute(g:netrw_port,"[#:]","","")
2518 endif
2519 if userid != ""
2520 let g:netrw_uid= userid
2521 endif
2522 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2523 let b:netrw_method = 3
2524 else
2525 if filereadable(expand("$HOME/.netrc")) && !exists("g:netrw_ignorenetrc")
2526 let b:netrw_method= 2
2527 else
2528 if !exists("g:netrw_uid") || g:netrw_uid == ""
2529 call NetUserPass()
2530 elseif !exists("g:netrw_passwd") || g:netrw_passwd == ""
2531 call NetUserPass(g:netrw_uid)
2532 " else just use current g:netrw_uid and g:netrw_passwd
2533 endif
2534 let b:netrw_method= 3
2535 endif
2536 endif
2537
2538 elseif match(a:choice,fetchurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002539" call Decho("fetch://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002540 let b:netrw_method = 8
2541 let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
2542 let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
2543 let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
2544 let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
2545
2546 " Issue an ftp : "machine id password [path/]filename"
2547 elseif match(a:choice,mipf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002548" call Decho("(ftp) host id pass file")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002549 let b:netrw_method = 3
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002550 let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
2551 let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
2552 let g:netrw_passwd = substitute(a:choice,mipf,'\3',"")
2553 let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
2554
2555 " Issue an ftp: "hostname [path/]filename"
2556 elseif match(a:choice,mf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002557" call Decho("(ftp) host file")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002558 if exists("g:netrw_uid") && exists("g:netrw_passwd")
2559 let b:netrw_method = 3
2560 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2561 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2562
2563 elseif filereadable(expand("$HOME/.netrc"))
2564 let b:netrw_method = 2
2565 let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2566 let b:netrw_fname = substitute(a:choice,mf,'\2',"")
2567 endif
2568
2569 " sftp://user@hostname/...path-to-file
2570 elseif match(a:choice,sftpurm) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002571" call Decho("sftp://...")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002572 let b:netrw_method = 9
2573 let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
2574 let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
2575
2576 " Issue an rcp: hostname:filename" (this one should be last)
2577 elseif match(a:choice,rcphf) == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002578" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002579 let b:netrw_method = 1
2580 let userid = substitute(a:choice,rcphf,'\2',"")
2581 let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
2582 let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002583" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
2584" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
2585" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
2586" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002587 if userid != ""
2588 let g:netrw_uid= userid
2589 endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002590 if has("win32") || has("win95") || has("win64") || has("win16")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002591 " don't let PCs try <.netrc>
2592 let b:netrw_method = 3
2593 endif
2594
2595 else
Bram Moolenaarc0197e22004-09-13 20:26:32 +00002596 if !exists("g:netrw_quiet")
2597 echoerr "***error*** cannot determine method"
2598 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002599 let b:netrw_method = -1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002600 endif
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002601
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002602" call Decho("a:choice <".a:choice.">")
2603" call Decho("b:netrw_method <".b:netrw_method.">")
2604" call Decho("g:netrw_machine<".g:netrw_machine.">")
2605" call Decho("g:netrw_port <".g:netrw_port.">")
2606" if exists("g:netrw_uid") "Decho
2607" call Decho("g:netrw_uid <".g:netrw_uid.">")
2608" endif "Decho
2609" if exists("g:netrw_passwd") "Decho
2610" call Decho("g:netrw_passwd <".g:netrw_passwd.">")
2611" endif "Decho
2612" call Decho("b:netrw_fname <".b:netrw_fname.">")
2613" call Dret("NetMethod")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002614endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002615
2616" ------------------------------------------------------------------------
2617" NetUserPass: set username and password for subsequent ftp transfer {{{1
2618" Usage: :call NetUserPass() -- will prompt for userid and password
2619" :call NetUserPass("uid") -- will prompt for password
2620" :call NetUserPass("uid","password") -- sets global userid and password
2621fun! NetUserPass(...)
2622
2623 " get/set userid
2624 if a:0 == 0
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002625" call Dfunc("NetUserPass(a:0<".a:0.">)")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002626 if !exists("g:netrw_uid") || g:netrw_uid == ""
2627 " via prompt
2628 let g:netrw_uid= input('Enter username: ')
2629 endif
2630 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002631" call Dfunc("NetUserPass(a:1<".a:1.">) {")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002632 let g:netrw_uid= a:1
2633 endif
2634
2635 " get password
2636 if a:0 <= 1 " via prompt
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002637" call Decho("a:0=".a:0." case <=1:")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002638 let g:netrw_passwd= inputsecret("Enter Password: ")
2639 else " from command line
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002640" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002641 let g:netrw_passwd=a:2
2642 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002643" call Dret("NetUserPass")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002644endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +00002645
2646" ------------------------------------------------------------------------
2647" NetOptionSave: save options and set to "standard" form {{{1
2648fun!s:NetOptionSave()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002649" call Dfunc("NetOptionSave()")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002650
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002651 " Get Temporary Filename
2652 let s:aikeep = &ai
2653 let s:cinkeep = &cin
2654 let s:cinokeep = &cino
2655 let s:comkeep = &com
2656 let s:cpokeep = &cpo
2657 let s:dirkeep = getcwd()
2658 let s:gdkeep = &gd
2659 let s:twkeep = &tw
Bram Moolenaar8299df92004-07-10 09:47:34 +00002660 setlocal cino =
2661 setlocal com =
2662 setlocal cpo -=aA
2663 setlocal nocin noai
2664 setlocal tw =0
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002665 if has("win32") && !has("win95")
2666 let s:swfkeep= &swf
Bram Moolenaar8299df92004-07-10 09:47:34 +00002667 setlocal noswf
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002668" call Decho("setting s:swfkeep to <".&swf.">")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002669 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002670
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002671" call Dret("NetOptionSave")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002672endfun
2673
2674" ------------------------------------------------------------------------
2675" NetOptionRestore: restore options {{{1
2676fun! s:NetOptionRestore()
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002677" call Dfunc("NetOptionRestore()")
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002678
2679 let &ai = s:aikeep
2680 let &cin = s:cinkeep
2681 let &cino = s:cinokeep
2682 let &com = s:comkeep
2683 let &cpo = s:cpokeep
2684 exe "lcd ".s:dirkeep
2685 let &gd = s:gdkeep
2686 let &tw = s:twkeep
2687 if exists("s:swfkeep")
2688 let &swf= s:swfkeep
2689 unlet s:swfkeep
2690 endif
2691 unlet s:aikeep
2692 unlet s:cinkeep
2693 unlet s:cinokeep
2694 unlet s:comkeep
2695 unlet s:cpokeep
2696 unlet s:gdkeep
2697 unlet s:twkeep
2698 unlet s:dirkeep
2699
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002700" call Dret("NetOptionRestore")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002701endfun
2702
2703" ------------------------------------------------------------------------
2704" NetReadFixup: this sort of function is typically written by the user {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002705" to handle extra junk that their system's ftp dumps
2706" into the transfer. This function is provided as an
2707" example and as a fix for a Windows 95 problem: in my
2708" experience, win95's ftp always dumped four blank lines
2709" at the end of the transfer.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002710if has("win95") && g:netrw_win95ftp
2711 fun! NetReadFixup(method, line1, line2)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002712" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002713 if method == 3 " ftp (no <.netrc>)
2714 let fourblanklines= line2 - 3
2715 silent fourblanklines.",".line2."g/^\s*/d"
2716 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002717" call Dret("NetReadFixup")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002718 endfun
2719endif
2720
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002721" ---------------------------------------------------------------------
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002722" NetSort: Piet Delport's BISort2() function, modified to take a range {{{1
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002723fun! <SID>NetSort() range
Bram Moolenaar8299df92004-07-10 09:47:34 +00002724" call Dfunc("NetSort()")
2725
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002726 let i = a:firstline + 1
2727 while i <= a:lastline
2728 " find insertion point via binary search
2729 let i_val = getline(i)
2730 let lo = a:firstline
2731 let hi = i
2732 while lo < hi
2733 let mid = (lo + hi) / 2
2734 let mid_val = getline(mid)
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002735 if g:netrw_sort_direction =~ '^n'
2736 " normal sorting order
2737 if i_val < mid_val
2738 let hi = mid
2739 else
2740 let lo = mid + 1
2741 if i_val == mid_val | break | endif
2742 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002743 else
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002744 " reverse sorting order
2745 if i_val > mid_val
2746 let hi = mid
2747 else
2748 let lo = mid + 1
2749 if i_val == mid_val | break | endif
2750 endif
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002751 endif
2752 endwhile
2753 " do insert
2754 if lo < i
Bram Moolenaarf4b8e572004-06-24 15:53:16 +00002755 exe 'keepjumps '.i.'d_'
2756 keepjumps call append(lo - 1, i_val)
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002757 endif
2758 let i = i + 1
2759 endwhile
Bram Moolenaar8299df92004-07-10 09:47:34 +00002760
2761" call Dret("NetSort")
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002762endfun
2763
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002764" ---------------------------------------------------------------------
Bram Moolenaar8299df92004-07-10 09:47:34 +00002765" SetSort: sets up the sort based on the g:netrw_sort_sequence {{{1
2766" What this function does is to compute a priority for the patterns
2767" in the g:netrw_sort_sequence. It applies a substitute to any
2768" "files" that satisfy each pattern, putting the priority / in
2769" front. An "*" pattern handles the default priority.
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002770fun! <SID>SetSort()
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002771" call Dfunc("SetSort() bannercnt=".s:netrw_bannercnt)
Bram Moolenaar8299df92004-07-10 09:47:34 +00002772 if g:netrw_longlist
2773 let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
2774 else
2775 let seqlist = g:netrw_sort_sequence
2776 endif
2777 " sanity check -- insure that * appears somewhere
2778 if seqlist == ""
2779 let seqlist= '*'
2780 elseif seqlist !~ '\*'
2781 let seqlist= seqlist.',*'
2782 endif
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002783 let priority = 1
2784 while seqlist != ""
2785 if seqlist =~ ','
2786 let seq = substitute(seqlist,',.*$','','e')
2787 let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
2788 else
2789 let seq = seqlist
2790 let seqlist = ""
2791 endif
2792 let eseq= escape(seq,'/')
2793 if priority < 10
2794 let spriority= "00".priority.'\/'
2795 elseif priority < 100
2796 let spriority= "0".priority.'\/'
2797 else
2798 let spriority= priority.'\/'
2799 endif
2800" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
2801
2802 if seq == '*'
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002803 exe 'keepjumps silent '.s:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002804 else
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002805 exe 'keepjumps silent '.s:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002806 endif
2807 let priority = priority + 1
2808 endwhile
2809
Bram Moolenaard4755bb2004-09-02 19:12:26 +00002810 exe 'keepjumps silent '.s:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+/\1/e'
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +00002811
2812" call Dret("SetSort")
2813endfun
2814
Bram Moolenaar071d4272004-06-13 20:20:40 +00002815" ------------------------------------------------------------------------
2816" Restore {{{1
2817let &cpo= s:save_cpo
2818unlet s:save_cpo
2819" vim:ts=8 fdm=marker