Vim 7.2b ready for testing.
[MacVim/KaoriYa.git] / runtime / autoload / netrw.vim
blob6221294bbd265e094dd4358b9c6547cf54744f65
1 " netrw.vim: Handles file transfer and remote directory listing across
2 "            AUTOLOAD SECTION
3 " Date:         Jul 12, 2008
4 " Version:      127
5 " Maintainer:   Charles E Campbell, Jr <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
6 " GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
7 " Copyright:    Copyright (C) 1999-2008 Charles E. Campbell, Jr. {{{1
8 "               Permission is hereby granted to use and distribute this code,
9 "               with or without modifications, provided that this copyright
10 "               notice is copied with it. Like anything else that's free,
11 "               netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided
12 "               *as is* and come with no warranty of any kind, either
13 "               expressed or implied. By using this plugin, you agree that
14 "               in no event will the copyright holder be liable for any damages
15 "               resulting from the use of this software.
16 "redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
18 "  But be doers of the Word, and not only hearers, deluding your own selves {{{1
19 "  (James 1:22 RSV)
20 " =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
21 " Load Once: {{{1
22 if &cp || exists("g:loaded_netrw")
23   finish
24 endif
25 if !exists("s:NOTE")
26  let s:NOTE    = 0
27  let s:WARNING = 1
28  let s:ERROR   = 2
29 endif
30 let g:loaded_netrw = "v127"
32 " sanity checks
33 if v:version < 700
34  call netrw#ErrorMsg(s:WARNING,"you need vim version 7.0 or later for version ".g:loaded_netrw." of netrw",1)
35  finish
36 endif
38 let s:keepcpo= &cpo
39 setlocal cpo&vim
40 "DechoTabOn
41 "call Decho("doing autoload/netrw.vim version ".g:loaded_netrw)
43 " ======================
44 "  Netrw Variables: {{{1
45 " ======================
47 " ---------------------------------------------------------------------
48 "  Netrw Constants: {{{2
49 if !exists("g:NETRW_BOOKMARKMAX")
50  let g:NETRW_BOOKMARKMAX= 0
51 endif
52 if !exists("g:NETRW_DIRHIST_CNT")
53  let g:NETRW_DIRHIST_CNT= 0
54 endif
55 if !exists("s:LONGLIST")
56  let s:THINLIST = 0
57  let s:LONGLIST = 1
58  let s:WIDELIST = 2
59  let s:TREELIST = 3
60  let s:MAXLIST  = 4
61 endif
63 " ---------------------------------------------------------------------
64 " Default values for netrw's global protocol variables {{{2
65 if !exists("g:netrw_dav_cmd")
66   let g:netrw_dav_cmd   = "cadaver"
67 endif
68 if !exists("g:netrw_fetch_cmd")
69  if executable("fetch")
70   let g:netrw_fetch_cmd = "fetch -o"
71  else
72   let g:netrw_fetch_cmd = ""
73  endif
74 endif
75 if !exists("g:netrw_ftp_cmd")
76   let g:netrw_ftp_cmd   = "ftp"
77 endif
78 if !exists("g:netrw_http_cmd")
79  if executable("curl")
80   let g:netrw_http_cmd  = "curl -o"
81  elseif executable("wget")
82   let g:netrw_http_cmd  = "wget -q -O"
83  elseif executable("fetch")
84   let g:netrw_http_cmd  = "fetch -o"
85  else
86   let g:netrw_http_cmd  = ""
87  endif
88 endif
89 if !exists("g:netrw_rcp_cmd")
90   let g:netrw_rcp_cmd   = "rcp"
91 endif
92 if !exists("g:netrw_rsync_cmd")
93   let g:netrw_rsync_cmd = "rsync"
94 endif
95 if !exists("g:netrw_scp_cmd")
96   let g:netrw_scp_cmd   = "scp -q"
97 endif
98 if !exists("g:netrw_sftp_cmd")
99   let g:netrw_sftp_cmd  = "sftp"
100 endif
101 if !exists("g:netrw_ssh_cmd")
102  let g:netrw_ssh_cmd= "ssh"
103 endif
105 if (has("win32") || has("win95") || has("win64") || has("win16"))
106   \ && exists("g:netrw_use_nt_rcp")
107   \ && g:netrw_use_nt_rcp
108   \ && executable( $SystemRoot .'/system32/rcp.exe')
109  let s:netrw_has_nt_rcp = 1
110  let s:netrw_rcpmode    = '-b'
111 else
112  let s:netrw_has_nt_rcp = 0
113  let s:netrw_rcpmode    = ''
114 endif
116 " ---------------------------------------------------------------------
117 " Default values for netrw's global variables {{{2
118 " Cygwin Detection ------- {{{3
119 if !exists("g:netrw_cygwin")
120  if has("win32") || has("win95") || has("win64") || has("win16")
121   if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
122    let g:netrw_cygwin= 1
123   else
124    let g:netrw_cygwin= 0
125   endif
126  else
127   let g:netrw_cygwin= 0
128  endif
129 endif
130 " Default values - a-c ---------- {{{3
131 if !exists("g:netrw_alto")
132  let g:netrw_alto= &sb
133 endif
134 if !exists("g:netrw_altv")
135  let g:netrw_altv= &spr
136 endif
137 if !exists("g:netrw_browse_split")
138  let g:netrw_browse_split= 0
139 endif
140 if !exists("g:netrw_chgwin")
141  let g:netrw_chgwin    = -1
142 endif
143 if !exists("g:netrw_compress")
144  let g:netrw_compress= "gzip"
145 endif
146 if !exists("g:netrw_ctags")
147  let g:netrw_ctags= "ctags"
148 endif
149 " Default values - d-g ---------- {{{3
150 if !exists("g:NETRW_DIRHIST_CNT")
151  let g:NETRW_DIRHIST_CNT= 0
152 endif
153 if !exists("g:netrw_decompress")
154  let g:netrw_decompress= { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"}
155 endif
156 if !exists("g:netrw_dirhistmax")
157  let g:netrw_dirhistmax= 10
158 endif
159 if !exists("g:netrw_fastbrowse")
160  let g:netrw_fastbrowse= 1
161 endif
162 if !exists("g:netrw_ftp_browse_reject")
163  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$'
164 endif
165 if !exists("g:netrw_ftp_list_cmd")
166  if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
167   let g:netrw_ftp_list_cmd     = "ls -lF"
168   let g:netrw_ftp_timelist_cmd = "ls -tlF"
169   let g:netrw_ftp_sizelist_cmd = "ls -slF"
170  else
171   let g:netrw_ftp_list_cmd     = "dir"
172   let g:netrw_ftp_timelist_cmd = "dir"
173   let g:netrw_ftp_sizelist_cmd = "dir"
174  endif
175 endif
176 if !exists("g:netrw_ftpmode")
177  let g:netrw_ftpmode= "binary"
178 endif
179 " Default values - h-lh ---------- {{{3
180 if !exists("g:netrw_hide")
181  let g:netrw_hide= 1
182 endif
183 if !exists("g:netrw_ignorenetrc")
184  if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
185   let g:netrw_ignorenetrc= 1
186  else
187   let g:netrw_ignorenetrc= 0
188  endif
189 endif
190 if !exists("g:netrw_keepdir")
191  let g:netrw_keepdir= 1
192 endif
193 if !exists("g:netrw_list_cmd")
194  if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
195   " provide a 'pscp' listing command
196   if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk")
197    let g:netrw_scp_cmd ="pscp -i C:\\private.ppk"
198   endif
199   let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:"
200  elseif executable(g:netrw_ssh_cmd)
201   " provide a default listing command
202   let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa"
203  else
204 "  call Decho(g:netrw_ssh_cmd." is not executable")
205   let g:netrw_list_cmd= ""
206  endif
207 endif
208 if !exists("g:netrw_list_hide")
209  let g:netrw_list_hide= ""
210 endif
211 " Default values - lh-lz ---------- {{{3
212 if !exists("g:netrw_localcopycmd")
213  if has("win32") || has("win95") || has("win64") || has("win16")
214   if g:netrw_cygwin
215    let g:netrw_localcopycmd= "cp"
216   else
217    let g:netrw_localcopycmd= "copy"
218   endif
219  elseif has("unix") || has("macunix")
220   let g:netrw_localcopycmd= "cp"
221  else
222   let g:netrw_localcopycmd= ""
223  endif
224 endif
225 if !exists("g:netrw_local_mkdir")
226  let g:netrw_local_mkdir= "mkdir"
227 endif
228 if !exists("g:netrw_localmovecmd")
229  if has("win32") || has("win95") || has("win64") || has("win16")
230   if g:netrw_cygwin
231    let g:netrw_localmovecmd= "mv"
232   else
233    let g:netrw_localmovecmd= "move"
234   endif
235  elseif has("unix") || has("macunix")
236   let g:netrw_localmovecmd= "mv"
237  else
238   let g:netrw_localmovecmd= ""
239  endif
240 endif
241 if !exists("g:netrw_local_rmdir")
242  let g:netrw_local_rmdir= "rmdir"
243 endif
244 if !exists("g:netrw_liststyle")
245  let g:netrw_liststyle= s:THINLIST
246 endif
247 if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
248  " sanity check
249  let g:netrw_liststyle= s:THINLIST
250 endif
251 if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
252  let g:netrw_list_cmd= g:netrw_list_cmd." -l"
253 endif
254 " Default values - m-r ---------- {{{3
255 if !exists("g:netrw_markfileesc")
256  let g:netrw_markfileesc= '*./[\~'
257 endif
258 if !exists("g:netrw_maxfilenamelen")
259  let g:netrw_maxfilenamelen= 32
260 endif
261 if !exists("g:netrw_menu")
262  let g:netrw_menu= 1
263 endif
264 if !exists("g:netrw_mkdir_cmd")
265  let g:netrw_mkdir_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir"
266 endif
267 if !exists("g:netrw_mousemaps")
268  if exists("&mouse") && &mouse =~ '[anh]'
269   let g:netrw_mousemaps= 1
270  else
271   let g:netrw_mousemaps= 0
272  endif
273 endif
274 if !exists("g:netrw_retmap")
275  let g:netrw_retmap= 0
276 endif
277 if !exists("g:netrw_preview")
278  let g:netrw_preview= 0
279 endif
280 if !exists("g:netrw_scpport")
281  let g:netrw_scpport= "-P"
282 endif
283 if !exists("g:netrw_sshport")
284  let g:netrw_sshport= "-p"
285 endif
286 if !exists("g:netrw_rename_cmd")
287  let g:netrw_rename_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mv"
288 endif
289 if !exists("g:netrw_rm_cmd")
290  let g:netrw_rm_cmd    = g:netrw_ssh_cmd." USEPORT HOSTNAME rm"
291 endif
292 if !exists("g:netrw_rmdir_cmd")
293  let g:netrw_rmdir_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir"
294 endif
295 if !exists("g:netrw_rmf_cmd")
296  let g:netrw_rmf_cmd    = g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f"
297 endif
298 " Default values - s ---------- {{{3
299  " set up shell quoting character
300 if exists("g:netrw_silent") && g:netrw_silent != 0
301  let s:netrw_silentxfer= "silent "
302 else
303  let s:netrw_silentxfer= ""
304 endif
305 if !exists("g:netrw_sort_by")
306  " alternatives: date size
307  let g:netrw_sort_by= "name"
308 endif
309 if !exists("g:netrw_sort_options")
310  let g:netrw_sort_options= ""
311 endif
312 if !exists("g:netrw_sort_direction")
313  " alternative: reverse  (z y x ...)
314  let g:netrw_sort_direction= "normal"
315 endif
316 if !exists("g:netrw_sort_sequence")
317  let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
318 endif
319 if !exists("g:netrw_special_syntax")
320  let g:netrw_special_syntax= 0
321 endif
322 if !exists("g:netrw_ssh_browse_reject")
323   let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
324 endif
325 if !has("patch192")
326  if !exists("g:netrw_use_noswf")
327   let g:netrw_use_noswf= 1
328  endif
329 else
330   let g:netrw_use_noswf= 0
331 endif
332 " Default values - t-w ---------- {{{3
333 if !exists("g:netrw_timefmt")
334  let g:netrw_timefmt= "%c"
335 endif
336 if !exists("g:netrw_xstrlen")
337  let g:netrw_xstrlen= 1
338 endif
339 if !exists("g:NetrwTopLvlMenu")
340  let g:NetrwTopLvlMenu= "Netrw."
341 endif
342 if !exists("g:netrw_use_errorwindow")
343  let g:netrw_use_errorwindow= 1
344 endif
345 if !exists("g:netrw_win95ftp")
346  let g:netrw_win95ftp= 1
347 endif
348 if !exists("g:netrw_winsize")
349  let g:netrw_winsize= ""
350 endif
351 " ---------------------------------------------------------------------
352 " Default values for netrw's script variables: {{{2
353 if !exists("g:netrw_fname_escape")
354  let g:netrw_fname_escape= ' ?&;%'
355 endif
356 if !exists("g:netrw_glob_escape")
357   let g:netrw_glob_escape= '[]*?`{~$'
358 endif
359 if !exists("g:netrw_tmpfile_escape")
360  let g:netrw_tmpfile_escape= ' &;'
361 endif
363 " BufEnter event ignored by decho when following variable is true
364 "  Has a side effect that doau BufReadPost doesn't work, so
365 "  files read by network transfer aren't appropriately highlighted.
366 "let g:decho_bufenter = 1       "Decho
368 " ==============================
369 "  Netrw Utility Functions: {{{1
370 " ==============================
372 " ------------------------------------------------------------------------
373 " s:NetrwOptionSave: save options and set to "standard" form {{{2
374 "  06/08/07 : removed call to NetrwSafeOptions(), either placed
375 "             immediately after NetrwOptionSave() calls in NetRead
376 "             and NetWrite, or after the s:NetrwEnew() call in
377 "             NetrwBrowse.
378 "             vt: normally its "w:" or "s:" (a variable type)
379 fun! s:NetrwOptionSave(vt)
380 "  call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">")
382 "  call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"))
383   if !exists("{a:vt}netrw_optionsave")
384    let {a:vt}netrw_optionsave= 1
385   else
386 "   call Dret("s:NetrwOptionSave : options already saved")
387    return
388   endif
389 "  call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
391   " Save current settings and current directory
392   let s:yykeep          = @@
393   if exists("&l:acd")
394    let {a:vt}netrw_acdkeep  = &l:acd
395   endif
396   let {a:vt}netrw_aikeep    = &l:ai
397   let {a:vt}netrw_awkeep    = &l:aw
398   let {a:vt}netrw_cikeep    = &l:ci
399   let {a:vt}netrw_cinkeep   = &l:cin
400   let {a:vt}netrw_cinokeep  = &l:cino
401   let {a:vt}netrw_comkeep   = &l:com
402   let {a:vt}netrw_cpokeep   = &l:cpo
403   if g:netrw_keepdir
404    let {a:vt}netrw_dirkeep  = getcwd()
405   endif
406   let {a:vt}netrw_fokeep    = &l:fo           " formatoptions
407   let {a:vt}netrw_gdkeep    = &l:gd           " gdefault
408   let {a:vt}netrw_hidkeep   = &l:hidden
409   let {a:vt}netrw_magickeep = &l:magic
410   let {a:vt}netrw_repkeep   = &l:report
411   let {a:vt}netrw_spellkeep = &l:spell
412   let {a:vt}netrw_twkeep    = &l:tw           " textwidth
413   let {a:vt}netrw_wigkeep   = &l:wig          " wildignore
414   if has("win32") && !has("win95")
415    let {a:vt}netrw_swfkeep  = &l:swf          " swapfile
416   endif
417   if &go =~ 'a' | silent! let {a:vt}netrw_regstar = @* | endif
418   silent! let {a:vt}netrw_regslash= @/
420 "  call Dret("s:NetrwOptionSave : win#".winnr()." buf#".bufnr("%"))
421 endfun
423 " ------------------------------------------------------------------------
424 " s:NetrwOptionRestore: restore options {{{2
425 fun! s:NetrwOptionRestore(vt)
426 "  call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%"))
427   if !exists("{a:vt}netrw_optionsave")
428 "   call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
429 "   call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
430    return
431   endif
432   unlet {a:vt}netrw_optionsave
434   if exists("&acd")
435    if exists("{a:vt}netrw_acdkeep")
436 "    call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
437     let curdir = getcwd()
438     let &l:acd = {a:vt}netrw_acdkeep
439     unlet {a:vt}netrw_acdkeep
440     if &l:acd
441 "     call Decho("exe keepjumps lcd ".fnameescape(curdir))  " NOTE: was g:netrw_fname_escape for some reason
442      try
443       if !exists("&l:acd") && !&l:acd
444        exe 'keepjumps lcd '.fnameescape(curdir)
445       endif
446      catch /^Vim\%((\a\+)\)\=:E472/
447       call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61)
448      endtry
449     endif
450    endif
451   endif
452   if exists("{a:vt}netrw_aikeep")   |let &l:ai     = {a:vt}netrw_aikeep      |unlet {a:vt}netrw_aikeep   |endif
453   if exists("{a:vt}netrw_awkeep")   |let &l:aw     = {a:vt}netrw_awkeep      |unlet {a:vt}netrw_awkeep   |endif
454   if exists("{a:vt}netrw_cikeep")   |let &l:ci     = {a:vt}netrw_cikeep      |unlet {a:vt}netrw_cikeep   |endif
455   if exists("{a:vt}netrw_cinkeep")  |let &l:cin    = {a:vt}netrw_cinkeep     |unlet {a:vt}netrw_cinkeep  |endif
456   if exists("{a:vt}netrw_cinokeep") |let &l:cino   = {a:vt}netrw_cinokeep    |unlet {a:vt}netrw_cinokeep |endif
457   if exists("{a:vt}netrw_comkeep")  |let &l:com    = {a:vt}netrw_comkeep     |unlet {a:vt}netrw_comkeep  |endif
458   if exists("{a:vt}netrw_cpokeep")  |let &l:cpo    = {a:vt}netrw_cpokeep     |unlet {a:vt}netrw_cpokeep  |endif
459   if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir
460    let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
461    if exists("{a:vt}netrw_dirkeep")  |exe "keepjumps lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep  |endif
462   endif
463   if exists("{a:vt}netrw_fokeep")   |let &l:fo     = {a:vt}netrw_fokeep      |unlet {a:vt}netrw_fokeep   |endif
464   if exists("{a:vt}netrw_gdkeep")   |let &l:gd     = {a:vt}netrw_gdkeep      |unlet {a:vt}netrw_gdkeep   |endif
465   if exists("{a:vt}netrw_hidkeep")  |let &l:hidden = {a:vt}netrw_hidkeep     |unlet {a:vt}netrw_hidkeep  |endif
466   if exists("{a:vt}netrw_magic")    |let &l:magic  = {a:vt}netrw_magic       |unlet {a:vt}netrw_magic    |endif
467   if exists("{a:vt}netrw_repkeep")  |let &l:report = {a:vt}netrw_repkeep     |unlet {a:vt}netrw_repkeep  |endif
468   if exists("{a:vt}netrw_spellkeep")|let &l:spell  = {a:vt}netrw_spellkeep   |unlet {a:vt}netrw_spellkeep|endif
469   if exists("{a:vt}netrw_twkeep")   |let &l:tw     = {a:vt}netrw_twkeep      |unlet {a:vt}netrw_twkeep   |endif
470   if exists("{a:vt}netrw_wigkeep")  |let &l:wig    = {a:vt}netrw_wigkeep     |unlet {a:vt}netrw_wigkeep  |endif
471   if exists("s:yykeep")             |let  @@       = s:yykeep                |unlet s:yykeep             |endif
472   if exists("{a:vt}netrw_swfkeep")
473    if &directory == ""
474     " user hasn't specified a swapfile directory;
475     " netrw will temporarily set the swapfile directory
476     " to the current directory as returned by getcwd().
477     let &l:directory   = getcwd()
478     silent! let &l:swf = {a:vt}netrw_swfkeep
479     setlocal directory=
480     unlet {a:vt}netrw_swfkeep
481    elseif &l:swf != {a:vt}netrw_swfkeep
482     " following line causes a Press ENTER in windows -- can't seem to work around it!!!
483     silent! let &l:swf= {a:vt}netrw_swfkeep
484     unlet {a:vt}netrw_swfkeep
485    endif
486   endif
487   if exists("{a:vt}netrw_regstar") |silent! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
488   if exists("{a:vt}netrw_regslash")|silent! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif
490 "  call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
491 "  call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
492 "  call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
493 "  call Dret("s:NetrwOptionRestore : win#".winnr()." buf#".bufnr("%"))
494 endfun
496 " ---------------------------------------------------------------------
497 " s:NetrwSafeOptions: sets options to help netrw do its job {{{2
498 fun! s:NetrwSafeOptions()
499 "  call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">")
500 "  call Decho("window's ft=".&ft)
501   setlocal cino=
502   setlocal com=
503   setlocal cpo-=aA
504   if exists("&acd") | setlocal noacd | endif
505   setlocal nocin noai noci magic nospell nohid wig= noaw
506   setlocal fo=nroql2
507   setlocal tw=0
508   setlocal report=10000
509   if g:netrw_use_noswf && has("win32") && !has("win95")
510    setlocal noswf
511   endif
512 "  call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
513 "  call Dret("s:NetrwSafeOptions")
514 endfun
516 " ---------------------------------------------------------------------
517 " netrw#NetrwClean: remove netrw {{{2
518 " supports :NetrwClean  -- remove netrw from first directory on runtimepath
519 "          :NetrwClean! -- remove netrw from all directories on runtimepath
520 fun! netrw#NetrwClean(sys)
521 "  call Dfunc("netrw#NetrwClean(sys=".a:sys.")")
523   if a:sys
524    let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
525   else
526    let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
527   endif
528 "  call Decho("choice=".choice)
529   let diddel= 0
530   let diddir= ""
532   if choice == 1
533    for dir in split(&rtp,',')
534     if filereadable(dir."/plugin/netrwPlugin.vim")
535 "     call Decho("removing netrw-related files from ".dir)
536      if s:NetrwDelete(dir."/plugin/netrwPlugin.vim")        |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55)        |endif
537      if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
538      if s:NetrwDelete(dir."/autoload/netrwSettings.vim")    |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55)    |endif
539      if s:NetrwDelete(dir."/autoload/netrw.vim")            |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55)            |endif
540      if s:NetrwDelete(dir."/syntax/netrw.vim")              |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55)              |endif
541      if s:NetrwDelete(dir."/syntax/netrwlist.vim")          |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrwlist.vim",55)          |endif
542      let diddir= dir
543      let diddel= diddel + 1
544      if !a:sys|break|endif
545     endif
546    endfor
547   endif
549    echohl WarningMsg
550   if diddel == 0
551    echomsg "netrw is either not installed or not removable"
552   elseif diddel == 1
553    echomsg "removed one copy of netrw from <".diddir.">"
554   else
555    echomsg "removed ".diddel." copies of netrw"
556   endif
557    echohl None
559 "  call Dret("netrw#NetrwClean")
560 endfun
562 " ------------------------------------------------------------------------
563 "  Netrw Transfer Functions: {{{1
564 " ===============================
566 " ------------------------------------------------------------------------
567 " netrw#NetRead: responsible for reading a file over the net {{{2
568 "   mode: =0 read remote file and insert before current line
569 "         =1 read remote file and insert after current line
570 "         =2 replace with remote file
571 "         =3 obtain file, but leave in temporary format
572 fun! netrw#NetRead(mode,...)
573 "  call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw)
575   " save options {{{3
576   call s:NetrwOptionSave("w:")
577   call s:NetrwSafeOptions()
579   " interpret mode into a readcmd {{{3
580   if     a:mode == 0 " read remote file before current line
581    let readcmd = "0r"
582   elseif a:mode == 1 " read file after current line
583    let readcmd = "r"
584   elseif a:mode == 2 " replace with remote file
585    let readcmd = "%r"
586   elseif a:mode == 3 " skip read of file (leave as temporary)
587    let readcmd = "t"
588   else
589    exe a:mode
590    let readcmd = "r"
591   endif
592   let ichoice = (a:0 == 0)? 0 : 1
593 "  call Decho("readcmd<".readcmd."> ichoice=".ichoice)
595   " Get Temporary Filename {{{3
596   let tmpfile= s:GetTempfile("")
597   if tmpfile == ""
598 "   call Dret("netrw#NetRead : unable to get a tempfile!")
599    return
600   endif
602   while ichoice <= a:0
604    " attempt to repeat with previous host-file-etc
605    if exists("b:netrw_lastfile") && a:0 == 0
606 "    call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
607     let choice = b:netrw_lastfile
608     let ichoice= ichoice + 1
610    else
611     exe "let choice= a:" . ichoice
612 "    call Decho("no lastfile: choice<" . choice . ">")
614     if match(choice,"?") == 0
615      " give help
616      echomsg 'NetRead Usage:'
617      echomsg ':Nread machine:path                         uses rcp'
618      echomsg ':Nread "machine path"                       uses ftp   with <.netrc>'
619      echomsg ':Nread "machine id password path"           uses ftp'
620      echomsg ':Nread dav://machine[:port]/path            uses cadaver'
621      echomsg ':Nread fetch://machine/path                 uses fetch'
622      echomsg ':Nread ftp://[user@]machine[:port]/path     uses ftp   autodetects <.netrc>'
623      echomsg ':Nread http://[user@]machine/path           uses http  wget'
624      echomsg ':Nread rcp://[user@]machine/path            uses rcp'
625      echomsg ':Nread rsync://machine[:port]/path          uses rsync'
626      echomsg ':Nread scp://[user@]machine[[:#]port]/path  uses scp'
627      echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
628      sleep 4
629      break
631     elseif match(choice,'^"') != -1
632      " Reconstruct Choice if choice starts with '"'
633 "     call Decho("reconstructing choice")
634      if match(choice,'"$') != -1
635       " case "..."
636       let choice=strpart(choice,1,strlen(choice)-2)
637      else
638        "  case "... ... ..."
639       let choice      = strpart(choice,1,strlen(choice)-1)
640       let wholechoice = ""
642       while match(choice,'"$') == -1
643        let wholechoice = wholechoice . " " . choice
644        let ichoice     = ichoice + 1
645        if ichoice > a:0
646         if !exists("g:netrw_quiet")
647          call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
648         endif
649 "        call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
650         return
651        endif
652        let choice= a:{ichoice}
653       endwhile
654       let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
655      endif
656     endif
657    endif
659 "   call Decho("choice<" . choice . ">")
660    let ichoice= ichoice + 1
662    " Determine method of read (ftp, rcp, etc) {{{3
663    call s:NetrwMethod(choice)
664    let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
666    " Check if NetrwBrowse() should be handling this request
667 "   call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
668    if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^http://'
669 "    call Decho("yes, choice matches '^.*[\/]$'")
670     keepjumps call s:NetrwBrowse(0,choice)
671 "    call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
672     return
673    endif
675    " ============
676    " Perform Protocol-Based Read {{{3
677    " ===========================
678    if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
679     echo "(netrw) Processing your read request..."
680    endif
682    ".........................................
683    " rcp:  NetRead Method #1 {{{3
684    if  b:netrw_method == 1 " read with rcp
685 "    call Decho("read via rcp (method #1)")
686    " ER: nothing done with g:netrw_uid yet?
687    " ER: on Win2K" rcp machine[.user]:file tmpfile
688    " ER: if machine contains '.' adding .user is required (use $USERNAME)
689    " ER: the tmpfile is full path: rcp sees C:\... as host C
690    if s:netrw_has_nt_rcp == 1
691     if exists("g:netrw_uid") && ( g:netrw_uid != "" )
692      let uid_machine = g:netrw_machine .'.'. g:netrw_uid
693     else
694      " Any way needed it machine contains a '.'
695      let uid_machine = g:netrw_machine .'.'. $USERNAME
696     endif
697    else
698     if exists("g:netrw_uid") && ( g:netrw_uid != "" )
699      let uid_machine = g:netrw_uid .'@'. g:netrw_machine
700     else
701      let uid_machine = g:netrw_machine
702     endif
703    endif
704 "   call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
705    exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
706    let result           = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
707    let b:netrw_lastfile = choice
709    ".........................................
710    " ftp + <.netrc>:  NetRead Method #2 {{{3
711    elseif b:netrw_method  == 2          " read with ftp + <.netrc>
712 "     call Decho("read via ftp+.netrc (method #2)")
713      let netrw_fname= b:netrw_fname
714      call s:SaveBufVars()|new|call s:RestoreBufVars()
715      setlocal ff=unix
716      exe "put ='".g:netrw_ftpmode."'"
717 "     call Decho("filter input: ".getline('.'))
718      if exists("g:netrw_ftpextracmd")
719       exe "put ='".g:netrw_ftpextracmd."'"
720 "      call Decho("filter input: ".getline('.'))
721      endif
722      exe "put ='".'get \"'.netrw_fname.'\" '.tmpfile."'"
723 "     call Decho("filter input: ".getline('.'))
724      if exists("g:netrw_port") && g:netrw_port != ""
725 "      call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1))
726       exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1)
727      else
728 "      call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
729       exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
730      endif
731      " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
732      if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
733       let debugkeep = &debug
734       setlocal debug=msg
735       call netrw#ErrorMsg(s:ERROR,getline(1),4)
736       let &debug    = debugkeep
737      endif
738      call s:SaveBufVars()|bd!|call s:RestoreBufVars()
739      let result           = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
740      let b:netrw_lastfile = choice
742    ".........................................
743    " ftp + machine,id,passwd,filename:  NetRead Method #3 {{{3
744    elseif b:netrw_method == 3           " read with ftp + machine, id, passwd, and fname
745     " Construct execution string (four lines) which will be passed through filter
746 "    call Decho("read via ftp+mipf (method #3)")
747     let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
748     call s:SaveBufVars()|new|call s:RestoreBufVars()
749     setlocal ff=unix
750     if exists("g:netrw_port") && g:netrw_port != ""
751      put ='open '.g:netrw_machine.' '.g:netrw_port
752 "     call Decho("filter input: ".getline('.'))
753     else
754      put ='open '.g:netrw_machine
755 "     call Decho("filter input: ".getline('.'))
756     endif
758     if exists("g:netrw_ftp") && g:netrw_ftp == 1
759      put =g:netrw_uid
760 "     call Decho("filter input: ".getline('.'))
761      put ='\"'.s:netrw_passwd.'\"'
762 "     call Decho("filter input: ".getline('.'))
763     else
764      put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
765 "     call Decho("filter input: ".getline('.'))
766     endif
768     if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
769      put =g:netrw_ftpmode
770 "     call Decho("filter input: ".getline('.'))
771     endif
772     if exists("g:netrw_ftpextracmd")
773      exe "put ='".g:netrw_ftpextracmd."'"
774 "     call Decho("filter input: ".getline('.'))
775     endif
776     put ='get \"'.netrw_fname.'\" '.tmpfile
777 "    call Decho("filter input: ".getline('.'))
779     " perform ftp:
780     " -i       : turns off interactive prompting from ftp
781     " -n  unix : DON'T use <.netrc>, even though it exists
782     " -n  win32: quit being obnoxious about password
783     norm! 1Gdd
784 "    call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
785     exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
786     " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
787     if getline(1) !~ "^$"
788 "     call Decho("error<".getline(1).">")
789      if !exists("g:netrw_quiet")
790       call netrw#ErrorMsg(s:ERROR,getline(1),5)
791      endif
792     endif
793     call s:SaveBufVars()|bd!|call s:RestoreBufVars()
794     let result           = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
795     let b:netrw_lastfile = choice
797    ".........................................
798    " scp: NetRead Method #4 {{{3
799    elseif     b:netrw_method  == 4      " read with scp
800 "    call Decho("read via scp (method #4)")
801     if exists("g:netrw_port") && g:netrw_port != ""
802      let useport= " ".g:netrw_scpport." ".g:netrw_port
803     else
804      let useport= ""
805     endif
806 "    call Decho("exe s:netrw_silentxfer.!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
807     exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)
808     let result           = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
809     let b:netrw_lastfile = choice
811    ".........................................
812    " http: NetRead Method #5 (wget) {{{3
813    elseif     b:netrw_method  == 5
814 "    call Decho("read via http (method #5)")
815     if g:netrw_http_cmd == ""
816      if !exists("g:netrw_quiet")
817       call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
818      endif
819 "     call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
820      return
821     endif
823     if match(b:netrw_fname,"#") == -1
824      " using g:netrw_http_cmd (usually wget or curl)
825 "     call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)")
826 "     call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_fname,1))
827      exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)
828      let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
830     else
831      " wget/curl plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
832 "     call Decho(("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
833      let netrw_html= substitute(b:netrw_fname,"#.*$","","")
834      let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
835 "     call Decho("netrw_html<".netrw_html.">")
836 "     call Decho("netrw_tag <".netrw_tag.">")
837 "     call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1))
838      exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1)
839      let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
840 "     call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
841      exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
842     endif
843     let b:netrw_lastfile = choice
844     setlocal ro
846    ".........................................
847    " cadaver: NetRead Method #6 {{{3
848    elseif     b:netrw_method  == 6
849 "    call Decho("read via cadaver (method #6)")
851     " Construct execution string (four lines) which will be passed through filter
852     let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
853     new
854     setlocal ff=unix
855     if exists("g:netrw_port") && g:netrw_port != ""
856      put ='open '.g:netrw_machine.' '.g:netrw_port
857     else
858      put ='open '.g:netrw_machine
859     endif
860     put ='user '.g:netrw_uid.' '.s:netrw_passwd
861     put ='get '.netrw_fname.' '.tmpfile
862     put ='quit'
864     " perform cadaver operation:
865     norm! 1Gdd
866 "    call Decho("executing: %!".g:netrw_dav_cmd)
867     exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
868     bd!
869     let result           = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
870     let b:netrw_lastfile = choice
872    ".........................................
873    " rsync: NetRead Method #7 {{{3
874    elseif     b:netrw_method  == 7
875 "    call Decho("read via rsync (method #7)")
876 "    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
877     exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)
878     let result           = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
879     let b:netrw_lastfile = choice
881    ".........................................
882    " fetch: NetRead Method #8 {{{3
883    "    fetch://[user@]host[:http]/path
884    elseif     b:netrw_method  == 8
885 "    call Decho("read via fetch (method #8)")
886     if g:netrw_fetch_cmd == ""
887      if !exists("g:netrw_quiet")
888       call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
889      endif
890 "     call Dret("NetRead")
891     endif
892     if exists("g:netrw_option") && g:netrw_option == ":http"
893      let netrw_option= "http"
894     else
895      let netrw_option= "ftp"
896     endif
897 "    call Decho("read via fetch for ".netrw_option)
899     if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
900 "     call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1))
901      exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1)
902     else
903 "     call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1))
904      exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1)
905     endif
907     let result          = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
908     let b:netrw_lastfile = choice
909     setlocal ro
911    ".........................................
912    " sftp: NetRead Method #9 {{{3
913    elseif     b:netrw_method  == 9
914 "    call Decho("read via sftp (method #9)")
915 "    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
916     exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile
917     let result          = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
918     let b:netrw_lastfile = choice
920    ".........................................
921    " Complain {{{3
922    else
923     call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
924    endif
925   endwhile
927   " cleanup {{{3
928   if exists("b:netrw_method")
929 "   call Decho("cleanup b:netrw_method and b:netrw_fname")
930    unlet b:netrw_method
931    unlet b:netrw_fname
932   endif
933   if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't'
934 "   call Decho("cleanup by deleting tmpfile<".tmpfile.">")
935    call s:NetrwDelete(fnameescape(tmpfile))
936   endif
937   call s:NetrwOptionRestore("w:")
939 "  call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
940 endfun
942 " ------------------------------------------------------------------------
943 " netrw#NetWrite: responsible for writing a file over the net {{{2
944 fun! netrw#NetWrite(...) range
945 "  call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
947   " option handling
948   let mod= 0
949   call s:NetrwOptionSave("w:")
950   call s:NetrwSafeOptions()
952   " Get Temporary Filename {{{3
953   let tmpfile= s:GetTempfile("")
954   if tmpfile == ""
955 "   call Dret("netrw#NetWrite : unable to get a tempfile!")
956    return
957   endif
959   if a:0 == 0
960    let ichoice = 0
961   else
962    let ichoice = 1
963   endif
965   let curbufname= expand("%")
966 "  call Decho("curbufname<".curbufname.">")
967   if &binary
968    " For binary writes, always write entire file.
969    " (line numbers don't really make sense for that).
970    " Also supports the writing of tar and zip files.
971 "   call Decho("(write entire file) silent exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
972    silent exe "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
973   elseif g:netrw_cygwin
974    " write (selected portion of) file to temporary
975    let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','')
976 "   call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile))
977    silent exe a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
978   else
979    " write (selected portion of) file to temporary
980 "   call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
981    silent exe a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
982   endif
984   if curbufname == ""
985    " if the file is [No Name], and one attempts to Nwrite it, the buffer takes
986    " on the temporary file's name.  Deletion of the temporary file during
987    " cleanup then causes an error message.
988    0file!
989   endif
991   " While choice loop: {{{3
992   while ichoice <= a:0
994    " Process arguments: {{{4
995    " attempt to repeat with previous host-file-etc
996    if exists("b:netrw_lastfile") && a:0 == 0
997 "    call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
998     let choice = b:netrw_lastfile
999     let ichoice= ichoice + 1
1000    else
1001     exe "let choice= a:" . ichoice
1003     " Reconstruct Choice if choice starts with '"'
1004     if match(choice,"?") == 0
1005      echomsg 'NetWrite Usage:"'
1006      echomsg ':Nwrite machine:path                        uses rcp'
1007      echomsg ':Nwrite "machine path"                      uses ftp with <.netrc>'
1008      echomsg ':Nwrite "machine id password path"          uses ftp'
1009      echomsg ':Nwrite dav://[user@]machine/path           uses cadaver'
1010      echomsg ':Nwrite fetch://[user@]machine/path         uses fetch'
1011      echomsg ':Nwrite ftp://machine[#port]/path           uses ftp  (autodetects <.netrc>)'
1012      echomsg ':Nwrite rcp://machine/path                  uses rcp'
1013      echomsg ':Nwrite rsync://[user@]machine/path         uses rsync'
1014      echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
1015      echomsg ':Nwrite sftp://[user@]machine/path          uses sftp'
1016      sleep 4
1017      break
1019     elseif match(choice,"^\"") != -1
1020      if match(choice,"\"$") != -1
1021        " case "..."
1022       let choice=strpart(choice,1,strlen(choice)-2)
1023      else
1024       "  case "... ... ..."
1025       let choice      = strpart(choice,1,strlen(choice)-1)
1026       let wholechoice = ""
1028       while match(choice,"\"$") == -1
1029        let wholechoice= wholechoice . " " . choice
1030        let ichoice    = ichoice + 1
1031        if choice > a:0
1032         if !exists("g:netrw_quiet")
1033          call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
1034         endif
1035 "        call Dret("netrw#NetWrite")
1036         return
1037        endif
1038        let choice= a:{ichoice}
1039       endwhile
1040       let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1041      endif
1042     endif
1043    endif
1044    let ichoice= ichoice + 1
1045 "   call Decho("choice<" . choice . "> ichoice=".ichoice)
1047    " Determine method of write (ftp, rcp, etc) {{{4
1048    call s:NetrwMethod(choice)
1050    " =============
1051    " Perform Protocol-Based Write {{{4
1052    " ============================
1053    if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1054     echo "(netrw) Processing your write request..."
1055 "    call Decho("(netrw) Processing your write request...")
1056    endif
1058    ".........................................
1059    " rcp: NetWrite Method #1 {{{4
1060    if  b:netrw_method == 1
1061 "    call Decho("write via rcp (method #1)")
1062     if s:netrw_has_nt_rcp == 1
1063      if exists("g:netrw_uid") &&  ( g:netrw_uid != "" )
1064       let uid_machine = g:netrw_machine .'.'. g:netrw_uid
1065      else
1066       let uid_machine = g:netrw_machine .'.'. $USERNAME
1067      endif
1068     else
1069      if exists("g:netrw_uid") &&  ( g:netrw_uid != "" )
1070       let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1071      else
1072       let uid_machine = g:netrw_machine
1073      endif
1074     endif
1075 "    call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1))
1076     exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1)
1077     let b:netrw_lastfile = choice
1079    ".........................................
1080    " ftp + <.netrc>: NetWrite Method #2 {{{4
1081    elseif b:netrw_method == 2
1082 "    call Decho("write via ftp+.netrc (method #2)")
1083     let netrw_fname= b:netrw_fname
1084     new
1085 "    call Decho("filter input window#".winnr())
1086     setlocal ff=unix
1087     exe "put ='".g:netrw_ftpmode."'"
1088 "    call Decho("filter input: ".getline('.'))
1089     if exists("g:netrw_ftpextracmd")
1090      exe "put ='".g:netrw_ftpextracmd."'"
1091 "     call Decho("filter input: ".getline('.'))
1092     endif
1093     exe "put ='".'put \"'.tmpfile.'\" \"'.netrw_fname.'\"'."'"
1094 "    call Decho("filter input: ".getline('.'))
1095     if exists("g:netrw_port") && g:netrw_port != ""
1096 "     call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1097      exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
1098     else
1099 "     call Decho("filter input window#".winnr())
1100 "     call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1101      exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
1102     endif
1103     " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1104     if getline(1) !~ "^$"
1105      if !exists("g:netrw_quiet")
1106       call netrw#ErrorMsg(s:ERROR,getline(1),14)
1107      endif
1108      let mod=1
1109     endif
1110     bd!
1111     let b:netrw_lastfile = choice
1113    ".........................................
1114    " ftp + machine, id, passwd, filename: NetWrite Method #3 {{{4
1115    elseif b:netrw_method == 3
1116     " Construct execution string (four lines) which will be passed through filter
1117 "    call Decho("read via ftp+mipf (method #3)")
1118     let netrw_fname= b:netrw_fname
1119     new
1120     setlocal ff=unix
1121     if exists("g:netrw_port") && g:netrw_port != ""
1122      put ='open '.g:netrw_machine.' '.g:netrw_port
1123 "     call Decho("filter input: ".getline('.'))
1124     else
1125      put ='open '.g:netrw_machine
1126 "     call Decho("filter input: ".getline('.'))
1127     endif
1128     if exists("g:netrw_ftp") && g:netrw_ftp == 1
1129      put =g:netrw_uid
1130 "     call Decho("filter input: ".getline('.'))
1131      put ='\"'.s:netrw_passwd.'\"'
1132 "     call Decho("filter input: ".getline('.'))
1133     else
1134      put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1135 "     call Decho("filter input: ".getline('.'))
1136     endif
1137     put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
1138 "    call Decho("filter input: ".getline('.'))
1139     " save choice/id/password for future use
1140     let b:netrw_lastfile = choice
1142     " perform ftp:
1143     " -i       : turns off interactive prompting from ftp
1144     " -n  unix : DON'T use <.netrc>, even though it exists
1145     " -n  win32: quit being obnoxious about password
1146     norm! 1Gdd
1147 "    call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
1148     exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
1149     " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1150     if getline(1) !~ "^$"
1151      if  !exists("g:netrw_quiet")
1152       call netrw#ErrorMsg(s:ERROR,getline(1),15)
1153      endif
1154      let mod=1
1155     endif
1156     bd!
1158    ".........................................
1159    " scp: NetWrite Method #4 {{{4
1160    elseif     b:netrw_method == 4
1161 "    call Decho("write via scp (method #4)")
1162     if exists("g:netrw_port") && g:netrw_port != ""
1163      let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
1164     else
1165      let useport= ""
1166     endif
1167 "    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1168     exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)
1169     let b:netrw_lastfile = choice
1171    ".........................................
1172    " http: NetWrite Method #5 {{{4
1173    elseif     b:netrw_method == 5
1174 "    call Decho("write via http (method #5)")
1175     if !exists("g:netrw_quiet")
1176      call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16)
1177     endif
1179    ".........................................
1180    " dav: NetWrite Method #6 (cadaver) {{{4
1181    elseif     b:netrw_method == 6
1182 "    call Decho("write via cadaver (method #6)")
1184     " Construct execution string (four lines) which will be passed through filter
1185     let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
1186     new
1187     setlocal ff=unix
1188     if exists("g:netrw_port") && g:netrw_port != ""
1189      put ='open '.g:netrw_machine.' '.g:netrw_port
1190     else
1191      put ='open '.g:netrw_machine
1192     endif
1193     if exists("g:netrw_uid") && exists("s:netrw_passwd")
1194      put ='user '.g:netrw_uid.' '.s:netrw_passwd
1195     endif
1196     put ='put '.tmpfile.' '.netrw_fname
1198     " perform cadaver operation:
1199     norm! 1Gdd
1200 "    call Decho("executing: %!".g:netrw_dav_cmd)
1201     exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
1202     bd!
1203     let b:netrw_lastfile = choice
1205    ".........................................
1206    " rsync: NetWrite Method #7 {{{4
1207    elseif     b:netrw_method == 7
1208 "    call Decho("write via rsync (method #7)")
1209 "    call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
1210     exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)
1211     let b:netrw_lastfile = choice
1213    ".........................................
1214    " sftp: NetWrite Method #9 {{{4
1215    elseif     b:netrw_method == 9
1216 "    call Decho("read via sftp (method #9)")
1217     let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
1218     if exists("g:netrw_uid") &&  ( g:netrw_uid != "" )
1219      let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1220     else
1221      let uid_machine = g:netrw_machine
1222     endif
1223     new
1224     setlocal ff=unix
1225     put ='put \"'.escape(tmpfile,'\').'\" '.netrw_fname
1226 "    call Decho("filter input: ".getline('.'))
1227     norm! 1Gdd
1228 "    call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1))
1229     exe s:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1)
1230     bd!
1231     let b:netrw_lastfile= choice
1233    ".........................................
1234    " Complain {{{4
1235    else
1236     call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
1237    endif
1238   endwhile
1240   " Cleanup: {{{3
1241 "  call Decho("cleanup")
1242   if s:FileReadable(tmpfile)
1243 "   call Decho("tmpfile<".tmpfile."> readable, will now delete it")
1244    call s:NetrwDelete(tmpfile)
1245   endif
1246   call s:NetrwOptionRestore("w:")
1248   if a:firstline == 1 && a:lastline == line("$")
1249    " restore modifiability; usually equivalent to set nomod
1250    let &mod= mod
1251   endif
1253 "  call Dret("netrw#NetWrite")
1254 endfun
1256 " ---------------------------------------------------------------------
1257 " netrw#NetSource: source a remotely hosted vim script {{{2
1258 " uses NetRead to get a copy of the file into a temporarily file,
1259 "              then sources that file,
1260 "              then removes that file.
1261 fun! netrw#NetSource(...)
1262 "  call Dfunc("netrw#NetSource() a:0=".a:0)
1263   if a:0 > 0 && a:1 == '?'
1264    " give help
1265    echomsg 'NetSource Usage:'
1266    echomsg ':Nsource dav://machine[:port]/path            uses cadaver'
1267    echomsg ':Nsource fetch://machine/path                 uses fetch'
1268    echomsg ':Nsource ftp://[user@]machine[:port]/path     uses ftp   autodetects <.netrc>'
1269    echomsg ':Nsource http://[user@]machine/path           uses http  wget'
1270    echomsg ':Nsource rcp://[user@]machine/path            uses rcp'
1271    echomsg ':Nsource rsync://machine[:port]/path          uses rsync'
1272    echomsg ':Nsource scp://[user@]machine[[:#]port]/path  uses scp'
1273    echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
1274    sleep 4
1275   else
1276    let i= 1
1277    while i <= a:0
1278     call netrw#NetRead(3,a:{i})
1279 "    call Decho("s:netread_tmpfile<".s:netrw_tmpfile.">")
1280     if s:FileReadable(s:netrw_tmpfile)
1281 "     call Decho("exe so ".s:netrw_tmpfile)
1282      exe "so ".s:netrw_tmpfile
1283      call delete(s:netrw_tmpfile)
1284      unlet s:netrw_tmpfile
1285     else
1286      call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
1287     endif
1288     let i= i + 1
1289    endwhile
1290   endif
1291 "  call Dret("netrw#NetSource")
1292 endfun
1294 " ===========================================
1295 " s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
1296 "    readcmd == %r : replace buffer with newly read file
1297 "            == 0r : read file at top of buffer
1298 "            == r  : read file after current line
1299 "            == t  : leave file in temporary form (ie. don't read into buffer)
1300 fun! s:NetrwGetFile(readcmd, tfile, method)
1301 "  call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
1303   " readcmd=='t': simply do nothing
1304   if a:readcmd == 't'
1305 "   call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
1306 "   call Dret("NetrwGetFile : skip read of <".a:tfile.">")
1307    return
1308   endif
1310   " get name of remote filename (ie. url and all)
1311   let rfile= bufname("%")
1312 "  call Decho("rfile<".rfile.">")
1314   if exists("*NetReadFixup")
1315    " for the use of NetReadFixup (not otherwise used internally)
1316    let line2= line("$")
1317   endif
1319   if a:readcmd[0] == '%'
1320   " get file into buffer
1321 "   call Decho("get file into buffer")
1323    " rename the current buffer to the temp file (ie. tfile)
1324    if g:netrw_cygwin
1325     let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','')
1326    else
1327     let tfile= a:tfile
1328    endif
1329 "   call Decho("exe silent! keepalt file ".fnameescape(tfile))
1330    exe "silent! keepalt file ".fnameescape(tfile)
1332    " edit temporary file (ie. read the temporary file in)
1333    if     rfile =~ '\.zip$'
1334 "    call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)")
1335     call zip#Browse(tfile)
1336    elseif rfile =~ '\.tar$'
1337 "    call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)")
1338     call tar#Browse(tfile)
1339    elseif rfile =~ '\.tar\.gz'
1340 "    call Decho("handling remote gzip-compressed tar file")
1341     call tar#Browse(tfile)
1342    elseif rfile =~ '\.tar\.bz2'
1343 "    call Decho("handling remote bz2-compressed tar file")
1344     call tar#Browse(tfile)
1345    else
1346 "    call Decho("edit temporary file")
1347     e!
1348    endif
1350    " rename buffer back to remote filename
1351 "   call Decho("exe silent! keepalt file ".fnameescape(rfile))
1352    exe "silent! keepalt file ".fnameescape(rfile)
1353    if a:method == 5
1354     set ft=html
1355    else
1356     filetype detect
1357    endif
1358 "   call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
1359    let line1 = 1
1360    let line2 = line("$")
1362   elseif s:FileReadable(a:tfile)
1363    " read file after current line
1364 "   call Decho("read file<".a:tfile."> after current line")
1365    let curline = line(".")
1366    let lastline= line("$")
1367 "   call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile).">  line#".curline)
1368    exe a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
1369    let line1= curline + 1
1370    let line2= line("$") - lastline + 1
1372   else
1373    " not readable
1374 "   call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
1375 "   call Decho("tfile<".a:tfile."> not readable")
1376    call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
1377 "   call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
1378    return
1379   endif
1381   " User-provided (ie. optional) fix-it-up command
1382   if exists("*NetReadFixup")
1383 "   call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
1384    call NetReadFixup(a:method, line1, line2)
1385 "  else " Decho
1386 "   call Decho("NetReadFixup() not called, doesn't exist  (line1=".line1." line2=".line2.")")
1387   endif
1389   if has("gui") && has("menu") && has("gui_running") && &go =~ 'm'
1390    " update the Buffers menu
1391    call s:UpdateBuffersMenu()
1392   endif
1394 "  call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
1396  " make sure file is being displayed
1397 "  redraw!
1399 "  call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
1400 "  call Dret("NetrwGetFile")
1401 endfun
1403 " ------------------------------------------------------------------------
1404 " s:NetrwMethod:  determine method of transfer {{{2
1405 "  method == 1: rcp
1406 "            2: ftp + <.netrc>
1407 "            3: ftp + machine, id, password, and [path]filename
1408 "            4: scp
1409 "            5: http (wget)
1410 "            6: cadaver
1411 "            7: rsync
1412 "            8: fetch
1413 "            9: sftp
1414 fun! s:NetrwMethod(choice)  " globals: method machine id passwd fname
1415 "   call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
1417   " initialization
1418   let b:netrw_method  = 0
1419   let g:netrw_machine = ""
1420   let b:netrw_fname   = ""
1421   let g:netrw_port    = ""
1422   let g:netrw_choice  = a:choice
1424   " Patterns:
1425   " mipf     : a:machine a:id password filename      Use ftp
1426   " mf      : a:machine filename                     Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
1427   " ftpurm   : ftp://[user@]host[[#:]port]/filename  Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
1428   " rcpurm   : rcp://[user@]host/filename            Use rcp
1429   " rcphf    : [user@]host:filename                  Use rcp
1430   " scpurm   : scp://[user@]host[[#:]port]/filename  Use scp
1431   " httpurm  : http://[user@]host/filename           Use wget
1432   " davurm   : dav[s]://host[:port]/path             Use cadaver
1433   " rsyncurm : rsync://host[:port]/path              Use rsync
1434   " fetchurm : fetch://[user@]host[:http]/filename   Use fetch (defaults to ftp, override for http)
1435   " sftpurm  : sftp://[user@]host/filename  Use scp
1436   let mipf     = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
1437   let mf       = '^\(\S\+\)\s\+\(\S\+\)$'
1438   let ftpurm   = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
1439   let rcpurm   = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
1440   let rcphf    = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
1441   let scpurm   = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
1442   let httpurm  = '^http://\([^/]\{-}\)\(/.*\)\=$'
1443   let davurm   = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
1444   let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
1445   let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1446   let sftpurm  = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
1448 "  call Decho("determine method:")
1449   " Determine Method
1450   " rcp://user@hostname/...path-to-file
1451   if match(a:choice,rcpurm) == 0
1452 "   call Decho("rcp://...")
1453    let b:netrw_method  = 1
1454    let userid          = substitute(a:choice,rcpurm,'\1',"")
1455    let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
1456    let b:netrw_fname   = substitute(a:choice,rcpurm,'\3',"")
1457    if userid != ""
1458     let g:netrw_uid= userid
1459    endif
1461   " scp://user@hostname/...path-to-file
1462   elseif match(a:choice,scpurm) == 0
1463 "   call Decho("scp://...")
1464    let b:netrw_method  = 4
1465    let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
1466    let g:netrw_port    = substitute(a:choice,scpurm,'\2',"")
1467    let b:netrw_fname   = substitute(a:choice,scpurm,'\3',"")
1469   " http://user@hostname/...path-to-file
1470   elseif match(a:choice,httpurm) == 0
1471 "   call Decho("http://...")
1472    let b:netrw_method = 5
1473    let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
1474    let b:netrw_fname  = substitute(a:choice,httpurm,'\2',"")
1476   " dav://hostname[:port]/..path-to-file..
1477   elseif match(a:choice,davurm) == 0
1478 "   call Decho("dav://...")
1479    let b:netrw_method= 6
1480    if a:choice =~ '^s'
1481     let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
1482    else
1483     let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
1484    endif
1485    let b:netrw_fname  = substitute(a:choice,davurm,'\3',"")
1487   " rsync://user@hostname/...path-to-file
1488   elseif match(a:choice,rsyncurm) == 0
1489 "   call Decho("rsync://...")
1490    let b:netrw_method = 7
1491    let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
1492    let b:netrw_fname  = substitute(a:choice,rsyncurm,'\2',"")
1494   " ftp://[user@]hostname[[:#]port]/...path-to-file
1495   elseif match(a:choice,ftpurm) == 0
1496 "   call Decho("ftp://...")
1497    let userid         = substitute(a:choice,ftpurm,'\2',"")
1498    let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
1499    let g:netrw_port   = substitute(a:choice,ftpurm,'\4',"")
1500    let b:netrw_fname  = substitute(a:choice,ftpurm,'\5',"")
1501    if userid != ""
1502     let g:netrw_uid= userid
1503    endif
1504    if exists("g:netrw_uid") && exists("s:netrw_passwd")
1505     let b:netrw_method = 3
1506    else
1507     if s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
1508      let b:netrw_method= 2
1509     else
1510      if !exists("g:netrw_uid") || g:netrw_uid == ""
1511       call NetUserPass()
1512      elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
1513       call NetUserPass(g:netrw_uid)
1514     " else just use current g:netrw_uid and s:netrw_passwd
1515      endif
1516      let b:netrw_method= 3
1517     endif
1518    endif
1520   elseif match(a:choice,fetchurm) == 0
1521 "   call Decho("fetch://...")
1522    let b:netrw_method = 8
1523    let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
1524    let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
1525    let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
1526    let b:netrw_fname  = substitute(a:choice,fetchurm,'\5',"")
1528   " Issue an ftp : "machine id password [path/]filename"
1529   elseif match(a:choice,mipf) == 0
1530 "   call Decho("(ftp) host id pass file")
1531    let b:netrw_method  = 3
1532    let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
1533    let g:netrw_uid     = substitute(a:choice,mipf,'\2',"")
1534    let s:netrw_passwd  = substitute(a:choice,mipf,'\3',"")
1535    let b:netrw_fname   = substitute(a:choice,mipf,'\4',"")
1537   " Issue an ftp: "hostname [path/]filename"
1538   elseif match(a:choice,mf) == 0
1539 "   call Decho("(ftp) host file")
1540    if exists("g:netrw_uid") && exists("s:netrw_passwd")
1541     let b:netrw_method  = 3
1542     let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1543     let b:netrw_fname   = substitute(a:choice,mf,'\2',"")
1545    elseif s:FileReadable(expand("$HOME/.netrc"))
1546     let b:netrw_method  = 2
1547     let g:netrw_machine = substitute(a:choice,mf,'\1',"")
1548     let b:netrw_fname   = substitute(a:choice,mf,'\2',"")
1549    endif
1551   " sftp://user@hostname/...path-to-file
1552   elseif match(a:choice,sftpurm) == 0
1553 "   call Decho("sftp://...")
1554    let b:netrw_method = 9
1555    let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
1556    let b:netrw_fname  = substitute(a:choice,sftpurm,'\2',"")
1558   " Issue an rcp: hostname:filename"  (this one should be last)
1559   elseif match(a:choice,rcphf) == 0
1560 "   call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
1561    let b:netrw_method  = 1
1562    let userid          = substitute(a:choice,rcphf,'\2',"")
1563    let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
1564    let b:netrw_fname   = substitute(a:choice,rcphf,'\4',"")
1565 "   call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1566 "   call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1567 "   call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1568 "   call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
1569    if userid != ""
1570     let g:netrw_uid= userid
1571    endif
1573   else
1574    if !exists("g:netrw_quiet")
1575     call netrw#ErrorMsg(s:WARNING,"cannot determine method",45)
1576    endif
1577    let b:netrw_method  = -1
1578   endif
1580   " remove any leading [:#] from port number
1581   if g:netrw_port != ""
1582     let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
1583   endif
1585 "  call Decho("a:choice       <".a:choice.">")
1586 "  call Decho("b:netrw_method <".b:netrw_method.">")
1587 "  call Decho("g:netrw_machine<".g:netrw_machine.">")
1588 "  call Decho("g:netrw_port   <".g:netrw_port.">")
1589 "  if exists("g:netrw_uid")             "Decho
1590 "   call Decho("g:netrw_uid    <".g:netrw_uid.">")
1591 "  endif                                        "Decho
1592 "  if exists("s:netrw_passwd")          "Decho
1593 "   call Decho("s:netrw_passwd <".s:netrw_passwd.">")
1594 "  endif                                        "Decho
1595 "  call Decho("b:netrw_fname  <".b:netrw_fname.">")
1596 "  call Dret("NetrwMethod : b:netrw_method=".b:netrw_method)
1597 endfun
1599 " ------------------------------------------------------------------------
1600 " NetReadFixup: this sort of function is typically written by the user {{{2
1601 "               to handle extra junk that their system's ftp dumps
1602 "               into the transfer.  This function is provided as an
1603 "               example and as a fix for a Windows 95 problem: in my
1604 "               experience, win95's ftp always dumped four blank lines
1605 "               at the end of the transfer.
1606 if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
1607  fun! NetReadFixup(method, line1, line2)
1608 "   call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
1609    if method == 3   " ftp (no <.netrc>)
1610     let fourblanklines= line2 - 3
1611     silent fourblanklines.",".line2."g/^\s*/d"
1612    endif
1613 "   call Dret("NetReadFixup")
1614  endfun
1615 endif
1617 " ---------------------------------------------------------------------
1618 " NetUserPass: set username and password for subsequent ftp transfer {{{2
1619 "   Usage:  :call NetUserPass()                 -- will prompt for userid and password
1620 "           :call NetUserPass("uid")            -- will prompt for password
1621 "           :call NetUserPass("uid","password") -- sets global userid and password
1622 fun! NetUserPass(...)
1624  " get/set userid
1625  if a:0 == 0
1626 "  call Dfunc("NetUserPass(a:0<".a:0.">)")
1627   if !exists("g:netrw_uid") || g:netrw_uid == ""
1628    " via prompt
1629    let g:netrw_uid= input('Enter username: ')
1630   endif
1631  else   " from command line
1632 "  call Dfunc("NetUserPass(a:1<".a:1.">) {")
1633   let g:netrw_uid= a:1
1634  endif
1636  " get password
1637  if a:0 <= 1 " via prompt
1638 "  call Decho("a:0=".a:0." case <=1:")
1639   let s:netrw_passwd= inputsecret("Enter Password: ")
1640  else " from command line
1641 "  call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
1642   let s:netrw_passwd=a:2
1643  endif
1645 "  call Dret("NetUserPass")
1646 endfun
1648 " ===========================================
1649 "  Shared Browsing Support:    {{{1
1650 " ===========================================
1652 " ---------------------------------------------------------------------
1653 " s:BrowserMaps: {{{2
1654 fun! s:BrowserMaps(islocal)
1655 "  call Dfunc("s:BrowserMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
1656   if a:islocal
1657    nnoremap <buffer> <silent> <cr>      :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
1658    nnoremap <buffer> <silent> -         :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
1659    nnoremap <buffer> <silent> a         :call <SID>NetrwHide(1)<cr>
1660    nnoremap <buffer> <silent> mb        :<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr>
1661    nnoremap <buffer> <silent> mc        :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
1662    nnoremap <buffer> <silent> md        :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
1663    nnoremap <buffer> <silent> me        :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
1664    nnoremap <buffer> <silent> mf        :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1665    nnoremap <buffer> <silent> mg        :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
1666    nnoremap <buffer> <silent> mh        :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
1667    nnoremap <buffer> <silent> mm        :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
1668    nnoremap <buffer> <silent> mp        :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
1669    nnoremap <buffer> <silent> mr        :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
1670    nnoremap <buffer> <silent> ms        :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
1671    nnoremap <buffer> <silent> mT        :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
1672    nnoremap <buffer> <silent> mt        :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
1673    nnoremap <buffer> <silent> mu        :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
1674    nnoremap <buffer> <silent> mx        :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
1675    nnoremap <buffer> <silent> mz        :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
1676    nnoremap <buffer> <silent> gb        :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_curdir)<cr>
1677    nnoremap <buffer> <silent> gh        :<c-u>call <SID>NetrwHidden(1)<cr>
1678    nnoremap <buffer> <silent> c         :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
1679    nnoremap <buffer> <silent> C         :let g:netrw_chgwin= winnr()<cr>
1680    nnoremap <buffer> <silent> d         :call <SID>NetrwMakeDir("")<cr>
1681    nnoremap <buffer> <silent> i         :call <SID>NetrwListStyle(1)<cr>
1682    nnoremap <buffer> <silent> o         :call <SID>NetrwSplit(3)<cr>
1683    nnoremap <buffer> <silent> O         :call <SID>NetrwObtain(1)<cr>
1684    nnoremap <buffer> <silent> p         :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1685    nnoremap <buffer> <silent> P         :call <SID>NetrwPrevWinOpen(1)<cr>
1686    nnoremap <buffer> <silent> qb        :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
1687    nnoremap <buffer> <silent> mB        :<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr>
1688    nnoremap <buffer> <silent> qf        :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
1689    nnoremap <buffer> <silent> r         :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
1690    nnoremap <buffer> <silent> s         :call <SID>NetrwSortStyle(1)<cr>
1691    nnoremap <buffer> <silent> S         :call <SID>NetSortSequence(1)<cr>
1692    nnoremap <buffer> <silent> t         :call <SID>NetrwSplit(4)<cr>
1693    nnoremap <buffer> <silent> u         :<c-u>call <SID>NetrwBookmarkDir(4,expand("%"))<cr>
1694    nnoremap <buffer> <silent> U         :<c-u>call <SID>NetrwBookmarkDir(5,expand("%"))<cr>
1695    nnoremap <buffer> <silent> v         :call <SID>NetrwSplit(5)<cr>
1696    nnoremap <buffer> <silent> x         :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
1697    nnoremap <buffer> <silent> %         :call <SID>NetrwOpenFile(1)<cr>
1698    if !hasmapto('<Plug>NetrwHideEdit')
1699     nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
1700    endif
1701    nnoremap <buffer> <silent> <Plug>NetrwHideEdit       :call <SID>NetrwHideEdit(1)<cr>
1702    if !hasmapto('<Plug>NetrwRefresh')
1703     nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
1704    endif
1705    nnoremap <buffer> <silent> <Plug>NetrwRefresh                :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
1706    if s:didstarstar || !mapcheck("<s-down>","n")
1707     nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
1708    endif
1709    if s:didstarstar || !mapcheck("<s-up>","n")
1710     nnoremap <buffer> <silent> <s-up>   :Pexplore<cr>
1711    endif
1712    if g:netrw_mousemaps == 1
1713     nnoremap <buffer> <silent> <leftmouse>   <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
1714     nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
1715     nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
1716     exe 'nnoremap <buffer> <silent> <rightmouse>  <leftmouse>:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1717     exe 'vnoremap <buffer> <silent> <rightmouse>  <leftmouse>:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1718    endif
1719    exe 'nnoremap <buffer> <silent> <del>        :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1720    exe 'vnoremap <buffer> <silent> <del>        :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1721    exe 'nnoremap <buffer> <silent> D            :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1722    exe 'vnoremap <buffer> <silent> D            :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
1723    exe 'nnoremap <buffer> <silent> R            :call <SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>'
1724    exe 'vnoremap <buffer> <silent> R            :call <SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>'
1725    exe 'nnoremap <buffer> <silent> <Leader>m    :call <SID>NetrwMakeDir("")<cr>'
1726    nnoremap <buffer> <F1>               :he netrw-quickhelp<cr>
1728   else " remote
1729    call s:RemotePathAnalysis(b:netrw_curdir)
1730    nnoremap <buffer> <silent> <cr>      :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
1731    nnoremap <buffer> <silent> <c-l>     :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1732    nnoremap <buffer> <silent> -         :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
1733    nnoremap <buffer> <silent> a         :call <SID>NetrwHide(0)<cr>
1734    nnoremap <buffer> <silent> mb        :<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr>
1735    nnoremap <buffer> <silent> mc        :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
1736    nnoremap <buffer> <silent> md        :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
1737    nnoremap <buffer> <silent> me        :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
1738    nnoremap <buffer> <silent> mf        :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
1739    nnoremap <buffer> <silent> mg        :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
1740    nnoremap <buffer> <silent> mh        :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
1741    nnoremap <buffer> <silent> mm        :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
1742    nnoremap <buffer> <silent> mp        :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
1743    nnoremap <buffer> <silent> mr        :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
1744    nnoremap <buffer> <silent> ms        :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
1745    nnoremap <buffer> <silent> mT        :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
1746    nnoremap <buffer> <silent> mt        :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
1747    nnoremap <buffer> <silent> mu        :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
1748    nnoremap <buffer> <silent> mx        :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
1749    nnoremap <buffer> <silent> mz        :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
1750    nnoremap <buffer> <silent> gb        :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_cur)<cr>
1751    nnoremap <buffer> <silent> gh        :<c-u>call <SID>NetrwHidden(0)<cr>
1752    nnoremap <buffer> <silent> C         :let g:netrw_chgwin= winnr()<cr>
1753    nnoremap <buffer> <silent> i         :call <SID>NetrwListStyle(0)<cr>
1754    nnoremap <buffer> <silent> o         :call <SID>NetrwSplit(0)<cr>
1755    nnoremap <buffer> <silent> O         :call <SID>NetrwObtain(0)<cr>
1756    nnoremap <buffer> <silent> p         :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1757    nnoremap <buffer> <silent> P         :call <SID>NetrwPrevWinOpen(0)<cr>
1758    nnoremap <buffer> <silent> qb        :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
1759    nnoremap <buffer> <silent> mB        :<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr>
1760    nnoremap <buffer> <silent> qf        :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
1761    nnoremap <buffer> <silent> r         :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1762    nnoremap <buffer> <silent> s         :call <SID>NetrwSortStyle(0)<cr>
1763    nnoremap <buffer> <silent> S         :call <SID>NetSortSequence(0)<cr>
1764    nnoremap <buffer> <silent> t         :call <SID>NetrwSplit(1)<cr>
1765    nnoremap <buffer> <silent> u         :<c-u>call <SID>NetrwBookmarkDir(4,b:netrw_curdir)<cr>
1766    nnoremap <buffer> <silent> U         :<c-u>call <SID>NetrwBookmarkDir(5,b:netrw_curdir)<cr>
1767    nnoremap <buffer> <silent> v         :call <SID>NetrwSplit(2)<cr>
1768    nnoremap <buffer> <silent> x         :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
1769    nnoremap <buffer> <silent> %         :call <SID>NetrwOpenFile(0)<cr>
1770    if !hasmapto('<Plug>NetrwHideEdit')
1771     nmap <buffer> <c-h> <Plug>NetrwHideEdit
1772    endif
1773    nnoremap <buffer> <silent> <Plug>NetrwHideEdit       :call <SID>NetrwHideEdit(0)<cr>
1774    if !hasmapto('<Plug>NetrwRefresh')
1775     nmap <buffer> <c-l> <Plug>NetrwRefresh
1776    endif
1777    nnoremap <buffer> <silent> <Plug>NetrwRefresh                :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1778    if g:netrw_mousemaps == 1
1779     nnoremap <buffer> <silent> <leftmouse>   <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
1780     nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
1781     nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
1782     exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1783     exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1784    endif
1785    exe 'nnoremap <buffer> <silent> <del>        :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1786    exe 'vnoremap <buffer> <silent> <del>        :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1787    exe 'nnoremap <buffer> <silent> d    :call <SID>NetrwMakeDir("'.s:user.s:machine.'")<cr>'
1788    exe 'nnoremap <buffer> <silent> D    :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1789    exe 'vnoremap <buffer> <silent> D    :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
1790    exe 'nnoremap <buffer> <silent> R    :call <SID>NetrwRemoteRename("'.s:user.s:machine.'","'.s:path.'")<cr>'
1791    exe 'vnoremap <buffer> <silent> R    :call <SID>NetrwRemoteRename("'.s:user.s:machine.'","'.s:path.'")<cr>'
1792    nnoremap <buffer> <F1>                       :he netrw-quickhelp<cr>
1793   endif
1794   call s:SetRexDir(a:islocal,b:netrw_curdir)
1795 "  call Dret("s:BrowserMaps")
1796 endfun
1798 " ---------------------------------------------------------------------
1799 " s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
1800 fun! s:ExplorePatHls(pattern)
1801 "  call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
1802   let repat= substitute(a:pattern,'^**/\{1,2}','','')
1803 "  call Decho("repat<".repat.">")
1804   let repat= escape(repat,'][.\')
1805 "  call Decho("repat<".repat.">")
1806   let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
1807 "  call Dret("s:ExplorePatHls repat<".repat.">")
1808   return repat
1809 endfun
1811 " ---------------------------------------------------------------------
1812 "  s:NetrwBookmarkDir: {{{2
1813 "    0: (user: <mb>)   bookmark current directory
1814 "    1: (user: <gb>)   change to the bookmarked directory
1815 "    2: (user: <qb>)   list bookmarks
1816 "    3: (browsing)     record current directory history
1817 "    4: (user: <u>)    go up   (previous) bookmark
1818 "    5: (user: <U>)    go down (next)     bookmark
1819 "    6: (user: <mB>)   delete bookmark
1820 fun! s:NetrwBookmarkDir(chg,curdir)
1821 "  call Dfunc("NetrwBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." bookmax=".g:NETRW_BOOKMARKMAX." histmax=".g:netrw_dirhistmax)
1823   if a:chg == 0
1824    " bookmark the current directory
1825 "   call Decho("(user: <b>) bookmark the current directory")
1826    if v:count > 0
1827     " handle bookmark# specified via the count
1828     let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
1829     if !exists("g:NETRW_BOOKMARKMAX")
1830      let g:NETRW_BOOKMARKMAX= v:count
1831     elseif v:count > g:NETRW_BOOKMARKMAX
1832      let g:NETRW_BOOKMARKMAX= v:count
1833     endif
1834    else
1835     " handle no count specified
1836     let g:NETRW_BOOKMARKMAX                       = g:NETRW_BOOKMARKMAX + 1
1837     let g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} = a:curdir
1838    endif
1839    echo "bookmarked the current directory"
1841   elseif a:chg == 1
1842    " change to the bookmarked directory
1843 "   call Decho("(user: <B>) change to the bookmarked directory")
1844    if exists("g:NETRW_BOOKMARKDIR_{v:count}")
1845     exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
1846    else
1847     echomsg "Sorry, bookmark#".v:count." doesn't exist!"
1848    endif
1850   elseif a:chg == 2
1851 "   redraw!
1852    let didwork= 0
1853    " list user's bookmarks
1854 "   call Decho("(user: <q>) list user's bookmarks")
1855    if exists("g:NETRW_BOOKMARKMAX")
1856 "    call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
1857     let cnt= 0
1858     while cnt <= g:NETRW_BOOKMARKMAX
1859      if exists("g:NETRW_BOOKMARKDIR_{cnt}")
1860 "      call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
1861       echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
1862       let didwork= 1
1863      endif
1864      let cnt= cnt + 1
1865     endwhile
1866    endif
1868    " list directory history
1869    let cnt     = g:NETRW_DIRHIST_CNT
1870    let first   = 1
1871    let histcnt = 0
1872    while ( first || cnt != g:NETRW_DIRHIST_CNT )
1873 "    call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
1874     let histcnt= histcnt + 1
1875     if exists("g:NETRW_DIRHIST_{cnt}")
1876 "     call Decho("Netrw  History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
1877      echo "Netrw  History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
1878      let didwork= 1
1879     endif
1880     let first = 0
1881     let cnt   = ( cnt - 1 ) % g:netrw_dirhistmax
1882     if cnt < 0
1883      let cnt= cnt + g:netrw_dirhistmax
1884     endif
1885    endwhile
1886    if didwork
1887     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
1888    endif
1890   elseif a:chg == 3
1891    " saves most recently visited directories (when they differ)
1892 "   call Decho("(browsing) record curdir history")
1893    if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
1894     let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1895 "    let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
1896     let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= a:curdir
1897 "    call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1898    endif
1900   elseif a:chg == 4
1901    " u: change to the previous directory stored on the history list
1902 "   call Decho("(user: <u>) chg to prev dir from history")
1903    let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1904    if g:NETRW_DIRHIST_CNT < 0
1905     let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1906    endif
1907    if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1908 "    call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1909     if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
1910      setlocal ma noro
1911 "     call Decho("setlocal ma noro")
1912      %d
1913      setlocal nomod
1914 "     call Decho("setlocal nomod")
1915     endif
1916 "    "    call Decho("exe e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}))
1917     exe "e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
1918    else
1919     let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1920     echo "Sorry, no predecessor directory exists yet"
1921    endif
1923   elseif a:chg == 5
1924    " U: change to the subsequent directory stored on the history list
1925 "   call Decho("(user: <U>) chg to next dir from history")
1926    let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1927    if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1928 "    call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1929     if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
1930      setlocal ma noro
1931 "     call Decho("setlocal ma noro")
1932      %d
1933 "     call Decho("removed all lines from buffer (%d)")
1934      setlocal nomod
1935 "     call Decho("setlocal nomod")
1936     endif
1937 "    call Decho("exe e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}))
1938     exe "e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
1939    else
1940     let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1941     if g:NETRW_DIRHIST_CNT < 0
1942      let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1943     endif
1944     echo "Sorry, no successor directory exists yet"
1945    endif
1947   elseif a:chg == 6
1948    if v:count > 0 && v:count == g:NETRW_BOOKMARKMAX
1949     " delete the v:count'th bookmark
1950 "    call Decho("delete bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}.">")
1951     unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1952     let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1954    elseif v:count > 0
1955 "    call Decho("delete by shifting bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{v:count}.">")
1956     let cnt= v:count
1957     while cnt < g:NETRW_BOOKMARKMAX
1958      let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)}
1959      let cnt                       = cnt + 1
1960     endwhile
1961     unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1962     let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1964    elseif exists("b:netrw_curdir")
1965     " look for current directory amongst the bookmarks and remove that bookmark
1966 "    call Decho("search for bookmark<".b:netrw_curdir.">")
1967     let cnt= 1
1968     while cnt <= g:NETRW_BOOKMARKMAX
1969 "     call Decho("checking: g:NETRW_BOOKMARKDIR_".cnt."<".g:NETRW_BOOKMARKDIR_{cnt}.">")
1970      if g:NETRW_BOOKMARKDIR_{cnt} == b:netrw_curdir
1971       if cnt < g:NETRW_BOOKMARKMAX
1972 "       call Decho("delete bookmark#".cnt."<".b:netrw_curdir.">")
1973        while cnt < g:NETRW_BOOKMARMAX
1974         let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)}
1975         let cnt                       = cnt + 1
1976        endwhile
1977       endif
1978       unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1979       let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1980      endif
1981      let cnt= cnt + 1
1982     endwhile
1983    endif
1985   endif
1986   call s:NetrwBookmarkMenu()
1987 "  call Dret("NetrwBookmarkDir")
1988 endfun
1990 " ---------------------------------------------------------------------
1991 " s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
1992 "  list of the contents of a local or remote directory.  It is assumed that the
1993 "  g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
1994 "  with the requested remote hostname first.
1995 fun! s:NetrwBrowse(islocal,dirname)
1996   if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
1997 "  call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%").">")
1998 "  call Decho("tab#".tabpagenr()." win#".winnr())
1999 "  call Dredir("ls!")
2001   if exists("s:netrw_skipbrowse")
2002    unlet s:netrw_skipbrowse
2003 "   call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
2004 "   call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
2005    return
2006   endif
2007   if !exists("*shellescape")
2008    call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
2009 "   call Dret("s:NetrwBrowse : missing shellescape()")
2010    return
2011   endif
2012   if !exists("*fnameescape")
2013    call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
2014 "   call Dret("s:NetrwBrowse : missing fnameescape()")
2015    return
2016   endif
2018   call s:NetrwOptionSave("w:")
2019   call s:NetrwSafeOptions()
2021   " re-instate any marked files
2022   if exists("s:netrwmarkfilelist_{bufnr('%')}")
2023 "   call Decho("clearing marked files")
2024    exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2025   endif
2027   if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
2028 "   call Decho("handle w:netrw_acdkeep:")
2029 "   call Decho("keepjumps lcd ".fnameescape(a:dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
2030    exe 'keepjumps lcd '.fnameescape(a:dirname)
2031 "   call Decho("getcwd<".getcwd().">")
2033   elseif !a:islocal && a:dirname !~ '[\/]$' && a:dirname !~ '^"'
2034    " looks like a regular file, attempt transfer
2035 "   call Decho("attempt transfer as regular file<".a:dirname.">")
2037    " remove any filetype indicator from end of dirname, except for the {{{3
2038    " "this is a directory" indicator (/).
2039    " There shouldn't be one of those here, anyway.
2040    let path= substitute(a:dirname,'[*=@|]\r\=$','','e')
2041 "   call Decho("new path<".path.">")
2042    call s:RemotePathAnalysis(a:dirname)
2044    " remote-read the requested file into current buffer {{{3
2045    mark '
2046    call s:NetrwEnew(a:dirname)
2047    setlocal ma noro
2048 "   call Decho("setlocal ma noro")
2049    let b:netrw_curdir= a:dirname
2050 "   call Decho("exe silent! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)." (bt=".&bt.")")
2051    exe "silent! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)
2052    exe "silent keepalt doau BufReadPre ".fnameescape(s:fname)
2053    silent call netrw#NetRead(2,s:method."://".s:user.s:machine."/".s:path)
2054    if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz'
2055     " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
2056     exe "silent keepalt doau BufReadPost ".fnameescape(s:fname)
2057    endif
2059    " save certain window-oriented variables into buffer-oriented variables {{{3
2060    call s:SetBufWinVars()
2061    call s:NetrwOptionRestore("w:")
2062    setlocal ma nomod
2064 "   call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
2065 "   call Dret("s:NetrwBrowse : file<".s:fname.">")
2066    return
2067   endif
2069   " use buffer-oriented WinVars if buffer ones exist but window ones don't {{{3
2070   call s:UseBufWinVars()
2072   " set up some variables {{{3
2073   let b:netrw_browser_active = 1
2074   let dirname                = a:dirname
2075   let s:last_sort_by         = g:netrw_sort_by
2077   " set up menu {{{3
2078   call s:NetrwMenu(1)
2080   " set up buffer {{{3
2081   let reusing= s:NetrwGetBuffer(a:islocal,dirname)
2082   " maintain markfile highlighting
2083   if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
2084 "   call Decho("bufnr(%)=".bufnr('%'))
2085 "   call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
2086    exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
2087   else
2088 "   call Decho("2match none")
2089    2match none
2090   endif
2091   if reusing
2092    call s:NetrwOptionRestore("w:")
2093    setlocal noma nomod nowrap
2094 "   call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
2095 "   call Dret("s:NetrwBrowse : re-using buffer")
2096    return
2097   endif
2099   " set b:netrw_curdir to the new directory name {{{3
2100 "  call Decho("set b:netrw_curdir to the new directory name:")
2101    let b:netrw_curdir= dirname
2102   if b:netrw_curdir =~ '[/\\]$'
2103    let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
2104   endif
2105   if b:netrw_curdir == ''
2106    if has("amiga")
2107     " On the Amiga, the empty string connotes the current directory
2108     let b:netrw_curdir= getcwd()
2109    else
2110     " under unix, when the root directory is encountered, the result
2111     " from the preceding substitute is an empty string.
2112     let b:netrw_curdir= '/'
2113    endif
2114   endif
2115   if !a:islocal && b:netrw_curdir !~ '/$'
2116    let b:netrw_curdir= b:netrw_curdir.'/'
2117   endif
2118 "  call Decho("b:netrw_curdir<".b:netrw_curdir.">")
2120   " ------------
2121   " (local only) {{{3
2122   " ------------
2123   if a:islocal
2124 "   call Decho("local only:")
2126    " Set up ShellCmdPost handling.  Append current buffer to browselist
2127    call s:LocalFastBrowser()
2129   " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
2130    if !g:netrw_keepdir
2131 "    call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
2132 "    call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
2133     if !exists("&l:acd") || !&l:acd
2134 "     call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir))
2135      try
2136       exe 'keepjumps lcd '.fnameescape(b:netrw_curdir)
2137      catch /^Vim\%((\a\+)\)\=:E472/
2138       call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
2139       if exists("w:netrw_prvdir")
2140        let b:netrw_curdir= w:netrw_prvdir
2141       else
2142        call s:NetrwOptionRestore("w:")
2143        setlocal noma nomod nowrap
2144        let b:netrw_curdir= dirname
2145 "       call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
2146 "       call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
2147        return
2148       endif
2149      endtry
2150     endif
2151    endif
2153   " --------------------------------
2154   " remote handling: {{{3
2155   " --------------------------------
2156   else
2157 "   call Decho("remote only:")
2159    " analyze a:dirname and g:netrw_list_cmd {{{4
2160 "   call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> a:dirname<".a:dirname.">")
2161    if a:dirname =~ "^NetrwTreeListing\>"
2162     let dirname= b:netrw_curdir
2163 "    call Decho("(dirname was ".a:dirname.") dirname<".dirname.">")
2164    elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
2165     let dirname= substitute(b:netrw_curdir,'\\','/','g')
2166     if dirname !~ '/$'
2167      let dirname= dirname.'/'
2168     endif
2169     let b:netrw_curdir = dirname
2170 "    call Decho("(liststyle is TREELIST) dirname<".dirname.">")
2171    else
2172     let dirname = substitute(a:dirname,'\\','/','g')
2173 "    call Decho("(normal) dirname<".dirname.">")
2174    endif
2176    let dirpat  = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
2177    if dirname !~ dirpat
2178     if !exists("g:netrw_quiet")
2179      call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
2180     endif
2181     call s:NetrwOptionRestore("w:")
2182     setlocal noma nomod nowrap
2183 "    call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
2184 "    call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
2185     return
2186    endif
2187    let b:netrw_curdir= dirname
2188 "   call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)")
2189   endif  " (additional remote handling)
2191   " -----------------------
2192   " Directory Listing: {{{3
2193   " -----------------------
2194   call s:BrowserMaps(a:islocal)
2195   call s:PerformListing(a:islocal)
2197 "  call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
2198 "  call Dret("s:NetrwBrowse : did PerformListing")
2199   return
2200 endfun
2202 " ---------------------------------------------------------------------
2203 " s:NetrwFileInfo: supports qf (query for file information) {{{2
2204 fun! s:NetrwFileInfo(islocal,fname)
2205 "  call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)")
2206   if a:islocal
2207    if (has("unix") || has("macunix")) && executable("/bin/ls")
2208     if exists("b:netrw_curdir")
2209 "     call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>')
2210      if b:netrw_curdir =~ '/$'
2211       echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
2212      else
2213       echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
2214      endif
2215     else
2216 "     call Decho('using ls '.a:fname." using cwd<".getcwd().">")
2217      echo system("/bin/ls -lsad ".shellescape(a:fname))
2218     endif
2219    else
2220     " use vim functions to return information about file below cursor
2221 "    call Decho("using vim functions to query for file info")
2222     if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
2223      let fname= substitute(a:fname,".$","","")
2224     else
2225      let fname= a:fname
2226     endif
2227     let t  = getftime(fname)
2228     let sz = getfsize(fname)
2229     echo a:fname.":  ".sz."  ".strftime(g:netrw_timefmt,getftime(fname))
2230 "    call Decho(fname.":  ".sz."  ".strftime(g:netrw_timefmt,getftime(fname)))
2231    endif
2232   else
2233    echo "sorry, \"qf\" not supported yet for remote files"
2234   endif
2235 "  call Dret("s:NetrwFileInfo")
2236 endfun
2238 " ---------------------------------------------------------------------
2239 " s:NetrwGetBuffer: {{{2
2240 "   returns 0=cleared buffer
2241 "           1=re-used buffer
2242 fun! s:NetrwGetBuffer(islocal,dirname)
2243 "  call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
2244   let dirname= a:dirname
2246   " re-use buffer if possible {{{3
2247 "  call Decho("--re-use a buffer if possible--")
2248   if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2249    " find NetrwTreeList buffer if there is one
2250    if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
2251 "    call Decho("  re-use w:netrw_treebufnr=".w:netrw_treebufnr)
2252     let eikeep= &ei
2253     set ei=all
2254     exe "b ".w:netrw_treebufnr
2255     let &ei= eikeep
2256 "    call Dret("s:NetrwGetBuffer : bufnum#".bufnum."<NetrwTreeListing>")
2257     return
2258    endif
2259    let bufnum= -1
2260 "   call Decho("  liststyle=TREE but w:netrw_treebufnr doesn't exist")
2262   else
2263    " find buffer number of buffer named precisely the same as dirname {{{3
2264 "   call Decho("--find buffer numnber of buffer named precisely the same as dirname--")
2265 "   call Dredir("ls!")
2267    " get dirname and associated buffer number
2268    let bufnum  = bufnr(escape(dirname,'\'))
2269 "   call Decho("  find buffer<".dirname.">'s number ")
2270 "   call Decho("  bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
2272    if bufnum < 0 && dirname !~ '/$'
2273     " trying appending a trailing /
2274 "    call Decho("  try appending a trailing / to dirname<".dirname.">")
2275     let bufnum= bufnr(escape(dirname.'/','\'))
2276     if bufnum > 0
2277      let dirname= dirname.'/'
2278     endif
2279    endif
2281    if bufnum < 0 && dirname =~ '/$'
2282     " trying removing a trailing /
2283 "    call Decho("  try removing a trailing / from dirname<".dirname.">")
2284     let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
2285     if bufnum > 0
2286      let dirname= substitute(dirname,'/$','','')
2287     endif
2288    endif
2290 "   call Decho("  findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
2291    " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/  and abc/ matches)
2292    if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
2293     " handle approximate matches
2294 "    call Decho("  handling approx match: bufnum#%d<".bufname(bufnum)."> approx=dirname<".dirname.">")
2295     let ibuf    = 1
2296     let buflast = bufnr("$")
2297 "    call Decho("  findbuf2: buflast=".buflast)
2298     while ibuf <= buflast
2299      let bname= substitute(bufname(ibuf),'\\','/','g')
2300      let bname= substitute(bname,'.\zs/$','','')
2301 "     call Decho("  findbuf3: dirname<".dirname."> bufname(".ibuf.")<".bname.">")
2302      if bname != '' && dirname =~ '/'.bname.'/\=$' | break | endif
2303      if bname   =~ '^'.dirname.'/\=$' | break | endif
2304      if dirname =~ '^'.bname.'/$'     | break | endif
2305      let ibuf= ibuf + 1
2306     endwhile
2307     if ibuf > buflast
2308      let bufnum= -1
2309     else
2310      let bufnum= ibuf
2311     endif
2312 "    call Decho("  findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
2313    endif
2314   endif
2316   " get enew buffer and name it -or- re-use buffer {{{3
2317 "  call Decho("--get enew buffer and name it OR re-use buffer-- (bufnum=".bufnum.")")
2318   mark '
2319   if bufnum < 0 || !bufexists(bufnum)
2320    call s:NetrwEnew(dirname)
2321 "   call Decho("  got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
2322    " name the buffer
2323    if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2324     " Got enew buffer; transform into a NetrwTreeListing
2325 "    call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
2326     if !exists("s:netrw_treelistnum")
2327      let s:netrw_treelistnum= 1
2328     else
2329      let s:netrw_treelistnum= s:netrw_treelistnum + 1
2330     endif
2331     let w:netrw_treebufnr= bufnr("%")
2332 "    call Decho("  exe silent! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum))
2333     exe 'silent! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum)
2334     nnoremap <silent> <buffer> [        :silent call <SID>TreeListMove('[')<cr>
2335     nnoremap <silent> <buffer> ]        :silent call <SID>TreeListMove(']')<cr>
2336     nnoremap <silent> <buffer> [[       :silent call <SID>TreeListMove('[')<cr>
2337     nnoremap <silent> <buffer> ]]       :silent call <SID>TreeListMove(']')<cr>
2338 "    call Decho("  tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
2339    else
2340 "    let v:errmsg= "" " Decho
2341     let escdirname= fnameescape(dirname)
2342 "    call Decho("  errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
2343 "    call Decho('  exe silent! keepalt file '.fnameescape(escdirname))
2344     exe 'silent! keepalt file '.fnameescape(escdirname)
2345 "    call Decho("  errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
2346    endif
2347 "   call Decho("  named enew buffer#".bufnr("%")."<".bufname("%").">")
2349   else " Re-use the buffer
2350 "   call Decho("--re-use buffer#".bufnum.": --")
2351    let eikeep= &ei
2352    set ei=all
2353    if getline(2) =~ '^" Netrw Directory Listing'
2354 "    call Decho("  re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using:  keepalt b ".bufnum)
2355     exe "keepalt b ".bufnum
2356    else
2357 "    call Decho("  reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using:  b ".bufnum)
2358     exe "b ".bufnum
2359    endif
2360    if bufname("%") == '.'
2361 "    call Decho("exe silent! keepalt file ".fnameescape(getcwd()))
2362     exe "silent! keepalt file ".fnameescape(getcwd())
2363    endif
2364    let &ei= eikeep
2365    if line("$") <= 1
2366     call s:NetrwListSettings(a:islocal)
2367 "    call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it")
2368     return 0
2369    elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2370 "    call Decho("--re-use tree listing--")
2371 "    call Decho("  clear buffer<".expand("%")."> with :%d")
2372     silent %d
2373     call s:NetrwListSettings(a:islocal)
2374 "    call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
2375     return 0
2376    else
2377 "    call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%"))
2378     return 1
2379    endif
2380   endif
2382   " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
2383   "     fastbrowse  Local  Remote   Hiding a buffer implies it may be re-used (fast)
2384   "  slow   0         D      D      Deleting a buffer implies it will not be re-used (slow)
2385   "  med    1         D      H
2386   "  fast   2         H      H
2387 "  call Decho("--do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc--")
2388   let fname= expand("%")
2389   call s:NetrwListSettings(a:islocal)
2390 "  call Decho("exe keepalt file ".fnameescape(fname))
2391   exe "keepalt file ".fnameescape(fname)
2393   " delete all lines from buffer {{{3
2394 "  call Decho("--delete all lines from buffer--")
2395 "  call Decho("  clear buffer<".expand("%")."> with :%d")
2396   keepalt silent! %d
2398 "  call Dret("s:NetrwGetBuffer 0 : buf#".bufnr("%"))
2399   return 0
2400 endfun
2402 " ---------------------------------------------------------------------
2403 " s:NetrwGetcwd: get the current directory. {{{2
2404 "   Change backslashes to forward slashes, if any.
2405 "   If doesc is true, escape certain troublesome characters
2406 fun! s:NetrwGetcwd(doesc)
2407 "  call Dfunc("NetrwGetcwd(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= fnameescape(curdir)
2414   endif
2415 "  call Dret("NetrwGetcwd <".curdir.">")
2416   return curdir
2417 endfun
2419 " ---------------------------------------------------------------------
2420 "  s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
2421 fun! s:NetrwGetWord()
2422 "  call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
2423   call s:UseBufWinVars()
2425   " insure that w:netrw_liststyle is set up
2426   if !exists("w:netrw_liststyle")
2427    if exists("g:netrw_liststyle")
2428     let w:netrw_liststyle= g:netrw_liststyle
2429    else
2430     let w:netrw_liststyle= s:THINLIST
2431    endif
2432 "   call Decho("w:netrw_liststyle=".w:netrw_liststyle)
2433   endif
2435   if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
2436    " Active Banner support
2437 "   call Decho("active banner handling")
2438    norm! 0
2439    let dirname= "./"
2440    let curline= getline('.')
2442    if curline =~ '"\s*Sorted by\s'
2443     norm s
2444     let s:netrw_skipbrowse= 1
2445     echo 'Pressing "s" also works'
2447    elseif curline =~ '"\s*Sort sequence:'
2448     let s:netrw_skipbrowse= 1
2449     echo 'Press "S" to edit sorting sequence'
2451    elseif curline =~ '"\s*Quick Help:'
2452     norm ?
2453     let s:netrw_skipbrowse= 1
2454     echo 'Pressing "?" also works'
2456    elseif curline =~ '"\s*\%(Hiding\|Showing\):'
2457     norm a
2458     let s:netrw_skipbrowse= 1
2459     echo 'Pressing "a" also works'
2461    elseif line("$") > w:netrw_bannercnt
2462     exe 'silent keepjumps '.w:netrw_bannercnt
2463    endif
2465   elseif w:netrw_liststyle == s:THINLIST
2466 "   call Decho("thin column handling")
2467    norm! 0
2468    let dirname= getline('.')
2470   elseif w:netrw_liststyle == s:LONGLIST
2471 "   call Decho("long column handling")
2472    norm! 0
2473    let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
2475   elseif w:netrw_liststyle == s:TREELIST
2476 "   call Decho("treelist handling")
2477    let dirname= substitute(getline('.'),'^\(| \)*','','e')
2479   else
2480 "   call Decho("obtain word from wide listing")
2481    let dirname= getline('.')
2483    if !exists("b:netrw_cpf")
2484     let b:netrw_cpf= 0
2485     exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
2486 "   call Decho("computed cpf=".b:netrw_cpf)
2487    endif
2489 "   call Decho("buf#".bufnr("%")."<".bufname("%").">")
2490    let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
2491 "   call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart."  bannercnt=".w:netrw_bannercnt)
2492 "   call Decho("1: dirname<".dirname.">")
2493    if filestart == 0
2494     norm! 0ma
2495    else
2496     call cursor(line("."),filestart+1)
2497     norm! ma
2498    endif
2499    let rega= @a
2500    let eofname= filestart + b:netrw_cpf + 1
2501    if eofname <= col("$")
2502     call cursor(line("."),filestart+b:netrw_cpf+1)
2503     norm! "ay`a
2504    else
2505     norm! "ay$
2506    endif
2507    let dirname = @a
2508    let @a      = rega
2509 "   call Decho("2: dirname<".dirname.">")
2510    let dirname= substitute(dirname,'\s\+$','','e')
2511 "   call Decho("3: dirname<".dirname.">")
2512   endif
2514   " symlinks are indicated by a trailing "@".  Remove it before further processing.
2515   let dirname= substitute(dirname,"@$","","")
2517   " executables are indicated by a trailing "*".  Remove it before further processing.
2518   let dirname= substitute(dirname,"\*$","","")
2520 "  call Dret("s:NetrwGetWord <".dirname.">")
2521   return dirname
2522 endfun
2524 " ---------------------------------------------------------------------
2525 " s:NetrwListSettings: {{{2
2526 fun! s:NetrwListSettings(islocal)
2527 "  call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
2528   let fname= bufname("%")
2529 "  call Decho("setlocal bt=nofile nobl ma nonu nowrap noro")
2530   setlocal bt=nofile nobl ma nonu nowrap noro
2531 "  call Decho("exe keepalt file ".fnameescape(fname))
2532   exe "keepalt file ".fnameescape(fname)
2533   if g:netrw_use_noswf
2534    setlocal noswf
2535   endif
2536 "  call Dredir("ls!")
2537 "  call Decho("exe setlocal ts=".g:netrw_maxfilenamelen)
2538   exe "setlocal ts=".g:netrw_maxfilenamelen
2539   setlocal isk+=.,~,-
2540   if g:netrw_fastbrowse > a:islocal
2541    setlocal bh=hide
2542   else
2543    setlocal bh=delete
2544   endif
2545 "  call Dret("s:NetrwListSettings")
2546 endfun
2548 " ---------------------------------------------------------------------
2549 "  s:NetrwListStyle: {{{2
2550 "  islocal=0: remote browsing
2551 "         =1: local browsing
2552 fun! s:NetrwListStyle(islocal)
2553 "  call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
2554   let fname             = s:NetrwGetWord()
2555   if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
2556   let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
2557 "  call Decho("fname<".fname.">")
2558 "  call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
2559 "  call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
2561   if w:netrw_liststyle == s:THINLIST
2562    " use one column listing
2563 "   call Decho("use one column list")
2564    let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2566   elseif w:netrw_liststyle == s:LONGLIST
2567    " use long list
2568 "   call Decho("use long list")
2569    let g:netrw_list_cmd = g:netrw_list_cmd." -l"
2571   elseif w:netrw_liststyle == s:WIDELIST
2572    " give wide list
2573 "   call Decho("use wide list")
2574    let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2576   elseif w:netrw_liststyle == s:TREELIST
2577 "   call Decho("use tree list")
2578    let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2580   else
2581    call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
2582    let g:netrw_liststyle = s:THINLIST
2583    let w:netrw_liststyle = g:netrw_liststyle
2584    let g:netrw_list_cmd  = substitute(g:netrw_list_cmd,' -l','','ge')
2585   endif
2586   setlocal ma noro
2587 "  call Decho("setlocal ma noro")
2589   " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
2590 "  call Decho("clear buffer<".expand("%")."> with :%d")
2591   %d
2593   " refresh the listing
2594   let svpos= netrw#NetrwSavePosn()
2595   call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
2596   call netrw#NetrwRestorePosn(svpos)
2598   " keep cursor on the filename
2599   silent keepjumps $
2600   let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
2601 "  call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
2602   if result <= 0 && exists("w:netrw_bannercnt")
2603    exe "keepjumps ".w:netrw_bannercnt
2604   endif
2606 "  call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
2607 endfun
2609 " ---------------------------------------------------------------------
2610 " s:NetrwBookmarkMenu: Uses menu priorities {{{2
2611 "                      .2.[cnt] for bookmarks, and
2612 "                      .3.[cnt] for history
2613 "                      (see s:NetrwMenu())
2614 fun! s:NetrwBookmarkMenu()
2615   if !exists("s:netrw_menucnt")
2616    return
2617   endif
2618 "  call Dfunc("NetrwBookmarkMenu() bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." menucnt=".s:netrw_menucnt)
2620   " the following test assures that gvim is running, has menus available, and has menus enabled.
2621   if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
2622    if exists("g:NetrwTopLvlMenu")
2623 "    call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
2624     exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
2625    endif
2627    " show bookmarked places
2628    let cnt       = 1
2629    while cnt <= g:NETRW_BOOKMARKMAX
2630     if exists("g:NETRW_BOOKMARKDIR_{cnt}")
2631      let bmdir= escape(g:NETRW_BOOKMARKDIR_{cnt},'. ')
2632 "     call Decho('silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmdir.'        :e '.bmdir)
2633      exe 'silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmdir.'       :e '.bmdir."\<cr>"
2634     endif
2635     let cnt= cnt + 1
2636    endwhile
2638    " show directory browsing history
2639    let cnt     = g:NETRW_DIRHIST_CNT
2640    let first   = 1
2641    let histcnt = 0
2642    while ( first || cnt != g:NETRW_DIRHIST_CNT )
2643     let histcnt  = histcnt + 1
2644     let priority = g:NETRW_DIRHIST_CNT + histcnt
2645     if exists("g:NETRW_DIRHIST_{cnt}")
2646      let bmdir= escape(g:NETRW_DIRHIST_{cnt},'/&? ')
2647 "     call Decho('silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.'    :e '.bmdir)
2648      exe 'silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.'    :e '.bmdir."\<cr>"
2649     endif
2650     let first = 0
2651     let cnt   = ( cnt - 1 ) % g:netrw_dirhistmax
2652     if cnt < 0
2653      let cnt= cnt + g:netrw_dirhistmax
2654     endif
2655    endwhile
2656   endif
2657 "  call Dret("NetrwBookmarkMenu")
2658 endfun
2660 " ---------------------------------------------------------------------
2661 "  s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
2662 "                       directory and a new directory name.  Also, if the
2663 "                       "new directory name" is actually a file,
2664 "                       NetrwBrowseChgDir() edits the file.
2665 fun! s:NetrwBrowseChgDir(islocal,newdir,...)
2666 "  call Dfunc("s:NetrwBrowseChgDir(islocal=".a:islocal."> newdir<".a:newdir.">) a:0=".a:0." curpos<".string(getpos("."))."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "").">")
2668   if !exists("b:netrw_curdir")
2669    " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
2670    " and the current window is the NetrwMessage window.
2671 "   call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
2672 "   call Decho("getcwd<".getcwd().">")
2673 "   call Dredir("ls!")
2674 "   call Dret("s:NetrwBrowseChgDir")
2675    return
2676   endif
2678   call s:NetrwOptionSave("s:")
2679   call s:NetrwSafeOptions()
2680   let nbcd_curpos                = netrw#NetrwSavePosn()
2681   let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
2682   let dirname                    = substitute(b:netrw_curdir,'\\','/','ge')
2683   let newdir                     = a:newdir
2684   let dolockout                  = 0
2686   " set up o/s-dependent directory recognition pattern
2687   if has("amiga")
2688    let dirpat= '[\/:]$'
2689   else
2690    let dirpat= '[\/]$'
2691   endif
2692 "  call Decho("dirname<".dirname.">  dirpat<".dirpat.">")
2694   if dirname !~ dirpat
2695    " apparently vim is "recognizing" that it is in a directory and
2696    " is removing the trailing "/".  Bad idea, so I put it back.
2697    let dirname= dirname.'/'
2698 "   call Decho("adjusting dirname<".dirname.">")
2699   endif
2701   if newdir !~ dirpat
2702    " ------------
2703    " edit a file:
2704    " ------------
2705 "   call Decho('case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
2706    if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
2707     let dirname= s:NetrwTreeDir()
2708     if dirname =~ '/$'
2709      let dirname= dirname.newdir
2710     else
2711      let dirname= s:NetrwTreeDir()."/".newdir
2712     endif
2713 "    call Decho("tree listing")
2714    elseif newdir =~ '^\(/\|\a:\)'
2715     let dirname= newdir
2716    else
2717     let dirname= s:ComposePath(dirname,newdir)
2718    endif
2719 "   call Decho("handling a file: dirname<".dirname."> (a:0=".a:0.")")
2720    " this lets NetrwBrowseX avoid the edit
2721    if a:0 < 1
2722 "    call Decho("set up windows for editing<".fnameescape(dirname).">  didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist"))
2723     call s:NetrwOptionRestore("s:")
2724     if !exists("s:didsplit")
2725      if     g:netrw_browse_split == 1
2726       new
2727       wincmd _
2728      elseif g:netrw_browse_split == 2
2729       rightb vert new
2730       wincmd |
2731      elseif g:netrw_browse_split == 3
2732       tabnew
2733      elseif g:netrw_browse_split == 4
2734       if s:NetrwPrevWinOpen(2) == 3
2735 "       call Dret("s:NetrwBrowseChgDir")
2736        return
2737       endif
2738      else
2739       " handling a file, didn't split, so remove menu
2740 "      call Decho("handling a file+didn't split, so remove menu")
2741       call s:NetrwMenu(0)
2742       " optional change to window
2743       if g:netrw_chgwin >= 1
2744        exe "keepjumps ".g:netrw_chgwin."wincmd w"
2745       endif
2746      endif
2747     endif
2748     " the point where netrw actually edits the (local) file
2749     " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
2750     if a:islocal
2751 "     call Decho("edit local file: exe e! ".fnameescape(dirname))
2752      exe "e! ".fnameescape(dirname)
2753     else
2754 "     call Decho("remote file: NetrwBrowse will edit it")
2755     endif
2756     let dolockout= 1
2757    endif
2759   elseif newdir =~ '^/'
2760    " ---------------------------------
2761    " just go to the new directory spec
2762    " ---------------------------------
2763 "   call Decho('case "just go to new directory spec": newdir<'.newdir.'>')
2764    let dirname= newdir
2765    call s:SetRexDir(a:islocal,dirname)
2766    call s:NetrwOptionRestore("s:")
2768   elseif newdir == './'
2769    " --------------------------
2770    " refresh the directory list
2771    " --------------------------
2772 "   call Decho('case "refresh directory listing": newdir == "./"')
2773    call s:SetRexDir(a:islocal,dirname)
2775   elseif newdir == '../'
2776    " -------------------
2777    " go up one directory
2778    " -------------------
2779 "   call Decho('case "go up one directory": newdir == "../"')
2781    if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
2782     " force a refresh
2783 "    call Decho("clear buffer<".expand("%")."> with :%d")
2784     setlocal noro ma
2785 "    call Decho("setlocal noro ma")
2786     keepjumps %d
2787    endif
2789    if has("amiga")
2790     " amiga
2791 "    call Decho('case "go up one directory": newdir == "../" and amiga')
2792     if a:islocal
2793      let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
2794      let dirname= substitute(dirname,'/$','','')
2795     else
2796      let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
2797     endif
2798 "    call Decho("amiga: dirname<".dirname."> (go up one dir)")
2800    else
2801     " unix or cygwin
2802 "    call Decho('case "go up one directory": newdir == "../" and unix or cygwin')
2803     if a:islocal
2804      let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
2805      if dirname == ""
2806       let dirname= '/'
2807      endif
2808     else
2809      let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
2810     endif
2811 "    call Decho("unix: dirname<".dirname."> (go up one dir)")
2812    endif
2813    call s:SetRexDir(a:islocal,dirname)
2815   elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
2816 "   call Decho('case liststyle is TREELIST and w:netrw_treedict exists')
2817    " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh)
2818    setlocal noro ma
2819 "   call Decho("setlocal noro ma")
2820    if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
2821 "    call Decho("clear buffer<".expand("%")."> with :%d")
2822     keepjumps %d
2823    endif
2824    let treedir      = s:NetrwTreeDir()
2825    let s:treecurpos = nbcd_curpos
2826    let haskey= 0
2827 "   call Decho("w:netrw_treedict<".string(w:netrw_treedict).">")
2829    " search treedict for tree dir as-is
2830    if has_key(w:netrw_treedict,treedir)
2831 "    call Decho('....searched for treedir<'.treedir.'> : found it!')
2832     let haskey= 1
2833    else
2834 "    call Decho('....searched for treedir<'.treedir.'> : not found')
2835    endif
2837    " search treedict for treedir with a / appended
2838    if !haskey && treedir !~ '/$'
2839     if has_key(w:netrw_treedict,treedir."/")
2840      let treedir= treedir."/"
2841 "     call Decho('....searched.for treedir<'.treedir.'> found it!')
2842      let haskey = 1
2843     else
2844 "     call Decho('....searched for treedir<'.treedir.'/> : not found')
2845     endif
2846    endif
2848    " search treedict for treedir with any trailing / elided
2849    if !haskey && treedir =~ '/$'
2850     let treedir= substitute(treedir,'/$','','')
2851     if has_key(w:netrw_treedict,treedir)
2852 "     call Decho('....searched.for treedir<'.treedir.'> found it!')
2853      let haskey = 1
2854     else
2855 "     call Decho('....searched for treedir<'.treedir.'> : not found')
2856     endif
2857    endif
2859    if haskey
2860     " close tree listing for selected subdirectory
2861 "    call Decho("closing selected subdirectory<".dirname.">")
2862     call remove(w:netrw_treedict,treedir)
2863 "    call Decho("removed     entry<".dirname."> from treedict")
2864 "    call Decho("yielding treedict<".string(w:netrw_treedict).">")
2865     let dirname= w:netrw_treetop
2866    else
2867     " go down one directory
2868     let dirname= substitute(treedir,'/*$','/','')
2869 "    call Decho("go down one dir: treedir<".treedir.">")
2870    endif
2871    call s:SetRexDir(a:islocal,dirname)
2873   else
2874    " go down one directory
2875    let dirname= s:ComposePath(dirname,newdir)
2876 "   call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">")
2877    call s:SetRexDir(a:islocal,dirname)
2878   endif
2880   call s:NetrwOptionRestore("s:")
2881   if dolockout
2882 "   call Decho("doing modification lockout settings: ma nomod noro")
2883    setlocal ma nomod noro
2884 "   call Decho("setlocal ma nomod noro")
2885   endif
2887 "  call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
2888   return dirname
2889 endfun
2891 " ---------------------------------------------------------------------
2892 " s:NetrwBrowseX:  allows users to write custom functions to operate on {{{2
2893 "              files given their extension.  Passes 0=local, 1=remote
2894 fun! netrw#NetrwBrowseX(fname,remote)
2895 "  call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
2897   " set up the filename
2898   " (lower case the extension, make a local copy of a remote file)
2899   let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
2900   if has("win32") || has("win95") || has("win64") || has("win16")
2901    let exten= substitute(exten,'^.*$','\L&\E','')
2902   endif
2904   " seems kde systems often have gnome-open due to dependencies, even though
2905   " gnome-open's subsidiary display tools are largely absent.  Kde systems
2906   " usually have "kdeinit" running, though...  (tnx Mikolaj Machowski)
2907   if !exists("s:haskdeinit")
2908    if has("unix")
2909     let s:haskdeinit= system("ps -e") =~ 'kdeinit' 
2910     if v:shell_error
2911      let s:haskdeinit = 0
2912     endif
2913    else
2914     let s:haskdeinit= 0
2915    endif
2916 "   call Decho("setting s:haskdeinit=".s:haskdeinit)
2917   endif
2919   if a:remote == 1
2920    " create a local copy
2921    let fname= fnamemodify(tempname(),":r").".".exten
2922 "   call Decho("a:remote=".a:remote.": create a local copy of <".fname."> as <".fname.">")
2923    exe "silent keepjumps bot 1new ".fnameescape(fname)
2924    setlocal bh=delete
2925 "   call Decho("read <".fnameescape(fname).">, now writing: exe w! ".fnameescape(fname))
2926    exe "silent! w! ".fnameescape(fname)
2927    q
2928   else
2929    let fname= a:fname
2930   endif
2931 "  call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
2933   " set up redirection
2934   if &srr =~ "%s"
2935    if (has("win32") || has("win95") || has("win64") || has("win16"))
2936     let redir= substitute(&srr,"%s","nul","")
2937    else
2938     let redir= substitute(&srr,"%s","/dev/null","")
2939    endif
2940   elseif (has("win32") || has("win95") || has("win64") || has("win16"))
2941    let redir= &srr . "nul"
2942   else
2943    let redir= &srr . "/dev/null"
2944   endif
2945 "  call Decho("redir{".redir."} srr{".&srr."}")
2947   " extract any viewing options.  Assumes that they're set apart by quotes.
2948   if exists("g:netrw_browsex_viewer")
2949    if g:netrw_browsex_viewer =~ '\s'
2950     let viewer  = substitute(g:netrw_browsex_viewer,'\s.*$','','')
2951     let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
2952     let oviewer = ''
2953     let cnt     = 1
2954     while !executable(viewer) && viewer != oviewer
2955      let viewer  = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
2956      let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
2957      let cnt     = cnt + 1
2958      let oviewer = viewer
2959 "     call Decho("!exe: viewer<".viewer.">  viewopt<".viewopt.">")
2960     endwhile
2961    else
2962     let viewer  = g:netrw_browsex_viewer
2963     let viewopt = ""
2964    endif
2965 "   call Decho("viewer<".viewer.">  viewopt<".viewopt.">")
2966   endif
2968   " execute the file handler
2969   if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
2970 "   call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
2971    let ret= netrwFileHandlers#Invoke(exten,fname)
2973   elseif exists("g:netrw_browsex_viewer") && executable(viewer)
2974 "   call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
2975 "   call Decho("exe silent !".viewer." ".viewopt.shellescape(fname,1).redir)
2976    exe "silent !".viewer." ".viewopt.shellescape(fname,1).redir
2977    let ret= v:shell_error
2979   elseif has("win32") || has("win64")
2980 "   call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
2981    exe 'silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
2982    call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2983    let ret= v:shell_error
2985   elseif has("unix") && executable("gnome-open") && !s:haskdeinit
2986 "   call Decho("exe silent !gnome-open ".shellescape(fname,1)." ".redir)
2987    exe "silent !gnome-open ".shellescape(fname,1).redir
2988    let ret= v:shell_error
2990   elseif has("unix") && executable("kfmclient") && s:haskdeinit
2991 "   call Decho("exe silent !kfmclient exec ".shellescape(fname,1)." ".redir)
2992    exe "silent !kfmclient exec ".shellescape(fname,1)." ".redir
2993    let ret= v:shell_error
2995   elseif has("macunix") && executable("open")
2996 "   call Decho("exe silent !open ".shellescape(fname,1)." ".redir)
2997    exe "silent !open ".shellescape(fname,1)." ".redir
2998    let ret= v:shell_error
3000   else
3001    " netrwFileHandlers#Invoke() always returns 0
3002    let ret= netrwFileHandlers#Invoke(exten,fname)
3003   endif
3005   " if unsuccessful, attempt netrwFileHandlers#Invoke()
3006   if ret
3007    let ret= netrwFileHandlers#Invoke(exten,fname)
3008   endif
3010   " restoring redraw! after external file handlers
3011   redraw!
3013   " cleanup: remove temporary file,
3014   "          delete current buffer if success with handler,
3015   "          return to prior buffer (directory listing)
3016   "          Feb 12, 2008: had to de-activiate removal of
3017   "          temporary file because it wasn't getting seen.
3018 "  if a:remote == 1 && fname != a:fname
3019 "   call Decho("deleting temporary file<".fname.">")
3020 "   call s:NetrwDelete(fname)
3021 "  endif
3023   if a:remote == 1
3024    setlocal bh=delete bt=nofile
3025    if g:netrw_use_noswf
3026     setlocal noswf
3027    endif
3028    exe "norm! \<c-o>"
3029 "   redraw!
3030   endif
3032 "  call Dret("NetrwBrowseX")
3033 endfun
3035 " ---------------------------------------------------------------------
3036 " netrw#Explore: launch the local browser in the directory of the current file {{{2
3037 "          dosplit==0: the window will be split iff the current file has
3038 "                      been modified
3039 "          dosplit==1: the window will be split before running the local
3040 "                      browser
3041 fun! netrw#Explore(indx,dosplit,style,...)
3042 "  call Dfunc("netrw#Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.",a:1<".a:1.">) &modified=".&modified." a:0=".a:0)
3043   if !exists("b:netrw_curdir")
3044    let b:netrw_curdir= getcwd()
3045 "   call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
3046   endif
3047   let curfile= b:netrw_curdir
3048 "  call Decho("curfile<".curfile.">")
3050   " save registers
3051   silent! let keepregstar = @*
3052   silent! let keepregplus = @+
3053   silent! let keepregslash= @/
3055   " if dosplit or file has been modified
3056   if a:dosplit || &modified || a:style == 6
3057 "   call Decho("case: dosplit=".a:dosplit." modified=".&modified." a:style=".a:style)
3058    call s:SaveWinVars()
3060    if a:style == 0      " Explore, Sexplore
3061 "    call Decho("style=0: Explore or Sexplore")
3062     exe g:netrw_winsize."wincmd s"
3064    elseif a:style == 1  "Explore!, Sexplore!
3065 "    call Decho("style=1: Explore! or Sexplore!")
3066     exe g:netrw_winsize."wincmd v"
3068    elseif a:style == 2  " Hexplore
3069 "    call Decho("style=2: Hexplore")
3070     exe "bel ".g:netrw_winsize."wincmd s"
3072    elseif a:style == 3  " Hexplore!
3073 "    call Decho("style=3: Hexplore!")
3074     exe "abo ".g:netrw_winsize."wincmd s"
3076    elseif a:style == 4  " Vexplore
3077 "    call Decho("style=4: Vexplore")
3078     exe "lefta ".g:netrw_winsize."wincmd v"
3080    elseif a:style == 5  " Vexplore!
3081 "    call Decho("style=5: Vexplore!")
3082     exe "rightb ".g:netrw_winsize."wincmd v"
3084    elseif a:style == 6  " Texplore
3085     call s:SaveBufVars()
3086 "    call Decho("style  = 6: Texplore")
3087     tabnew
3088     call s:RestoreBufVars()
3089    endif
3090    call s:RestoreWinVars()
3091   endif
3092   norm! 0
3094   if a:0 > 0
3095 "   call Decho("case [a:0=".a:0."]>0: a:1<".a:1.">")
3096    if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
3097     let dirname= substitute(a:1,'\~',expand("$HOME"),'')
3098 "    call Decho("using dirname<".dirname.">  (case: ~ && unix||cygwin)")
3099    elseif a:1 == '.'
3100     let dirname= exists("b:netrw_curdir")? b:netrw_curdir : getcwd()
3101     if dirname !~ '/$'
3102      let dirname= dirname."/"
3103     endif
3104 "    call Decho("using dirname<".dirname.">  (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
3105    elseif a:1 =~ '\$'
3106     let dirname= expand(a:1)
3107    else
3108     let dirname= a:1
3109 "    call Decho("using dirname<".dirname.">")
3110    endif
3111   else
3112    " clear explore
3113 "   call Decho("clearing explore variables")
3114    2match none
3115    if exists("s:explore_match")        |unlet s:explore_match        |endif
3116    if exists("s:explore_indx")         |unlet s:explore_indx         |endif
3117    if exists("s:dirstarstar")          |unlet s:dirstarstar          |endif
3118    if exists("s:dirstarstar")          |unlet s:dirstarstar          |endif
3119    if exists("w:netrw_explore_indx")   |unlet w:netrw_explore_indx   |endif
3120    if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
3121    if exists("w:netrw_explore_list")   |unlet w:netrw_explore_list   |endif
3122    if exists("w:netrw_explore_bufnr")  |unlet w:netrw_explore_bufnr  |endif
3123 "   redraw!
3124    echo " "
3125    echo " "
3126 "   call Dret("netrw#Explore : cleared list")
3127    return
3128   endif
3130   if dirname =~ '/\*\*/'
3131    " handle .../**/.../filepat
3132 "   call Decho("case Explore .../**/.../filepat")
3133    let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
3134    if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
3135     let b:netrw_curdir = prefixdir
3136    else
3137     let b:netrw_curdir= getcwd().'/'.prefixdir
3138    endif
3139    let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
3140    let starpat= 4;
3141 "   call Decho("pwd<".getcwd()."> dirname<".dirname.">")
3142 "   call Decho("case Explore ../**/../filepat (starpat=".starpat.")")
3144   elseif dirname =~ '^\*//'
3145    " starpat=1: Explore *//pattern   (current directory only search for files containing pattern)
3146 "   call Decho("case Explore *//pattern")
3147    let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
3148    let starpat= 1
3149 "   call Decho("Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3150    if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3152   elseif dirname =~ '^\*\*//'
3153    " starpat=2: Explore **//pattern  (recursive descent search for files containing pattern)
3154 "   call Decho("case Explore **//pattern")
3155    let pattern= substitute(dirname,'^\*\*//','','')
3156    let starpat= 2
3157 "   call Decho("Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3159   elseif dirname =~ '^\*/'
3160    " starpat=3: Explore */filepat   (search in current directory for filenames matching filepat)
3161    let starpat= 3
3162 "   call Decho("case Explore */filepat (starpat=".starpat.")")
3164   elseif dirname=~ '^\*\*/'
3165    " starpat=4: Explore **/filepat  (recursive descent search for filenames matching filepat)
3166    let starpat= 4
3167 "   call Decho("case Explore **/filepat (starpat=".starpat.")")
3168   else
3169    let starpat= 0
3170   endif
3172   if starpat == 0 && a:indx >= 0
3173    " [Explore Hexplore Vexplore Sexplore] [dirname]
3174 "   call Decho("case dirname<".dirname."> a:indx=".a:indx.": Explore Hexplore Vexplore Sexplore")
3175    if dirname == ""
3176     let dirname= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3177    endif
3178    if dirname =~ '^scp:' || dirname =~ '^ftp:'
3179 "    call Decho("calling NetrwBrowse(0,dirname<".dirname.">)")
3180     call s:NetrwBrowse(0,dirname)
3181    else
3182     if dirname == ""|let dirname= getcwd()|endif
3183 "    call Decho("calling LocalBrowseCheck(dirname<".dirname.">)")
3184     call netrw#LocalBrowseCheck(dirname)
3185    endif
3187 "   call Decho("curfile<".curfile.">")
3188    if has("win32") || has("win95") || has("win64") || has("win16")
3189     call search('\<'.substitute(curfile,'^.*[/\\]','','e').'\>','cW')
3190    else
3191     call search('\<'.substitute(curfile,'^.*/','','e').'\>','cW')
3192    endif
3194   " starpat=1: Explore *//pattern  (current directory only search for files containing pattern)
3195   " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3196   " starpat=3: Explore */filepat   (search in current directory for filenames matching filepat)
3197   " starpat=4: Explore **/filepat  (recursive descent search for filenames matching filepat)
3198   elseif a:indx <= 0
3199    " Nexplore, Pexplore, Explore: handle starpat
3200 "   call Decho("case Nexplore, Pexplore, <s-down>, <s-up>: starpat=".starpat." a:indx=".a:indx)
3201    if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
3202 "    call Decho("set up <s-up> and <s-down> maps")
3203     let s:didstarstar= 1
3204     nnoremap <buffer> <silent> <s-up>   :Pexplore<cr>
3205     nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
3206    endif
3208    if has("path_extra")
3209 "    call Decho("starpat=".starpat.": has +path_extra")
3210     if !exists("w:netrw_explore_indx")
3211      let w:netrw_explore_indx= 0
3212     endif
3213     let indx = a:indx
3214 "    call Decho("starpat=".starpat.": set indx= [a:indx=".indx."]")
3216     if indx == -1
3217      " Nexplore
3218 "     call Decho("case Nexplore with starpat=".starpat.": (indx=".indx.")")
3219      if !exists("w:netrw_explore_list") " sanity check
3220       call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
3221       silent! let @* = keepregstar
3222       silent! let @+ = keepregstar
3223       silent! let @/ = keepregslash
3224 "      call Dret("netrw#Explore")
3225       return
3226      endif
3227      let indx= w:netrw_explore_indx
3228      if indx < 0                        | let indx= 0                           | endif
3229      if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3230      let curfile= w:netrw_explore_list[indx]
3231 "     call Decho("indx=".indx." curfile<".curfile.">")
3232      while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
3233       let indx= indx + 1
3234 "      call Decho("indx=".indx." (Nexplore while loop)")
3235      endwhile
3236      if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3237 "     call Decho("Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3239     elseif indx == -2
3240      " Pexplore
3241 "     call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")")
3242      if !exists("w:netrw_explore_list") " sanity check
3243       call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
3244       silent! let @* = keepregstar
3245       silent! let @+ = keepregstar
3246       silent! let @/ = keepregslash
3247 "      call Dret("netrw#Explore")
3248       return
3249      endif
3250      let indx= w:netrw_explore_indx
3251      if indx < 0                        | let indx= 0                           | endif
3252      if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3253      let curfile= w:netrw_explore_list[indx]
3254 "     call Decho("indx=".indx." curfile<".curfile.">")
3255      while indx >= 0 && curfile == w:netrw_explore_list[indx]
3256       let indx= indx - 1
3257 "      call Decho("indx=".indx." (Pexplore while loop)")
3258      endwhile
3259      if indx < 0                        | let indx= 0                           | endif
3260 "     call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3262     else
3263      " Explore -- initialize
3264      " build list of files to Explore with Nexplore/Pexplore
3265 "     call Decho("starpat=".starpat.": case Explore: initialize (indx=".indx.")")
3266      let w:netrw_explore_indx= 0
3267      if !exists("b:netrw_curdir")
3268       let b:netrw_curdir= getcwd()
3269      endif
3270 "     call Decho("starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
3272      " switch on starpat to build the w:netrw_explore_list of files
3273      if starpat == 1
3274       " starpat=1: Explore *//pattern  (current directory only search for files containing pattern)
3275 "      call Decho("starpat=".starpat.": build *//pattern list")
3276       exe "vimgrep /".pattern."/gj ".b:netrw_curdir."/*"
3277       let w:netrw_explore_list = map(getqflist(),'bufname(v:val.bufnr)')
3278       if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3280      elseif starpat == 2
3281       " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3282 "      call Decho("starpat=".starpat.": build **//pattern list")
3283       try
3284        exe "silent vimgrep /".pattern."/gj "."**/*"
3285       catch /^Vim\%((\a\+)\)\=:E480/
3286         call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
3287        if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3288        silent! let @* = keepregstar
3289        silent! let @+ = keepregstar
3290        silent! let @/ = keepregslash
3291 "       call Dret("netrw#Explore : no files matched pattern")
3292        return
3293       endtry
3294       let s:netrw_curdir       = b:netrw_curdir
3295       let w:netrw_explore_list = getqflist()
3296       let w:netrw_explore_list = map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)')
3298      elseif starpat == 3
3299       " starpat=3: Explore */filepat   (search in current directory for filenames matching filepat)
3300 "      call Decho("starpat=".starpat.": build */filepat list")
3301       let dirname             = substitute(dirname,'^\*/','','')
3302       let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
3303       if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
3305      elseif starpat == 4
3306       " starpat=4: Explore **/filepat  (recursive descent search for filenames matching filepat)
3307 "      call Decho("starpat=".starpat.": build **/filepat list")
3308       let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
3309       if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
3310      endif " switch on starpat to build w:netrw_explore_list
3312      let w:netrw_explore_listlen = len(w:netrw_explore_list)
3313 "     call Decho("w:netrw_explore_list<".string(w:netrw_explore_list).">")
3314 "     call Decho("w:netrw_explore_listlen=".w:netrw_explore_listlen)
3316      if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
3317       call netrw#ErrorMsg(s:WARNING,"no files matched",42)
3318       silent! let @* = keepregstar
3319       silent! let @+ = keepregstar
3320       silent! let @/ = keepregslash
3321 "      call Dret("netrw#Explore : no files matched")
3322       return
3323      endif
3324     endif  " if indx ... endif
3326     " NetrwStatusLine support - for exploring support
3327     let w:netrw_explore_indx= indx
3328 "    call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
3330     " wrap the indx around, but issue a note
3331     if indx >= w:netrw_explore_listlen || indx < 0
3332 "     call Decho("wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
3333      let indx                = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
3334      let w:netrw_explore_indx= indx
3335      call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
3336      sleep 1
3337     endif
3339     exe "let dirfile= w:netrw_explore_list[".indx."]"
3340 "    call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
3341     let newdir= substitute(dirfile,'/[^/]*$','','e')
3342 "    call Decho("newdir<".newdir.">")
3344 "    call Decho("calling LocalBrowseCheck(newdir<".newdir.">)")
3345     call netrw#LocalBrowseCheck(newdir)
3346     if !exists("w:netrw_liststyle")
3347      let w:netrw_liststyle= g:netrw_liststyle
3348     endif
3349     if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
3350      call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
3351     else
3352      call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
3353     endif
3354     let w:netrw_explore_mtchcnt = indx + 1
3355     let w:netrw_explore_bufnr   = bufnr("%")
3356     let w:netrw_explore_line    = line(".")
3357     call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
3358 "    call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
3360    else
3361 "    call Decho("your vim does not have +path_extra")
3362     if !exists("g:netrw_quiet")
3363      call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
3364     endif
3365     silent! let @* = keepregstar
3366     silent! let @+ = keepregstar
3367     silent! let @/ = keepregslash
3368 "    call Dret("netrw#Explore : missing +path_extra")
3369     return
3370    endif
3372   else
3373 "   call Decho("case Explore newdir<".dirname.">")
3374    if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
3375     silent! unlet w:netrw_treedict
3376     silent! unlet w:netrw_treetop
3377    endif
3378    let newdir= dirname
3379    if !exists("b:netrw_curdir")
3380     call netrw#LocalBrowseCheck(getcwd())
3381    else
3382     call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
3383    endif
3384   endif
3386   " visual display of **/ **// */ Exploration files
3387   if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
3388    if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
3389     " only update match list if current directory isn't the same as before
3390     let s:explore_prvdir = b:netrw_curdir
3391     let s:explore_match  = ""
3392     let dirlen           = strlen(b:netrw_curdir)
3393     if b:netrw_curdir !~ '/$'
3394      let dirlen= dirlen + 1
3395     endif
3396     let prvfname= ""
3397     for fname in w:netrw_explore_list
3398 "     call Decho("fname<".fname.">")
3399      if fname =~ '^'.b:netrw_curdir
3400       if s:explore_match == ""
3401        let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3402       else
3403        let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3404       endif
3405      elseif fname !~ '^/' && fname != prvfname
3406       if s:explore_match == ""
3407        let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3408       else
3409        let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3410       endif
3411      endif
3412      let prvfname= fname
3413     endfor
3414 "    call Decho("explore_match<".s:explore_match.">")
3415     exe "2match netrwMarkFile /".s:explore_match."/"
3416    endif
3417    echo "<s-up>==Pexplore  <s-down>==Nexplore"
3418   else
3419    2match none
3420    if exists("s:explore_match")  | unlet s:explore_match  | endif
3421    if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
3422    echo " "
3423 "   call Decho("cleared explore match list")
3424   endif
3426   silent! let @* = keepregstar
3427   silent! let @+ = keepregstar
3428   silent! let @/ = keepregslash
3429 "  call Dret("netrw#Explore : @/<".@/.">")
3430 endfun
3432 " ---------------------------------------------------------------------
3433 " s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
3434 "          and switches the hiding mode.  The actual hiding is done by
3435 "          s:NetrwListHide().
3436 "             g:netrw_hide= 0: show all
3437 "                           1: show not-hidden files
3438 "                           2: show hidden files only
3439 fun! s:NetrwHide(islocal)
3440 "  call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
3441   let svpos= netrw#NetrwSavePosn()
3443   if exists("s:netrwmarkfilelist_{bufnr('%')}")
3444 "   call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
3445 "   call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
3447    " hide the files in the markfile list
3448    for fname in s:netrwmarkfilelist_{bufnr("%")}
3449 "    call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk)
3450     if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
3451      " remove fname from hiding list
3452      let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
3453      let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
3454      let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
3455 "     call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">")
3456     else
3457      " append fname to hiding list
3458      if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
3459       let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
3460      else
3461       let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
3462      endif
3463 "     call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
3464     endif
3465    endfor
3466    unlet s:netrwmarkfilelist_{bufnr("%")}
3467    unlet s:netrwmarkfilemtch_{bufnr("%")}
3468    2match none
3469    let g:netrw_hide= 1
3471   else
3473    " switch between show-all/show-not-hidden/show-hidden
3474    let g:netrw_hide=(g:netrw_hide+1)%3
3475    exe "norm! 0"
3476    if g:netrw_hide && g:netrw_list_hide == ""
3477     call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
3478 "    call Dret("NetrwHide")
3479     return
3480    endif
3481   endif
3483   call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3484   call netrw#NetrwRestorePosn(svpos)
3485 "  call Dret("NetrwHide")
3486 endfun
3488 " ---------------------------------------------------------------------
3489 " s:NetrwHidden: invoked by "gh" {{{2
3490 fun! s:NetrwHidden(islocal)
3491 "  call Dfunc("s:NetrwHidden()")
3492   "  save current position
3493   let svpos= netrw#NetrwSavePosn()
3495   if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
3496    " remove pattern from hiding list
3497    let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
3498   elseif strlen(g:netrw_list_hide) >= 1
3499    let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
3500   else
3501    let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
3502   endif
3504   " refresh screen and return to saved position
3505   call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3506   call netrw#NetrwRestorePosn(svpos)
3507 "  call Dret("s:NetrwHidden")
3508 endfun
3510 " ---------------------------------------------------------------------
3511 " s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
3512 fun! s:NetrwLeftmouse(islocal)
3513 "  call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
3514   if a:islocal
3515    if exists("b:netrw_curdir")
3516     call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
3517    endif
3518   else
3519    if exists("b:netrw_curdir")
3520     call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
3521    endif
3522   endif
3523 "  call Dret("s:NetrwLeftmouse")
3524 endfun
3526 " ---------------------------------------------------------------------
3527 " s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
3528 " separated patterns given in g:netrw_list_hide
3529 fun! s:NetrwListHide()
3530 "  call Dfunc("NetrwListHide() hide=".g:netrw_hide." listhide<".g:netrw_list_hide.">")
3532   " find a character not in the "hide" string to use as a separator for :g and :v commands
3533   " How-it-works: take the hiding command, convert it into a range.  Duplicate
3534   " characters don't matter.  Remove all such characters from the '/~...90'
3535   " string.  Use the first character left as a separator character.
3536   let listhide= g:netrw_list_hide
3537   let sep     = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
3538 "  call Decho("sep=".sep)
3540   while listhide != ""
3541    if listhide =~ ','
3542     let hide     = substitute(listhide,',.*$','','e')
3543     let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
3544    else
3545     let hide     = listhide
3546     let listhide = ""
3547    endif
3549    " Prune the list by hiding any files which match
3550    if g:netrw_hide == 1
3551 "    call Decho("hiding<".hide."> listhide<".listhide.">")
3552     exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
3553    elseif g:netrw_hide == 2
3554 "    call Decho("showing<".hide."> listhide<".listhide.">")
3555     exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
3556    endif
3557   endwhile
3558   if g:netrw_hide == 2
3559    exe 'silent keepjumps '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
3560    exe 'silent keepjumps '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
3561   endif
3563 "  call Dret("NetrwListHide")
3564 endfun
3566 " ---------------------------------------------------------------------
3567 " NetrwHideEdit: allows user to edit the file/directory hiding list
3568 fun! s:NetrwHideEdit(islocal)
3569 "  call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
3571   " save current cursor position
3572   let svpos= netrw#NetrwSavePosn()
3574   " get new hiding list from user
3575   call inputsave()
3576   let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
3577   call inputrestore()
3578   let g:netrw_list_hide= newhide
3579 "  call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
3581   " refresh the listing
3582   silent call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
3584   " restore cursor position
3585   call netrw#NetrwRestorePosn(svpos)
3587 "  call Dret("NetrwHideEdit")
3588 endfun
3590 " ---------------------------------------------------------------------
3591 " NetSortSequence: allows user to edit the sorting sequence
3592 fun! s:NetSortSequence(islocal)
3593 "  call Dfunc("NetSortSequence(islocal=".a:islocal.")")
3595   let svpos= netrw#NetrwSavePosn()
3596   call inputsave()
3597   let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
3598   call inputrestore()
3600   " refresh the listing
3601   let g:netrw_sort_sequence= newsortseq
3602   call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3603   call netrw#NetrwRestorePosn(svpos)
3605 "  call Dret("NetSortSequence")
3606 endfun
3608 " ---------------------------------------------------------------------
3609 " s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
3610 fun! s:NetrwMakeDir(usrhost)
3611 "  call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
3613   " get name of new directory from user.  A bare <CR> will skip.
3614   " if its currently a directory, also request will be skipped, but with
3615   " a message.
3616   call inputsave()
3617   let newdirname= input("Please give directory name: ")
3618   call inputrestore()
3619 "  call Decho("newdirname<".newdirname.">")
3621   if newdirname == ""
3622 "   call Dret("NetrwMakeDir : user aborted with bare <cr>")
3623    return
3624   endif
3626   if a:usrhost == ""
3627 "   call Decho("local mkdir")
3629    " Local mkdir:
3630    " sanity checks
3631    let fullnewdir= b:netrw_curdir.'/'.newdirname
3632 "   call Decho("fullnewdir<".fullnewdir.">")
3633    if isdirectory(fullnewdir)
3634     if !exists("g:netrw_quiet")
3635      call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
3636     endif
3637 "    call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
3638     return
3639    endif
3640    if s:FileReadable(fullnewdir)
3641     if !exists("g:netrw_quiet")
3642      call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
3643     endif
3644 "    call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
3645     return
3646    endif
3648    " requested new local directory is neither a pre-existing file or
3649    " directory, so make it!
3650    if exists("*mkdir")
3651     call mkdir(fullnewdir,"p")
3652    else
3653     let netrw_origdir= s:NetrwGetcwd(1)
3654     exe 'keepjumps lcd '.fnameescape(b:netrw_curdir)
3655 "    call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
3656 "    call Decho("exe silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1))
3657     exe "silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1)
3658     if !g:netrw_keepdir
3659      exe 'keepjumps lcd '.fnameescape(netrw_origdir)
3660 "     call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
3661     endif
3662    endif
3664    if v:shell_error == 0
3665     " refresh listing
3666 "    call Decho("refresh listing")
3667     let svpos= netrw#NetrwSavePosn()
3668     call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
3669     call netrw#NetrwRestorePosn(svpos)
3670    elseif !exists("g:netrw_quiet")
3671     call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
3672    endif
3673 "   redraw!
3675   elseif !exists("b:netrw_method") || b:netrw_method == 4
3676    " Remote mkdir:
3677 "   call Decho("remote mkdir")
3678    let mkdircmd  = s:MakeSshCmd(g:netrw_mkdir_cmd)
3679    let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
3680 "   call Decho("exe silent! !".mkdircmd." ".shellescape(newdirname,1))
3681    exe "silent! !".mkdircmd." ".shellescape(newdirname,1)
3682    if v:shell_error == 0
3683     " refresh listing
3684     let svpos= netrw#NetrwSavePosn()
3685     call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
3686     call netrw#NetrwRestorePosn(svpos)
3687    elseif !exists("g:netrw_quiet")
3688     call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
3689    endif
3690 "   redraw!
3692   elseif b:netrw_method == 2
3693    " COMBAK -- future work
3694    call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
3695   elseif b:netrw_method == 3
3696    " COMBAK -- future work
3697    call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
3698   endif
3700 "  call Dret("NetrwMakeDir")
3701 endfun
3703 " ---------------------------------------------------------------------
3704 " s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
3705 "                  mark and unmark files.  If a markfile list exists,
3706 "                  then the rename and delete functions will use it instead
3707 "                  of whatever may happen to be under the cursor at that
3708 "                  moment.  When the mouse and gui are available,
3709 "                  shift-leftmouse may also be used to mark files.
3710 fun! s:NetrwMarkFile(islocal,fname)
3711 "  call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
3712   let curbufnr= bufnr("%")
3713   let curdir  = b:netrw_curdir
3714   if exists("s:netrwmarkfilelist_{curbufnr}")
3715    " markfile list exists
3716 "   call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
3717 "   call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
3719    if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
3720     " append filename to local-directory markfilelist
3721 "    call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3722     call add(s:netrwmarkfilelist_{curbufnr},a:fname)
3723     let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3725    else
3726     " remove filename from local markfilelist
3727 "    call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3728     call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
3729     if s:netrwmarkfilelist_{curbufnr} == []
3730      " local markfilelist is empty; remove it entirely
3731 "     call Decho("markfile list now empty, unlet s:netrwmarkfilelist_".curbufnr." and ...mtch_".curbufnr)
3732      call s:NetrwUnmarkList(curbufnr,curdir)
3733     else
3734      " rebuild match list to display markings correctly
3735 "     call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
3736      let s:netrwmarkfilemtch_{curbufnr}= ""
3737      let first                           = 1
3738      for fname in s:netrwmarkfilelist_{curbufnr}
3739       if first
3740        let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3741       else
3742        let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3743       endif
3744       let first= 0
3745      endfor
3746 "     call Decho("ending s:netrwmarkfilelist_"curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3747 "     call Decho("ending s:netrwmarkfilemtch_"curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
3748     endif
3749    endif
3751   else
3752    " initialize new markfilelist
3754 "   call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
3755    let s:netrwmarkfilelist_{curbufnr}= []
3756    call add(s:netrwmarkfilelist_{curbufnr},a:fname)
3757 "   call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
3759    " build initial markfile matching pattern
3760    if a:fname =~ '/$'
3761     let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
3762    else
3763     let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).'\>'
3764    endif
3765 "   call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
3766   endif
3768   " handle global markfilelist
3769   if exists("s:netrwmarkfilelist")
3770    let dname= s:ComposePath(b:netrw_curdir,a:fname)
3771    if index(s:netrwmarkfilelist,dname) == -1
3772     " append new filename to global markfilelist
3773     call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
3774 "    call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
3775    else
3776     " remove new filename from global markfilelist
3777 "    call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
3778     call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
3779 "    call Decho("ending s:netrwmarkfilelist  <".string(s:netrwmarkfilelist).">")
3780     if s:netrwmarkfilelist == []
3781      unlet s:netrwmarkfilelist
3782     endif
3783    endif
3784   else
3785    " initialize new global-directory markfilelist
3786    let s:netrwmarkfilelist= []
3787    call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
3788 "   call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
3789   endif
3791   " set up 2match'ing to netrwmarkfilemtch list
3792   if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
3793 "   call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
3794    exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
3795   else
3796 "   call Decho("2match none")
3797    2match none
3798   endif
3799 "  call Dret("s:NetrwMarkFile : netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist").">")
3800 endfun
3802 " ---------------------------------------------------------------------
3803 " s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
3804 "                          compress/decompress files using the programs
3805 "                          in g:netrw_compress and g:netrw_uncompress,
3806 "                          using g:netrw_compress_suffix to know which to
3807 "                          do.  By default:
3808 "                            g:netrw_compress        = "gzip"
3809 "                            g:netrw_decompress      = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"}
3810 fun! s:NetrwMarkFileCompress(islocal)
3811 "  call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
3812   let svpos    = netrw#NetrwSavePosn()
3813   let curdir   = b:netrw_curdir
3814   let curbufnr = bufnr("%")
3816   if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
3817    for fname in s:netrwmarkfilelist_{curbufnr}
3818     " for every filename in the marked list
3819     for sfx in sort(keys(g:netrw_decompress))
3820      if fname =~ '\'.sfx.'$'
3821       " fname has a suffix indicating that its compressed; apply associated decompression routine
3822       let exe= s:WinPath(g:netrw_decompress[sfx])
3823 "      call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
3824       if a:islocal
3825        if g:netrw_keepdir
3826         let fname= shellescape(s:ComposePath(curdir,fname))
3827        endif
3828       else
3829        let fname= shellescape(b:netrw_curdir.fname)
3830       endif
3831       if executable(exe)
3832        if a:islocal
3833         call system(exe." ".fname)
3834        else
3835         call s:RemoteSystem(exe." ".fname)
3836        endif
3837       else
3838        call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
3839       endif
3840       break
3841      endif
3842     endfor
3843     if exists("exe")
3844      unlet exe
3845     elseif a:islocal
3846      " fname not a compressed file, so compress it
3847      call system(s:WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname)))
3848     else
3849      " fname not a compressed file, so compress it
3850      call s:RemoteSystem(s:WinPath(g:netrw_compress)." ".shellescape(fname))
3851     endif
3852    endfor
3853    call s:NetrwUnmarkList(curbufnr,curdir)
3854    call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3855    call netrw#NetrwRestorePosn(svpos)
3856   endif
3857 "  call Dret("s:NetrwMarkFileCompress")
3858 endfun
3860 " ---------------------------------------------------------------------
3861 " s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
3862 "                      If no marked files, then set up directory as the
3863 "                      target.  Currently does not support copying entire
3864 "                      directories.  Uses the local-buffer marked file list.
3865 "                      Returns 1=success  (used by NetrwMarkFileMove())
3866 "                              0=failure
3867 fun! s:NetrwMarkFileCopy(islocal)
3868 "  call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">")
3870   " sanity checks
3871   if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
3872    call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
3873 "   call Dret("s:NetrwMarkFileCopy 0")
3874    return 0
3875   endif
3876 "  call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
3877   if !exists("s:netrwmftgt")
3878    call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
3879 "   call Dret("s:NetrwMarkFileCopy 0")
3880    return 0
3881   endif
3882 "  call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
3883   let curdir   = b:netrw_curdir
3884   let curbufnr = bufnr("%")
3886   if      a:islocal &&  s:netrwmftgt_islocal
3887    " Copy marked files, local directory to local directory
3888 "   call Decho("copy from local to local")
3889    let args= join(map(copy(s:netrwmarkfilelist_{bufnr('%')}),"b:netrw_curdir.\"/\".shellescape(v:val)"))
3890 "   call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")")
3891    call system(s:WinPath(g:netrw_localcopycmd)." ".args." ".shellescape(s:netrwmftgt))
3893   elseif  a:islocal && !s:netrwmftgt_islocal
3894    " Copy marked files, local directory to remote directory
3895 "   call Decho("copy from local to remote")
3896    call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
3898   elseif !a:islocal &&  s:netrwmftgt_islocal
3899 "   call Decho("copy from remote to local")
3900    call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
3902   elseif !a:islocal && !s:netrwmftgt_islocal
3903 "   call Decho("copy from remote to remote")
3904    let curdir = getcwd()
3905    let tmpdir = s:GetTempfile("")
3906    if tmpdir !~ '/'
3907     let tmpdir= curdir."/".tmpdir
3908    endif
3909    if exists("*mkdir")
3910     call mkdir(tmpdir)
3911    else
3912     exe "silent! !".g:netrw_local_mkdir.' '.shellescape(tmpdir,1)
3913    endif
3914    if isdirectory(tmpdir)
3915     exe "keepjumps lcd ".fnameescape(tmpdir)
3916     call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
3917     let localfiles= map(copy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
3918     call s:NetrwUpload(localfiles,s:netrwmftgt)
3919     if getcwd() == tmpdir
3920      for fname in s:netrwmarkfilelist_{bufnr('%')}
3921       call s:NetrwDelete(fname)
3922      endfor
3923      exe "keepjumps lcd ".fnameescape(curdir)
3924      exe "silent !".g:netrw_local_rmdir." ".shellescape(tmpdir,1)
3925     else
3926      exe "keepjumps lcd ".fnameescape(curdir)
3927     endif
3928    endif
3929   endif
3931   " -------
3932   " cleanup
3933   " -------
3934 "  call Decho("cleanup")
3936   " remove markings from local buffer
3937   call s:NetrwUnmarkList(curbufnr,curdir)
3939   " refresh buffers
3940   if !s:netrwmftgt_islocal
3941    call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
3942   endif
3943   if a:islocal
3944    call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
3945   endif
3946   call s:LocalBrowseShellCmdRefresh()
3947   
3948 "  call Dret("s:NetrwMarkFileCopy 1")
3949   return 1
3950 endfun
3952 " ---------------------------------------------------------------------
3953 " s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
3954 "                      invoke vim's diff mode on the marked files.
3955 "                      Either two or three files can be so handled.
3956 "                      Uses the global marked file list.
3957 fun! s:NetrwMarkFileDiff(islocal)
3958 "  call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
3959   let curbufnr= bufnr("%")
3960   if exists("s:netrwmarkfilelist_{curbufnr}")
3962    let cnt    = 0
3963    let curdir = b:netrw_curdir
3964    for fname in s:netrwmarkfilelist
3965     let cnt= cnt + 1
3966     if !a:islocal
3967      let fname= curdir.fname
3968     endif
3969     if cnt == 1
3970 "     call Decho("diffthis: ".fname)
3971      exe "e ".fname
3972      diffthis
3973     elseif cnt == 2 || cnt == 3
3974      vsplit
3975      wincmd l
3976 "     call Decho("diffthis: ".fname)
3977      exe "e ".fname
3978      diffthis
3979     else
3980      break
3981     endif
3982    endfor
3983    call s:NetrwUnmarkList(curbufnr,curdir)
3984   endif
3985 "  call Dret("s:NetrwMarkFileDiff")
3986 endfun
3988 " ---------------------------------------------------------------------
3989 " s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
3990 "                       Uses global markfilelist
3991 fun! s:NetrwMarkFileEdit(islocal)
3992 "  call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
3994   let curdir   = b:netrw_curdir
3995   let curbufnr = bufnr("%")
3996   if exists("s:netrwmarkfilelist_{curbufnr}")
3997    call s:SetRexDir(a:islocal,curdir)
3998    if a:islocal && g:netrw_keepdir
3999     " use complete paths if its local and keepdir enabled
4000     let flist= ""
4001     for fname in s:netrwmarkfilelist
4002 "     let flist= flist." ".s:ComposePath(curdir,fname)
4003      let flist= flist." ".fname
4004     endfor
4005    else
4006 "    let flist= substitute(escape(join(s:netrwmarkfilelist_{curbufnr},"\t"),' '),"\t",' ','g')
4007     let flist= substitute(escape(join(s:netrwmarkfilelist,"\t"),' '),"\t",' ','g')
4008    endif
4009    " unmark markedfile list
4010 "   call s:NetrwUnmarkList(curbufnr,curdir)
4011    call s:NetrwUnmarkAll()
4012 "   call Decho("exe silent args ".flist)
4013    exe "silent args ".flist
4014   endif
4015   
4016 "  call Dret("s:NetrwMarkFileEdit")
4017 endfun
4019 " ---------------------------------------------------------------------
4020 " s:NetrwMarkFileExe: (invoked by mx) execute arbitrary command on marked files, one at a time {{{2
4021 "                     Uses the local marked-file list.
4022 fun! s:NetrwMarkFileExe(islocal)
4023 "  call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
4024   let svpos    = netrw#NetrwSavePosn()
4025   let curdir   = b:netrw_curdir
4026   let curbufnr = bufnr("%")
4028   if exists("s:netrwmarkfilelist_{curbufnr}")
4029    " get the command
4030    call inputsave()
4031    let cmd= input("Enter command: ","","file")
4032    call inputrestore()
4033 "   call Decho("cmd<".cmd.">")
4035    " apply command to marked files.  Substitute: filename -> %
4036    " If no %, then append a space and the filename to the command
4037    for fname in s:netrwmarkfilelist_{curbufnr}
4038     if a:islocal
4039      if g:netrw_keepdir
4040       let fname= shellescape(s:WinPath(s:ComposePath(curdir,fname)))
4041      endif
4042     else
4043      let fname= shellescape(s:WinPath(b:netrw_curdir.fname))
4044     endif
4045     if cmd =~ '%'
4046      let xcmd= substitute(cmd,'%',fname,'g')
4047     else
4048      let xcmd= cmd.' '.fname
4049     endif
4050     if a:islocal
4051 "     call Decho("local: xcmd<".xcmd.">")
4052      let ret= system(xcmd)
4053     else
4054 "     call Decho("remote: xcmd<".xcmd.">")
4055      let ret= s:RemoteSystem(xcmd)
4056     endif
4057     if v:shell_error < 0
4058      call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
4059      break
4060     else
4061      echo ret
4062     endif
4063    endfor
4065    " unmark marked file list
4066    call s:NetrwUnmarkList(curbufnr,curdir)
4068    " refresh the listing
4069    call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4070    call netrw#NetrwRestorePosn(svpos)
4071   else
4072    call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
4073   endif
4074   
4075 "  call Dret("s:NetrwMarkFileExe")
4076 endfun
4078 " ---------------------------------------------------------------------
4079 " s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
4080 "                  as the marked file(s) (toggles suffix presence)
4081 "                  Uses the local marked file list.
4082 fun! s:NetrwMarkHideSfx(islocal)
4083 "  call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
4084   let svpos    = netrw#NetrwSavePosn()
4085   let curbufnr = bufnr("%")
4087   " s:netrwmarkfilelist_{curbufnr}: the List of marked files
4088   if exists("s:netrwmarkfilelist_{curbufnr}")
4090    for fname in s:netrwmarkfilelist_{curbufnr}
4091 "     call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
4092      " construct suffix pattern
4093      if fname =~ '\.'
4094       let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
4095      else
4096       let sfxpat= '^\%(\%(\.\)\@!.\)*$'
4097      endif
4098      " determine if its in the hiding list or not
4099      let inhidelist= 0
4100      if g:netrw_list_hide != ""
4101       let itemnum = 0
4102       let hidelist= split(g:netrw_list_hide,',')
4103       for hidepat in hidelist
4104        if sfxpat == hidepat
4105         let inhidelist= 1
4106         break
4107        endif
4108        let itemnum= itemnum + 1
4109       endfor
4110      endif
4111 "     call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
4112      if inhidelist
4113       " remove sfxpat from list
4114       call remove(hidelist,itemnum)
4115       let g:netrw_list_hide= join(hidelist,",")
4116      elseif g:netrw_list_hide != ""
4117       " append sfxpat to non-empty list
4118       let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
4119      else
4120       " set hiding list to sfxpat
4121       let g:netrw_list_hide= sfxpat
4122      endif
4123     endfor
4125    " refresh the listing
4126    call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4127    call netrw#NetrwRestorePosn(svpos)
4128   else
4129    call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
4130   endif
4132 "  call Dret("s:NetrwMarkHideSfx")
4133 endfun
4135 " ---------------------------------------------------------------------
4136 " s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
4137 "                     Uses the global markfilelist
4138 fun! s:NetrwMarkFileGrep(islocal)
4139 "  call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
4140   let svpos    = netrw#NetrwSavePosn()
4141   let curdir   = b:netrw_curdir
4142   let curbufnr = bufnr("%")
4144   if exists("s:netrwmarkfilelist")
4145 "  call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
4146    let netrwmarkfilelist= ""
4147    for fname in s:netrwmarkfilelist
4148 "    call Decho("fname<".fname.">")
4149     let fname             = escape(substitute(fname,"[\"']","","g")," ")
4150     let netrwmarkfilelist = netrwmarkfilelist." ".fname
4151    endfor
4152    call s:NetrwUnmarkAll()
4154    " ask user for pattern
4155    call inputsave()
4156    let pat= input("Enter pattern: ","")
4157    call inputrestore()
4158    if pat !~ '^\s'
4159     if pat !~ '^/'
4160      let pat= '/'.pat.'/'
4161     endif
4162     let pat= " ".pat
4163    endif
4165    " use vimgrep for both local and remote
4166 "   call Decho("exe vimgrep".pat." ".netrwmarkfilelist)
4167    exe "vimgrep".pat." ".netrwmarkfilelist
4169    2match none
4170    call netrw#NetrwRestorePosn(svpos)
4171   endif
4173 "  call Dret("s:NetrwMarkFileGrep")
4174 endfun
4176 " ---------------------------------------------------------------------
4177 " s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
4178 "                      uses the global marked file list
4179 "                      s:netrwmfloc= 0: target directory is remote
4180 "                                  = 1: target directory is local
4181 fun! s:NetrwMarkFileMove(islocal)
4182 "  call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
4183   let curdir   = b:netrw_curdir
4184   let curbufnr = bufnr("%")
4186   " sanity check
4187   if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
4188    call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
4189 "   call Dret("s:NetrwMarkFileMove")
4190    return
4191   endif
4192 "  call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
4193   if !exists("s:netrwmftgt")
4194    call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
4195 "   call Dret("s:NetrwMarkFileCopy 0")
4196    return 0
4197   endif
4198 "  call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
4200   if      a:islocal &&  s:netrwmftgt_islocal
4201    " move: local -> local
4202 "   call Decho("move from local to local")
4203 "   call Decho("(s:NetrwMarkFileMove) local to local move")
4204    if executable(g:netrw_localmovecmd)
4205     for fname in s:netrwmarkfilelist_{bufnr("%")}
4206 "     call Decho("system(".g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt).")")
4207      let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt))
4208      if v:shell_error < 0
4209       call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54)
4210       break
4211      endif
4212     endfor
4213    else
4214     call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57)
4215    endif
4217   elseif  a:islocal && !s:netrwmftgt_islocal
4218    " move: local -> remote
4219 "   call Decho("move from local to remote")
4220 "   call Decho("copy")
4221    let mflist= s:netrwmarkfilelist_{bufnr("%")}
4222    call s:NetrwMarkFileCopy(a:islocal)
4223 "   call Decho("remove")
4224    for fname in mflist
4225     let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4226     let ok        = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
4227    endfor
4228    unlet mflist
4230   elseif !a:islocal &&  s:netrwmftgt_islocal
4231    " move: remote -> local
4232 "   call Decho("move from remote to local")
4233 "   call Decho("copy")
4234    let mflist= s:netrwmarkfilelist_{bufnr("%")}
4235    call s:NetrwMarkFileCopy(a:islocal)
4236 "   call Decho("remove")
4237    for fname in mflist
4238     let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4239     let ok        = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4240    endfor
4241    unlet mflist
4243   elseif !a:islocal && !s:netrwmftgt_islocal
4244    " move: remote -> remote
4245 "   call Decho("move from remote to remote")
4246 "   call Decho("copy")
4247    let mflist= s:netrwmarkfilelist_{bufnr("%")}
4248    call s:NetrwMarkFileCopy(a:islocal)
4249 "   call Decho("remove")
4250    for fname in mflist
4251     let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4252     let ok        = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4253    endfor
4254    unlet mflist
4255   endif
4257   " -------
4258   " cleanup
4259   " -------
4260 "  call Decho("cleanup")
4262   " remove markings from local buffer
4263   call s:NetrwUnmarkList(curbufnr,curdir)                   " remove markings from local buffer
4265   " refresh buffers
4266   if !s:netrwmftgt_islocal
4267    call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
4268   endif
4269   if a:islocal
4270    call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
4271   endif
4272   call s:LocalBrowseShellCmdRefresh()
4273   
4274 "  call Dret("s:NetrwMarkFileMove")
4275 endfun
4277 " ---------------------------------------------------------------------
4278 " s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
4279 "                       using the hardcopy command.  Local marked-file list only.
4280 fun! s:NetrwMarkFilePrint(islocal)
4281 "  call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
4282   let curbufnr= bufnr("%")
4283   if exists("s:netrwmarkfilelist_{curbufnr}")
4284    let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
4285    let curdir            = b:netrw_curdir
4286    call s:NetrwUnmarkList(curbufnr,curdir)
4287    for fname in netrwmarkfilelist
4288     if a:islocal
4289      if g:netrw_keepdir
4290       let fname= s:ComposePath(curdir,fname)
4291      endif
4292     else
4293      let fname= curdir.fname
4294     endif
4295     1split
4296     " the autocmds will handle both local and remote files
4297 "    call Decho("exe silent e ".escape(fname,' '))
4298     exe "silent e ".escape(fname,' ')
4299 "    call Decho("hardcopy")
4300     hardcopy
4301     q
4302    endfor
4303    2match none
4304   endif
4305 "  call Dret("s:NetrwMarkFilePrint")
4306 endfun
4308 " ---------------------------------------------------------------------
4309 " s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
4310 "                        files when given a regexp (for which a prompt is
4311 "                        issued).
4312 fun! s:NetrwMarkFileRegexp(islocal)
4313 "  call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
4315   " get the regular expression
4316   call inputsave()
4317   let regexp= input("Enter regexp: ","","file")
4318   call inputrestore()
4320   if a:islocal
4321    " get the matching list of files using local glob()
4322 "   call Decho("handle local regexp")
4323    let dirname  = escape(b:netrw_curdir,g:netrw_glob_escape)
4324    let filelist = glob(s:ComposePath(dirname,regexp))
4325    if filelist != ""
4326     let filelist= filelist."\n"
4327    endif
4329   " mark the list of files
4330   while filelist != ""
4331    if filelist =~ '\n'
4332     let filename = substitute(filelist,'\n.*$','','e')
4333     let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
4334    else
4335     let filename = filelist
4336     let filelist = ""
4337    endif
4338 "   call Decho("filelist<".filelist.">")
4339 "   call Decho("filename<".filename.">")
4340    call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
4341   endwhile
4343   else
4344 "   call Decho("handle remote regexp")
4346    " convert displayed listing into a filelist
4347    let eikeep = &ei
4348    let areg   = @a
4349    silent %y a
4350    set ei=all ma
4351 "   call Decho("set ei=all ma")
4352    1split
4353    enew
4354    silent norm! "ap
4355    2
4356    let bannercnt= search('^" =====','W')
4357    exe "silent 1,".bannercnt."d"
4358    set bt=nofile
4359    if     g:netrw_liststyle == s:LONGLIST
4360     silent %s/\s\{2,}\S.*$//e
4361    elseif g:netrw_liststyle == s:WIDELIST
4362     silent %s/\s\{2,}/\r/ge
4363    elseif g:netrw_liststyle == s:TREELIST
4364     silent %s/^| //e
4365     silent! g/^ .*$/d
4366    endif
4367    " convert regexp into the more usual glob-style format
4368    let regexp= substitute(regexp,'\*','.*','g')
4369 "   call Decho("regexp<".regexp.">")
4370    exe "silent! v/".escape(regexp,'/')."/d"
4371    let filelist= getline(1,line("$"))
4372    q!
4373    for filename in filelist
4374     call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
4375    endfor
4376    unlet filelist
4377    let @a  = areg
4378    let &ei = eikeep
4379   endif
4381 "  call Dret("s:NetrwMarkFileRegexp")
4382 endfun
4384 " ---------------------------------------------------------------------
4385 " s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
4386 "                        Uses the local marked file list.
4387 fun! s:NetrwMarkFileSource(islocal)
4388 "  call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
4389   let curbufnr= bufnr("%")
4390   if exists("s:netrwmarkfilelist_{curbufnr}")
4391    let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
4392    let curdir            = b:netrw_curdir
4393    call s:NetrwUnmarkList(curbufnr,curdir)
4394    for fname in netrwmarkfilelist
4395     if a:islocal
4396      if g:netrw_keepdir
4397       let fname= s:ComposePath(curdir,fname)
4398      endif
4399     else
4400      let fname= curdir.fname
4401     endif
4402     " the autocmds will handle sourcing both local and remote files
4403 "    call Decho("exe so ".fnameescape(fname))
4404     exe "so ".fnameescape(fname)
4405    endfor
4406    2match none
4407   endif
4408 "  call Dret("s:NetrwMarkFileSource")
4409 endfun
4411 " ---------------------------------------------------------------------
4412 " s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
4413 "                     Uses the global markfilelist
4414 fun! s:NetrwMarkFileTag(islocal)
4415 "  call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
4416   let svpos    = netrw#NetrwSavePosn()
4417   let curdir   = b:netrw_curdir
4418   let curbufnr = bufnr("%")
4420   if exists("s:netrwmarkfilelist")
4421 "   call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
4422    if a:islocal && g:netrw_keepdir
4423     let netrwmarkfilelist= ""
4424     for fname in s:netrwmarkfilelist
4425 "     let netrwmarkfilelist= netrwmarkfilelist." ".s:ComposePath(curdir,fname)
4426      let netrwmarkfilelist= netrwmarkfilelist." ".fname
4427     endfor
4428    else
4429     let netrwmarkfilelist= string(s:netrwmarkfilelist)
4430     let netrwmarkfilelist= substitute(netrwmarkfilelist,'[[\],]','','g')
4431    endif
4432    call s:NetrwUnmarkAll()
4434    if a:islocal
4435     if executable(g:netrw_ctags)
4436      call map(netrwmarkfilelist,"shellescape(v:val)")
4437 "     call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
4438      call system(g:netrw_ctags." ".netrwmarkfilelist)
4439     else
4440      call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
4441     endif
4442    else
4443     let cmd   = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
4444     call netrw#NetrwObtain(a:islocal,"tags")
4445     let curdir= b:netrw_curdir
4446     1split
4447     e tags
4448     let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
4449 "    call Decho("curdir<".curdir."> path<".path.">")
4450     exe '%s/\t\(\S\+\)\t/\t'.escape(path,'/').'\1\t/e'
4451     wq!
4452    endif
4453    2match none
4454    call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4455    call netrw#NetrwRestorePosn(svpos)
4456   endif
4458 "  call Dret("s:NetrwMarkFileTag")
4459 endfun
4461 " ---------------------------------------------------------------------
4462 " s:NetrwMarkFileTgt:  (invoked by mt) This function sets up a marked file target {{{2
4463 "   Sets up two variables, 
4464 "     s:netrwmftgt : holds the target directory
4465 "     s:netrwmftgt_islocal : 0=target directory is remote
4466 "                    1=target directory is local
4467 fun! s:NetrwMarkFileTgt(islocal)
4468 "  call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
4469   let svpos  = netrw#NetrwSavePosn()
4470   let curdir = b:netrw_curdir
4471   let hadtgt = exists("s:netrwmftgt")
4472   if !exists("w:netrw_bannercnt")
4473    let w:netrw_bannercnt= b:netrw_bannercnt
4474   endif
4476   " set up target
4477   if line(".") < w:netrw_bannercnt
4478    " if cursor in banner region, use b:netrw_curdir for the target
4479    let s:netrwmftgt= b:netrw_curdir
4480 "   call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
4482   else
4483    " get word under cursor.
4484    "  * If directory, use it for the target.
4485    "  * If file, use b:netrw_curdir for the target
4486    let curword= s:NetrwGetWord()
4487    let tgtdir = s:ComposePath(curdir,curword)
4488    if a:islocal && isdirectory(tgtdir)
4489     let s:netrwmftgt = tgtdir
4490 "    call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
4491    elseif !a:islocal && tgtdir =~ '/$'
4492     let s:netrwmftgt = tgtdir
4493 "    call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
4494    else
4495     let s:netrwmftgt = curdir
4496 "    call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
4497    endif
4498   endif
4499   if a:islocal
4500    " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
4501    let s:netrwmftgt= simplify(s:netrwmftgt)
4502 "   call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
4503   endif
4504   if g:netrw_cygwin
4505    let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
4506    let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
4507   endif
4508   let s:netrwmftgt_islocal= a:islocal
4510   if g:netrw_fastbrowse > 0
4511    call s:LocalBrowseShellCmdRefresh()
4512   endif
4513   call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4514   call netrw#NetrwRestorePosn(svpos)
4515   if !hadtgt
4516    norm! j
4517   endif
4519 "  call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
4520 endfun
4522 " ---------------------------------------------------------------------
4523 " s:NetrwOpenFile: query user for a filename and open it {{{2
4524 fun! s:NetrwOpenFile(islocal)
4525 "  call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
4526   call inputsave()
4527   let fname= input("Enter filename: ")
4528   call inputrestore()
4529   if fname !~ '[/\\]'
4530    if exists("b:netrw_curdir")
4531     if exists("g:netrw_quiet")
4532      let netrw_quiet_keep = g:netrw_quiet
4533     endif
4534     let g:netrw_quiet    = 1
4535     if b:netrw_curdir =~ '/$'
4536      exe "e ".fnameescape(b:netrw_curdir.fname)
4537     else
4538      exe "e ".fnameescape(b:netrw_curdir."/".fname)
4539     endif
4540     if exists("netrw_quiet_keep")
4541      let g:netrw_quiet= netrw_quiet_keep
4542     else
4543      unlet g:netrw_quiet
4544     endif
4545    endif
4546   else
4547    exe "e ".fnameescape(fname)
4548   endif
4549 "  call Dret("s:NetrwOpenFile")
4550 endfun
4552 " ---------------------------------------------------------------------
4553 " s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2
4554 fun! s:NetrwUnmarkList(curbufnr,curdir)
4555 "  call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
4557   "  remove all files in local marked-file list from global list
4558   if exists("s:netrwmarkfilelist_{a:curbufnr}")
4559    for mfile in s:netrwmarkfilelist_{a:curbufnr}
4560     let dfile = s:ComposePath(a:curdir,mfile)       " prepend directory to mfile
4561     let idx   = index(s:netrwmarkfilelist,dfile)    " get index in list of dfile
4562     call remove(s:netrwmarkfilelist,idx)            " remove from global list
4563    endfor
4564    if s:netrwmarkfilelist == []
4565     unlet s:netrwmarkfilelist
4566    endif
4568    " getting rid of the local marked-file lists is easy
4569    unlet s:netrwmarkfilelist_{a:curbufnr}
4570   endif
4571   if exists("s:netrwmarkfilemtch_{a:curbufnr}")
4572    unlet s:netrwmarkfilemtch_{a:curbufnr}
4573   endif
4574   2match none
4575 "  call Dret("s:NetrwUnmarkList")
4576 endfun
4578 " ---------------------------------------------------------------------
4579 " s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
4580 fun! s:NetrwUnmarkAll()
4581 "  call Dfunc("s:NetrwUnmarkAll()")
4582   if exists("s:netrwmarkfilelist")
4583    unlet s:netrwmarkfilelist
4584   endif
4585   silent call s:NetrwUnmarkAll2()
4586   2match none
4587 "  call Dret("s:NetrwUnmarkAll")
4588 endfun
4590 " ---------------------------------------------------------------------
4591 " s:NetrwUnmarkAll2: {{{2
4592 fun! s:NetrwUnmarkAll2()
4593 "  call Dfunc("s:NetrwUnmarkAll2()")
4594   redir => netrwmarkfilelist_let
4595   let
4596   redir END
4597   let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n')          " convert let string into a let list
4598   call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_ 
4599   call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')")    " remove what the entries are equal to
4600   for flist in netrwmarkfilelist_list
4601    let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
4602    unlet s:netrwmarkfilelist_{curbufnr}
4603    unlet s:netrwmarkfilemtch_{curbufnr}
4604   endfor
4605 "  call Dret("s:NetrwUnmarkAll2")
4606 endfun
4608 " ---------------------------------------------------------------------
4609 " s:NetrwUnMarkFile: {{{2
4610 fun! s:NetrwUnMarkFile(islocal)
4611 "  call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
4612   let svpos    = netrw#NetrwSavePosn()
4613   let curbufnr = bufnr("%")
4615   " unmark marked file list (although I expect s:NetrwUpload()
4616   " to do it, I'm just making sure)
4617   if exists("s:netrwmarkfilelist_{bufnr('%')}")
4618 "   call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
4619    unlet s:netrwmarkfilelist
4620    unlet s:netrwmarkfilelist_{curbufnr}
4621    unlet s:netrwmarkfilemtch_{curbufnr}
4622    2match none
4623   endif
4625 "  call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4626   call netrw#NetrwRestorePosn(svpos)
4627 "  call Dret("s:NetrwUnMarkFile")
4628 endfun
4630 " ---------------------------------------------------------------------
4631 " s:NetrwMenu: generates the menu for gvim and netrw {{{2
4632 fun! s:NetrwMenu(domenu)
4634   if !exists("g:NetrwMenuPriority")
4635    let g:NetrwMenuPriority= 80
4636   endif
4638   if has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
4639 "   call Dfunc("NetrwMenu(domenu=".a:domenu.")")
4641    if !exists("s:netrw_menu_enabled") && a:domenu
4642 "    call Decho("initialize menu")
4643     let s:netrw_menu_enabled= 1
4644     exe 'silent! menu '.g:NetrwMenuPriority.'.1     '.g:NetrwTopLvlMenu.'Help<tab><F1>  <F1>'
4645     call s:NetrwBookmarkMenu() " provide some history!  uses priorities 2,3, reserves 4
4646     exe 'silent! menu '.g:NetrwMenuPriority.'.5     '.g:NetrwTopLvlMenu.'-Sep1- :'
4647     exe 'silent! menu '.g:NetrwMenuPriority.'.6     '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>-        -'
4648     exe 'silent! menu '.g:NetrwMenuPriority.'.7     '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x   x'
4649     exe 'silent! menu '.g:NetrwMenuPriority.'.8.1   '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb    mb'
4650     exe 'silent! menu '.g:NetrwMenuPriority.'.8.2   '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete<tab>mB        mB'
4651     exe 'silent! menu '.g:NetrwMenuPriority.'.8.3   '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Bookmark<tab>gb  gb'
4652     exe 'silent! menu '.g:NetrwMenuPriority.'.8.4   '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u       u'
4653     exe 'silent! menu '.g:NetrwMenuPriority.'.8.5   '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U       U'
4654     exe 'silent! menu '.g:NetrwMenuPriority.'.8.6   '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb    qb'
4655     exe 'silent! menu '.g:NetrwMenuPriority.'.9.1   '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab>'."<ctrl-h>     \<Plug>NetrwHideEdit"
4656     exe 'silent! menu '.g:NetrwMenuPriority.'.9.2   '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S        S'
4657     exe 'silent! menu '.g:NetrwMenuPriority.'.9.3   '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh     gh"
4658     exe 'silent! menu '.g:NetrwMenuPriority.'.9.4   '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l>     \<Plug>NetrwRefresh"
4659     exe 'silent! menu '.g:NetrwMenuPriority.'.9.5   '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings  '.":NetrwSettings\<cr>"
4660     exe 'silent! menu '.g:NetrwMenuPriority.'.10    '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D   D'
4661     exe 'silent! menu '.g:NetrwMenuPriority.'.11.1  '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr>    '."\<cr>"
4662     exe 'silent! menu '.g:NetrwMenuPriority.'.11.2  '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p   p'
4663     exe 'silent! menu '.g:NetrwMenuPriority.'.11.3  '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P      P'
4664     exe 'silent! menu '.g:NetrwMenuPriority.'.11.4  '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o   o'
4665     exe 'silent! menu '.g:NetrwMenuPriority.'.11.5  '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
4666     exe 'silent! menu '.g:NetrwMenuPriority.'.12.1  '.g:NetrwTopLvlMenu.'Explore.Directory\ Name        :Explore '
4667     exe 'silent! menu '.g:NetrwMenuPriority.'.12.2  '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */  :Explore */'
4668     exe 'silent! menu '.g:NetrwMenuPriority.'.12.2  '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/     :Explore **/'
4669     exe 'silent! menu '.g:NetrwMenuPriority.'.12.3  '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (curdir\ only)<tab>:Explore\ *//   :Explore *//'
4670     exe 'silent! menu '.g:NetrwMenuPriority.'.12.4  '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (+subdirs)<tab>:Explore\ **//      :Explore **//'
4671     exe 'silent! menu '.g:NetrwMenuPriority.'.12.4  '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore      :Nexplore<cr>'
4672     exe 'silent! menu '.g:NetrwMenuPriority.'.12.4  '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore      :Pexplore<cr>'
4673     exe 'silent! menu '.g:NetrwMenuPriority.'.13    '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d       d'
4674     exe 'silent! menu '.g:NetrwMenuPriority.'.14.1  '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf        mf'
4675     exe 'silent! menu '.g:NetrwMenuPriority.'.14.2  '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr   mr'
4676     exe 'silent! menu '.g:NetrwMenuPriority.'.14.3  '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a    a'
4677     exe 'silent! menu '.g:NetrwMenuPriority.'.14.4  '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc  mc'
4678     exe 'silent! menu '.g:NetrwMenuPriority.'.14.5  '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D     D'
4679     exe 'silent! menu '.g:NetrwMenuPriority.'.14.6  '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md      md'
4680     exe 'silent! menu '.g:NetrwMenuPriority.'.14.7  '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me      me'
4681     exe 'silent! menu '.g:NetrwMenuPriority.'.14.8  '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx  mx'
4682     exe 'silent! menu '.g:NetrwMenuPriority.'.14.9  '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm  mm'
4683     exe 'silent! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O     O'
4684     exe 'silent! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp     mp'
4685     exe 'silent! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R    R'
4686     exe 'silent! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt       mt'
4687     exe 'silent! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT       mT'
4688     exe 'silent! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz     mz'
4689     exe 'silent! menu '.g:NetrwMenuPriority.'.15    '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O     O'
4690     exe 'silent! menu '.g:NetrwMenuPriority.'.16.1  '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)<tab>i      i'
4691     exe 'silent! menu '.g:NetrwMenuPriority.'.16.2  '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show<tab>a   a'
4692     exe 'silent! menu '.g:NetrwMenuPriority.'.16.3  '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
4693     exe 'silent! menu '.g:NetrwMenuPriority.'.16.4  '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s  s'
4694     exe 'silent! menu '.g:NetrwMenuPriority.'.17    '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R   R'
4695     exe 'silent! menu '.g:NetrwMenuPriority.'.18    '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c  c'
4696     let s:netrw_menucnt= 28
4698    elseif !a:domenu
4699     let s:netrwcnt = 0
4700     let curwin     = winnr()
4701     windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
4702     exe curwin."wincmd w"
4704     if s:netrwcnt <= 1
4705 "     call Decho("clear menus")
4706      exe 'silent! unmenu '.g:NetrwTopLvlMenu
4707 "     call Decho('exe silent! unmenu '.g:NetrwTopLvlMenu.'*')
4708      silent! unlet s:netrw_menu_enabled
4709     endif
4710    endif
4711 "   call Dret("NetrwMenu")
4712   endif
4714 endfun
4716 " ---------------------------------------------------------------------
4717 " s:NetrwObtain: obtain file under cursor or from markfile list {{{2
4718 "                Used by the O maps (as <SID>NetrwObtain())
4719 fun! s:NetrwObtain(islocal)
4720 "  call Dfunc("NetrwObtain(islocal=".a:islocal.")")
4722   if exists("s:netrwmarkfilelist_{bufnr('%')}")
4723    let islocal= s:netrwmarkfilelist_{bufnr("%")}[1] !~ '^\a\+://'
4724    call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr("%")})
4725    call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
4726   else
4727    call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
4728   endif
4730 "  call Dret("NetrwObtain")
4731 endfun
4733 " ---------------------------------------------------------------------
4734 " netrw#NetrwObtain: {{{2
4735 "   netrw#NetrwObtain(islocal,fname[,tgtdirectory])
4736 "     islocal=0  obtain from remote source
4737 "            =1  obtain from local source
4738 "     fname  :   a filename or a list of filenames
4739 "     tgtdir :   optional place where files are to go  (not present, uses getcwd())
4740 fun! netrw#NetrwObtain(islocal,fname,...)
4741 "  call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
4742   " NetrwStatusLine support - for obtaining support
4744   if type(a:fname) == 1
4745    let fnamelist= [ a:fname ]
4746   elseif type(a:fname) == 3
4747    let fnamelist= a:fname
4748   else
4749    call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
4750 "   call Dret("netrw#NetrwObtain")
4751    return
4752   endif
4753 "  call Decho("fnamelist<".string(fnamelist).">")
4754   if a:0 > 0
4755    let tgtdir= a:1
4756   else
4757    let tgtdir= getcwd()
4758   endif
4759 "  call Decho("tgtdir<".tgtdir.">")
4761   if a:islocal
4762    " obtain a file from b:netrw_curdir to getcwd()
4763 "   call Decho("obtain a local file from ".b:netrw_curdir." to ".tgtdir
4764    if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
4765     let topath= s:ComposePath(tgtdir,"")
4766     if (has("win32") || has("win95") || has("win64") || has("win16"))
4767      " transfer files one at time
4768      for fname in fnamelist
4769 "      call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")")
4770       call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
4771      endfor
4772     else
4773      " transfer files with one command
4774      let filelist= join(map(copy(fname),"shellescape(v:val)"))
4775 "     call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
4776      call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
4777     endif
4778    elseif !exists("b:netrw_curdir")
4779     call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
4780    else
4781     call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
4782    endif
4784   else
4785 "   call Decho("obtain a remote file from ".b:netrw_curdir." to ".tgtdir)
4786    if type(a:fname) == 1
4787     call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
4788    endif
4789    call s:NetrwMethod(b:netrw_curdir)
4791    if b:netrw_method == 4
4792     " obtain file using scp
4793 "    call Decho("obtain via scp (method#4)")
4794     if exists("g:netrw_port") && g:netrw_port != ""
4795      let useport= " ".g:netrw_scpport." ".g:netrw_port
4796     else
4797      let useport= ""
4798     endif
4799     if b:netrw_fname =~ '/'
4800      let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
4801     else
4802      let path= ""
4803     endif
4804     let filelist= join(map(copy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1))'))
4805 "    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1))
4806     exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)
4808    elseif b:netrw_method == 2
4809     " obtain file using ftp + .netrc
4810 "     call Decho("obtain via ftp+.netrc (method #2)")
4811      call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
4812      let tmpbufnr= bufnr("%")
4813      setlocal ff=unix
4814      if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
4815       exe "put ='".g:netrw_ftpmode."'"
4816 "      call Decho("filter input: ".getline('$'))
4817      endif
4819      if exists("b:netrw_fname") && b:netrw_fname != ""
4820       call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
4821 "      call Decho("filter input: ".getline('$'))
4822      endif
4824      if exists("g:netrw_ftpextracmd")
4825       exe "put ='".g:netrw_ftpextracmd."'"
4826 "      call Decho("filter input: ".getline('$'))
4827      endif
4828      for fname in fnamelist
4829       call setline(line("$")+1,'get "'.fname.'"')
4830 "      call Decho("filter input: ".getline('$'))
4831      endfor
4832      if exists("g:netrw_port") && g:netrw_port != ""
4833 "      call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
4834       exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
4835      else
4836 "      call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
4837       exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
4838      endif
4839      " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
4840      if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
4841       let debugkeep= &debug
4842       setlocal debug=msg
4843       call netrw#ErrorMsg(s:ERROR,getline(1),4)
4844       let &debug= debugkeep
4845      endif
4847    elseif b:netrw_method == 3
4848     " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
4849 "    call Decho("obtain via ftp+mipf (method #3)")
4850     call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
4851     let tmpbufnr= bufnr("%")
4852     setlocal ff=unix
4854     if exists("g:netrw_port") && g:netrw_port != ""
4855      put ='open '.g:netrw_machine.' '.g:netrw_port
4856 "     call Decho("filter input: ".getline('$'))
4857     else
4858      put ='open '.g:netrw_machine
4859 "     call Decho("filter input: ".getline('$'))
4860     endif
4862     if exists("g:netrw_ftp") && g:netrw_ftp == 1
4863      put =g:netrw_uid
4864 "     call Decho("filter input: ".getline('$'))
4865      put ='\"'.s:netrw_passwd.'\"'
4866 "     call Decho("filter input: ".getline('$'))
4867     else
4868      put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
4869 "     call Decho("filter input: ".getline('$'))
4870     endif
4872     if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
4873      put =g:netrw_ftpmode
4874 "     call Decho("filter input: ".getline('$'))
4875     endif
4877     if exists("b:netrw_fname") && b:netrw_fname != ""
4878      call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
4879 "     call Decho("filter input: ".getline('$'))
4880     endif
4882     if exists("g:netrw_ftpextracmd")
4883      exe "put ='".g:netrw_ftpextracmd."'"
4884 "     call Decho("filter input: ".getline('$'))
4885     endif
4887     if exists("g:netrw_ftpextracmd")
4888      exe "put ='".g:netrw_ftpextracmd."'"
4889 "     call Decho("filter input: ".getline('$'))
4890     endif
4891     for fname in fnamelist
4892      call setline(line("$")+1,'get "'.fname.'"')
4893     endfor
4894 "    call Decho("filter input: ".getline('$'))
4896     " perform ftp:
4897     " -i       : turns off interactive prompting from ftp
4898     " -n  unix : DON'T use <.netrc>, even though it exists
4899     " -n  win32: quit being obnoxious about password
4900     norm! 1Gdd
4901 "    call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
4902     exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
4903     " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
4904     if getline(1) !~ "^$"
4905 "     call Decho("error<".getline(1).">")
4906      if !exists("g:netrw_quiet")
4907       call netrw#ErrorMsg(s:ERROR,getline(1),5)
4908      endif
4909     endif
4910    endif
4912   endif
4914   " cleanup
4915   if exists("tmpbufnr")
4916    if bufnr("%") != tmpbufnr
4917     exe tmpbufnr."bw!"
4918    else
4919     q!
4920    endif
4921   endif
4923 "  call Dret("netrw#NetrwObtain")
4924 endfun
4926 " ---------------------------------------------------------------------
4927 " s:NetrwPrevWinOpen: open file/directory in previous window.  {{{2
4928 "   If there's only one window, then the window will first be split.
4929 "   Returns:
4930 "     choice = 0 : didn't have to choose
4931 "     choice = 1 : saved modified file in window first
4932 "     choice = 2 : didn't save modified file, opened window
4933 "     choice = 3 : cancel open
4934 fun! s:NetrwPrevWinOpen(islocal)
4935 "  call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
4937   " grab a copy of the b:netrw_curdir to pass it along to newly split windows
4938   let curdir    = b:netrw_curdir
4940   " get last window number and the word currently under the cursor
4941   let lastwinnr = winnr("$")
4942   let curword   = s:NetrwGetWord()
4943   let choice    = 0
4944 "  call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
4946   let didsplit  = 0
4947   if lastwinnr == 1
4948    " if only one window, open a new one first
4949 "   call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
4950    if g:netrw_preview
4951 "    call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s")
4952     exe (g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s"
4953    else
4954 "    call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
4955     exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
4956    endif
4957    let didsplit  = 1
4959   else
4960    call s:SaveBufVars()
4961 "   call Decho("wincmd p")
4962    wincmd p
4963    call s:RestoreBufVars()
4964    " if the previous window's buffer has been changed (is modified),
4965    " and it doesn't appear in any other extant window, then ask the
4966    " user if s/he wants to abandon modifications therein.
4967    let bnr    = winbufnr(0)
4968    let bnrcnt = 0
4969    if &mod
4970 "    call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
4971     let eikeep= &ei
4972     set ei=all
4973     windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
4974     exe bnr."wincmd p"
4975     let &ei= eikeep
4976 "    call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
4977     if bnrcnt == 1
4978      let bufname= bufname(winbufnr(winnr()))
4979      let choice= confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
4980 "     call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
4982      if choice == 1
4983       " Yes -- write file & then browse
4984       let v:errmsg= ""
4985       silent w
4986       if v:errmsg != ""
4987        call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
4988        if didsplit
4989         q
4990        else
4991         wincmd p
4992        endif
4993 "       call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
4994        return choice
4995       endif
4997      elseif choice == 2
4998       " No -- don't worry about changed file, just browse anyway
4999       setlocal nomod
5000       call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
5001       wincmd p
5003      else
5004       " Cancel -- don't do this
5005       if didsplit
5006        q
5007       else
5008        wincmd p
5009       endif
5010 "      call Dret("NetrwPrevWinOpen ".choice." : cancelled")
5011       return choice
5012      endif
5013     endif
5014    endif
5015   endif
5017   " restore b:netrw_curdir (window split/enew may have lost it)
5018   let b:netrw_curdir= curdir
5019   if a:islocal < 2
5020    if a:islocal
5021     call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
5022    else
5023     call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
5024    endif
5025   endif
5026 "  call Dret("NetrwPrevWinOpen ".choice)
5027   return choice
5028 endfun
5030 " ---------------------------------------------------------------------
5031 " s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
5032 "                Always assumed to be local -> remote
5033 "                call s:NetrwUpload(filename, target)
5034 "                call s:NetrwUpload(filename, target, fromdirectory)
5035 fun! s:NetrwUpload(fname,tgt,...)
5036 "  call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
5038   if a:tgt =~ '^\a\+://'
5039    let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
5040   else
5041    let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
5042   endif
5043 "  call Decho("tgtdir<".tgtdir.">")
5045   if a:0 > 0
5046    let fromdir= a:1
5047   else
5048    let fromdir= getcwd()
5049   endif
5050 "  call Decho("fromdir<".fromdir.">")
5052   if type(a:fname) == 1
5053    " handle uploading a single file using NetWrite
5054 "   call Decho("handle uploading a single file via NetWrite")
5055    1split
5056    let efname= escape(a:fname,g:netrw_fname_escape)
5057 "   call Decho("exe e ".efname)
5058    exe "e ".efname
5059 "   call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
5060    if a:tgt =~ '/$'
5061     let wfname= substitute(a:fname,'^.*/','','')
5062     let wfname= escape(a:tgt.wfname,g:netrw_fname_escape)
5063 "    call Decho("exe w! ".fnameescape(wfname))
5064     exe "w! ".fnameescape(wfname)
5065    else
5066 "    call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
5067     exe "w ".fnameescape(a:tgt)
5068 "    call Decho("done writing local->remote")
5069    endif
5070    q!
5072   elseif type(a:fname) == 3
5073    " handle uploading a list of files via scp
5074 "   call Decho("handle uploading a list of files via scp")
5075    let curdir= getcwd()
5076    if a:tgt =~ '^scp:'
5077     exe "keepjumps silent lcd ".fnameescape(fromdir)
5078     let filelist= copy(s:netrwmarkfilelist_{bufnr('%')})
5079     let args    = join(map(filelist,"shellescape(v:val)"))
5080     if exists("g:netrw_port") && g:netrw_port != ""
5081      let useport= " ".g:netrw_scpport." ".g:netrw_port
5082     else
5083      let useport= ""
5084     endif
5085     let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
5086     let tgt     = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
5087 "    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1))
5088     exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)
5089     exe "keepjumps silent lcd ".fnameescape(curdir)
5091    elseif a:tgt =~ '^ftp:'
5092     call s:NetrwMethod(a:tgt)
5094     if b:netrw_method == 2
5095      " handle uploading a list of files via ftp+.netrc
5096      let netrw_fname = b:netrw_fname
5097      silent keepjumps new
5098 "     call Decho("filter input window#".winnr())
5100      exe "put ='".g:netrw_ftpmode."'"
5101 "     call Decho("filter input: ".getline('$'))
5103      if exists("g:netrw_ftpextracmd")
5104       exe "put ='".g:netrw_ftpextracmd."'"
5105 "      call Decho("filter input: ".getline('$'))
5106      endif
5108      call setline(line("$")+1,'lcd "'.fromdir.'"')
5109 "     call Decho("filter input: ".getline('$'))
5111      call setline(line("$")+1,'cd "'.tgtdir.'"')
5112 "     call Decho("filter input: ".getline('$'))
5114      for fname in a:fname
5115       call setline(line("$")+1,'put "'.fname.'"')
5116 "      call Decho("filter input: ".getline('$'))
5117      endfor
5119      if exists("g:netrw_port") && g:netrw_port != ""
5120 "      call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
5121       exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
5122      else
5123 "      call Decho("filter input window#".winnr())
5124 "      call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
5125       exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
5126      endif
5127      " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5128      silent g/Local directory now/d
5129      if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5130       call netrw#ErrorMsg(s:ERROR,getline(1),14)
5131      else
5132       bw!|q
5133      endif
5135     elseif b:netrw_method == 3
5136      " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
5137      let netrw_fname= b:netrw_fname
5138      call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
5139      let tmpbufnr= bufnr("%")
5140      setlocal ff=unix
5142      if exists("g:netrw_port") && g:netrw_port != ""
5143       put ='open '.g:netrw_machine.' '.g:netrw_port
5144 "      call Decho("filter input: ".getline('$'))
5145      else
5146       put ='open '.g:netrw_machine
5147 "      call Decho("filter input: ".getline('$'))
5148      endif
5150      if exists("g:netrw_ftp") && g:netrw_ftp == 1
5151       put =g:netrw_uid
5152 "      call Decho("filter input: ".getline('$'))
5153       call setline(line("$")+1,'"'.s:netrw_passwd.'"')
5154 "      call Decho("filter input: ".getline('$'))
5155      else
5156       put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
5157 "      call Decho("filter input: ".getline('$'))
5158      endif
5160      call setline(line("$")+1,'lcd "'.fromdir.'"')
5161 "     call Decho("filter input: ".getline('$'))
5163      if exists("b:netrw_fname") && b:netrw_fname != ""
5164       call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
5165 "      call Decho("filter input: ".getline('$'))
5166      endif
5168      if exists("g:netrw_ftpextracmd")
5169       exe "put ='".g:netrw_ftpextracmd."'"
5170 "      call Decho("filter input: ".getline('$'))
5171      endif
5173      for fname in a:fname
5174       call setline(line("$")+1,'put "'.fname.'"')
5175 "      call Decho("filter input: ".getline('$'))
5176      endfor
5178      " perform ftp:
5179      " -i       : turns off interactive prompting from ftp
5180      " -n  unix : DON'T use <.netrc>, even though it exists
5181      " -n  win32: quit being obnoxious about password
5182      norm! 1Gdd
5183 "     call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n")
5184      exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
5185      " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5186      silent g/Local directory now/d
5187      if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5188       let debugkeep= &debug
5189       setlocal debug=msg
5190       call netrw#ErrorMsg(s:ERROR,getline(1),15)
5191       let &debug = debugkeep
5192       let mod    = 1
5193      else
5194       bw!|q
5195      endif
5196     endif
5197    else
5198     call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
5199    endif
5200   endif
5202 "  call Dret("s:NetrwUpload")
5203 endfun
5205 " ---------------------------------------------------------------------
5206 " s:NetrwPreview: {{{2
5207 fun! s:NetrwPreview(path) range
5208 "  call Dfunc("NetrwPreview(path<".a:path.">)")
5209   call s:NetrwOptionSave("s:")
5210   call s:NetrwSafeOptions()
5211   if has("quickfix")
5212    if !isdirectory(a:path)
5213     exe (g:netrw_preview? "vert " : "")."pedit ".escape(a:path,g:netrw_fname_escape)
5214    elseif !exists("g:netrw_quiet")
5215     call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
5216    endif
5217   elseif !exists("g:netrw_quiet")
5218    call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39)
5219   endif
5220   call s:NetrwOptionRestore("s:")
5221 "  call Dret("NetrwPreview")
5222 endfun
5224 " ---------------------------------------------------------------------
5225 " s:NetrwRefresh: {{{2
5226 fun! s:NetrwRefresh(islocal,dirname)
5227 "  call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
5228   " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
5229   " NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here.
5230   " Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself.
5231   setlocal ma noro
5232 "  call Decho("setlocal ma noro")
5233 "  call Decho("clear buffer<".expand("%")."> with :%d")
5234   %d
5235   if a:islocal
5236    call netrw#LocalBrowseCheck(a:dirname)
5237   else
5238    call s:NetrwBrowse(a:islocal,a:dirname)
5239   endif
5240   call netrw#NetrwRestorePosn()
5242   " restore file marks
5243   if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
5244 "   call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
5245    exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
5246   else
5247 "   call Decho("2match none")
5248    2match none
5249   endif
5251 "  redraw!
5252 "  call Dret("NetrwRefresh")
5253 endfun
5255 " ---------------------------------------------------------------------
5256 " s:NetrwRefreshDir: refreshes a directory by name {{{2
5257 "                    Called by NetrwMarkFileCopy()
5258 "                    Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh()
5259 fun! s:NetrwRefreshDir(islocal,dirname)
5260 "  call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) fastbrowse=".g:netrw_fastbrowse)
5261   if g:netrw_fastbrowse == 0
5262    " slowest mode (keep buffers refreshed, local or remote)
5263 "   call Decho("slowest mode: keep buffers refreshed, local or remote")
5264    let tgtwin= bufwinnr(a:dirname)
5265 "   call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin)
5267    if tgtwin > 0
5268     " tgtwin is being displayed, so refresh it
5269     let curwin= winnr()
5270 "    call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")")
5271     exe tgtwin."wincmd w"
5272     call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) 
5273     exe curwin."wincmd w"
5275    elseif bufnr(a:dirname) > 0
5276     let bn= bufnr(a:dirname)
5277 "    call Decho("bd bufnr(".a:dirname.")=".bn)
5278     exe "silent bd ".bn
5279    endif
5281   elseif g:netrw_fastbrowse <= 1
5282 "   call Decho("medium-speed mode: refresh local buffers only")
5283    call s:LocalBrowseShellCmdRefresh()
5284   endif
5285 "  call Dret("s:NetrwRefreshDir")
5286 endfun
5288 " ---------------------------------------------------------------------
5289 " s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
5290 "          What this function does is to compute a priority for the patterns
5291 "          in the g:netrw_sort_sequence.  It applies a substitute to any
5292 "          "files" that satisfy each pattern, putting the priority / in
5293 "          front.  An "*" pattern handles the default priority.
5294 fun! s:NetrwSetSort()
5295 "  call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
5296   if w:netrw_liststyle == s:LONGLIST
5297    let seqlist  = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
5298   else
5299    let seqlist  = g:netrw_sort_sequence
5300   endif
5301   " sanity check -- insure that * appears somewhere
5302   if seqlist == ""
5303    let seqlist= '*'
5304   elseif seqlist !~ '\*'
5305    let seqlist= seqlist.',*'
5306   endif
5307   let priority = 1
5308   while seqlist != ""
5309    if seqlist =~ ','
5310     let seq     = substitute(seqlist,',.*$','','e')
5311     let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
5312    else
5313     let seq     = seqlist
5314     let seqlist = ""
5315    endif
5316    let sepchr= "\<Char-0xff>"
5317    if priority < 10
5318     let spriority= "00".priority.sepchr
5319    elseif priority < 100
5320     let spriority= "0".priority.sepchr
5321    else
5322     let spriority= priority.sepchr
5323    endif
5324 "   call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
5326    " sanity check
5327    if w:netrw_bannercnt > line("$")
5328     " apparently no files were left after a Hiding pattern was used
5329 "    call Dret("SetSort : no files left after hiding")
5330     return
5331    endif
5332    if seq == '*'
5333     let starpriority= spriority
5334    else
5335     exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
5336     " sometimes multiple sorting patterns will match the same file or directory.
5337     " The following substitute is intended to remove the excess matches.
5338     exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^\d\{3}'.sepchr.'\d\{3}\//s/^\d\{3}'.sepchr.'\(\d\{3}\/\).\@=/\1/e'
5339    endif
5340    let priority = priority + 1
5341   endwhile
5342   if exists("starpriority")
5343    exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}'.sepchr.'/s/^/'.starpriority.'/'
5344   endif
5346   " Following line associated with priority -- items that satisfy a priority
5347   " pattern get prefixed by ###/ which permits easy sorting by priority.
5348   " Sometimes files can satisfy multiple priority patterns -- only the latest
5349   " priority pattern needs to be retained.  So, at this point, these excess
5350   " priority prefixes need to be removed, but not directories that happen to
5351   " be just digits themselves.
5352   exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}'.sepchr.'\)\%(\d\{3}'.sepchr.'\)\+\ze./\1/e'
5354 "  call Dret("SetSort")
5355 endfun
5357 " =====================================================================
5358 " s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
5359 fun! s:NetrwSortStyle(islocal)
5360 "  call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
5361   call s:NetrwSaveWordPosn()
5362   let svpos= netrw#NetrwSavePosn()
5364   let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name'
5365   norm! 0
5366   call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5367   call netrw#NetrwRestorePosn(svpos)
5369 "  call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
5370 endfun
5372 " ---------------------------------------------------------------------
5373 " s:NetrwSplit: mode {{{2
5374 "           =0 : net   and o
5375 "           =1 : net   and t
5376 "           =2 : net   and v
5377 "           =3 : local and o
5378 "           =4 : local and t
5379 "           =5 : local and v
5380 fun! s:NetrwSplit(mode)
5381 "  call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
5383   call s:SaveWinVars()
5385   if a:mode == 0
5386    " remote and o
5387 "   call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
5388    exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
5389    let s:didsplit= 1
5390    call s:RestoreWinVars()
5391    call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
5392    unlet s:didsplit
5394   elseif a:mode == 1
5395    " remote and t
5396    let cursorword  = s:NetrwGetWord()
5397 "   call Decho("tabnew")
5398    tabnew
5399    let s:didsplit= 1
5400    call s:RestoreWinVars()
5401    call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,cursorword))
5402    unlet s:didsplit
5404   elseif a:mode == 2
5405    " remote and v
5406 "   call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v")
5407    exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
5408    let s:didsplit= 1
5409    call s:RestoreWinVars()
5410    call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
5411    unlet s:didsplit
5413   elseif a:mode == 3
5414    " local and o
5415 "   call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
5416    exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
5417    let s:didsplit= 1
5418    call s:RestoreWinVars()
5419    call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
5420    unlet s:didsplit
5422   elseif a:mode == 4
5423    " local and t
5424    let netrw_curdir= b:netrw_curdir
5425    let cursorword  = s:NetrwGetWord()
5426 "   call Decho("tabnew")
5427    tabnew
5428    let b:netrw_curdir= netrw_curdir
5429    let s:didsplit= 1
5430    call s:RestoreWinVars()
5431    call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
5432    unlet s:didsplit
5434   elseif a:mode == 5
5435    " local and v
5436 "   call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v")
5437    exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
5438    let s:didsplit= 1
5439    call s:RestoreWinVars()
5440    call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
5441    unlet s:didsplit
5443   else
5444    call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
5445   endif
5447 "  call Dret("s:NetrwSplit")
5448 endfun
5450 " ---------------------------------------------------------------------
5451 " NetrwStatusLine: {{{2
5452 fun! NetrwStatusLine()
5454 " vvv NetrwStatusLine() debugging vvv
5455 "  let g:stlmsg=""
5456 "  if !exists("w:netrw_explore_bufnr")
5457 "   let g:stlmsg="!X<explore_bufnr>"
5458 "  elseif w:netrw_explore_bufnr != bufnr("%")
5459 "   let g:stlmsg="explore_bufnr!=".bufnr("%")
5460 "  endif
5461 "  if !exists("w:netrw_explore_line")
5462 "   let g:stlmsg=" !X<explore_line>"
5463 "  elseif w:netrw_explore_line != line(".")
5464 "   let g:stlmsg=" explore_line!={line(.)<".line(".").">"
5465 "  endif
5466 "  if !exists("w:netrw_explore_list")
5467 "   let g:stlmsg=" !X<explore_list>"
5468 "  endif
5469 " ^^^ NetrwStatusLine() debugging ^^^
5471   if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr("%") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list")
5472    " restore user's status line
5473    let &stl        = s:netrw_users_stl
5474    let &laststatus = s:netrw_users_ls
5475    if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
5476    if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
5477    return ""
5478   else
5479    return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
5480   endif
5481 endfun
5483 " ---------------------------------------------------------------------
5484 " s:NetrwTreeDir: determine tree directory given current cursor position {{{2
5485 " (full path directory with trailing slash returned)
5486 fun! s:NetrwTreeDir()
5487 "  call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
5489   let treedir= b:netrw_curdir
5490 "  call Decho("set initial treedir<".treedir.">")
5491   let s:treecurpos= netrw#NetrwSavePosn()
5493   if w:netrw_liststyle == s:TREELIST
5494 "   call Decho("w:netrrw_liststyle is TREELIST:")
5495 "   call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
5496    if getline('.') =~ '/$'
5497     let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
5498    else
5499     let treedir= ""
5500    endif
5502 "   call Decho("treedir<".treedir.">")
5504    " detect user attempting to close treeroot
5505    if getline('.') !~ '|' && getline('.') != '..'
5506 "    call Decho("user attempted to close treeroot")
5507     " now force a refresh
5508 "    call Decho("clear buffer<".expand("%")."> with :%d")
5509     keepjumps %d
5510 "    call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
5511     return b:netrw_curdir
5512    endif
5514    " elide all non-depth information
5515    let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
5516 "   call Decho("depth<".depth."> 1st subst")
5518    " elide first depth
5519    let depth = substitute(depth,'^| ','','')
5520 "   call Decho("depth<".depth."> 2nd subst")
5522    " construct treedir by searching backwards at correct depth
5523 "   call Decho("constructing treedir<".treedir."> depth<".depth.">")
5524    while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
5525     let dirname= substitute(getline('.'),'^\(| \)*','','e')
5526     let treedir= dirname.treedir
5527     let depth  = substitute(depth,'^| ','','')
5528 "    call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
5529    endwhile
5530    if w:netrw_treetop =~ '/$'
5531     let treedir= w:netrw_treetop.treedir
5532    else
5533     let treedir= w:netrw_treetop.'/'.treedir
5534    endif
5535 "   call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line("."))
5536   endif
5537   let treedir= substitute(treedir,'//$','/','')
5539 "  " now force a refresh
5540 "" call DECHO("clear buffer<".expand("%")."> with :%d")
5541 "  setlocal ma noro
5542 "  keepjumps %d
5544 "  call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
5545   return treedir
5546 endfun
5548 " ---------------------------------------------------------------------
5549 " s:NetrwTreeDisplay: recursive tree display {{{2
5550 fun! s:NetrwTreeDisplay(dir,depth)
5551 "  call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
5553   " insure that there are no folds
5554   setlocal nofen
5556   " install ../ and shortdir
5557   if a:depth == ""
5558    call setline(line("$")+1,'../')
5559 "   call Decho("setline#".line("$")." ../ (depth is zero)")
5560   endif
5561   if a:dir =~ '^\a\+://'
5562    if a:dir == w:netrw_treetop
5563     let shortdir= a:dir
5564    else
5565     let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
5566    endif
5567    call setline(line("$")+1,a:depth.shortdir)
5568   else
5569    let shortdir= substitute(a:dir,'^.*/','','e')
5570    call setline(line("$")+1,a:depth.shortdir.'/')
5571   endif
5572 "  call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
5574   " append a / to dir if its missing one
5575   let dir= a:dir
5576   if dir !~ '/$'
5577    let dir= dir.'/'
5578   endif
5580   " display subtrees (if any)
5581   let depth= "| ".a:depth
5583 "  call Decho("display subtrees with depth<".depth."> and current leaves")
5584   for entry in w:netrw_treedict[a:dir]
5585    let direntry= substitute(dir.entry,'/$','','e')
5586 "   call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
5587    if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
5588 "    call Decho("<".direntry."> is a key in treedict - display subtree for it")
5589     call s:NetrwTreeDisplay(direntry,depth)
5590    elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
5591 "    call Decho("<".direntry."/> is a key in treedict - display subtree for it")
5592     call s:NetrwTreeDisplay(direntry.'/',depth)
5593    else
5594 "    call Decho("<".entry."> is not a key in treedict (no subtree)")
5595     call setline(line("$")+1,depth.entry)
5596    endif
5597   endfor
5598 "  call Dret("NetrwTreeDisplay")
5599 endfun
5601 " ---------------------------------------------------------------------
5602 " s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
5603 fun! s:NetrwTreeListing(dirname)
5604   if w:netrw_liststyle == s:TREELIST
5605 "   call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
5606 "   call Decho("curdir<".a:dirname.">")
5607 "   call Decho("win#".winnr().": w:netrw_treetop ".(exists("w:netrw_treetop")? "exists" : "doesn't exit")." w:netrw_treedict ".(exists("w:netrw_treedict")? "exists" : "doesn't exit"))
5609    " update the treetop
5610 "   call Decho("update the treetop")
5611    if !exists("w:netrw_treetop")
5612     let w:netrw_treetop= a:dirname
5613 "    call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
5614    elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
5615     let w:netrw_treetop= a:dirname
5616 "    call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
5617    endif
5619    " insure that we have at least an empty treedict
5620    if !exists("w:netrw_treedict")
5621     let w:netrw_treedict= {}
5622    endif
5624    " update the directory listing for the current directory
5625 "   call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
5626 "   call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
5627    exe "silent! keepjumps ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
5628    let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
5629 "   call Decho("w:treedict[".a:dirname."]= ".w:netrw_treedict[a:dirname])
5630    exe "silent! keepjumps ".w:netrw_bannercnt.",$d"
5632    " if past banner, record word
5633    if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
5634     let fname= expand("<cword>")
5635    else
5636     let fname= ""
5637    endif
5638 "   call Decho("fname<".fname.">")
5640    " display from treetop on down
5641    call s:NetrwTreeDisplay(w:netrw_treetop,"")
5643 "   call Dret("NetrwTreeListing : bufname<".expand("%").">")
5644   endif
5645 endfun
5647 " ---------------------------------------------------------------------
5648 " s:NetrwWideListing: {{{2
5649 fun! s:NetrwWideListing()
5651   if w:netrw_liststyle == s:WIDELIST
5652 "   call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
5653    " look for longest filename (cpf=characters per filename)
5654    " cpf: characters per file
5655    " fpl: files per line
5656    " fpc: files per column
5657    setlocal ma noro
5658 "   call Decho("setlocal ma noro")
5659    let b:netrw_cpf= 0
5660    if line("$") >= w:netrw_bannercnt
5661     exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
5662    else
5663 "    call Dret("NetrwWideListing")
5664     return
5665    endif
5666 "   call Decho("max file strlen+1=".b:netrw_cpf)
5667    let b:netrw_cpf= b:netrw_cpf + 1
5669    " determine qty files per line (fpl)
5670    let w:netrw_fpl= winwidth(0)/b:netrw_cpf
5671    if w:netrw_fpl <= 0
5672     let w:netrw_fpl= 1
5673    endif
5674 "   call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
5676    " make wide display
5677    exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
5678    let fpc         = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
5679    let newcolstart = w:netrw_bannercnt + fpc
5680    let newcolend   = newcolstart + fpc - 1
5681 "   call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
5682    silent! let keepregstar = @*
5683    while line("$") >= newcolstart
5684     if newcolend > line("$") | let newcolend= line("$") | endif
5685     let newcolqty= newcolend - newcolstart
5686     exe newcolstart
5687     if newcolqty == 0
5688      exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
5689     else
5690      exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
5691     endif
5692     exe "silent keepjumps ".newcolstart.','.newcolend.'d'
5693     exe 'silent keepjumps '.w:netrw_bannercnt
5694    endwhile
5695    silent! let @*= keepregstar
5696    exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
5697    setlocal noma nomod ro
5698 "   call Dret("NetrwWideListing")
5699   endif
5701 endfun
5703 " ---------------------------------------------------------------------
5704 " s:PerformListing: {{{2
5705 fun! s:PerformListing(islocal)
5706 "  call Dfunc("s:PerformListing(islocal=".a:islocal.") buf(%)=".bufnr("%")."<".bufname("%").">")
5708   call s:NetrwSafeOptions()
5709   setlocal noro ma
5710 "  call Decho("setlocal noro ma")
5712 "  if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1       " Decho
5713 "   call Decho("(netrw) Processing your browsing request...")
5714 "  endif                                                                " Decho
5716 "  call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
5717   if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
5718    " force a refresh for tree listings
5719 "   call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
5720    keepjumps %d
5721   endif
5723   " save current directory on directory history list
5724   call s:NetrwBookmarkDir(3,b:netrw_curdir)
5726   " Set up the banner {{{3
5727 "  call Decho("set up banner")
5728   keepjumps put ='\" ============================================================================'
5729   keepjumps put ='\" Netrw Directory Listing                                        (netrw '.g:loaded_netrw.')'
5730   keepjumps put ='\"   '.b:netrw_curdir
5731   keepjumps 1d
5732   let w:netrw_bannercnt= 3
5733   exe "keepjumps ".w:netrw_bannercnt
5735   let sortby= g:netrw_sort_by
5736   if g:netrw_sort_direction =~ "^r"
5737    let sortby= sortby." reversed"
5738   endif
5740   " Sorted by... {{{3
5741 "  call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
5742   if g:netrw_sort_by =~ "^n"
5743 "   call Decho("directories will be sorted by name")
5744    " sorted by name
5745    keepjumps put ='\"   Sorted by      '.sortby
5746    keepjumps put ='\"   Sort sequence: '.g:netrw_sort_sequence
5747    let w:netrw_bannercnt= w:netrw_bannercnt + 2
5748   else
5749 "   call Decho("directories will be sorted by size or time")
5750    " sorted by size or date
5751    keepjumps put ='\"   Sorted by '.sortby
5752    let w:netrw_bannercnt= w:netrw_bannercnt + 1
5753   endif
5754   exe "keepjumps ".w:netrw_bannercnt
5756   " show copy/move target, if any
5757   if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
5758 "   call Decho("show copy/move target<".s:netrwmftgt.">")
5759    keepjumps put =''
5760    if s:netrwmftgt_islocal
5761     call setline(line("."),'"   Copy/Move Tgt: '.s:netrwmftgt.' (local)')
5762    else
5763     call setline(line("."),'"   Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
5764    endif
5765    let w:netrw_bannercnt= w:netrw_bannercnt + 1
5766   else
5767 "   call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt")
5768   endif
5769   exe "keepjumps ".w:netrw_bannercnt
5771   " Hiding...  -or-  Showing... {{{3
5772 "  call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)")
5773   if g:netrw_list_hide != "" && g:netrw_hide
5774    if g:netrw_hide == 1
5775     keepjumps put ='\"   Hiding:        '.g:netrw_list_hide
5776    else
5777     keepjumps put ='\"   Showing:       '.g:netrw_list_hide
5778    endif
5779    let w:netrw_bannercnt= w:netrw_bannercnt + 1
5780   endif
5781   exe "keepjumps ".w:netrw_bannercnt
5782   keepjumps put ='\"   Quick Help: <F1>:help  -:go up dir  D:delete  R:rename  s:sort-by  x:exec'
5783   keepjumps put ='\" ============================================================================'
5784   let w:netrw_bannercnt= w:netrw_bannercnt + 2
5786   " bannercnt should index the line just after the banner
5787   let w:netrw_bannercnt= w:netrw_bannercnt + 1
5788   exe "keepjumps ".w:netrw_bannercnt
5789 "  call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
5791   " set up syntax highlighting {{{3
5792 "  call Decho("set up syntax highlighting")
5793   if has("syntax")
5794    setlocal ft=netrw
5795    if !exists("g:syntax_on") || !g:syntax_on
5796     setlocal ft=
5797    endif
5798   endif
5800   " get list of files
5801 "  call Decho("Get list of files - islocal=".a:islocal)
5802   if a:islocal
5803    call s:LocalListing()
5804   else " remote
5805    call s:NetrwRemoteListing()
5806   endif
5807 "  call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
5809   " manipulate the directory listing (hide, sort) {{{3
5810   if line("$") >= w:netrw_bannercnt
5811 "   call Decho("manipulate directory listing (hide)")
5812 "   call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
5813    if g:netrw_hide && g:netrw_list_hide != ""
5814     call s:NetrwListHide()
5815    endif
5816    if line("$") >= w:netrw_bannercnt
5817 "    call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
5819     if g:netrw_sort_by =~ "^n"
5820      " sort by name
5821      call s:NetrwSetSort()
5823      if w:netrw_bannercnt < line("$")
5824 "      call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
5825       if g:netrw_sort_direction =~ 'n'
5826        " normal direction sorting
5827        exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
5828       else
5829        " reverse direction sorting
5830        exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
5831       endif
5832      endif
5833      " remove priority pattern prefix
5834 "     call Decho("remove priority pattern prefix")
5835      let sepchr= "\<Char-0xff>"
5836      exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}'.sepchr.'//e'
5838     elseif a:islocal
5839      if w:netrw_bannercnt < line("$")
5840 "      call Decho("g:netrw_sort_direction=".g:netrw_sort_direction)
5841       if g:netrw_sort_direction =~ 'n'
5842 "       call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort')
5843        exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
5844       else
5845 "       call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort!')
5846        exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
5847       endif
5848      endif
5849      exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
5850     endif
5852    elseif g:netrw_sort_direction =~ 'r'
5853 "    call Decho('reverse the sorted listing')
5854     exe 'silent keepjumps '.w:netrw_bannercnt.'g/^/m '.w:netrw_bannercnt
5855    endif
5856   endif
5858   " convert to wide/tree listing {{{3
5859 "  call Decho("modify display if wide/tree listing style")
5860   call s:NetrwWideListing()
5861   call s:NetrwTreeListing(b:netrw_curdir)
5863   if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
5864    " place cursor on the top-left corner of the file listing
5865 "   call Decho("place cursor on top-left corner of file listing")
5866    exe 'silent keepjumps '.w:netrw_bannercnt
5867    norm! 0
5868   endif
5870   " record previous current directory
5871   let w:netrw_prvdir= b:netrw_curdir
5872 "  call Decho("record netrw_prvdir<".w:netrw_prvdir.">")
5874   " save certain window-oriented variables into buffer-oriented variables {{{3
5875   call s:SetBufWinVars()
5876   call s:NetrwOptionRestore("w:")
5878   " set display to netrw display settings
5879 "  call Decho("set display to netrw display settings (noma nomod etc)")
5880   setlocal noma nomod nonu nobl nowrap ro
5881   if exists("s:treecurpos")
5883    call netrw#NetrwRestorePosn(s:treecurpos)
5884    unlet s:treecurpos
5885   endif
5887 "  call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
5888 endfun
5890 " ---------------------------------------------------------------------
5891 " s:SetupNetrwStatusLine: {{{2
5892 fun! s:SetupNetrwStatusLine(statline)
5893 "  call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
5895   if !exists("s:netrw_setup_statline")
5896    let s:netrw_setup_statline= 1
5897 "   call Decho("do first-time status line setup")
5899    if !exists("s:netrw_users_stl")
5900     let s:netrw_users_stl= &stl
5901    endif
5902    if !exists("s:netrw_users_ls")
5903     let s:netrw_users_ls= &laststatus
5904    endif
5906    " set up User9 highlighting as needed
5907    let keepa= @a
5908    redir @a
5909    try
5910     hi User9
5911    catch /^Vim\%((\a\+)\)\=:E411/
5912     if &bg == "dark"
5913      hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
5914     else
5915      hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
5916     endif
5917    endtry
5918    redir END
5919    let @a= keepa
5920   endif
5922   " set up status line (may use User9 highlighting)
5923   " insure that windows have a statusline
5924   " make sure statusline is displayed
5925   let &stl=a:statline
5926   setlocal laststatus=2
5927 "  call Decho("stl=".&stl)
5928   redraw
5930 "  call Dret("SetupNetrwStatusLine : stl=".&stl)
5931 endfun
5933 " ---------------------------------------------------------------------
5934 "  Remote Directory Browsing Support:    {{{1
5935 " ===========================================
5937 " ---------------------------------------------------------------------
5938 " s:NetrwRemoteListing: {{{2
5939 fun! s:NetrwRemoteListing()
5940 "  call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)")
5942   call s:RemotePathAnalysis(b:netrw_curdir)
5944   " sanity check:
5945   if exists("b:netrw_method") && b:netrw_method =~ '[235]'
5946 "   call Decho("b:netrw_method=".b:netrw_method)
5947    if !executable("ftp")
5948     if !exists("g:netrw_quiet")
5949      call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
5950     endif
5951     call s:NetrwOptionRestore("w:")
5952 "    call Dret("s:NetrwRemoteListing")
5953     return
5954    endif
5956   elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
5957    if !exists("g:netrw_quiet")
5958     if g:netrw_list_cmd == ""
5959      call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47)
5960     else
5961      call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ".g:netrw_list_cmd,19)
5962     endif
5963    endif
5965    call s:NetrwOptionRestore("w:")
5966 "   call Dret("s:NetrwRemoteListing")
5967    return
5968   endif  " (remote handling sanity check)
5970   if exists("b:netrw_method")
5971 "   call Decho("setting w:netrw_method<".b:netrw_method.">")
5972    let w:netrw_method= b:netrw_method
5973   endif
5975   if s:method == "ftp"
5976    " use ftp to get remote file listing
5977 "   call Decho("use ftp to get remote file listing")
5978    let s:method  = "ftp"
5979    let listcmd = g:netrw_ftp_list_cmd
5980    if g:netrw_sort_by =~ '^t'
5981     let listcmd= g:netrw_ftp_timelist_cmd
5982    elseif g:netrw_sort_by =~ '^s'
5983     let listcmd= g:netrw_ftp_sizelist_cmd
5984    endif
5985 "   call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)")
5986    call s:NetrwRemoteFtpCmd(s:path,listcmd)
5987 "   exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))'
5989    if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
5990     " shorten the listing
5991 "    call Decho("generate short listing")
5992     exe "keepjumps ".w:netrw_bannercnt
5994     " cleanup
5995     if g:netrw_ftp_browse_reject != ""
5996      exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d"
5997     endif
5998     silent! keepjumps %s/\r$//e
6000     " if there's no ../ listed, then put ./ and ../ in
6001     let line1= line(".")
6002     exe "keepjumps ".w:netrw_bannercnt
6003     let line2= search('^\.\.\/\%(\s\|$\)','cnW')
6004     if line2 == 0
6005 "     call Decho("netrw is putting ./ and ../ into listing")
6006      keepjumps put='../'
6007      keepjumps put='./'
6008     endif
6009     exe "keepjumps ".line1
6010     keepjumps norm! 0
6012 "    call Decho("line1=".line1." line2=".line2." line(.)=".line("."))
6013     if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
6014 "     call Decho("M$ ftp cleanup")
6015      exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+//'
6016     else " normal ftp cleanup
6017 "     call Decho("normal ftp cleanup")
6018      exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
6019      exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
6020      exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
6021     endif
6022    endif
6024   else
6025    " use ssh to get remote file listing {{{3
6026 "   call Decho("use ssh to get remote file listing: s:path<".s:path.">")
6027    let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
6028 "   call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
6029    if g:netrw_scp_cmd =~ '^pscp'
6030 "    call Decho("1: exe silent r! ".listcmd.s:path)
6031     exe "silent r! ".listcmd.s:path
6032     " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
6033     g/^Listing directory/d
6034     g/^d[-rwx][-rwx][-rwx]/s+$+/+e
6035     silent g/^l[-rwx][-rwx][-rwx]/s+$+@+e
6036     if g:netrw_liststyle != s:LONGLIST
6037      g/^[dlsp-][-rwx][-rwx][-rwx]/s/^.*\s\(\S\+\)$/\1/e
6038     endif
6039    else
6040     if s:path == ""
6041 "     call Decho("2: exe silent r! ".listcmd)
6042      exe "silent r! ".listcmd
6043     else
6044 "     call Decho("3: exe silent r! ".listcmd.' '.shellescape(s:path,1))
6045      exe "silent r! ".listcmd.' '.shellescape(s:path,1)
6046 "     call Decho("listcmd<".listcmd."> path<".s:path.">")
6047     endif
6048    endif
6050    " cleanup
6051    if g:netrw_ftp_browse_reject != ""
6052 "    call Decho("(cleanup) exe silent! g/".g:netrw_ssh_browse_reject."/keepjumps d")
6053     exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d"
6054    endif
6055   endif
6057   if w:netrw_liststyle == s:LONGLIST
6058    " do a long listing; these substitutions need to be done prior to sorting {{{3
6059 "   call Decho("fix long listing:")
6061    if s:method == "ftp"
6062     " cleanup
6063     exe "keepjumps ".w:netrw_bannercnt
6064     while getline('.') =~ g:netrw_ftp_browse_reject
6065      keepjumps d
6066     endwhile
6067     " if there's no ../ listed, then put ./ and ../ in
6068     let line1= line(".")
6069     keepjumps 1
6070     silent keepjumps call search('^\.\.\/\%(\s\|$\)','W')
6071     let line2= line(".")
6072     if line2 == 0
6073      exe 'keepjumps '.w:netrw_bannercnt."put='./'"
6074      if b:netrw_curdir != '/'
6075       exe 'keepjumps '.w:netrw_bannercnt."put='../'"
6076      endif
6077     endif
6078    exe "keepjumps ".line1
6079    keepjumps norm! 0
6080    endif
6082    if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
6083 "    call Decho("M$ ftp site listing cleanup")
6084     exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+\)\(\w.*\)$/\2\t\1/'
6085    elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
6086 "    call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
6087     exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e'
6088     exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
6089     exe 'silent keepjumps '.w:netrw_bannercnt
6090    endif
6091   endif
6093 "  if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
6094 "   exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))'
6095 "  endif " Decho
6096 "  call Dret("s:NetrwRemoteListing")
6097 endfun
6099 " ---------------------------------------------------------------------
6100 " s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
6101 fun! s:NetrwRemoteRm(usrhost,path) range
6102 "  call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
6103 "  call Decho("firstline=".a:firstline." lastline=".a:lastline)
6104   let svpos= netrw#NetrwSavePosn()
6106   let all= 0
6107   if exists("s:netrwmarkfilelist_{bufnr('%')}")
6108    " remove all marked files
6109    for fname in s:netrwmarkfilelist_{bufnr("%")}
6110     let ok= s:NetrwRemoteRmFile(a:path,fname,all)
6111     if ok =~ 'q\%[uit]'
6112      break
6113     elseif ok =~ 'a\%[ll]'
6114      let all= 1
6115     endif
6116    endfor
6117    unlet s:netrwmarkfilelist_{bufnr("%")}
6118    unlet s:netrwmarkfilemtch_{bufnr("%")}
6119    2match none
6121   else
6122    " remove files specified by range
6124    " preparation for removing multiple files/directories
6125    let ctr= a:firstline
6127    " remove multiple files and directories
6128    while ctr <= a:lastline
6129     exe ctr
6130     let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
6131     if ok =~ 'q\%[uit]'
6132      break
6133     elseif ok =~ 'a\%[ll]'
6134      let all= 1
6135     endif
6136     let ctr= ctr + 1
6137    endwhile
6138   endif
6140   " refresh the (remote) directory listing
6141 "  call Decho("refresh remote directory listing")
6142   call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
6143   call netrw#NetrwRestorePosn(svpos)
6145 "  call Dret("s:NetrwRemoteRm")
6146 endfun
6148 " ---------------------------------------------------------------------
6149 " s:NetrwRemoteRmFile: {{{2
6150 fun! s:NetrwRemoteRmFile(path,rmfile,all)
6151 "  call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
6153   let all= a:all
6154   let ok = ""
6156   if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
6157    " attempt to remove file
6158 "    call Decho("attempt to remove file (all=".all.")")
6159    if !all
6160     echohl Statement
6161 "    call Decho("case all=0:")
6162     call inputsave()
6163     let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6164     call inputrestore()
6165     echohl NONE
6166     if ok == ""
6167      let ok="no"
6168     endif
6169     let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6170     if ok =~ 'a\%[ll]'
6171      let all= 1
6172     endif
6173    endif
6175    if all || ok =~ 'y\%[es]' || ok == ""
6176 "    call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""))
6177     if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6178 "     call Decho("case ftp:")
6179      let path= a:path
6180      if path =~ '^\a\+://'
6181       let path= substitute(path,'^\a\+://[^/]\+/','','')
6182      endif
6183      silent! keepjumps .,$d
6184      call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
6185     else
6186 "     call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">")
6187      let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
6188 "     call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
6189      if !exists("b:netrw_curdir")
6190       call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
6191       let ok="q"
6192      else
6193       let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
6194 "      call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
6195 "      call Decho("remotedir<".remotedir.">")
6196 "      call Decho("rmfile<".a:rmfile.">")
6197       if remotedir != ""
6198        let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile))
6199       else
6200        let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile))
6201       endif
6202 "      call Decho("call system(".netrw_rm_cmd.")")
6203       let ret= system(netrw_rm_cmd)
6204       if ret != 0
6205        call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
6206       endif
6207 "      call Decho("returned=".ret." errcode=".v:shell_error)
6208      endif
6209     endif
6210    elseif ok =~ 'q\%[uit]'
6211 "    call Decho("ok==".ok)
6212     break
6213    endif
6215   else
6216    " attempt to remove directory
6217 "    call Decho("attempt to remove directory")
6218    if !all
6219     call inputsave()
6220     let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6221     call inputrestore()
6222     if ok == ""
6223      let ok="no"
6224     endif
6225     let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6226     if ok =~ 'a\%[ll]'
6227      let all= 1
6228     endif
6229    endif
6231    if all || ok =~ 'y\%[es]' || ok == ""
6232     if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6233      call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
6234     else
6235      let rmfile          = substitute(a:path.a:rmfile,'/$','','')
6236      let netrw_rmdir_cmd = s:MakeSshCmd(s:WinPath(g:netrw_rmdir_cmd)).' '.shellescape(s:WinPath(rmfile))
6237 "      call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
6238      let ret= system(netrw_rmdir_cmd)
6239 "      call Decho("returned=".ret." errcode=".v:shell_error)
6241      if v:shell_error != 0
6242 "      call Decho("v:shell_error not 0")
6243       let netrw_rmf_cmd= s:MakeSshCmd(s:WinPath(g:netrw_rmf_cmd)).' '.shellescape(s:WinPath(substitute(rmfile,'[\/]$','','e')))
6244 "      call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
6245       let ret= system(netrw_rmf_cmd)
6246 "      call Decho("returned=".ret." errcode=".v:shell_error)
6248       if v:shell_error != 0 && !exists("g:netrw_quiet")
6249         call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
6250       endif
6251      endif
6252     endif
6254    elseif ok =~ 'q\%[uit]'
6255     break
6256    endif
6257   endif
6259 "  call Dret("s:NetrwRemoteRmFile ".ok)
6260   return ok
6261 endfun
6263 " ---------------------------------------------------------------------
6264 " s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
6265 "  This function assumes that a long listing will be received.  Size, time,
6266 "  and reverse sorts will be requested of the server but not otherwise
6267 "  enforced here.
6268 fun! s:NetrwRemoteFtpCmd(path,listcmd)
6269 "  call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method)
6270 "  call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt)
6272   " because WinXX ftp uses unix style input
6273   let ffkeep= &ff
6274   setlocal ma ff=unix noro
6275 "  call Decho("setlocal ma ff=unix noro")
6277   " clear off any older non-banner lines
6278   " note that w:netrw_bannercnt indexes the line after the banner
6279 "  call Decho('exe silent! keepjumps '.w:netrw_bannercnt.",$d  (clear off old non-banner lines)")
6280   exe "silent! keepjumps ".w:netrw_bannercnt.",$d"
6282   ".........................................
6283   if w:netrw_method == 2 || w:netrw_method == 5
6284    " ftp + <.netrc>:  Method #2
6285    if a:path != ""
6286     put ='cd \"'.a:path.'\"'
6287    endif
6288    if exists("g:netrw_ftpextracmd")
6289     exe "put ='".g:netrw_ftpextracmd."'"
6290 "    call Decho("filter input: ".getline('.'))
6291    endif
6292    call setline(line("$")+1,a:listcmd)
6293 "   exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
6294    if exists("g:netrw_port") && g:netrw_port != ""
6295 "    call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
6296     exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
6297    else
6298 "    call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
6299     exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
6300    endif
6302    ".........................................
6303   elseif w:netrw_method == 3
6304    " ftp + machine,id,passwd,filename:  Method #3
6305     setlocal ff=unix
6306     if exists("g:netrw_port") && g:netrw_port != ""
6307      put ='open '.g:netrw_machine.' '.g:netrw_port
6308     else
6309      put ='open '.g:netrw_machine
6310     endif
6312     if exists("g:netrw_ftp") && g:netrw_ftp == 1
6313      put =g:netrw_uid
6314      put ='\"'.s:netrw_passwd.'\"'
6315     else
6316      put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
6317     endif
6319    if a:path != ""
6320     put ='cd \"'.a:path.'\"'
6321    endif
6322    if exists("g:netrw_ftpextracmd")
6323     exe "put ='".g:netrw_ftpextracmd."'"
6324 "    call Decho("filter input: ".getline('.'))
6325    endif
6326    call setline(line("$")+1,a:listcmd)
6328     " perform ftp:
6329     " -i       : turns off interactive prompting from ftp
6330     " -n  unix : DON'T use <.netrc>, even though it exists
6331     " -n  win32: quit being obnoxious about password
6332 "    exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
6333 "    call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n")
6334     exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n"
6336    ".........................................
6337   else
6338    call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23)
6339   endif
6341   " cleanup for Windows
6342   if has("win32") || has("win95") || has("win64") || has("win16")
6343    silent! keepjumps %s/\r$//e
6344   endif
6345   if a:listcmd == "dir"
6346    " infer directory/link based on the file permission string
6347    silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@
6348    silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/
6349    if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
6350     exe "silent! keepjumps ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
6351    endif
6352   endif
6354   " ftp's listing doesn't seem to include ./ or ../
6355   if !search('^\.\/$\|\s\.\/$','wn')
6356    exe 'keepjumps '.w:netrw_bannercnt
6357    put ='./'
6358   endif
6359   if !search('^\.\.\/$\|\s\.\.\/$','wn')
6360    exe 'keepjumps '.w:netrw_bannercnt
6361    put ='../'
6362   endif
6364   " restore settings
6365   let &ff= ffkeep
6366 "  call Dret("NetrwRemoteFtpCmd")
6367 endfun
6369 " ---------------------------------------------------------------------
6370 " s:NetrwRemoteRename: rename a remote file or directory {{{2
6371 fun! s:NetrwRemoteRename(usrhost,path) range
6372 "  call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
6374   " preparation for removing multiple files/directories
6375   let svpos      = netrw#NetrwSavePosn()
6376   let ctr        = a:firstline
6377   let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
6379   " rename files given by the markfilelist
6380   if exists("s:netrwmarkfilelist_{bufnr('%')}")
6381    for oldname in s:netrwmarkfilelist_{bufnr("%")}
6382 "    call Decho("oldname<".oldname.">")
6383     if exists("subfrom")
6384      let newname= substitute(oldname,subfrom,subto,'')
6385 "     call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6386     else
6387      call inputsave()
6388      let newname= input("Moving ".oldname." to : ",oldname)
6389      call inputrestore()
6390      if newname =~ '^s/'
6391       let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
6392       let subto   = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
6393       let newname = substitute(oldname,subfrom,subto,'')
6394 "      call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6395      endif
6396     endif
6397    
6398     if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6399      call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
6400     else
6401      let oldname= shellescape(a:path.oldname)
6402      let newname= shellescape(a:path.newname)
6403 "     call Decho("system(s:WinPath(".rename_cmd.") ".oldname.' '.newname.")")
6404      let ret    = system(s:WinPath(rename_cmd).' '.oldname.' '.newname)
6405     endif
6407    endfor
6408    call s:NetrwUnMarkFile(1)
6410   else
6412   " attempt to rename files/directories
6413    while ctr <= a:lastline
6414     exe "keepjumps ".ctr
6416     let oldname= s:NetrwGetWord()
6417 "   call Decho("oldname<".oldname.">")
6419     call inputsave()
6420     let newname= input("Moving ".oldname." to : ",oldname)
6421     call inputrestore()
6423     if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
6424      call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
6425     else
6426      let oldname= shellescape(a:path.oldname)
6427      let newname= shellescape(a:path.newname)
6428 "     call Decho("system(s:WinPath(".rename_cmd.") ".oldname.' '.newname.")")
6429      let ret    = system(s:WinPath(rename_cmd).' '.oldname.' '.newname)
6430     endif
6432     let ctr= ctr + 1
6433    endwhile
6434   endif
6436   " refresh the directory
6437   call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
6438   call netrw#NetrwRestorePosn(svpos)
6440 "  call Dret("NetrwRemoteRename")
6441 endfun
6443 " ---------------------------------------------------------------------
6444 "  Local Directory Browsing Support:    {{{1
6445 " ==========================================
6447 " ---------------------------------------------------------------------
6448 " netrw#LocalBrowseCheck: {{{2
6449 fun! netrw#LocalBrowseCheck(dirname)
6450   " unfortunate interaction -- split window debugging can't be
6451   " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter
6452   " event triggers another call to LocalBrowseCheck() when attempts
6453   " to write to the DBG buffer are made.
6454   " The &ft == "netrw" test was installed because the BufEnter event
6455   " would hit when re-entering netrw windows, creating unexpected
6456   " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
6457 "  call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname))
6458   if isdirectory(a:dirname)
6459 "   call Decho(" ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$"))
6460    if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname)
6461     silent! call s:NetrwBrowse(1,a:dirname)
6462    elseif &ft == "netrw" && line("$") == 1
6463     silent! call s:NetrwBrowse(1,a:dirname)
6464    endif
6465   endif
6466   " not a directory, ignore it
6467 endfun
6469 " ---------------------------------------------------------------------
6470 "  s:LocalListing: does the job of "ls" for local directories {{{2
6471 fun! s:LocalListing()
6472 "  call Dfunc("s:LocalListing()")
6473 "  call Decho("&ma=".&ma)
6474 "  call Decho("&mod=".&mod)
6475 "  call Decho("&ro=".&ro)
6476 "  call Decho("bufname(%)<".bufname("%").">")
6478 "  if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">")  |else|call Decho("b:netrw_curdir doesn't exist") |endif
6479 "  if exists("g:netrw_sort_by")|call Decho('g:netrw_sort_by<'.g:netrw_sort_by.">")|else|call Decho("g:netrw_sort_by doesn't exist")|endif
6481   " get the list of files contained in the current directory
6482   let dirname    = escape(b:netrw_curdir,g:netrw_glob_escape)
6483   let dirnamelen = strlen(b:netrw_curdir)
6484   let filelist   = glob(s:ComposePath(dirname,"*"))
6485 "  call Decho("glob(dirname<".dirname."/*>)=".filelist)
6486   if filelist != ""
6487    let filelist= filelist."\n"
6488   endif
6489   let filelist= filelist.glob(s:ComposePath(dirname,".*"))
6490 "  call Decho("glob(dirname<".dirname."/.*>)=".filelist)
6492   " Coding choice: either   elide   ./ if present
6493   "                or       include ./ if not present
6494   if filelist =~ '[\\/]\.[\\/]\=\(\n\|$\)'
6495    " elide /path/. from glob() entries if present
6496 "   call Decho("elide /path/. from glob entries if present")
6497    let filelist = substitute(filelist,'\n','\t','g')
6498    let filelist = substitute(filelist,'^[^\t]\+[/\\]\.\t','','')
6499    let filelist = substitute(filelist,'[^\t]\+[/\\]\.$','','')
6500    let filelist = substitute(filelist,'\t\zs[^\t]\+[/\\]\.\t','','')
6501    let filelist = substitute(filelist,'\t','\n','g')
6502   endif
6503 "  call Decho("filelist<".filelist.">")
6504   if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
6505     " include ../ in the glob() entry if its missing
6506 "   call Decho("forcibly tacking on ..")
6507    let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../")
6508 "   call Decho("filelist<".filelist.">")
6509   endif
6510   if b:netrw_curdir == '/'
6511    " remove .. from filelist when current directory is root directory
6512 "   call Decho("remove .. from filelist")
6513    let filelist= substitute(filelist,'/\.\.\n','','')
6514   endif
6515   " remove multiple contiguous newlines
6516   let filelist= substitute(filelist,'\n\{2,}','\n','ge')
6517   if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
6518    " change all \s to /s
6519 "   call Decho('change all \s to /s')
6520    let filelist= substitute(filelist,'\','/','g')
6521   else
6522    " escape all \s to \\
6523 "   call Decho('escape all \s to \\')
6524    let filelist= substitute(filelist,'\','\\','g')
6525   endif
6527 "  call Decho("(before while) dirname<".dirname.">")
6528 "  call Decho("(before while) dirnamelen<".dirnamelen.">")
6529 "  call Decho("(before while) filelist<".filelist.">")
6531   while filelist != ""
6532    if filelist =~ '\n'
6533     let filename = substitute(filelist,'\n.*$','','e')
6534     let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e')
6535    else
6536     let filename = filelist
6537     let filelist = ""
6538    endif
6539 "   call Decho(" ")
6540 "   call Decho("(while) filelist<".filelist.">")
6541 "   call Decho("(while) filename<".filename.">")
6543    if getftype(filename) == "link"
6544     " indicate a symbolic link
6545 "    call Decho("indicate <".filename."> is a symbolic link with trailing @")
6546     let pfile= filename."@"
6548    elseif getftype(filename) == "socket"
6549     " indicate a socket
6550 "    call Decho("indicate <".filename."> is a socket with trailing =")
6551     let pfile= filename."="
6553    elseif getftype(filename) == "fifo"
6554     " indicate a fifo
6555 "    call Decho("indicate <".filename."> is a fifo with trailing |")
6556     let pfile= filename."|"
6558    elseif isdirectory(filename)
6559     " indicate a directory
6560 "    call Decho("indicate <".filename."> is a directory with trailing /")
6561     let pfile= filename."/"
6563    elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename)
6564     if (has("win32") || has("win95") || has("win64") || has("win16"))
6565      if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
6566       " indicate an executable
6567 "      call Decho("indicate <".filename."> is executable with trailing *")
6568       let pfile= filename."*"
6569      else
6570       " normal file
6571       let pfile= filename
6572      endif
6573     elseif executable(filename)
6574      " indicate an executable
6575 "     call Decho("indicate <".filename."> is executable with trailing *")
6576      let pfile= filename."*"
6577     else
6578      " normal file
6579      let pfile= filename
6580     endif
6582    else
6583     " normal file
6584     let pfile= filename
6585    endif
6586 "   call Decho("pfile<".pfile."> (after *@/ appending)")
6588    if pfile =~ '//$'
6589     let pfile= substitute(pfile,'//$','/','e')
6590 "    call Decho("change // to /: pfile<".pfile.">")
6591    endif
6592    let pfile= strpart(pfile,dirnamelen)
6593    let pfile= substitute(pfile,'^[/\\]','','e')
6594 "   call Decho("filename<".filename.">")
6595 "   call Decho("pfile   <".pfile.">")
6597    if w:netrw_liststyle == s:LONGLIST
6598     let sz   = getfsize(filename)
6599     let fsz  = strpart("               ",1,15-s:Strlen(sz)).sz
6600     let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
6601 "    call Decho("sz=".sz." fsz=".fsz)
6602    endif
6604    if     g:netrw_sort_by =~ "^t"
6605     " sort by time (handles time up to 1 quintillion seconds, US)
6606 "    call Decho("getftime(".filename.")=".getftime(filename))
6607     let t  = getftime(filename)
6608     let ft = strpart("000000000000000000",1,18-s:Strlen(t)).t
6609 "    call Decho("exe keepjumps put ='".ft.'/'.filename."'")
6610     let ftpfile= ft.'/'.pfile
6611     keepjumps silent! put=ftpfile
6613    elseif g:netrw_sort_by =~ "^s"
6614     " sort by size (handles file sizes up to 1 quintillion bytes, US)
6615 "    call Decho("getfsize(".filename.")=".getfsize(filename))
6616     let sz   = getfsize(filename)
6617     let fsz  = strpart("000000000000000000",1,18-s:Strlen(sz)).sz
6618 "    call Decho("exe keepjumps put ='".fsz.'/'.filename."'")
6619     let fszpfile= fsz.'/'.pfile
6620     keepjumps silent! put =fszpfile
6622    else
6623     " sort by name
6624 "    call Decho("exe keepjumps put ='".pfile."'")
6625     keepjumps silent! put=pfile
6626    endif
6627   endwhile
6629   " cleanup any windows mess at end-of-line
6630   silent! keepjumps %s/\r$//e
6631   exe "setlocal ts=".g:netrw_maxfilenamelen
6632 "  call Decho("setlocal ts=".g:netrw_maxfilenamelen)
6634 "  call Dret("s:LocalListing")
6635 endfun
6637 " ---------------------------------------------------------------------
6638 " s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
6639 " performed any shell command.  The idea is to cause all local-browsing
6640 " buffers to be refreshed after a user has executed some shell command,
6641 " on the chance that s/he removed/created a file/directory with it.
6642 fun! s:LocalBrowseShellCmdRefresh()
6643 "  call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs")
6644   " determine which buffers currently reside in a tab
6645   if !exists("s:netrw_browselist")
6646 "   call Dret("LocalBrowseShellCmdRefresh : browselist is empty")
6647    return
6648   endif
6649   if !exists("w:netrw_bannercnt")
6650 "   call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw windwo")
6651    return
6652   endif
6653   let itab       = 1
6654   let buftablist = []
6655   while itab <= tabpagenr("$")
6656    let buftablist = buftablist + tabpagebuflist()
6657    let itab       = itab + 1
6658    tabn
6659   endwhile
6660 "  call Decho("buftablist".string(buftablist))
6661 "  call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">")
6662   "  GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
6663   "   | refresh any netrw window
6664   "   | wipe out any non-displaying netrw buffer
6665   let curwin = winnr()
6666   let ibl    = 0
6667   for ibuf in s:netrw_browselist
6668 "   call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
6669    if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
6670     " wipe out any non-displaying netrw buffer
6671 "    call Decho("wiping  buf#".ibuf,"<".bufname(ibuf).">")
6672     exe "silent! bd ".ibuf
6673     call remove(s:netrw_browselist,ibl)
6674 "    call Decho("browselist=".string(s:netrw_browselist))
6675     continue
6676    elseif index(tabpagebuflist(),ibuf) != -1
6677     " refresh any netrw buffer
6678 "    call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
6679     exe bufwinnr(ibuf)."wincmd w"
6680     call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
6681    endif
6682    let ibl= ibl + 1
6683   endfor
6684   exe curwin."wincmd w"
6686 "  call Dret("LocalBrowseShellCmdRefresh")
6687 endfun
6689 " ---------------------------------------------------------------------
6690 " s:NetrwLocalRm: {{{2
6691 fun! s:NetrwLocalRm(path) range
6692 "  call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
6693 "  call Decho("firstline=".a:firstline." lastline=".a:lastline)
6695   " preparation for removing multiple files/directories
6696   let ret   = 0
6697   let all   = 0
6698   let svpos = netrw#NetrwSavePosn()
6700   if exists("s:netrwmarkfilelist_{bufnr('%')}")
6701    " remove all marked files
6702 "   call Decho("remove all marked files")
6703    for fname in s:netrwmarkfilelist_{bufnr("%")}
6704     let ok= s:NetrwLocalRmFile(a:path,fname,all)
6705     if ok =~ 'q\%[uit]' || ok == "no"
6706      break
6707     elseif ok =~ 'a\%[ll]'
6708      let all= 1
6709     endif
6710    endfor
6711    call s:NetrwUnMarkFile(1)
6713   else
6714   " remove (multiple) files and directories
6715 "   call Decho("remove files in range [".a:firstline.",".a:lastline."]")
6717    let ctr = a:firstline
6718    while ctr <= a:lastline
6719     exe "keepjumps ".ctr
6721     " sanity checks
6722     if line(".") < w:netrw_bannercnt
6723      let ctr= ctr + 1
6724      continue
6725     endif
6726     let curword= s:NetrwGetWord()
6727     if curword == "./" || curword == "../"
6728      let ctr= ctr + 1
6729      continue
6730     endif
6731     let ok= s:NetrwLocalRmFile(a:path,curword,all)
6732     if ok =~ 'q\%[uit]' || ok == "no"
6733      break
6734     elseif ok =~ 'a\%[ll]'
6735      let all= 1
6736     endif
6737     let ctr= ctr + 1
6738    endwhile
6739   endif
6741   " refresh the directory
6742 "  call Decho("bufname<".bufname("%").">")
6743   if bufname("%") != "NetrwMessage"
6744    call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
6745    call netrw#NetrwRestorePosn(svpos)
6746   endif
6748 "  call Dret("s:NetrwLocalRm")
6749 endfun
6751 " ---------------------------------------------------------------------
6752 " s:NetrwLocalRmFile: remove file fname given the path {{{2
6753 "                     Give confirmation prompt unless all==1
6754 fun! s:NetrwLocalRmFile(path,fname,all)
6755 "  call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
6756   
6757   let all= a:all
6758   let ok = ""
6759   norm! 0
6760   let rmfile= s:ComposePath(a:path,a:fname)
6761 "  call Decho("rmfile<".rmfile.">")
6763   if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
6764    " attempt to remove file
6765 "   call Decho("attempt to remove file<".rmfile.">")
6766    if !all
6767     echohl Statement
6768     call inputsave()
6769     let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6770     call inputrestore()
6771     echohl NONE
6772     if ok == ""
6773      let ok="no"
6774     endif
6775 "    call Decho("response: ok<".ok.">")
6776     let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6777 "    call Decho("response: ok<".ok."> (after sub)")
6778     if ok =~ 'a\%[ll]'
6779      let all= 1
6780     endif
6781    endif
6783    if all || ok =~ 'y\%[es]' || ok == ""
6784     let ret= s:NetrwDelete(rmfile)
6785 "    call Decho("errcode=".v:shell_error." ret=".ret)
6786    endif
6788   else
6789    " attempt to remove directory
6790    if !all
6791     echohl Statement
6792     call inputsave()
6793     let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
6794     call inputrestore()
6795     let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
6796     if ok == ""
6797      let ok="no"
6798     endif
6799     if ok =~ 'a\%[ll]'
6800      let all= 1
6801     endif
6802    endif
6803    let rmfile= substitute(rmfile,'[\/]$','','e')
6805    if all || ok =~ 'y\%[es]' || ok == ""
6806 "    call Decho("1st attempt: system(s:WinPath(".g:netrw_local_rmdir.') '.shellescape(rmfile).')')
6807     call system(s:WinPath(g:netrw_local_rmdir).' '.shellescape(rmfile))
6808 "    call Decho("v:shell_error=".v:shell_error)
6810     if v:shell_error != 0
6811 "     call Decho("2nd attempt to remove directory<".rmfile.">")
6812      let errcode= s:NetrwDelete(rmfile)
6813 "     call Decho("errcode=".errcode)
6815      if errcode != 0
6816       if has("unix")
6817 "       call Decho("3rd attempt to remove directory<".rmfile.">")
6818        call system("rm ".shellescape(rmfile))
6819        if v:shell_error != 0 && !exists("g:netrw_quiet")
6820         call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
6821         let ok="no"
6822        endif
6823       elseif !exists("g:netrw_quiet")
6824        call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
6825        let ok="no"
6826       endif
6827      endif
6828     endif
6829    endif
6830   endif
6832 "  call Dret("s:NetrwLocalRmFile ".ok)
6833   return ok
6834 endfun
6836 " ---------------------------------------------------------------------
6837 " s:NetrwLocalRename: rename a remote file or directory {{{2
6838 fun! s:NetrwLocalRename(path) range
6839 "  call Dfunc("NetrwLocalRename(path<".a:path.">)")
6841   " preparation for removing multiple files/directories
6842   let ctr  = a:firstline
6843   let svpos= netrw#NetrwSavePosn()
6845   " rename files given by the markfilelist
6846   if exists("s:netrwmarkfilelist_{bufnr('%')}")
6847    for oldname in s:netrwmarkfilelist_{bufnr("%")}
6848 "    call Decho("oldname<".oldname.">")
6849     if exists("subfrom")
6850      let newname= substitute(oldname,subfrom,subto,'')
6851 "     call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6852     else
6853      call inputsave()
6854      let newname= input("Moving ".oldname." to : ",oldname)
6855      call inputrestore()
6856      if newname =~ '^s/'
6857       let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
6858       let subto   = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
6859 "      call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
6860       let newname = substitute(oldname,subfrom,subto,'')
6861      endif
6862     endif
6863     let ret= rename(oldname,newname)
6864    endfor
6865    2match none
6866    unlet s:netrwmarkfilelist_{bufnr("%")}
6867    unlet s:netrwmarkfilemtch_{bufnr("%")}
6868   
6869   else
6871    " attempt to rename files/directories
6872    while ctr <= a:lastline
6873     exe "keepjumps ".ctr
6875     " sanity checks
6876     if line(".") < w:netrw_bannercnt
6877      let ctr= ctr + 1
6878      continue
6879     endif
6880     let curword= s:NetrwGetWord()
6881     if curword == "./" || curword == "../"
6882      let ctr= ctr + 1
6883      continue
6884     endif
6886     norm! 0
6887     let oldname= s:ComposePath(a:path,curword)
6888 "   call Decho("oldname<".oldname.">")
6890     call inputsave()
6891     let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
6892     call inputrestore()
6894     let ret= rename(oldname,newname)
6895 "   call Decho("renaming <".oldname."> to <".newname.">")
6897     let ctr= ctr + 1
6898    endwhile
6899   endif
6901   " refresh the directory
6902 "  call Decho("refresh the directory listing")
6903   call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
6904   call netrw#NetrwRestorePosn(svpos)
6906 "  call Dret("NetrwLocalRename")
6907 endfun
6909 " ---------------------------------------------------------------------
6910 " s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
6912 "     g:netrw_    Directory Is
6913 "     fastbrowse  Local  Remote   
6914 "  slow   0         D      D      D=Deleting a buffer implies it will not be re-used (slow)
6915 "  med    1         D      H      H=Hiding a buffer implies it may be re-used        (fast)
6916 "  fast   2         H      H      
6918 "  Deleting a buffer means that it will be re-loaded when examined, hence "slow".
6919 "  Hiding   a buffer means that it will be re-used   when examined, hence "fast".
6920 "           (re-using a buffer may not be as accurate)
6921 fun! s:LocalFastBrowser()
6922 "  call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse)
6924   " initialize browselist, a list of buffer numbers that the local browser has used
6925   if !exists("s:netrw_browselist")
6926 "   call Decho("initialize s:netrw_browselist")
6927    let s:netrw_browselist= []
6928   endif
6930   " append current buffer to fastbrowse list
6931   if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
6932 "   call Decho("appendng current buffer to browselist")
6933    call add(s:netrw_browselist,bufnr("%"))
6934 "   call Decho("browselist=".string(s:netrw_browselist))
6935   endif
6937   " enable autocmd events to handle refreshing/removing local browser buffers
6938   "    If local browse buffer is currently showing: refresh it
6939   "    If local browse buffer is currently hidden : wipe it
6940   if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
6941 "   call Decho("setting up local-browser shell command refresh")
6942    let s:netrw_browser_shellcmd= 1
6943    augroup AuNetrwShellCmd
6944     au!
6945     if (has("win32") || has("win95") || has("win64") || has("win16"))
6946      au ShellCmdPost                    *       call s:LocalBrowseShellCmdRefresh()
6947     else
6948      au ShellCmdPost,FocusGained        *       call s:LocalBrowseShellCmdRefresh()
6949     endif
6950    augroup END
6951   endif
6953   " user must have changed fastbrowse to its fast setting, so remove
6954   " the associated autocmd events
6955   if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
6956 "   call Decho("remove AuNetrwShellCmd autcmd group")
6957    unlet s:netrw_browser_shellcmd
6958    augroup AuNetrwShellCmd
6959     au!
6960    augroup END
6961    augroup! AuNetrwShellCmd
6962   endif
6964 "  call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
6965 endfun
6967 " ---------------------------------------------------------------------
6968 " Support Functions: {{{1
6970 " ---------------------------------------------------------------------
6971 " netrw#ErrorMsg: {{{2
6972 "   0=note     = s:NOTE
6973 "   1=warning  = s:WARNING
6974 "   2=error    = s:ERROR
6975 "  Jul 08, 2008 : max errnum currently is 71
6976 fun! netrw#ErrorMsg(level,msg,errnum)
6977 "  call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow)
6979   if a:level == 1
6980    let level= "**warning** (netrw) "
6981   elseif a:level == 2
6982    let level= "**error** (netrw) "
6983   else
6984    let level= "**note** (netrw) "
6985   endif
6986 "  call Decho("level=".level)
6988   if g:netrw_use_errorwindow
6989    " (default) netrw creates a one-line window to show error/warning
6990    " messages (reliably displayed)
6992    " record current window number for NetrwRestorePosn()'s benefit
6993    let s:winBeforeErr= winnr()
6994 "   call Decho("s:winBeforeErr=".s:winBeforeErr)
6996    " getting messages out reliably is just plain difficult!
6997    " This attempt splits the current window, creating a one line window.
6998    if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
6999 "    call Decho("write to NetrwMessage buffer")
7000     exe bufwinnr("NetrwMessage")."wincmd w"
7001 "    call Decho("setlocal ma noro")
7002     setlocal ma noro
7003     call setline(line("$")+1,level.a:msg)
7004     $
7005    else
7006 "    call Decho("create a NetrwMessage buffer window")
7007     bo 1split
7008     enew
7009     setlocal bt=nofile
7010     file NetrwMessage
7011 "    call Decho("setlocal ma noro")
7012     setlocal ma noro
7013     call setline(line("$"),level.a:msg)
7014    endif
7015 "   call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr())
7016    if &fo !~ '[ta]'
7017     syn clear
7018     syn match netrwMesgNote     "^\*\*note\*\*"
7019     syn match netrwMesgWarning  "^\*\*warning\*\*"
7020     syn match netrwMesgError    "^\*\*error\*\*"
7021     hi link netrwMesgWarning WarningMsg
7022     hi link netrwMesgError   Error
7023    endif
7024    setlocal noma ro bh=wipe
7026   else
7027    " (optional) netrw will show messages using echomsg.  Even if the
7028    " message doesn't appear, at least it'll be recallable via :messages
7029 "   redraw!
7030    if a:level == s:WARNING
7031     echohl WarningMsg
7032    elseif a:level == s:ERROR
7033     echohl Error
7034    endif
7035    echomsg level.a:msg
7036 "   call Decho("echomsg ***netrw*** ".a:msg)
7037    echohl None
7038   endif
7040 "  call Dret("netrw#ErrorMsg")
7041 endfun
7043 " ---------------------------------------------------------------------
7044 " netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
7045 fun! netrw#NetrwRestorePosn(...)
7046 "  call Dfunc("netrw#NetrwRestorePosn() a:0=".a:0." winnr=".(exists("w:netrw_winnr")? w:netrw_winnr : -1)." line=".(exists("w:netrw_line")? w:netrw_line : -1)." col=".(exists("w:netrw_col")? w:netrw_col : -1)." hline=".(exists("w:netrw_hline")? w:netrw_hline : -1))
7047   let eikeep= &ei
7048   set ei=all
7049   if expand("%") == "NetrwMessage"
7050    exe s:winBeforeErr."wincmd w"
7051   endif
7053   if a:0 > 0
7054    exe a:1
7055   endif
7057   " restore window
7058   if exists("w:netrw_winnr")
7059 "   call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
7060    exe "silent! ".w:netrw_winnr."wincmd w"
7061   endif
7062   if v:shell_error == 0
7063    " as suggested by Bram M: redraw on no error
7064    " allows protocol error messages to remain visible
7065 "   redraw!
7066   endif
7068   " restore top-of-screen line
7069   if exists("w:netrw_hline")
7070 "   call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
7071    exe "norm! ".w:netrw_hline."G0z\<CR>"
7072   endif
7074   " restore position
7075   if exists("w:netrw_line") && exists("w:netrw_col")
7076 "   call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
7077    exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
7078   endif
7080   let &ei= eikeep
7081 "  call Dret("netrw#NetrwRestorePosn")
7082 endfun
7084 " ---------------------------------------------------------------------
7085 " netrw#NetrwSavePosn: saves position of cursor on screen {{{2
7086 fun! netrw#NetrwSavePosn()
7087 "  call Dfunc("netrw#NetrwSavePosn()")
7088   " Save current line and column
7089   let w:netrw_winnr= winnr()
7090   let w:netrw_line = line(".")
7091   let w:netrw_col  = virtcol(".")
7093   " Save top-of-screen line
7094   norm! H0
7095   let w:netrw_hline= line(".")
7097   " set up string holding position parameters
7098   let ret          = "let w:netrw_winnr=".w:netrw_winnr."|let w:netrw_line=".w:netrw_line."|let w:netrw_col=".w:netrw_col."|let w:netrw_hline=".w:netrw_hline
7100   call netrw#NetrwRestorePosn()
7101 "  call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
7102   return ret
7103 endfun
7105 " ------------------------------------------------------------------------
7106 "  netrw#RFC2396: converts %xx into characters {{{2
7107 fun! netrw#RFC2396(fname)
7108 "  call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
7109   let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
7110 "  call Dret("netrw#RFC2396 ".fname)
7111   return fname
7112 endfun
7114 " ---------------------------------------------------------------------
7115 "  s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
7116 fun! s:ComposePath(base,subdir)
7117 "  call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
7119   if(has("amiga"))
7120 "   call Decho("amiga")
7121    let ec = a:base[strlen(a:base)-1]
7122    if ec != '/' && ec != ':'
7123     let ret = a:base . "/" . a:subdir
7124    else
7125     let ret = a:base . a:subdir
7126    endif
7128   elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
7129 "   call Decho("windows")
7130    let ret= a:subdir
7132   elseif a:base =~ '^\a\+://'
7133 "   call Decho("remote linux/macos")
7134    let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
7135    let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
7136    if a:subdir == '../'
7137     if curpath =~ '[^/]/[^/]\+/$'
7138      let curpath= substitute(curpath,'[^/]\+/$','','')
7139     else
7140      let curpath=""
7141     endif
7142     let ret= urlbase.curpath
7143    else
7144     let ret= urlbase.curpath.a:subdir
7145    endif
7146 "   call Decho("urlbase<".urlbase.">")
7147 "   call Decho("curpath<".curpath.">")
7148 "   call Decho("ret<".ret.">")
7150   else
7151 "   call Decho("local linux/macos")
7152    let ret = substitute(a:base."/".a:subdir,"//","/","g")
7153    if a:base =~ '^//'
7154     " keeping initial '//' for the benefit of network share listing support
7155     let ret= '/'.ret
7156    endif
7157    let ret= simplify(ret)
7158   endif
7160 "  call Dret("s:ComposePath ".ret)
7161   return ret
7162 endfun
7164 " ---------------------------------------------------------------------
7165 " s:FileReadable: o/s independent filereadable {{{2
7166 fun! s:FileReadable(fname)
7167 "  call Dfunc("s:FileReadable(fname<".a:fname.">)")
7169   if g:netrw_cygwin
7170    let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/',''))
7171   else
7172    let ret= filereadable(a:fname)
7173   endif
7175 "  call Dret("s:FileReadable ".ret)
7176   return ret
7177 endfun
7179 " ---------------------------------------------------------------------
7180 "  s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
7181 "                 Places correct suffix on end of temporary filename,
7182 "                 using the suffix provided with fname
7183 fun! s:GetTempfile(fname)
7184 "  call Dfunc("s:GetTempfile(fname<".a:fname.">)")
7186   if !exists("b:netrw_tmpfile")
7187    " get a brand new temporary filename
7188    let tmpfile= tempname()
7189 "   call Decho("tmpfile<".tmpfile."> : from tempname()")
7191    let tmpfile= substitute(tmpfile,'\','/','ge')
7192 "   call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /")
7194    " sanity check -- does the temporary file's directory exist?
7195    if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
7196 "    call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
7197     call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
7198 "    call Dret("s:GetTempfile getcwd<".getcwd().">")
7199     return ""
7200    endif
7202    " let netrw#NetSource() know about the tmpfile
7203    let s:netrw_tmpfile= tmpfile " used by netrw#NetSource()
7204 "   call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
7206    " o/s dependencies
7207    if g:netrw_cygwin != 0
7208     let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e')
7209    elseif has("win32") || has("win95") || has("win64") || has("win16")
7210     if !exists("+shellslash") || !&ssl
7211      let tmpfile = substitute(tmpfile,'/','\','g')
7212     endif
7213    else
7214     let tmpfile = tmpfile
7215    endif
7216    let b:netrw_tmpfile= tmpfile
7217 "   call Decho("o/s dependent fixed tempname<".tmpfile.">")
7218   else
7219    " re-use temporary filename
7220    let tmpfile= b:netrw_tmpfile
7221 "   call Decho("tmpfile<".tmpfile."> re-using")
7222   endif
7224   " use fname's suffix for the temporary file
7225   if a:fname != ""
7226    if a:fname =~ '\.[^./]\+$'
7227 "    call Decho("using fname<".a:fname.">'s suffix")
7228     if a:fname =~ '.tar.gz' || a:fname =~ '.tar.bz2'
7229      let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
7230     else
7231      let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
7232     endif
7233 "    call Decho("suffix<".suffix.">")
7234     let tmpfile= substitute(tmpfile,'\.tmp$','','e')
7235 "    call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)")
7236     let tmpfile .= suffix
7237 "    call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
7238     let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
7239    endif
7240   endif
7242 "  call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap)
7243 "  call Dret("s:GetTempfile <".tmpfile.">")
7244   return tmpfile
7245 endfun
7247 " ---------------------------------------------------------------------
7248 " s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
7249 "               a correct command for use with a system() call
7250 fun! s:MakeSshCmd(sshcmd)
7251 "  call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
7252   let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
7253   if exists("g:netrw_port") && g:netrw_port != ""
7254    let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
7255   elseif exists("s:port") && s:port != ""
7256    let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
7257   else
7258    let sshcmd= substitute(sshcmd,"USEPORT ",'','')
7259   endif
7260 "  call Dret("s:MakeSshCmd <".sshcmd.">")
7261   return sshcmd
7262 endfun
7264 " ---------------------------------------------------------------------
7265 " s:NetrwBMShow: {{{2
7266 fun! s:NetrwBMShow()
7267 "  call Dfunc("s:NetrwBMShow()")
7268   redir => bmshowraw
7269    menu
7270   redir END
7271   let bmshowlist = split(bmshowraw,'\n')
7272   if bmshowlist != []
7273    let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
7274    if bmshowfuncs != []
7275     let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
7276     if bmshowfunc =~ '^call.*BMShow()'
7277      exe "silent! ".bmshowfunc
7278     endif
7279    endif
7280   endif
7281 "  call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
7282 endfun
7284 " ---------------------------------------------------------------------
7285 " s:NetrwDelete: Deletes a file. {{{2
7286 "           Uses Steve Hall's idea to insure that Windows paths stay
7287 "           acceptable.  No effect on Unix paths.
7288 "  Examples of use:  let result= s:NetrwDelete(path)
7289 fun! s:NetrwDelete(path)
7290 "  call Dfunc("s:NetrwDelete(path<".a:path.">)")
7292   let path = s:WinPath(a:path)
7293   if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7294    if exists("+shellslash")
7295     let sskeep= &shellslash
7296     setlocal noshellslash
7297     let result      = delete(path)
7298     let &shellslash = sskeep
7299    else
7300 "    call Decho("exe let result= ".a:cmd."('".path."')")
7301     let result= delete(path)
7302    endif
7303   else
7304 "   call Decho("let result= delete(".path.")")
7305    let result= delete(path)
7306   endif
7307   if result < 0
7308    call Netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
7309   endif
7311 "  call Dret("s:NetrwDelete ".result)
7312   return result
7313 endfun
7315 " ---------------------------------------------------------------------
7316 " s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
7317 fun! s:NetrwEnew(curdir)
7318 "  call Dfunc("s:NetrwEnew(curdir<".a:curdir.">) buf#".bufnr("%")."<".bufname("%").">")
7320   " grab a function-local-variable copy of buffer variables
7321   if exists("b:netrw_bannercnt")      |let netrw_bannercnt       = b:netrw_bannercnt      |endif
7322   if exists("b:netrw_browser_active") |let netrw_browser_active  = b:netrw_browser_active |endif
7323   if exists("b:netrw_cpf")            |let netrw_cpf             = b:netrw_cpf            |endif
7324   if exists("b:netrw_curdir")         |let netrw_curdir          = b:netrw_curdir         |endif
7325   if exists("b:netrw_explore_bufnr")  |let netrw_explore_bufnr   = b:netrw_explore_bufnr  |endif
7326   if exists("b:netrw_explore_indx")   |let netrw_explore_indx    = b:netrw_explore_indx   |endif
7327   if exists("b:netrw_explore_line")   |let netrw_explore_line    = b:netrw_explore_line   |endif
7328   if exists("b:netrw_explore_list")   |let netrw_explore_list    = b:netrw_explore_list   |endif
7329   if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
7330   if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
7331   if exists("b:netrw_fname")          |let netrw_fname           = b:netrw_fname          |endif
7332   if exists("b:netrw_lastfile")       |let netrw_lastfile        = b:netrw_lastfile       |endif
7333   if exists("b:netrw_liststyle")      |let netrw_liststyle       = b:netrw_liststyle      |endif
7334   if exists("b:netrw_method")         |let netrw_method          = b:netrw_method         |endif
7335   if exists("b:netrw_option")         |let netrw_option          = b:netrw_option         |endif
7336   if exists("b:netrw_prvdir")         |let netrw_prvdir          = b:netrw_prvdir         |endif
7338   call s:NetrwOptionRestore("w:")
7339 "  call Decho("generate a buffer with keepjumps keepalt enew!")
7340   keepjumps keepalt enew!
7341   call s:NetrwOptionSave("w:")
7343   " copy function-local-variables to buffer variable equivalents
7344   if exists("netrw_bannercnt")      |let b:netrw_bannercnt       = netrw_bannercnt      |endif
7345   if exists("netrw_browser_active") |let b:netrw_browser_active  = netrw_browser_active |endif
7346   if exists("netrw_cpf")            |let b:netrw_cpf             = netrw_cpf            |endif
7347   if exists("netrw_curdir")         |let b:netrw_curdir          = netrw_curdir         |endif
7348   if exists("netrw_explore_bufnr")  |let b:netrw_explore_bufnr   = netrw_explore_bufnr  |endif
7349   if exists("netrw_explore_indx")   |let b:netrw_explore_indx    = netrw_explore_indx   |endif
7350   if exists("netrw_explore_line")   |let b:netrw_explore_line    = netrw_explore_line   |endif
7351   if exists("netrw_explore_list")   |let b:netrw_explore_list    = netrw_explore_list   |endif
7352   if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
7353   if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
7354   if exists("netrw_fname")          |let b:netrw_fname           = netrw_fname          |endif
7355   if exists("netrw_lastfile")       |let b:netrw_lastfile        = netrw_lastfile       |endif
7356   if exists("netrw_liststyle")      |let b:netrw_liststyle       = netrw_liststyle      |endif
7357   if exists("netrw_method")         |let b:netrw_method          = netrw_method         |endif
7358   if exists("netrw_option")         |let b:netrw_option          = netrw_option         |endif
7359   if exists("netrw_prvdir")         |let b:netrw_prvdir          = netrw_prvdir         |endif
7361   let b:netrw_curdir= a:curdir
7362   if b:netrw_curdir =~ '/$'
7363    if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
7364     file NetrwTreeListing
7365     nno <silent> <buffer> [     :silent call <SID>TreeListMove('[')<cr>
7366     nno <silent> <buffer> ]     :silent call <SID>TreeListMove(']')<cr>
7367    else
7368     exe "silent! keepalt file ".fnameescape(b:netrw_curdir)
7369    endif
7370   endif
7372 "  call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#").">")
7373 endfun
7375 " ------------------------------------------------------------------------
7376 " s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
7377 " changed sorting, etc.  Also see s:NetrwRestoreWordPosn().
7378 fun! s:NetrwSaveWordPosn()
7379 "  call Dfunc("NetrwSaveWordPosn()")
7380   let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
7381 "  call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
7382 endfun
7384 " ---------------------------------------------------------------------
7385 " s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
7386 "  changed sorting, etc.  Also see s:NetrwSaveWordPosn().
7387 fun! s:NetrwRestoreWordPosn()
7388 "  call Dfunc("NetrwRestoreWordPosn()")
7389   silent! call search(s:netrw_saveword,'w')
7390 "  call Dret("NetrwRestoreWordPosn")
7391 endfun
7393 " ---------------------------------------------------------------------
7394 " s:RestoreBufVars: {{{2
7395 fun! s:RestoreBufVars()
7396 "  call Dfunc("s:RestoreBufVars()")
7398   if exists("s:netrw_curdir")        |let b:netrw_curdir         = s:netrw_curdir        |endif
7399   if exists("s:netrw_lastfile")      |let b:netrw_lastfile       = s:netrw_lastfile      |endif
7400   if exists("s:netrw_method")        |let b:netrw_method         = s:netrw_method        |endif
7401   if exists("s:netrw_fname")         |let b:netrw_fname          = s:netrw_fname         |endif
7402   if exists("s:netrw_machine")       |let b:netrw_machine        = s:netrw_machine       |endif
7403   if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
7405 "  call Dret("s:RestoreBufVars")
7406 endfun
7408 " ---------------------------------------------------------------------
7409 " s:RemotePathAnalysis: {{{2
7410 fun! s:RemotePathAnalysis(dirname)
7411 "  call Dfunc("s:RemotePathAnalysis()")
7413   let dirpat  = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
7414   let s:method  = substitute(a:dirname,dirpat,'\1','')
7415   let s:user    = substitute(a:dirname,dirpat,'\2','')
7416   let s:machine = substitute(a:dirname,dirpat,'\3','')
7417   let s:port    = substitute(a:dirname,dirpat,'\4','')
7418   let s:path    = substitute(a:dirname,dirpat,'\5','')
7419   let s:fname   = substitute(a:dirname,'^.*/\ze.','','')
7421 "  call Decho("set up s:method <".s:method .">")
7422 "  call Decho("set up s:user   <".s:user   .">")
7423 "  call Decho("set up s:machine<".s:machine.">")
7424 "  call Decho("set up s:port   <".s:port.">")
7425 "  call Decho("set up s:path   <".s:path   .">")
7426 "  call Decho("set up s:fname  <".s:fname  .">")
7428 "  call Dret("s:RemotePathAnalysis")
7429 endfun
7431 " ---------------------------------------------------------------------
7432 " s:RemoteSystem: runs a command on a remote host using ssh {{{2
7433 "                 Returns status
7434 " Runs system() on
7435 "    [cd REMOTEDIRPATH;] a:cmd
7436 " Note that it doesn't do shellescape(a:cmd)!
7437 fun! s:RemoteSystem(cmd)
7438 "  call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
7439   if !executable(g:netrw_ssh_cmd)
7440    call netrw#ErrorMsg(s:ERROR,"g:netrw_ssh_cmd<".g:netrw_ssh_cmd."> is not executable!",52)
7441   elseif !exists("b:netrw_curdir")
7442    call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
7443   else
7444    let cmd      = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
7445    let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
7446    if remotedir != ""
7447     let cmd= cmd.' cd '.shellescape(remotedir).";"
7448    else
7449     let cmd= cmd.' '
7450    endif
7451    let cmd= cmd.a:cmd
7452 "   call Decho("call system(".cmd.")")
7453    let ret= system(cmd)
7454   endif
7455 "  call Dret("s:RemoteSystem ".ret)
7456   return ret
7457 endfun
7459 " ---------------------------------------------------------------------
7460 " s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
7461 fun! s:RestoreWinVars()
7462 "  call Dfunc("s:RestoreWinVars()")
7463   if exists("s:bannercnt")      |let w:netrw_bannercnt       = s:bannercnt      |unlet s:bannercnt      |endif
7464   if exists("s:col")            |let w:netrw_col             = s:col            |unlet s:col            |endif
7465   if exists("s:curdir")         |let w:netrw_curdir          = s:curdir         |unlet s:curdir         |endif
7466   if exists("s:explore_bufnr")  |let w:netrw_explore_bufnr   = s:explore_bufnr  |unlet s:explore_bufnr  |endif
7467   if exists("s:explore_indx")   |let w:netrw_explore_indx    = s:explore_indx   |unlet s:explore_indx   |endif
7468   if exists("s:explore_line")   |let w:netrw_explore_line    = s:explore_line   |unlet s:explore_line   |endif
7469   if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
7470   if exists("s:explore_list")   |let w:netrw_explore_list    = s:explore_list   |unlet s:explore_list   |endif
7471   if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
7472   if exists("s:fpl")            |let w:netrw_fpl             = s:fpl            |unlet s:fpl            |endif
7473   if exists("s:hline")          |let w:netrw_hline           = s:hline          |unlet s:hline          |endif
7474   if exists("s:line")           |let w:netrw_line            = s:line           |unlet s:line           |endif
7475   if exists("s:liststyle")      |let w:netrw_liststyle       = s:liststyle      |unlet s:liststyle      |endif
7476   if exists("s:method")         |let w:netrw_method          = s:method         |unlet s:method         |endif
7477   if exists("s:prvdir")         |let w:netrw_prvdir          = s:prvdir         |unlet s:prvdir         |endif
7478   if exists("s:treedict")       |let w:netrw_treedict        = s:treedict       |unlet s:treedict       |endif
7479   if exists("s:treetop")        |let w:netrw_treetop         = s:treetop        |unlet s:treetop        |endif
7480   if exists("s:winnr")          |let w:netrw_winnr           = s:winnr          |unlet s:winnr          |endif
7481 "  call Dret("s:RestoreWinVars")
7482 endfun
7484 " ---------------------------------------------------------------------
7485 " s:Rexplore: implements returning from a buffer to a netrw directory {{{2
7487 "             s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
7488 "             is true) and a command, :Rexplore, which call this function.
7490 "             s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
7491 fun! s:NetrwRexplore(islocal,dirname)
7492 "  call Dfunc("s:NetrwRexplore(islocal=".a:islocal." dirname<".a:dirname.">)")
7493   if a:islocal
7494    call netrw#LocalBrowseCheck(a:dirname)
7495   else
7496    call s:NetrwBrowse(0,a:dirname)
7497   endif
7498   if exists("s:nbcd_curpos_{bufnr('%')}")
7499    call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
7500    unlet s:nbcd_curpos_{bufnr('%')}
7501   endif
7502 "  call Dret("s:NetrwRexplore")
7503 endfun
7505 " ---------------------------------------------------------------------
7506 " s:SaveBufVars: {{{2
7507 fun! s:SaveBufVars()
7508 "  call Dfunc("s:SaveBufVars()")
7510   if exists("b:netrw_curdir")        |let s:netrw_curdir         = b:netrw_curdir        |endif
7511   if exists("b:netrw_lastfile")      |let s:netrw_lastfile       = b:netrw_lastfile      |endif
7512   if exists("b:netrw_method")        |let s:netrw_method         = b:netrw_method        |endif
7513   if exists("b:netrw_fname")         |let s:netrw_fname          = b:netrw_fname         |endif
7514   if exists("b:netrw_machine")       |let s:netrw_machine        = b:netrw_machine       |endif
7515   if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
7517 "  call Dret("s:SaveBufVars")
7518 endfun
7520 " ---------------------------------------------------------------------
7521 " s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
7522 fun! s:SaveWinVars()
7523 "  call Dfunc("s:SaveWinVars()")
7524   if exists("w:netrw_bannercnt")      |let s:bannercnt       = w:netrw_bannercnt      |endif
7525   if exists("w:netrw_col")            |let s:col             = w:netrw_col            |endif
7526   if exists("w:netrw_curdir")         |let s:curdir          = w:netrw_curdir         |endif
7527   if exists("w:netrw_explore_bufnr")  |let s:explore_bufnr   = w:netrw_explore_bufnr  |endif
7528   if exists("w:netrw_explore_indx")   |let s:explore_indx    = w:netrw_explore_indx   |endif
7529   if exists("w:netrw_explore_line")   |let s:explore_line    = w:netrw_explore_line   |endif
7530   if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
7531   if exists("w:netrw_explore_list")   |let s:explore_list    = w:netrw_explore_list   |endif
7532   if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
7533   if exists("w:netrw_fpl")            |let s:fpl             = w:netrw_fpl            |endif
7534   if exists("w:netrw_hline")          |let s:hline           = w:netrw_hline          |endif
7535   if exists("w:netrw_line")           |let s:line            = w:netrw_line           |endif
7536   if exists("w:netrw_liststyle")      |let s:liststyle       = w:netrw_liststyle      |endif
7537   if exists("w:netrw_method")         |let s:method          = w:netrw_method         |endif
7538   if exists("w:netrw_prvdir")         |let s:prvdir          = w:netrw_prvdir         |endif
7539   if exists("w:netrw_treedict")       |let s:treedict        = w:netrw_treedict       |endif
7540   if exists("w:netrw_treetop")        |let s:treetop         = w:netrw_treetop        |endif
7541   if exists("w:netrw_winnr")          |let s:winnr           = w:netrw_winnr          |endif
7542 "  call Dret("s:SaveWinVars")
7543 endfun
7545 " ---------------------------------------------------------------------
7546 " s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
7547 "   To allow separate windows to have their own activities, such as
7548 "   Explore **/pattern, several variables have been made window-oriented.
7549 "   However, when the user splits a browser window (ex: ctrl-w s), these
7550 "   variables are not inherited by the new window.  SetBufWinVars() and
7551 "   UseBufWinVars() get around that.
7552 fun! s:SetBufWinVars()
7553 "  call Dfunc("s:SetBufWinVars()")
7554   if exists("w:netrw_liststyle")      |let b:netrw_liststyle      = w:netrw_liststyle      |endif
7555   if exists("w:netrw_bannercnt")      |let b:netrw_bannercnt      = w:netrw_bannercnt      |endif
7556   if exists("w:netrw_method")         |let b:netrw_method         = w:netrw_method         |endif
7557   if exists("w:netrw_prvdir")         |let b:netrw_prvdir         = w:netrw_prvdir         |endif
7558   if exists("w:netrw_explore_indx")   |let b:netrw_explore_indx   = w:netrw_explore_indx   |endif
7559   if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
7560   if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
7561   if exists("w:netrw_explore_bufnr")  |let b:netrw_explore_bufnr  = w:netrw_explore_bufnr  |endif
7562   if exists("w:netrw_explore_line")   |let b:netrw_explore_line   = w:netrw_explore_line   |endif
7563   if exists("w:netrw_explore_list")   |let b:netrw_explore_list   = w:netrw_explore_list   |endif
7564 "  call Dret("s:SetBufWinVars")
7565 endfun
7567 " ---------------------------------------------------------------------
7568 " s:SetRexDir: set directory for :Rexplore {{{2
7569 fun! s:SetRexDir(islocal,dirname)
7570 "  call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
7571   " set up Rex and leftmouse-double-click
7572   if a:islocal
7573    exe 'com! Rexplore call s:NetrwRexplore(1,"'.a:dirname.'")'
7574    if g:netrw_retmap
7575     silent! unmap <2-leftmouse>
7576     if !hasmapto("<Plug>NetrwReturn")
7577      nmap <unique> <silent> <2-leftmouse>       <Plug>NetrwReturn
7578     endif
7579     exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(1,"'.a:dirname.'")<cr>'
7580    endif
7581   else
7582    exe 'com! Rexplore call s:NetrwRexplore(0,"'.a:dirname.'")'
7583    if g:netrw_retmap
7584     silent! unmap <2-leftmouse>
7585     if !hasmapto("<Plug>NetrwReturn")
7586      nmap <unique> <silent> <2-leftmouse>       <Plug>NetrwReturn
7587     endif
7588     exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(0,"'.a:dirname.'")<cr>'
7589    endif
7590   endif
7591 "  call Dret("s:SetRexDir")
7592 endfun
7594 " ---------------------------------------------------------------------
7595 " s:Strlen: this function returns the length of a string, even if its {{{2
7596 "           using two-byte etc characters.
7597 "           Currently, its only used if g:Align_xstrlen is set to a
7598 "           nonzero value.  Solution from Nicolai Weibull, vim docs
7599 "           (:help strlen()), Tony Mechelynck, and my own invention.
7600 fun! s:Strlen(x)
7601 "  call Dfunc("s:Strlen(x<".a:x.">")
7602   if g:netrw_xstrlen == 1
7603    " number of codepoints (Latin a + combining circumflex is two codepoints)
7604    " (comment from TM, solution from NW)
7605    let ret= strlen(substitute(a:x,'.','c','g'))
7607   elseif g:netrw_xstrlen == 2
7608    " number of spacing codepoints (Latin a + combining circumflex is one spacing 
7609    " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
7610    " (comment from TM, solution from TM)
7611    let ret=strlen(substitute(a:x, '.\Z', 'x', 'g')) 
7613   elseif g:netrw_xstrlen == 3
7614    " virtual length (counting, for instance, tabs as anything between 1 and 
7615    " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately 
7616    " preceded by lam, one otherwise, etc.)
7617    " (comment from TM, solution from me)
7618    let modkeep= &mod
7619    exe "norm! o\<esc>"
7620    call setline(line("."),a:x)
7621    let ret= virtcol("$") - 1
7622    d
7623    let &mod= modkeep
7625   else
7626    " at least give a decent default
7627    ret= strlen(a:x)
7628   endif
7629 "  call Dret("s:Strlen ".ret)
7630   return ret
7631 endfun
7633 " ---------------------------------------------------------------------
7634 " s:TreeListMove: {{{2
7635 fun! s:TreeListMove(dir)
7636 "  call Dfunc("s:TreeListMove(dir<".a:dir.">)")
7637   let curline  = getline('.')
7638   let prvline  = (line(".") > 1)?         getline(line(".")-1) : ''
7639   let nxtline  = (line(".") < line("$"))? getline(line(".")+1) : ''
7640   let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')
7641   let indentm1 = substitute(curindent,'^| ','','')
7642 "  call Decho("prvline  <".prvline."> #".line(".")-1)
7643 "  call Decho("curline  <".curline."> #".line("."))
7644 "  call Decho("nxtline  <".nxtline."> #".line(".")+1)
7645 "  call Decho("curindent<".curindent.">")
7646 "  call Decho("indentm1 <".indentm1.">")
7648   if curline !~ '/$'
7649 "   call Decho('regfile')
7650    if     a:dir == '[' && prvline != ''
7651     norm! 0
7652     let nl = search('^'.indentm1.'[^|]','bWe')    " search backwards from regular file
7653 "    call Decho("regfile srch back: ".nl)
7654    elseif a:dir == ']' && nxtline != ''
7655     norm! $
7656     let nl = search('^'.indentm1.'[^|]','We')     " search forwards from regular file
7657 "    call Decho("regfile srch fwd: ".nl)
7658    endif
7660   elseif a:dir == '[' && prvline != ''
7661    norm! 0
7662    let curline= line(".")
7663    let nl     = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation
7664 "   call Decho("dir srch back ind: ".nl)
7665    if nl != 0
7666     if line(".") == curline-1
7667      let nl= search('^'.indentm1.'[^|]','bWe')     " search backwards from directory, indentation - 1
7668 "     call Decho("dir srch back ind-1: ".nl)
7669     endif
7670    endif
7672   elseif a:dir == ']' && nxtline != ''
7673    norm! $
7674    let curline = line(".")
7675    let nl      = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation
7676 "   call Decho("dir srch fwd ind: ".nl)
7677    if nl != 0
7678     if line(".") == curline+1
7679      let nl= search('^'.indentm1.'[^|]','We')         " search forwards from directory, indentation - 1
7680 "     call Decho("dir srch fwd ind-1: ".nl)
7681     endif
7682    endif
7684   endif
7686 "  call Dret("s:TreeListMove")
7687 endfun
7689 " ---------------------------------------------------------------------
7690 " s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
7691 "                      The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
7692 "                      can't be called except via emenu.  But due to locale, that menu line may not be called
7693 "                      Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
7694 fun! s:UpdateBuffersMenu()
7695 "  call Dfunc("s:UpdateBuffersMenu()")
7696   if has("gui") && has("menu") && has("gui_running") && &go =~ 'm'
7697    try
7698     silent emenu Buffers.Refresh\ menu
7699    catch /^Vim\%((\a\+)\)\=:E/
7700     let v:errmsg= ""
7701     silent call s:NetrwBMShow()
7702    endtry
7703   endif
7704 "  call Dret("s:UpdateBuffersMenu")
7705 endfun
7707 " ---------------------------------------------------------------------
7708 " s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
7709 "              Matching function to BufferWinVars()
7710 fun! s:UseBufWinVars()
7711 "  call Dfunc("s:UseBufWinVars()")
7712   if exists("b:netrw_liststyle")       && !exists("w:netrw_liststyle")      |let w:netrw_liststyle       = b:netrw_liststyle      |endif
7713   if exists("b:netrw_bannercnt")       && !exists("w:netrw_bannercnt")      |let w:netrw_bannercnt       = b:netrw_bannercnt      |endif
7714   if exists("b:netrw_method")          && !exists("w:netrw_method")         |let w:netrw_method          = b:netrw_method         |endif
7715   if exists("b:netrw_prvdir")          && !exists("w:netrw_prvdir")         |let w:netrw_prvdir          = b:netrw_prvdir         |endif
7716   if exists("b:netrw_explore_indx")    && !exists("w:netrw_explore_indx")   |let w:netrw_explore_indx    = b:netrw_explore_indx   |endif
7717   if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
7718   if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
7719   if exists("b:netrw_explore_bufnr")   && !exists("w:netrw_explore_bufnr")  |let w:netrw_explore_bufnr   = b:netrw_explore_bufnr  |endif
7720   if exists("b:netrw_explore_line")    && !exists("w:netrw_explore_line")   |let w:netrw_explore_line    = b:netrw_explore_line   |endif
7721   if exists("b:netrw_explore_list")    && !exists("w:netrw_explore_list")   |let w:netrw_explore_list    = b:netrw_explore_list   |endif
7722 "  call Dret("s:UseBufWinVars")
7723 endfun
7725 " ---------------------------------------------------------------------
7726 " s:WinPath: {{{2
7727 fun! s:WinPath(path)
7728 "  call Dfunc("s:WinPath(path<".a:path.">)")
7729   if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
7730    " remove trailing slash (Win95)
7731    let path = substitute(a:path, '\(\\\|/\)$', '', 'g')
7732    " remove escaped spaces
7733    let path = substitute(path, '\ ', ' ', 'g')
7734    " convert slashes to backslashes
7735    let path = substitute(path, '/', '\', 'g')
7736   else
7737    let path= a:path
7738   endif
7739 "  call Dret("s:WinPath <".path.">")
7740   return path
7741 endfun
7743 " ---------------------------------------------------------------------
7744 " Settings Restoration: {{{2
7745 let &cpo= s:keepcpo
7746 unlet s:keepcpo
7748 " ------------------------------------------------------------------------
7749 " Modelines: {{{1
7750 " vim:ts=8 fdm=marker