Install vim74
[msysgit.git] / share / vim / vim74 / autoload / netrw.vim
blobb077bb73bb73f0cfb142f057bd2768b4746019a7
1 " netrw.vim: Handles file transfer and remote directory listing across
2 "            AUTOLOAD SECTION
3 " Date:         May 18, 2013
4 " Version:      149
5 " Maintainer:   Charles E Campbell <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
6 " GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
7 " Copyright:    Copyright (C) 1999-2012 Charles E. Campbell {{{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 let g:loaded_netrw = "v149"
26 if v:version < 703 || (v:version == 703 && !has("patch465"))
27  echohl WarningMsg
28  echo "***warning*** this version of netrw needs vim 7.3.465 or later"
29  echohl Normal
30  finish
31 endif
32 if !exists("s:NOTE")
33  let s:NOTE    = 0
34  let s:WARNING = 1
35  let s:ERROR   = 2
36 endif
38 let s:keepcpo= &cpo
39 set cpo&vim
40 "DechoTabOn
41 "call Decho("doing autoload/netrw.vim version ".g:loaded_netrw)
43 " ======================
44 "  Netrw Variables: {{{1
45 " ======================
47 " ---------------------------------------------------------------------
48 " netrw#ErrorMsg: {{{2
49 "   0=note     = s:NOTE
50 "   1=warning  = s:WARNING
51 "   2=error    = s:ERROR
52 "  May 01, 2013 : max errnum currently is 93
53 fun! netrw#ErrorMsg(level,msg,errnum)
54 "  call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow)
56   if a:level < g:netrw_errorlvl
57 "   call Dret("netrw#ErrorMsg : suppressing level=".a:level." since g:netrw_errorlvl=".g:netrw_errorlvl)
58    return
59   endif
61   if a:level == 1
62    let level= "**warning** (netrw) "
63   elseif a:level == 2
64    let level= "**error** (netrw) "
65   else
66    let level= "**note** (netrw) "
67   endif
68 "  call Decho("level=".level)
70   if g:netrw_use_errorwindow
71    " (default) netrw creates a one-line window to show error/warning
72    " messages (reliably displayed)
74    " record current window number for NetrwRestorePosn()'s benefit
75    let s:winBeforeErr= winnr()
76 "   call Decho("s:winBeforeErr=".s:winBeforeErr)
78    " getting messages out reliably is just plain difficult!
79    " This attempt splits the current window, creating a one line window.
80    if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
81 "    call Decho("write to NetrwMessage buffer")
82     exe bufwinnr("NetrwMessage")."wincmd w"
83 "    call Decho("setl ma noro")
84     setl ma noro
85     keepj call setline(line("$")+1,level.a:msg)
86     keepj $
87    else
88 "    call Decho("create a NetrwMessage buffer window")
89     bo 1split
90     sil! call s:NetrwEnew()
91     sil! keepj call s:NetrwSafeOptions()
92     setl bt=nofile
93     keepj file NetrwMessage
94 "    call Decho("setl ma noro")
95     setl ma noro
96     call setline(line("$"),level.a:msg)
97    endif
98 "   call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr())
99    if &fo !~ '[ta]'
100     syn clear
101     syn match netrwMesgNote     "^\*\*note\*\*"
102     syn match netrwMesgWarning  "^\*\*warning\*\*"
103     syn match netrwMesgError    "^\*\*error\*\*"
104     hi link netrwMesgWarning WarningMsg
105     hi link netrwMesgError   Error
106    endif
107 "   call Decho("(ErrorMsg) setl noma ro bh=wipe")
108    setl noma ro bh=wipe
110   else
111    " (optional) netrw will show messages using echomsg.  Even if the
112    " message doesn't appear, at least it'll be recallable via :messages
113 "   redraw!
114    if a:level == s:WARNING
115     echohl WarningMsg
116    elseif a:level == s:ERROR
117     echohl Error
118    endif
119    echomsg level.a:msg
120 "   call Decho("echomsg ***netrw*** ".a:msg)
121    echohl None
122   endif
124 "  call Dret("netrw#ErrorMsg")
125 endfun
127 " ---------------------------------------------------------------------
128 " NetrwInit: initializes variables if they haven't been defined {{{2
129 "            Loosely,  varname = value.
130 fun s:NetrwInit(varname,value)
131 " call Decho("varname<".a:varname."> value=".a:value)
132   if !exists(a:varname)
133    if type(a:value) == 0
134     exe "let ".a:varname."=".a:value
135    elseif type(a:value) == 1 && a:value =~ '^[{[]'
136     exe "let ".a:varname."=".a:value
137    elseif type(a:value) == 1
138     exe "let ".a:varname."="."'".a:value."'"
139    else
140     exe "let ".a:varname."=".a:value
141    endif
142   endif
143 endfun
145 " ---------------------------------------------------------------------
146 "  Netrw Constants: {{{2
147 call s:NetrwInit("g:netrw_dirhist_cnt",0)
148 if !exists("s:LONGLIST")
149  call s:NetrwInit("s:THINLIST",0)
150  call s:NetrwInit("s:LONGLIST",1)
151  call s:NetrwInit("s:WIDELIST",2)
152  call s:NetrwInit("s:TREELIST",3)
153  call s:NetrwInit("s:MAXLIST" ,4)
154 endif
156 " ---------------------------------------------------------------------
157 " Default values for netrw's global protocol variables {{{2
158 call s:NetrwInit("g:netrw_use_errorwindow",1)
160 if !exists("g:netrw_dav_cmd")
161  if executable("cadaver")
162   let g:netrw_dav_cmd   = "cadaver"
163  elseif executable("curl")
164   let g:netrw_dav_cmd   = "curl"
165  else
166   let g:netrw_dav_cmd   = ""
167  endif
168 endif
169 if !exists("g:netrw_fetch_cmd")
170  if executable("fetch")
171   let g:netrw_fetch_cmd = "fetch -o"
172  else
173   let g:netrw_fetch_cmd = ""
174  endif
175 endif
176 if !exists("g:netrw_ftp_cmd")
177   let g:netrw_ftp_cmd   = "ftp"
178 endif
179 let s:netrw_ftp_cmd= g:netrw_ftp_cmd
180 if !exists("g:netrw_ftp_options")
181  let g:netrw_ftp_options= "-i -n"
182 endif
183 if !exists("g:netrw_http_cmd")
184  if executable("elinks")
185   let g:netrw_http_cmd = "elinks"
186   call s:NetrwInit("g:netrw_http_xcmd","-source >")
187  elseif executable("links")
188   let g:netrw_http_cmd = "links"
189   call s:NetrwInit("g:netrw_http_xcmd","-source >")
190  elseif executable("curl")
191   let g:netrw_http_cmd  = "curl"
192   call s:NetrwInit("g:netrw_http_xcmd","-o")
193  elseif executable("wget")
194   let g:netrw_http_cmd  = "wget"
195   call s:NetrwInit("g:netrw_http_xcmd","-q -O")
196  elseif executable("fetch")
197   let g:netrw_http_cmd  = "fetch"
198   call s:NetrwInit("g:netrw_http_xcmd","-o")
199  else
200   let g:netrw_http_cmd  = ""
201  endif
202 endif
203 call s:NetrwInit("g:netrw_rcp_cmd"  , "rcp")
204 call s:NetrwInit("g:netrw_rsync_cmd", "rsync")
205 if !exists("g:netrw_scp_cmd")
206  if executable("scp")
207   call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
208  elseif executable("pscp")
209   if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable('c:\private.ppk')
210    call s:NetrwInit("g:netrw_scp_cmd", 'pscp -i c:\private.ppk')
211   else
212    call s:NetrwInit("g:netrw_scp_cmd", 'pscp -q')
213   endif
214  else
215   call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
216  endif
217 endif
219 call s:NetrwInit("g:netrw_sftp_cmd" , "sftp")
220 call s:NetrwInit("g:netrw_ssh_cmd"  , "ssh")
222 if (has("win32") || has("win95") || has("win64") || has("win16"))
223   \ && exists("g:netrw_use_nt_rcp")
224   \ && g:netrw_use_nt_rcp
225   \ && executable( $SystemRoot .'/system32/rcp.exe')
226  let s:netrw_has_nt_rcp = 1
227  let s:netrw_rcpmode    = '-b'
228 else
229  let s:netrw_has_nt_rcp = 0
230  let s:netrw_rcpmode    = ''
231 endif
233 " ---------------------------------------------------------------------
234 " Default values for netrw's global variables {{{2
235 " Cygwin Detection ------- {{{3
236 if !exists("g:netrw_cygwin")
237  if has("win32") || has("win95") || has("win64") || has("win16")
238   if  has("win32unix") && &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
239    let g:netrw_cygwin= 1
240   else
241    let g:netrw_cygwin= 0
242   endif
243  else
244   let g:netrw_cygwin= 0
245  endif
246 endif
247 " Default values - a-c ---------- {{{3
248 call s:NetrwInit("g:netrw_alto"        , &sb)
249 call s:NetrwInit("g:netrw_altv"        , &spr)
250 call s:NetrwInit("g:netrw_banner"      , 1)
251 call s:NetrwInit("g:netrw_browse_split", 0)
252 call s:NetrwInit("g:netrw_bufsettings" , "noma nomod nonu nobl nowrap ro")
253 call s:NetrwInit("g:netrw_chgwin"      , -1)
254 call s:NetrwInit("g:netrw_compress"    , "gzip")
255 call s:NetrwInit("g:netrw_ctags"       , "ctags")
256 if exists("g:netrw_cursorline") && !exists("g:netrw_cursor")
257  call netrw#ErrorMsg(s:NOTE,'g:netrw_cursorline is deprecated; use g:netrw_cursor instead',77)
258  let g:netrw_cursor= g:netrw_cursorline
259 endif
260 call s:NetrwInit("g:netrw_cursor"      , 2)
261 let s:netrw_usercul = &cursorline
262 let s:netrw_usercuc = &cursorcolumn
263 " Default values - d-g ---------- {{{3
264 call s:NetrwInit("s:didstarstar",0)
265 call s:NetrwInit("g:netrw_dirhist_cnt"      , 0)
266 call s:NetrwInit("g:netrw_decompress"       , '{ ".gz" : "gunzip", ".bz2" : "bunzip2", ".zip" : "unzip", ".tar" : "tar -xf", ".xz" : "unxz" }')
267 call s:NetrwInit("g:netrw_dirhistmax"       , 10)
268 call s:NetrwInit("g:netrw_errorlvl"  , s:NOTE)
269 call s:NetrwInit("g:netrw_fastbrowse"       , 1)
270 call s:NetrwInit("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$')
271 if !exists("g:netrw_ftp_list_cmd")
272  if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
273   let g:netrw_ftp_list_cmd     = "ls -lF"
274   let g:netrw_ftp_timelist_cmd = "ls -tlF"
275   let g:netrw_ftp_sizelist_cmd = "ls -slF"
276  else
277   let g:netrw_ftp_list_cmd     = "dir"
278   let g:netrw_ftp_timelist_cmd = "dir"
279   let g:netrw_ftp_sizelist_cmd = "dir"
280  endif
281 endif
282 call s:NetrwInit("g:netrw_ftpmode",'binary')
283 " Default values - h-lh ---------- {{{3
284 call s:NetrwInit("g:netrw_hide",1)
285 if !exists("g:netrw_ignorenetrc")
286  if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
287   let g:netrw_ignorenetrc= 1
288  else
289   let g:netrw_ignorenetrc= 0
290  endif
291 endif
292 call s:NetrwInit("g:netrw_keepdir",1)
293 if !exists("g:netrw_list_cmd")
295  if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
296   if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk")
297    " provide a pscp-based listing command
298    let g:netrw_scp_cmd ="pscp -i C:\\private.ppk"
299   endif
300   let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:"
302  elseif executable(g:netrw_ssh_cmd)
303   " provide a scp-based default listing command
304   let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa"
306  else
307 "  call Decho(g:netrw_ssh_cmd." is not executable")
308   let g:netrw_list_cmd= ""
309  endif
311 endif
312 call s:NetrwInit("g:netrw_list_hide","")
313 " Default values - lh-lz ---------- {{{3
314 if exists("g:netrw_local_copycmd")
315  let g:netrw_localcopycmd= g:netrw_local_copycmd
316  call netrw#ErrorMsg(s:NOTE,"g:netrw_local_copycmd is deprecated in favor of g:netrw_localcopycmd",84)
317 endif
318 if !exists("g:netrw_localcmdshell")
319  let g:netrw_localcmdshell= ""
320 endif
321 if !exists("g:netrw_localcopycmd")
322  if has("win32") || has("win95") || has("win64") || has("win16")
323   if g:netrw_cygwin
324    let g:netrw_localcopycmd= "cp"
325   else
326    let g:netrw_localcopycmd= "cmd /c copy"
327   endif
328  elseif has("unix") || has("macunix")
329   let g:netrw_localcopycmd= "cp"
330  else
331   let g:netrw_localcopycmd= ""
332  endif
333 endif
334 if exists("g:netrw_local_mkdir")
335  let g:netrw_localmkdir= g:netrw_local_mkdir
336  call netrw#ErrorMsg(s:NOTE,"g:netrw_local_mkdir is deprecated in favor of g:netrw_localmkdir",87)
337 endif
338 call s:NetrwInit("g:netrw_localmkdir","mkdir")
339 call s:NetrwInit("g:netrw_remote_mkdir","mkdir")
340 if exists("g:netrw_local_movecmd")
341  let g:netrw_localmovecmd= g:netrw_local_movecmd
342  call netrw#ErrorMsg(s:NOTE,"g:netrw_local_movecmd is deprecated in favor of g:netrw_localmovecmd",88)
343 endif
344 if !exists("g:netrw_localmovecmd")
345  if has("win32") || has("win95") || has("win64") || has("win16")
346   if g:netrw_cygwin
347    let g:netrw_localmovecmd= "mv"
348   else
349    let g:netrw_localmovecmd= "cmd /c move"
350   endif
351  elseif has("unix") || has("macunix")
352   let g:netrw_localmovecmd= "mv"
353  else
354   let g:netrw_localmovecmd= ""
355  endif
356 endif
357 call s:NetrwInit("g:netrw_localrmdir", "rmdir")
358 if exists("g:netrw_local_rmdir")
359  let g:netrw_localrmdir= g:netrw_local_rmdir
360  call netrw#ErrorMsg(s:NOTE,"g:netrw_local_rmdir is deprecated in favor of g:netrw_localrmdir",86)
361 endif
362 call s:NetrwInit("g:netrw_liststyle"  , s:THINLIST)
363 " sanity checks
364 if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
365  let g:netrw_liststyle= s:THINLIST
366 endif
367 if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
368  let g:netrw_list_cmd= g:netrw_list_cmd." -l"
369 endif
370 " Default values - m-r ---------- {{{3
371 call s:NetrwInit("g:netrw_markfileesc"   , '*./[\~')
372 call s:NetrwInit("g:netrw_maxfilenamelen", 32)
373 call s:NetrwInit("g:netrw_menu"          , 1)
374 call s:NetrwInit("g:netrw_mkdir_cmd"     , g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir")
375 call s:NetrwInit("g:netrw_mousemaps"     , (exists("+mouse") && &mouse =~ '[anh]'))
376 call s:NetrwInit("g:netrw_retmap"        , 0)
377 if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
378  call s:NetrwInit("g:netrw_chgperm"       , "chmod PERM FILENAME")
379 elseif has("win32") || has("win95") || has("win64") || has("win16")
380  call s:NetrwInit("g:netrw_chgperm"       , "cacls FILENAME /e /p PERM")
381 else
382  call s:NetrwInit("g:netrw_chgperm"       , "chmod PERM FILENAME")
383 endif
384 call s:NetrwInit("g:netrw_preview"       , 0)
385 call s:NetrwInit("g:netrw_scpport"       , "-P")
386 call s:NetrwInit("g:netrw_sshport"       , "-p")
387 call s:NetrwInit("g:netrw_rename_cmd"    , g:netrw_ssh_cmd." USEPORT HOSTNAME mv")
388 call s:NetrwInit("g:netrw_rm_cmd"        , g:netrw_ssh_cmd." USEPORT HOSTNAME rm")
389 call s:NetrwInit("g:netrw_rmdir_cmd"     , g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir")
390 call s:NetrwInit("g:netrw_rmf_cmd"       , g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f")
391 " Default values - s ---------- {{{3
392 " g:netrw_sepchr: picking a character that doesn't appear in filenames that can be used to separate priority from filename
393 call s:NetrwInit("g:netrw_sepchr"        , (&enc == "euc-jp")? "\<Char-0x01>" : "\<Char-0xff>")
394 call s:NetrwInit("s:netrw_silentxfer"    , (exists("g:netrw_silent") && g:netrw_silent != 0)? "sil keepj " : "keepj ")
395 call s:NetrwInit("g:netrw_sort_by"       , "name") " alternatives: date                                      , size
396 call s:NetrwInit("g:netrw_sort_options"  , "")
397 call s:NetrwInit("g:netrw_sort_direction", "normal") " alternative: reverse  (z y x ...)
398 if !exists("g:netrw_sort_sequence")
399  if has("unix")
400   let g:netrw_sort_sequence= '[\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
401  else
402   let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
403  endif
404 endif
405 call s:NetrwInit("g:netrw_special_syntax"   , 0)
406 call s:NetrwInit("g:netrw_ssh_browse_reject", '^total\s\+\d\+$')
407 call s:NetrwInit("g:netrw_use_noswf"        , 0)
408 " Default values - t-w ---------- {{{3
409 call s:NetrwInit("g:netrw_timefmt","%c")
410 if !exists("g:netrw_xstrlen")
411  if exists("g:Align_xstrlen")
412   let g:netrw_xstrlen= g:Align_xstrlen
413  elseif exists("g:drawit_xstrlen")
414   let g:netrw_xstrlen= g:drawit_xstrlen
415  elseif &enc == "latin1" || !has("multi_byte")
416   let g:netrw_xstrlen= 0
417  else
418   let g:netrw_xstrlen= 1
419  endif
420 endif
421 call s:NetrwInit("g:NetrwTopLvlMenu","Netrw.")
422 call s:NetrwInit("g:netrw_win95ftp",1)
423 call s:NetrwInit("g:netrw_winsize",50)
424 if g:netrw_winsize ==  0|let g:netrw_winsize=  -1|endif
425 if g:netrw_winsize > 100|let g:netrw_winsize= 100|endif
426 " ---------------------------------------------------------------------
427 " Default values for netrw's script variables: {{{2
428 call s:NetrwInit("g:netrw_fname_escape",' ?&;%')
429 if has("win32") || has("win95") || has("win64") || has("win16")
430  call s:NetrwInit("g:netrw_glob_escape",'*?`{[]$')
431 else
432  call s:NetrwInit("g:netrw_glob_escape",'*[]?`{~$\')
433 endif
434 call s:NetrwInit("g:netrw_menu_escape",'.&? \')
435 call s:NetrwInit("g:netrw_tmpfile_escape",' &;')
436 call s:NetrwInit("s:netrw_map_escape","<|\n\r\\\<C-V>\"")
438 " BufEnter event ignored by decho when following variable is true
439 "  Has a side effect that doau BufReadPost doesn't work, so
440 "  files read by network transfer aren't appropriately highlighted.
441 "let g:decho_bufenter = 1       "Decho
443 " ======================
444 "  Netrw Initialization: {{{1
445 " ======================
446 if v:version >= 700 && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on")
447  let s:initbeval = &beval
448 " let s:initbexpr = &l:bexpr
449  let &l:bexpr    = "netrw#NetrwBalloonHelp()"
450  set beval
451  au BufWinEnter,WinEnter *      if &ft == "netrw"|set beval|else|let &beval= s:initbeval|endif
452 endif
453 au WinEnter *   if &ft == "netrw"|call s:NetrwInsureWinVars()|endif
455 " ==============================
456 "  Netrw Utility Functions: {{{1
457 " ==============================
459 " ---------------------------------------------------------------------
460 " netrw#NetrwBalloonHelp: {{{2
461 if v:version >= 700 && has("balloon_eval") && &beval == 1 && has("syntax") && exists("g:syntax_on")
462   fun! netrw#NetrwBalloonHelp()
463     if !exists("w:netrw_bannercnt") || v:beval_lnum >= w:netrw_bannercnt || (exists("g:netrw_nobeval") && g:netrw_nobeval)
464      let mesg= ""
465     elseif     v:beval_text == "Netrw" || v:beval_text == "Directory" || v:beval_text == "Listing"
466      let mesg = "i: thin-long-wide-tree  gh: quick hide/unhide of dot-files   qf: quick file info  %:open new file"
467     elseif     getline(v:beval_lnum) =~ '^"\s*/'
468      let mesg = "<cr>: edit/enter   o: edit/enter in horiz window   t: edit/enter in new tab   v:edit/enter in vert window"
469     elseif     v:beval_text == "Sorted" || v:beval_text == "by"
470      let mesg = 's: sort by name, time, or file size   r: reverse sorting order   mt: mark target'
471     elseif v:beval_text == "Sort"   || v:beval_text == "sequence"
472      let mesg = "S: edit sorting sequence"
473     elseif v:beval_text == "Hiding" || v:beval_text == "Showing"
474      let mesg = "a: hiding-showing-all   ctrl-h: editing hiding list   mh: hide/show by suffix"
475     elseif v:beval_text == "Quick" || v:beval_text == "Help"
476      let mesg = "Help: press <F1>"
477     elseif v:beval_text == "Copy/Move" || v:beval_text == "Tgt"
478      let mesg = "mt: mark target   mc: copy marked file to target   mm: move marked file to target"
479     else
480      let mesg= ""
481     endif
482     return mesg
483   endfun
484 endif
486 " ------------------------------------------------------------------------
487 " s:NetrwOptionSave: save options prior to setting to "netrw-buffer-standard" form {{{2
488 "  06/08/07 : removed call to NetrwSafeOptions(), either placed
489 "             immediately after NetrwOptionSave() calls in NetRead
490 "             and NetWrite, or after the s:NetrwEnew() call in
491 "             NetrwBrowse.
492 "             vt: normally its "w:" or "s:" (a variable type)
493 fun! s:NetrwOptionSave(vt)
494 "  call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$")." mod=".&mod." ma=".&ma)
495 "  call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"))
497   if !exists("{a:vt}netrw_optionsave")
498    let {a:vt}netrw_optionsave= 1
499   else
500 "   call Dret("s:NetrwOptionSave : options already saved")
501    return
502   endif
503 "  call Decho("fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." diff=".&l:diff)
505   " Save current settings and current directory
506 "  call Decho("saving current settings and current directory")
507   let s:yykeep          = @@
508   if exists("&l:acd")|let {a:vt}netrw_acdkeep  = &l:acd|endif
509   let {a:vt}netrw_aikeep    = &l:ai
510   let {a:vt}netrw_awkeep    = &l:aw
511   let {a:vt}netrw_bhkeep    = &l:bh
512   let {a:vt}netrw_blkeep    = &l:bl
513   let {a:vt}netrw_btkeep    = &l:bt
514   let {a:vt}netrw_bombkeep  = &l:bomb
515   let {a:vt}netrw_cedit     = &cedit
516   let {a:vt}netrw_cikeep    = &l:ci
517   let {a:vt}netrw_cinkeep   = &l:cin
518   let {a:vt}netrw_cinokeep  = &l:cino
519   let {a:vt}netrw_comkeep   = &l:com
520   let {a:vt}netrw_cpokeep   = &l:cpo
521   let {a:vt}netrw_diffkeep  = &l:diff
522   let {a:vt}netrw_fenkeep   = &l:fen
523   let {a:vt}netrw_ffkeep    = &l:ff
524   let {a:vt}netrw_fokeep    = &l:fo           " formatoptions
525   let {a:vt}netrw_gdkeep    = &l:gd           " gdefault
526   let {a:vt}netrw_hidkeep   = &l:hidden
527   let {a:vt}netrw_imkeep    = &l:im
528   let {a:vt}netrw_iskkeep   = &l:isk
529   let {a:vt}netrw_lskeep    = &l:ls
530   let {a:vt}netrw_makeep    = &l:ma
531   let {a:vt}netrw_magickeep = &l:magic
532   let {a:vt}netrw_modkeep   = &l:mod
533   let {a:vt}netrw_nukeep    = &l:nu
534   let {a:vt}netrw_repkeep   = &l:report
535   let {a:vt}netrw_rokeep    = &l:ro
536   let {a:vt}netrw_selkeep   = &l:sel
537   let {a:vt}netrw_spellkeep = &l:spell
538   let {a:vt}netrw_tskeep    = &l:ts
539   let {a:vt}netrw_twkeep    = &l:tw           " textwidth
540   let {a:vt}netrw_wigkeep   = &l:wig          " wildignore
541   let {a:vt}netrw_wrapkeep  = &l:wrap
542   let {a:vt}netrw_writekeep = &l:write
543   if g:netrw_use_noswf && has("win32") && !has("win95")
544    let {a:vt}netrw_swfkeep   = &l:swf
545   endif
547   " save a few selected netrw-related variables
548 "  call Decho("saving a few selected netrw-related variables")
549   if g:netrw_keepdir
550    let {a:vt}netrw_dirkeep  = getcwd()
551   endif
552   if has("win32") && !has("win95")
553    let {a:vt}netrw_swfkeep  = &l:swf          " swapfile
554   endif
555   if &go =~# 'a' | sil! let {a:vt}netrw_regstar = @* | endif
556   sil! let {a:vt}netrw_regslash= @/
558 "  call Dret("s:NetrwOptionSave : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
559 endfun
561 " ------------------------------------------------------------------------
562 " s:NetrwOptionRestore: restore options {{{2
563 fun! s:NetrwOptionRestore(vt)
564 "  call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
565   if !exists("{a:vt}netrw_optionsave")
566    if exists("s:nbcd_curpos_{bufnr('%')}")
567 "    call Decho("(NetrwOptionRestore) restoring previous position  (s:nbcd_curpos_".bufnr('%')." exists)")
568     keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
569 "    call Decho("(NetrwOptionRestore) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
570 "    call Decho("(NetrwOptionRestore) unlet s:nbcd_curpos_".bufnr('%'))
571     unlet s:nbcd_curpos_{bufnr('%')}
572    else
573 "    call Decho("(NetrwOptionRestore) no previous position")
574    endif
575 "   call Decho("(NetrwOptionRestore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
576 "   call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
577    return
578   endif
579   unlet {a:vt}netrw_optionsave
581   if exists("+acd")
582    if exists("{a:vt}netrw_acdkeep")
583 "    call Decho("(NetrwOptionRestore) g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
584     let curdir = getcwd()
585     let &l:acd = {a:vt}netrw_acdkeep
586     unlet {a:vt}netrw_acdkeep
587     if &l:acd
588 "     call Decho("exe keepj lcd ".fnameescape(curdir))  " NOTE: was g:netrw_fname_escape for some reason
589      try
590       if !exists("&l:acd") && !&l:acd
591        exe 'keepj lcd '.fnameescape(curdir)
592       endif
593      catch /^Vim\%((\a\+)\)\=:E472/
594       call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61)
595      endtry
596     endif
597    endif
598   endif
599   if exists("{a:vt}netrw_aikeep")   |let &l:ai     = {a:vt}netrw_aikeep      |unlet {a:vt}netrw_aikeep   |endif
600   if exists("{a:vt}netrw_awkeep")   |let &l:aw     = {a:vt}netrw_awkeep      |unlet {a:vt}netrw_awkeep   |endif
601   if g:netrw_liststyle != s:TREELIST
602    if exists("{a:vt}netrw_bhkeep")  |let &l:bh     = {a:vt}netrw_bhkeep      |unlet {a:vt}netrw_bhkeep   |endif
603   endif
604   if exists("{a:vt}netrw_blkeep")   |let &l:bl     = {a:vt}netrw_blkeep      |unlet {a:vt}netrw_blkeep   |endif
605   if exists("{a:vt}netrw_btkeep")   |let &l:bt     = {a:vt}netrw_btkeep      |unlet {a:vt}netrw_btkeep   |endif
606   if exists("{a:vt}netrw_bombkeep") |let &l:bomb   = {a:vt}netrw_bombkeep    |unlet {a:vt}netrw_bombkeep |endif
607   if exists("{a:vt}netrw_cedit")    |let &cedit    = {a:vt}netrw_cedit       |unlet {a:vt}netrw_cedit    |endif
608   if exists("{a:vt}netrw_cikeep")   |let &l:ci     = {a:vt}netrw_cikeep      |unlet {a:vt}netrw_cikeep   |endif
609   if exists("{a:vt}netrw_cinkeep")  |let &l:cin    = {a:vt}netrw_cinkeep     |unlet {a:vt}netrw_cinkeep  |endif
610   if exists("{a:vt}netrw_cinokeep") |let &l:cino   = {a:vt}netrw_cinokeep    |unlet {a:vt}netrw_cinokeep |endif
611   if exists("{a:vt}netrw_comkeep")  |let &l:com    = {a:vt}netrw_comkeep     |unlet {a:vt}netrw_comkeep  |endif
612   if exists("{a:vt}netrw_cpokeep")  |let &l:cpo    = {a:vt}netrw_cpokeep     |unlet {a:vt}netrw_cpokeep  |endif
613   if exists("{a:vt}netrw_diffkeep") |let &l:diff   = {a:vt}netrw_diffkeep    |unlet {a:vt}netrw_diffkeep |endif
614   if exists("{a:vt}netrw_fenkeep")  |let &l:fen    = {a:vt}netrw_fenkeep     |unlet {a:vt}netrw_fenkeep  |endif
615   if exists("{a:vt}netrw_ffkeep")   |let &l:ff     = {a:vt}netrw_ffkeep      |unlet {a:vt}netrw_ffkeep   |endif
616   if exists("{a:vt}netrw_fokeep")   |let &l:fo     = {a:vt}netrw_fokeep      |unlet {a:vt}netrw_fokeep   |endif
617   if exists("{a:vt}netrw_gdkeep")   |let &l:gd     = {a:vt}netrw_gdkeep      |unlet {a:vt}netrw_gdkeep   |endif
618   if exists("{a:vt}netrw_hidkeep")  |let &l:hidden = {a:vt}netrw_hidkeep     |unlet {a:vt}netrw_hidkeep  |endif
619   if exists("{a:vt}netrw_imkeep")   |let &l:im     = {a:vt}netrw_imkeep      |unlet {a:vt}netrw_imkeep   |endif
620   if exists("{a:vt}netrw_iskkeep")  |let &l:isk    = {a:vt}netrw_iskkeep     |unlet {a:vt}netrw_iskkeep  |endif
621   if exists("{a:vt}netrw_lskeep")   |let &l:ls     = {a:vt}netrw_lskeep      |unlet {a:vt}netrw_lskeep   |endif
622   if exists("{a:vt}netrw_makeep")   |let &l:ma     = {a:vt}netrw_makeep      |unlet {a:vt}netrw_makeep   |endif
623   if exists("{a:vt}netrw_magickeep")|let &l:magic  = {a:vt}netrw_magickeep   |unlet {a:vt}netrw_magickeep|endif
624   if exists("{a:vt}netrw_modkeep")  |let &l:mod    = {a:vt}netrw_modkeep     |unlet {a:vt}netrw_modkeep  |endif
625   if exists("{a:vt}netrw_nukeep")   |let &l:nu     = {a:vt}netrw_nukeep      |unlet {a:vt}netrw_nukeep   |endif
626   if exists("{a:vt}netrw_repkeep")  |let &l:report = {a:vt}netrw_repkeep     |unlet {a:vt}netrw_repkeep  |endif
627   if exists("{a:vt}netrw_rokeep")   |let &l:ro     = {a:vt}netrw_rokeep      |unlet {a:vt}netrw_rokeep   |endif
628   if exists("{a:vt}netrw_selkeep")  |let &l:sel    = {a:vt}netrw_selkeep     |unlet {a:vt}netrw_selkeep  |endif
629   if exists("{a:vt}netrw_spellkeep")|let &l:spell  = {a:vt}netrw_spellkeep   |unlet {a:vt}netrw_spellkeep|endif
630   " Problem: start with liststyle=0; press <i> : result, following line resets l:ts.
631 "  if exists("{a:vt}netrw_tskeep")   |let &l:ts     = {a:vt}netrw_tskeep      |unlet {a:vt}netrw_tskeep   |endif
632   if exists("{a:vt}netrw_twkeep")   |let &l:tw     = {a:vt}netrw_twkeep      |unlet {a:vt}netrw_twkeep   |endif
633   if exists("{a:vt}netrw_wigkeep")  |let &l:wig    = {a:vt}netrw_wigkeep     |unlet {a:vt}netrw_wigkeep  |endif
634   if exists("{a:vt}netrw_wrapkeep") |let &l:wrap   = {a:vt}netrw_wrapkeep    |unlet {a:vt}netrw_wrapkeep |endif
635   if exists("{a:vt}netrw_writekeep")|let &l:write  = {a:vt}netrw_writekeep   |unlet {a:vt}netrw_writekeep|endif
636   if exists("s:yykeep")             |let  @@       = s:yykeep                |unlet s:yykeep             |endif
637   if exists("{a:vt}netrw_swfkeep")
638    if &directory == ""
639     " user hasn't specified a swapfile directory;
640     " netrw will temporarily set the swapfile directory
641     " to the current directory as returned by getcwd().
642     let &l:directory   = getcwd()
643     sil! let &l:swf = {a:vt}netrw_swfkeep
644     setl directory=
645     unlet {a:vt}netrw_swfkeep
646    elseif &l:swf != {a:vt}netrw_swfkeep
647     " following line causes a Press ENTER in windows -- can't seem to work around it!!!
648     sil! let &l:swf= {a:vt}netrw_swfkeep
649     unlet {a:vt}netrw_swfkeep
650    endif
651   endif
652   if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir
653    let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
654    if exists("{a:vt}netrw_dirkeep")  |exe "keepj lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep  |endif
655   endif
656   if exists("{a:vt}netrw_regstar") |sil! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
657   if exists("{a:vt}netrw_regslash")|sil! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif
658   if exists("s:nbcd_curpos_{bufnr('%')}")
659 "   call Decho("(NetrwOptionRestore) restoring previous position  (s:nbcd_curpos_".bufnr('%')." exists)")
660    keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
661 "   call Decho("(NetrwOptionRestore) unlet s:nbcd_curpos_".bufnr('%'))
662    unlet s:nbcd_curpos_{bufnr('%')}
663   else
664 "   call Decho("no previous position")
665   endif
667 "  call Decho("(NetrwOptionRestore) g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
668 "  call Decho("(NetrwOptionRestore) fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist"))
669 "  call Decho("(NetrwOptionRestore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
670 "  call Decho("(NetrwOptionRestore) diff=".&l:diff." win#".winnr()." w:netrw_diffkeep=".(exists("w:netrw_diffkeep")? w:netrw_diffkeep : "doesn't exist"))
671 "  call Decho("(NetrwOptionRestore) ts=".&l:ts)
672   " Moved the filetype detect here from NetrwGetFile() because remote files
673   " were having their filetype detect-generated settings overwritten by
674   " NetrwOptionRestore.
675   if &ft != "netrw"
676 "   call Decho("(NetrwOptionRestore) filetype detect  (ft=".&ft.")")
677    filetype detect
678   endif
679 "  call Dret("s:NetrwOptionRestore : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
680 endfun
682 " ---------------------------------------------------------------------
683 " s:NetrwSafeOptions: sets options to help netrw do its job {{{2
684 "                     Use  s:NetrwSaveOptions() to save user settings
685 "                     Use  s:NetrwOptionRestore() to restore user settings
686 fun! s:NetrwSafeOptions()
687 "  call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%"))."> winnr($)=".winnr("$"))
688 "  call Decho("win#".winnr()."'s ft=".&ft)
689   if exists("+acd") | setl noacd | endif
690   setl noai
691   setl noaw
692   setl nobomb
693   setl noci
694   setl nocin
695   if g:netrw_liststyle == s:TREELIST
696    setl bh=hide
697   endif
698   setl cino=
699   setl com=
700   setl cpo-=a
701   setl cpo-=A
702   setl fo=nroql2
703    setl nohid
704   setl noim
705   setl isk+=@ isk+=* isk+=/
706   setl magic
707   setl report=10000
708   setl sel=inclusive
709   setl nospell
710   setl tw=0
711   setl wig=
712   set  cedit&
713   if g:netrw_use_noswf && has("win32") && !has("win95")
714    setl noswf
715   endif
716   call s:NetrwCursor()
718   " allow the user to override safe options
719 "  call Decho("ft<".&ft."> ei=".&ei)
720   if &ft == "netrw"
721 "   call Decho("do any netrw FileType autocmds (doau FileType netrw)")
722    sil! keepalt keepj doau FileType netrw
723   endif
725 "  call Decho("fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." bh=".&l:bh)
726 "  call Dret("s:NetrwSafeOptions")
727 endfun
729 " ---------------------------------------------------------------------
730 " netrw#Explore: launch the local browser in the directory of the current file {{{2
731 "          indx:  == -1: Nexplore
732 "                 == -2: Pexplore
733 "                 ==  +: this is overloaded:
734 "                      * If Nexplore/Pexplore is in use, then this refers to the
735 "                        indx'th item in the w:netrw_explore_list[] of items which
736 "                        matched the */pattern **/pattern *//pattern **//pattern
737 "                      * If Hexplore or Vexplore, then this will override
738 "                        g:netrw_winsize to specify the qty of rows or columns the
739 "                        newly split window should have.
740 "          dosplit==0: the window will be split iff the current file has been modified
741 "          dosplit==1: the window will be split before running the local browser
742 "          style == 0: Explore     style == 1: Explore!
743 "                == 2: Hexplore    style == 3: Hexplore!
744 "                == 4: Vexplore    style == 5: Vexplore!
745 "                == 6: Texplore
746 fun! netrw#Explore(indx,dosplit,style,...)
747 "  call Dfunc("netrw#Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.",a:1<".a:1.">) &modified=".&modified." modifiable=".&modifiable." a:0=".a:0." win#".winnr()." buf#".bufnr("%"))
748   if !exists("b:netrw_curdir")
749    let b:netrw_curdir= getcwd()
750    if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
751     let b:netrw_curdir= substitute(b:netrw_curdir,'\','/','g')
752    endif
753 "   call Decho("(Explore) set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
754   endif
755   let curdir     = simplify(b:netrw_curdir)
756   let curfiledir = substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
757   if !exists("g:netrw_cygwin") && (has("win32") || has("win95") || has("win64") || has("win16"))
758    let curdir= substitute(curdir,'\','/','g')
759   endif
760 "  call Decho("(Explore) curdir<".curdir.">  curfiledir<".curfiledir.">")
762   " save registers
763   sil! let keepregstar = @*
764   sil! let keepregplus = @+
765   sil! let keepregslash= @/
767   " if dosplit or file has been modified
768   if a:dosplit || &modified || a:style == 6
769 "   call Decho("(Explore) case dosplit=".a:dosplit." modified=".&modified." a:style=".a:style.": dosplit or file has been modified")
770    call s:SaveWinVars()
771    let winsz= g:netrw_winsize
772    if a:indx > 0
773     let winsz= a:indx
774    endif
776    if a:style == 0      " Explore, Sexplore
777 "    call Decho("(Explore) style=0: Explore or Sexplore")
778     let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
779     exe winsz."wincmd s"
781    elseif a:style == 1  "Explore!, Sexplore!
782 "    call Decho("(Explore) style=1: Explore! or Sexplore!")
783     let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
784     exe "keepalt ".winsz."wincmd v"
786    elseif a:style == 2  " Hexplore
787 "    call Decho("(Explore) style=2: Hexplore")
788     let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
789     exe "keepalt bel ".winsz."wincmd s"
791    elseif a:style == 3  " Hexplore!
792 "    call Decho("(Explore) style=3: Hexplore!")
793     let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
794     exe "keepalt abo ".winsz."wincmd s"
796    elseif a:style == 4  " Vexplore
797 "    call Decho("(Explore) style=4: Vexplore")
798     let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
799     exe "keepalt lefta ".winsz."wincmd v"
801    elseif a:style == 5  " Vexplore!
802 "    call Decho("(Explore) style=5: Vexplore!")
803     let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
804     exe "keepalt rightb ".winsz."wincmd v"
806    elseif a:style == 6  " Texplore
807     call s:SaveBufVars()
808 "    call Decho("(Explore) style  = 6: Texplore")
809     exe "keepalt tabnew ".fnameescape(curdir)
810     call s:RestoreBufVars()
811    endif
812    call s:RestoreWinVars()
813 "  else " Decho
814 "   call Decho("(Explore) case a:dosplit=".a:dosplit." AND modified=".&modified." AND a:style=".a:style." is not 6")
815   endif
816   keepj norm! 0
818   if a:0 > 0
819 "   call Decho("(Explore) case [a:0=".a:0."] > 0: a:1<".a:1.">")
820    if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
821 "    call Decho("(Explore) ..case a:1<".a:1.">: starts with ~ and unix or cygwin")
822     let dirname= simplify(substitute(a:1,'\~',expand("$HOME"),''))
823 "    call Decho("(Explore) ..using dirname<".dirname.">  (case: ~ && unix||cygwin)")
824    elseif a:1 == '.'
825 "    call Decho("(Explore) ..case a:1<".a:1.">: matches .")
826     let dirname= simplify(exists("b:netrw_curdir")? b:netrw_curdir : getcwd())
827     if dirname !~ '/$'
828      let dirname= dirname."/"
829     endif
830 "    call Decho("(Explore) ..using dirname<".dirname.">  (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
831    elseif a:1 =~ '\$'
832 "    call Decho("(Explore) ..case a:1<".a:1.">: matches ending $")
833     let dirname= simplify(expand(a:1))
834 "    call Decho("(Explore) ..using user-specified dirname<".dirname."> with $env-var")
835    elseif a:1 !~ '^\*\{1,2}/' && a:1 !~ '^\a\{3,}://'
836 "    call Decho("(Explore) ..case a:1<".a:1.">: other, not pattern or filepattern")
837     let dirname= simplify(a:1)
838 "    call Decho("(Explore) ..using user-specified dirname<".dirname.">")
839    else
840 "    call Decho("(Explore) ..case a:1: pattern or filepattern")
841     let dirname= a:1
842    endif
843   else
844    " clear explore
845 "   call Decho("(Explore) case a:0=".a:0.": clearing Explore list")
846    call s:NetrwClearExplore()
847 "   call Dret("netrw#Explore : cleared list")
848    return
849   endif
851 "  call Decho("(Explore) dirname<".dirname.">")
852   if dirname =~ '\.\./\=$'
853    let dirname= simplify(fnamemodify(dirname,':p:h'))
854   elseif dirname =~ '\.\.' || dirname == '.'
855    let dirname= simplify(fnamemodify(dirname,':p'))
856   endif
857 "  call Decho("(Explore) dirname<".dirname.">  (after simplify)")
859   if dirname =~ '^\*//'
860    " starpat=1: Explore *//pattern   (current directory only search for files containing pattern)
861 "   call Decho("(Explore) case starpat=1: Explore *//pattern")
862    let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
863    let starpat= 1
864 "   call Decho("(Explore) ..Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
865    if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
867   elseif dirname =~ '^\*\*//'
868    " starpat=2: Explore **//pattern  (recursive descent search for files containing pattern)
869 "   call Decho("(Explore) case starpat=2: Explore **//pattern")
870    let pattern= substitute(dirname,'^\*\*//','','')
871    let starpat= 2
872 "   call Decho("(Explore) ..Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
874   elseif dirname =~ '/\*\*/'
875    " handle .../**/.../filepat
876 "   call Decho("(Explore) case starpat=4: Explore .../**/.../filepat")
877    let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
878    if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
879     let b:netrw_curdir = prefixdir
880    else
881     let b:netrw_curdir= getcwd().'/'.prefixdir
882    endif
883    let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
884    let starpat= 4
885 "   call Decho("(Explore) ..pwd<".getcwd()."> dirname<".dirname.">")
886 "   call Decho("(Explore) ..case Explore ../**/../filepat (starpat=".starpat.")")
888   elseif dirname =~ '^\*/'
889    " case starpat=3: Explore */filepat   (search in current directory for filenames matching filepat)
890    let starpat= 3
891 "   call Decho("(Explore) case starpat=3: Explore */filepat (starpat=".starpat.")")
893   elseif dirname=~ '^\*\*/'
894    " starpat=4: Explore **/filepat  (recursive descent search for filenames matching filepat)
895    let starpat= 4
896 "   call Decho("(Explore) case starpat=4: Explore **/filepat (starpat=".starpat.")")
898   else
899    let starpat= 0
900 "   call Decho("(Explore) case starpat=0: default")
901   endif
903   if starpat == 0 && a:indx >= 0
904    " [Explore Hexplore Vexplore Sexplore] [dirname]
905 "   call Decho("(Explore) case starpat==0 && a:indx=".a:indx.": dirname<".dirname.">, handles Explore Hexplore Vexplore Sexplore")
906    if dirname == ""
907     let dirname= curfiledir
908 "    call Decho("(Explore) ..empty dirname, using current file's directory<".dirname.">")
909    endif
910    if dirname =~ '^scp://' || dirname =~ '^ftp://'
911     call netrw#Nread(2,dirname)
912     "call s:NetrwBrowse(0,dirname)
913    else
914     if dirname == ""
915      let dirname= getcwd()
916     elseif (has("win32") || has("win95") || has("win64") || has("win16")) && !g:netrw_cygwin
917      if dirname !~ '^[a-zA-Z]:'
918       let dirname= b:netrw_curdir."/".dirname
919      endif
920     elseif dirname !~ '^/'
921      let dirname= b:netrw_curdir."/".dirname
922     endif
923 "    call Decho("(Explore) ..calling LocalBrowseCheck(dirname<".dirname.">)")
924     call netrw#LocalBrowseCheck(dirname)
925 "    call Decho("(Explore) win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
926    endif
927    if exists("w:netrw_bannercnt")
928     " done to handle P08-Ingelrest. :Explore will _Always_ go to the line just after the banner.
929     " If one wants to return the same place in the netrw window, use :Rex instead.
930     exe w:netrw_bannercnt
931    endif
933 "   call Decho("(Explore) curdir<".curdir.">")
934    " ---------------------------------------------------------------------
935    " Jan 24, 2013: not sure why the following was present.  See P08-Ingelrest
936 "   if has("win32") || has("win95") || has("win64") || has("win16")
937 "    keepj call search('\<'.substitute(curdir,'^.*[/\\]','','e').'\>','cW')
938 "   else
939 "    keepj call search('\<'.substitute(curdir,'^.*/','','e').'\>','cW')
940 "   endif
941    " ---------------------------------------------------------------------
943   " starpat=1: Explore *//pattern  (current directory only search for files containing pattern)
944   " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
945   " starpat=3: Explore */filepat   (search in current directory for filenames matching filepat)
946   " starpat=4: Explore **/filepat  (recursive descent search for filenames matching filepat)
947   elseif a:indx <= 0
948    " Nexplore, Pexplore, Explore: handle starpat
949 "   call Decho("(Explore) case a:indx<=0: Nexplore, Pexplore, <s-down>, <s-up> starpat=".starpat." a:indx=".a:indx)
950    if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
951 "    call Decho("(Explore) ..set up <s-up> and <s-down> maps")
952     let s:didstarstar= 1
953     nnoremap <buffer> <silent> <s-up>   :Pexplore<cr>
954     nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
955    endif
957    if has("path_extra")
958 "    call Decho("(Explore) ..starpat=".starpat.": has +path_extra")
959     if !exists("w:netrw_explore_indx")
960      let w:netrw_explore_indx= 0
961     endif
963     let indx = a:indx
964 "    call Decho("(Explore) ..starpat=".starpat.": set indx= [a:indx=".indx."]")
966     if indx == -1
967      " Nexplore
968 "     call Decho("(Explore) ..case Nexplore with starpat=".starpat.": (indx=".indx.")")
969      if !exists("w:netrw_explore_list") " sanity check
970       keepj call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
971       sil! let @* = keepregstar
972       sil! let @+ = keepregstar
973       sil! let @/ = keepregslash
974 "      call Dret("netrw#Explore")
975       return
976      endif
977      let indx= w:netrw_explore_indx
978      if indx < 0                        | let indx= 0                           | endif
979      if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
980      let curfile= w:netrw_explore_list[indx]
981 "     call Decho("(Explore) ....indx=".indx." curfile<".curfile.">")
982      while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
983       let indx= indx + 1
984 "      call Decho("(Explore) ....indx=".indx." (Nexplore while loop)")
985      endwhile
986      if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
987 "     call Decho("(Explore) ....Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
989     elseif indx == -2
990      " Pexplore
991 "     call Decho("(Explore) case Pexplore with starpat=".starpat.": (indx=".indx.")")
992      if !exists("w:netrw_explore_list") " sanity check
993       keepj call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
994       sil! let @* = keepregstar
995       sil! let @+ = keepregstar
996       sil! let @/ = keepregslash
997 "      call Dret("netrw#Explore")
998       return
999      endif
1000      let indx= w:netrw_explore_indx
1001      if indx < 0                        | let indx= 0                           | endif
1002      if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
1003      let curfile= w:netrw_explore_list[indx]
1004 "     call Decho("(Explore) ....indx=".indx." curfile<".curfile.">")
1005      while indx >= 0 && curfile == w:netrw_explore_list[indx]
1006       let indx= indx - 1
1007 "      call Decho("(Explore) ....indx=".indx." (Pexplore while loop)")
1008      endwhile
1009      if indx < 0                        | let indx= 0                           | endif
1010 "     call Decho("(Explore) ....Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
1012     else
1013      " Explore -- initialize
1014      " build list of files to Explore with Nexplore/Pexplore
1015 "     call Decho("(Explore) ..starpat=".starpat.": case Explore: initialize (indx=".indx.")")
1016      keepj keepalt call s:NetrwClearExplore()
1017      let w:netrw_explore_indx= 0
1018      if !exists("b:netrw_curdir")
1019       let b:netrw_curdir= getcwd()
1020      endif
1021 "     call Decho("(Explore) ....starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
1023      " switch on starpat to build the w:netrw_explore_list of files
1024      if starpat == 1
1025       " starpat=1: Explore *//pattern  (current directory only search for files containing pattern)
1026 "      call Decho("(Explore) ..case starpat=".starpat.": build *//pattern list  (curdir-only srch for files containing pattern)  &hls=".&hls)
1027 "      call Decho("(Explore) ....pattern<".pattern.">")
1028       try
1029        exe "keepj noautocmd vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
1030       catch /^Vim\%((\a\+)\)\=:E480/
1031        keepalt call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
1032 "       call Dret("netrw#Explore : unable to find pattern<".pattern.">")
1033        return
1034       endtry
1035       let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)'))
1036       if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
1038      elseif starpat == 2
1039       " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
1040 "      call Decho("(Explore) ..case starpat=".starpat.": build **//pattern list  (recursive descent files containing pattern)")
1041 "      call Decho("(Explore) ....pattern<".pattern.">")
1042       try
1043        exe "sil keepj noautocmd keepalt vimgrep /".pattern."/gj "."**/*"
1044       catch /^Vim\%((\a\+)\)\=:E480/
1045        keepalt call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
1046        if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
1047        sil! let @* = keepregstar
1048        sil! let @+ = keepregstar
1049        sil! let @/ = keepregslash
1050 "       call Dret("netrw#Explore : no files matched pattern")
1051        return
1052       endtry
1053       let s:netrw_curdir       = b:netrw_curdir
1054       let w:netrw_explore_list = getqflist()
1055       let w:netrw_explore_list = s:NetrwExploreListUniq(map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)'))
1056       if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
1058      elseif starpat == 3
1059       " starpat=3: Explore */filepat   (search in current directory for filenames matching filepat)
1060 "      call Decho("(Explore) ..case starpat=".starpat.": build */filepat list  (curdir-only srch filenames matching filepat)  &hls=".&hls)
1061       let filepat= substitute(dirname,'^\*/','','')
1062       let filepat= substitute(filepat,'^[%#<]','\\&','')
1063 "      call Decho("(Explore) ....b:netrw_curdir<".b:netrw_curdir.">")
1064 "      call Decho("(Explore) ....filepat<".filepat.">")
1065       let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n'))
1066       if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif
1068      elseif starpat == 4
1069       " starpat=4: Explore **/filepat  (recursive descent search for filenames matching filepat)
1070 "      call Decho("(Explore) ..case starpat=".starpat.": build **/filepat list  (recursive descent srch filenames matching filepat)  &hls=".&hls)
1071       let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n'))
1072       if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
1073      endif " switch on starpat to build w:netrw_explore_list
1075      let w:netrw_explore_listlen = len(w:netrw_explore_list)
1076 "     call Decho("(Explore) ....w:netrw_explore_list<".string(w:netrw_explore_list).">")
1077 "     call Decho("(Explore) ....w:netrw_explore_listlen=".w:netrw_explore_listlen)
1079      if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
1080       keepalt keepj call netrw#ErrorMsg(s:WARNING,"no files matched",42)
1081       sil! let @* = keepregstar
1082       sil! let @+ = keepregstar
1083       sil! let @/ = keepregslash
1084 "      call Dret("netrw#Explore : no files matched")
1085       return
1086      endif
1087     endif  " if indx ... endif
1089     " NetrwStatusLine support - for exploring support
1090     let w:netrw_explore_indx= indx
1091 "    call Decho("(Explore) ....w:netrw_explore_list<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
1093     " wrap the indx around, but issue a note
1094     if indx >= w:netrw_explore_listlen || indx < 0
1095 "     call Decho("(Explore) ....wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
1096      let indx                = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
1097      let w:netrw_explore_indx= indx
1098      keepalt keepj call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
1099     endif
1101     exe "let dirfile= w:netrw_explore_list[".indx."]"
1102 "    call Decho("(Explore) ....dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
1103     let newdir= substitute(dirfile,'/[^/]*$','','e')
1104 "    call Decho("(Explore) ....newdir<".newdir.">")
1106 "    call Decho("(Explore) ....calling LocalBrowseCheck(newdir<".newdir.">)")
1107     call netrw#LocalBrowseCheck(newdir)
1108     if !exists("w:netrw_liststyle")
1109      let w:netrw_liststyle= g:netrw_liststyle
1110     endif
1111     if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
1112      keepalt keepj call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
1113     else
1114      keepalt keepj call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
1115     endif
1116     let w:netrw_explore_mtchcnt = indx + 1
1117     let w:netrw_explore_bufnr   = bufnr("%")
1118     let w:netrw_explore_line    = line(".")
1119     keepalt keepj call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
1120 "    call Decho("(Explore) ....explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
1122    else
1123 "    call Decho("(Explore) ..your vim does not have +path_extra")
1124     if !exists("g:netrw_quiet")
1125      keepalt keepj call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
1126     endif
1127     sil! let @* = keepregstar
1128     sil! let @+ = keepregstar
1129     sil! let @/ = keepregslash
1130 "    call Dret("netrw#Explore : missing +path_extra")
1131     return
1132    endif
1134   else
1135 "   call Decho("(Explore) ..default case: Explore newdir<".dirname.">")
1136    if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
1137     sil! unlet w:netrw_treedict
1138     sil! unlet w:netrw_treetop
1139    endif
1140    let newdir= dirname
1141    if !exists("b:netrw_curdir")
1142     keepj call netrw#LocalBrowseCheck(getcwd())
1143    else
1144     keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
1145    endif
1146   endif
1148   " visual display of **/ **// */ Exploration files
1149 "  call Decho("(Explore) w:netrw_explore_indx=".(exists("w:netrw_explore_indx")? w:netrw_explore_indx : "doesn't exist"))
1150 "  call Decho("(Explore) b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "n/a").">")
1151   if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
1152 "   call Decho("(Explore) s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-"))
1153    if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
1154     " only update match list if current directory isn't the same as before
1155 "    call Decho("(Explore) only update match list if current directory not the same as before")
1156     let s:explore_prvdir = b:netrw_curdir
1157     let s:explore_match  = ""
1158     let dirlen           = s:Strlen(b:netrw_curdir)
1159     if b:netrw_curdir !~ '/$'
1160      let dirlen= dirlen + 1
1161     endif
1162     let prvfname= ""
1163     for fname in w:netrw_explore_list
1164 "     call Decho("(Explore) fname<".fname.">")
1165      if fname =~ '^'.b:netrw_curdir
1166       if s:explore_match == ""
1167        let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
1168       else
1169        let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
1170       endif
1171      elseif fname !~ '^/' && fname != prvfname
1172       if s:explore_match == ""
1173        let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>'
1174       else
1175        let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>'
1176       endif
1177      endif
1178      let prvfname= fname
1179     endfor
1180 "    call Decho("(Explore) explore_match<".s:explore_match.">")
1181     exe "2match netrwMarkFile /".s:explore_match."/"
1182    endif
1183    echo "<s-up>==Pexplore  <s-down>==Nexplore"
1184   else
1185    2match none
1186    if exists("s:explore_match")  | unlet s:explore_match  | endif
1187    if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
1188    echo " "
1189 "   call Decho("(Explore) cleared explore match list")
1190   endif
1192   sil! let @* = keepregstar
1193   sil! let @+ = keepregstar
1194   sil! let @/ = keepregslash
1195 "  call Dret("netrw#Explore : @/<".@/.">")
1196 endfun
1198 " ---------------------------------------------------------------------
1199 " netrw#NetrwMakeTgt: make a target out of the directory name provided {{{2
1200 fun! netrw#NetrwMakeTgt(dname)
1201 "  call Dfunc("netrw#NetrwMakeTgt(dname<".a:dname.">)")
1202    " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
1203   let svpos               = netrw#NetrwSavePosn()
1204   let s:netrwmftgt_islocal= (a:dname !~ '^\a\+://')
1205 "  call Decho("s:netrwmftgt_islocal=".s:netrwmftgt_islocal)
1206   if s:netrwmftgt_islocal
1207    let netrwmftgt= simplify(a:dname)
1208   else
1209    let netrwmftgt= a:dname
1210   endif
1211   if exists("s:netrwmftgt") && netrwmftgt == s:netrwmftgt
1212    " re-selected target, so just clear it
1213    unlet s:netrwmftgt s:netrwmftgt_islocal
1214   else
1215    let s:netrwmftgt= netrwmftgt
1216   endif
1217   if g:netrw_fastbrowse <= 1
1218    call s:NetrwRefresh((b:netrw_curdir !~ '\a\+://'),b:netrw_curdir)
1219   endif
1220   call netrw#NetrwRestorePosn(svpos)
1221 "  call Dret("netrw#NetrwMakeTgt")
1222 endfun
1224 " ---------------------------------------------------------------------
1225 " netrw#NetrwClean: remove netrw {{{2
1226 " supports :NetrwClean  -- remove netrw from first directory on runtimepath
1227 "          :NetrwClean! -- remove netrw from all directories on runtimepath
1228 fun! netrw#NetrwClean(sys)
1229 "  call Dfunc("netrw#NetrwClean(sys=".a:sys.")")
1231   if a:sys
1232    let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
1233   else
1234    let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
1235   endif
1236 "  call Decho("choice=".choice)
1237   let diddel= 0
1238   let diddir= ""
1240   if choice == 1
1241    for dir in split(&rtp,',')
1242     if filereadable(dir."/plugin/netrwPlugin.vim")
1243 "     call Decho("removing netrw-related files from ".dir)
1244      if s:NetrwDelete(dir."/plugin/netrwPlugin.vim")        |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55)        |endif
1245      if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
1246      if s:NetrwDelete(dir."/autoload/netrwSettings.vim")    |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55)    |endif
1247      if s:NetrwDelete(dir."/autoload/netrw.vim")            |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55)            |endif
1248      if s:NetrwDelete(dir."/syntax/netrw.vim")              |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55)              |endif
1249      if s:NetrwDelete(dir."/syntax/netrwlist.vim")          |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrwlist.vim",55)          |endif
1250      let diddir= dir
1251      let diddel= diddel + 1
1252      if !a:sys|break|endif
1253     endif
1254    endfor
1255   endif
1257    echohl WarningMsg
1258   if diddel == 0
1259    echomsg "netrw is either not installed or not removable"
1260   elseif diddel == 1
1261    echomsg "removed one copy of netrw from <".diddir.">"
1262   else
1263    echomsg "removed ".diddel." copies of netrw"
1264   endif
1265    echohl None
1267 "  call Dret("netrw#NetrwClean")
1268 endfun
1270 " ---------------------------------------------------------------------
1271 " netrw#Nread: {{{2
1272 fun! netrw#Nread(mode,fname)
1273 "  call Dfunc("netrw#Nread(mode=".a:mode." fname<".a:fname.">)")
1274   call netrw#NetrwSavePosn()
1275   call netrw#NetRead(a:mode,a:fname)
1276   call netrw#NetrwRestorePosn()
1277 "  call Dret("netrw#Nread")
1278 endfun
1280 " ------------------------------------------------------------------------
1281 " netrw#NetrwObtain: {{{2
1282 "   netrw#NetrwObtain(islocal,fname[,tgtdirectory])
1283 "     islocal=0  obtain from remote source
1284 "            =1  obtain from local source
1285 "     fname  :   a filename or a list of filenames
1286 "     tgtdir :   optional place where files are to go  (not present, uses getcwd())
1287 fun! netrw#NetrwObtain(islocal,fname,...)
1288 "  call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
1289   " NetrwStatusLine support - for obtaining support
1291   if type(a:fname) == 1
1292    let fnamelist= [ a:fname ]
1293   elseif type(a:fname) == 3
1294    let fnamelist= a:fname
1295   else
1296    call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
1297 "   call Dret("netrw#NetrwObtain")
1298    return
1299   endif
1300 "  call Decho("fnamelist<".string(fnamelist).">")
1301   if a:0 > 0
1302    let tgtdir= a:1
1303   else
1304    let tgtdir= getcwd()
1305   endif
1306 "  call Decho("tgtdir<".tgtdir.">")
1308   if exists("b:netrw_islocal") && b:netrw_islocal
1309    " obtain a file from local b:netrw_curdir to (local) tgtdir
1310 "   call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir)
1311    if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
1312     let topath= s:ComposePath(tgtdir,"")
1313     if (has("win32") || has("win95") || has("win64") || has("win16"))
1314      " transfer files one at time
1315 "     call Decho("transfer files one at a time")
1316      for fname in fnamelist
1317 "      call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")")
1318       call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
1319       if v:shell_error != 0
1320        call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localcopycmd<".g:netrw_localcopycmd."> to something that works",80)
1321 "       call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath))
1322        return
1323       endif
1324      endfor
1325     else
1326      " transfer files with one command
1327 "     call Decho("transfer files with one command")
1328      let filelist= join(map(deepcopy(fnamelist),"shellescape(v:val)"))
1329 "     call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
1330      call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
1331      if v:shell_error != 0
1332       call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localcopycmd<".g:netrw_localcopycmd."> to something that works",80)
1333 "      call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
1334       return
1335      endif
1336     endif
1337    elseif !exists("b:netrw_curdir")
1338     call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
1339    else
1340     call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
1341    endif
1343   else
1344    " obtain files from remote b:netrw_curdir to local tgtdir
1345 "   call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir)
1346    if type(a:fname) == 1
1347     call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
1348    endif
1349    call s:NetrwMethod(b:netrw_curdir)
1351    if b:netrw_method == 4
1352     " obtain file using scp
1353 "    call Decho("obtain via scp (method#4)")
1354     if exists("g:netrw_port") && g:netrw_port != ""
1355      let useport= " ".g:netrw_scpport." ".g:netrw_port
1356     else
1357      let useport= ""
1358     endif
1359     if b:netrw_fname =~ '/'
1360      let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
1361     else
1362      let path= ""
1363     endif
1364     let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)'))
1365 "    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1))
1366     exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)
1368    elseif b:netrw_method == 2
1369     " obtain file using ftp + .netrc
1370 "     call Decho("obtain via ftp+.netrc (method #2)")
1371      call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
1372      let tmpbufnr= bufnr("%")
1373      setl ff=unix
1374      if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
1375       keepj put =g:netrw_ftpmode
1376 "      call Decho("filter input: ".getline('$'))
1377      endif
1379      if exists("b:netrw_fname") && b:netrw_fname != ""
1380       call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
1381 "      call Decho("filter input: ".getline('$'))
1382      endif
1384      if exists("g:netrw_ftpextracmd")
1385       keepj put =g:netrw_ftpextracmd
1386 "      call Decho("filter input: ".getline('$'))
1387      endif
1388      for fname in fnamelist
1389       call setline(line("$")+1,'get "'.fname.'"')
1390 "      call Decho("filter input: ".getline('$'))
1391      endfor
1392      if exists("g:netrw_port") && g:netrw_port != ""
1393 "      call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1394       exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
1395      else
1396 "      call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1397       exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
1398      endif
1399      " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1400      if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
1401       let debugkeep= &debug
1402       setl debug=msg
1403       call netrw#ErrorMsg(s:ERROR,getline(1),4)
1404       let &debug= debugkeep
1405      endif
1407    elseif b:netrw_method == 3
1408     " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
1409 "    call Decho("obtain via ftp+mipf (method #3)")
1410     call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars()
1411     let tmpbufnr= bufnr("%")
1412     setl ff=unix
1414     if exists("g:netrw_port") && g:netrw_port != ""
1415      keepj put ='open '.g:netrw_machine.' '.g:netrw_port
1416 "     call Decho("filter input: ".getline('$'))
1417     else
1418      keepj put ='open '.g:netrw_machine
1419 "     call Decho("filter input: ".getline('$'))
1420     endif
1422     if exists("g:netrw_uid") && g:netrw_uid != ""
1423      if exists("g:netrw_ftp") && g:netrw_ftp == 1
1424       keepj put =g:netrw_uid
1425 "      call Decho("filter input: ".getline('$'))
1426       if exists("s:netrw_passwd") && s:netrw_passwd != ""
1427        keepj put ='\"'.s:netrw_passwd.'\"'
1428       endif
1429 "      call Decho("filter input: ".getline('$'))
1430      elseif exists("s:netrw_passwd")
1431       keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1432 "      call Decho("filter input: ".getline('$'))
1433      endif
1434     endif
1436     if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
1437      keepj put =g:netrw_ftpmode
1438 "     call Decho("filter input: ".getline('$'))
1439     endif
1441     if exists("b:netrw_fname") && b:netrw_fname != ""
1442      keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
1443 "     call Decho("filter input: ".getline('$'))
1444     endif
1446     if exists("g:netrw_ftpextracmd")
1447      keepj put =g:netrw_ftpextracmd
1448 "     call Decho("filter input: ".getline('$'))
1449     endif
1451     if exists("g:netrw_ftpextracmd")
1452      keepj put =g:netrw_ftpextracmd
1453 "     call Decho("filter input: ".getline('$'))
1454     endif
1455     for fname in fnamelist
1456      keepj call setline(line("$")+1,'get "'.fname.'"')
1457     endfor
1458 "    call Decho("filter input: ".getline('$'))
1460     " perform ftp:
1461     " -i       : turns off interactive prompting from ftp
1462     " -n  unix : DON'T use <.netrc>, even though it exists
1463     " -n  win32: quit being obnoxious about password
1464     keepj norm! 1Gdd
1465 "    call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
1466     exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
1467     " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1468     if getline(1) !~ "^$"
1469 "     call Decho("error<".getline(1).">")
1470      if !exists("g:netrw_quiet")
1471       keepj call netrw#ErrorMsg(s:ERROR,getline(1),5)
1472      endif
1473     endif
1474    elseif !exists("b:netrw_method") || b:netrw_method < 0
1475 "    call Dfunc("netrw#NetrwObtain : unsupported method")
1476     return
1477    endif
1479    " restore status line
1480    if type(a:fname) == 1 && exists("s:netrw_users_stl")
1481     keepj call s:SetupNetrwStatusLine(s:netrw_users_stl)
1482    endif
1484   endif
1486   " cleanup
1487   if exists("tmpbufnr")
1488    if bufnr("%") != tmpbufnr
1489     exe tmpbufnr."bw!"
1490    else
1491     q!
1492    endif
1493   endif
1495 "  call Dret("netrw#NetrwObtain")
1496 endfun
1498 " ---------------------------------------------------------------------
1499 " NetrwStatusLine: {{{2
1500 fun! NetrwStatusLine()
1502 " vvv NetrwStatusLine() debugging vvv
1503 "  let g:stlmsg=""
1504 "  if !exists("w:netrw_explore_bufnr")
1505 "   let g:stlmsg="!X<explore_bufnr>"
1506 "  elseif w:netrw_explore_bufnr != bufnr("%")
1507 "   let g:stlmsg="explore_bufnr!=".bufnr("%")
1508 "  endif
1509 "  if !exists("w:netrw_explore_line")
1510 "   let g:stlmsg=" !X<explore_line>"
1511 "  elseif w:netrw_explore_line != line(".")
1512 "   let g:stlmsg=" explore_line!={line(.)<".line(".").">"
1513 "  endif
1514 "  if !exists("w:netrw_explore_list")
1515 "   let g:stlmsg=" !X<explore_list>"
1516 "  endif
1517 " ^^^ NetrwStatusLine() debugging ^^^
1519   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")
1520    " restore user's status line
1521    let &stl        = s:netrw_users_stl
1522    let &laststatus = s:netrw_users_ls
1523    if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
1524    if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
1525    return ""
1526   else
1527    return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
1528   endif
1529 endfun
1531 " ---------------------------------------------------------------------
1532 "  Netrw Transfer Functions: {{{1
1533 " ===============================
1535 " ------------------------------------------------------------------------
1536 " netrw#NetRead: responsible for reading a file over the net {{{2
1537 "   mode: =0 read remote file and insert before current line
1538 "         =1 read remote file and insert after current line
1539 "         =2 replace with remote file
1540 "         =3 obtain file, but leave in temporary format
1541 fun! netrw#NetRead(mode,...)
1542 "  call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw.((a:0 > 0)? " a:1<".a:1.">" : ""))
1544   " NetRead: save options {{{3
1545   call s:NetrwOptionSave("w:")
1546   call s:NetrwSafeOptions()
1547   call s:RestoreCursorline()
1549   " NetRead: interpret mode into a readcmd {{{3
1550   if     a:mode == 0 " read remote file before current line
1551    let readcmd = "0r"
1552   elseif a:mode == 1 " read file after current line
1553    let readcmd = "r"
1554   elseif a:mode == 2 " replace with remote file
1555    let readcmd = "%r"
1556   elseif a:mode == 3 " skip read of file (leave as temporary)
1557    let readcmd = "t"
1558   else
1559    exe a:mode
1560    let readcmd = "r"
1561   endif
1562   let ichoice = (a:0 == 0)? 0 : 1
1563 "  call Decho("readcmd<".readcmd."> ichoice=".ichoice)
1565   " NetRead: get temporary filename {{{3
1566   let tmpfile= s:GetTempfile("")
1567   if tmpfile == ""
1568 "   call Dret("netrw#NetRead : unable to get a tempfile!")
1569    return
1570   endif
1572   while ichoice <= a:0
1574    " attempt to repeat with previous host-file-etc
1575    if exists("b:netrw_lastfile") && a:0 == 0
1576 "    call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
1577     let choice = b:netrw_lastfile
1578     let ichoice= ichoice + 1
1580    else
1581     exe "let choice= a:" . ichoice
1582 "    call Decho("no lastfile: choice<" . choice . ">")
1584     if match(choice,"?") == 0
1585      " give help
1586      echomsg 'NetRead Usage:'
1587      echomsg ':Nread machine:path                         uses rcp'
1588      echomsg ':Nread "machine path"                       uses ftp   with <.netrc>'
1589      echomsg ':Nread "machine id password path"           uses ftp'
1590      echomsg ':Nread dav://machine[:port]/path            uses cadaver'
1591      echomsg ':Nread fetch://machine/path                 uses fetch'
1592      echomsg ':Nread ftp://[user@]machine[:port]/path     uses ftp   autodetects <.netrc>'
1593      echomsg ':Nread http://[user@]machine/path           uses http  wget'
1594      echomsg ':Nread rcp://[user@]machine/path            uses rcp'
1595      echomsg ':Nread rsync://machine[:port]/path          uses rsync'
1596      echomsg ':Nread scp://[user@]machine[[:#]port]/path  uses scp'
1597      echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
1598      sleep 4
1599      break
1601     elseif match(choice,'^"') != -1
1602      " Reconstruct Choice if choice starts with '"'
1603 "     call Decho("reconstructing choice")
1604      if match(choice,'"$') != -1
1605       " case "..."
1606       let choice= strpart(choice,1,strlen(choice)-2)
1607      else
1608        "  case "... ... ..."
1609       let choice      = strpart(choice,1,strlen(choice)-1)
1610       let wholechoice = ""
1612       while match(choice,'"$') == -1
1613        let wholechoice = wholechoice . " " . choice
1614        let ichoice     = ichoice + 1
1615        if ichoice > a:0
1616         if !exists("g:netrw_quiet")
1617          call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
1618         endif
1619 "        call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
1620         return
1621        endif
1622        let choice= a:{ichoice}
1623       endwhile
1624       let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1625      endif
1626     endif
1627    endif
1629 "   call Decho("choice<" . choice . ">")
1630    let ichoice= ichoice + 1
1632    " NetRead: Determine method of read (ftp, rcp, etc) {{{3
1633    call s:NetrwMethod(choice)
1634    if !exists("b:netrw_method") || b:netrw_method < 0
1635 "    call Dfunc("netrw#NetRead : unsupported method")
1636     return
1637    endif
1638    let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
1640    " Check if NetrwBrowse() should be handling this request
1641 "   call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">")
1642    if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^https\=://'
1643 "    call Decho("yes, choice matches '^.*[\/]$'")
1644     keepj call s:NetrwBrowse(0,choice)
1645 "    call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
1646     return
1647    endif
1649    " ============
1650    " NetRead: Perform Protocol-Based Read {{{3
1651    " ===========================
1652    if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1653     echo "(netrw) Processing your read request..."
1654    endif
1656    ".........................................
1657    " NetRead: (rcp)  NetRead Method #1 {{{3
1658    if  b:netrw_method == 1 " read with rcp
1659 "    call Decho("read via rcp (method #1)")
1660    " ER: nothing done with g:netrw_uid yet?
1661    " ER: on Win2K" rcp machine[.user]:file tmpfile
1662    " ER: if machine contains '.' adding .user is required (use $USERNAME)
1663    " ER: the tmpfile is full path: rcp sees C:\... as host C
1664    if s:netrw_has_nt_rcp == 1
1665     if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1666      let uid_machine = g:netrw_machine .'.'. g:netrw_uid
1667     else
1668      " Any way needed it machine contains a '.'
1669      let uid_machine = g:netrw_machine .'.'. $USERNAME
1670     endif
1671    else
1672     if exists("g:netrw_uid") && ( g:netrw_uid != "" )
1673      let uid_machine = g:netrw_uid .'@'. g:netrw_machine
1674     else
1675      let uid_machine = g:netrw_machine
1676     endif
1677    endif
1678 "   call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
1679    exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)
1680    let result           = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
1681    let b:netrw_lastfile = choice
1683    ".........................................
1684    " NetRead: (ftp + <.netrc>)  NetRead Method #2 {{{3
1685    elseif b:netrw_method  == 2          " read with ftp + <.netrc>
1686 "     call Decho("read via ftp+.netrc (method #2)")
1687      let netrw_fname= b:netrw_fname
1688      keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
1689      let filtbuf= bufnr("%")
1690      setl ff=unix
1691      keepj put =g:netrw_ftpmode
1692 "     call Decho("filter input: ".getline(line("$")))
1693      if exists("g:netrw_ftpextracmd")
1694       keepj put =g:netrw_ftpextracmd
1695 "      call Decho("filter input: ".getline(line("$")))
1696      endif
1697      call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile)
1698 "     call Decho("filter input: ".getline(line("$")))
1699      if exists("g:netrw_port") && g:netrw_port != ""
1700 "      call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
1701       exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
1702      else
1703 "      call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
1704       exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
1705      endif
1706      " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1707      if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
1708       let debugkeep = &debug
1709       setl debug=msg
1710       keepj call netrw#ErrorMsg(s:ERROR,getline(1),4)
1711       let &debug    = debugkeep
1712      endif
1713      call s:SaveBufVars()
1714      bd!
1715      if bufname("%") == "" && getline("$") == "" && line('$') == 1
1716       " needed when one sources a file in a nolbl setting window via ftp
1717       q!
1718      endif
1719      call s:RestoreBufVars()
1720      let result           = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
1721      let b:netrw_lastfile = choice
1723    ".........................................
1724    " NetRead: (ftp + machine,id,passwd,filename)  NetRead Method #3 {{{3
1725    elseif b:netrw_method == 3           " read with ftp + machine, id, passwd, and fname
1726     " Construct execution string (four lines) which will be passed through filter
1727 "    call Decho("read via ftp+mipf (method #3)")
1728     let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
1729     keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars()
1730     let filtbuf= bufnr("%")
1731     setl ff=unix
1732     if exists("g:netrw_port") && g:netrw_port != ""
1733      keepj put ='open '.g:netrw_machine.' '.g:netrw_port
1734 "     call Decho("filter input: ".getline('.'))
1735     else
1736      keepj put ='open '.g:netrw_machine
1737 "     call Decho("filter input: ".getline('.'))
1738     endif
1740     if exists("g:netrw_uid") && g:netrw_uid != ""
1741      if exists("g:netrw_ftp") && g:netrw_ftp == 1
1742       keepj put =g:netrw_uid
1743 "       call Decho("filter input: ".getline('.'))
1744       if exists("s:netrw_passwd")
1745        keepj put ='\"'.s:netrw_passwd.'\"'
1746       endif
1747 "      call Decho("filter input: ".getline('.'))
1748      elseif exists("s:netrw_passwd")
1749       keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1750 "      call Decho("filter input: ".getline('.'))
1751      endif
1752     endif
1754     if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
1755      keepj put =g:netrw_ftpmode
1756 "     call Decho("filter input: ".getline('.'))
1757     endif
1758     if exists("g:netrw_ftpextracmd")
1759      keepj put =g:netrw_ftpextracmd
1760 "     call Decho("filter input: ".getline('.'))
1761     endif
1762     keepj put ='get \"'.netrw_fname.'\" '.tmpfile
1763 "    call Decho("filter input: ".getline('.'))
1765     " perform ftp:
1766     " -i       : turns off interactive prompting from ftp
1767     " -n  unix : DON'T use <.netrc>, even though it exists
1768     " -n  win32: quit being obnoxious about password
1769     keepj norm! 1Gdd
1770 "    call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
1771     exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
1772     " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1773     if getline(1) !~ "^$"
1774 "     call Decho("error<".getline(1).">")
1775      if !exists("g:netrw_quiet")
1776       call netrw#ErrorMsg(s:ERROR,getline(1),5)
1777      endif
1778     endif
1779     call s:SaveBufVars()|bd!|call s:RestoreBufVars()
1780     let result           = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
1781     let b:netrw_lastfile = choice
1783    ".........................................
1784    " NetRead: (scp) NetRead Method #4 {{{3
1785    elseif     b:netrw_method  == 4      " read with scp
1786 "    call Decho("read via scp (method #4)")
1787     if exists("g:netrw_port") && g:netrw_port != ""
1788      let useport= " ".g:netrw_scpport." ".g:netrw_port
1789     else
1790      let useport= ""
1791     endif
1792 "    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
1793     exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)
1794     let result           = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
1795     let b:netrw_lastfile = choice
1797    ".........................................
1798    " NetRead: (http) NetRead Method #5 (wget) {{{3
1799    elseif     b:netrw_method  == 5
1800 "    call Decho("read via http (method #5)")
1801     if g:netrw_http_cmd == ""
1802      if !exists("g:netrw_quiet")
1803       call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
1804      endif
1805 "     call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
1806      return
1807     endif
1809     if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd")
1810      " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch)
1811 "     call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)")
1812      if exists("g:netrw_http_xcmd")
1813 "      call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1))
1814       exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1)
1815      else
1816 "      call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1))
1817       exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)
1818      endif
1819      let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
1821     else
1822      " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
1823 "     call Decho("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
1824      let netrw_html= substitute(b:netrw_fname,"#.*$","","")
1825      let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
1826 "     call Decho("netrw_html<".netrw_html.">")
1827 "     call Decho("netrw_tag <".netrw_tag.">")
1828 "     call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1))
1829      exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1)
1830      let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
1831 "     call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
1832      exe 'keepj norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
1833     endif
1834     let b:netrw_lastfile = choice
1835 "    call Decho("(NetRead) setl ro")
1836     setl ro
1838    ".........................................
1839    " NetRead: (dav) NetRead Method #6 {{{3
1840    elseif     b:netrw_method  == 6
1841 "    call Decho("read via cadaver (method #6)")
1843     if !executable(g:netrw_dav_cmd)
1844      call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73)
1845 "     call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable")
1846      return
1847     endif
1848     if g:netrw_dav_cmd =~ "curl"
1849 "     call Decho("exe ".s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1))
1850      exe s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1)
1851     else
1852      " Construct execution string (four lines) which will be passed through filter
1853      let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
1854      new
1855      setl ff=unix
1856      if exists("g:netrw_port") && g:netrw_port != ""
1857       keepj put ='open '.g:netrw_machine.' '.g:netrw_port
1858      else
1859       keepj put ='open '.g:netrw_machine
1860      endif
1861      if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
1862       keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
1863      endif
1864      keepj put ='get '.netrw_fname.' '.tmpfile
1865      keepj put ='quit'
1867      " perform cadaver operation:
1868      keepj norm! 1Gdd
1869 "    call Decho("executing: %!".g:netrw_dav_cmd)
1870      exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
1871      bd!
1872     endif
1873     let result           = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
1874     let b:netrw_lastfile = choice
1876    ".........................................
1877    " NetRead: (rsync) NetRead Method #7 {{{3
1878    elseif     b:netrw_method  == 7
1879 "    call Decho("read via rsync (method #7)")
1880 "    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1))
1881     exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)
1882     let result           = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
1883     let b:netrw_lastfile = choice
1885    ".........................................
1886    " NetRead: (fetch) NetRead Method #8 {{{3
1887    "    fetch://[user@]host[:http]/path
1888    elseif     b:netrw_method  == 8
1889 "    call Decho("read via fetch (method #8)")
1890     if g:netrw_fetch_cmd == ""
1891      if !exists("g:netrw_quiet")
1892       keepj call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
1893      endif
1894 "     call Dret("NetRead")
1895      return
1896     endif
1897     if exists("g:netrw_option") && g:netrw_option == ":https\="
1898      let netrw_option= "http"
1899     else
1900      let netrw_option= "ftp"
1901     endif
1902 "    call Decho("read via fetch for ".netrw_option)
1904     if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
1905 "     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))
1906      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)
1907     else
1908 "     call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1))
1909      exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1)
1910     endif
1912     let result          = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
1913     let b:netrw_lastfile = choice
1914 "    call Decho("(NetRead) setl ro")
1915     setl ro
1917    ".........................................
1918    " NetRead: (sftp) NetRead Method #9 {{{3
1919    elseif     b:netrw_method  == 9
1920 "    call Decho("read via sftp (method #9)")
1921 "    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
1922     exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile
1923     let result          = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
1924     let b:netrw_lastfile = choice
1926    ".........................................
1927    " NetRead: Complain {{{3
1928    else
1929     call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
1930    endif
1931   endwhile
1933   " NetRead: cleanup {{{3
1934   if exists("b:netrw_method")
1935 "   call Decho("cleanup b:netrw_method and b:netrw_fname")
1936    unlet b:netrw_method
1937    unlet b:netrw_fname
1938   endif
1939   if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't' && tmpfile !~ '.tar.xz$' && tmpfile !~ '.txz'
1940 "   call Decho("cleanup by deleting tmpfile<".tmpfile.">")
1941    keepj call s:NetrwDelete(tmpfile)
1942   endif
1943   keepj call s:NetrwOptionRestore("w:")
1945 "  call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
1946 endfun
1948 " ------------------------------------------------------------------------
1949 " netrw#NetWrite: responsible for writing a file over the net {{{2
1950 fun! netrw#NetWrite(...) range
1951 "  call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
1953   " NetWrite: option handling {{{3
1954   let mod= 0
1955   call s:NetrwOptionSave("w:")
1956   call s:NetrwSafeOptions()
1958   " NetWrite: Get Temporary Filename {{{3
1959   let tmpfile= s:GetTempfile("")
1960   if tmpfile == ""
1961 "   call Dret("netrw#NetWrite : unable to get a tempfile!")
1962    return
1963   endif
1965   if a:0 == 0
1966    let ichoice = 0
1967   else
1968    let ichoice = 1
1969   endif
1971   let curbufname= expand("%")
1972 "  call Decho("curbufname<".curbufname.">")
1973   if &binary
1974    " For binary writes, always write entire file.
1975    " (line numbers don't really make sense for that).
1976    " Also supports the writing of tar and zip files.
1977 "   call Decho("(write entire file) sil exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
1978    exe "sil keepj w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
1979   elseif g:netrw_cygwin
1980    " write (selected portion of) file to temporary
1981    let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','')
1982 "   call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile))
1983    exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
1984   else
1985    " write (selected portion of) file to temporary
1986 "   call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile))
1987    exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
1988   endif
1990   if curbufname == ""
1991    " if the file is [No Name], and one attempts to Nwrite it, the buffer takes
1992    " on the temporary file's name.  Deletion of the temporary file during
1993    " cleanup then causes an error message.
1994    0file!
1995   endif
1997   " NetWrite: while choice loop: {{{3
1998   while ichoice <= a:0
2000    " Process arguments: {{{4
2001    " attempt to repeat with previous host-file-etc
2002    if exists("b:netrw_lastfile") && a:0 == 0
2003 "    call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
2004     let choice = b:netrw_lastfile
2005     let ichoice= ichoice + 1
2006    else
2007     exe "let choice= a:" . ichoice
2009     " Reconstruct Choice if choice starts with '"'
2010     if match(choice,"?") == 0
2011      echomsg 'NetWrite Usage:"'
2012      echomsg ':Nwrite machine:path                        uses rcp'
2013      echomsg ':Nwrite "machine path"                      uses ftp with <.netrc>'
2014      echomsg ':Nwrite "machine id password path"          uses ftp'
2015      echomsg ':Nwrite dav://[user@]machine/path           uses cadaver'
2016      echomsg ':Nwrite fetch://[user@]machine/path         uses fetch'
2017      echomsg ':Nwrite ftp://machine[#port]/path           uses ftp  (autodetects <.netrc>)'
2018      echomsg ':Nwrite rcp://machine/path                  uses rcp'
2019      echomsg ':Nwrite rsync://[user@]machine/path         uses rsync'
2020      echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
2021      echomsg ':Nwrite sftp://[user@]machine/path          uses sftp'
2022      sleep 4
2023      break
2025     elseif match(choice,"^\"") != -1
2026      if match(choice,"\"$") != -1
2027        " case "..."
2028       let choice=strpart(choice,1,strlen(choice)-2)
2029      else
2030       "  case "... ... ..."
2031       let choice      = strpart(choice,1,strlen(choice)-1)
2032       let wholechoice = ""
2034       while match(choice,"\"$") == -1
2035        let wholechoice= wholechoice . " " . choice
2036        let ichoice    = ichoice + 1
2037        if choice > a:0
2038         if !exists("g:netrw_quiet")
2039          call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
2040         endif
2041 "        call Dret("netrw#NetWrite")
2042         return
2043        endif
2044        let choice= a:{ichoice}
2045       endwhile
2046       let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
2047      endif
2048     endif
2049    endif
2050    let ichoice= ichoice + 1
2051 "   call Decho("choice<" . choice . "> ichoice=".ichoice)
2053    " Determine method of write (ftp, rcp, etc) {{{4
2054    keepj call s:NetrwMethod(choice)
2055    if !exists("b:netrw_method") || b:netrw_method < 0
2056 "    call Dfunc("netrw#NetWrite : unsupported method")
2057     return
2058    endif
2060    " =============
2061    " NetWrite: Perform Protocol-Based Write {{{3
2062    " ============================
2063    if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
2064     echo "(netrw) Processing your write request..."
2065 "    call Decho("(netrw) Processing your write request...")
2066    endif
2068    ".........................................
2069    " NetWrite: (rcp) NetWrite Method #1 {{{3
2070    if  b:netrw_method == 1
2071 "    call Decho("write via rcp (method #1)")
2072     if s:netrw_has_nt_rcp == 1
2073      if exists("g:netrw_uid") &&  ( g:netrw_uid != "" )
2074       let uid_machine = g:netrw_machine .'.'. g:netrw_uid
2075      else
2076       let uid_machine = g:netrw_machine .'.'. $USERNAME
2077      endif
2078     else
2079      if exists("g:netrw_uid") &&  ( g:netrw_uid != "" )
2080       let uid_machine = g:netrw_uid .'@'. g:netrw_machine
2081      else
2082       let uid_machine = g:netrw_machine
2083      endif
2084     endif
2085 "    call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1))
2086     exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1)
2087     let b:netrw_lastfile = choice
2089    ".........................................
2090    " NetWrite: (ftp + <.netrc>) NetWrite Method #2 {{{3
2091    elseif b:netrw_method == 2
2092 "    call Decho("write via ftp+.netrc (method #2)")
2093     let netrw_fname = b:netrw_fname
2095     " formerly just a "new...bd!", that changed the window sizes when equalalways.  Using enew workaround instead
2096     let bhkeep      = &l:bh
2097     let curbuf      = bufnr("%")
2098     setl bh=hide
2099     keepalt enew
2101 "    call Decho("filter input window#".winnr())
2102     setl ff=unix
2103     keepj put =g:netrw_ftpmode
2104 "    call Decho("filter input: ".getline('$'))
2105     if exists("g:netrw_ftpextracmd")
2106      keepj put =g:netrw_ftpextracmd
2107 "     call Decho("filter input: ".getline("$"))
2108     endif
2109     keepj call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"')
2110 "    call Decho("filter input: ".getline("$"))
2111     if exists("g:netrw_port") && g:netrw_port != ""
2112 "     call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
2113      exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
2114     else
2115 "     call Decho("filter input window#".winnr())
2116 "     call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
2117      exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
2118     endif
2119     " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
2120     if getline(1) !~ "^$"
2121      if !exists("g:netrw_quiet")
2122       keepj call netrw#ErrorMsg(s:ERROR,getline(1),14)
2123      endif
2124      let mod=1
2125     endif
2127     " remove enew buffer (quietly)
2128     let filtbuf= bufnr("%")
2129     exe curbuf."b!"
2130     let &l:bh            = bhkeep
2131     exe filtbuf."bw!"
2133     let b:netrw_lastfile = choice
2135    ".........................................
2136    " NetWrite: (ftp + machine, id, passwd, filename) NetWrite Method #3 {{{3
2137    elseif b:netrw_method == 3
2138     " Construct execution string (three or more lines) which will be passed through filter
2139 "    call Decho("read via ftp+mipf (method #3)")
2140     let netrw_fname = b:netrw_fname
2141     let bhkeep      = &l:bh
2143     " formerly just a "new...bd!", that changed the window sizes when equalalways.  Using enew workaround instead
2144     let curbuf      = bufnr("%")
2145     setl bh=hide
2146     keepalt enew
2147     setl ff=unix
2149     if exists("g:netrw_port") && g:netrw_port != ""
2150      keepj put ='open '.g:netrw_machine.' '.g:netrw_port
2151 "     call Decho("filter input: ".getline('.'))
2152     else
2153      keepj put ='open '.g:netrw_machine
2154 "     call Decho("filter input: ".getline('.'))
2155     endif
2156     if exists("g:netrw_uid") && g:netrw_uid != ""
2157      if exists("g:netrw_ftp") && g:netrw_ftp == 1
2158       keepj put =g:netrw_uid
2159 "      call Decho("filter input: ".getline('.'))
2160       if exists("s:netrw_passwd") && s:netrw_passwd != ""
2161        keepj put ='\"'.s:netrw_passwd.'\"'
2162       endif
2163 "      call Decho("filter input: ".getline('.'))
2164      elseif exists("s:netrw_passwd") && s:netrw_passwd != ""
2165       keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
2166 "      call Decho("filter input: ".getline('.'))
2167      endif
2168     endif
2169     keepj put =g:netrw_ftpmode
2170 "    call Decho("filter input: ".getline('$'))
2171     if exists("g:netrw_ftpextracmd")
2172      keepj put =g:netrw_ftpextracmd
2173 "     call Decho("filter input: ".getline("$"))
2174     endif
2175     keepj put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
2176 "    call Decho("filter input: ".getline('.'))
2177     " save choice/id/password for future use
2178     let b:netrw_lastfile = choice
2180     " perform ftp:
2181     " -i       : turns off interactive prompting from ftp
2182     " -n  unix : DON'T use <.netrc>, even though it exists
2183     " -n  win32: quit being obnoxious about password
2184     keepj norm! 1Gdd
2185 "    call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
2186     exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
2187     " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
2188     if getline(1) !~ "^$"
2189      if  !exists("g:netrw_quiet")
2190       call netrw#ErrorMsg(s:ERROR,getline(1),15)
2191      endif
2192      let mod=1
2193     endif
2195     " remove enew buffer (quietly)
2196     let filtbuf= bufnr("%")
2197     exe curbuf."b!"
2198     let &l:bh= bhkeep
2199     exe filtbuf."bw!"
2201    ".........................................
2202    " NetWrite: (scp) NetWrite Method #4 {{{3
2203    elseif     b:netrw_method == 4
2204 "    call Decho("write via scp (method #4)")
2205     if exists("g:netrw_port") && g:netrw_port != ""
2206      let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
2207     else
2208      let useport= ""
2209     endif
2210 "    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
2211     exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)
2212     let b:netrw_lastfile = choice
2214    ".........................................
2215    " NetWrite: (http) NetWrite Method #5 {{{3
2216    elseif     b:netrw_method == 5
2217 "    call Decho("write via http (method #5)")
2218     if !exists("g:netrw_quiet")
2219      call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16)
2220     endif
2222    ".........................................
2223    " NetWrite: (dav) NetWrite Method #6 (cadaver) {{{3
2224    elseif     b:netrw_method == 6
2225 "    call Decho("write via cadaver (method #6)")
2227     " Construct execution string (four lines) which will be passed through filter
2228     let netrw_fname = escape(b:netrw_fname,g:netrw_fname_escape)
2229     let bhkeep      = &l:bh
2231     " formerly just a "new...bd!", that changed the window sizes when equalalways.  Using enew workaround instead
2232     let curbuf      = bufnr("%")
2233     setl bh=hide
2234     keepalt enew
2236     setl ff=unix
2237     if exists("g:netrw_port") && g:netrw_port != ""
2238      keepj put ='open '.g:netrw_machine.' '.g:netrw_port
2239     else
2240      keepj put ='open '.g:netrw_machine
2241     endif
2242     if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
2243      keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
2244     endif
2245     keepj put ='put '.tmpfile.' '.netrw_fname
2247     " perform cadaver operation:
2248     keepj norm! 1Gdd
2249 "    call Decho("executing: %!".g:netrw_dav_cmd)
2250     exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
2252     " remove enew buffer (quietly)
2253     let filtbuf= bufnr("%")
2254     exe curbuf."b!"
2255     let &l:bh            = bhkeep
2256     exe filtbuf."bw!"
2258     let b:netrw_lastfile = choice
2260    ".........................................
2261    " NetWrite: (rsync) NetWrite Method #7 {{{3
2262    elseif     b:netrw_method == 7
2263 "    call Decho("write via rsync (method #7)")
2264 "    call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1))
2265     exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)
2266     let b:netrw_lastfile = choice
2268    ".........................................
2269    " NetWrite: (sftp) NetWrite Method #9 {{{3
2270    elseif     b:netrw_method == 9
2271 "    call Decho("write via sftp (method #9)")
2272     let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
2273     if exists("g:netrw_uid") &&  ( g:netrw_uid != "" )
2274      let uid_machine = g:netrw_uid .'@'. g:netrw_machine
2275     else
2276      let uid_machine = g:netrw_machine
2277     endif
2279     " formerly just a "new...bd!", that changed the window sizes when equalalways.  Using enew workaround instead
2280     let bhkeep = &l:bh
2281     let curbuf = bufnr("%")
2282     setl bh=hide
2283     keepalt enew
2285     setl ff=unix
2286     call setline(1,'put "'.escape(tmpfile,'\').'" '.netrw_fname)
2287 "    call Decho("filter input: ".getline('.'))
2288 "    call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1))
2289     let sftpcmd= substitute(g:netrw_sftp_cmd,"%TEMPFILE%",escape(tmpfile,'\'),"g")
2290     exe s:netrw_silentxfer."%!".sftpcmd.' '.shellescape(uid_machine,1)
2291     let filtbuf= bufnr("%")
2292     exe curbuf."b!"
2293     let &l:bh            = bhkeep
2294     exe filtbuf."bw!"
2295     let b:netrw_lastfile = choice
2297    ".........................................
2298    " NetWrite: Complain {{{3
2299    else
2300     call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
2301     let leavemod= 1
2302    endif
2303   endwhile
2305   " NetWrite: Cleanup: {{{3
2306 "  call Decho("cleanup")
2307   if s:FileReadable(tmpfile)
2308 "   call Decho("tmpfile<".tmpfile."> readable, will now delete it")
2309    call s:NetrwDelete(tmpfile)
2310   endif
2311   call s:NetrwOptionRestore("w:")
2313   if a:firstline == 1 && a:lastline == line("$")
2314    " restore modifiability; usually equivalent to set nomod
2315    let &mod= mod
2316 "   call Decho("(NetWrite)  ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
2317   elseif !exists("leavemod")
2318    " indicate that the buffer has not been modified since last written
2319 "   call Decho("(NetWrite) set nomod")
2320    set nomod
2321 "   call Decho("(NetWrite)  ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
2322   endif
2324 "  call Dret("netrw#NetWrite")
2325 endfun
2327 " ---------------------------------------------------------------------
2328 " netrw#NetSource: source a remotely hosted vim script {{{2
2329 " uses NetRead to get a copy of the file into a temporarily file,
2330 "              then sources that file,
2331 "              then removes that file.
2332 fun! netrw#NetSource(...)
2333 "  call Dfunc("netrw#NetSource() a:0=".a:0)
2334   if a:0 > 0 && a:1 == '?'
2335    " give help
2336    echomsg 'NetSource Usage:'
2337    echomsg ':Nsource dav://machine[:port]/path            uses cadaver'
2338    echomsg ':Nsource fetch://machine/path                 uses fetch'
2339    echomsg ':Nsource ftp://[user@]machine[:port]/path     uses ftp   autodetects <.netrc>'
2340    echomsg ':Nsource http[s]://[user@]machine/path        uses http  wget'
2341    echomsg ':Nsource rcp://[user@]machine/path            uses rcp'
2342    echomsg ':Nsource rsync://machine[:port]/path          uses rsync'
2343    echomsg ':Nsource scp://[user@]machine[[:#]port]/path  uses scp'
2344    echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
2345    sleep 4
2346   else
2347    let i= 1
2348    while i <= a:0
2349     call netrw#NetRead(3,a:{i})
2350 "    call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">")
2351     if s:FileReadable(s:netrw_tmpfile)
2352 "     call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile))
2353      exe "so ".fnameescape(s:netrw_tmpfile)
2354 "     call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")")
2355      call delete(s:netrw_tmpfile)
2356      unlet s:netrw_tmpfile
2357     else
2358      call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
2359     endif
2360     let i= i + 1
2361    endwhile
2362   endif
2363 "  call Dret("netrw#NetSource")
2364 endfun
2366 " ===========================================
2367 " s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
2368 "    readcmd == %r : replace buffer with newly read file
2369 "            == 0r : read file at top of buffer
2370 "            == r  : read file after current line
2371 "            == t  : leave file in temporary form (ie. don't read into buffer)
2372 fun! s:NetrwGetFile(readcmd, tfile, method)
2373 "  call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
2375   " readcmd=='t': simply do nothing
2376   if a:readcmd == 't'
2377 "   call Decho("(NetrwGetFile)  ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
2378 "   call Dret("NetrwGetFile : skip read of <".a:tfile.">")
2379    return
2380   endif
2382   " get name of remote filename (ie. url and all)
2383   let rfile= bufname("%")
2384 "  call Decho("rfile<".rfile.">")
2386   if exists("*NetReadFixup")
2387    " for the use of NetReadFixup (not otherwise used internally)
2388    let line2= line("$")
2389   endif
2391   if a:readcmd[0] == '%'
2392   " get file into buffer
2393 "   call Decho("get file into buffer")
2395    " rename the current buffer to the temp file (ie. tfile)
2396    if g:netrw_cygwin
2397     let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','')
2398    else
2399     let tfile= a:tfile
2400    endif
2401 "   call Decho("exe sil! keepalt file ".fnameescape(tfile))
2402    exe "sil! keepalt file ".fnameescape(tfile)
2404    " edit temporary file (ie. read the temporary file in)
2405    if     rfile =~ '\.zip$'
2406 "    call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)")
2407     call zip#Browse(tfile)
2408    elseif rfile =~ '\.tar$'
2409 "    call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)")
2410     call tar#Browse(tfile)
2411    elseif rfile =~ '\.tar\.gz$'
2412 "    call Decho("handling remote gzip-compressed tar file")
2413     call tar#Browse(tfile)
2414    elseif rfile =~ '\.tar\.bz2$'
2415 "    call Decho("handling remote bz2-compressed tar file")
2416     call tar#Browse(tfile)
2417    elseif rfile =~ '\.tar\.xz$'
2418 "    call Decho("handling remote xz-compressed tar file")
2419     call tar#Browse(tfile)
2420    elseif rfile =~ '\.txz$'
2421 "    call Decho("handling remote xz-compressed tar file (.txz)")
2422     call tar#Browse(tfile)
2423    else
2424 "    call Decho("edit temporary file")
2425     e!
2426    endif
2428    " rename buffer back to remote filename
2429 "   call Decho("exe sil! keepalt file ".fnameescape(rfile))
2430    exe "sil! keepj keepalt file ".fnameescape(rfile)
2432    " Detect filetype of local version of remote file.
2433    " Note that isk must not include a "/" for scripts.vim
2434    " to process this detection correctly.
2435 "   call Decho("detect filetype of local version of remote file")
2436    let iskkeep= &l:isk
2437    setl isk-=/
2438    let &l:isk= iskkeep
2439 "   call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
2440    let line1 = 1
2441    let line2 = line("$")
2443   elseif s:FileReadable(a:tfile)
2444    " read file after current line
2445 "   call Decho("read file<".a:tfile."> after current line")
2446    let curline = line(".")
2447    let lastline= line("$")
2448 "   call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile).">  line#".curline)
2449    exe "keepj ".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
2450    let line1= curline + 1
2451    let line2= line("$") - lastline + 1
2453   else
2454    " not readable
2455 "   call Decho("(NetrwGetFile)  ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
2456 "   call Decho("tfile<".a:tfile."> not readable")
2457    keepj call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
2458 "   call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
2459    return
2460   endif
2462   " User-provided (ie. optional) fix-it-up command
2463   if exists("*NetReadFixup")
2464 "   call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
2465    keepj call NetReadFixup(a:method, line1, line2)
2466 "  else " Decho
2467 "   call Decho("NetReadFixup() not called, doesn't exist  (line1=".line1." line2=".line2.")")
2468   endif
2470   if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
2471    " update the Buffers menu
2472    keepj call s:UpdateBuffersMenu()
2473   endif
2475 "  call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
2477  " make sure file is being displayed
2478 "  redraw!
2480 "  call Decho("(NetrwGetFile)  ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
2481 "  call Dret("NetrwGetFile")
2482 endfun
2484 " ------------------------------------------------------------------------
2485 " s:NetrwMethod:  determine method of transfer {{{2
2486 " Input:
2487 "   choice = url   [protocol:]//[userid@]hostname[:port]/[path-to-file]
2488 " Output:
2489 "  b:netrw_method= 1: rcp                                             
2490 "                  2: ftp + <.netrc>                                  
2491 "                  3: ftp + machine, id, password, and [path]filename 
2492 "                  4: scp                                             
2493 "                  5: http[s] (wget)                                     
2494 "                  6: dav
2495 "                  7: rsync                                           
2496 "                  8: fetch                                           
2497 "                  9: sftp                                            
2498 "  g:netrw_machine= hostname
2499 "  b:netrw_fname  = filename
2500 "  g:netrw_port   = optional port number (for ftp)
2501 "  g:netrw_choice = copy of input url (choice)
2502 fun! s:NetrwMethod(choice)
2503 "   call Dfunc("NetrwMethod(a:choice<".a:choice.">)")
2505    " sanity check: choice should have at least three slashes in it
2506    if strlen(substitute(a:choice,'[^/]','','g')) < 3
2507     call netrw#ErrorMsg(s:ERROR,"not a netrw-style url; netrw uses protocol://[user@]hostname[:port]/[path])",78)
2508     let b:netrw_method = -1
2509 "    call Dret("NetrwMethod : incorrect url format<".a:choice.">")
2510     return
2511    endif
2513    " record current g:netrw_machine, if any
2514    " curmachine used if protocol == ftp and no .netrc
2515    if exists("g:netrw_machine")
2516     let curmachine= g:netrw_machine
2517 "    call Decho("curmachine<".curmachine.">")
2518    else
2519     let curmachine= "N O T A HOST"
2520    endif
2521    if exists("g:netrw_port")
2522     let netrw_port= g:netrw_port
2523    endif
2525    " insure that netrw_ftp_cmd starts off every method determination
2526    " with the current g:netrw_ftp_cmd
2527    let s:netrw_ftp_cmd= g:netrw_ftp_cmd
2529   " initialization
2530   let b:netrw_method  = 0
2531   let g:netrw_machine = ""
2532   let b:netrw_fname   = ""
2533   let g:netrw_port    = ""
2534   let g:netrw_choice  = a:choice
2536   " Patterns:
2537   " mipf     : a:machine a:id password filename      Use ftp
2538   " mf      : a:machine filename                     Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
2539   " ftpurm   : ftp://[user@]host[[#:]port]/filename  Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
2540   " rcpurm   : rcp://[user@]host/filename            Use rcp
2541   " rcphf    : [user@]host:filename                  Use rcp
2542   " scpurm   : scp://[user@]host[[#:]port]/filename  Use scp
2543   " httpurm  : http[s]://[user@]host/filename        Use wget
2544   " davurm   : dav[s]://host[:port]/path             Use cadaver/curl
2545   " rsyncurm : rsync://host[:port]/path              Use rsync
2546   " fetchurm : fetch://[user@]host[:http]/filename   Use fetch (defaults to ftp, override for http)
2547   " sftpurm  : sftp://[user@]host/filename  Use scp
2548   let mipf     = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
2549   let mf       = '^\(\S\+\)\s\+\(\S\+\)$'
2550 "  let ftpurm   = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2551 "  let rcpurm   = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
2552 "  let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2553   let ftpurm   = '^ftp://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
2554   let rcpurm   = '^rcp://\%(\([^/]*\)@\)\=\([^/]\{-}\)/\(.*\)$'
2555   let rcphf    = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
2556   let scpurm   = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
2557   let httpurm  = '^https\=://\([^/]\{-}\)\(/.*\)\=$'
2558   let davurm   = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
2559   let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
2560   let fetchurm = '^fetch://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
2561   let sftpurm  = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
2563 "  call Decho("determine method:")
2564   " Determine Method
2565   " Method#1: rcp://user@hostname/...path-to-file {{{3
2566   if match(a:choice,rcpurm) == 0
2567 "   call Decho("rcp://...")
2568    let b:netrw_method  = 1
2569    let userid          = substitute(a:choice,rcpurm,'\1',"")
2570    let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
2571    let b:netrw_fname   = substitute(a:choice,rcpurm,'\3',"")
2572    if userid != ""
2573     let g:netrw_uid= userid
2574    endif
2576   " Method#4: scp://user@hostname/...path-to-file {{{3
2577   elseif match(a:choice,scpurm) == 0
2578 "   call Decho("scp://...")
2579    let b:netrw_method  = 4
2580    let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
2581    let g:netrw_port    = substitute(a:choice,scpurm,'\2',"")
2582    let b:netrw_fname   = substitute(a:choice,scpurm,'\3',"")
2584   " Method#5: http[s]://user@hostname/...path-to-file {{{3
2585   elseif match(a:choice,httpurm) == 0
2586 "   call Decho("http://...")
2587    let b:netrw_method = 5
2588    let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
2589    let b:netrw_fname  = substitute(a:choice,httpurm,'\2',"")
2591   " Method#6: dav://hostname[:port]/..path-to-file.. {{{3
2592   elseif match(a:choice,davurm) == 0
2593 "   call Decho("dav://...")
2594    let b:netrw_method= 6
2595    if a:choice =~ 'davs:'
2596     let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
2597    else
2598     let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
2599    endif
2600    let b:netrw_fname  = substitute(a:choice,davurm,'\3',"")
2602    " Method#7: rsync://user@hostname/...path-to-file {{{3
2603   elseif match(a:choice,rsyncurm) == 0
2604 "   call Decho("rsync://...")
2605    let b:netrw_method = 7
2606    let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
2607    let b:netrw_fname  = substitute(a:choice,rsyncurm,'\2',"")
2609    " Methods 2,3: ftp://[user@]hostname[[:#]port]/...path-to-file {{{3
2610   elseif match(a:choice,ftpurm) == 0
2611 "   call Decho("ftp://...")
2612    let userid         = substitute(a:choice,ftpurm,'\2',"")
2613    let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
2614    let g:netrw_port   = substitute(a:choice,ftpurm,'\4',"")
2615    let b:netrw_fname  = substitute(a:choice,ftpurm,'\5',"")
2616 "   call Decho("g:netrw_machine<".g:netrw_machine.">")
2617    if userid != ""
2618     let g:netrw_uid= userid
2619    endif
2621    if curmachine != g:netrw_machine
2622     if exists("s:netwr_hup[".g:netrw_machine."]")
2623      call NetUserPass("ftp:".g:netrw_machine)
2624     elseif exists("s:netrw_passwd")
2625      " if there's a change in hostname, require password re-entry
2626      unlet s:netrw_passwd
2627     endif
2628     if exists("netrw_port")
2629      unlet netrw_port
2630     endif
2631    endif
2633    if exists("g:netrw_uid") && exists("s:netrw_passwd")
2634     let b:netrw_method = 3
2635    else
2636     let host= substitute(g:netrw_machine,'\..*$','','')
2637     if exists("s:netrw_hup[host]")
2638      call NetUserPass("ftp:".host)
2640     elseif (has("win32") || has("win95") || has("win64") || has("win16")) && s:netrw_ftp_cmd =~ '-[sS]:'
2641 "     call Decho("has -s: : s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
2642 "     call Decho("          g:netrw_ftp_cmd<".g:netrw_ftp_cmd.">")
2643      if g:netrw_ftp_cmd =~ '-[sS]:\S*MACHINE\>'
2644       let s:netrw_ftp_cmd= substitute(g:netrw_ftp_cmd,'\<MACHINE\>',g:netrw_machine,'')
2645 "      call Decho("s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">")
2646      endif
2647      let b:netrw_method= 2
2648     elseif s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
2649 "     call Decho("using <".expand("$HOME/.netrc")."> (readable)")
2650      let b:netrw_method= 2
2651     else
2652      if !exists("g:netrw_uid") || g:netrw_uid == ""
2653       call NetUserPass()
2654      elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
2655       call NetUserPass(g:netrw_uid)
2656     " else just use current g:netrw_uid and s:netrw_passwd
2657      endif
2658      let b:netrw_method= 3
2659     endif
2660    endif
2662   " Method#8: fetch {{{3
2663   elseif match(a:choice,fetchurm) == 0
2664 "   call Decho("fetch://...")
2665    let b:netrw_method = 8
2666    let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
2667    let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
2668    let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
2669    let b:netrw_fname  = substitute(a:choice,fetchurm,'\5',"")
2671    " Method#3: Issue an ftp : "machine id password [path/]filename" {{{3
2672   elseif match(a:choice,mipf) == 0
2673 "   call Decho("(ftp) host id pass file")
2674    let b:netrw_method  = 3
2675    let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
2676    let g:netrw_uid     = substitute(a:choice,mipf,'\2',"")
2677    let s:netrw_passwd  = substitute(a:choice,mipf,'\3',"")
2678    let b:netrw_fname   = substitute(a:choice,mipf,'\4',"")
2679    call NetUserPass(g:netrw_machine,g:netrw_uid,s:netrw_passwd)
2681   " Method#3: Issue an ftp: "hostname [path/]filename" {{{3
2682   elseif match(a:choice,mf) == 0
2683 "   call Decho("(ftp) host file")
2684    if exists("g:netrw_uid") && exists("s:netrw_passwd")
2685     let b:netrw_method  = 3
2686     let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2687     let b:netrw_fname   = substitute(a:choice,mf,'\2',"")
2689    elseif s:FileReadable(expand("$HOME/.netrc"))
2690     let b:netrw_method  = 2
2691     let g:netrw_machine = substitute(a:choice,mf,'\1',"")
2692     let b:netrw_fname   = substitute(a:choice,mf,'\2',"")
2693    endif
2695   " Method#9: sftp://user@hostname/...path-to-file {{{3
2696   elseif match(a:choice,sftpurm) == 0
2697 "   call Decho("sftp://...")
2698    let b:netrw_method = 9
2699    let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
2700    let b:netrw_fname  = substitute(a:choice,sftpurm,'\2',"")
2702   " Method#1: Issue an rcp: hostname:filename"  (this one should be last) {{{3
2703   elseif match(a:choice,rcphf) == 0
2704 "   call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
2705    let b:netrw_method  = 1
2706    let userid          = substitute(a:choice,rcphf,'\2',"")
2707    let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
2708    let b:netrw_fname   = substitute(a:choice,rcphf,'\4',"")
2709 "   call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
2710 "   call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
2711 "   call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
2712 "   call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
2713    if userid != ""
2714     let g:netrw_uid= userid
2715    endif
2717   " Cannot Determine Method {{{3
2718   else
2719    if !exists("g:netrw_quiet")
2720     call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45)
2721    endif
2722    let b:netrw_method  = -1
2723   endif
2724   "}}}3
2726   if g:netrw_port != ""
2727    " remove any leading [:#] from port number
2728    let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
2729   elseif exists("netrw_port")
2730    " retain port number as implicit for subsequent ftp operations
2731    let g:netrw_port= netrw_port
2732   endif
2734 "  call Decho("a:choice       <".a:choice.">")
2735 "  call Decho("b:netrw_method <".b:netrw_method.">")
2736 "  call Decho("g:netrw_machine<".g:netrw_machine.">")
2737 "  call Decho("g:netrw_port   <".g:netrw_port.">")
2738 "  if exists("g:netrw_uid")             "Decho
2739 "   call Decho("g:netrw_uid    <".g:netrw_uid.">")
2740 "  endif                                        "Decho
2741 "  if exists("s:netrw_passwd")          "Decho
2742 "   call Decho("s:netrw_passwd <".s:netrw_passwd.">")
2743 "  endif                                        "Decho
2744 "  call Decho("b:netrw_fname  <".b:netrw_fname.">")
2745 "  call Dret("NetrwMethod : b:netrw_method=".b:netrw_method." g:netrw_port=".g:netrw_port)
2746 endfun
2748 " ------------------------------------------------------------------------
2749 " NetReadFixup: this sort of function is typically written by the user {{{2
2750 "               to handle extra junk that their system's ftp dumps
2751 "               into the transfer.  This function is provided as an
2752 "               example and as a fix for a Windows 95 problem: in my
2753 "               experience, win95's ftp always dumped four blank lines
2754 "               at the end of the transfer.
2755 if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
2756  fun! NetReadFixup(method, line1, line2)
2757 "   call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
2759    " sanity checks -- attempt to convert inputs to integers
2760    let method = a:method + 0
2761    let line1  = a:line1 + 0
2762    let line2  = a:line2 + 0
2763    if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0
2764 "    call Dret("NetReadFixup")
2765     return
2766    endif
2768    if method == 3   " ftp (no <.netrc>)
2769     let fourblanklines= line2 - 3
2770     if fourblanklines >= line1
2771      exe "sil keepj ".fourblanklines.",".line2."g/^\s*$/d"
2772      call histdel("/",-1)
2773     endif
2774    endif
2776 "   call Dret("NetReadFixup")
2777  endfun
2778 endif
2780 " ---------------------------------------------------------------------
2781 " NetUserPass: set username and password for subsequent ftp transfer {{{2
2782 "   Usage:  :call NetUserPass()                        -- will prompt for userid and password
2783 "           :call NetUserPass("uid")                   -- will prompt for password
2784 "           :call NetUserPass("uid","password")        -- sets global userid and password
2785 "           :call NetUserPass("ftp:host")              -- looks up userid and password using hup dictionary
2786 "           :call NetUserPass("host","uid","password") -- sets hup dictionary with host, userid, password
2787 fun! NetUserPass(...)
2789 " call Dfunc("NetUserPass() a:0=".a:0)
2791  if !exists('s:netrw_hup')
2792   let s:netrw_hup= {}
2793  endif
2795  if a:0 == 0
2796   " case: no input arguments
2798   " change host and username if not previously entered; get new password
2799   if !exists("g:netrw_machine")
2800    let g:netrw_machine= input('Enter hostname: ')
2801   endif
2802   if !exists("g:netrw_uid") || g:netrw_uid == ""
2803    " get username (user-id) via prompt
2804    let g:netrw_uid= input('Enter username: ')
2805   endif
2806   " get password via prompting
2807   let s:netrw_passwd= inputsecret("Enter Password: ")
2809   " set up hup database
2810   let host = substitute(g:netrw_machine,'\..*$','','')
2811   if !exists('s:netrw_hup[host]')
2812    let s:netrw_hup[host]= {}
2813   endif
2814   let s:netrw_hup[host].uid    = g:netrw_uid
2815   let s:netrw_hup[host].passwd = s:netrw_passwd
2817  elseif a:0 == 1
2818   " case: one input argument
2820   if a:1 =~ '^ftp:'
2821    " get host from ftp:... url
2822    " access userid and password from hup (host-user-passwd) dictionary
2823    let host = substitute(a:1,'^ftp:','','')
2824    let host = substitute(host,'\..*','','')
2825    if exists("s:netrw_hup[host]")
2826     let g:netrw_uid    = s:netrw_hup[host].uid
2827     let s:netrw_passwd = s:netrw_hup[host].passwd
2828 "    call Decho("get s:netrw_hup[".host."].uid   <".s:netrw_hup[host].uid.">")
2829 "    call Decho("get s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">")
2830    else
2831     let g:netrw_uid    = input("Enter UserId: ")
2832     let s:netrw_passwd = inputsecret("Enter Password: ")
2833    endif
2835   else
2836    " case: one input argument, not an url.  Using it as a new user-id.
2837    if exists("g:netrw_machine")
2838     let host= substitute(g:netrw_machine,'\..*$','','')
2839    else
2840     let g:netrw_machine= input('Enter hostname: ')
2841    endif
2842    let g:netrw_uid = a:1
2843 "   call Decho("set g:netrw_uid= <".g:netrw_uid.">")
2844    if exists("g:netrw_passwd")
2845     " ask for password if one not previously entered
2846     let s:netrw_passwd= g:netrw_passwd
2847    else
2848     let s:netrw_passwd = inputsecret("Enter Password: ")
2849    endif
2850   endif
2852 "  call Decho("host<".host.">")
2853   if exists("host")
2854    if !exists('s:netrw_hup[host]')
2855     let s:netrw_hup[host]= {}
2856    endif
2857    let s:netrw_hup[host].uid    = g:netrw_uid
2858    let s:netrw_hup[host].passwd = s:netrw_passwd
2859   endif
2861  elseif a:0 == 2
2862   let g:netrw_uid    = a:1
2863   let s:netrw_passwd = a:2
2865  elseif a:0 == 3
2866   " enter hostname, user-id, and password into the hup dictionary
2867   let host = substitute(a:1,'^\a\+:','','')
2868   let host = substitute(host,'\..*$','','')
2869   if !exists('s:netrw_hup[host]')
2870    let s:netrw_hup[host]= {}
2871   endif
2872   let s:netrw_hup[host].uid    = a:2
2873   let s:netrw_hup[host].passwd = a:3
2874   let g:netrw_uid              = s:netrw_hup[host].uid
2875   let s:netrw_passwd           = s:netrw_hup[host].passwd
2876 "  call Decho("set s:netrw_hup[".host."].uid   <".s:netrw_hup[host].uid.">")
2877 "  call Decho("set s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">")
2878  endif
2880 " call Dret("NetUserPass : uid<".g:netrw_uid."> passwd<".s:netrw_passwd.">")
2881 endfun
2883 " ===========================================
2884 "  Shared Browsing Support:    {{{1
2885 " ===========================================
2887 " ---------------------------------------------------------------------
2888 " s:NetrwMaps: {{{2
2889 fun! s:NetrwMaps(islocal)
2890 "  call Dfunc("s:NetrwMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
2892   " set up Rexplore and [ 2-leftmouse-click -or- c-leftmouse ]
2893 "  call Decho("(NetrwMaps) set up Rexplore command")
2894   com! Rexplore if exists("w:netrw_rexlocal")|call s:NetrwRexplore(w:netrw_rexlocal,exists("w:netrw_rexdir")? w:netrw_rexdir : ".")|else|call netrw#ErrorMsg(s:WARNING,"not a former netrw window",79)|endif
2895   if g:netrw_mousemaps && g:netrw_retmap
2896 "   call Decho("(NetrwMaps) set up Rexplore 2-leftmouse")
2897    if !hasmapto("<Plug>NetrwReturn")
2898     if maparg("<2-leftmouse>","n") == "" || maparg("<2-leftmouse>","n") =~ '^-$'
2899 "     call Decho("(NetrwMaps) making map for 2-leftmouse")
2900      nmap <unique> <silent> <2-leftmouse>       <Plug>NetrwReturn
2901     elseif maparg("<c-leftmouse>","n") == ""
2902 "     call Decho("(NetrwMaps) making map for c-leftmouse")
2903      nmap <unique> <silent> <c-leftmouse>       <Plug>NetrwReturn
2904     endif
2905    endif
2906    nno <silent> <Plug>NetrwReturn       :Rexplore<cr>
2907 "   call Decho("(NetrwMaps) made <Plug>NetrwReturn map")
2908   endif
2910   if a:islocal
2911 "   call Decho("(NetrwMaps) make local maps")
2912    " local normal-mode maps
2913    nnoremap <buffer> <silent> a         :call <SID>NetrwHide(1)<cr>
2914    nnoremap <buffer> <silent> %         :call <SID>NetrwOpenFile(1)<cr>
2915    nnoremap <buffer> <silent> c         :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
2916    nnoremap <buffer> <silent> C         :let g:netrw_chgwin= winnr()<cr>
2917    nnoremap <buffer> <silent> <cr>      :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
2918    nnoremap <buffer> <silent> d         :call <SID>NetrwMakeDir("")<cr>
2919    nnoremap <buffer> <silent> -         :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
2920    nnoremap <buffer> <silent> gb        :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
2921    nnoremap <buffer> <silent> gd        :<c-u>call <SID>NetrwForceChgDir(1,<SID>NetrwGetWord())<cr>
2922    nnoremap <buffer> <silent> gf        :<c-u>call <SID>NetrwForceFile(1,<SID>NetrwGetWord())<cr>
2923    nnoremap <buffer> <silent> gh        :<c-u>call <SID>NetrwHidden(1)<cr>
2924    nnoremap <buffer> <silent> gp        :<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
2925    nnoremap <buffer> <silent> I         :call <SID>NetrwBannerCtrl(1)<cr>
2926    nnoremap <buffer> <silent> i         :call <SID>NetrwListStyle(1)<cr>
2927    nnoremap <buffer> <silent> mb        :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
2928    nnoremap <buffer> <silent> mB        :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
2929    nnoremap <buffer> <silent> mc        :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
2930    nnoremap <buffer> <silent> md        :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
2931    nnoremap <buffer> <silent> me        :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
2932    nnoremap <buffer> <silent> mf        :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
2933    nnoremap <buffer> <silent> mF        :<c-u>call <SID>NetrwUnmarkList(bufnr("%"),b:netrw_curdir)<cr>
2934    nnoremap <buffer> <silent> mg        :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
2935    nnoremap <buffer> <silent> mh        :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
2936    nnoremap <buffer> <silent> mm        :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
2937    nnoremap <buffer> <silent> mp        :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
2938    nnoremap <buffer> <silent> mr        :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
2939    nnoremap <buffer> <silent> ms        :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
2940    nnoremap <buffer> <silent> mt        :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
2941    nnoremap <buffer> <silent> mT        :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
2942    nnoremap <buffer> <silent> mu        :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
2943    nnoremap <buffer> <silent> mx        :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
2944    nnoremap <buffer> <silent> mX        :<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
2945    nnoremap <buffer> <silent> mz        :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
2946    nnoremap <buffer> <silent> O         :call <SID>NetrwObtain(1)<cr>
2947    nnoremap <buffer> <silent> o         :call <SID>NetrwSplit(3)<cr>
2948    nnoremap <buffer> <silent> p         :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2949    nnoremap <buffer> <silent> P         :call <SID>NetrwPrevWinOpen(1)<cr>
2950    nnoremap <buffer> <silent> qb        :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
2951    nnoremap <buffer> <silent> qf        :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
2952    nnoremap <buffer> <silent> qF        :<c-u>call <SID>NetrwMarkFileQFEL(1,getqflist())<cr>
2953    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>
2954    nnoremap <buffer> <silent> s         :call <SID>NetrwSortStyle(1)<cr>
2955    nnoremap <buffer> <silent> S         :call <SID>NetSortSequence(1)<cr>
2956    nnoremap <buffer> <silent> t         :call <SID>NetrwSplit(4)<cr>
2957    nnoremap <buffer> <silent> Tb        :<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
2958    nnoremap <buffer> <silent> Th        :<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
2959    nnoremap <buffer> <silent> u         :<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
2960    nnoremap <buffer> <silent> U         :<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
2961    nnoremap <buffer> <silent> v         :call <SID>NetrwSplit(5)<cr>
2962    nnoremap <buffer> <silent> x         :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
2963    nnoremap <buffer> <silent> X         :call <SID>NetrwLocalExecute(expand("<cword>"))"<cr>
2964    " local insert-mode maps
2965    inoremap <buffer> <silent> a         <c-o>:call <SID>NetrwHide(1)<cr>
2966    inoremap <buffer> <silent> c         <c-o>:exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
2967    inoremap <buffer> <silent> C         <c-o>:let g:netrw_chgwin= winnr()<cr>
2968    inoremap <buffer> <silent> %         <c-o>:call <SID>NetrwOpenFile(1)<cr>
2969    inoremap <buffer> <silent> -         <c-o>:exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
2970    inoremap <buffer> <silent> <cr>      <c-o>:call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
2971    inoremap <buffer> <silent> d         <c-o>:call <SID>NetrwMakeDir("")<cr>
2972    inoremap <buffer> <silent> gb        <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
2973    inoremap <buffer> <silent> gh        <c-o>:<c-u>call <SID>NetrwHidden(1)<cr>
2974    inoremap <buffer> <silent> gp        <c-o>:<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
2975    inoremap <buffer> <silent> I         <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
2976    inoremap <buffer> <silent> i         <c-o>:call <SID>NetrwListStyle(1)<cr>
2977    inoremap <buffer> <silent> mb        <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
2978    inoremap <buffer> <silent> mB        <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
2979    inoremap <buffer> <silent> mc        <c-o>:<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
2980    inoremap <buffer> <silent> md        <c-o>:<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
2981    inoremap <buffer> <silent> me        <c-o>:<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
2982    inoremap <buffer> <silent> mf        <c-o>:<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
2983    inoremap <buffer> <silent> mg        <c-o>:<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
2984    inoremap <buffer> <silent> mh        <c-o>:<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
2985    inoremap <buffer> <silent> mm        <c-o>:<c-u>call <SID>NetrwMarkFileMove(1)<cr>
2986    inoremap <buffer> <silent> mp        <c-o>:<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
2987    inoremap <buffer> <silent> mr        <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
2988    inoremap <buffer> <silent> ms        <c-o>:<c-u>call <SID>NetrwMarkFileSource(1)<cr>
2989    inoremap <buffer> <silent> mT        <c-o>:<c-u>call <SID>NetrwMarkFileTag(1)<cr>
2990    inoremap <buffer> <silent> mt        <c-o>:<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
2991    inoremap <buffer> <silent> mu        <c-o>:<c-u>call <SID>NetrwUnMarkFile(1)<cr>
2992    inoremap <buffer> <silent> mx        <c-o>:<c-u>call <SID>NetrwMarkFileExe(1)<cr>
2993    inoremap <buffer> <silent> mX        <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
2994    inoremap <buffer> <silent> mz        <c-o>:<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
2995    inoremap <buffer> <silent> O         <c-o>:call <SID>NetrwObtain(1)<cr>
2996    inoremap <buffer> <silent> o         <c-o>:call <SID>NetrwSplit(3)<cr>
2997    inoremap <buffer> <silent> p         <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
2998    inoremap <buffer> <silent> P         <c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
2999    inoremap <buffer> <silent> qb        <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
3000    inoremap <buffer> <silent> qf        <c-o>:<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
3001    inoremap <buffer> <silent> qF        :<c-u>call <SID>NetrwMarkFileQFEL(1,getqflist())<cr>
3002    inoremap <buffer> <silent> r         <c-o>: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>
3003    inoremap <buffer> <silent> s         <c-o>:call <SID>NetrwSortStyle(1)<cr>
3004    inoremap <buffer> <silent> S         <c-o>:call <SID>NetSortSequence(1)<cr>
3005    inoremap <buffer> <silent> t         <c-o>:call <SID>NetrwSplit(4)<cr>
3006    inoremap <buffer> <silent> Tb        <c-o>:<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
3007    inoremap <buffer> <silent> Th        <c-o>:<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
3008    inoremap <buffer> <silent> u         <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
3009    inoremap <buffer> <silent> U         <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
3010    inoremap <buffer> <silent> v         <c-o>:call <SID>NetrwSplit(5)<cr>
3011    inoremap <buffer> <silent> x         <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
3012    if !hasmapto('<Plug>NetrwHideEdit')
3013     nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
3014     imap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
3015    endif
3016    nnoremap <buffer> <silent> <Plug>NetrwHideEdit       :call <SID>NetrwHideEdit(1)<cr>
3017    if !hasmapto('<Plug>NetrwRefresh')
3018     nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
3019     imap <buffer> <unique> <c-l> <Plug>NetrwRefresh
3020    endif
3021    nnoremap <buffer> <silent> <Plug>NetrwRefresh                :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
3022    if s:didstarstar || !mapcheck("<s-down>","n")
3023     nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
3024     inoremap <buffer> <silent> <s-down> :Nexplore<cr>
3025    endif
3026    if s:didstarstar || !mapcheck("<s-up>","n")
3027     nnoremap <buffer> <silent> <s-up>   :Pexplore<cr>
3028     inoremap <buffer> <silent> <s-up>   :Pexplore<cr>
3029    endif
3030    let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
3031    if g:netrw_mousemaps == 1
3032     nmap <buffer> <leftmouse>   <Plug>NetrwLeftmouse
3033     nno  <buffer> <silent>      <Plug>NetrwLeftmouse    <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
3034     nmap <buffer> <s-rightdrag> <Plug>NetrwRightdrag
3035     nno  <buffer> <silent>      <Plug>NetrwRightdrag    <leftmouse>:call <SID>NetrwRightdrag(1)<cr>
3036     nmap <buffer> <middlemouse> <Plug>NetrwMiddlemouse
3037     nno  <buffer> <silent>      <Plug>NetrwMiddlemouse  <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
3038     nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
3039     nno  <buffer> <silent>      <Plug>NetrwSLeftmouse   <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
3040     nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
3041     nmap <buffer> <silent>      <Plug>Netrw2Leftmouse   -
3042     imap <buffer> <leftmouse>   <Plug>ILeftmouse
3043     ino  <buffer> <silent>      <Plug>ILeftmouse        <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(1)<cr>
3044     imap <buffer> <middlemouse> <Plug>IMiddlemouse
3045     ino  <buffer> <silent>      <Plug>IMiddlemouse      <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(1)<cr>
3046     imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
3047     ino  <buffer> <silent>      <Plug>ISLeftmouse       <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
3048     exe 'nnoremap <buffer> <silent> <rightmouse>  <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3049     exe 'vnoremap <buffer> <silent> <rightmouse>  <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3050     exe 'inoremap <buffer> <silent> <rightmouse>  <c-o><leftmouse><c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3051    endif
3052    exe 'nnoremap <buffer> <silent> <del>        :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3053    exe 'nnoremap <buffer> <silent> D            :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3054    exe 'nnoremap <buffer> <silent> R            :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
3055    exe 'nnoremap <buffer> <silent> <Leader>m    :call <SID>NetrwMakeDir("")<cr>'
3056    exe 'vnoremap <buffer> <silent> <del>        :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3057    exe 'vnoremap <buffer> <silent> D            :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3058    exe 'vnoremap <buffer> <silent> R            :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
3059    exe 'inoremap <buffer> <silent> <del>        <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3060    exe 'inoremap <buffer> <silent> D            <c-o>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
3061    exe 'inoremap <buffer> <silent> R            <c-o>:call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
3062    exe 'inoremap <buffer> <silent> <Leader>m    <c-o>:call <SID>NetrwMakeDir("")<cr>'
3063    nnoremap <buffer> <F1>               :he netrw-quickhelp<cr>
3065   else " remote
3066 "   call Decho("(NetrwMaps) make remote maps")
3067    call s:RemotePathAnalysis(b:netrw_curdir)
3068    " remote normal-mode maps
3069    nnoremap <buffer> <silent> <cr>      :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
3070    nnoremap <buffer> <silent> <c-l>     :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
3071    nnoremap <buffer> <silent> -         :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
3072    nnoremap <buffer> <silent> a         :call <SID>NetrwHide(0)<cr>
3073    nnoremap <buffer> <silent> mb        :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
3074    nnoremap <buffer> <silent> mc        :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
3075    nnoremap <buffer> <silent> md        :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
3076    nnoremap <buffer> <silent> me        :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
3077    nnoremap <buffer> <silent> mf        :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
3078    nnoremap <buffer> <silent> mF        :<c-u>call <SID>NetrwUnmarkList(bufnr("%"),b:netrw_curdir)<cr>
3079    nnoremap <buffer> <silent> mg        :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
3080    nnoremap <buffer> <silent> mh        :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
3081    nnoremap <buffer> <silent> mm        :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
3082    nnoremap <buffer> <silent> mp        :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
3083    nnoremap <buffer> <silent> mr        :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
3084    nnoremap <buffer> <silent> ms        :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
3085    nnoremap <buffer> <silent> mt        :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
3086    nnoremap <buffer> <silent> mT        :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
3087    nnoremap <buffer> <silent> mu        :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
3088    nnoremap <buffer> <silent> mx        :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
3089    nnoremap <buffer> <silent> mX        :<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
3090    nnoremap <buffer> <silent> mz        :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
3091    nnoremap <buffer> <silent> gb        :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
3092    nnoremap <buffer> <silent> gd        :<c-u>call <SID>NetrwForceChgDir(0,<SID>NetrwGetWord())<cr>
3093    nnoremap <buffer> <silent> gf        :<c-u>call <SID>NetrwForceFile(0,<SID>NetrwGetWord())<cr>
3094    nnoremap <buffer> <silent> gh        :<c-u>call <SID>NetrwHidden(0)<cr>
3095    nnoremap <buffer> <silent> gp        :<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
3096    nnoremap <buffer> <silent> C         :let g:netrw_chgwin= winnr()<cr>
3097    nnoremap <buffer> <silent> i         :call <SID>NetrwListStyle(0)<cr>
3098    nnoremap <buffer> <silent> I         :call <SID>NetrwBannerCtrl(1)<cr>
3099    nnoremap <buffer> <silent> o         :call <SID>NetrwSplit(0)<cr>
3100    nnoremap <buffer> <silent> O         :call <SID>NetrwObtain(0)<cr>
3101    nnoremap <buffer> <silent> p         :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
3102    nnoremap <buffer> <silent> P         :call <SID>NetrwPrevWinOpen(0)<cr>
3103    nnoremap <buffer> <silent> qb        :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
3104    nnoremap <buffer> <silent> mB        :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
3105    nnoremap <buffer> <silent> qf        :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
3106    nnoremap <buffer> <silent> qF        :<c-u>call <SID>NetrwMarkFileQFEL(0,getqflist())<cr>
3107    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>
3108    nnoremap <buffer> <silent> s         :call <SID>NetrwSortStyle(0)<cr>
3109    nnoremap <buffer> <silent> S         :call <SID>NetSortSequence(0)<cr>
3110    nnoremap <buffer> <silent> t         :call <SID>NetrwSplit(1)<cr>
3111    nnoremap <buffer> <silent> Tb        :<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
3112    nnoremap <buffer> <silent> Th        :<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
3113    nnoremap <buffer> <silent> u         :<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
3114    nnoremap <buffer> <silent> U         :<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
3115    nnoremap <buffer> <silent> v         :call <SID>NetrwSplit(2)<cr>
3116    nnoremap <buffer> <silent> x         :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
3117    nnoremap <buffer> <silent> %         :call <SID>NetrwOpenFile(0)<cr>
3118    " remote insert-mode maps
3119    inoremap <buffer> <silent> <cr>      <c-o>:call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
3120    inoremap <buffer> <silent> <c-l>     <c-o>:call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
3121    inoremap <buffer> <silent> -         <c-o>:exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr>
3122    inoremap <buffer> <silent> a         <c-o>:call <SID>NetrwHide(0)<cr>
3123    inoremap <buffer> <silent> mb        <c-o>:<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
3124    inoremap <buffer> <silent> mc        <c-o>:<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
3125    inoremap <buffer> <silent> md        <c-o>:<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
3126    inoremap <buffer> <silent> me        <c-o>:<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
3127    inoremap <buffer> <silent> mf        <c-o>:<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
3128    inoremap <buffer> <silent> mg        <c-o>:<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
3129    inoremap <buffer> <silent> mh        <c-o>:<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
3130    inoremap <buffer> <silent> mm        <c-o>:<c-u>call <SID>NetrwMarkFileMove(0)<cr>
3131    inoremap <buffer> <silent> mp        <c-o>:<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
3132    inoremap <buffer> <silent> mr        <c-o>:<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
3133    inoremap <buffer> <silent> ms        <c-o>:<c-u>call <SID>NetrwMarkFileSource(0)<cr>
3134    inoremap <buffer> <silent> mt        <c-o>:<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
3135    inoremap <buffer> <silent> mT        <c-o>:<c-u>call <SID>NetrwMarkFileTag(0)<cr>
3136    inoremap <buffer> <silent> mu        <c-o>:<c-u>call <SID>NetrwUnMarkFile(0)<cr>
3137    inoremap <buffer> <silent> mx        <c-o>:<c-u>call <SID>NetrwMarkFileExe(0)<cr>
3138    inoremap <buffer> <silent> mX        <c-o>:<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
3139    inoremap <buffer> <silent> mz        <c-o>:<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
3140    inoremap <buffer> <silent> gb        <c-o>:<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
3141    inoremap <buffer> <silent> gh        <c-o>:<c-u>call <SID>NetrwHidden(0)<cr>
3142    inoremap <buffer> <silent> gp        <c-o>:<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
3143    inoremap <buffer> <silent> C         <c-o>:let g:netrw_chgwin= winnr()<cr>
3144    inoremap <buffer> <silent> i         <c-o>:call <SID>NetrwListStyle(0)<cr>
3145    inoremap <buffer> <silent> I         <c-o>:call <SID>NetrwBannerCtrl(1)<cr>
3146    inoremap <buffer> <silent> o         <c-o>:call <SID>NetrwSplit(0)<cr>
3147    inoremap <buffer> <silent> O         <c-o>:call <SID>NetrwObtain(0)<cr>
3148    inoremap <buffer> <silent> p         <c-o>:call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
3149    inoremap <buffer> <silent> P         <c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
3150    inoremap <buffer> <silent> qb        <c-o>:<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
3151    inoremap <buffer> <silent> mB        <c-o>:<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
3152    inoremap <buffer> <silent> qf        <c-o>:<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
3153    inoremap <buffer> <silent> qF        :<c-u>call <SID>NetrwMarkFileQFEL(0,getqflist())<cr>
3154    inoremap <buffer> <silent> r         <c-o>: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>
3155    inoremap <buffer> <silent> s         <c-o>:call <SID>NetrwSortStyle(0)<cr>
3156    inoremap <buffer> <silent> S         <c-o>:call <SID>NetSortSequence(0)<cr>
3157    inoremap <buffer> <silent> t         <c-o>:call <SID>NetrwSplit(1)<cr>
3158    inoremap <buffer> <silent> Tb        <c-o>:<c-u>call <SID>NetrwSetTgt('b',v:count1)<cr>
3159    inoremap <buffer> <silent> Th        <c-o>:<c-u>call <SID>NetrwSetTgt('h',v:count)<cr>
3160    inoremap <buffer> <silent> u         <c-o>:<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
3161    inoremap <buffer> <silent> U         <c-o>:<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
3162    inoremap <buffer> <silent> v         <c-o>:call <SID>NetrwSplit(2)<cr>
3163    inoremap <buffer> <silent> x         <c-o>:call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
3164    inoremap <buffer> <silent> %         <c-o>:call <SID>NetrwOpenFile(0)<cr>
3165    if !hasmapto('<Plug>NetrwHideEdit')
3166     nmap <buffer> <c-h> <Plug>NetrwHideEdit
3167     imap <buffer> <c-h> <Plug>NetrwHideEdit
3168    endif
3169    nnoremap <buffer> <silent> <Plug>NetrwHideEdit       :call <SID>NetrwHideEdit(0)<cr>
3170    if !hasmapto('<Plug>NetrwRefresh')
3171     nmap <buffer> <c-l> <Plug>NetrwRefresh
3172     imap <buffer> <c-l> <Plug>NetrwRefresh
3173    endif
3175    let mapsafepath     = escape(s:path, s:netrw_map_escape)
3176    let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape)
3178    nnoremap <buffer> <silent> <Plug>NetrwRefresh        :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
3179    if g:netrw_mousemaps == 1
3180     nmap <leftmouse>            <Plug>NetrwLeftmouse
3181     nno <buffer> <silent>       <Plug>NetrwLeftmouse    <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
3182     nmap <buffer> <leftdrag>    <Plug>NetrwLeftdrag
3183     nno  <buffer> <silent>      <Plug>NetrwLeftdrag     :call <SID>NetrwLeftdrag(0)<cr>
3184     nmap <middlemouse>          <Plug>NetrwMiddlemouse
3185     nno  <buffer> <silent>      <middlemouse>           <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
3186     nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
3187     nno  <buffer> <silent>      <Plug>NetrwSLeftmouse   <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
3188     nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
3189     nmap <buffer> <silent>      <Plug>Netrw2Leftmouse   -
3190     imap <buffer> <leftmouse>   <Plug>ILeftmouse
3191     ino  <buffer> <silent>      <Plug>ILeftmouse        <c-o><leftmouse><c-o>:call <SID>NetrwLeftmouse(0)<cr>
3192     imap <buffer> <middlemouse> <Plug>IMiddlemouse
3193     ino  <buffer> <silent>      <Plug>IMiddlemouse      <c-o><leftmouse><c-o>:call <SID>NetrwPrevWinOpen(0)<cr>
3194     imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
3195     ino  <buffer> <silent>      <Plug>ISLeftmouse       <c-o><leftmouse><c-o>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
3196     exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3197     exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3198     exe 'inoremap <buffer> <silent> <rightmouse> <c-o><leftmouse><c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3199    endif
3200    exe 'nnoremap <buffer> <silent> <del>        :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3201    exe 'nnoremap <buffer> <silent> d            :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
3202    exe 'nnoremap <buffer> <silent> D            :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3203    exe 'nnoremap <buffer> <silent> R            :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3204    exe 'vnoremap <buffer> <silent> <del>        :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3205    exe 'vnoremap <buffer> <silent> D            :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3206    exe 'vnoremap <buffer> <silent> R            :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3207    exe 'inoremap <buffer> <silent> <del>        <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3208    exe 'inoremap <buffer> <silent> d            <c-o>:call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
3209    exe 'inoremap <buffer> <silent> D            <c-o>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3210    exe 'inoremap <buffer> <silent> R            <c-o>:call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
3211    nnoremap <buffer> <F1>                       :he netrw-quickhelp<cr>
3212    inoremap <buffer> <F1>                       <c-o>:he netrw-quickhelp<cr>
3213   endif
3215   keepj call s:SetRexDir(a:islocal,b:netrw_curdir)
3217 "  call Dret("s:NetrwMaps")
3218 endfun
3220 " ---------------------------------------------------------------------
3221 " s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
3222 fun! s:ExplorePatHls(pattern)
3223 "  call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
3224   let repat= substitute(a:pattern,'^**/\{1,2}','','')
3225 "  call Decho("repat<".repat.">")
3226   let repat= escape(repat,'][.\')
3227 "  call Decho("repat<".repat.">")
3228   let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
3229 "  call Dret("s:ExplorePatHls repat<".repat.">")
3230   return repat
3231 endfun
3233 " ---------------------------------------------------------------------
3234 "  s:NetrwBookHistHandler: {{{2
3235 "    0: (user: <mb>)   bookmark current directory
3236 "    1: (user: <gb>)   change to the bookmarked directory
3237 "    2: (user: <qb>)   list bookmarks
3238 "    3: (browsing)     record current directory history
3239 "    4: (user: <u>)    go up   (previous) bookmark
3240 "    5: (user: <U>)    go down (next)     bookmark
3241 "    6: (user: <mB>)   delete bookmark
3242 fun! s:NetrwBookHistHandler(chg,curdir)
3243 "  call Dfunc("s:NetrwBookHistHandler(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." histcnt=".g:netrw_dirhist_cnt." histmax=".g:netrw_dirhistmax)
3244   if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
3245 "   "  call Dret("s:NetrwBookHistHandler - suppressed due to g:netrw_dirhistmax")
3246    return
3247   endif
3249   let ykeep= @@
3250   if a:chg == 0
3251    " bookmark the current directory
3252 "   call Decho("(user: <b>) bookmark the current directory")
3253    if !exists("g:netrw_bookmarklist")
3254     let g:netrw_bookmarklist= []
3255    endif
3256    if index(g:netrw_bookmarklist,a:curdir) == -1
3257     " curdir not currently in g:netrw_bookmarklist, so include it
3258     call add(g:netrw_bookmarklist,a:curdir)
3259     call sort(g:netrw_bookmarklist)
3260    endif
3261    echo "bookmarked the current directory"
3263   elseif a:chg == 1
3264    " change to the bookmarked directory
3265 "   call Decho("(user: <".v:count."gb>) change to the bookmarked directory")
3266    if exists("g:netrw_bookmarklist[v:count-1]")
3267 "    call Decho("(user: <".v:count."gb>) bookmarklist=".string(g:netrw_bookmarklist))
3268     exe "keepj e ".fnameescape(g:netrw_bookmarklist[v:count-1])
3269    else
3270     echomsg "Sorry, bookmark#".v:count." doesn't exist!"
3271    endif
3273   elseif a:chg == 2
3274 "   redraw!
3275    let didwork= 0
3276    " list user's bookmarks
3277 "   call Decho("(user: <q>) list user's bookmarks")
3278    if exists("g:netrw_bookmarklist")
3279 "    call Decho('list '.len(g:netrw_bookmarklist).' bookmarks')
3280     let cnt= 1
3281     for bmd in g:netrw_bookmarklist
3282 "     call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1])
3283      echo printf("Netrw Bookmark#%-2d: %s",cnt,g:netrw_bookmarklist[cnt-1])
3284      let didwork = 1
3285      let cnt     = cnt + 1
3286     endfor
3287    endif
3289    " list directory history
3290    let cnt     = g:netrw_dirhist_cnt
3291    let first   = 1
3292    let histcnt = 0
3293    if g:netrw_dirhistmax > 0
3294     while ( first || cnt != g:netrw_dirhist_cnt )
3295 "    call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:netrw_dirhist_cnt)
3296      if exists("g:netrw_dirhist_{cnt}")
3297 "     call Decho("Netrw  History#".histcnt.": ".g:netrw_dirhist_{cnt})
3298       echo printf("Netrw  History#%-2d: %s",histcnt,g:netrw_dirhist_{cnt})
3299       let didwork= 1
3300      endif
3301      let histcnt = histcnt + 1
3302      let first   = 0
3303      let cnt     = ( cnt - 1 ) % g:netrw_dirhistmax
3304      if cnt < 0
3305       let cnt= cnt + g:netrw_dirhistmax
3306      endif
3307     endwhile
3308    else
3309     let g:netrw_dirhist_cnt= 0
3310    endif
3311    if didwork
3312     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3313    endif
3315   elseif a:chg == 3
3316    " saves most recently visited directories (when they differ)
3317 "   call Decho("(browsing) record curdir history")
3318    if !exists("g:netrw_dirhist_cnt") || !exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}") || g:netrw_dirhist_{g:netrw_dirhist_cnt} != a:curdir
3319     if g:netrw_dirhistmax > 0
3320      let g:netrw_dirhist_cnt                   = ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
3321      let g:netrw_dirhist_{g:netrw_dirhist_cnt} = a:curdir
3322     endif
3323 "    call Decho("save dirhist#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
3324    endif
3326   elseif a:chg == 4
3327    " u: change to the previous directory stored on the history list
3328 "   call Decho("(user: <u>) chg to prev dir from history")
3329    if g:netrw_dirhistmax > 0
3330     let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - v:count1 ) % g:netrw_dirhistmax
3331     if g:netrw_dirhist_cnt < 0
3332      let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
3333     endif
3334    else
3335     let g:netrw_dirhist_cnt= 0
3336    endif
3337    if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
3338 "    call Decho("changedir u#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
3339     if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
3340      setl ma noro
3341 "     call Decho("(NetrwBookHistHandler) setl ma noro")
3342      sil! keepj %d
3343      setl nomod
3344 "     call Decho("(NetrwBookHistHandler) setl nomod")
3345 "     call Decho("(NetrwBookHistHandler)  ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
3346     endif
3347 "    "    call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
3348     exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
3349    else
3350     if g:netrw_dirhistmax > 0
3351      let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + v:count1 ) % g:netrw_dirhistmax
3352     else
3353      let g:netrw_dirhist_cnt= 0
3354     endif
3355     echo "Sorry, no predecessor directory exists yet"
3356    endif
3358   elseif a:chg == 5
3359    " U: change to the subsequent directory stored on the history list
3360 "   call Decho("(user: <U>) chg to next dir from history")
3361    if g:netrw_dirhistmax > 0
3362     let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax
3363     if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}")
3364 "    call Decho("changedir U#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">")
3365      if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
3366 "      call Decho("(NetrwBookHistHandler) setl ma noro")
3367       setl ma noro
3368       sil! keepj %d
3369 "      call Decho("removed all lines from buffer (%d)")
3370 "      call Decho("(NetrwBookHistHandler) setl nomod")
3371       setl nomod
3372 "      call Decho("(set nomod)  ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
3373      endif
3374 "    call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}))
3375      exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})
3376     else
3377      let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax
3378      if g:netrw_dirhist_cnt < 0
3379       let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax
3380      endif
3381      echo "Sorry, no successor directory exists yet"
3382     endif
3383    else
3384     let g:netrw_dirhist_cnt= 0
3385     echo "Sorry, no successor directory exists yet (g:netrw_dirhistmax is ".g:netrw_dirhistmax.")"
3386    endif
3388   elseif a:chg == 6
3389    " delete the v:count'th bookmark
3390 "   call Decho("delete bookmark#".v:count."<".g:netrw_bookmarklist[v:count-1].">")
3391    let savefile= s:NetrwHome()."/.netrwbook"
3392    if filereadable(savefile)
3393 "    call Decho("merge bookmarks (active and file)")
3394     keepj call s:NetrwBookHistSave() " done here to merge bookmarks first
3395 "    call Decho("bookmark delete savefile<".savefile.">")
3396     keepj call delete(savefile)
3397    endif
3398 "   call Decho("remove g:netrw_bookmarklist[".(v:count-1)."]")
3399    keepj call remove(g:netrw_bookmarklist,v:count-1)
3400 "   call Decho("resulting g:netrw_bookmarklist=".string(g:netrw_bookmarklist))
3401   endif
3402   call s:NetrwBookmarkMenu()
3403   call s:NetrwTgtMenu()
3404   let @@= ykeep
3405 "  call Dret("s:NetrwBookHistHandler")
3406 endfun
3408 " ---------------------------------------------------------------------
3409 " s:NetrwBookHistRead: this function reads bookmarks and history {{{2
3410 "                      Sister function: s:NetrwBookHistSave()
3411 fun! s:NetrwBookHistRead()
3412 "  call Dfunc("s:NetrwBookHistRead()")
3413   if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
3414 "   "  call Dret("s:NetrwBookHistRead - suppressed due to g:netrw_dirhistmax")
3415    return
3416   endif
3417   let ykeep= @@
3418   if !exists("s:netrw_initbookhist")
3419    let home    = s:NetrwHome()
3420    let savefile= home."/.netrwbook"
3421    if filereadable(savefile)
3422 "    call Decho("sourcing .netrwbook")
3423     exe "keepalt keepj so ".savefile
3424    endif
3425    if g:netrw_dirhistmax > 0
3426     let savefile= home."/.netrwhist"
3427     if filereadable(savefile)
3428 "    call Decho("sourcing .netrwhist")
3429      exe "keepalt keepj so ".savefile
3430     endif
3431     let s:netrw_initbookhist= 1
3432     au VimLeave * call s:NetrwBookHistSave()
3433    endif
3434   endif
3435   let @@= ykeep
3436 "  call Dret("s:NetrwBookHistRead")
3437 endfun
3439 " ---------------------------------------------------------------------
3440 " s:NetrwBookHistSave: this function saves bookmarks and history {{{2
3441 "                      Sister function: s:NetrwBookHistRead()
3442 "                      I used to do this via viminfo but that appears to
3443 "                      be unreliable for long-term storage
3444 fun! s:NetrwBookHistSave()
3445 "  call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax)
3446   if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
3447 "   call Dret("s:NetrwBookHistSave : dirhistmax=".g:netrw_dirhistmax)
3448    return
3449   endif
3451   let savefile= s:NetrwHome()."/.netrwhist"
3452   1split
3453   call s:NetrwEnew()
3454   setl cino= com= cpo-=a cpo-=A fo=nroql2 tw=0 report=10000 noswf
3455   setl nocin noai noci magic nospell nohid wig= noaw
3456   setl ma noro write
3457   if exists("+acd") | setl noacd | endif
3458   sil! keepj keepalt %d
3460   " save .netrwhist -- no attempt to merge
3461   sil! keepalt file .netrwhist
3462   call setline(1,"let g:netrw_dirhistmax  =".g:netrw_dirhistmax)
3463   call setline(2,"let g:netrw_dirhist_cnt =".g:netrw_dirhist_cnt)
3464   let lastline = line("$")
3465   let cnt      = 1
3466   while cnt <= g:netrw_dirhist_cnt
3467    call setline((cnt+lastline),'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'")
3468    let cnt= cnt + 1
3469   endwhile
3470   exe "sil! w! ".savefile
3472   sil keepj %d
3473   if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
3474    " merge and write .netrwbook
3475    let savefile= s:NetrwHome()."/.netrwbook"
3477    if filereadable(savefile)
3478     let booklist= deepcopy(g:netrw_bookmarklist)
3479     exe "sil keepj keepalt so ".savefile
3480     for bdm in booklist
3481      if index(g:netrw_bookmarklist,bdm) == -1
3482       call add(g:netrw_bookmarklist,bdm)
3483      endif
3484     endfor
3485     call sort(g:netrw_bookmarklist)
3486     exe "sil! w! ".savefile
3487    endif
3489    " construct and save .netrwbook
3490    call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist))
3491    exe "sil! w! ".savefile
3492   endif
3493   let bgone= bufnr("%")
3494   q!
3495   exe "keepalt ".bgone."bwipe!"
3497 "  call Dret("s:NetrwBookHistSave")
3498 endfun
3500 " ---------------------------------------------------------------------
3501 " s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
3502 "  list of the contents of a local or remote directory.  It is assumed that the
3503 "  g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
3504 "  with the requested remote hostname first.
3505 fun! s:NetrwBrowse(islocal,dirname)
3506   if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
3507 "  call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%")."> win#".winnr())
3508 "  call Decho("(NetrwBrowse) tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
3509   " s:NetrwBrowse: initialize history {{{3
3510   if !exists("s:netrw_initbookhist")
3511    keepj call s:NetrwBookHistRead()
3512   endif
3514   " s:NetrwBrowse: simplify the dirname (especially for ".."s in dirnames) {{{3
3515   if a:dirname !~ '^\a\+://'
3516    let dirname= simplify(a:dirname)
3517   else
3518    let dirname= a:dirname
3519   endif
3521   if exists("s:netrw_skipbrowse")
3522    unlet s:netrw_skipbrowse
3523 "   call Decho("(NetrwBrowse)  ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
3524 "   call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
3525    return
3526   endif
3528   " s:NetrwBrowse: sanity checks: {{{3
3529   if !exists("*shellescape")
3530    keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
3531 "   call Dret("s:NetrwBrowse : missing shellescape()")
3532    return
3533   endif
3534   if !exists("*fnameescape")
3535    keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
3536 "   call Dret("s:NetrwBrowse : missing fnameescape()")
3537    return
3538   endif
3540   " s:NetrwBrowse: save options: {{{3
3541   call s:NetrwOptionSave("w:")                                                                                                            
3543   " s:NetrwBrowse: re-instate any marked files {{{3
3544   if exists("s:netrwmarkfilelist_{bufnr('%')}")
3545 "   call Decho("(NetrwBrowse) clearing marked files")
3546    exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
3547   endif
3549   if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
3550    " s:NetrwBrowse: set up "safe" options for local directory/file {{{3
3551 "   call Decho("(NetrwBrowse) handle w:netrw_acdkeep:")
3552 "   call Decho("(NetrwBrowse) keepjumps lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
3553    exe 'keepj lcd '.fnameescape(dirname)
3554    call s:NetrwSafeOptions()
3555 "   call Decho("(NetrwBrowse) getcwd<".getcwd().">")
3557   elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"'
3558    " s:NetrwBrowse: looks like a remote regular file, attempt transfer {{{3
3559 "   call Decho("(NetrwBrowse) attempt transfer as regular file<".dirname.">")
3561    " remove any filetype indicator from end of dirname, except for the
3562    " "this is a directory" indicator (/).
3563    " There shouldn't be one of those here, anyway.
3564    let path= substitute(dirname,'[*=@|]\r\=$','','e')
3565 "   call Decho("(NetrwBrowse) new path<".path.">")
3566    call s:RemotePathAnalysis(dirname)
3568    " s:NetrwBrowse: remote-read the requested file into current buffer {{{3
3569    keepj mark '
3570    call s:NetrwEnew(dirname)
3571    call s:NetrwSafeOptions()
3572    setl ma noro
3573 "   call Decho("(NetrwBrowse) setl ma noro")
3574    let b:netrw_curdir = dirname
3575    let url            = s:method."://".s:user.s:machine.(s:port ? ":".s:port : "")."/".s:path
3576 "   call Decho("(NetrwBrowse) exe sil! keepalt file ".fnameescape(url)." (bt=".&bt.")")
3577    exe "sil! keepj keepalt file ".fnameescape(url)
3578    exe "sil! keepj keepalt doau BufReadPre ".fnameescape(s:fname)
3579    sil call netrw#NetRead(2,url)
3580    if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz' && s:path !~ '.tar.xz' && s:path !~ '.txz'
3581     " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
3582     exe "sil keepj keepalt doau BufReadPost ".fnameescape(s:fname)
3583    endif
3585    " s:NetrwBrowse: save certain window-oriented variables into buffer-oriented variables {{{3
3586    call s:SetBufWinVars()
3587    call s:NetrwOptionRestore("w:")
3588 "   call Decho("(NetrwBrowse) setl ma nomod")
3589    setl ma nomod
3590 "   call Decho("(NetrwBrowse)  ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
3592 "   call Dret("s:NetrwBrowse : file<".s:fname.">")
3593    return
3594   endif
3596   " use buffer-oriented WinVars if buffer variables exist but associated window variables don't {{{3
3597   call s:UseBufWinVars()
3599   " set up some variables {{{3
3600   let b:netrw_browser_active = 1
3601   let dirname                = dirname
3602   let s:last_sort_by         = g:netrw_sort_by
3604   " set up menu {{{3
3605   keepj call s:NetrwMenu(1)
3607   " get/set-up buffer {{{3
3608   let reusing= s:NetrwGetBuffer(a:islocal,dirname)
3609   " maintain markfile highlighting
3610   if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
3611 "   call Decho("(NetrwBrowse) bufnr(%)=".bufnr('%'))
3612 "   call Decho("(NetrwBrowse) exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
3613    exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
3614   else
3615 "   call Decho("(NetrwBrowse) 2match none")
3616    2match none
3617   endif
3618   if reusing && line("$") > 1
3619    call s:NetrwOptionRestore("w:")
3620 "   call Decho("(NetrwBrowse) setl noma nomod nowrap")
3621    setl noma nomod nowrap
3622 "   call Decho("(NetrwBrowse) (set noma nomod nowrap)  ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
3623 "   call Dret("s:NetrwBrowse : re-using buffer")
3624    return
3625   endif
3627   " set b:netrw_curdir to the new directory name {{{3
3628 "  call Decho("(NetrwBrowse) set b:netrw_curdir to the new directory name:  (buf#".bufnr("%").")")
3629   let b:netrw_curdir= dirname
3630   if b:netrw_curdir =~ '[/\\]$'
3631    let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
3632   endif
3633   if b:netrw_curdir == ''
3634    if has("amiga")
3635     " On the Amiga, the empty string connotes the current directory
3636     let b:netrw_curdir= getcwd()
3637    else
3638     " under unix, when the root directory is encountered, the result
3639     " from the preceding substitute is an empty string.
3640     let b:netrw_curdir= '/'
3641    endif
3642   endif
3643   if !a:islocal && b:netrw_curdir !~ '/$'
3644    let b:netrw_curdir= b:netrw_curdir.'/'
3645   endif
3646 "  call Decho("(NetrwBrowse) b:netrw_curdir<".b:netrw_curdir.">")
3648   " ------------
3649   " (local only) {{{3
3650   " ------------
3651   if a:islocal
3652 "   call Decho("(NetrwBrowse) local only:")
3654    " Set up ShellCmdPost handling.  Append current buffer to browselist
3655    call s:LocalFastBrowser()
3657   " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
3658    if !g:netrw_keepdir
3659 "    call Decho("(NetrwBrowse) handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
3660 "    call Decho("(NetrwBrowse) l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
3661     if !exists("&l:acd") || !&l:acd
3662 "     call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir))
3663      try
3664       exe 'keepj lcd '.fnameescape(b:netrw_curdir)
3665      catch /^Vim\%((\a\+)\)\=:E472/
3666       call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
3667       if exists("w:netrw_prvdir")
3668        let b:netrw_curdir= w:netrw_prvdir
3669       else
3670        call s:NetrwOptionRestore("w:")
3671 "       call Decho("(NetrwBrowse) setl noma nomod nowrap")
3672        setl noma nomod nowrap
3673 "       call Decho("(NetrwBrowse)  ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
3674        let b:netrw_curdir= dirname
3675 "       call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
3676        return
3677       endif
3678      endtry
3679     endif
3680    endif
3682   " --------------------------------
3683   " remote handling: {{{3
3684   " --------------------------------
3685   else
3686 "   call Decho("(NetrwBrowse) remote only:")
3688    " analyze dirname and g:netrw_list_cmd {{{3
3689 "   call Decho("(NetrwBrowse) b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> dirname<".dirname.">")
3690    if dirname =~ "^NetrwTreeListing\>"
3691     let dirname= b:netrw_curdir
3692 "    call Decho("(NetrwBrowse) (dirname was <NetrwTreeListing>) dirname<".dirname.">")
3693    elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
3694     let dirname= substitute(b:netrw_curdir,'\\','/','g')
3695     if dirname !~ '/$'
3696      let dirname= dirname.'/'
3697     endif
3698     let b:netrw_curdir = dirname
3699 "    call Decho("(NetrwBrowse) (liststyle is TREELIST) dirname<".dirname.">")
3700    else
3701     let dirname = substitute(dirname,'\\','/','g')
3702 "    call Decho("(NetrwBrowse) (normal) dirname<".dirname.">")
3703    endif
3705    let dirpat  = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
3706    if dirname !~ dirpat
3707     if !exists("g:netrw_quiet")
3708      keepj call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
3709     endif
3710     keepj call s:NetrwOptionRestore("w:")
3711 "    call Decho("(NetrwBrowse) setl noma nomod nowrap")
3712     setl noma nomod nowrap
3713 "    call Decho("(NetrwBrowse)  ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
3714 "    call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
3715     return
3716    endif
3717    let b:netrw_curdir= dirname
3718 "   call Decho("(NetrwBrowse) b:netrw_curdir<".b:netrw_curdir."> (remote)")
3719   endif  " (additional remote handling)
3721   " -----------------------
3722   " Directory Listing: {{{3
3723   " -----------------------
3724   keepj call s:NetrwMaps(a:islocal)
3725   keepj call s:PerformListing(a:islocal)
3726   if v:version >= 700 && has("balloon_eval") && &beval == 0 && &l:bexpr == "" && !exists("g:netrw_nobeval")
3727    let &l:bexpr= "netrw#NetrwBalloonHelp()"
3728 "   call Decho("(NetrwBrowse) set up balloon help: l:bexpr=".&l:bexpr)
3729    set beval
3730   endif
3731   call s:NetrwOptionRestore("w:")
3733   " The s:LocalBrowseShellCmdRefresh() function is called by an autocmd
3734   " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow, medium speed).
3735   " However, s:NetrwBrowse() causes the ShellCmdPost event itself to fire once; setting
3736   " the variable below avoids that second refresh of the screen.  The s:LocalBrowseShellCmdRefresh()
3737   " function gets called due to that autocmd; it notices that the following variable is set
3738   " and skips the refresh and sets s:locbrowseshellcmd to zero. Oct 13, 2008
3739   let s:locbrowseshellcmd= 1
3741 "  call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
3742 "  call Dret("s:NetrwBrowse : did PerformListing  ft<".&ft.">")
3743   return
3744 endfun
3746 " ---------------------------------------------------------------------
3747 " s:NetrwFileInfo: supports qf (query for file information) {{{2
3748 fun! s:NetrwFileInfo(islocal,fname)
3749 "  call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)")
3750   let ykeep= @@
3751   if a:islocal
3752    if (has("unix") || has("macunix")) && executable("/bin/ls")
3753     if exists("b:netrw_curdir")
3754 "     call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>')
3755      if b:netrw_curdir =~ '/$'
3756       echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
3757      else
3758       echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
3759      endif
3760     else
3761 "     call Decho('using ls '.a:fname." using cwd<".getcwd().">")
3762      echo system("/bin/ls -lsad ".shellescape(a:fname))
3763     endif
3764    else
3765     " use vim functions to return information about file below cursor
3766 "    call Decho("using vim functions to query for file info")
3767     if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
3768      let fname= substitute(a:fname,".$","","")
3769     else
3770      let fname= a:fname
3771     endif
3772     let t  = getftime(fname)
3773     let sz = getfsize(fname)
3774     echo a:fname.":  ".sz."  ".strftime(g:netrw_timefmt,getftime(fname))
3775 "    call Decho(fname.":  ".sz."  ".strftime(g:netrw_timefmt,getftime(fname)))
3776    endif
3777   else
3778    echo "sorry, \"qf\" not supported yet for remote files"
3779   endif
3780   let @@= ykeep
3781 "  call Dret("s:NetrwFileInfo")
3782 endfun
3784 " ---------------------------------------------------------------------
3785 " s:NetrwGetBuffer: {{{2
3786 "   returns 0=cleared buffer
3787 "           1=re-used buffer
3788 fun! s:NetrwGetBuffer(islocal,dirname)
3789 "  call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
3790 "  call Decho("(NetrwGetBuffer) modiable=".&mod." modifiable=".&ma." readonly=".&ro)
3791   let dirname= a:dirname
3793   " re-use buffer if possible {{{3
3794 "  call Decho("(NetrwGetBuffer) --re-use a buffer if possible--")
3795   if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
3796    " find NetrwTreeList buffer if there is one
3797 "   call Decho("(NetrwGetBuffer) case liststyle=treelist: find NetrwTreeList buffer if there is one")
3798    if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
3799 "    call Decho("(NetrwGetBuffer)   re-using w:netrw_treebufnr=".w:netrw_treebufnr)
3800     setl mod
3801     sil! keepj %d
3802     let eikeep= &ei
3803     set ei=all
3804     exe "sil! keepalt b ".w:netrw_treebufnr
3805     let &ei= eikeep
3806 "    call Dret("s:NetrwGetBuffer 0<buffer cleared> : bufnum#".w:netrw_treebufnr."<NetrwTreeListing>")
3807     return 0
3808    endif
3809    let bufnum= -1
3810 "   call Decho("(NetrwGetBuffer)   liststyle=TREE but w:netrw_treebufnr doesn't exist")
3812   else
3813    " find buffer number of buffer named precisely the same as dirname {{{3
3814 "   call Decho("(NetrwGetBuffer) case listtyle not treelist: find buffer numnber of buffer named precisely the same as dirname--")
3816    " get dirname and associated buffer number
3817    let bufnum  = bufnr(escape(dirname,'\'))
3818 "   call Decho("(NetrwGetBuffer)   find buffer<".dirname.">'s number ")
3819 "   call Decho("(NetrwGetBuffer)   bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
3821    if bufnum < 0 && dirname !~ '/$'
3822     " try appending a trailing /
3823 "    call Decho("(NetrwGetBuffer)   try appending a trailing / to dirname<".dirname.">")
3824     let bufnum= bufnr(escape(dirname.'/','\'))
3825     if bufnum > 0
3826      let dirname= dirname.'/'
3827     endif
3828    endif
3830    if bufnum < 0 && dirname =~ '/$'
3831     " try removing a trailing /
3832 "    call Decho("(NetrwGetBuffer)   try removing a trailing / from dirname<".dirname.">")
3833     let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
3834     if bufnum > 0
3835      let dirname= substitute(dirname,'/$','','')
3836     endif
3837    endif
3839 "   call Decho("(NetrwGetBuffer)   findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
3840    " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/  and abc/ matches)
3841    if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
3842     " handle approximate matches
3843 "    call Decho("(NetrwGetBuffer)   handling approx match: bufnum#".bufnum.">0 AND bufname<".bufname(bufnum).">!=dirname<".dirname."> AND bufname(".bufnum.")!='.'")
3844     let ibuf    = 1
3845     let buflast = bufnr("$")
3846 "    call Decho("(NetrwGetBuffer)   findbuf2: buflast=bufnr($)=".buflast)
3847     while ibuf <= buflast
3848      let bname= substitute(bufname(ibuf),'\\','/','g')
3849      let bname= substitute(bname,'.\zs/$','','')
3850 "     call Decho("(NetrwGetBuffer)   findbuf3: while [ibuf=",ibuf."]<=[buflast=".buflast."]: dirname<".dirname."> bname=bufname(".ibuf.")<".bname.">")
3851      if bname != '' && dirname =~ '/'.bname.'/\=$' && dirname !~ '^/'
3852       " bname is not empty
3853       " dirname ends with bname,
3854       " dirname doesn't start with /, so its not a absolute path
3855 "      call Decho("(NetrwGetBuffer)   findbuf3a: passes test 1 : dirname<".dirname.'> =~ /'.bname.'/\=$ && dirname !~ ^/')
3856       break
3857      endif
3858      if bname =~ '^'.dirname.'/\=$'
3859       " bname begins with dirname
3860 "      call Decho('  findbuf3b: passes test 2 : bname<'.bname.'>=~^'.dirname.'/\=$')
3861       break
3862      endif
3863      if dirname =~ '^'.bname.'/$'
3864 "      call Decho('  findbuf3c: passes test 3 : dirname<'.dirname.'>=~^'.bname.'/$')
3865       break
3866      endif
3867      if bname != '' && dirname =~ '/'.bname.'$' && bname == bufname("%") && line("$") == 1
3868 "      call Decho('  findbuf3d: passes test 4 : dirname<'.dirname.'>=~ /'.bname.'$')
3869       break
3870      endif
3871      let ibuf= ibuf + 1
3872     endwhile
3873     if ibuf > buflast
3874      let bufnum= -1
3875     else
3876      let bufnum= ibuf
3877     endif
3878 "    call Decho("(NetrwGetBuffer)   findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
3879    endif
3880   endif
3882   " get enew buffer and name it -or- re-use buffer {{{3
3883 "  call Decho("(NetrwGetBuffer)   get enew buffer and name it OR re-use buffer")
3884   sil! keepj keepalt mark '
3885   if bufnum < 0 || !bufexists(bufnum)
3886 "   call Decho("(NetrwGetBuffer) --get enew buffer and name it  (bufnum#".bufnum."<0 OR bufexists(".bufnum.")=".bufexists(bufnum)."==0)")
3887    call s:NetrwEnew(dirname)
3888 "   call Decho("(NetrwGetBuffer)   got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
3889    " name the buffer
3890    if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
3891     " Got enew buffer; transform into a NetrwTreeListing
3892 "    call Decho("(NetrwGetBuffer) --transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
3893     if !exists("s:netrw_treelistnum")
3894      let s:netrw_treelistnum= 1
3895     else
3896      let s:netrw_treelistnum= s:netrw_treelistnum + 1
3897     endif
3898     let w:netrw_treebufnr= bufnr("%")
3899 "    call Decho("(NetrwGetBuffer)   exe sil! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum))
3900     exe 'sil! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum)
3901     set bt=nofile noswf
3902     nnoremap <silent> <buffer> [        :sil call <SID>TreeListMove('[')<cr>
3903     nnoremap <silent> <buffer> ]        :sil call <SID>TreeListMove(']')<cr>
3904     nnoremap <silent> <buffer> [[       :sil call <SID>TreeListMove('[')<cr>
3905     nnoremap <silent> <buffer> ]]       :sil call <SID>TreeListMove(']')<cr>
3906 "    call Decho("(NetrwGetBuffer)   tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
3907    else
3908 "    let v:errmsg= "" " Decho
3909     let escdirname= fnameescape(dirname)
3910 "    call Decho("(NetrwGetBuffer)   errmsg<".v:errmsg."> bufnr(escdirname<".escdirname.">)=".bufnr(escdirname)." bufname()<".bufname(bufnr(escdirname)).">")
3911 "    call Decho('  exe sil! keepalt file '.escdirname)
3912 "    let v:errmsg= "" " Decho
3913     exe 'sil! keepalt file '.escdirname
3914 "    call Decho("(NetrwGetBuffer)   errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
3915    endif
3916 "   call Decho("(NetrwGetBuffer)   named enew buffer#".bufnr("%")."<".bufname("%").">")
3918   else " Re-use the buffer
3919 "   call Decho("(NetrwGetBuffer) --re-use buffer#".bufnum." (bufnum#".bufnum.">=0 AND bufexists(".bufnum.")=".bufexists(bufnum)."!=0)")
3920    let eikeep= &ei
3921    set ei=all
3922    if getline(2) =~ '^" Netrw Directory Listing'
3923 "    call Decho("(NetrwGetBuffer)   getline(2)<".getline(2).'> matches "Netrw Directory Listing" : using keepalt b '.bufnum)
3924     exe "sil! keepalt b ".bufnum
3925    else
3926 "    call Decho("(NetrwGetBuffer)   getline(2)<".getline(2).'> does not match "Netrw Directory Listing" : using b '.bufnum)
3927     exe "sil! keepalt b ".bufnum
3928    endif
3929    if bufname("%") == '.'
3930 "    call Decho("(NetrwGetBuffer) exe sil! keepalt file ".fnameescape(getcwd()))
3931     exe "sil! keepalt file ".fnameescape(getcwd())
3932    endif
3933    let &ei= eikeep
3934    if line("$") <= 1
3935     keepj call s:NetrwListSettings(a:islocal)
3936 "    call Dret("s:NetrwGetBuffer 0<buffer empty> : re-using buffer#".bufnr("%").", but its empty, so refresh it")
3937     return 0
3938    elseif g:netrw_fastbrowse == 0 || (a:islocal && g:netrw_fastbrowse == 1)
3939     keepj call s:NetrwListSettings(a:islocal)
3940     sil keepj %d
3941 "    call Dret("s:NetrwGetBuffer 0<cleared buffer> : re-using buffer#".bufnr("%").", but refreshing due to g:netrw_fastbrowse=".g:netrw_fastbrowse)
3942     return 0
3943    elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
3944 "    call Decho("(NetrwGetBuffer) --re-use tree listing--")
3945 "    call Decho("(NetrwGetBuffer)   clear buffer<".expand("%")."> with :%d")
3946     sil keepj %d
3947     keepj call s:NetrwListSettings(a:islocal)
3948 "    call Dret("s:NetrwGetBuffer 0<cleared buffer> : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
3949     return 0
3950    else
3951 "    call Dret("s:NetrwGetBuffer 1<buffer not cleared> : buf#".bufnr("%"))
3952     return 1
3953    endif
3954   endif
3956   " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
3957   "     fastbrowse  Local  Remote   Hiding a buffer implies it may be re-used (fast)
3958   "  slow   0         D      D      Deleting a buffer implies it will not be re-used (slow)
3959   "  med    1         D      H
3960   "  fast   2         H      H
3961 "  call Decho("(NetrwGetBuffer) --do netrw settings: make this buffer#".bufnr("%")." not-a-file, modifiable, not line-numbered, etc--")
3962   let fname= expand("%")
3963   keepj call s:NetrwListSettings(a:islocal)
3964 "  call Decho("(NetrwGetBuffer) exe sil! keepalt file ".fnameescape(fname))
3965   exe "sil! keepj keepalt file ".fnameescape(fname)
3967   " delete all lines from buffer {{{3
3968 "  call Decho("(NetrwGetBuffer) --delete all lines from buffer--")
3969 "  call Decho("(NetrwGetBuffer)   clear buffer<".expand("%")."> with :%d")
3970   sil! keepalt keepj %d
3972 "  call Dret("s:NetrwGetBuffer 0<cleared buffer> : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
3973   return 0
3974 endfun
3976 " ---------------------------------------------------------------------
3977 " s:NetrwGetcwd: get the current directory. {{{2
3978 "   Change backslashes to forward slashes, if any.
3979 "   If doesc is true, escape certain troublesome characters
3980 fun! s:NetrwGetcwd(doesc)
3981 "  call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
3982   let curdir= substitute(getcwd(),'\\','/','ge')
3983   if curdir !~ '[\/]$'
3984    let curdir= curdir.'/'
3985   endif
3986   if a:doesc
3987    let curdir= fnameescape(curdir)
3988   endif
3989 "  call Dret("NetrwGetcwd <".curdir.">")
3990   return curdir
3991 endfun
3993 " ---------------------------------------------------------------------
3994 "  s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
3995 fun! s:NetrwGetWord()
3996 "  call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
3997   call s:UseBufWinVars()
3999   " insure that w:netrw_liststyle is set up
4000   if !exists("w:netrw_liststyle")
4001    if exists("g:netrw_liststyle")
4002     let w:netrw_liststyle= g:netrw_liststyle
4003    else
4004     let w:netrw_liststyle= s:THINLIST
4005    endif
4006 "   call Decho("w:netrw_liststyle=".w:netrw_liststyle)
4007   endif
4009   if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
4010    " Active Banner support
4011 "   call Decho("active banner handling")
4012    keepj norm! 0
4013    let dirname= "./"
4014    let curline= getline('.')
4016    if curline =~ '"\s*Sorted by\s'
4017     keepj norm s
4018     let s:netrw_skipbrowse= 1
4019     echo 'Pressing "s" also works'
4021    elseif curline =~ '"\s*Sort sequence:'
4022     let s:netrw_skipbrowse= 1
4023     echo 'Press "S" to edit sorting sequence'
4025    elseif curline =~ '"\s*Quick Help:'
4026     keepj norm ?
4027     let s:netrw_skipbrowse= 1
4028     echo 'Pressing "?" also works'
4030    elseif curline =~ '"\s*\%(Hiding\|Showing\):'
4031     keepj norm a
4032     let s:netrw_skipbrowse= 1
4033     echo 'Pressing "a" also works'
4035    elseif line("$") > w:netrw_bannercnt
4036     exe 'sil keepj '.w:netrw_bannercnt
4037    endif
4039   elseif w:netrw_liststyle == s:THINLIST
4040 "   call Decho("thin column handling")
4041    keepj norm! 0
4042    let dirname= getline('.')
4044   elseif w:netrw_liststyle == s:LONGLIST
4045 "   call Decho("long column handling")
4046    keepj norm! 0
4047    let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
4049   elseif w:netrw_liststyle == s:TREELIST
4050 "   call Decho("treelist handling")
4051    let dirname= substitute(getline('.'),'^\(| \)*','','e')
4053   else
4054 "   call Decho("obtain word from wide listing")
4055    let dirname= getline('.')
4057    if !exists("b:netrw_cpf")
4058     let b:netrw_cpf= 0
4059     exe 'sil keepj '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
4060     call histdel("/",-1)
4061 "   call Decho("computed cpf=".b:netrw_cpf)
4062    endif
4064 "   call Decho("buf#".bufnr("%")."<".bufname("%").">")
4065    let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
4066 "   call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart."  bannercnt=".w:netrw_bannercnt)
4067 "   call Decho("1: dirname<".dirname.">")
4068    if filestart == 0
4069     keepj norm! 0ma
4070    else
4071     call cursor(line("."),filestart+1)
4072     keepj norm! ma
4073    endif
4074    let rega= @a
4075    let eofname= filestart + b:netrw_cpf + 1
4076    if eofname <= col("$")
4077     call cursor(line("."),filestart+b:netrw_cpf+1)
4078     keepj norm! "ay`a
4079    else
4080     keepj norm! "ay$
4081    endif
4082    let dirname = @a
4083    let @a      = rega
4084 "   call Decho("2: dirname<".dirname.">")
4085    let dirname= substitute(dirname,'\s\+$','','e')
4086 "   call Decho("3: dirname<".dirname.">")
4087   endif
4089   " symlinks are indicated by a trailing "@".  Remove it before further processing.
4090   let dirname= substitute(dirname,"@$","","")
4092   " executables are indicated by a trailing "*".  Remove it before further processing.
4093   let dirname= substitute(dirname,"\*$","","")
4095 "  call Dret("s:NetrwGetWord <".dirname.">")
4096   return dirname
4097 endfun
4099 " ---------------------------------------------------------------------
4100 " s:NetrwListSettings: make standard settings for a netrw listing {{{2
4101 fun! s:NetrwListSettings(islocal)
4102 "  call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
4103   let fname= bufname("%")
4104 "  call Decho("(NetrwListSettings) setl bt=nofile nobl ma nonu nowrap noro")
4105   setl bt=nofile nobl ma nonu nowrap noro
4106 "  call Decho("(NetrwListSettings) exe sil! keepalt file ".fnameescape(fname))
4107   exe "sil! keepalt file ".fnameescape(fname)
4108   if g:netrw_use_noswf
4109    setl noswf
4110   endif
4111 "  call Decho("(NetrwListSettings) exe setl ts=".(g:netrw_maxfilenamelen+1))
4112   exe "setl ts=".(g:netrw_maxfilenamelen+1)
4113   setl isk+=.,~,-
4114   if g:netrw_fastbrowse > a:islocal
4115    setl bh=hide
4116   else
4117    setl bh=delete
4118   endif
4119 "  call Dret("s:NetrwListSettings")
4120 endfun
4122 " ---------------------------------------------------------------------
4123 "  s:NetrwListStyle: {{{2
4124 "  islocal=0: remote browsing
4125 "         =1: local browsing
4126 fun! s:NetrwListStyle(islocal)
4127 "  call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
4128   let ykeep             = @@
4129   let fname             = s:NetrwGetWord()
4130   if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
4131   let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
4132 "  call Decho("fname<".fname.">")
4133 "  call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
4134 "  call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
4136   if w:netrw_liststyle == s:THINLIST
4137    " use one column listing
4138 "   call Decho("use one column list")
4139    let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4141   elseif w:netrw_liststyle == s:LONGLIST
4142    " use long list
4143 "   call Decho("use long list")
4144    let g:netrw_list_cmd = g:netrw_list_cmd." -l"
4146   elseif w:netrw_liststyle == s:WIDELIST
4147    " give wide list
4148 "   call Decho("use wide list")
4149    let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4151   elseif w:netrw_liststyle == s:TREELIST
4152 "   call Decho("use tree list")
4153    let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4155   else
4156    keepj call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
4157    let g:netrw_liststyle = s:THINLIST
4158    let w:netrw_liststyle = g:netrw_liststyle
4159    let g:netrw_list_cmd  = substitute(g:netrw_list_cmd,' -l','','ge')
4160   endif
4161   setl ma noro
4162 "  call Decho("setl ma noro")
4164   " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
4165 "  call Decho("clear buffer<".expand("%")."> with :%d")
4166   sil! keepj %d
4167   " following prevents tree listing buffer from being marked "modified"
4168 "  call Decho("(NetrwListStyle) setl nomod")
4169   setl nomod
4170 "  call Decho("(NetrwListStyle) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
4172   " refresh the listing
4173 "  call Decho("(NetrwListStyle) refresh the listing")
4174   let svpos= netrw#NetrwSavePosn()
4175   keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4176   keepj call netrw#NetrwRestorePosn(svpos)
4177   keepj call s:NetrwCursor()
4179   " keep cursor on the filename
4180   sil! keepj $
4181   let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
4182 "  call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
4183   if result <= 0 && exists("w:netrw_bannercnt")
4184    exe "sil! keepj ".w:netrw_bannercnt
4185   endif
4186   let @@= ykeep
4188 "  call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
4189 endfun
4191 " ---------------------------------------------------------------------
4192 " s:NetrwBannerCtrl: toggles the display of the banner {{{2
4193 fun! s:NetrwBannerCtrl(islocal)
4194 "  call Dfunc("s:NetrwBannerCtrl(islocal=".a:islocal.") g:netrw_banner=".g:netrw_banner)
4196   let ykeep= @@
4197   " toggle the banner (enable/suppress)
4198   let g:netrw_banner= !g:netrw_banner
4200   " refresh the listing
4201   let svpos= netrw#NetrwSavePosn()
4202   call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4204   " keep cursor on the filename
4205   let fname= s:NetrwGetWord()
4206   sil keepj $
4207   let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
4208 "  call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
4209   if result <= 0 && exists("w:netrw_bannercnt")
4210    exe "keepj ".w:netrw_bannercnt
4211   endif
4212   let @@= ykeep
4213 "  call Dret("s:NetrwBannerCtrl : g:netrw_banner=".g:netrw_banner)
4214 endfun
4216 " ---------------------------------------------------------------------
4217 " s:NetrwBookmarkMenu: Uses menu priorities {{{2
4218 "                      .2.[cnt] for bookmarks, and
4219 "                      .3.[cnt] for history
4220 "                      (see s:NetrwMenu())
4221 fun! s:NetrwBookmarkMenu()
4222   if !exists("s:netrw_menucnt")
4223    return
4224   endif
4225 "  call Dfunc("NetrwBookmarkMenu()  histcnt=".g:netrw_dirhist_cnt." menucnt=".s:netrw_menucnt)
4227   " the following test assures that gvim is running, has menus available, and has menus enabled.
4228   if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
4229    if exists("g:NetrwTopLvlMenu")
4230 "    call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
4231     exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
4232     exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete'
4233    endif
4234    if !exists("s:netrw_initbookhist")
4235     call s:NetrwBookHistRead()
4236    endif
4238    " show bookmarked places
4239    if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0
4240     let cnt= 1
4241     for bmd in g:netrw_bookmarklist
4242      let ebmd= escape(bmd,g:netrw_menu_escape)
4243 "     call Decho('sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.ebmd.'    :e '.bmd)
4245      " show bookmarks for goto menu
4246      exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.ebmd.'   :e '.bmd."\<cr>"
4248      " show bookmarks for deletion menu
4249      exe 'sil! menu '.g:NetrwMenuPriority.".8.2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete.'.ebmd.'  '.cnt."mB"
4250      let cnt= cnt + 1
4251     endfor
4253    endif
4255    " show directory browsing history
4256    if g:netrw_dirhistmax > 0
4257     let cnt     = g:netrw_dirhist_cnt
4258     let first   = 1
4259     let histcnt = 0
4260     while ( first || cnt != g:netrw_dirhist_cnt )
4261      let histcnt  = histcnt + 1
4262      let priority = g:netrw_dirhist_cnt + histcnt
4263      if exists("g:netrw_dirhist_{cnt}")
4264       let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape)
4265 "     call Decho('sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.'     :e '.histdir)
4266       exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.'    :e '.histdir."\<cr>"
4267      endif
4268      let first = 0
4269      let cnt   = ( cnt - 1 ) % g:netrw_dirhistmax
4270      if cnt < 0
4271       let cnt= cnt + g:netrw_dirhistmax
4272      endif
4273     endwhile
4274    endif
4276   endif
4277 "  call Dret("NetrwBookmarkMenu")
4278 endfun
4280 " ---------------------------------------------------------------------
4281 "  s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
4282 "                       directory and a new directory name.  Also, if the
4283 "                       "new directory name" is actually a file,
4284 "                       NetrwBrowseChgDir() edits the file.
4285 fun! s:NetrwBrowseChgDir(islocal,newdir,...)
4286 "  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 : "").">")
4288   let ykeep= @@
4289   if !exists("b:netrw_curdir")
4290    " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
4291    " and the current window is the NetrwMessage window.
4292    let @@= ykeep
4293 "   call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
4294 "   call Decho("(NetrwBrowseChgDir) getcwd<".getcwd().">")
4295 "   call Dret("s:NetrwBrowseChgDir")
4296    return
4297   endif
4299   " NetrwBrowseChgDir: save options and initialize {{{3
4300   keepj call s:NetrwOptionSave("s:")
4301   keepj call s:NetrwSafeOptions()
4302   let nbcd_curpos                = netrw#NetrwSavePosn()
4303   let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
4304 "  call Decho("(NetrwBrowseChgDir) setting s:nbcd_curpos_".bufnr('%')." to SavePosn")
4305   if (has("win32") || has("win95") || has("win64") || has("win16"))
4306    let dirname                   = substitute(b:netrw_curdir,'\\','/','ge')
4307   else
4308    let dirname= b:netrw_curdir
4309   endif
4310   let newdir    = a:newdir
4311   let dolockout = 0
4313   " set up o/s-dependent directory recognition pattern
4314   if has("amiga")
4315    let dirpat= '[\/:]$'
4316   else
4317    let dirpat= '[\/]$'
4318   endif
4319 "  call Decho("(NetrwBrowseChgDir) dirname<".dirname.">  dirpat<".dirpat.">")
4321   if dirname !~ dirpat
4322    " apparently vim is "recognizing" that it is in a directory and
4323    " is removing the trailing "/".  Bad idea, so let's put it back.
4324    let dirname= dirname.'/'
4325 "   call Decho("(NetrwBrowseChgDir) adjusting dirname<".dirname.">")
4326   endif
4328   if newdir !~ dirpat
4329    " ------------------------------
4330    " NetrwBrowseChgDir: edit a file {{{3
4331    " ------------------------------
4332 "   call Decho('(NetrwBrowseChgDir:edit-a-file) case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
4334    " save position for benefit of Rexplore
4335    let s:rexposn_{bufnr("%")}= netrw#NetrwSavePosn()
4337 "   call Decho("(NetrwBrowseChgDir:edit-a-file) setting s:rexposn_".bufnr("%")." to SavePosn")
4338    if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
4339     let dirname= s:NetrwTreeDir()
4340     if dirname =~ '/$'
4341      let dirname= dirname.newdir
4342     else
4343      let dirname= s:NetrwTreeDir()."/".newdir
4344     endif
4345 "    call Decho("(NetrwBrowseChgDir:edit-a-file) dirname<".dirname.">")
4346 "    call Decho("(NetrwBrowseChgDir:edit-a-file) tree listing")
4347    elseif newdir =~ '^\(/\|\a:\)'
4348     let dirname= newdir
4349    else
4350     let dirname= s:ComposePath(dirname,newdir)
4351    endif
4352 "   call Decho("(NetrwBrowseChgDir:edit-a-file) handling a file: dirname<".dirname."> (a:0=".a:0.")")
4353    " this lets NetrwBrowseX avoid the edit
4354    if a:0 < 1
4355 "    call Decho("(NetrwBrowseChgDir:edit-a-file) set up windows for editing<".fnameescape(dirname).">  didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist"))
4356     keepj call s:NetrwOptionRestore("s:")
4357     if !exists("s:didsplit")
4358 "     call Decho("(NetrwBrowseChgDir:edit-a-file) s:didsplit does not exist; g:netrw_browse_split=".g:netrw_browse_split." win#".winnr())
4359      if     g:netrw_browse_split == 1
4360       " horizontally splitting the window first
4361       keepalt new
4362       if !&ea
4363        keepalt wincmd _
4364       endif
4365      elseif g:netrw_browse_split == 2
4366       " vertically splitting the window first
4367       keepalt rightb vert new
4368       if !&ea
4369        keepalt wincmd |
4370       endif
4371      elseif g:netrw_browse_split == 3
4372       " open file in new tab
4373       keepalt tabnew
4374      elseif g:netrw_browse_split == 4
4375       " act like "P" (ie. open previous window)
4376       if s:NetrwPrevWinOpen(2) == 3
4377        let @@= ykeep
4378 "       call Dret("s:NetrwBrowseChgDir")
4379        return
4380       endif
4381      else
4382       " handling a file, didn't split, so remove menu
4383 "      call Decho("(NetrwBrowseChgDir:edit-a-file) handling a file+didn't split, so remove menu")
4384       call s:NetrwMenu(0)
4385       " optional change to window
4386       if g:netrw_chgwin >= 1
4387        exe "keepj keepalt ".g:netrw_chgwin."wincmd w"
4388       endif
4389      endif
4390     endif
4392     " the point where netrw actually edits the (local) file
4393     " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
4394     if a:islocal
4395 "     call Decho("(NetrwBrowseChgDir:edit-a-file) edit local file: exe e! ".fnameescape(dirname))
4396      exe "keepj keepalt e! ".fnameescape(dirname)
4397      call s:NetrwCursor()
4398     else
4399 "     call Decho("(NetrwBrowseChgDir:edit-a-file) remote file: NetrwBrowse will edit it")
4400     endif
4401     let dolockout= 1
4403     " handle g:Netrw_funcref -- call external-to-netrw functions
4404     "   This code will handle g:Netrw_funcref as an individual function reference
4405     "   or as a list of function references.  It will ignore anything that's not
4406     "   a function reference.  See  :help Funcref  for information about function references.
4407     if exists("g:Netrw_funcref")
4408 "     call Decho("(NetrwBrowseChgDir:edit-a-file) handle optional Funcrefs")
4409      if type(g:Netrw_funcref) == 2
4410 "      call Decho("(NetrwBrowseChgDir:edit-a-file) handling a g:Netrw_funcref")
4411       keepj call g:Netrw_funcref()
4412      elseif type(g:Netrw_funcref) == 3
4413 "      call Decho("(NetrwBrowseChgDir:edit-a-file) handling a list of g:Netrw_funcrefs")
4414       for Fncref in g:Netrw_funcref
4415        if type(FncRef) == 2
4416         keepj call FncRef()
4417        endif
4418       endfor
4419      endif
4420     endif
4421    endif
4423   elseif newdir =~ '^/'
4424    " ----------------------------------------------------
4425    " NetrwBrowseChgDir: just go to the new directory spec {{{3
4426    " ----------------------------------------------------
4427 "   call Decho('(NetrwBrowseChgDir:goto-newdir) case "just go to new directory spec": newdir<'.newdir.'>')
4428    let dirname    = newdir
4429    keepj call s:SetRexDir(a:islocal,dirname)
4430    keepj call s:NetrwOptionRestore("s:")
4432   elseif newdir == './'
4433    " ---------------------------------------------
4434    " NetrwBrowseChgDir: refresh the directory list {{{3
4435    " ---------------------------------------------
4436 "   call Decho('(NetrwBrowseChgDir:refresh-dirlist) case "refresh directory listing": newdir == "./"')
4437    keepj call s:SetRexDir(a:islocal,dirname)
4439   elseif newdir == '../'
4440    " --------------------------------------
4441    " NetrwBrowseChgDir: go up one directory {{{3
4442    " --------------------------------------
4443 "   call Decho('(NetrwBrowseChgDir:go-up) case "go up one directory": newdir == "../"')
4445    if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
4446     " force a refresh
4447 "    call Decho("(NetrwBrowseChgDir:go-up) clear buffer<".expand("%")."> with :%d")
4448 "    call Decho("(NetrwBrowseChgDir:go-up) setl noro ma")
4449     setl noro ma
4450     keepj %d
4451    endif
4453    if has("amiga")
4454     " amiga
4455 "    call Decho('(NetrwBrowseChgDir:go-up) case "go up one directory": newdir == "../" and amiga')
4456     if a:islocal
4457      let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
4458      let dirname= substitute(dirname,'/$','','')
4459     else
4460      let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
4461     endif
4462 "    call Decho("(NetrwBrowseChgDir:go-up) amiga: dirname<".dirname."> (go up one dir)")
4464    else
4465     " unix or cygwin
4466 "    call Decho('(NetrwBrowseChgDir:go-up) case "go up one directory": newdir == "../" and unix or cygwin')
4467     if a:islocal
4468      let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
4469      if dirname == ""
4470       let dirname= '/'
4471      endif
4472     else
4473      let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
4474     endif
4475 "    call Decho("(NetrwBrowseChgDir:go-up) unix: dirname<".dirname."> (go up one dir)")
4476    endif
4477    keepj call s:SetRexDir(a:islocal,dirname)
4479   elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
4480    " --------------------------------------
4481    " NetrwBrowseChgDir: Handle Tree Listing {{{3
4482    " --------------------------------------
4483 "   call Decho('(NetrwBrowseChgDir:tree-list) case liststyle is TREELIST and w:netrw_treedict exists')
4484    " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh)
4485 "   call Decho("(NetrwBrowseChgDir) (treelist) setl noro ma")
4486    setl noro ma
4487    if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
4488 "    call Decho("(NetrwBrowseChgDir) clear buffer<".expand("%")."> with :%d")
4489     keepj %d
4490    endif
4491    let treedir      = s:NetrwTreeDir()
4492    let s:treecurpos = nbcd_curpos
4493    let haskey= 0
4494 "   call Decho("(NetrwBrowseChgDir:tree-list) w:netrw_treedict<".string(w:netrw_treedict).">")
4496    " search treedict for tree dir as-is
4497    if has_key(w:netrw_treedict,treedir)
4498 "    call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'> : found it!')
4499     let haskey= 1
4500    else
4501 "    call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'> : not found')
4502    endif
4504    " search treedict for treedir with a / appended
4505    if !haskey && treedir !~ '/$'
4506     if has_key(w:netrw_treedict,treedir."/")
4507      let treedir= treedir."/"
4508 "     call Decho('(NetrwBrowseChgDir:tree-list) ....searched.for treedir<'.treedir.'> found it!')
4509      let haskey = 1
4510     else
4511 "     call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'/> : not found')
4512     endif
4513    endif
4515    " search treedict for treedir with any trailing / elided
4516    if !haskey && treedir =~ '/$'
4517     let treedir= substitute(treedir,'/$','','')
4518     if has_key(w:netrw_treedict,treedir)
4519 "     call Decho('(NetrwBrowseChgDir:tree-list) ....searched.for treedir<'.treedir.'> found it!')
4520      let haskey = 1
4521     else
4522 "     call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'> : not found')
4523     endif
4524    endif
4526    if haskey
4527     " close tree listing for selected subdirectory
4528 "    call Decho("(NetrwBrowseChgDir:tree-list) closing selected subdirectory<".dirname.">")
4529     call remove(w:netrw_treedict,treedir)
4530 "    call Decho("(NetrwBrowseChgDir) removed     entry<".treedir."> from treedict")
4531 "    call Decho("(NetrwBrowseChgDir) yielding treedict<".string(w:netrw_treedict).">")
4532     let dirname= w:netrw_treetop
4533    else
4534     " go down one directory
4535     let dirname= substitute(treedir,'/*$','/','')
4536 "    call Decho("(NetrwBrowseChgDir:tree-list) go down one dir: treedir<".treedir.">")
4537    endif
4538    keepj call s:SetRexDir(a:islocal,dirname)
4539    let s:treeforceredraw = 1
4541   else
4542    " ----------------------------------------
4543    " NetrwBrowseChgDir: Go down one directory {{{3
4544    " ----------------------------------------
4545    let dirname    = s:ComposePath(dirname,newdir)
4546 "   call Decho("(NetrwBrowseChgDir:go-down) go down one dir: dirname<".dirname."> newdir<".newdir.">")
4547    keepj call s:SetRexDir(a:islocal,dirname)
4548   endif
4550  " --------------------------------------
4551  " NetrwBrowseChgDir: Restore and Cleanup {{{3
4552  " --------------------------------------
4553   keepj call s:NetrwOptionRestore("s:")
4554   if dolockout
4555 "   call Decho("(NetrwBrowseChgDir:restore) filewritable(dirname<".dirname.">)=".filewritable(dirname))
4556    if filewritable(dirname)
4557 "    call Decho("(NetrwBrowseChgDir:restore) doing modification lockout settings: ma nomod noro")
4558 "    call Decho("(NetrwBrowseChgDir:restore) setl ma nomod noro")
4559     setl ma nomod noro
4560 "    call Decho("(NetrwBrowseChgDir:restore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
4561    else
4562 "    call Decho("(NetrwBrowseChgDir:restore) doing modification lockout settings: ma nomod ro")
4563 "    call Decho("(NetrwBrowseChgDir:restore) setl ma nomod noro")
4564     setl ma nomod ro
4565 "    call Decho("(NetrwBrowseChgDir:restore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
4566    endif
4567   endif
4568   let @@= ykeep
4570 "  call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
4571   return dirname
4572 endfun
4574 " ---------------------------------------------------------------------
4575 " s:NetrwBrowseX:  (implements "x") executes a special "viewer" script or program for the {{{2
4576 "              given filename; typically this means given their extension.
4577 "              0=local, 1=remote
4578 fun! netrw#NetrwBrowseX(fname,remote)
4579 "  call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
4581   let ykeep      = @@
4582   let screenposn = netrw#NetrwSavePosn()
4584   " special core dump handler
4585   if a:fname =~ '/core\(\.\d\+\)\=$'
4586    if exists("g:Netrw_corehandler")
4587     if type(g:Netrw_corehandler) == 2
4588      " g:Netrw_corehandler is a function reference (see :help Funcref)
4589 "     call Decho("g:Netrw_corehandler is a funcref")
4590      call g:Netrw_corehandler(a:fname)
4591     elseif type(g:Netrw_corehandler) == 3
4592      " g:Netrw_corehandler is a List of function references (see :help Funcref)
4593 "     call Decho("g:Netrw_corehandler is a List")
4594      for Fncref in g:Netrw_corehandler
4595       if type(FncRef) == 2
4596        call FncRef(a:fname)
4597       endif
4598      endfor
4599     endif
4600     call netrw#NetrwRestorePosn(screenposn)
4601     let @@= ykeep
4602 "    call Dret("NetrwBrowseX : coredump handler invoked")
4603     return
4604    endif
4605   endif
4607   " set up the filename
4608   " (lower case the extension, make a local copy of a remote file)
4609   let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
4610   if has("win32") || has("win95") || has("win64") || has("win16")
4611    let exten= substitute(exten,'^.*$','\L&\E','')
4612   endif
4613 "  call Decho("exten<".exten.">")
4615   " seems kde systems often have gnome-open due to dependencies, even though
4616   " gnome-open's subsidiary display tools are largely absent.  Kde systems
4617   " usually have "kdeinit" running, though...  (tnx Mikolaj Machowski)
4618   if !exists("s:haskdeinit")
4619    if has("unix") && executable("ps") && !has("win32unix")
4620     let s:haskdeinit= system("ps -e") =~ 'kdeinit' 
4621     if v:shell_error
4622      let s:haskdeinit = 0
4623     endif
4624    else
4625     let s:haskdeinit= 0
4626    endif
4627 "   call Decho("setting s:haskdeinit=".s:haskdeinit)
4628   endif
4630   if a:remote == 1
4631    " create a local copy
4632 "   call Decho("(remote) a:remote=".a:remote.": create a local copy of <".a:fname.">")
4633    setl bh=delete
4634    call netrw#NetRead(3,a:fname)
4635    " attempt to rename tempfile
4636    let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','')
4637    let newname = substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','')
4638 "   call Decho("basename<".basename.">")
4639 "   call Decho("newname <".newname.">")
4640    if rename(s:netrw_tmpfile,newname) == 0
4641     " renaming succeeded
4642     let fname= newname
4643    else
4644     " renaming failed
4645     let fname= s:netrw_tmpfile
4646    endif
4647   else
4648 "   call Decho("(local) a:remote=".a:remote.": handling local copy of <".a:fname.">")
4649    let fname= a:fname
4650    " special ~ handler for local
4651    if fname =~ '^\~' && expand("$HOME") != ""
4652 "    call Decho('invoking special ~ handler')
4653     let fname= substitute(fname,'^\~',expand("$HOME"),'')
4654    endif
4655   endif
4656 "  call Decho("fname<".fname.">")
4657 "  call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
4659   " set up redirection
4660   if &srr =~ "%s"
4661    if (has("win32") || has("win95") || has("win64") || has("win16"))
4662     let redir= substitute(&srr,"%s","nul","")
4663    else
4664     let redir= substitute(&srr,"%s","/dev/null","")
4665    endif
4666   elseif (has("win32") || has("win95") || has("win64") || has("win16"))
4667    let redir= &srr . "nul"
4668   else
4669    let redir= &srr . "/dev/null"
4670   endif
4671 "  call Decho("set up redirection: redir{".redir."} srr{".&srr."}")
4673   " extract any viewing options.  Assumes that they're set apart by quotes.
4674 "  call Decho("extract any viewing options")
4675   if exists("g:netrw_browsex_viewer")
4676 "   call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
4677    if g:netrw_browsex_viewer =~ '\s'
4678     let viewer  = substitute(g:netrw_browsex_viewer,'\s.*$','','')
4679     let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
4680     let oviewer = ''
4681     let cnt     = 1
4682     while !executable(viewer) && viewer != oviewer
4683      let viewer  = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
4684      let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
4685      let cnt     = cnt + 1
4686      let oviewer = viewer
4687 "     call Decho("!exe: viewer<".viewer.">  viewopt<".viewopt.">")
4688     endwhile
4689    else
4690     let viewer  = g:netrw_browsex_viewer
4691     let viewopt = ""
4692    endif
4693 "   call Decho("viewer<".viewer.">  viewopt<".viewopt.">")
4694   endif
4696   " execute the file handler
4697 "  call Decho("execute the file handler (if any)")
4698   if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
4699 "   call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
4700    let ret= netrwFileHandlers#Invoke(exten,fname)
4702   elseif exists("g:netrw_browsex_viewer") && executable(viewer)
4703 "   call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
4704 "   call Decho("exe sil !".viewer." ".viewopt.shellescape(fname,1).redir)
4705    exe "sil !".viewer." ".viewopt.shellescape(fname,1).redir
4706    let ret= v:shell_error
4708   elseif has("win32") || has("win64")
4709 "   call Decho("windows")
4710    if executable("start")
4711 "    call Decho('exe sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
4712     exe 'sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
4713    elseif executable("rundll32")
4714 "    call Decho('exe sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1))
4715     exe 'sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)
4716    else
4717     call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
4718    endif
4719    call inputsave()|call input("Press <cr> to continue")|call inputrestore()
4720    let ret= v:shell_error
4722   elseif has("win32unix")
4723    let winfname= 'c:\cygwin'.substitute(fname,'/','\\','g')
4724 "   call Decho("cygwin: winfname<".shellescape(winfname,1).">")
4725    if executable("start")
4726 "    call Decho('exe sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1))
4727     exe 'sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1)
4728    elseif executable("rundll32")
4729 "    call Decho('exe sil !rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1))
4730     exe 'sil !rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1)
4731    else
4732     call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
4733    endif
4734    call inputsave()|call input("Press <cr> to continue")|call inputrestore()
4735    let ret= v:shell_error
4737   elseif has("unix") && executable("xdg-open") && !s:haskdeinit
4738 "   call Decho("unix and xdg-open")
4739 "   call Decho("exe sil !xdg-open ".shellescape(fname,1)." ".redir)
4740    exe "sil !xdg-open ".shellescape(fname,1).redir
4741    let ret= v:shell_error
4743   elseif has("unix") && executable("kfmclient") && s:haskdeinit
4744 "   call Decho("unix and kfmclient")
4745 "   call Decho("exe sil !kfmclient exec ".shellescape(fname,1)." ".redir)
4746    exe "sil !kfmclient exec ".shellescape(fname,1)." ".redir
4747    let ret= v:shell_error
4749   elseif has("macunix") && executable("open")
4750 "   call Decho("macunix and open")
4751 "   call Decho("exe sil !open ".shellescape(fname,1)." ".redir)
4752    exe "sil !open ".shellescape(fname,1)." ".redir
4753    let ret= v:shell_error
4755   else
4756    " netrwFileHandlers#Invoke() always returns 0
4757    let ret= netrwFileHandlers#Invoke(exten,fname)
4758   endif
4760   " if unsuccessful, attempt netrwFileHandlers#Invoke()
4761   if ret
4762    let ret= netrwFileHandlers#Invoke(exten,fname)
4763   endif
4765   " restoring redraw! after external file handlers
4766   redraw!
4768   " cleanup: remove temporary file,
4769   "          delete current buffer if success with handler,
4770   "          return to prior buffer (directory listing)
4771   "          Feb 12, 2008: had to de-activiate removal of
4772   "          temporary file because it wasn't getting seen.
4773 "  if a:remote == 1 && fname != a:fname
4774 ""   call Decho("deleting temporary file<".fname.">")
4775 "   call s:NetrwDelete(fname)
4776 "  endif
4778   if a:remote == 1
4779    setl bh=delete bt=nofile
4780    if g:netrw_use_noswf
4781     setl noswf
4782    endif
4783    exe "sil! keepj norm! \<c-o>"
4784 "   redraw!
4785   endif
4786   call netrw#NetrwRestorePosn(screenposn)
4787   let @@= ykeep
4789 "  call Dret("NetrwBrowseX")
4790 endfun
4792 " ---------------------------------------------------------------------
4793 " s:NetrwChgPerm: (implements "gp") change file permission {{{2
4794 fun! s:NetrwChgPerm(islocal,curdir)
4795 "  call Dfunc("s:NetrwChgPerm(islocal=".a:islocal." curdir<".a:curdir.">)")
4796   let ykeep  = @@
4797   call inputsave()
4798   let newperm= input("Enter new permission: ")
4799   call inputrestore()
4800   let chgperm= substitute(g:netrw_chgperm,'\<FILENAME\>',shellescape(expand("<cfile>")),'')
4801   let chgperm= substitute(chgperm,'\<PERM\>',shellescape(newperm),'')
4802 "  call Decho("chgperm<".chgperm.">")
4803   call system(chgperm)
4804   if v:shell_error != 0
4805    keepj call netrw#ErrorMsg(1,"changing permission on file<".expand("<cfile>")."> seems to have failed",75)
4806   endif
4807   if a:islocal
4808    keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4809   endif
4810   let @@= ykeep
4811 "  call Dret("s:NetrwChgPerm")
4812 endfun
4814 " ---------------------------------------------------------------------
4815 " s:NetrwClearExplore: clear explore variables (if any) {{{2
4816 fun! s:NetrwClearExplore()
4817 "  call Dfunc("s:NetrwClearExplore()")
4818   2match none
4819   if exists("s:explore_match")        |unlet s:explore_match        |endif
4820   if exists("s:explore_indx")         |unlet s:explore_indx         |endif
4821   if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif
4822   if exists("s:dirstarstar")          |unlet s:dirstarstar          |endif
4823   if exists("s:explore_prvdir")       |unlet s:explore_prvdir       |endif
4824   if exists("w:netrw_explore_indx")   |unlet w:netrw_explore_indx   |endif
4825   if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
4826   if exists("w:netrw_explore_list")   |unlet w:netrw_explore_list   |endif
4827   if exists("w:netrw_explore_bufnr")  |unlet w:netrw_explore_bufnr  |endif
4828 "   redraw!
4829   echo " "
4830   echo " "
4831 "  call Dret("s:NetrwClearExplore")
4832 endfun
4834 " ---------------------------------------------------------------------
4835 " s:NetrwExploreListUniq: {{{2
4836 fun! s:NetrwExploreListUniq(explist)
4837 "  call Dfunc("s:NetrwExploreListUniq(explist<".string(a:explist).">)")
4839   " this assumes that the list is already sorted
4840   let newexplist= []
4841   for member in a:explist
4842    if !exists("uniqmember") || member != uniqmember
4843     let uniqmember = member
4844     let newexplist = newexplist + [ member ]
4845    endif
4846   endfor
4848 "  call Dret("s:NetrwExploreListUniq newexplist<".string(newexplist).">")
4849   return newexplist
4850 endfun
4852 " ---------------------------------------------------------------------
4853 " s:NetrwForceChgDir: (gd support) Force treatment as a directory {{{2
4854 fun! s:NetrwForceChgDir(islocal,newdir)
4855 "  call Dfunc("s:NetrwForceChgDir(islocal=".a:islocal." newdir<".a:newdir.">)")
4856   let ykeep= @@
4857   if a:newdir !~ '/$'
4858    " ok, looks like force is needed to get directory-style treatment
4859    if a:newdir =~ '@$'
4860     let newdir= substitute(a:newdir,'@$','/','')
4861    elseif a:newdir =~ '[*=|\\]$'
4862     let newdir= substitute(a:newdir,'.$','/','')
4863    else
4864     let newdir= a:newdir.'/'
4865    endif
4866 "   call Decho("adjusting newdir<".newdir."> due to gd")
4867   else
4868    " should already be getting treatment as a directory
4869    let newdir= a:newdir
4870   endif
4871   let newdir= s:NetrwBrowseChgDir(a:islocal,newdir)
4872   call s:NetrwBrowse(a:islocal,newdir)
4873   let @@= ykeep
4874 "  call Dret("s:NetrwForceChgDir")
4875 endfun
4877 " ---------------------------------------------------------------------
4878 " s:NetrwForceFile: (gf support) Force treatment as a file {{{2
4879 fun! s:NetrwForceFile(islocal,newfile)
4880 "  call Dfunc("s:NetrwForceFile(islocal=".a:islocal." newdir<".a:newfile.">)")
4881   if a:newfile =~ '[/@*=|\\]$'
4882    let newfile= substitute(a:newfile,'.$','','')
4883   else
4884    let newfile= a:newfile
4885   endif
4886   if a:islocal
4887    call s:NetrwBrowseChgDir(a:islocal,newfile)
4888   else
4889    call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,newfile))
4890   endif
4891 "  call Dret("s:NetrwForceFile")
4892 endfun
4894 " ---------------------------------------------------------------------
4895 " s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
4896 "          and switches the hiding mode.  The actual hiding is done by
4897 "          s:NetrwListHide().
4898 "             g:netrw_hide= 0: show all
4899 "                           1: show not-hidden files
4900 "                           2: show hidden files only
4901 fun! s:NetrwHide(islocal)
4902 "  call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
4903   let ykeep= @@
4904   let svpos= netrw#NetrwSavePosn()
4906   if exists("s:netrwmarkfilelist_{bufnr('%')}")
4907 "   call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
4908 "   call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
4910    " hide the files in the markfile list
4911    for fname in s:netrwmarkfilelist_{bufnr("%")}
4912 "    call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." l:isk=".&l:isk)
4913     if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
4914      " remove fname from hiding list
4915      let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
4916      let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
4917      let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
4918 "     call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">")
4919     else
4920      " append fname to hiding list
4921      if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
4922       let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
4923      else
4924       let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
4925      endif
4926 "     call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
4927     endif
4928    endfor
4929    keepj call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
4930    let g:netrw_hide= 1
4932   else
4934    " switch between show-all/show-not-hidden/show-hidden
4935    let g:netrw_hide=(g:netrw_hide+1)%3
4936    exe "keepj norm! 0"
4937    if g:netrw_hide && g:netrw_list_hide == ""
4938     keepj call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
4939     let @@= ykeep
4940 "    call Dret("NetrwHide")
4941     return
4942    endif
4943   endif
4945   keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4946   keepj call netrw#NetrwRestorePosn(svpos)
4947   let @@= ykeep
4948 "  call Dret("NetrwHide")
4949 endfun
4951 " ---------------------------------------------------------------------
4952 " s:NetrwHidden: invoked by "gh" {{{2
4953 fun! s:NetrwHidden(islocal)
4954 "  call Dfunc("s:NetrwHidden()")
4955   let ykeep= @@
4956   "  save current position
4957   let svpos= netrw#NetrwSavePosn()
4959   if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
4960    " remove pattern from hiding list
4961    let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
4962   elseif s:Strlen(g:netrw_list_hide) >= 1
4963    let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
4964   else
4965    let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
4966   endif
4968   " refresh screen and return to saved position
4969   keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4970   keepj call netrw#NetrwRestorePosn(svpos)
4971   let @@= ykeep
4972 "  call Dret("s:NetrwHidden")
4973 endfun
4975 " ---------------------------------------------------------------------
4976 "  s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2
4977 fun! s:NetrwHome()
4978   if exists("g:netrw_home")
4979    let home= g:netrw_home
4980   else
4981    " go to vim plugin home
4982    for home in split(&rtp,',') + ['']
4983     if isdirectory(home) && filewritable(home) | break | endif
4984      let basehome= substitute(home,'[/\\]\.vim$','','')
4985     if isdirectory(basehome) && filewritable(basehome)
4986      let home= basehome."/.vim"
4987      break
4988     endif
4989    endfor
4990    if home == ""
4991     " just pick the first directory
4992     let home= substitute(&rtp,',.*$','','')
4993    endif
4994    if (has("win32") || has("win95") || has("win64") || has("win16"))
4995     let home= substitute(home,'/','\\','g')
4996    endif
4997   endif
4998   " insure that the home directory exists
4999   if g:netrw_dirhistmax > 0 && !isdirectory(home)
5000    if exists("g:netrw_mkdir")
5001     call system(g:netrw_mkdir." ".shellescape(home))
5002    else
5003     call mkdir(home)
5004    endif
5005   endif
5006   let g:netrw_home= home
5007   return home
5008 endfun
5010 " ---------------------------------------------------------------------
5011 " s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
5012 fun! s:NetrwLeftmouse(islocal)
5013   if exists("s:netrwdrag")
5014    return
5015   endif
5016 "  call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
5018   let ykeep= @@
5019   " check if the status bar was clicked on instead of a file/directory name
5020   while getchar(0) != 0
5021    "clear the input stream
5022   endwhile
5023   call feedkeys("\<LeftMouse>")
5024   let c          = getchar()
5025   let mouse_lnum = v:mouse_lnum
5026   let wlastline  = line('w$')
5027   let lastline   = line('$')
5028 "  call Decho("v:mouse_lnum=".mouse_lnum." line(w$)=".wlastline." line($)=".lastline." v:mouse_win=".v:mouse_win." winnr#".winnr())
5029 "  call Decho("v:mouse_col =".v:mouse_col."     col=".col(".")."  wincol =".wincol()." winwidth   =".winwidth(0))
5030   if mouse_lnum >= wlastline + 1 || v:mouse_win != winnr()
5031    " appears to be a status bar leftmouse click
5032    let @@= ykeep
5033 "   call Dret("s:NetrwLeftmouse : detected a status bar leftmouse click")
5034    return
5035   endif
5036   if v:mouse_col != col('.')
5037    let @@= ykeep
5038 "   call Dret("s:NetrwLeftmouse : detected a vertical separator bar leftmouse click")
5039    return
5040   endif
5042   if a:islocal
5043    if exists("b:netrw_curdir")
5044     keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
5045    endif
5046   else
5047    if exists("b:netrw_curdir")
5048     keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
5049    endif
5050   endif
5051   let @@= ykeep
5052 "  call Dret("s:NetrwLeftmouse")
5053 endfun
5055 " ---------------------------------------------------------------------
5056 " s:NetrwRightdrag: {{{2
5057 "DechoTabOn
5058 fun! s:NetrwRightdrag(islocal)
5059 "  call Dfunc("s:NetrwRightdrag(islocal=".a:islocal.")")
5060   if !exists("s:netrwdrag")
5061    let s:netrwdrag     = winnr()
5062    call s:NetrwMarkFile(a:islocal,s:NetrwGetWord())
5063    if a:islocal
5064     nno <silent> <s-rightrelease> <leftmouse>:<c-u>call <SID>NetrwRightrelease(1)<cr>
5065    else
5066     nno <silent> <s-rightrelease> <leftmouse>:<c-u>call <SID>NetrwRightrelease(0)<cr>
5067    endif
5068   endif
5069 "  call Dret("s:NetrwRightdrag : s:netrwdrag=".s:netrwdrag." buf#".bufnr("%"))
5070 endfun
5072 " ---------------------------------------------------------------------
5073 " s:NetrwRightrelease: {{{2
5074 fun! s:NetrwRightrelease(islocal)
5075 "  call Dfunc("s:NetrwRightrelease(islocal=".a:islocal.") s:netrwdrag=".s:netrwdrag." buf#".bufnr("%"))
5076   if exists("s:netrwdrag")
5077    nunmap <s-rightrelease>
5078    let tgt = s:NetrwGetWord()
5079 "   call Decho("target#1: ".tgt)
5080    if tgt =~ '/$' && tgt !~ '^\./$'
5081     let tgt = b:netrw_curdir."/".tgt
5082    else
5083     let tgt= b:netrw_curdir
5084    endif
5085 "   call Decho("target#2: ".tgt)
5086    call netrw#NetrwMakeTgt(tgt)
5087    let curwin= winnr()
5088    exe s:netrwdrag."wincmd w"
5089    call s:NetrwMarkFileMove(a:islocal)
5090    exe curwin."wincmd w"
5091    unlet s:netrwdrag
5092   endif
5093 "  call Dret("s:NetrwRightrelease")
5094 endfun
5096 " ---------------------------------------------------------------------
5097 " s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2
5098 " separated patterns given in g:netrw_list_hide
5099 fun! s:NetrwListHide()
5100 "  call Dfunc("NetrwListHide() g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
5101   let ykeep= @@
5103   " find a character not in the "hide" string to use as a separator for :g and :v commands
5104   " How-it-works: take the hiding command, convert it into a range.  Duplicate
5105   " characters don't matter.  Remove all such characters from the '/~...90'
5106   " string.  Use the first character left as a separator character.
5107   let listhide= g:netrw_list_hide
5108   let sep     = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
5109 "  call Decho("sep=".sep)
5111   while listhide != ""
5112    if listhide =~ ','
5113     let hide     = substitute(listhide,',.*$','','e')
5114     let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
5115    else
5116     let hide     = listhide
5117     let listhide = ""
5118    endif
5120    " Prune the list by hiding any files which match
5121    if g:netrw_hide == 1
5122 "    call Decho("hiding<".hide."> listhide<".listhide.">")
5123     exe 'sil! keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
5124    elseif g:netrw_hide == 2
5125 "    call Decho("showing<".hide."> listhide<".listhide.">")
5126     exe 'sil! keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
5127    endif
5128   endwhile
5129   if g:netrw_hide == 2
5130    exe 'sil! keepj '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
5131    exe 'sil! keepj '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
5132   endif
5134   " remove any blank lines that have somehow remained.
5135   " This seems to happen under Windows.
5136   exe 'sil! keepj 1,$g@^\s*$@d'
5138   let @@= ykeep
5139 "  call Dret("NetrwListHide")
5140 endfun
5142 " ---------------------------------------------------------------------
5143 " NetrwHideEdit: allows user to edit the file/directory hiding list
5144 fun! s:NetrwHideEdit(islocal)
5145 "  call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
5147   let ykeep= @@
5148   " save current cursor position
5149   let svpos= netrw#NetrwSavePosn()
5151   " get new hiding list from user
5152   call inputsave()
5153   let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
5154   call inputrestore()
5155   let g:netrw_list_hide= newhide
5156 "  call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">")
5158   " refresh the listing
5159   sil keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
5161   " restore cursor position
5162   call netrw#NetrwRestorePosn(svpos)
5163   let @@= ykeep
5165 "  call Dret("NetrwHideEdit")
5166 endfun
5168 " ---------------------------------------------------------------------
5169 " NetSortSequence: allows user to edit the sorting sequence
5170 fun! s:NetSortSequence(islocal)
5171 "  call Dfunc("NetSortSequence(islocal=".a:islocal.")")
5173   let ykeep= @@
5174   let svpos= netrw#NetrwSavePosn()
5175   call inputsave()
5176   let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
5177   call inputrestore()
5179   " refresh the listing
5180   let g:netrw_sort_sequence= newsortseq
5181   keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5182   keepj call netrw#NetrwRestorePosn(svpos)
5183   let @@= ykeep
5185 "  call Dret("NetSortSequence")
5186 endfun
5188 " ---------------------------------------------------------------------
5189 " s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
5190 fun! s:NetrwMakeDir(usrhost)
5191 "  call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
5193   let ykeep= @@
5194   " get name of new directory from user.  A bare <CR> will skip.
5195   " if its currently a directory, also request will be skipped, but with
5196   " a message.
5197   call inputsave()
5198   let newdirname= input("Please give directory name: ")
5199   call inputrestore()
5200 "  call Decho("newdirname<".newdirname.">")
5202   if newdirname == ""
5203    let @@= ykeep
5204 "   call Dret("NetrwMakeDir : user aborted with bare <cr>")
5205    return
5206   endif
5208   if a:usrhost == ""
5209 "   call Decho("local mkdir")
5211    " Local mkdir:
5212    " sanity checks
5213    let fullnewdir= b:netrw_curdir.'/'.newdirname
5214 "   call Decho("fullnewdir<".fullnewdir.">")
5215    if isdirectory(fullnewdir)
5216     if !exists("g:netrw_quiet")
5217      keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
5218     endif
5219     let @@= ykeep
5220 "    call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
5221     return
5222    endif
5223    if s:FileReadable(fullnewdir)
5224     if !exists("g:netrw_quiet")
5225      keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
5226     endif
5227     let @@= ykeep
5228 "    call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
5229     return
5230    endif
5232    " requested new local directory is neither a pre-existing file or
5233    " directory, so make it!
5234    if exists("*mkdir")
5235     call mkdir(fullnewdir,"p")
5236    else
5237     let netrw_origdir= s:NetrwGetcwd(1)
5238     exe 'keepj lcd '.fnameescape(b:netrw_curdir)
5239 "    call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
5240 "    call Decho("exe sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1))
5241     exe "sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1)
5242     if v:shell_error != 0
5243      let @@= ykeep
5244      call netrw#ErrorMsg(s:ERROR,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",80)
5245 "     call Dret("NetrwMakeDir : failed: sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1))
5246      return
5247     endif
5248     if !g:netrw_keepdir
5249      exe 'keepj lcd '.fnameescape(netrw_origdir)
5250 "     call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
5251     endif
5252    endif
5254    if v:shell_error == 0
5255     " refresh listing
5256 "    call Decho("refresh listing")
5257     let svpos= netrw#NetrwSavePosn()
5258     call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
5259     call netrw#NetrwRestorePosn(svpos)
5260    elseif !exists("g:netrw_quiet")
5261     call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
5262    endif
5263 "   redraw!
5265   elseif !exists("b:netrw_method") || b:netrw_method == 4
5266    " Remote mkdir:
5267 "   call Decho("remote mkdir")
5268    let mkdircmd  = s:MakeSshCmd(g:netrw_mkdir_cmd)
5269    let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
5270 "   call Decho("exe sil! !".mkdircmd." ".shellescape(newdirname,1))
5271    exe "sil! !".mkdircmd." ".shellescape(newdirname,1)
5272    if v:shell_error == 0
5273     " refresh listing
5274     let svpos= netrw#NetrwSavePosn()
5275     keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
5276     keepj call netrw#NetrwRestorePosn(svpos)
5277    elseif !exists("g:netrw_quiet")
5278     keepj call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
5279    endif
5280 "   redraw!
5282   elseif b:netrw_method == 2
5283    let svpos= netrw#NetrwSavePosn()
5284    call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"')
5285    keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
5286    keepj call netrw#NetrwRestorePosn(svpos)
5287   elseif b:netrw_method == 3
5288    let svpos= netrw#NetrwSavePosn()
5289    call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"')
5290    keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
5291    keepj call netrw#NetrwRestorePosn(svpos)
5292   endif
5294   let @@= ykeep
5295 "  call Dret("NetrwMakeDir")
5296 endfun
5298 " ---------------------------------------------------------------------
5299 " s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
5300 "                  mark and unmark files.  If a markfile list exists,
5301 "                  then the rename and delete functions will use it instead
5302 "                  of whatever may happen to be under the cursor at that
5303 "                  moment.  When the mouse and gui are available,
5304 "                  shift-leftmouse may also be used to mark files.
5306 "  Creates two lists
5307 "    s:netrwmarkfilelist    -- holds complete paths to all marked files
5308 "    s:netrwmarkfilelist_#  -- holds list of marked files in current-buffer's directory (#==bufnr())
5310 "  Creates a marked file match string
5311 "    s:netrwmarfilemtch_#   -- used with 2match to display marked files
5313 "  Creates a buffer version of islocal
5314 "    b:netrw_islocal
5315 fun! s:NetrwMarkFile(islocal,fname)
5316 "  call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
5318   " sanity check
5319   if empty(a:fname)
5320 "   call Dret("s:NetrwMarkFile : emtpy fname")
5321    return
5322   endif
5324   let ykeep   = @@
5325   let curbufnr= bufnr("%")
5326   let curdir  = b:netrw_curdir
5327   let trailer = '[@=|\/\*]\=\ze\%(  \|\t\|$\)'
5329   if exists("s:netrwmarkfilelist_{curbufnr}")
5330    " markfile list pre-exists
5331 "   call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
5332 "   call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
5333    let b:netrw_islocal= a:islocal
5335    if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
5336     " append filename to buffer's markfilelist
5337 "    call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
5338     call add(s:netrwmarkfilelist_{curbufnr},a:fname)
5339     let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
5341    else
5342     " remove filename from buffer's markfilelist
5343 "    call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
5344     call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
5345     if s:netrwmarkfilelist_{curbufnr} == []
5346      " local markfilelist is empty; remove it entirely
5347 "     call Decho("markfile list now empty")
5348      call s:NetrwUnmarkList(curbufnr,curdir)
5349     else
5350      " rebuild match list to display markings correctly
5351 "     call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
5352      let s:netrwmarkfilemtch_{curbufnr}= ""
5353      let first                           = 1
5354      for fname in s:netrwmarkfilelist_{curbufnr}
5355       if first
5356        let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
5357       else
5358        let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").trailer
5359       endif
5360       let first= 0
5361      endfor
5362 "     call Decho("ending s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
5363     endif
5364    endif
5366   else
5367    " initialize new markfilelist
5369 "   call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
5370    let s:netrwmarkfilelist_{curbufnr}= []
5371    call add(s:netrwmarkfilelist_{curbufnr},a:fname)
5372 "   call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
5374    " build initial markfile matching pattern
5375    if a:fname =~ '/$'
5376     let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
5377    else
5378     let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).trailer
5379    endif
5380 "   call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
5381   endif
5383   " handle global markfilelist
5384   if exists("s:netrwmarkfilelist")
5385    let dname= s:ComposePath(b:netrw_curdir,a:fname)
5386    if index(s:netrwmarkfilelist,dname) == -1
5387     " append new filename to global markfilelist
5388     call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
5389 "    call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
5390    else
5391     " remove new filename from global markfilelist
5392 "    call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
5393     call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
5394 "    call Decho("ending s:netrwmarkfilelist  <".string(s:netrwmarkfilelist).">")
5395     if s:netrwmarkfilelist == []
5396      unlet s:netrwmarkfilelist
5397     endif
5398    endif
5399   else
5400    " initialize new global-directory markfilelist
5401    let s:netrwmarkfilelist= []
5402    call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
5403 "   call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
5404   endif
5406   " set up 2match'ing to netrwmarkfilemtch list
5407   if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
5408 "   call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
5409    if exists("g:did_drchip_netrwlist_syntax")
5410     exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
5411    endif
5412   else
5413 "   call Decho("2match none")
5414    2match none
5415   endif
5416   let @@= ykeep
5417 "  call Dret("s:NetrwMarkFile : s:netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist").">")
5418 endfun
5420 " ---------------------------------------------------------------------
5421 " s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
5422 "                          compress/decompress files using the programs
5423 "                          in g:netrw_compress and g:netrw_uncompress,
5424 "                          using g:netrw_compress_suffix to know which to
5425 "                          do.  By default:
5426 "                            g:netrw_compress        = "gzip"
5427 "                            g:netrw_decompress      = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf", ".xz" : "unxz"}
5428 fun! s:NetrwMarkFileCompress(islocal)
5429 "  call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
5430   let svpos    = netrw#NetrwSavePosn()
5431   let curdir   = b:netrw_curdir
5432   let curbufnr = bufnr("%")
5434   " sanity check
5435   if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5436    keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5437 "   call Dret("s:NetrwMarkFileCompress")
5438    return
5439   endif
5440 "  call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5442   if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
5444    " for every filename in the marked list
5445    for fname in s:netrwmarkfilelist_{curbufnr}
5446     let sfx= substitute(fname,'^.\{-}\(\.\a\+\)$','\1','')
5447 "    call Decho("extracted sfx<".sfx.">")
5448     if exists("g:netrw_decompress['".sfx."']")
5449      " fname has a suffix indicating that its compressed; apply associated decompression routine
5450      let exe= g:netrw_decompress[sfx]
5451 "     call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
5452      let exe= netrw#WinPath(exe)
5453      if a:islocal
5454       if g:netrw_keepdir
5455        let fname= shellescape(s:ComposePath(curdir,fname))
5456       endif
5457      else
5458       let fname= shellescape(b:netrw_curdir.fname,1)
5459      endif
5460      if executable(exe)
5461       if a:islocal
5462        call system(exe." ".fname)
5463       else
5464        keepj call s:RemoteSystem(exe." ".fname)
5465       endif
5466      else
5467       keepj call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
5468      endif
5469     endif
5470     unlet sfx
5472     if exists("exe")
5473      unlet exe
5474     elseif a:islocal
5475      " fname not a compressed file, so compress it
5476      call system(netrw#WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname)))
5477     else
5478      " fname not a compressed file, so compress it
5479      keepj call s:RemoteSystem(netrw#WinPath(g:netrw_compress)." ".shellescape(fname))
5480     endif
5481    endfor       " for every file in the marked list
5483    call s:NetrwUnmarkList(curbufnr,curdir)
5484    keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5485    keepj call netrw#NetrwRestorePosn(svpos)
5486   endif
5487 "  call Dret("s:NetrwMarkFileCompress")
5488 endfun
5490 " ---------------------------------------------------------------------
5491 " s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
5492 "                      If no marked files, then set up directory as the
5493 "                      target.  Currently does not support copying entire
5494 "                      directories.  Uses the local-buffer marked file list.
5495 "                      Returns 1=success  (used by NetrwMarkFileMove())
5496 "                              0=failure
5497 fun! s:NetrwMarkFileCopy(islocal,...)
5498 "  call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---')."> a:0=".a:0)
5500   if !exists("b:netrw_curdir")
5501    let b:netrw_curdir= getcwd()
5502 "   call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
5503   endif
5504   let curdir   = b:netrw_curdir
5505   let curbufnr = bufnr("%")
5507   " sanity check
5508   if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5509    keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5510 "   call Dret("s:NetrwMarkFileCopy")
5511    return
5512   endif
5513 "  call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5515   if !exists("s:netrwmftgt")
5516    keepj call netrw#ErrorMsg(s:ERROR,"your marked file target is empty! (:help netrw-mt)",67)
5517 "   call Dret("s:NetrwMarkFileCopy 0")
5518    return 0
5519   endif
5520 "  call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
5522   if      a:islocal &&  s:netrwmftgt_islocal
5523    " Copy marked files, local directory to local directory
5524 "   call Decho("copy from local to local")
5525    if !executable(g:netrw_localcopycmd) && g:netrw_localcopycmd !~ '\<cmd\s'
5526     call netrw#ErrorMsg(s:ERROR,"g:netrw_localcopycmd<".g:netrw_localcopycmd."> not executable on your system, aborting",91)
5527 "    call Dfunc("s:NetrwMarkFileMove : g:netrw_localcopycmd<".g:netrw_localcopycmd."> n/a!")
5528     return
5529    endif
5531    " copy marked files while within the same directory (ie. allow renaming)
5532    if simplify(s:netrwmftgt) == simplify(b:netrw_curdir)
5533     if len(s:netrwmarkfilelist_{bufnr('%')}) == 1
5534      " only one marked file
5535      let args    = shellescape(b:netrw_curdir."/".s:netrwmarkfilelist_{bufnr('%')}[0])
5536      let oldname = s:netrwmarkfilelist_{bufnr('%')}[0]
5537     elseif a:0 == 1
5538      " this happens when the next case was used to recursively call s:NetrwMarkFileCopy()
5539      let args    = shellescape(b:netrw_curdir."/".a:1)
5540      let oldname = a:1
5541     else
5542      " copy multiple marked files inside the same directory
5543      let s:recursive= 1
5544      for oldname in s:netrwmarkfilelist_{bufnr("%")}
5545       let ret= s:NetrwMarkFileCopy(a:islocal,oldname)
5546       if ret == 0
5547        break
5548       endif
5549      endfor
5550      unlet s:recursive
5551      call s:NetrwUnmarkList(curbufnr,curdir)
5552 "     call Dret("s:NetrwMarkFileCopy ".ret)
5553      return ret
5554     endif
5556     call inputsave()
5557     let newname= input("Copy ".oldname." to : ",oldname,"file")
5558     call inputrestore()
5559     if newname == ""
5560 "     call Dret("s:NetrwMarkFileCopy 0")
5561      return 0
5562     endif
5563     let args= shellescape(oldname)
5564     let tgt = shellescape(s:netrwmftgt.'/'.newname)
5565    else
5566     let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)"))
5567     let tgt = shellescape(s:netrwmftgt)
5568    endif
5569    if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
5570     let args= substitute(args,'/','\\','g')
5571     let tgt = substitute(tgt, '/','\\','g')
5572    endif
5573    if g:netrw_localcopycmd =~ '\s'
5574     let copycmd     = substitute(g:netrw_localcopycmd,'\s.*$','','')
5575     let copycmdargs = substitute(g:netrw_localcopycmd,'^.\{-}\(\s.*\)$','\1','')
5576     let copycmd     = netrw#WinPath(copycmd).copycmdargs
5577    else
5578     let copycmd = netrw#WinPath(g:netrw_localcopycmd)
5579    endif
5580 "   call Decho("args   <".args.">")
5581 "   call Decho("tgt    <".tgt.">")
5582 "   call Decho("copycmd<".copycmd.">")
5583 "   call Decho("system(".copycmd." ".args." ".tgt.")")
5584    call system(copycmd." ".args." ".tgt)
5585    if v:shell_error != 0
5586     call netrw#ErrorMsg(s:ERROR,"tried using g:netrw_localcopycmd<".g:netrw_localcopycmd.">; it doesn't work!",80)
5587 "    call Dret("s:NetrwMarkFileCopy 0 : failed: system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt))
5588     return 0
5589    endif
5591   elseif  a:islocal && !s:netrwmftgt_islocal
5592    " Copy marked files, local directory to remote directory
5593 "   call Decho("copy from local to remote")
5594    keepj call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
5596   elseif !a:islocal &&  s:netrwmftgt_islocal
5597    " Copy marked files, remote directory to local directory
5598 "   call Decho("copy from remote to local")
5599    keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
5601   elseif !a:islocal && !s:netrwmftgt_islocal
5602    " Copy marked files, remote directory to remote directory
5603 "   call Decho("copy from remote to remote")
5604    let curdir = getcwd()
5605    let tmpdir = s:GetTempfile("")
5606    if tmpdir !~ '/'
5607     let tmpdir= curdir."/".tmpdir
5608    endif
5609    if exists("*mkdir")
5610     call mkdir(tmpdir)
5611    else
5612     exe "sil! !".g:netrw_localmkdir.' '.shellescape(tmpdir,1)
5613     if v:shell_error != 0
5614      call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",80)
5615 "     call Dret("s:NetrwMarkFileCopy : failed: sil! !".g:netrw_localmkdir.' '.shellescape(tmpdir,1) )
5616      return
5617     endif
5618    endif
5619    if isdirectory(tmpdir)
5620     exe "keepj lcd ".fnameescape(tmpdir)
5621     keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
5622     let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
5623     keepj call s:NetrwUpload(localfiles,s:netrwmftgt)
5624     if getcwd() == tmpdir
5625      for fname in s:netrwmarkfilelist_{bufnr('%')}
5626       keepj call s:NetrwDelete(fname)
5627      endfor
5628      exe "keepj lcd ".fnameescape(curdir)
5629      exe "sil !".g:netrw_localrmdir." ".shellescape(tmpdir,1)
5630      if v:shell_error != 0
5631       call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localrmdir<".g:netrw_localrmdir."> to something that works",80)
5632 "      call Dret("s:NetrwMarkFileCopy : failed: sil !".g:netrw_localrmdir." ".shellescape(tmpdir,1) )
5633       return
5634      endif
5635     else
5636      exe "keepj lcd ".fnameescape(curdir)
5637     endif
5638    endif
5639   endif
5641   " -------
5642   " cleanup
5643   " -------
5644 "   call Decho("cleanup")
5645   if !exists("s:recursive")
5646    " remove markings from local buffer
5647    call s:NetrwUnmarkList(curbufnr,curdir)
5648   endif
5650   " refresh buffers
5651   if !s:netrwmftgt_islocal
5652    call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
5653   endif
5654   if a:islocal
5655    keepj call s:NetrwRefreshDir(a:islocal,curdir)
5656   endif
5657   if g:netrw_fastbrowse <= 1
5658    keepj call s:LocalBrowseShellCmdRefresh()
5659   endif
5660   
5661 "  call Dret("s:NetrwMarkFileCopy 1")
5662   return 1
5663 endfun
5665 " ---------------------------------------------------------------------
5666 " s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
5667 "                      invoke vim's diff mode on the marked files.
5668 "                      Either two or three files can be so handled.
5669 "                      Uses the global marked file list.
5670 fun! s:NetrwMarkFileDiff(islocal)
5671 "  call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
5672   let curbufnr= bufnr("%")
5674   " sanity check
5675   if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5676    keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5677 "   call Dret("s:NetrwMarkFileDiff")
5678    return
5679   endif
5680 "  call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5682   if exists("s:netrwmarkfilelist_{."curbufnr}")
5683    let cnt    = 0
5684    let curdir = b:netrw_curdir
5685    for fname in s:netrwmarkfilelist
5686     let cnt= cnt + 1
5687     if cnt == 1
5688 "     call Decho("diffthis: fname<".fname.">")
5689      exe "e ".fnameescape(fname)
5690      diffthis
5691     elseif cnt == 2 || cnt == 3
5692      vsplit
5693      wincmd l
5694 "     call Decho("diffthis: ".fname)
5695      exe "e ".fnameescape(fname)
5696      diffthis
5697     else
5698      break
5699     endif
5700    endfor
5701    call s:NetrwUnmarkList(curbufnr,curdir)
5702   endif
5704 "  call Dret("s:NetrwMarkFileDiff")
5705 endfun
5707 " ---------------------------------------------------------------------
5708 " s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
5709 "                       Uses global markfilelist
5710 fun! s:NetrwMarkFileEdit(islocal)
5711 "  call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
5713   let curdir   = b:netrw_curdir
5714   let curbufnr = bufnr("%")
5716   " sanity check
5717   if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5718    keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5719 "   call Dret("s:NetrwMarkFileEdit")
5720    return
5721   endif
5722 "  call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5724   if exists("s:netrwmarkfilelist_{curbufnr}")
5725    call s:SetRexDir(a:islocal,curdir)
5726    let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
5727    " unmark markedfile list
5728 "   call s:NetrwUnmarkList(curbufnr,curdir)
5729    call s:NetrwUnmarkAll()
5730 "   call Decho("exe sil args ".flist)
5731    exe "sil args ".flist
5732   endif
5733   echo "(use :bn, :bp to navigate files; :Rex to return)"
5734   
5735 "  call Dret("s:NetrwMarkFileEdit")
5736 endfun
5738 " ---------------------------------------------------------------------
5739 " s:NetrwMarkFileQFEL: convert a quickfix-error list into a marked file list {{{2
5740 fun! s:NetrwMarkFileQFEL(islocal,qfel)
5741 "  call Dfunc("s:NetrwMarkFileQFEL(islocal=".a:islocal.",qfel)")
5742   call s:NetrwUnmarkAll()
5743   let curbufnr= bufnr("%")
5745   if !empty(a:qfel)
5746    for entry in a:qfel
5747     let bufnmbr= entry["bufnr"]
5748 "    call Decho("bufname(".bufnmbr.")<".bufname(bufnmbr)."> line#".entry["lnum"]." text=".entry["text"])
5749     if !exists("s:netrwmarkfilelist_{curbufnr}")
5750 "     call Decho("case: no marked file list")
5751      call s:NetrwMarkFile(a:islocal,bufname(bufnmbr))
5752     elseif index(s:netrwmarkfilelist_{curbufnr},bufname(bufnmbr)) == -1
5753      " s:NetrwMarkFile will remove duplicate entries from the marked file list.
5754      " So, this test lets two or more hits on the same pattern to be ignored.
5755 "     call Decho("case: ".bufname(bufnmbr)." not currently in marked file list")
5756      call s:NetrwMarkFile(a:islocal,bufname(bufnmbr))
5757     else
5758 "     call Decho("case: ".bufname(bufnmbr)." already in marked file list")
5759     endif
5760    endfor
5761    echo "(use me to edit marked files)"
5762   else
5763    call netrw#ErrorMsg(s:WARNING,"can't convert quickfix error list; its empty!",92)
5764   endif
5766 "  call Dret("s:NetrwMarkFileQFEL")
5767 endfun
5769 " ---------------------------------------------------------------------
5770 " s:NetrwMarkFileExe: (invoked by mx) execute arbitrary system command on marked files, one at a time {{{2
5771 "                     Uses the local marked-file list.
5772 fun! s:NetrwMarkFileExe(islocal)
5773 "  call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
5774   let svpos    = netrw#NetrwSavePosn()
5775   let curdir   = b:netrw_curdir
5776   let curbufnr = bufnr("%")
5778   " sanity check
5779   if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5780    keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5781 "   call Dret("s:NetrwMarkFileExe")
5782    return
5783   endif
5784 "  call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5786   if exists("s:netrwmarkfilelist_{curbufnr}")
5787    " get the command
5788    call inputsave()
5789    let cmd= input("Enter command: ","","file")
5790    call inputrestore()
5791 "   call Decho("cmd<".cmd.">")
5792    if cmd == ""
5793 "    "   call Dret("s:NetrwMarkFileExe : early exit, empty command")
5794     return
5795    endif
5797    " apply command to marked files.  Substitute: filename -> %
5798    " If no %, then append a space and the filename to the command
5799    for fname in s:netrwmarkfilelist_{curbufnr}
5800     if a:islocal
5801      if g:netrw_keepdir
5802       let fname= shellescape(netrw#WinPath(s:ComposePath(curdir,fname)))
5803      endif
5804     else
5805      let fname= shellescape(netrw#WinPath(b:netrw_curdir.fname))
5806     endif
5807     if cmd =~ '%'
5808      let xcmd= substitute(cmd,'%',fname,'g')
5809     else
5810      let xcmd= cmd.' '.fname
5811     endif
5812     if a:islocal
5813 "     call Decho("local: xcmd<".xcmd.">")
5814      let ret= system(xcmd)
5815     else
5816 "     call Decho("remote: xcmd<".xcmd.">")
5817      let ret= s:RemoteSystem(xcmd)
5818     endif
5819     if v:shell_error < 0
5820      keepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
5821      break
5822     else
5823      echo ret
5824     endif
5825    endfor
5827    " unmark marked file list
5828    call s:NetrwUnmarkList(curbufnr,curdir)
5830    " refresh the listing
5831    keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5832    keepj call netrw#NetrwRestorePosn(svpos)
5833   else
5834    keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
5835   endif
5836   
5837 "  call Dret("s:NetrwMarkFileExe")
5838 endfun
5840 " ---------------------------------------------------------------------
5841 " s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
5842 "                  as the marked file(s) (toggles suffix presence)
5843 "                  Uses the local marked file list.
5844 fun! s:NetrwMarkHideSfx(islocal)
5845 "  call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
5846   let svpos    = netrw#NetrwSavePosn()
5847   let curbufnr = bufnr("%")
5849   " s:netrwmarkfilelist_{curbufnr}: the List of marked files
5850   if exists("s:netrwmarkfilelist_{curbufnr}")
5852    for fname in s:netrwmarkfilelist_{curbufnr}
5853 "     call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
5854      " construct suffix pattern
5855      if fname =~ '\.'
5856       let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
5857      else
5858       let sfxpat= '^\%(\%(\.\)\@!.\)*$'
5859      endif
5860      " determine if its in the hiding list or not
5861      let inhidelist= 0
5862      if g:netrw_list_hide != ""
5863       let itemnum = 0
5864       let hidelist= split(g:netrw_list_hide,',')
5865       for hidepat in hidelist
5866        if sfxpat == hidepat
5867         let inhidelist= 1
5868         break
5869        endif
5870        let itemnum= itemnum + 1
5871       endfor
5872      endif
5873 "     call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
5874      if inhidelist
5875       " remove sfxpat from list
5876       call remove(hidelist,itemnum)
5877       let g:netrw_list_hide= join(hidelist,",")
5878      elseif g:netrw_list_hide != ""
5879       " append sfxpat to non-empty list
5880       let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
5881      else
5882       " set hiding list to sfxpat
5883       let g:netrw_list_hide= sfxpat
5884      endif
5885     endfor
5887    " refresh the listing
5888    keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5889    keepj call netrw#NetrwRestorePosn(svpos)
5890   else
5891    keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
5892   endif
5894 "  call Dret("s:NetrwMarkHideSfx")
5895 endfun
5897 " ---------------------------------------------------------------------
5898 " s:NetrwMarkFileVimCmd: (invoked by mX) execute arbitrary vim command on marked files, one at a time {{{2
5899 "                     Uses the local marked-file list.
5900 fun! s:NetrwMarkFileVimCmd(islocal)
5901 "  call Dfunc("s:NetrwMarkFileVimCmd(islocal=".a:islocal.")")
5902   let svpos    = netrw#NetrwSavePosn()
5903   let curdir   = b:netrw_curdir
5904   let curbufnr = bufnr("%")
5906   " sanity check
5907   if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
5908    keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
5909 "   call Dret("s:NetrwMarkFileVimCmd")
5910    return
5911   endif
5912 "  call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
5914   if exists("s:netrwmarkfilelist_{curbufnr}")
5915    " get the command
5916    call inputsave()
5917    let cmd= input("Enter vim command: ","","file")
5918    call inputrestore()
5919 "   call Decho("cmd<".cmd.">")
5920    if cmd == ""
5921 "    "   call Dret("s:NetrwMarkFileVimCmd : early exit, empty command")
5922     return
5923    endif
5925    " apply command to marked files.  Substitute: filename -> %
5926    " If no %, then append a space and the filename to the command
5927    for fname in s:netrwmarkfilelist_{curbufnr}
5928 "    call Decho("fname<".fname.">")
5929     if a:islocal
5930      1split
5931      exe "sil! keepalt e ".fnameescape(fname)
5932 "     call Decho("local<".fname.">: exe ".cmd)
5933      exe cmd
5934      exe "sil! keepalt wq!"
5935     else
5936 "     call Decho("remote<".fname.">: exe ".cmd." : NOT SUPPORTED YET")
5937      echo "sorry, \"mX\" not supported yet for remote files"
5938     endif
5939    endfor
5941    " unmark marked file list
5942    call s:NetrwUnmarkList(curbufnr,curdir)
5944    " refresh the listing
5945    keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
5946    keepj call netrw#NetrwRestorePosn(svpos)
5947   else
5948    keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
5949   endif
5950   
5951 "  call Dret("s:NetrwMarkFileVimCmd")
5952 endfun
5954 " ---------------------------------------------------------------------
5955 " s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
5956 "                  as the marked file(s) (toggles suffix presence)
5957 "                  Uses the local marked file list.
5958 fun! s:NetrwMarkHideSfx(islocal)
5959 "  call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
5960   let svpos    = netrw#NetrwSavePosn()
5961   let curbufnr = bufnr("%")
5963   " s:netrwmarkfilelist_{curbufnr}: the List of marked files
5964   if exists("s:netrwmarkfilelist_{curbufnr}")
5966    for fname in s:netrwmarkfilelist_{curbufnr}
5967 "     call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
5968      " construct suffix pattern
5969      if fname =~ '\.'
5970       let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
5971      else
5972       let sfxpat= '^\%(\%(\.\)\@!.\)*$'
5973      endif
5974      " determine if its in the hiding list or not
5975      let inhidelist= 0
5976      if g:netrw_list_hide != ""
5977       let itemnum = 0
5978       let hidelist= split(g:netrw_list_hide,',')
5979       for hidepat in hidelist
5980        if sfxpat == hidepat
5981         let inhidelist= 1
5982         break
5983        endif
5984        let itemnum= itemnum + 1
5985       endfor
5986      endif
5987 "     call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
5988      if inhidelist
5989       " remove sfxpat from list
5990       call remove(hidelist,itemnum)
5991       let g:netrw_list_hide= join(hidelist,",")
5992      elseif g:netrw_list_hide != ""
5993       " append sfxpat to non-empty list
5994       let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
5995      else
5996       " set hiding list to sfxpat
5997       let g:netrw_list_hide= sfxpat
5998      endif
5999     endfor
6001    " refresh the listing
6002    keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6003    keepj call netrw#NetrwRestorePosn(svpos)
6004   else
6005    keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
6006   endif
6008 "  call Dret("s:NetrwMarkHideSfx")
6009 endfun
6011 " ---------------------------------------------------------------------
6012 " s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
6013 "                     Uses the global markfilelist
6014 fun! s:NetrwMarkFileGrep(islocal)
6015 "  call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
6016   let svpos    = netrw#NetrwSavePosn()
6017   let curbufnr = bufnr("%")
6019   if exists("s:netrwmarkfilelist")
6020 "  call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
6021    let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
6022    call s:NetrwUnmarkAll()
6023   else
6024 "   call Decho('no marked files, using "*"')
6025    let netrwmarkfilelist= "*"
6026   endif
6028   " ask user for pattern
6029   call inputsave()
6030   let pat= input("Enter pattern: ","")
6031   call inputrestore()
6032   let patbang = ""
6033   if pat =~ '^!'
6034    let patbang = "!"
6035    let pat= strpart(pat,2)
6036   endif
6037   if pat =~ '^\i'
6038    let pat    = escape(pat,'/')
6039    let pat    = '/'.pat.'/'
6040   else
6041    let nonisi = pat[0]
6042   endif
6044   " use vimgrep for both local and remote
6045 "  call Decho("exe vimgrep".patbang." ".pat." ".netrwmarkfilelist)
6046   try
6047    exe "keepj noautocmd vimgrep".patbang." ".pat." ".netrwmarkfilelist
6048   catch /^Vim\%((\a\+)\)\=:E480/
6049    keepj call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pat.">",76)
6050 "   call Dret("s:NetrwMarkFileGrep : unable to find pattern<".pat.">")
6051    return
6052   endtry
6053   echo "(use :cn, :cp to navigate, :Rex to return)"
6055   2match none
6056   keepj call netrw#NetrwRestorePosn(svpos)
6058   if exists("nonisi")
6059    " original, user-supplied pattern did not begin with a character from isident
6060 "   call Decho("looking for trailing nonisi<".nonisi."> followed by a j, gj, or jg")
6061    if pat =~ nonisi.'j$\|'.nonisi.'gj$\|'.nonisi.'jg$'
6062     call s:NetrwMarkFileQFEL(a:islocal,getqflist())
6063    endif
6064   endif
6066 "  call Dret("s:NetrwMarkFileGrep")
6067 endfun
6069 " ---------------------------------------------------------------------
6070 " s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
6071 "                      uses the global marked file list
6072 "                      s:netrwmfloc= 0: target directory is remote
6073 "                                  = 1: target directory is local
6074 fun! s:NetrwMarkFileMove(islocal)
6075 "  call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
6076   let curdir   = b:netrw_curdir
6077   let curbufnr = bufnr("%")
6079   " sanity check
6080   if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
6081    keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
6082 "   call Dret("s:NetrwMarkFileMove")
6083    return
6084   endif
6085 "  call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
6087   if !exists("s:netrwmftgt")
6088    keepj call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
6089 "   call Dret("s:NetrwMarkFileCopy 0")
6090    return 0
6091   endif
6092 "  call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
6094   if      a:islocal &&  s:netrwmftgt_islocal
6095    " move: local -> local
6096 "   call Decho("move from local to local")
6097 "   call Decho("(s:NetrwMarkFileMove) local to local move")
6098    if !executable(g:netrw_localmovecmd) && g:netrw_localmovecmd !~ '\<cmd\s'
6099     call netrw#ErrorMsg(s:ERROR,"g:netrw_localmovecmd<".g:netrw_localmovecmd."> not executable on your system, aborting",90)
6100 "    call Dfunc("s:NetrwMarkFileMove : g:netrw_localmovecmd<".g:netrw_localmovecmd."> n/a!")
6101     return
6102    endif
6103    let tgt         = shellescape(s:netrwmftgt)
6104 "   call Decho("tgt<".tgt.">")
6105    if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
6106     let tgt         = substitute(tgt, '/','\\','g')
6107 "    call Decho("windows exception: tgt<".tgt.">")
6108     if g:netrw_localmovecmd =~ '\s'
6109      let movecmd     = substitute(g:netrw_localmovecmd,'\s.*$','','')
6110      let movecmdargs = substitute(g:netrw_localmovecmd,'^.\{-}\(\s.*\)$','\1','')
6111      let movecmd     = netrw#WinPath(movecmd).movecmdargs
6112 "     call Decho("windows exception: movecmd<".movecmd."> (#1: had a space)")
6113     else
6114      let movecmd = netrw#WinPath(movecmd)
6115 "     call Decho("windows exception: movecmd<".movecmd."> (#2: no space)")
6116     endif
6117    else
6118     let movecmd = netrw#WinPath(g:netrw_localmovecmd)
6119 "    call Decho("movecmd<".movecmd."> (#3 linux or cygwin)")
6120    endif
6121    for fname in s:netrwmarkfilelist_{bufnr("%")}
6122 "    call Decho("system(".movecmd." ".shellescape(fname)." ".tgt.")")
6123     if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
6124      let fname= substitute(fname,'/','\\','g')
6125     endif
6126     let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".tgt)
6127     if v:shell_error != 0
6128      call netrw#ErrorMsg(s:ERROR,"tried using g:netrw_localmovecmd<".g:netrw_localmovecmd.">; it doesn't work!",54)
6129      break
6130     endif
6131    endfor
6133   elseif  a:islocal && !s:netrwmftgt_islocal
6134    " move: local -> remote
6135 "   call Decho("move from local to remote")
6136 "   call Decho("copy")
6137    let mflist= s:netrwmarkfilelist_{bufnr("%")}
6138    keepj call s:NetrwMarkFileCopy(a:islocal)
6139 "   call Decho("remove")
6140    for fname in mflist
6141     let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
6142     let ok        = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
6143    endfor
6144    unlet mflist
6146   elseif !a:islocal &&  s:netrwmftgt_islocal
6147    " move: remote -> local
6148 "   call Decho("move from remote to local")
6149 "   call Decho("copy")
6150    let mflist= s:netrwmarkfilelist_{bufnr("%")}
6151    keepj call s:NetrwMarkFileCopy(a:islocal)
6152 "   call Decho("remove")
6153    for fname in mflist
6154     let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
6155     let ok        = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
6156    endfor
6157    unlet mflist
6159   elseif !a:islocal && !s:netrwmftgt_islocal
6160    " move: remote -> remote
6161 "   call Decho("move from remote to remote")
6162 "   call Decho("copy")
6163    let mflist= s:netrwmarkfilelist_{bufnr("%")}
6164    keepj call s:NetrwMarkFileCopy(a:islocal)
6165 "   call Decho("remove")
6166    for fname in mflist
6167     let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
6168     let ok        = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
6169    endfor
6170    unlet mflist
6171   endif
6173   " -------
6174   " cleanup
6175   " -------
6176 "  call Decho("cleanup")
6178   " remove markings from local buffer
6179   call s:NetrwUnmarkList(curbufnr,curdir)                   " remove markings from local buffer
6181   " refresh buffers
6182   if !s:netrwmftgt_islocal
6183 "   call Decho("refresh netrwmftgt<".s:netrwmftgt.">")
6184    keepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
6185   endif
6186   if a:islocal
6187 "   call Decho("refresh b:netrw_curdir<".b:netrw_curdir.">")
6188    keepj call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
6189   endif
6190   if g:netrw_fastbrowse <= 1
6191 "   call Decho("since g:netrw_fastbrowse=".g:netrw_fastbrowse.", perform shell cmd refresh")
6192    keepj call s:LocalBrowseShellCmdRefresh()
6193   endif
6194   
6195 "  call Dret("s:NetrwMarkFileMove")
6196 endfun
6198 " ---------------------------------------------------------------------
6199 " s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
6200 "                       using the hardcopy command.  Local marked-file list only.
6201 fun! s:NetrwMarkFilePrint(islocal)
6202 "  call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
6203   let curbufnr= bufnr("%")
6205   " sanity check
6206   if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
6207    keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
6208 "   call Dret("s:NetrwMarkFilePrint")
6209    return
6210   endif
6211 "  call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
6212   if exists("s:netrwmarkfilelist_{curbufnr}")
6213    let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
6214    let curdir            = b:netrw_curdir
6215    call s:NetrwUnmarkList(curbufnr,curdir)
6216    for fname in netrwmarkfilelist
6217     if a:islocal
6218      if g:netrw_keepdir
6219       let fname= s:ComposePath(curdir,fname)
6220      endif
6221     else
6222      let fname= curdir.fname
6223     endif
6224     1split
6225     " the autocmds will handle both local and remote files
6226 "    call Decho("exe sil e ".escape(fname,' '))
6227     exe "sil e ".fnameescape(fname)
6228 "    call Decho("hardcopy")
6229     hardcopy
6230     q
6231    endfor
6232    2match none
6233   endif
6234 "  call Dret("s:NetrwMarkFilePrint")
6235 endfun
6237 " ---------------------------------------------------------------------
6238 " s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
6239 "                        files when given a regexp (for which a prompt is
6240 "                        issued) (matches to name of files).
6241 fun! s:NetrwMarkFileRegexp(islocal)
6242 "  call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
6244   " get the regular expression
6245   call inputsave()
6246   let regexp= input("Enter regexp: ","","file")
6247   call inputrestore()
6249   if a:islocal
6250    " get the matching list of files using local glob()
6251 "   call Decho("handle local regexp")
6252    let dirname = escape(b:netrw_curdir,g:netrw_glob_escape)
6253    let files   = glob(s:ComposePath(dirname,regexp))
6254 "   call Decho("files<".files.">")
6255    let filelist= split(files,"\n")
6257   " mark the list of files
6258   for fname in filelist
6259 "   call Decho("fname<".fname.">")
6260    keepj call s:NetrwMarkFile(a:islocal,substitute(fname,'^.*/','',''))
6261   endfor
6263   else
6264 "   call Decho("handle remote regexp")
6266    " convert displayed listing into a filelist
6267    let eikeep = &ei
6268    let areg   = @a
6269    sil keepj %y a
6270    set ei=all ma
6271 "   call Decho("set ei=all ma")
6272    1split
6273    keepj call s:NetrwEnew()
6274    keepj call s:NetrwSafeOptions()
6275    sil keepj norm! "ap
6276    keepj 2
6277    let bannercnt= search('^" =====','W')
6278    exe "sil keepj 1,".bannercnt."d"
6279    set bt=nofile
6280    if     g:netrw_liststyle == s:LONGLIST
6281     sil keepj %s/\s\{2,}\S.*$//e
6282     call histdel("/",-1)
6283    elseif g:netrw_liststyle == s:WIDELIST
6284     sil keepj %s/\s\{2,}/\r/ge
6285     call histdel("/",-1)
6286    elseif g:netrw_liststyle == s:TREELIST
6287     sil keepj %s/^| //e
6288     sil! keepj g/^ .*$/d
6289     call histdel("/",-1)
6290     call histdel("/",-1)
6291    endif
6292    " convert regexp into the more usual glob-style format
6293    let regexp= substitute(regexp,'\*','.*','g')
6294 "   call Decho("regexp<".regexp.">")
6295    exe "sil! keepj v/".escape(regexp,'/')."/d"
6296    call histdel("/",-1)
6297    let filelist= getline(1,line("$"))
6298    q!
6299    for filename in filelist
6300     keepj call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
6301    endfor
6302    unlet filelist
6303    let @a  = areg
6304    let &ei = eikeep
6305   endif
6306   echo "  (use me to edit marked files)"
6308 "  call Dret("s:NetrwMarkFileRegexp")
6309 endfun
6311 " ---------------------------------------------------------------------
6312 " s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
6313 "                        Uses the local marked file list.
6314 fun! s:NetrwMarkFileSource(islocal)
6315 "  call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
6316   let curbufnr= bufnr("%")
6318   " sanity check
6319   if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
6320    keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
6321 "   call Dret("s:NetrwMarkFileSource")
6322    return
6323   endif
6324 "  call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
6325   if exists("s:netrwmarkfilelist_{curbufnr}")
6326    let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
6327    let curdir            = b:netrw_curdir
6328    call s:NetrwUnmarkList(curbufnr,curdir)
6329    for fname in netrwmarkfilelist
6330     if a:islocal
6331      if g:netrw_keepdir
6332       let fname= s:ComposePath(curdir,fname)
6333      endif
6334     else
6335      let fname= curdir.fname
6336     endif
6337     " the autocmds will handle sourcing both local and remote files
6338 "    call Decho("exe so ".fnameescape(fname))
6339     exe "so ".fnameescape(fname)
6340    endfor
6341    2match none
6342   endif
6343 "  call Dret("s:NetrwMarkFileSource")
6344 endfun
6346 " ---------------------------------------------------------------------
6347 " s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
6348 "                     Uses the global markfilelist
6349 fun! s:NetrwMarkFileTag(islocal)
6350 "  call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
6351   let svpos    = netrw#NetrwSavePosn()
6352   let curdir   = b:netrw_curdir
6353   let curbufnr = bufnr("%")
6355   " sanity check
6356   if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
6357    keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
6358 "   call Dret("s:NetrwMarkFileTag")
6359    return
6360   endif
6361 "  call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}))
6363   if exists("s:netrwmarkfilelist")
6364 "   call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
6365    let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")"))
6366    call s:NetrwUnmarkAll()
6368    if a:islocal
6369     if executable(g:netrw_ctags)
6370 "     call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
6371      call system(g:netrw_ctags." ".netrwmarkfilelist)
6372     else
6373      call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
6374     endif
6375    else
6376     let cmd   = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
6377     call netrw#NetrwObtain(a:islocal,"tags")
6378     let curdir= b:netrw_curdir
6379     1split
6380     e tags
6381     let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
6382 "    call Decho("curdir<".curdir."> path<".path.">")
6383     exe 'keepj %s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
6384     call histdel("/",-1)
6385     wq!
6386    endif
6387    2match none
6388    call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6389    call netrw#NetrwRestorePosn(svpos)
6390   endif
6392 "  call Dret("s:NetrwMarkFileTag")
6393 endfun
6395 " ---------------------------------------------------------------------
6396 " s:NetrwMarkFileTgt:  (invoked by mt) This function sets up a marked file target {{{2
6397 "   Sets up two variables, 
6398 "     s:netrwmftgt         : holds the target directory
6399 "     s:netrwmftgt_islocal : 0=target directory is remote
6400 "                            1=target directory is local
6401 fun! s:NetrwMarkFileTgt(islocal)
6402 "  call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
6403   let svpos  = netrw#NetrwSavePosn()
6404   let curdir = b:netrw_curdir
6405   let hadtgt = exists("s:netrwmftgt")
6406   if !exists("w:netrw_bannercnt")
6407    let w:netrw_bannercnt= b:netrw_bannercnt
6408   endif
6410   " set up target
6411   if line(".") < w:netrw_bannercnt
6412    " if cursor in banner region, use b:netrw_curdir for the target unless its already the target
6413    if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal") && s:netrwmftgt == b:netrw_curdir
6414 "    call Decho("cursor in banner region, and target already is <".b:netrw_curdir.">: removing target")
6415     unlet s:netrwmftgt s:netrwmftgt_islocal
6416     if g:netrw_fastbrowse <= 1
6417      call s:LocalBrowseShellCmdRefresh()
6418     endif
6419     call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6420     call netrw#NetrwRestorePosn(svpos)
6421 "    call Dret("s:NetrwMarkFileTgt : removed target")
6422     return
6423    else
6424     let s:netrwmftgt= b:netrw_curdir
6425 "    call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
6426    endif
6428   else
6429    " get word under cursor.
6430    "  * If directory, use it for the target.
6431    "  * If file, use b:netrw_curdir for the target
6432    let curword= s:NetrwGetWord()
6433    let tgtdir = s:ComposePath(curdir,curword)
6434    if a:islocal && isdirectory(tgtdir)
6435     let s:netrwmftgt = tgtdir
6436 "    call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
6437    elseif !a:islocal && tgtdir =~ '/$'
6438     let s:netrwmftgt = tgtdir
6439 "    call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
6440    else
6441     let s:netrwmftgt = curdir
6442 "    call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
6443    endif
6444   endif
6445   if a:islocal
6446    " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
6447    let s:netrwmftgt= simplify(s:netrwmftgt)
6448 "   call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
6449   endif
6450   if g:netrw_cygwin
6451    let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
6452    let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
6453   endif
6454   let s:netrwmftgt_islocal= a:islocal
6456   if g:netrw_fastbrowse <= 1
6457    call s:LocalBrowseShellCmdRefresh()
6458   endif
6459   call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6460   call netrw#NetrwRestorePosn(svpos)
6461   if !hadtgt
6462    sil! keepj norm! j
6463   endif
6465 "  call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
6466 endfun
6468 " ---------------------------------------------------------------------
6469 " s:NetrwOpenFile: query user for a filename and open it {{{2
6470 fun! s:NetrwOpenFile(islocal)
6471 "  call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
6472   let ykeep= @@
6473   call inputsave()
6474   let fname= input("Enter filename: ")
6475   call inputrestore()
6476   if fname !~ '[/\\]'
6477    if exists("b:netrw_curdir")
6478     if exists("g:netrw_quiet")
6479      let netrw_quiet_keep = g:netrw_quiet
6480     endif
6481     let g:netrw_quiet    = 1
6482     if b:netrw_curdir =~ '/$'
6483      exe "e ".fnameescape(b:netrw_curdir.fname)
6484     else
6485      exe "e ".fnameescape(b:netrw_curdir."/".fname)
6486     endif
6487     if exists("netrw_quiet_keep")
6488      let g:netrw_quiet= netrw_quiet_keep
6489     else
6490      unlet g:netrw_quiet
6491     endif
6492    endif
6493   else
6494    exe "e ".fnameescape(fname)
6495   endif
6496   let @@= ykeep
6497 "  call Dret("s:NetrwOpenFile")
6498 endfun
6500 " ---------------------------------------------------------------------
6501 " s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2
6502 "   User access provided by the <mu> mapping. (see :help netrw-mu)
6503 "   Used by many MarkFile functions.
6504 fun! s:NetrwUnmarkList(curbufnr,curdir)
6505 "  call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
6507   "  remove all files in local marked-file list from global list
6508   if exists("s:netrwmarkfilelist_{a:curbufnr}")
6509    for mfile in s:netrwmarkfilelist_{a:curbufnr}
6510     let dfile = s:ComposePath(a:curdir,mfile)       " prepend directory to mfile
6511     let idx   = index(s:netrwmarkfilelist,dfile)    " get index in list of dfile
6512     call remove(s:netrwmarkfilelist,idx)            " remove from global list
6513    endfor
6514    if s:netrwmarkfilelist == []
6515     unlet s:netrwmarkfilelist
6516    endif
6518    " getting rid of the local marked-file lists is easy
6519    unlet s:netrwmarkfilelist_{a:curbufnr}
6520   endif
6521   if exists("s:netrwmarkfilemtch_{a:curbufnr}")
6522    unlet s:netrwmarkfilemtch_{a:curbufnr}
6523   endif
6524   2match none
6525 "  call Dret("s:NetrwUnmarkList")
6526 endfun
6528 " ---------------------------------------------------------------------
6529 " s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
6530 fun! s:NetrwUnmarkAll()
6531 "  call Dfunc("s:NetrwUnmarkAll()")
6532   if exists("s:netrwmarkfilelist")
6533    unlet s:netrwmarkfilelist
6534   endif
6535   sil call s:NetrwUnmarkAll2()
6536   2match none
6537 "  call Dret("s:NetrwUnmarkAll")
6538 endfun
6540 " ---------------------------------------------------------------------
6541 " s:NetrwUnmarkAll2: unmark all files from all buffers {{{2
6542 fun! s:NetrwUnmarkAll2()
6543 "  call Dfunc("s:NetrwUnmarkAll2()")
6544   redir => netrwmarkfilelist_let
6545   let
6546   redir END
6547   let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n')          " convert let string into a let list
6548   call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_ 
6549   call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')")    " remove what the entries are equal to
6550   for flist in netrwmarkfilelist_list
6551    let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
6552    unlet s:netrwmarkfilelist_{curbufnr}
6553    unlet s:netrwmarkfilemtch_{curbufnr}
6554   endfor
6555 "  call Dret("s:NetrwUnmarkAll2")
6556 endfun
6558 " ---------------------------------------------------------------------
6559 " s:NetrwUnMarkFile: {{{2
6560 fun! s:NetrwUnMarkFile(islocal)
6561 "  call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
6562   let svpos    = netrw#NetrwSavePosn()
6563   let curbufnr = bufnr("%")
6565   " unmark marked file list (although I expect s:NetrwUpload()
6566   " to do it, I'm just making sure)
6567   if exists("s:netrwmarkfilelist_{bufnr('%')}")
6568 "   call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
6569    unlet s:netrwmarkfilelist
6570    unlet s:netrwmarkfilelist_{curbufnr}
6571    unlet s:netrwmarkfilemtch_{curbufnr}
6572    2match none
6573   endif
6575 "  call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
6576   call netrw#NetrwRestorePosn(svpos)
6577 "  call Dret("s:NetrwUnMarkFile")
6578 endfun
6580 " ---------------------------------------------------------------------
6581 " s:NetrwMenu: generates the menu for gvim and netrw {{{2
6582 fun! s:NetrwMenu(domenu)
6584   if !exists("g:NetrwMenuPriority")
6585    let g:NetrwMenuPriority= 80
6586   endif
6588   if has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
6589 "   call Dfunc("NetrwMenu(domenu=".a:domenu.")")
6591    if !exists("s:netrw_menu_enabled") && a:domenu
6592 "    call Decho("initialize menu")
6593     let s:netrw_menu_enabled= 1
6594     exe 'sil! menu '.g:NetrwMenuPriority.'.1      '.g:NetrwTopLvlMenu.'Help<tab><F1>    <F1>'
6595     exe 'sil! menu '.g:NetrwMenuPriority.'.5      '.g:NetrwTopLvlMenu.'-Sep1-   :'
6596     exe 'sil! menu '.g:NetrwMenuPriority.'.6      '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>-  -'
6597     exe 'sil! menu '.g:NetrwMenuPriority.'.7      '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x     x'
6598     if g:netrw_dirhistmax > 0
6599      exe 'sil! menu '.g:NetrwMenuPriority.'.8.1   '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb      mb'
6600      exe 'sil! menu '.g:NetrwMenuPriority.'.8.4   '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
6601      exe 'sil! menu '.g:NetrwMenuPriority.'.8.5   '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
6602      exe 'sil! menu '.g:NetrwMenuPriority.'.8.6   '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb      qb'
6603     else
6604      exe 'sil! menu '.g:NetrwMenuPriority.'.8     '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History  :echo "(disabled)"'."\<cr>"
6605     endif
6606     exe 'sil! menu '.g:NetrwMenuPriority.'.9.1    '.g:NetrwTopLvlMenu.'Browsing\ Control.Horizontal\ Split<tab>o        o'
6607     exe 'sil! menu '.g:NetrwMenuPriority.'.9.2    '.g:NetrwTopLvlMenu.'Browsing\ Control.Vertical\ Split<tab>v  v'
6608     exe 'sil! menu '.g:NetrwMenuPriority.'.9.3    '.g:NetrwTopLvlMenu.'Browsing\ Control.New\ Tab<tab>t t'
6609     exe 'sil! menu '.g:NetrwMenuPriority.'.9.4    '.g:NetrwTopLvlMenu.'Browsing\ Control.Preview<tab>p  p'
6610     exe 'sil! menu '.g:NetrwMenuPriority.'.9.5    '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab><ctrl-h>'."       \<c-h>'"
6611     exe 'sil! menu '.g:NetrwMenuPriority.'.9.6    '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S  S'
6612     exe 'sil! menu '.g:NetrwMenuPriority.'.9.7    '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh       gh"
6613     exe 'sil! menu '.g:NetrwMenuPriority.'.9.8    '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l>       \<c-l>"
6614     exe 'sil! menu '.g:NetrwMenuPriority.'.9.9    '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings    '.":NetrwSettings\<cr>"
6615     exe 'sil! menu '.g:NetrwMenuPriority.'.10     '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D     D'
6616     exe 'sil! menu '.g:NetrwMenuPriority.'.11.1   '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Create\ New\ File<tab>%   %'
6617     exe 'sil! menu '.g:NetrwMenuPriority.'.11.1   '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr>      '."\<cr>"
6618     exe 'sil! menu '.g:NetrwMenuPriority.'.11.2   '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p     p'
6619     exe 'sil! menu '.g:NetrwMenuPriority.'.11.3   '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P        P'
6620     exe 'sil! menu '.g:NetrwMenuPriority.'.11.4   '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o     o'
6621     exe 'sil! menu '.g:NetrwMenuPriority.'.11.5   '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v   v'
6622     exe 'sil! menu '.g:NetrwMenuPriority.'.12.1   '.g:NetrwTopLvlMenu.'Explore.Directory\ Name  :Explore '
6623     exe 'sil! menu '.g:NetrwMenuPriority.'.12.2   '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */    :Explore */'
6624     exe 'sil! menu '.g:NetrwMenuPriority.'.12.2   '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/       :Explore **/'
6625     exe 'sil! menu '.g:NetrwMenuPriority.'.12.3   '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *//     :Explore *//'
6626     exe 'sil! menu '.g:NetrwMenuPriority.'.12.4   '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **//        :Explore **//'
6627     exe 'sil! menu '.g:NetrwMenuPriority.'.12.4   '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore        :Nexplore<cr>'
6628     exe 'sil! menu '.g:NetrwMenuPriority.'.12.4   '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore        :Pexplore<cr>'
6629     exe 'sil! menu '.g:NetrwMenuPriority.'.13     '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
6630     exe 'sil! menu '.g:NetrwMenuPriority.'.14.1   '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf  mf'
6631     exe 'sil! menu '.g:NetrwMenuPriority.'.14.2   '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr     mr'
6632     exe 'sil! menu '.g:NetrwMenuPriority.'.14.3   '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a      a'
6633     exe 'sil! menu '.g:NetrwMenuPriority.'.14.4   '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc    mc'
6634     exe 'sil! menu '.g:NetrwMenuPriority.'.14.5   '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D       D'
6635     exe 'sil! menu '.g:NetrwMenuPriority.'.14.6   '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md        md'
6636     exe 'sil! menu '.g:NetrwMenuPriority.'.14.7   '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me        me'
6637     exe 'sil! menu '.g:NetrwMenuPriority.'.14.8   '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx    mx'
6638     exe 'sil! menu '.g:NetrwMenuPriority.'.14.9   '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm    mm'
6639     exe 'sil! menu '.g:NetrwMenuPriority.'.14.10  '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O       O'
6640     exe 'sil! menu '.g:NetrwMenuPriority.'.14.11  '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp       mp'
6641     exe 'sil! menu '.g:NetrwMenuPriority.'.14.12  '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R      R'
6642     exe 'sil! menu '.g:NetrwMenuPriority.'.14.13  '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
6643     exe 'sil! menu '.g:NetrwMenuPriority.'.14.14  '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
6644     exe 'sil! menu '.g:NetrwMenuPriority.'.14.15  '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz       mz'
6645     exe 'sil! menu '.g:NetrwMenuPriority.'.15     '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O       O'
6646     exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.thin<tab>i :let w:netrw_liststyle=0<cr><c-L>'
6647     exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.long<tab>i :let w:netrw_liststyle=1<cr><c-L>'
6648     exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.wide<tab>i :let w:netrw_liststyle=2<cr><c-L>'
6649     exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.tree<tab>i :let w:netrw_liststyle=3<cr><c-L>'
6650     exe 'sil! menu '.g:NetrwMenuPriority.'.16.2.1 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show.Show\ All<tab>a   :let g:netrw_hide=0<cr><c-L>'
6651     exe 'sil! menu '.g:NetrwMenuPriority.'.16.2.3 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show.Normal<tab>a      :let g:netrw_hide=1<cr><c-L>'
6652     exe 'sil! menu '.g:NetrwMenuPriority.'.16.2.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show.Hidden\ Only<tab>a        :let g:netrw_hide=2<cr><c-L>'
6653     exe 'sil! menu '.g:NetrwMenuPriority.'.16.3   '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r   r"
6654     exe 'sil! menu '.g:NetrwMenuPriority.'.16.4.1 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method.Name<tab>s       :let g:netrw_sort_by="name"<cr><c-L>'
6655     exe 'sil! menu '.g:NetrwMenuPriority.'.16.4.2 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method.Time<tab>s       :let g:netrw_sort_by="time"<cr><c-L>'
6656     exe 'sil! menu '.g:NetrwMenuPriority.'.16.4.3 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method.Size<tab>s       :let g:netrw_sort_by="size"<cr><c-L>'
6657     exe 'sil! menu '.g:NetrwMenuPriority.'.17     '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R     R'
6658     exe 'sil! menu '.g:NetrwMenuPriority.'.18     '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c    c'
6659     let s:netrw_menucnt= 28
6660     call s:NetrwBookmarkMenu() " provide some history!  uses priorities 2,3, reserves 4, 8.2.x
6661     call s:NetrwTgtMenu()      " let bookmarks and history be easy targets
6663    elseif !a:domenu
6664     let s:netrwcnt = 0
6665     let curwin     = winnr()
6666     windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
6667     exe curwin."wincmd w"
6669     if s:netrwcnt <= 1
6670 "     call Decho("clear menus")
6671      exe 'sil! unmenu '.g:NetrwTopLvlMenu
6672 "     call Decho('exe sil! unmenu '.g:NetrwTopLvlMenu.'*')
6673      sil! unlet s:netrw_menu_enabled
6674     endif
6675    endif
6676 "   call Dret("NetrwMenu")
6677    return
6678   endif
6680 endfun
6682 " ---------------------------------------------------------------------
6683 " s:NetrwObtain: obtain file under cursor or from markfile list {{{2
6684 "                Used by the O maps (as <SID>NetrwObtain())
6685 fun! s:NetrwObtain(islocal)
6686 "  call Dfunc("NetrwObtain(islocal=".a:islocal.")")
6688   let ykeep= @@
6689   if exists("s:netrwmarkfilelist_{bufnr('%')}")
6690    let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\+://'
6691    call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr('%')})
6692    call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
6693   else
6694    call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
6695   endif
6696   let @@= ykeep
6698 "  call Dret("NetrwObtain")
6699 endfun
6701 " ---------------------------------------------------------------------
6702 " s:NetrwPrevWinOpen: open file/directory in previous window.  {{{2
6703 "   If there's only one window, then the window will first be split.
6704 "   Returns:
6705 "     choice = 0 : didn't have to choose
6706 "     choice = 1 : saved modified file in window first
6707 "     choice = 2 : didn't save modified file, opened window
6708 "     choice = 3 : cancel open
6709 fun! s:NetrwPrevWinOpen(islocal)
6710 "  call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
6712   let ykeep= @@
6713   " grab a copy of the b:netrw_curdir to pass it along to newly split windows
6714   let curdir    = b:netrw_curdir
6716   " get last window number and the word currently under the cursor
6717   let lastwinnr = winnr("$")
6718   let curword   = s:NetrwGetWord()
6719   let choice    = 0
6720 "  call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
6722   let didsplit  = 0
6723   if lastwinnr == 1
6724    " if only one window, open a new one first
6725 "   call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
6726    if g:netrw_preview
6727     let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
6728 "    call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s")
6729     exe (g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s"
6730    else
6731     let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
6732 "    call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
6733     exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
6734    endif
6735    let didsplit  = 1
6737   else
6738    keepj call s:SaveBufVars()
6739 "   call Decho("wincmd p")
6740    wincmd p
6741    keepj call s:RestoreBufVars()
6742    " if the previous window's buffer has been changed (is modified),
6743    " and it doesn't appear in any other extant window, then ask the
6744    " user if s/he wants to abandon modifications therein.
6745    let bnr    = winbufnr(0)
6746    let bnrcnt = 0
6747    if &mod
6748 "    call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
6749     let eikeep= &ei
6750     set ei=all
6751     windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
6752     exe bnr."wincmd p"
6753     let &ei= eikeep
6754 "    call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
6755     if bnrcnt == 1
6756      let bufname = bufname(winbufnr(winnr()))
6757      let choice  = confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
6758 "     call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
6760      if choice == 1
6761       " Yes -- write file & then browse
6762       let v:errmsg= ""
6763       sil w
6764       if v:errmsg != ""
6765        call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
6766        if didsplit
6767         q
6768        else
6769         wincmd p
6770        endif
6771        let @@= ykeep
6772 "       call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
6773        return choice
6774       endif
6776      elseif choice == 2
6777       " No -- don't worry about changed file, just browse anyway
6778 "      call Decho("(NetrwPrevWinOpen) setl nomod")
6779       setl nomod
6780 "      call Decho("(NetrwPrevWinOpen) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
6781       keepj call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
6782       wincmd p
6784      else
6785       " Cancel -- don't do this
6786       if didsplit
6787        q
6788       else
6789        wincmd p
6790       endif
6791       let @@= ykeep
6792 "      call Dret("NetrwPrevWinOpen ".choice." : cancelled")
6793       return choice
6794      endif
6795     endif
6796    endif
6797   endif
6799   " restore b:netrw_curdir (window split/enew may have lost it)
6800   let b:netrw_curdir= curdir
6801   if a:islocal < 2
6802    if a:islocal
6803     call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
6804    else
6805     call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
6806    endif
6807   endif
6808   let @@= ykeep
6809 "  call Dret("NetrwPrevWinOpen ".choice)
6810   return choice
6811 endfun
6813 " ---------------------------------------------------------------------
6814 " s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
6815 "                Always assumed to be local -> remote
6816 "                call s:NetrwUpload(filename, target)
6817 "                call s:NetrwUpload(filename, target, fromdirectory)
6818 fun! s:NetrwUpload(fname,tgt,...)
6819 "  call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
6821   if a:tgt =~ '^\a\+://'
6822    let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
6823   else
6824    let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
6825   endif
6826 "  call Decho("tgtdir<".tgtdir.">")
6828   if a:0 > 0
6829    let fromdir= a:1
6830   else
6831    let fromdir= getcwd()
6832   endif
6833 "  call Decho("fromdir<".fromdir.">")
6835   if type(a:fname) == 1
6836    " handle uploading a single file using NetWrite
6837 "   call Decho("handle uploading a single file via NetWrite")
6838    1split
6839 "   call Decho("exe e ".fnameescape(a:fname))
6840    exe "e ".fnameescape(a:fname)
6841 "   call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
6842    if a:tgt =~ '/$'
6843     let wfname= substitute(a:fname,'^.*/','','')
6844 "    call Decho("exe w! ".fnameescape(wfname))
6845     exe "w! ".fnameescape(a:tgt.wfname)
6846    else
6847 "    call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
6848     exe "w ".fnameescape(a:tgt)
6849 "    call Decho("done writing local->remote")
6850    endif
6851    q!
6853   elseif type(a:fname) == 3
6854    " handle uploading a list of files via scp
6855 "   call Decho("handle uploading a list of files via scp")
6856    let curdir= getcwd()
6857    if a:tgt =~ '^scp:'
6858     exe "keepjumps sil lcd ".fnameescape(fromdir)
6859     let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
6860     let args    = join(map(filelist,"shellescape(v:val, 1)"))
6861     if exists("g:netrw_port") && g:netrw_port != ""
6862      let useport= " ".g:netrw_scpport." ".g:netrw_port
6863     else
6864      let useport= ""
6865     endif
6866     let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
6867     let tgt     = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
6868 "    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1))
6869     exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)
6870     exe "keepjumps sil lcd ".fnameescape(curdir)
6872    elseif a:tgt =~ '^ftp:'
6873     call s:NetrwMethod(a:tgt)
6875     if b:netrw_method == 2
6876      " handle uploading a list of files via ftp+.netrc
6877      let netrw_fname = b:netrw_fname
6878      sil keepj new
6879 "     call Decho("filter input window#".winnr())
6881      keepj put =g:netrw_ftpmode
6882 "     call Decho("filter input: ".getline('$'))
6884      if exists("g:netrw_ftpextracmd")
6885       keepj put =g:netrw_ftpextracmd
6886 "      call Decho("filter input: ".getline('$'))
6887      endif
6889      keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
6890 "     call Decho("filter input: ".getline('$'))
6892      if tgtdir == ""
6893       let tgtdir= '/'
6894      endif
6895      keepj call setline(line("$")+1,'cd "'.tgtdir.'"')
6896 "     call Decho("filter input: ".getline('$'))
6898      for fname in a:fname
6899       keepj call setline(line("$")+1,'put "'.fname.'"')
6900 "      call Decho("filter input: ".getline('$'))
6901      endfor
6903      if exists("g:netrw_port") && g:netrw_port != ""
6904 "      call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
6905       exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
6906      else
6907 "      call Decho("filter input window#".winnr())
6908 "      call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
6909       exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
6910      endif
6911      " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
6912      sil keepj g/Local directory now/d
6913      call histdel("/",-1)
6914      if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
6915       call netrw#ErrorMsg(s:ERROR,getline(1),14)
6916      else
6917       bw!|q
6918      endif
6920     elseif b:netrw_method == 3
6921      " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
6922      let netrw_fname= b:netrw_fname
6923      keepj call s:SaveBufVars()|sil keepj new|keepj call s:RestoreBufVars()
6924      let tmpbufnr= bufnr("%")
6925      setl ff=unix
6927      if exists("g:netrw_port") && g:netrw_port != ""
6928       keepj put ='open '.g:netrw_machine.' '.g:netrw_port
6929 "      call Decho("filter input: ".getline('$'))
6930      else
6931       keepj put ='open '.g:netrw_machine
6932 "      call Decho("filter input: ".getline('$'))
6933      endif
6935      if exists("g:netrw_uid") && g:netrw_uid != ""
6936       if exists("g:netrw_ftp") && g:netrw_ftp == 1
6937        keepj put =g:netrw_uid
6938 "       call Decho("filter input: ".getline('$'))
6939        if exists("s:netrw_passwd")
6940         keepj call setline(line("$")+1,'"'.s:netrw_passwd.'"')
6941        endif
6942 "       call Decho("filter input: ".getline('$'))
6943       elseif exists("s:netrw_passwd")
6944        keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
6945 "       call Decho("filter input: ".getline('$'))
6946       endif
6947      endif
6949      keepj call setline(line("$")+1,'lcd "'.fromdir.'"')
6950 "     call Decho("filter input: ".getline('$'))
6952      if exists("b:netrw_fname") && b:netrw_fname != ""
6953       keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
6954 "      call Decho("filter input: ".getline('$'))
6955      endif
6957      if exists("g:netrw_ftpextracmd")
6958       keepj put =g:netrw_ftpextracmd
6959 "      call Decho("filter input: ".getline('$'))
6960      endif
6962      for fname in a:fname
6963       keepj call setline(line("$")+1,'put "'.fname.'"')
6964 "      call Decho("filter input: ".getline('$'))
6965      endfor
6967      " perform ftp:
6968      " -i       : turns off interactive prompting from ftp
6969      " -n  unix : DON'T use <.netrc>, even though it exists
6970      " -n  win32: quit being obnoxious about password
6971      keepj norm! 1Gdd
6972 "     call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
6973      exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
6974      " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
6975      sil keepj g/Local directory now/d
6976      call histdel("/",-1)
6977      if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
6978       let debugkeep= &debug
6979       setl debug=msg
6980       call netrw#ErrorMsg(s:ERROR,getline(1),15)
6981       let &debug = debugkeep
6982       let mod    = 1
6983      else
6984       bw!|q
6985      endif
6986     elseif !exists("b:netrw_method") || b:netrw_method < 0
6987 "     call Dfunc("netrw#NetrwUpload : unsupported method")
6988      return
6989     endif
6990    else
6991     call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
6992    endif
6993   endif
6995 "  call Dret("s:NetrwUpload")
6996 endfun
6998 " ---------------------------------------------------------------------
6999 " s:NetrwPreview: {{{2
7000 fun! s:NetrwPreview(path) range
7001 "  call Dfunc("NetrwPreview(path<".a:path.">)")
7002   let ykeep= @@
7003   keepj call s:NetrwOptionSave("s:")
7004   keepj call s:NetrwSafeOptions()
7005   if has("quickfix")
7006    if !isdirectory(a:path)
7007     if g:netrw_preview && !g:netrw_alto
7008      let pvhkeep = &pvh
7009      let winsz   = (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
7010      let &pvh    = winwidth(0) - winsz
7011     endif
7012     exe (g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
7013     if exists("pvhkeep")
7014      let &pvh= pvhkeep
7015     endif
7016    elseif !exists("g:netrw_quiet")
7017     keepj call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
7018    endif
7019   elseif !exists("g:netrw_quiet")
7020    keepj call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39)
7021   endif
7022   keepj call s:NetrwOptionRestore("s:")
7023   let @@= ykeep
7024 "  call Dret("NetrwPreview")
7025 endfun
7027 " ---------------------------------------------------------------------
7028 " s:NetrwRefresh: {{{2
7029 fun! s:NetrwRefresh(islocal,dirname)
7030 "  call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction)
7031   " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
7032   " (defunct) NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here.
7033   " (defunct) Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself.
7034   setl ma noro
7035 "  call Decho("setl ma noro")
7036 "  call Decho("clear buffer<".expand("%")."> with :%d")
7037   let ykeep      = @@
7038   let screenposn = netrw#NetrwSavePosn()
7039 "  call Decho("clearing buffer prior to refresh")
7040   sil! keepj %d
7041   if a:islocal
7042    keepj call netrw#LocalBrowseCheck(a:dirname)
7043   else
7044    keepj call s:NetrwBrowse(a:islocal,a:dirname)
7045   endif
7046   keepj call netrw#NetrwRestorePosn(screenposn)
7048   " restore file marks
7049   if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
7050 "   call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
7051    exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
7052   else
7053 "   call Decho("2match none")
7054    2match none
7055   endif
7057 "  restore
7058   let @@= ykeep
7059 "  call Dret("NetrwRefresh")
7060 endfun
7062 " ---------------------------------------------------------------------
7063 " s:NetrwRefreshDir: refreshes a directory by name {{{2
7064 "                    Called by NetrwMarkFileCopy()
7065 "                    Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh()
7066 fun! s:NetrwRefreshDir(islocal,dirname)
7067 "  call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) g:netrw_fastbrowse=".g:netrw_fastbrowse)
7068   if g:netrw_fastbrowse == 0
7069    " slowest mode (keep buffers refreshed, local or remote)
7070 "   call Decho("slowest mode: keep buffers refreshed, local or remote")
7071    let tgtwin= bufwinnr(a:dirname)
7072 "   call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin)
7074    if tgtwin > 0
7075     " tgtwin is being displayed, so refresh it
7076     let curwin= winnr()
7077 "    call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")")
7078     exe tgtwin."wincmd w"
7079     keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) 
7080     exe curwin."wincmd w"
7082    elseif bufnr(a:dirname) > 0
7083     let bn= bufnr(a:dirname)
7084 "    call Decho("bd bufnr(".a:dirname.")=".bn)
7085     exe "sil bd ".bn
7086    endif
7088   elseif g:netrw_fastbrowse <= 1
7089 "   call Decho("medium-speed mode: refresh local buffers only")
7090    keepj call s:LocalBrowseShellCmdRefresh()
7091   endif
7092 "  call Dret("s:NetrwRefreshDir")
7093 endfun
7095 " ---------------------------------------------------------------------
7096 " s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
7097 "          What this function does is to compute a priority for the patterns
7098 "          in the g:netrw_sort_sequence.  It applies a substitute to any
7099 "          "files" that satisfy each pattern, putting the priority / in
7100 "          front.  An "*" pattern handles the default priority.
7101 fun! s:NetrwSetSort()
7102 "  call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
7103   let ykeep= @@
7104   if w:netrw_liststyle == s:LONGLIST
7105    let seqlist  = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
7106   else
7107    let seqlist  = g:netrw_sort_sequence
7108   endif
7109   " sanity check -- insure that * appears somewhere
7110   if seqlist == ""
7111    let seqlist= '*'
7112   elseif seqlist !~ '\*'
7113    let seqlist= seqlist.',*'
7114   endif
7115   let priority = 1
7116   while seqlist != ""
7117    if seqlist =~ ','
7118     let seq     = substitute(seqlist,',.*$','','e')
7119     let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
7120    else
7121     let seq     = seqlist
7122     let seqlist = ""
7123    endif
7124    if priority < 10
7125     let spriority= "00".priority.g:netrw_sepchr
7126    elseif priority < 100
7127     let spriority= "0".priority.g:netrw_sepchr
7128    else
7129     let spriority= priority.g:netrw_sepchr
7130    endif
7131 "   call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
7133    " sanity check
7134    if w:netrw_bannercnt > line("$")
7135     " apparently no files were left after a Hiding pattern was used
7136 "    call Dret("SetSort : no files left after hiding")
7137     return
7138    endif
7139    if seq == '*'
7140     let starpriority= spriority
7141    else
7142     exe 'sil keepj '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
7143     call histdel("/",-1)
7144     " sometimes multiple sorting patterns will match the same file or directory.
7145     " The following substitute is intended to remove the excess matches.
7146     exe 'sil keepj '.w:netrw_bannercnt.',$g/^\d\{3}'.g:netrw_sepchr.'\d\{3}\//s/^\d\{3}'.g:netrw_sepchr.'\(\d\{3}\/\).\@=/\1/e'
7147     keepj call histdel("/",-1)
7148    endif
7149    let priority = priority + 1
7150   endwhile
7151   if exists("starpriority")
7152    exe 'sil keepj '.w:netrw_bannercnt.',$v/^\d\{3}'.g:netrw_sepchr.'/s/^/'.starpriority.'/'
7153    keepj call histdel("/",-1)
7154   endif
7156   " Following line associated with priority -- items that satisfy a priority
7157   " pattern get prefixed by ###/ which permits easy sorting by priority.
7158   " Sometimes files can satisfy multiple priority patterns -- only the latest
7159   " priority pattern needs to be retained.  So, at this point, these excess
7160   " priority prefixes need to be removed, but not directories that happen to
7161   " be just digits themselves.
7162   exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\d\{3}'.g:netrw_sepchr.'\)\%(\d\{3}'.g:netrw_sepchr.'\)\+\ze./\1/e'
7163   keepj call histdel("/",-1)
7164   let @@= ykeep
7166 "  call Dret("SetSort")
7167 endfun
7169 " ---------------------------------------------------------------------
7170 " s:NetrwSetTgt: sets the target to the specified choice index {{{2
7171 "    Implements [count]Tb  (bookhist<b>)
7172 "               [count]Th  (bookhist<h>)
7173 "               See :help netrw-qb for how to make the choice.
7174 fun! s:NetrwSetTgt(bookhist,choice)
7175 "  call Dfunc("s:NetrwSetTgt(bookhist<".a:bookhist."> choice#".a:choice.")")
7177   if     a:bookhist == 'b'
7178    " supports choosing a bookmark as a target using a qb-generated list
7179    let choice= a:choice - 1
7180    if exists("g:netrw_bookmarklist[".choice."]")
7181     call netrw#NetrwMakeTgt(g:netrw_bookmarklist[choice])
7182    else
7183     echomsg "Sorry, bookmark#".a:choice." doesn't exist!"
7184    endif
7186   elseif a:bookhist == 'h'
7187    " supports choosing a history stack entry as a target using a qb-generated list
7188    let choice= (a:choice % g:netrw_dirhistmax) + 1
7189    if exists("g:netrw_dirhist_".choice)
7190     let histentry = g:netrw_dirhist_{choice}
7191     call netrw#NetrwMakeTgt(histentry)
7192    else
7193     echomsg "Sorry, history#".a:choice." not available!"
7194    endif
7195   endif
7197 "  call Dret("s:NetrwSetTgt")
7198 endfun
7200 " =====================================================================
7201 " s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
7202 fun! s:NetrwSortStyle(islocal)
7203 "  call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
7204   keepj call s:NetrwSaveWordPosn()
7205   let svpos= netrw#NetrwSavePosn()
7207   let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name'
7208   keepj norm! 0
7209   keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
7210   keepj call netrw#NetrwRestorePosn(svpos)
7212 "  call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
7213 endfun
7215 " ---------------------------------------------------------------------
7216 " s:NetrwSplit: mode {{{2
7217 "           =0 : net   and o
7218 "           =1 : net   and t
7219 "           =2 : net   and v
7220 "           =3 : local and o
7221 "           =4 : local and t
7222 "           =5 : local and v
7223 fun! s:NetrwSplit(mode)
7224 "  call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
7226   let ykeep= @@
7227   call s:SaveWinVars()
7229   if a:mode == 0
7230    " remote and o
7231    let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
7232 "   call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
7233    exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
7234    let s:didsplit= 1
7235    keepj call s:RestoreWinVars()
7236    keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
7237    unlet s:didsplit
7239   elseif a:mode == 1
7240    " remote and t
7241    let newdir  = s:NetrwBrowseChgDir(0,s:NetrwGetWord())
7242 "   call Decho("tabnew")
7243    tabnew
7244    let s:didsplit= 1
7245    keepj call s:RestoreWinVars()
7246    keepj call s:NetrwBrowse(0,newdir)
7247    unlet s:didsplit
7249   elseif a:mode == 2
7250    " remote and v
7251    let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
7252 "   call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v")
7253    exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
7254    let s:didsplit= 1
7255    keepj call s:RestoreWinVars()
7256    keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
7257    unlet s:didsplit
7259   elseif a:mode == 3
7260    " local and o
7261    let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
7262 "   call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s")
7263    exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
7264    let s:didsplit= 1
7265    keepj call s:RestoreWinVars()
7266    keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
7267    unlet s:didsplit
7269   elseif a:mode == 4
7270    " local and t
7271    let cursorword  = s:NetrwGetWord()
7272    let netrw_curdir= s:NetrwTreeDir()
7273 "   call Decho("tabnew")
7274    tabnew
7275    let b:netrw_curdir= netrw_curdir
7276    let s:didsplit= 1
7277    keepj call s:RestoreWinVars()
7278    keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
7279    unlet s:didsplit
7281   elseif a:mode == 5
7282    " local and v
7283    let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
7284 "   call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v")
7285    exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
7286    let s:didsplit= 1
7287    keepj call s:RestoreWinVars()
7288    keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
7289    unlet s:didsplit
7291   else
7292    keepj call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
7293   endif
7295   let @@= ykeep
7296 "  call Dret("s:NetrwSplit")
7297 endfun
7299 " ---------------------------------------------------------------------
7300 " s:NetrwTgtMenu: {{{2
7301 fun! s:NetrwTgtMenu()
7302   if !exists("s:netrw_menucnt")
7303    return
7304   endif
7305 "  call Dfunc("s:NetrwTgtMenu()")
7307   " the following test assures that gvim is running, has menus available, and has menus enabled.
7308   if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
7309    if exists("g:NetrwTopLvlMenu")
7310 "    call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
7311     exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Targets'
7312    endif
7313    if !exists("s:netrw_initbookhist")
7314     call s:NetrwBookHistRead()
7315    endif
7317    " target bookmarked places
7318    if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0
7319 "    call Decho("installing bookmarks as easy targets")
7320     let cnt= 1
7321     for bmd in g:netrw_bookmarklist
7322      let ebmd= escape(bmd,g:netrw_menu_escape)
7323      " show bookmarks for goto menu
7324 "     call Decho("menu: Targets: ".bmd)
7325      exe 'sil! menu <silent> '.g:NetrwMenuPriority.".19.1.".cnt." ".g:NetrwTopLvlMenu.'Targets.'.ebmd." :call netrw#NetrwMakeTgt('".bmd."')\<cr>"
7326      let cnt= cnt + 1
7327     endfor
7328    endif
7330    " target directory browsing history
7331    if exists("g:netrw_dirhistmax") && g:netrw_dirhistmax > 0
7332 "    call Decho("installing history as easy targets (histmax=".g:netrw_dirhistmax.")")
7333     let histcnt = 1
7334     while histcnt <= g:netrw_dirhistmax
7335      let priority = g:netrw_dirhist_cnt + histcnt
7336      if exists("g:netrw_dirhist_{histcnt}")
7337       let histentry  = g:netrw_dirhist_{histcnt}
7338       let ehistentry = escape(histentry,g:netrw_menu_escape)
7339 "      call Decho("menu: Targets: ".histentry)
7340       exe 'sil! menu <silent> '.g:NetrwMenuPriority.".19.2.".priority." ".g:NetrwTopLvlMenu.'Targets.'.ehistentry."     :call netrw#NetrwMakeTgt('".histentry."')\<cr>"
7341      endif
7342      let histcnt = histcnt + 1
7343     endwhile
7344    endif
7345   endif
7346 "  call Dret("s:NetrwTgtMenu")
7347 endfun
7349 " ---------------------------------------------------------------------
7350 " s:NetrwTreeDir: determine tree directory given current cursor position {{{2
7351 " (full path directory with trailing slash returned)
7352 fun! s:NetrwTreeDir()
7353 "  call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
7355   let treedir= b:netrw_curdir
7356 "  call Decho("(NetrwTreeDir) set initial treedir<".treedir.">")
7357   let s:treecurpos= netrw#NetrwSavePosn()
7359   if w:netrw_liststyle == s:TREELIST
7360 "   call Decho("(NetrwTreeDir) w:netrw_liststyle is TREELIST:")
7361 "   call Decho("(NetrwTreeDir) line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
7363    " extract tree directory if on a line specifying a subdirectory (ie. ends with "/")
7364    if getline('.') =~ '/$'
7365     let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
7366    else
7367     let treedir= ""
7368    endif
7369 "   call Decho("(NetrwTreeDir) treedir<".treedir.">")
7371    " detect user attempting to close treeroot
7372    if getline('.') !~ '|' && getline('.') != '..'
7373 "    call Decho("user attempted to close treeroot")
7374     " now force a refresh
7375 "    call Decho("(NetrwTreeDir) clear buffer<".expand("%")."> with :%d")
7376     sil! keepj %d
7377 "    call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
7378     return b:netrw_curdir
7379    endif
7381    " elide all non-depth information
7382    let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
7383 "   call Decho("(NetrwTreeDir) depth<".depth."> 1st subst (non-depth info removed)")
7385    " elide first depth
7386    let depth = substitute(depth,'^| ','','')
7387 "   call Decho("(NetrwTreeDir) depth<".depth."> 2nd subst (first depth removed)")
7389    " construct treedir by searching backwards at correct depth
7390 "   call Decho("(NetrwTreeDir) constructing treedir<".treedir."> depth<".depth.">")
7391    while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
7392     let dirname= substitute(getline('.'),'^\(| \)*','','e')
7393     let treedir= dirname.treedir
7394     let depth  = substitute(depth,'^| ','','')
7395 "    call Decho("(NetrwTreeDir) constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
7396    endwhile
7397    if w:netrw_treetop =~ '/$'
7398     let treedir= w:netrw_treetop.treedir
7399    else
7400     let treedir= w:netrw_treetop.'/'.treedir
7401    endif
7402 "   call Decho("(NetrwTreeDir) bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line("."))
7403   endif
7404   let treedir= substitute(treedir,'//$','/','')
7406 "  call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
7407   return treedir
7408 endfun
7410 " ---------------------------------------------------------------------
7411 " s:NetrwTreeDisplay: recursive tree display {{{2
7412 fun! s:NetrwTreeDisplay(dir,depth)
7413 "  call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
7415   " insure that there are no folds
7416   setl nofen
7418   " install ../ and shortdir
7419   if a:depth == ""
7420    call setline(line("$")+1,'../')
7421 "   call Decho("setline#".line("$")." ../ (depth is zero)")
7422   endif
7423   if a:dir =~ '^\a\+://'
7424    if a:dir == w:netrw_treetop
7425     let shortdir= a:dir
7426    else
7427     let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
7428    endif
7429    call setline(line("$")+1,a:depth.shortdir)
7430   else
7431    let shortdir= substitute(a:dir,'^.*/','','e')
7432    call setline(line("$")+1,a:depth.shortdir.'/')
7433   endif
7434 "  call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
7436   " append a / to dir if its missing one
7437   let dir= a:dir
7438   if dir !~ '/$'
7439    let dir= dir.'/'
7440   endif
7442   " display subtrees (if any)
7443   let depth= "| ".a:depth
7445 "  call Decho("display subtrees with depth<".depth."> and current leaves")
7446   for entry in w:netrw_treedict[a:dir]
7447    let direntry= substitute(dir.entry,'/$','','e')
7448 "   call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
7449    if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
7450 "    call Decho("<".direntry."> is a key in treedict - display subtree for it")
7451     keepj call s:NetrwTreeDisplay(direntry,depth)
7452    elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
7453 "    call Decho("<".direntry."/> is a key in treedict - display subtree for it")
7454     keepj call s:NetrwTreeDisplay(direntry.'/',depth)
7455    else
7456 "    call Decho("<".entry."> is not a key in treedict (no subtree)")
7457     sil! keepj call setline(line("$")+1,depth.entry)
7458    endif
7459   endfor
7460 "  call Dret("NetrwTreeDisplay")
7461 endfun
7463 " ---------------------------------------------------------------------
7464 " s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
7465 fun! s:NetrwTreeListing(dirname)
7466   if w:netrw_liststyle == s:TREELIST
7467 "   call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
7468 "   call Decho("curdir<".a:dirname.">")
7469 "   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"))
7471    " update the treetop
7472 "   call Decho("update the treetop")
7473    if !exists("w:netrw_treetop")
7474     let w:netrw_treetop= a:dirname
7475 "    call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
7476    elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
7477     let w:netrw_treetop= a:dirname
7478 "    call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
7479    endif
7481    " insure that we have at least an empty treedict
7482    if !exists("w:netrw_treedict")
7483     let w:netrw_treedict= {}
7484    endif
7486    " update the directory listing for the current directory
7487 "   call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
7488 "   call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
7489    exe "sil! keepj ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
7490    let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
7491 "   call Decho("w:treedict[".a:dirname."]= ".string(w:netrw_treedict[a:dirname]))
7492    exe "sil! keepj ".w:netrw_bannercnt.",$d"
7494    " if past banner, record word
7495    if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
7496     let fname= expand("<cword>")
7497    else
7498     let fname= ""
7499    endif
7500 "   call Decho("fname<".fname.">")
7502    " display from treetop on down
7503    keepj call s:NetrwTreeDisplay(w:netrw_treetop,"")
7505 "   call Dret("NetrwTreeListing : bufname<".expand("%").">")
7506    return
7507   endif
7508 endfun
7510 " ---------------------------------------------------------------------
7511 " s:NetrwWideListing: {{{2
7512 fun! s:NetrwWideListing()
7514   if w:netrw_liststyle == s:WIDELIST
7515 "   call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
7516    " look for longest filename (cpf=characters per filename)
7517    " cpf: characters per filename
7518    " fpl: filenames per line
7519    " fpc: filenames per column
7520    setl ma noro
7521 "   call Decho("setl ma noro")
7522    let b:netrw_cpf= 0
7523    if line("$") >= w:netrw_bannercnt
7524     exe 'sil keepj '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
7525     keepj call histdel("/",-1)
7526    else
7527 "    call Dret("NetrwWideListing")
7528     return
7529    endif
7530    let b:netrw_cpf= b:netrw_cpf + 2
7531 "   call Decho("b:netrw_cpf=max_filename_length+2=".b:netrw_cpf)
7533    " determine qty files per line (fpl)
7534    let w:netrw_fpl= winwidth(0)/b:netrw_cpf
7535    if w:netrw_fpl <= 0
7536     let w:netrw_fpl= 1
7537    endif
7538 "   call Decho("fpl= [winwidth=".winwidth(0)."]/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
7540    " make wide display
7541    exe 'sil keepj '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
7542    keepj call histdel("/",-1)
7543    let fpc         = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
7544    let newcolstart = w:netrw_bannercnt + fpc
7545    let newcolend   = newcolstart + fpc - 1
7546 "   call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
7547    sil! let keepregstar = @*
7548    while line("$") >= newcolstart
7549     if newcolend > line("$") | let newcolend= line("$") | endif
7550     let newcolqty= newcolend - newcolstart
7551     exe newcolstart
7552     if newcolqty == 0
7553      exe "sil! keepj norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
7554     else
7555      exe "sil! keepj norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
7556     endif
7557     exe "sil! keepj ".newcolstart.','.newcolend.'d'
7558     exe 'sil! keepj '.w:netrw_bannercnt
7559    endwhile
7560    sil! let @*= keepregstar
7561    exe "sil! keepj ".w:netrw_bannercnt.',$s/\s\+$//e'
7562    keepj call histdel("/",-1)
7563    exe "nmap <buffer> <silent> w        /^\\\\|\\s\\s\\zs\\S/\<cr>"
7564    exe "nmap <buffer> <silent> b        ?^\\\\|\\s\\s\\zs\\S?\<cr>"
7565 "   call Decho("NetrwWideListing) setl noma nomod ro")
7566    setl noma nomod ro
7567 "   call Decho("(NetrwWideListing) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
7568 "   call Dret("NetrwWideListing")
7569    return
7570   else
7571    if hasmapto("w","n")
7572     sil! nunmap <buffer> w
7573    endif
7574    if hasmapto("b","n")
7575     sil! nunmap <buffer> b
7576    endif
7577   endif
7579 endfun
7581 " ---------------------------------------------------------------------
7582 " s:PerformListing: {{{2
7583 fun! s:PerformListing(islocal)
7584 "  call Dfunc("s:PerformListing(islocal=".a:islocal.") bufnr(%)=".bufnr("%")."<".bufname("%").">")
7586   " set up syntax highlighting {{{3
7587 "  call Decho("(PerformListing) set up syntax highlighting")
7588   if has("syntax")
7589    if !exists("g:syntax_on") || !g:syntax_on
7590 "    call Decho("(PerformListing) but g:syntax_on".(exists("g:syntax_on")? "=".g:syntax_on : "<doesn't exist>"))
7591     setl ft=
7592    elseif &ft != "netrw"
7593     setl ft=netrw
7594    endif
7595   endif
7597   keepj call s:NetrwSafeOptions()
7598   set noro ma
7599 "  call Decho("(PerformListing) setl noro ma bh=".&bh)
7601 "  if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1       " Decho
7602 "   call Decho("(PerformListing) (netrw) Processing your browsing request...")
7603 "  endif                                                                " Decho
7605 "  call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
7606   if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
7607    " force a refresh for tree listings
7608 "   call Decho("(PerformListing) force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
7609    sil! keepj %d
7610   endif
7612   " save current directory on directory history list
7613   keepj call s:NetrwBookHistHandler(3,b:netrw_curdir)
7615   " Set up the banner {{{3
7616   if g:netrw_banner
7617 "   call Decho("(PerformListing) set up banner")
7618    keepj call setline(1,'" ============================================================================')
7619    keepj call setline(2,'" Netrw Directory Listing                                        (netrw '.g:loaded_netrw.')')
7620    if exists("g:netrw_bannerbackslash") && g:netrw_bannerbackslash
7621     keepj call setline(3,'"   '.substitute(b:netrw_curdir,'/','\\','g'))
7622    else
7623     keepj call setline(3,'"   '.b:netrw_curdir)
7624    endif
7625    let w:netrw_bannercnt= 3
7626    keepj exe "sil! keepj ".w:netrw_bannercnt
7627   else
7628    keepj 1
7629    let w:netrw_bannercnt= 1
7630   endif
7632   let sortby= g:netrw_sort_by
7633   if g:netrw_sort_direction =~ "^r"
7634    let sortby= sortby." reversed"
7635   endif
7637   " Sorted by... {{{3
7638   if g:netrw_banner
7639 "   call Decho("(PerformListing) handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
7640    if g:netrw_sort_by =~ "^n"
7641 "   call Decho("(PerformListing) directories will be sorted by name")
7642     " sorted by name
7643     keepj put ='\"   Sorted by      '.sortby
7644     keepj put ='\"   Sort sequence: '.g:netrw_sort_sequence
7645     let w:netrw_bannercnt= w:netrw_bannercnt + 2
7646    else
7647 "   call Decho("(PerformListing) directories will be sorted by size or time")
7648     " sorted by size or date
7649     keepj put ='\"   Sorted by '.sortby
7650     let w:netrw_bannercnt= w:netrw_bannercnt + 1
7651    endif
7652    exe "sil! keepj ".w:netrw_bannercnt
7653   endif
7655   " show copy/move target, if any
7656   if g:netrw_banner
7657    if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
7658 "    call Decho("(PerformListing) show copy/move target<".s:netrwmftgt.">")
7659     keepj put =''
7660     if s:netrwmftgt_islocal
7661      sil! keepj call setline(line("."),'"   Copy/Move Tgt: '.s:netrwmftgt.' (local)')
7662     else
7663      sil! keepj call setline(line("."),'"   Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
7664     endif
7665     let w:netrw_bannercnt= w:netrw_bannercnt + 1
7666    else
7667 "    call Decho("(PerformListing) s:netrwmftgt does not exist, don't make Copy/Move Tgt")
7668    endif
7669    exe "sil! keepj ".w:netrw_bannercnt
7670   endif
7672   " Hiding...  -or-  Showing... {{{3
7673   if g:netrw_banner
7674 "   call Decho("(PerformListing) handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)")
7675    if g:netrw_list_hide != "" && g:netrw_hide
7676     if g:netrw_hide == 1
7677      keepj put ='\"   Hiding:        '.g:netrw_list_hide
7678     else
7679      keepj put ='\"   Showing:       '.g:netrw_list_hide
7680     endif
7681     let w:netrw_bannercnt= w:netrw_bannercnt + 1
7682    endif
7683    exe "keepjumps ".w:netrw_bannercnt
7684    keepj put ='\"   Quick Help: <F1>:help  -:go up dir  D:delete  R:rename  s:sort-by  x:exec'
7685    keepj put ='\" ============================================================================'
7686    let w:netrw_bannercnt= w:netrw_bannercnt + 2
7687   endif
7689   " bannercnt should index the line just after the banner
7690   if g:netrw_banner
7691    let w:netrw_bannercnt= w:netrw_bannercnt + 1
7692    exe "sil! keepj ".w:netrw_bannercnt
7693 "   call Decho("(PerformListing) w:netrw_bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
7694   endif
7696   " get list of files
7697 "  call Decho("(PerformListing) Get list of files - islocal=".a:islocal)
7698   if a:islocal
7699    keepj call s:LocalListing()
7700   else " remote
7701    keepj call s:NetrwRemoteListing()
7702   endif
7704   " manipulate the directory listing (hide, sort) {{{3
7705   if !exists("w:netrw_bannercnt")
7706    let w:netrw_bannercnt= 0
7707   endif
7708 "  call Decho("(PerformListing) g:netrw_banner=".g:netrw_banner." w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
7710   if !g:netrw_banner || line("$") >= w:netrw_bannercnt
7711 "   call Decho("(PerformListing) manipulate directory listing (hide)")
7712 "   call Decho("(PerformListing) g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
7713    if g:netrw_hide && g:netrw_list_hide != ""
7714     keepj call s:NetrwListHide()
7715    endif
7716    if !g:netrw_banner || line("$") >= w:netrw_bannercnt
7717 "    call Decho("(PerformListing) manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
7719     if g:netrw_sort_by =~ "^n"
7720      " sort by name
7721      keepj call s:NetrwSetSort()
7723      if !g:netrw_banner || w:netrw_bannercnt < line("$")
7724 "      call Decho("(PerformListing) g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
7725       if g:netrw_sort_direction =~ 'n'
7726        " normal direction sorting
7727        exe 'sil keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
7728       else
7729        " reverse direction sorting
7730        exe 'sil keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
7731       endif
7732      endif
7733      " remove priority pattern prefix
7734 "     call Decho("(PerformListing) remove priority pattern prefix")
7735      exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e'
7736      keepj call histdel("/",-1)
7738     elseif a:islocal
7739      if !g:netrw_banner || w:netrw_bannercnt < line("$")
7740 "      call Decho("(PerformListing) g:netrw_sort_direction=".g:netrw_sort_direction)
7741       if g:netrw_sort_direction =~ 'n'
7742 "       call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort')
7743        exe 'sil! keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
7744       else
7745 "       call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort!')
7746        exe 'sil! keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
7747       endif
7748      exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
7749      keepj call histdel("/",-1)
7750      endif
7751     endif
7753    elseif g:netrw_sort_direction =~ 'r'
7754 "    call Decho('reverse the sorted listing')
7755     if !g:netrw_banner || w:netrw_bannercnt < line('$')
7756      exe 'sil! keepj '.w:netrw_bannercnt.',$g/^/m '.w:netrw_bannercnt
7757      call histdel("/",-1)
7758     endif
7759    endif
7760   endif
7762   " convert to wide/tree listing {{{3
7763 "  call Decho("(PerformListing) modify display if wide/tree listing style")
7764   keepj call s:NetrwWideListing()
7765   keepj call s:NetrwTreeListing(b:netrw_curdir)
7767   if exists("w:netrw_bannercnt") && (line("$") > w:netrw_bannercnt || !g:netrw_banner)
7768    " place cursor on the top-left corner of the file listing
7769 "   call Decho("(PerformListing) place cursor on top-left corner of file listing")
7770    exe 'sil! keepj '.w:netrw_bannercnt
7771    sil! keepj norm! 0
7772   endif
7774   " record previous current directory
7775   let w:netrw_prvdir= b:netrw_curdir
7776 "  call Decho("(PerformListing) record netrw_prvdir<".w:netrw_prvdir.">")
7778   " save certain window-oriented variables into buffer-oriented variables {{{3
7779   keepj call s:SetBufWinVars()
7780   keepj call s:NetrwOptionRestore("w:")
7782   " set display to netrw display settings
7783 "  call Decho("(PerformListing) set display to netrw display settings (".g:netrw_bufsettings.")")
7784   exe "setl ".g:netrw_bufsettings
7785   if g:netrw_liststyle == s:LONGLIST
7786 "   call Decho("(PerformListing) exe setl ts=".(g:netrw_maxfilenamelen+1))
7787    exe "setl ts=".(g:netrw_maxfilenamelen+1)
7788   endif
7789   if exists("s:treecurpos")
7791    keepj call netrw#NetrwRestorePosn(s:treecurpos)
7792    unlet s:treecurpos
7793   endif
7795 "  call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
7796 endfun
7798 " ---------------------------------------------------------------------
7799 " s:SetupNetrwStatusLine: {{{2
7800 fun! s:SetupNetrwStatusLine(statline)
7801 "  call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
7803   if !exists("s:netrw_setup_statline")
7804    let s:netrw_setup_statline= 1
7805 "   call Decho("do first-time status line setup")
7807    if !exists("s:netrw_users_stl")
7808     let s:netrw_users_stl= &stl
7809    endif
7810    if !exists("s:netrw_users_ls")
7811     let s:netrw_users_ls= &laststatus
7812    endif
7814    " set up User9 highlighting as needed
7815    let keepa= @a
7816    redir @a
7817    try
7818     hi User9
7819    catch /^Vim\%((\a\+)\)\=:E411/
7820     if &bg == "dark"
7821      hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
7822     else
7823      hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
7824     endif
7825    endtry
7826    redir END
7827    let @a= keepa
7828   endif
7830   " set up status line (may use User9 highlighting)
7831   " insure that windows have a statusline
7832   " make sure statusline is displayed
7833   let &stl=a:statline
7834   setl laststatus=2
7835 "  call Decho("stl=".&stl)
7836   redraw
7838 "  call Dret("SetupNetrwStatusLine : stl=".&stl)
7839 endfun
7841 " ---------------------------------------------------------------------
7842 "  Remote Directory Browsing Support:    {{{1
7843 " ===========================================
7845 " ---------------------------------------------------------------------
7846 " s:NetrwRemoteListing: {{{2
7847 fun! s:NetrwRemoteListing()
7848 "  call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)")
7850   call s:RemotePathAnalysis(b:netrw_curdir)
7851 "  call Decho("b:netrw_method#".(exists("b:netrw_method")? b:netrw_method : 'n/a'))
7852 "  call Decho("g:netrw_list_cmd<".(exists("g:netrw_list_cmd")? g:netrw_list_cmd : 'n/a').">")
7853 "  call Decho("ssh  is ".(executable("ssh")?  "" : "not ")."executable")
7854 "  call Decho("ftp  is ".(executable("ftp")?  "" : "not ")."executable")
7855 "  call Decho("sftp is ".(executable("sftp")? "" : "not ")."executable")
7857   " sanity check:
7858   if exists("b:netrw_method") && b:netrw_method =~ '[235]'
7859    " b:netrw_method = 2: ftp+.netrc
7860    " b:netrw_method = 3: ftp+machine,id,p/w,filename (ie. no .netrc)
7861    " b:netrw_method = 5: wget (http)
7862 "   call Decho("b:netrw_method=".b:netrw_method." (for ".s:method.")")
7863    if !executable("ftp")
7864     if !exists("g:netrw_quiet")
7865      call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
7866     endif
7867     call s:NetrwOptionRestore("w:")
7868 "    call Dret("s:NetrwRemoteListing")
7869     return
7870    endif
7872   elseif s:method == "scp" && (!exists("g:netrw_list_cmd") || g:netrw_list_cmd == '')
7873 "   call Decho("g:netrw_list_cmd<".(exists("g:netrw_list_cmd")? g:netrw_list_cmd : 'n/a').">")
7874    if !exists("g:netrw_quiet")
7875     if !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ""
7876      keepj call netrw#ErrorMsg(s:ERROR,"neither ssh nor ftp"." is executable on your system",47)
7877     else
7878      keepj call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ".g:netrw_list_cmd,19)
7879     endif
7880    endif
7882    keepj call s:NetrwOptionRestore("w:")
7883 "   call Dret("s:NetrwRemoteListing")
7884    return
7885   endif  " (remote handling sanity check)
7887   if exists("b:netrw_method")
7888 "   call Decho("setting w:netrw_method to b:netrw_method<".b:netrw_method.">")
7889    let w:netrw_method= b:netrw_method
7890   endif
7892   if s:method == "ftp"
7893    " use ftp to get remote file listing {{{3
7894 "   call Decho("use ftp to get remote file listing")
7895    let s:method = "ftp"
7896    let listcmd  = g:netrw_ftp_list_cmd
7897    if g:netrw_sort_by =~ '^t'
7898     let listcmd= g:netrw_ftp_timelist_cmd
7899    elseif g:netrw_sort_by =~ '^s'
7900     let listcmd= g:netrw_ftp_sizelist_cmd
7901    endif
7902 "   call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)")
7903    call s:NetrwRemoteFtpCmd(s:path,listcmd)
7904 "   exe "sil! keepalt keepj ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))'
7906    if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
7907     " shorten the listing
7908 "    call Decho("generate short listing")
7909     exe "sil! keepalt keepj ".w:netrw_bannercnt
7911     " cleanup
7912     if g:netrw_ftp_browse_reject != ""
7913      exe "sil! keepalt keepj g/".g:netrw_ftp_browse_reject."/keepj d"
7914      keepj call histdel("/",-1)
7915     endif
7916     sil! keepj %s/\r$//e
7917     keepj call histdel("/",-1)
7919     " if there's no ../ listed, then put ../ in
7920     let line1= line(".")
7921     exe "sil! keepj ".w:netrw_bannercnt
7922     let line2= search('\.\.\/\%(\s\|$\)','cnW')
7923 "    call Decho("search(".'\.\.\/\%(\s\|$\)'."','cnW')=".line2."  w:netrw_bannercnt=".w:netrw_bannercnt)
7924     if line2 == 0
7925 "     call Decho("netrw is putting ../ into listing")
7926      sil! keepj put='../'
7927     endif
7928     exe "sil! keepj ".line1
7929     sil! keepj norm! 0
7931 "    call Decho("line1=".line1." line2=".line2." line(.)=".line("."))
7932     if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
7933 "     call Decho("M$ ftp cleanup")
7934      exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+//'
7935      keepj call histdel("/",-1)
7936     else " normal ftp cleanup
7937 "     call Decho("normal ftp cleanup")
7938      exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
7939      exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
7940      exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
7941      keepj call histdel("/",-1)
7942      keepj call histdel("/",-1)
7943      keepj call histdel("/",-1)
7944     endif
7945    endif
7947   else
7948    " use ssh to get remote file listing {{{3
7949 "   call Decho("use ssh to get remote file listing: s:path<".s:path.">")
7950    let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
7951 "   call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
7952    if g:netrw_scp_cmd =~ '^pscp'
7953 "    call Decho("1: exe sil r! ".shellescape(listcmd.s:path, 1))
7954     exe "sil! keepj r! ".listcmd.shellescape(s:path, 1)
7955     " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
7956     sil! keepj g/^Listing directory/keepj d
7957     sil! keepj g/^d[-rwx][-rwx][-rwx]/keepj s+$+/+e
7958     sil! keepj g/^l[-rwx][-rwx][-rwx]/keepj s+$+@+e
7959     keepj call histdel("/",-1)
7960     keepj call histdel("/",-1)
7961     keepj call histdel("/",-1)
7962     if g:netrw_liststyle != s:LONGLIST
7963      sil! keepj g/^[dlsp-][-rwx][-rwx][-rwx]/keepj s/^.*\s\(\S\+\)$/\1/e
7964      keepj call histdel("/",-1)
7965     endif
7966    else
7967     if s:path == ""
7968 "     call Decho("2: exe sil r! ".listcmd)
7969      exe "sil! keepj keepalt r! ".listcmd
7970     else
7971 "     call Decho("3: exe sil r! ".listcmd.' '.shellescape(fnameescape(s:path),1))
7972      exe "sil! keepj keepalt r! ".listcmd.' '.shellescape(fnameescape(s:path),1)
7973 "     call Decho("listcmd<".listcmd."> path<".s:path.">")
7974     endif
7975    endif
7977    " cleanup
7978    if g:netrw_ftp_browse_reject != ""
7979 "    call Decho("(cleanup) exe sil! g/".g:netrw_ssh_browse_reject."/keepjumps d")
7980     exe "sil! g/".g:netrw_ssh_browse_reject."/keepj d"
7981     keepj call histdel("/",-1)
7982    endif
7983   endif
7985   if w:netrw_liststyle == s:LONGLIST
7986    " do a long listing; these substitutions need to be done prior to sorting {{{3
7987 "   call Decho("fix long listing:")
7989    if s:method == "ftp"
7990     " cleanup
7991     exe "sil! keepj ".w:netrw_bannercnt
7992     while getline('.') =~ g:netrw_ftp_browse_reject
7993      sil! keepj d
7994     endwhile
7995     " if there's no ../ listed, then put ../ in
7996     let line1= line(".")
7997     sil! keepj 1
7998     sil! keepj call search('^\.\.\/\%(\s\|$\)','W')
7999     let line2= line(".")
8000     if line2 == 0
8001      if b:netrw_curdir != '/'
8002       exe 'sil! keepj '.w:netrw_bannercnt."put='../'"
8003      endif
8004     endif
8005     exe "sil! keepj ".line1
8006     sil! keepj norm! 0
8007    endif
8009    if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
8010 "    call Decho("M$ ftp site listing cleanup")
8011     exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\(\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+\)\(\w.*\)$/\2\t\1/'
8012    elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
8013 "    call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
8014     exe 'sil keepj '.w:netrw_bannercnt.',$s/ -> .*$//e'
8015     exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e'
8016     exe 'sil keepj '.w:netrw_bannercnt
8017     keepj call histdel("/",-1)
8018     keepj call histdel("/",-1)
8019     keepj call histdel("/",-1)
8020    endif
8021   endif
8023 "  if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
8024 "   exe "keepj ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))'
8025 "  endif " Decho
8026 "  call Dret("s:NetrwRemoteListing")
8027 endfun
8029 " ---------------------------------------------------------------------
8030 " s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
8031 fun! s:NetrwRemoteRm(usrhost,path) range
8032 "  call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
8033 "  call Decho("firstline=".a:firstline." lastline=".a:lastline)
8034   let svpos= netrw#NetrwSavePosn()
8036   let all= 0
8037   if exists("s:netrwmarkfilelist_{bufnr('%')}")
8038    " remove all marked files
8039 "   call Decho("remove all marked files with bufnr#".bufnr("%"))
8040    for fname in s:netrwmarkfilelist_{bufnr("%")}
8041     let ok= s:NetrwRemoteRmFile(a:path,fname,all)
8042     if ok =~ 'q\%[uit]'
8043      break
8044     elseif ok =~ 'a\%[ll]'
8045      let all= 1
8046     endif
8047    endfor
8048    call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
8050   else
8051    " remove files specified by range
8052 "   call Decho("remove files specified by range")
8054    " preparation for removing multiple files/directories
8055    let ctr= a:firstline
8057    " remove multiple files and directories
8058    while ctr <= a:lastline
8059     exe "keepj ".ctr
8060     let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
8061     if ok =~ 'q\%[uit]'
8062      break
8063     elseif ok =~ 'a\%[ll]'
8064      let all= 1
8065     endif
8066     let ctr= ctr + 1
8067    endwhile
8068   endif
8070   " refresh the (remote) directory listing
8071 "  call Decho("refresh remote directory listing")
8072   keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
8073   keepj call netrw#NetrwRestorePosn(svpos)
8075 "  call Dret("s:NetrwRemoteRm")
8076 endfun
8078 " ---------------------------------------------------------------------
8079 " s:NetrwRemoteRmFile: {{{2
8080 fun! s:NetrwRemoteRmFile(path,rmfile,all)
8081 "  call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
8083   let all= a:all
8084   let ok = ""
8086   if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
8087    " attempt to remove file
8088 "    call Decho("attempt to remove file (all=".all.")")
8089    if !all
8090     echohl Statement
8091 "    call Decho("case all=0:")
8092     call inputsave()
8093     let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8094     call inputrestore()
8095     echohl NONE
8096     if ok == ""
8097      let ok="no"
8098     endif
8099     let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8100     if ok =~ 'a\%[ll]'
8101      let all= 1
8102     endif
8103    endif
8105    if all || ok =~ 'y\%[es]' || ok == ""
8106 "    call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""))
8107     if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
8108 "     call Decho("case ftp:")
8109      let path= a:path
8110      if path =~ '^\a\+://'
8111       let path= substitute(path,'^\a\+://[^/]\+/','','')
8112      endif
8113      sil! keepj .,$d
8114      call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
8115     else
8116 "     call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">")
8117      let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
8118 "     call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
8119      if !exists("b:netrw_curdir")
8120       keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
8121       let ok="q"
8122      else
8123       let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
8124 "      call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
8125 "      call Decho("remotedir<".remotedir.">")
8126 "      call Decho("rmfile<".a:rmfile.">")
8127       if remotedir != ""
8128        let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile))
8129       else
8130        let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile))
8131       endif
8132 "      call Decho("call system(".netrw_rm_cmd.")")
8133       let ret= system(netrw_rm_cmd)
8134       if ret != 0
8135        keepj call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
8136       endif
8137 "      call Decho("returned=".ret." errcode=".v:shell_error)
8138      endif
8139     endif
8140    elseif ok =~ 'q\%[uit]'
8141 "    call Decho("ok==".ok)
8142    endif
8144   else
8145    " attempt to remove directory
8146 "    call Decho("attempt to remove directory")
8147    if !all
8148     call inputsave()
8149     let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8150     call inputrestore()
8151     if ok == ""
8152      let ok="no"
8153     endif
8154     let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8155     if ok =~ 'a\%[ll]'
8156      let all= 1
8157     endif
8158    endif
8160    if all || ok =~ 'y\%[es]' || ok == ""
8161     if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
8162      keepj call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile)
8163     else
8164      let rmfile          = substitute(a:path.a:rmfile,'/$','','')
8165      let netrw_rmdir_cmd = s:MakeSshCmd(netrw#WinPath(g:netrw_rmdir_cmd)).' '.shellescape(netrw#WinPath(rmfile))
8166 "      call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")")
8167      let ret= system(netrw_rmdir_cmd)
8168 "      call Decho("returned=".ret." errcode=".v:shell_error)
8170      if v:shell_error != 0
8171 "      call Decho("v:shell_error not 0")
8172       let netrw_rmf_cmd= s:MakeSshCmd(netrw#WinPath(g:netrw_rmf_cmd)).' '.shellescape(netrw#WinPath(substitute(rmfile,'[\/]$','','e')))
8173 "      call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")")
8174       let ret= system(netrw_rmf_cmd)
8175 "      call Decho("returned=".ret." errcode=".v:shell_error)
8177       if v:shell_error != 0 && !exists("g:netrw_quiet")
8178         keepj call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
8179       endif
8180      endif
8181     endif
8183    elseif ok =~ 'q\%[uit]'
8184 "    call Decho("ok==".ok)
8185    endif
8186   endif
8188 "  call Dret("s:NetrwRemoteRmFile ".ok)
8189   return ok
8190 endfun
8192 " ---------------------------------------------------------------------
8193 " s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
8194 "  This function assumes that a long listing will be received.  Size, time,
8195 "  and reverse sorts will be requested of the server but not otherwise
8196 "  enforced here.
8197 fun! s:NetrwRemoteFtpCmd(path,listcmd)
8198 "  call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) w:netrw_method=".(exists("w:netrw_method")? w:netrw_method : (exists("b:netrw_method")? b:netrw_method : "???")))
8199 "  call Decho("line($)=".line("$")." w:netrw_bannercnt=".w:netrw_bannercnt)
8200   if !exists("w:netrw_method")
8201    if exists("b:netrw_method")
8202     let w:netrw_method= b:netrw_method
8203    else
8204     call netrw#ErrorMsg(2,"(s:NetrwRemoteFtpCmd) internal netrw error",93)
8205 "    call Dret("NetrwRemoteFtpCmd")
8206     return
8207    endif
8208   endif
8210   " because WinXX ftp uses unix style input
8211   let ffkeep= &ff
8212   setl ma ff=unix noro
8213 "  call Decho("setl ma ff=unix noro")
8215   " clear off any older non-banner lines
8216   " note that w:netrw_bannercnt indexes the line after the banner
8217 "  call Decho('exe sil! keepjumps '.w:netrw_bannercnt.",$d  (clear off old non-banner lines)")
8218   exe "sil! keepjumps ".w:netrw_bannercnt.",$d"
8220   ".........................................
8221   if w:netrw_method == 2 || w:netrw_method == 5
8222    " ftp + <.netrc>:  Method #2
8223    if a:path != ""
8224     keepj put ='cd \"'.a:path.'\"'
8225    endif
8226    if exists("g:netrw_ftpextracmd")
8227     keepj put =g:netrw_ftpextracmd
8228 "    call Decho("filter input: ".getline('.'))
8229    endif
8230    keepj call setline(line("$")+1,a:listcmd)
8231 "   exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
8232    if exists("g:netrw_port") && g:netrw_port != ""
8233 "    call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
8234     exe s:netrw_silentxfer." keepj ".w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
8235    else
8236 "    call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1))
8237     exe s:netrw_silentxfer." keepj ".w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)
8238    endif
8240    ".........................................
8241   elseif w:netrw_method == 3
8242    " ftp + machine,id,passwd,filename:  Method #3
8243     setl ff=unix
8244     if exists("g:netrw_port") && g:netrw_port != ""
8245      keepj put ='open '.g:netrw_machine.' '.g:netrw_port
8246     else
8247      keepj put ='open '.g:netrw_machine
8248     endif
8250     " handle userid and password
8251     let host= substitute(g:netrw_machine,'\..*$','','')
8252 "    call Decho("host<".host.">")
8253     if exists("s:netrw_hup") && exists("s:netrw_hup[host]")
8254      call NetUserPass("ftp:".host)
8255     endif
8256     if exists("g:netrw_uid") && g:netrw_uid != ""
8257      if exists("g:netrw_ftp") && g:netrw_ftp == 1
8258       keepj put =g:netrw_uid
8259       if exists("s:netrw_passwd") && s:netrw_passwd != ""
8260        keepj put ='\"'.s:netrw_passwd.'\"'
8261       endif
8262      elseif exists("s:netrw_passwd")
8263       keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
8264      endif
8265     endif
8267    if a:path != ""
8268     keepj put ='cd \"'.a:path.'\"'
8269    endif
8270    if exists("g:netrw_ftpextracmd")
8271     keepj put =g:netrw_ftpextracmd
8272 "    call Decho("filter input: ".getline('.'))
8273    endif
8274    keepj call setline(line("$")+1,a:listcmd)
8276     " perform ftp:
8277     " -i       : turns off interactive prompting from ftp
8278     " -n  unix : DON'T use <.netrc>, even though it exists
8279     " -n  win32: quit being obnoxious about password
8280 "    exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
8281 "    call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
8282     exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options
8284    ".........................................
8285   else
8286    keepj call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23)
8287   endif
8289   " cleanup for Windows
8290   if has("win32") || has("win95") || has("win64") || has("win16")
8291    sil! keepj %s/\r$//e
8292    keepj call histdel("/",-1)
8293   endif
8294   if a:listcmd == "dir"
8295    " infer directory/link based on the file permission string
8296    sil! keepj g/d\%([-r][-w][-x]\)\{3}/keepj s@$@/@
8297    sil! keepj g/l\%([-r][-w][-x]\)\{3}/keepj s/$/@/
8298    keepj call histdel("/",-1)
8299    keepj call histdel("/",-1)
8300    if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST
8301     exe "sil! keepj ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
8302     keepj call histdel("/",-1)
8303    endif
8304   endif
8306   " ftp's listing doesn't seem to include ./ or ../
8307   if !search('^\.\/$\|\s\.\/$','wn')
8308    exe 'keepj '.w:netrw_bannercnt
8309    keepj put ='./'
8310   endif
8311   if !search('^\.\.\/$\|\s\.\.\/$','wn')
8312    exe 'keepj '.w:netrw_bannercnt
8313    keepj put ='../'
8314   endif
8316   " restore settings
8317   let &ff= ffkeep
8318 "  call Dret("NetrwRemoteFtpCmd")
8319 endfun
8321 " ---------------------------------------------------------------------
8322 " s:NetrwRemoteRename: rename a remote file or directory {{{2
8323 fun! s:NetrwRemoteRename(usrhost,path) range
8324 "  call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
8326   " preparation for removing multiple files/directories
8327   let svpos      = netrw#NetrwSavePosn()
8328   let ctr        = a:firstline
8329   let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
8331   " rename files given by the markfilelist
8332   if exists("s:netrwmarkfilelist_{bufnr('%')}")
8333    for oldname in s:netrwmarkfilelist_{bufnr("%")}
8334 "    call Decho("oldname<".oldname.">")
8335     if exists("subfrom")
8336      let newname= substitute(oldname,subfrom,subto,'')
8337 "     call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8338     else
8339      call inputsave()
8340      let newname= input("Moving ".oldname." to : ",oldname)
8341      call inputrestore()
8342      if newname =~ '^s/'
8343       let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
8344       let subto   = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
8345       let newname = substitute(oldname,subfrom,subto,'')
8346 "      call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8347      endif
8348     endif
8349    
8350     if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
8351      keepj call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
8352     else
8353      let oldname= shellescape(a:path.oldname)
8354      let newname= shellescape(a:path.newname)
8355 "     call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
8356      let ret    = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
8357     endif
8359    endfor
8360    call s:NetrwUnMarkFile(1)
8362   else
8364   " attempt to rename files/directories
8365    while ctr <= a:lastline
8366     exe "keepj ".ctr
8368     let oldname= s:NetrwGetWord()
8369 "   call Decho("oldname<".oldname.">")
8371     call inputsave()
8372     let newname= input("Moving ".oldname." to : ",oldname)
8373     call inputrestore()
8375     if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
8376      call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
8377     else
8378      let oldname= shellescape(a:path.oldname)
8379      let newname= shellescape(a:path.newname)
8380 "     call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")")
8381      let ret    = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
8382     endif
8384     let ctr= ctr + 1
8385    endwhile
8386   endif
8388   " refresh the directory
8389   keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
8390   keepj call netrw#NetrwRestorePosn(svpos)
8392 "  call Dret("NetrwRemoteRename")
8393 endfun
8395 " ---------------------------------------------------------------------
8396 "  Local Directory Browsing Support:    {{{1
8397 " ==========================================
8399 " ---------------------------------------------------------------------
8400 " netrw#FileUrlRead: handles reading file://* files {{{2
8401 "   Should accept:   file://localhost/etc/fstab
8402 "                    file:///etc/fstab
8403 "                    file:///c:/WINDOWS/clock.avi
8404 "                    file:///c|/WINDOWS/clock.avi
8405 "                    file://localhost/c:/WINDOWS/clock.avi
8406 "                    file://localhost/c|/WINDOWS/clock.avi
8407 "                    file://c:/foo.txt
8408 "                    file:///c:/foo.txt
8409 " and %XX (where X is [0-9a-fA-F] is converted into a character with the given hexadecimal value
8410 fun! netrw#FileUrlRead(fname)
8411 "  call Dfunc("netrw#FileUrlRead(fname<".a:fname.">)")
8412   let fname = a:fname
8413   if fname =~ '^file://localhost/'
8414 "   call Decho('converting file://localhost/   -to-  file:///')
8415    let fname= substitute(fname,'^file://localhost/','file:///','')
8416 "   call Decho("fname<".fname.">")
8417   endif
8418   if (has("win32") || has("win95") || has("win64") || has("win16"))
8419    if fname  =~ '^file:///\=\a[|:]/'
8420 "    call Decho('converting file:///\a|/   -to-  file://\a:/')
8421     let fname = substitute(fname,'^file:///\=\(\a\)[|:]/','file://\1:/','')
8422 "    call Decho("fname<".fname.">")
8423    endif
8424   endif
8425   let fname2396 = netrw#RFC2396(fname)
8426   let fname2396e= fnameescape(fname2396)
8427   let plainfname= substitute(fname2396,'file://\(.*\)','\1',"")
8428   if (has("win32") || has("win95") || has("win64") || has("win16"))
8429 "   call Decho("windows exception for plainfname")
8430    if plainfname =~ '^/\+\a:'
8431 "    call Decho('removing leading "/"s')
8432     let plainfname= substitute(plainfname,'^/\+\(\a:\)','\1','')
8433    endif
8434   endif
8435 "  call Decho("fname2396<".fname2396.">")
8436 "  call Decho("plainfname<".plainfname.">")
8437   exe "sil doau BufReadPre ".fname2396e
8438   exe 'keepj r '.plainfname
8439   exe 'sil! bdelete '.plainfname
8440   exe 'keepalt file! '.plainfname
8441   keepj 1d
8442 "  call Decho("(FileUrlRead) setl nomod")
8443   setl nomod
8444 "  call Decho("(FileUrlRead) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
8445 "  call Dret("netrw#FileUrlRead")
8446   exe "sil doau BufReadPost ".fname2396e
8447 endfun
8449 " ---------------------------------------------------------------------
8450 " netrw#LocalBrowseCheck: {{{2
8451 fun! netrw#LocalBrowseCheck(dirname)
8452   " unfortunate interaction -- split window debugging can't be
8453   " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter
8454   " event triggers another call to LocalBrowseCheck() when attempts
8455   " to write to the DBG buffer are made.
8456   " The &ft == "netrw" test was installed because the BufEnter event
8457   " would hit when re-entering netrw windows, creating unexpected
8458   " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
8459 "  call Decho("(LocalBrowseCheck) isdir<".a:dirname.">=".isdirectory(a:dirname).((exists("s:treeforceredraw")? " treeforceredraw" : "")))
8460 "  call Dredir("LocalBrowseCheck","ls!")|redraw!|sleep 3
8461   let ykeep= @@
8462   if isdirectory(a:dirname)
8463 "   call Decho("(LocalBrowseCheck) is-directory ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$")." ft<".&ft."> g:netrw_fastbrowse=".g:netrw_fastbrowse)
8464    let svposn= netrw#NetrwSavePosn()
8465    if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname) || g:netrw_fastbrowse <= 1
8466     sil! keepj keepalt call s:NetrwBrowse(1,a:dirname)
8467     keepalt call netrw#NetrwRestorePosn(svposn)
8468    elseif &ft == "netrw" && line("$") == 1
8469     sil! keepj keepalt call s:NetrwBrowse(1,a:dirname)
8470     keepalt call netrw#NetrwRestorePosn(svposn)
8471    elseif exists("s:treeforceredraw")
8472     unlet s:treeforceredraw
8473     sil! keepj keepalt call s:NetrwBrowse(1,a:dirname)
8474     keepalt call netrw#NetrwRestorePosn(svposn)
8475    endif
8476   endif
8477   " following code wipes out currently unused netrw buffers
8478   "       IF g:netrw_fastbrowse is zero (ie. slow browsing selected)
8479   "   AND IF the listing style is not a tree listing
8480   if exists("g:netrw_fastbrowse") && g:netrw_fastbrowse == 0 && g:netrw_liststyle != s:TREELIST
8481    let ibuf    = 1
8482    let buflast = bufnr("$")
8483    while ibuf <= buflast
8484     if bufwinnr(ibuf) == -1 && isdirectory(bufname(ibuf))
8485      exe "sil! keepalt ".ibuf."bw!"
8486     endif
8487     let ibuf= ibuf + 1
8488    endwhile
8489   endif
8490   let @@= ykeep
8491   " not a directory, ignore it
8492 endfun
8494 " ---------------------------------------------------------------------
8495 "  s:LocalListing: does the job of "ls" for local directories {{{2
8496 fun! s:LocalListing()
8497 "  call Dfunc("s:LocalListing()")
8498 "  call Decho("(LocalListing) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
8499 "  call Decho("(LocalListing) tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
8501 "  if exists("b:netrw_curdir") |call Decho('(LocalListing) b:netrw_curdir<'.b:netrw_curdir.">")  |else|call Decho("(LocalListing) b:netrw_curdir doesn't exist") |endif
8502 "  if exists("g:netrw_sort_by")|call Decho('(LocalListing) g:netrw_sort_by<'.g:netrw_sort_by.">")|else|call Decho("(LocalListing) g:netrw_sort_by doesn't exist")|endif
8504   " get the list of files contained in the current directory
8505   let dirname    = b:netrw_curdir
8506   let dirnamelen = s:Strlen(b:netrw_curdir)
8507   let filelist   = glob(s:ComposePath(dirname,"*"),0,1)
8508   let filelist   = filelist + glob(s:ComposePath(dirname,".*"),0,1)
8509 "  call Decho("(LocalListing) filelist=".filelist)
8511   if g:netrw_cygwin == 0 && (has("win32") || has("win95") || has("win64") || has("win16"))
8512 "   call Decho("(LocalListing) filelist=".string(filelist))
8513   elseif index(filelist,'..') == -1 && b:netrw_curdir !~ '/'
8514     " include ../ in the glob() entry if its missing
8515 "   call Decho("(LocalListing) forcibly including on \"..\"")
8516    let filelist= filelist+[s:ComposePath(b:netrw_curdir,"../")]
8517 "   call Decho("(LocalListing) filelist=".string(filelist))
8518   endif
8520 "  call Decho("(LocalListing) (before while) dirname<".dirname.">")
8521 "  call Decho("(LocalListing) (before while) dirnamelen<".dirnamelen.">")
8522 "  call Decho("(LocalListing) (before while) filelist=".string(filelist))
8524   if get(g:, 'netrw_dynamic_maxfilenamelen', 0)
8525    let filelistcopy           = map(deepcopy(filelist),'fnamemodify(v:val, ":t")')
8526    let g:netrw_maxfilenamelen = max(map(filelistcopy,'len(v:val)')) + 1
8527 "   call Decho("(LocalListing) dynamic_maxfilenamelen: filenames             =".string(filelistcopy))
8528 "   call Decho("(LocalListing) dynamic_maxfilenamelen: g:netrw_maxfilenamelen=".g:netrw_maxfilenamelen)
8529   endif
8531   for filename in filelist
8532 "   call Decho("(LocalListing)  ")
8533 "   call Decho("(LocalListing) (while) filename<".filename.">")
8535    if getftype(filename) == "link"
8536     " indicate a symbolic link
8537 "    call Decho("(LocalListing) indicate <".filename."> is a symbolic link with trailing @")
8538     let pfile= filename."@"
8540    elseif getftype(filename) == "socket"
8541     " indicate a socket
8542 "    call Decho("(LocalListing) indicate <".filename."> is a socket with trailing =")
8543     let pfile= filename."="
8545    elseif getftype(filename) == "fifo"
8546     " indicate a fifo
8547 "    call Decho("(LocalListing) indicate <".filename."> is a fifo with trailing |")
8548     let pfile= filename."|"
8550    elseif isdirectory(filename)
8551     " indicate a directory
8552 "    call Decho("(LocalListing) indicate <".filename."> is a directory with trailing /")
8553     let pfile= filename."/"
8555    elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename)
8556     if (has("win32") || has("win95") || has("win64") || has("win16"))
8557      if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
8558       " indicate an executable
8559 "      call Decho("(LocalListing) indicate <".filename."> is executable with trailing *")
8560       let pfile= filename."*"
8561      else
8562       " normal file
8563       let pfile= filename
8564      endif
8565     elseif executable(filename)
8566      " indicate an executable
8567 "     call Decho("(LocalListing) indicate <".filename."> is executable with trailing *")
8568      let pfile= filename."*"
8569     else
8570      " normal file
8571      let pfile= filename
8572     endif
8574    else
8575     " normal file
8576     let pfile= filename
8577    endif
8578 "   call Decho("(LocalListing) pfile<".pfile."> (after *@/ appending)")
8580    if pfile =~ '//$'
8581     let pfile= substitute(pfile,'//$','/','e')
8582 "    call Decho("(LocalListing) change // to /: pfile<".pfile.">")
8583    endif
8584    let pfile= strpart(pfile,dirnamelen)
8585    let pfile= substitute(pfile,'^[/\\]','','e')
8586 "   call Decho("(LocalListing) filename<".filename.">")
8587 "   call Decho("(LocalListing) pfile   <".pfile.">")
8589    if w:netrw_liststyle == s:LONGLIST
8590     let sz   = getfsize(filename)
8591     let fsz  = strpart("               ",1,15-strlen(sz)).sz
8592     let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename))
8593 "    call Decho("(LocalListing) sz=".sz." fsz=".fsz)
8594    endif
8596    if     g:netrw_sort_by =~ "^t"
8597     " sort by time (handles time up to 1 quintillion seconds, US)
8598 "    call Decho("(LocalListing) getftime(".filename.")=".getftime(filename))
8599     let t  = getftime(filename)
8600     let ft = strpart("000000000000000000",1,18-strlen(t)).t
8601 "    call Decho("(LocalListing) exe keepjumps put ='".ft.'/'.filename."'")
8602     let ftpfile= ft.'/'.pfile
8603     sil! keepj put=ftpfile
8605    elseif g:netrw_sort_by =~ "^s"
8606     " sort by size (handles file sizes up to 1 quintillion bytes, US)
8607 "    call Decho("(LocalListing) getfsize(".filename.")=".getfsize(filename))
8608     let sz   = getfsize(filename)
8609     let fsz  = strpart("000000000000000000",1,18-strlen(sz)).sz
8610 "    call Decho("(LocalListing) exe keepj put ='".fsz.'/'.filename."'")
8611     let fszpfile= fsz.'/'.pfile
8612     sil! keepj put =fszpfile
8614    else
8615     " sort by name
8616 "    call Decho("(LocalListing) exe keepjumps put ='".pfile."'")
8617     sil! keepj put=pfile
8618    endif
8619   endfor
8621   " cleanup any windows mess at end-of-line
8622   sil! keepj g/^$/d
8623   sil! keepj %s/\r$//e
8624   call histdel("/",-1)
8625 "  call Decho("(LocalListing) exe setl ts=".(g:netrw_maxfilenamelen+1))
8626   exe "setl ts=".(g:netrw_maxfilenamelen+1)
8628 "  call Dret("s:LocalListing")
8629 endfun
8631 " ---------------------------------------------------------------------
8632 " s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2
8633 " performed any shell command.  The idea is to cause all local-browsing
8634 " buffers to be refreshed after a user has executed some shell command,
8635 " on the chance that s/he removed/created a file/directory with it.
8636 fun! s:LocalBrowseShellCmdRefresh()
8637 "  call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs")
8638   " determine which buffers currently reside in a tab
8639   if !exists("s:netrw_browselist")
8640 "   call Dret("LocalBrowseShellCmdRefresh : browselist is empty")
8641    return
8642   endif
8643   if !exists("w:netrw_bannercnt")
8644 "   call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw window")
8645    return
8646   endif
8647   if exists("s:locbrowseshellcmd")
8648    if s:locbrowseshellcmd
8649     let s:locbrowseshellcmd= 0
8650 "    call Dret("LocalBrowseShellCmdRefresh : NetrwBrowse itself caused the refresh")
8651     return
8652    endif
8653    let s:locbrowseshellcmd= 0
8654   endif
8655   let itab       = 1
8656   let buftablist = []
8657   let ykeep      = @@
8658   while itab <= tabpagenr("$")
8659    let buftablist = buftablist + tabpagebuflist()
8660    let itab       = itab + 1
8661    tabn
8662   endwhile
8663 "  call Decho("(LocalBrowseShellCmdRefresh) buftablist".string(buftablist))
8664 "  call Decho("(LocalBrowseShellCmdRefresh) s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">")
8665   "  GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
8666   "   | refresh any netrw window
8667   "   | wipe out any non-displaying netrw buffer
8668   let curwin = winnr()
8669   let ibl    = 0
8670   for ibuf in s:netrw_browselist
8671 "   call Decho("(LocalBrowseShellCmdRefresh) bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
8672    if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
8673     " wipe out any non-displaying netrw buffer
8674 "    call Decho("(LocalBrowseShellCmdRefresh) wiping  buf#".ibuf,"<".bufname(ibuf).">")
8675     exe "sil! bd ".fnameescape(ibuf)
8676     call remove(s:netrw_browselist,ibl)
8677 "    call Decho("(LocalBrowseShellCmdRefresh) browselist=".string(s:netrw_browselist))
8678     continue
8679    elseif index(tabpagebuflist(),ibuf) != -1
8680     " refresh any netrw buffer
8681 "    call Decho("(LocalBrowseShellCmdRefresh) refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
8682     exe bufwinnr(ibuf)."wincmd w"
8683     keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
8684    endif
8685    let ibl= ibl + 1
8686   endfor
8687   exe curwin."wincmd w"
8688   let @@= ykeep
8690 "  call Dret("LocalBrowseShellCmdRefresh")
8691 endfun
8693 " ---------------------------------------------------------------------
8694 " s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
8696 "     g:netrw_    Directory Is
8697 "     fastbrowse  Local  Remote   
8698 "  slow   0         D      D      D=Deleting a buffer implies it will not be re-used (slow)
8699 "  med    1         D      H      H=Hiding a buffer implies it may be re-used        (fast)
8700 "  fast   2         H      H      
8702 "  Deleting a buffer means that it will be re-loaded when examined, hence "slow".
8703 "  Hiding   a buffer means that it will be re-used   when examined, hence "fast".
8704 "           (re-using a buffer may not be as accurate)
8705 fun! s:LocalFastBrowser()
8706 "    call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse."  s:netrw_browser_shellcmd ".(exists("s:netrw_browser_shellcmd")? "exists" : "does not exist"))
8708   " initialize browselist, a list of buffer numbers that the local browser has used
8709   if !exists("s:netrw_browselist")
8710 "   call Decho("(LocalFastBrowser) initialize s:netrw_browselist")
8711    let s:netrw_browselist= []
8712   endif
8714   " append current buffer to fastbrowse list
8715   if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
8716 "   call Decho("(LocalFastBrowser) appendng current buffer to browselist")
8717    call add(s:netrw_browselist,bufnr("%"))
8718 "   call Decho("(LocalFastBrowser) browselist=".string(s:netrw_browselist))
8719   endif
8721   " enable autocmd events to handle refreshing/removing local browser buffers
8722   "    If local browse buffer is currently showing: refresh it
8723   "    If local browse buffer is currently hidden : wipe it
8724   "    g:netrw_fastbrowse=0 : slow   speed, never re-use directory listing
8725   "                      =1 : medium speed, re-use directory listing for remote only
8726   "                      =2 : fast   speed, always re-use directory listing when possible
8727   if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
8728 "   call Decho("(LocalFastBrowser) setting up local-browser shell command refresh")
8729    let s:netrw_browser_shellcmd= 1
8730    augroup AuNetrwShellCmd
8731     au!
8732     if (has("win32") || has("win95") || has("win64") || has("win16"))
8733 "     call Decho("(LocalFastBrowser) autocmd: ShellCmdPost * call s:LocalBrowseShellCmdRefresh()")
8734      au ShellCmdPost                    *       call s:LocalBrowseShellCmdRefresh()
8735     else
8736      au ShellCmdPost,FocusGained        *       call s:LocalBrowseShellCmdRefresh()
8737 "     call Decho("(LocalFastBrowser) autocmd: ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()")
8738     endif
8739    augroup END
8740   endif
8742   " user must have changed fastbrowse to its fast setting, so remove
8743   " the associated autocmd events
8744   if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
8745 "   call Decho("(LocalFastBrowser) remove AuNetrwShellCmd autcmd group")
8746    unlet s:netrw_browser_shellcmd
8747    augroup AuNetrwShellCmd
8748     au!
8749    augroup END
8750    augroup! AuNetrwShellCmd
8751   endif
8753 "  call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
8754 endfun
8756 " ---------------------------------------------------------------------
8757 " s:NetrwLocalExecute: uses system() to execute command under cursor ("X" command support) {{{2
8758 fun! s:NetrwLocalExecute(cmd)
8759 "  call Dfunc("s:NetrwLocalExecute(cmd<".a:cmd.">)")
8760   let ykeep= @@
8761   " sanity check
8762   if !executable(a:cmd)
8763    call netrw#ErrorMsg(s:ERROR,"the file<".a:cmd."> is not executable!",89)
8764    let @@= ykeep
8765 "   call Dret("s:NetrwLocalExecute")
8766    return
8767   endif
8769   let optargs= input(":!".a:cmd,"","file")
8770 "  call Decho("optargs<".optargs.">")
8771   let result= system(a:cmd.optargs)
8772 "  call Decho(result)
8774   " strip any ansi escape sequences off
8775   let result = substitute(result,"\e\\[[0-9;]*m","","g")
8777   " show user the result(s)
8778   echomsg result
8779   let @@= ykeep
8781 "  call Dret("s:NetrwLocalExecute")
8782 endfun
8784 " ---------------------------------------------------------------------
8785 " s:NetrwLocalRename: rename a remote file or directory {{{2
8786 fun! s:NetrwLocalRename(path) range
8787 "  call Dfunc("NetrwLocalRename(path<".a:path.">)")
8789   " preparation for removing multiple files/directories
8790   let ykeep = @@
8791   let ctr   = a:firstline
8792   let svpos = netrw#NetrwSavePosn()
8794   " rename files given by the markfilelist
8795   if exists("s:netrwmarkfilelist_{bufnr('%')}")
8796    for oldname in s:netrwmarkfilelist_{bufnr("%")}
8797 "    call Decho("oldname<".oldname.">")
8798     if exists("subfrom")
8799      let newname= substitute(oldname,subfrom,subto,'')
8800 "     call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8801     else
8802      call inputsave()
8803      let newname= input("Moving ".oldname." to : ",oldname)
8804      call inputrestore()
8805      if newname =~ '^s/'
8806       let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
8807       let subto   = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
8808 "      call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">")
8809       let newname = substitute(oldname,subfrom,subto,'')
8810      endif
8811     endif
8812     call rename(oldname,newname)
8813    endfor
8814    call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
8815   
8816   else
8818    " attempt to rename files/directories
8819    while ctr <= a:lastline
8820     exe "keepj ".ctr
8822     " sanity checks
8823     if line(".") < w:netrw_bannercnt
8824      let ctr= ctr + 1
8825      continue
8826     endif
8827     let curword= s:NetrwGetWord()
8828     if curword == "./" || curword == "../"
8829      let ctr= ctr + 1
8830      continue
8831     endif
8833     keepj norm! 0
8834     let oldname= s:ComposePath(a:path,curword)
8835 "   call Decho("oldname<".oldname.">")
8837     call inputsave()
8838     let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
8839     call inputrestore()
8841     call rename(oldname,newname)
8842 "   call Decho("renaming <".oldname."> to <".newname.">")
8844     let ctr= ctr + 1
8845    endwhile
8846   endif
8848   " refresh the directory
8849 "  call Decho("refresh the directory listing")
8850   keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
8851   keepj call netrw#NetrwRestorePosn(svpos)
8852   let @@= ykeep
8854 "  call Dret("NetrwLocalRename")
8855 endfun
8857 " ---------------------------------------------------------------------
8858 " s:NetrwLocalRm: {{{2
8859 fun! s:NetrwLocalRm(path) range
8860 "  call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
8861 "  call Decho("firstline=".a:firstline." lastline=".a:lastline)
8863   " preparation for removing multiple files/directories
8864   let ykeep = @@
8865   let ret   = 0
8866   let all   = 0
8867   let svpos = netrw#NetrwSavePosn()
8869   if exists("s:netrwmarkfilelist_{bufnr('%')}")
8870    " remove all marked files
8871 "   call Decho("remove all marked files")
8872    for fname in s:netrwmarkfilelist_{bufnr("%")}
8873     let ok= s:NetrwLocalRmFile(a:path,fname,all)
8874     if ok =~ 'q\%[uit]' || ok == "no"
8875      break
8876     elseif ok =~ 'a\%[ll]'
8877      let all= 1
8878     endif
8879    endfor
8880    call s:NetrwUnMarkFile(1)
8882   else
8883   " remove (multiple) files and directories
8884 "   call Decho("remove files in range [".a:firstline.",".a:lastline."]")
8886    let ctr = a:firstline
8887    while ctr <= a:lastline
8888     exe "keepj ".ctr
8890     " sanity checks
8891     if line(".") < w:netrw_bannercnt
8892      let ctr= ctr + 1
8893      continue
8894     endif
8895     let curword= s:NetrwGetWord()
8896     if curword == "./" || curword == "../"
8897      let ctr= ctr + 1
8898      continue
8899     endif
8900     let ok= s:NetrwLocalRmFile(a:path,curword,all)
8901     if ok =~ 'q\%[uit]' || ok == "no"
8902      break
8903     elseif ok =~ 'a\%[ll]'
8904      let all= 1
8905     endif
8906     let ctr= ctr + 1
8907    endwhile
8908   endif
8910   " refresh the directory
8911 "  call Decho("bufname<".bufname("%").">")
8912   if bufname("%") != "NetrwMessage"
8913    keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
8914    keepj call netrw#NetrwRestorePosn(svpos)
8915   endif
8916   let @@= ykeep
8918 "  call Dret("s:NetrwLocalRm")
8919 endfun
8921 " ---------------------------------------------------------------------
8922 " s:NetrwLocalRmFile: remove file fname given the path {{{2
8923 "                     Give confirmation prompt unless all==1
8924 fun! s:NetrwLocalRmFile(path,fname,all)
8925 "  call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
8926   
8927   let all= a:all
8928   let ok = ""
8929   keepj norm! 0
8930   let rmfile= s:ComposePath(a:path,a:fname)
8931 "  call Decho("rmfile<".rmfile.">")
8933   if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
8934    " attempt to remove file
8935 "   call Decho("attempt to remove file<".rmfile.">")
8936    if !all
8937     echohl Statement
8938     call inputsave()
8939     let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8940     call inputrestore()
8941     echohl NONE
8942     if ok == ""
8943      let ok="no"
8944     endif
8945 "    call Decho("response: ok<".ok.">")
8946     let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8947 "    call Decho("response: ok<".ok."> (after sub)")
8948     if ok =~ 'a\%[ll]'
8949      let all= 1
8950     endif
8951    endif
8953    if all || ok =~ 'y\%[es]' || ok == ""
8954     let ret= s:NetrwDelete(rmfile)
8955 "    call Decho("errcode=".v:shell_error." ret=".ret)
8956    endif
8958   else
8959    " attempt to remove directory
8960    if !all
8961     echohl Statement
8962     call inputsave()
8963     let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
8964     call inputrestore()
8965     let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
8966     if ok == ""
8967      let ok="no"
8968     endif
8969     if ok =~ 'a\%[ll]'
8970      let all= 1
8971     endif
8972    endif
8973    let rmfile= substitute(rmfile,'[\/]$','','e')
8975    if all || ok =~ 'y\%[es]' || ok == ""
8976 "    call Decho("1st attempt: system(netrw#WinPath(".g:netrw_localrmdir.') '.shellescape(rmfile).')')
8977     call system(netrw#WinPath(g:netrw_localrmdir).' '.shellescape(rmfile))
8978 "    call Decho("v:shell_error=".v:shell_error)
8980     if v:shell_error != 0
8981 "     call Decho("2nd attempt to remove directory<".rmfile.">")
8982      let errcode= s:NetrwDelete(rmfile)
8983 "     call Decho("errcode=".errcode)
8985      if errcode != 0
8986       if has("unix")
8987 "       call Decho("3rd attempt to remove directory<".rmfile.">")
8988        call system("rm ".shellescape(rmfile))
8989        if v:shell_error != 0 && !exists("g:netrw_quiet")
8990         call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
8991         let ok="no"
8992        endif
8993       elseif !exists("g:netrw_quiet")
8994        call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
8995        let ok="no"
8996       endif
8997      endif
8998     endif
8999    endif
9000   endif
9002 "  call Dret("s:NetrwLocalRmFile ".ok)
9003   return ok
9004 endfun
9006 " ---------------------------------------------------------------------
9007 " Support Functions: {{{1
9009 " ---------------------------------------------------------------------
9010 " netrw#WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2
9011 fun! netrw#WinPath(path)
9012 "  call Dfunc("netrw#WinPath(path<".a:path.">)")
9013   if (!g:netrw_cygwin || &shell !~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16"))
9014    " remove cygdrive prefix, if present
9015    let path = substitute(a:path,'/cygdrive/\(.\)','\1:','')
9016    " remove trailing slash (Win95)
9017    let path = substitute(path, '\(\\\|/\)$', '', 'g')
9018    " remove escaped spaces
9019    let path = substitute(path, '\ ', ' ', 'g')
9020    " convert slashes to backslashes
9021    let path = substitute(path, '/', '\', 'g')
9022   else
9023    let path= a:path
9024   endif
9025 "  call Dret("netrw#WinPath <".path.">")
9026   return path
9027 endfun
9029 " ---------------------------------------------------------------------
9030 " netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
9031 fun! netrw#NetrwRestorePosn(...)
9032 "  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))
9033   let eikeep= &ei
9034   set ei=all
9035   if expand("%") == "NetrwMessage"
9036    if exists("s:winBeforeErr")
9037     exe s:winBeforeErr."wincmd w"
9038    endif
9039   endif
9041   if a:0 > 0
9042    exe "keepj ".a:1
9043   endif
9045   " restore window
9046   if exists("w:netrw_winnr")
9047 "   call Decho("(NetrwRestorePosn) restore window: exe sil! ".w:netrw_winnr."wincmd w")
9048    exe "sil! ".w:netrw_winnr."wincmd w"
9049   endif
9050   if v:shell_error == 0
9051    " as suggested by Bram M: redraw on no error
9052    " allows protocol error messages to remain visible
9053 "   redraw!
9054   endif
9056   " restore top-of-screen line
9057   if exists("w:netrw_hline")
9058 "   call Decho("(NetrwRestorePosn) restore topofscreen: exe keepj norm! ".w:netrw_hline."G0z")
9059    exe "keepj norm! ".w:netrw_hline."G0z\<CR>"
9060   endif
9062   " restore position
9063   if exists("w:netrw_line") && exists("w:netrw_col")
9064 "   call Decho("(NetrwRestorePosn) restore posn: exe keepj norm! ".w:netrw_line."G0".w:netrw_col."|")
9065    exe "keepj norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
9066   endif
9068   let &ei= eikeep
9069 "  call Dret("netrw#NetrwRestorePosn : line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol())
9070 endfun
9072 " ---------------------------------------------------------------------
9073 " netrw#NetrwSavePosn: saves position of cursor on screen {{{2
9074 fun! netrw#NetrwSavePosn()
9075 "  call Dfunc("netrw#NetrwSavePosn() line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol())
9076   " Save current line and column
9077   let w:netrw_winnr= winnr()
9078   let w:netrw_line = line(".")
9079   let w:netrw_col  = virtcol(".")
9080 "  call Decho("(NetrwSavePosn) currently, win#".w:netrw_winnr." line#".w:netrw_line." col#".w:netrw_col)
9082   " Save top-of-screen line
9083   keepj norm! H0
9084   let w:netrw_hline= line(".")
9086   " set up string holding position parameters
9087   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
9089   keepj call netrw#NetrwRestorePosn()
9090 "  call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
9091   return ret
9092 endfun
9094 " ---------------------------------------------------------------------
9095 " netrw#NetrwAccess: intended to provide access to variable values for netrw's test suite {{{2
9096 "   0: marked file list of current buffer
9097 "   1: marked file target
9098 fun! netrw#NetrwAccess(ilist)
9099   if     a:ilist == 0
9100    if exists("s:netrwmarkfilelist_".bufnr('%'))
9101     return s:netrwmarkfilelist_{bufnr('%')}
9102    else
9103     return "no-list-buf#".bufnr('%')
9104    endif
9105   elseif a:ilist == 1
9106    return s:netrwmftgt
9107 endfun
9109 " ------------------------------------------------------------------------
9110 "  netrw#RFC2396: converts %xx into characters {{{2
9111 fun! netrw#RFC2396(fname)
9112 "  call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
9113   let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
9114 "  call Dret("netrw#RFC2396 ".fname)
9115   return fname
9116 endfun
9118 " ---------------------------------------------------------------------
9119 "  s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
9120 fun! s:ComposePath(base,subdir)
9121 "  call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
9123   if has("amiga")
9124 "   call Decho("amiga")
9125    let ec = a:base[s:Strlen(a:base)-1]
9126    if ec != '/' && ec != ':'
9127     let ret = a:base . "/" . a:subdir
9128    else
9129     let ret = a:base . a:subdir
9130    endif
9132   elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
9133 "   call Decho("windows")
9134    let ret= a:subdir
9136   elseif a:base =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
9137 "   call Decho("windows")
9138    if a:base =~ '[/\\]$'
9139     let ret= a:base.a:subdir
9140    else
9141     let ret= a:base."/".a:subdir
9142    endif
9144   elseif a:base =~ '^\a\+://'
9145 "   call Decho("remote linux/macos")
9146    let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
9147    let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
9148    if a:subdir == '../'
9149     if curpath =~ '[^/]/[^/]\+/$'
9150      let curpath= substitute(curpath,'[^/]\+/$','','')
9151     else
9152      let curpath=""
9153     endif
9154     let ret= urlbase.curpath
9155    else
9156     let ret= urlbase.curpath.a:subdir
9157    endif
9158 "   call Decho("urlbase<".urlbase.">")
9159 "   call Decho("curpath<".curpath.">")
9160 "   call Decho("ret<".ret.">")
9162   else
9163 "   call Decho("local linux/macos")
9164    let ret = substitute(a:base."/".a:subdir,"//","/","g")
9165    if a:base =~ '^//'
9166     " keeping initial '//' for the benefit of network share listing support
9167     let ret= '/'.ret
9168    endif
9169    let ret= simplify(ret)
9170   endif
9172 "  call Dret("s:ComposePath ".ret)
9173   return ret
9174 endfun
9176 " ---------------------------------------------------------------------
9177 " s:FileReadable: o/s independent filereadable {{{2
9178 fun! s:FileReadable(fname)
9179 "  call Dfunc("s:FileReadable(fname<".a:fname.">)")
9181   if g:netrw_cygwin
9182    let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/',''))
9183   else
9184    let ret= filereadable(a:fname)
9185   endif
9187 "  call Dret("s:FileReadable ".ret)
9188   return ret
9189 endfun
9191 " ---------------------------------------------------------------------
9192 "  s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
9193 "                 Places correct suffix on end of temporary filename,
9194 "                 using the suffix provided with fname
9195 fun! s:GetTempfile(fname)
9196 "  call Dfunc("s:GetTempfile(fname<".a:fname.">)")
9198   if !exists("b:netrw_tmpfile")
9199    " get a brand new temporary filename
9200    let tmpfile= tempname()
9201 "   call Decho("tmpfile<".tmpfile."> : from tempname()")
9203    let tmpfile= substitute(tmpfile,'\','/','ge')
9204 "   call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /")
9206    " sanity check -- does the temporary file's directory exist?
9207    if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
9208 "    call Decho("(GetTempfile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
9209     keepj call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
9210 "    call Dret("s:GetTempfile getcwd<".getcwd().">")
9211     return ""
9212    endif
9214    " let netrw#NetSource() know about the tmpfile
9215    let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() and netrw#NetrwBrowseX()
9216 "   call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">")
9218    " o/s dependencies
9219    if g:netrw_cygwin != 0
9220     let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e')
9221    elseif has("win32") || has("win95") || has("win64") || has("win16")
9222     if !exists("+shellslash") || !&ssl
9223      let tmpfile = substitute(tmpfile,'/','\','g')
9224     endif
9225    else
9226     let tmpfile = tmpfile
9227    endif
9228    let b:netrw_tmpfile= tmpfile
9229 "   call Decho("o/s dependent fixed tempname<".tmpfile.">")
9230   else
9231    " re-use temporary filename
9232    let tmpfile= b:netrw_tmpfile
9233 "   call Decho("tmpfile<".tmpfile."> re-using")
9234   endif
9236   " use fname's suffix for the temporary file
9237   if a:fname != ""
9238    if a:fname =~ '\.[^./]\+$'
9239 "    call Decho("using fname<".a:fname.">'s suffix")
9240     if a:fname =~ '\.tar\.gz$' || a:fname =~ '\.tar\.bz2$' || a:fname =~ '\.tar\.xz$'
9241      let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
9242     elseif a:fname =~ '.txz$'
9243      let suffix = ".txz".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
9244     else
9245      let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
9246     endif
9247 "    call Decho("suffix<".suffix.">")
9248     let tmpfile= substitute(tmpfile,'\.tmp$','','e')
9249 "    call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)")
9250     let tmpfile .= suffix
9251 "    call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">")
9252     let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
9253    endif
9254   endif
9256 "  call Decho("(GetTempFile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)")
9257 "  call Dret("s:GetTempfile <".tmpfile.">")
9258   return tmpfile
9259 endfun
9261 " ---------------------------------------------------------------------
9262 " s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
9263 "               a correct command for use with a system() call
9264 fun! s:MakeSshCmd(sshcmd)
9265 "  call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
9266   let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
9267   if exists("g:netrw_port") && g:netrw_port != ""
9268    let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
9269   elseif exists("s:port") && s:port != ""
9270    let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
9271   else
9272    let sshcmd= substitute(sshcmd,"USEPORT ",'','')
9273   endif
9274 "  call Dret("s:MakeSshCmd <".sshcmd.">")
9275   return sshcmd
9276 endfun
9278 " ---------------------------------------------------------------------
9279 " s:NetrwBMShow: {{{2
9280 fun! s:NetrwBMShow()
9281 "  call Dfunc("s:NetrwBMShow()")
9282   redir => bmshowraw
9283    menu
9284   redir END
9285   let bmshowlist = split(bmshowraw,'\n')
9286   if bmshowlist != []
9287    let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
9288    if bmshowfuncs != []
9289     let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
9290     if bmshowfunc =~ '^call.*BMShow()'
9291      exe "sil! keepj ".bmshowfunc
9292     endif
9293    endif
9294   endif
9295 "  call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
9296 endfun
9298 " ---------------------------------------------------------------------
9299 " s:NetrwCursor: responsible for setting cursorline/cursorcolumn based upon g:netrw_cursor {{{2
9300 fun! s:NetrwCursor()
9301   if !exists("w:netrw_liststyle")
9302    let w:netrw_liststyle= g:netrw_liststyle
9303   endif
9304 "  call Dfunc("s:NetrwCursor() ft<".&ft."> liststyle=".w:netrw_liststyle." g:netrw_cursor=".g:netrw_cursor." s:netrw_usercuc=".s:netrw_usercuc." s:netrw_usercul=".s:netrw_usercul)
9306   if &ft != "netrw"
9307    " if the current window isn't a netrw directory listing window, then use user cursorline/column
9308    " settings.  Affects when netrw is used to read/write a file using scp/ftp/etc.
9309 "   call Decho("case ft!=netrw: use user cul,cuc")
9310    let &l:cursorline   = s:netrw_usercul
9311    let &l:cursorcolumn = s:netrw_usercuc
9313   elseif g:netrw_cursor == 4
9314    " all styles: cursorline, cursorcolumn
9315 "   call Decho("case g:netrw_cursor==4: setl cul cuc")
9316    setl cursorline
9317    setl cursorcolumn
9319   elseif g:netrw_cursor == 3
9320    " thin-long-tree: cursorline, user's cursorcolumn
9321    " wide          : cursorline, cursorcolumn
9322    if w:netrw_liststyle == s:WIDELIST
9323 "    call Decho("case g:netrw_cursor==3 and wide: setl cul cuc")
9324     setl cursorline
9325     setl cursorcolumn
9326    else
9327 "    call Decho("case g:netrw_cursor==3 and not wide: setl cul (use user's cuc)")
9328     setl cursorline
9329     let &l:cursorcolumn   = s:netrw_usercuc
9330    endif
9332   elseif g:netrw_cursor == 2
9333    " thin-long-tree: cursorline, user's cursorcolumn
9334    " wide          : cursorline, user's cursorcolumn
9335 "   call Decho("case g:netrw_cursor==2: setl cuc (use user's cul)")
9336    let &l:cursorcolumn = s:netrw_usercuc
9337    setl cursorline
9339   elseif g:netrw_cursor == 1
9340    " thin-long-tree: user's cursorline, user's cursorcolumn
9341    " wide          : cursorline,        user's cursorcolumn
9342    let &l:cursorcolumn = s:netrw_usercuc
9343    if w:netrw_liststyle == s:WIDELIST
9344 "    call Decho("case g:netrw_cursor==2 and wide: setl cul (use user's cuc)")
9345     set cursorline
9346    else
9347 "    call Decho("case g:netrw_cursor==2 and not wide: (use user's cul,cuc)")
9348     let &l:cursorline   = s:netrw_usercul
9349    endif
9351   else
9352    " all styles: user's cursorline, user's cursorcolumn
9353 "   call Decho("default: (use user's cul,cuc)")
9354    let &l:cursorline   = s:netrw_usercul
9355    let &l:cursorcolumn = s:netrw_usercuc
9356   endif
9358 "  call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn)
9359 endfun
9361 " ---------------------------------------------------------------------
9362 " s:RestoreCursorline: restores cursorline/cursorcolumn to original user settings {{{2
9363 fun! s:RestoreCursorline()
9364 "  call Dfunc("s:RestoreCursorline() currently, cul=".&l:cursorline." cuc=".&l:cursorcolumn." win#".winnr()." buf#".bufnr("%")." mod=".&mod)
9365   if exists("s:netrw_usercul")
9366    let &l:cursorline   = s:netrw_usercul
9367   endif
9368   if exists("s:netrw_usercuc")
9369    let &l:cursorcolumn = s:netrw_usercuc
9370   endif
9371 "  call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn)
9372 endfun
9374 " ---------------------------------------------------------------------
9375 " s:NetrwDelete: Deletes a file. {{{2
9376 "           Uses Steve Hall's idea to insure that Windows paths stay
9377 "           acceptable.  No effect on Unix paths.
9378 "  Examples of use:  let result= s:NetrwDelete(path)
9379 fun! s:NetrwDelete(path)
9380 "  call Dfunc("s:NetrwDelete(path<".a:path.">)")
9382   let path = netrw#WinPath(a:path)
9383   if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
9384    if exists("+shellslash")
9385     let sskeep= &shellslash
9386     setl noshellslash
9387     let result      = delete(path)
9388     let &shellslash = sskeep
9389    else
9390 "    call Decho("exe let result= ".a:cmd."('".path."')")
9391     let result= delete(path)
9392    endif
9393   else
9394 "   call Decho("let result= delete(".path.")")
9395    let result= delete(path)
9396   endif
9397   if result < 0
9398    keepj call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
9399   endif
9401 "  call Dret("s:NetrwDelete ".result)
9402   return result
9403 endfun
9405 " ---------------------------------------------------------------------
9406 " s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
9407 fun! s:NetrwEnew(...)
9408 "  call Dfunc("s:NetrwEnew() a:0=".a:0." bufnr($)=".bufnr("$"))
9409 "  call Decho("curdir<".((a:0>0)? a:1 : "")."> buf#".bufnr("%")."<".bufname("%").">")
9411   " grab a function-local-variable copy of buffer variables
9412 "  call Decho("make function-local copy of netrw variables")
9413   if exists("b:netrw_bannercnt")      |let netrw_bannercnt       = b:netrw_bannercnt      |endif
9414   if exists("b:netrw_browser_active") |let netrw_browser_active  = b:netrw_browser_active |endif
9415   if exists("b:netrw_cpf")            |let netrw_cpf             = b:netrw_cpf            |endif
9416   if exists("b:netrw_curdir")         |let netrw_curdir          = b:netrw_curdir         |endif
9417   if exists("b:netrw_explore_bufnr")  |let netrw_explore_bufnr   = b:netrw_explore_bufnr  |endif
9418   if exists("b:netrw_explore_indx")   |let netrw_explore_indx    = b:netrw_explore_indx   |endif
9419   if exists("b:netrw_explore_line")   |let netrw_explore_line    = b:netrw_explore_line   |endif
9420   if exists("b:netrw_explore_list")   |let netrw_explore_list    = b:netrw_explore_list   |endif
9421   if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
9422   if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
9423   if exists("b:netrw_fname")          |let netrw_fname           = b:netrw_fname          |endif
9424   if exists("b:netrw_lastfile")       |let netrw_lastfile        = b:netrw_lastfile       |endif
9425   if exists("b:netrw_liststyle")      |let netrw_liststyle       = b:netrw_liststyle      |endif
9426   if exists("b:netrw_method")         |let netrw_method          = b:netrw_method         |endif
9427   if exists("b:netrw_option")         |let netrw_option          = b:netrw_option         |endif
9428   if exists("b:netrw_prvdir")         |let netrw_prvdir          = b:netrw_prvdir         |endif
9430   keepj call s:NetrwOptionRestore("w:")
9431 "  call Decho("generate a buffer with keepjumps keepalt enew!")
9432   let netrw_keepdiff= &l:diff
9433   keepj keepalt enew!
9434   let &l:diff= netrw_keepdiff
9435 "  call Decho("bufnr($)=".bufnr("$"))
9436   keepj call s:NetrwOptionSave("w:")
9438   " copy function-local-variables to buffer variable equivalents
9439 "  call Decho("copy function-local variables back to buffer netrw variables")
9440   if exists("netrw_bannercnt")      |let b:netrw_bannercnt       = netrw_bannercnt      |endif
9441   if exists("netrw_browser_active") |let b:netrw_browser_active  = netrw_browser_active |endif
9442   if exists("netrw_cpf")            |let b:netrw_cpf             = netrw_cpf            |endif
9443   if exists("netrw_curdir")         |let b:netrw_curdir          = netrw_curdir         |endif
9444   if exists("netrw_explore_bufnr")  |let b:netrw_explore_bufnr   = netrw_explore_bufnr  |endif
9445   if exists("netrw_explore_indx")   |let b:netrw_explore_indx    = netrw_explore_indx   |endif
9446   if exists("netrw_explore_line")   |let b:netrw_explore_line    = netrw_explore_line   |endif
9447   if exists("netrw_explore_list")   |let b:netrw_explore_list    = netrw_explore_list   |endif
9448   if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
9449   if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
9450   if exists("netrw_fname")          |let b:netrw_fname           = netrw_fname          |endif
9451   if exists("netrw_lastfile")       |let b:netrw_lastfile        = netrw_lastfile       |endif
9452   if exists("netrw_liststyle")      |let b:netrw_liststyle       = netrw_liststyle      |endif
9453   if exists("netrw_method")         |let b:netrw_method          = netrw_method         |endif
9454   if exists("netrw_option")         |let b:netrw_option          = netrw_option         |endif
9455   if exists("netrw_prvdir")         |let b:netrw_prvdir          = netrw_prvdir         |endif
9457   if a:0 > 0
9458    let b:netrw_curdir= a:1
9459    if b:netrw_curdir =~ '/$'
9460     if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
9461      file NetrwTreeListing
9462      set bt=nowrite noswf bh=hide
9463      nno <silent> <buffer> [    :sil call <SID>TreeListMove('[')<cr>
9464      nno <silent> <buffer> ]    :sil call <SID>TreeListMove(']')<cr>
9465     else
9466      exe "sil! keepalt file ".fnameescape(b:netrw_curdir)
9467     endif
9468    endif
9469   endif
9471 "  call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#")."> bh=".&bh)
9472 endfun
9474 " ---------------------------------------------------------------------
9475 " s:NetrwInsureWinVars: insure that a netrw buffer has its w: variables in spite of a wincmd v or s {{{2
9476 fun! s:NetrwInsureWinVars()
9477 "  call Dfunc("s:NetrwInsureWinVars() win#".winnr())
9478   if !exists("w:netrw_liststyle")
9479    let curbuf = bufnr("%")
9480    let curwin = winnr()
9481    let iwin   = 1
9482    while iwin <= winnr("$")
9483     exe iwin."wincmd w"
9484     if winnr() != curwin && bufnr("%") == curbuf && exists("w:netrw_liststyle")
9485      " looks like ctrl-w_s or ctrl-w_v was used to split a netrw buffer
9486      let winvars= w:
9487      break
9488     endif
9489     let iwin= iwin + 1
9490    endwhile
9491    exe "keepalt ".curwin."wincmd w"
9492    if exists("winvars")
9493 "    call Decho("copying w#".iwin." window variables to w#".curwin)
9494     for k in keys(winvars)
9495      let w:{k}= winvars[k]
9496     endfor
9497    endif
9498   endif
9499 "  call Dret("s:NetrwInsureWinVars win#".winnr())
9500 endfun
9502 " ------------------------------------------------------------------------
9503 " s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
9504 " changed sorting, etc.  Also see s:NetrwRestoreWordPosn().
9505 fun! s:NetrwSaveWordPosn()
9506 "  call Dfunc("NetrwSaveWordPosn()")
9507   let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
9508 "  call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
9509 endfun
9511 " ---------------------------------------------------------------------
9512 " s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
9513 "  changed sorting, etc.  Also see s:NetrwSaveWordPosn().
9514 fun! s:NetrwRestoreWordPosn()
9515 "  call Dfunc("NetrwRestoreWordPosn()")
9516   sil! call search(s:netrw_saveword,'w')
9517 "  call Dret("NetrwRestoreWordPosn")
9518 endfun
9520 " ---------------------------------------------------------------------
9521 " s:RestoreBufVars: {{{2
9522 fun! s:RestoreBufVars()
9523 "  call Dfunc("s:RestoreBufVars()")
9525   if exists("s:netrw_curdir")        |let b:netrw_curdir         = s:netrw_curdir        |endif
9526   if exists("s:netrw_lastfile")      |let b:netrw_lastfile       = s:netrw_lastfile      |endif
9527   if exists("s:netrw_method")        |let b:netrw_method         = s:netrw_method        |endif
9528   if exists("s:netrw_fname")         |let b:netrw_fname          = s:netrw_fname         |endif
9529   if exists("s:netrw_machine")       |let b:netrw_machine        = s:netrw_machine       |endif
9530   if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
9532 "  call Dret("s:RestoreBufVars")
9533 endfun
9535 " ---------------------------------------------------------------------
9536 " s:RemotePathAnalysis: {{{2
9537 fun! s:RemotePathAnalysis(dirname)
9538 "  call Dfunc("s:RemotePathAnalysis(a:dirname<".a:dirname.">)")
9540   let dirpat  = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
9541   let s:method  = substitute(a:dirname,dirpat,'\1','')
9542   let s:user    = substitute(a:dirname,dirpat,'\2','')
9543   let s:machine = substitute(a:dirname,dirpat,'\3','')
9544   let s:port    = substitute(a:dirname,dirpat,'\4','')
9545   let s:path    = substitute(a:dirname,dirpat,'\5','')
9546   let s:fname   = substitute(a:dirname,'^.*/\ze.','','')
9548 "  call Decho("set up s:method <".s:method .">")
9549 "  call Decho("set up s:user   <".s:user   .">")
9550 "  call Decho("set up s:machine<".s:machine.">")
9551 "  call Decho("set up s:port   <".s:port.">")
9552 "  call Decho("set up s:path   <".s:path   .">")
9553 "  call Decho("set up s:fname  <".s:fname  .">")
9555 "  call Dret("s:RemotePathAnalysis")
9556 endfun
9558 " ---------------------------------------------------------------------
9559 " s:RemoteSystem: runs a command on a remote host using ssh {{{2
9560 "                 Returns status
9561 " Runs system() on
9562 "    [cd REMOTEDIRPATH;] a:cmd
9563 " Note that it doesn't do shellescape(a:cmd)!
9564 fun! s:RemoteSystem(cmd)
9565 "  call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
9566   if !executable(g:netrw_ssh_cmd)
9567    keepj call netrw#ErrorMsg(s:ERROR,"g:netrw_ssh_cmd<".g:netrw_ssh_cmd."> is not executable!",52)
9568   elseif !exists("b:netrw_curdir")
9569    keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
9570   else
9571    let cmd      = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
9572    let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
9573    if remotedir != ""
9574     let cmd= cmd.' cd '.shellescape(remotedir).";"
9575    else
9576     let cmd= cmd.' '
9577    endif
9578    let cmd= cmd.a:cmd
9579 "   call Decho("call system(".cmd.")")
9580    let ret= system(cmd)
9581   endif
9582 "  call Dret("s:RemoteSystem ".ret)
9583   return ret
9584 endfun
9586 " ---------------------------------------------------------------------
9587 " s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
9588 fun! s:RestoreWinVars()
9589 "  call Dfunc("s:RestoreWinVars()")
9590   if exists("s:bannercnt")      |let w:netrw_bannercnt       = s:bannercnt      |unlet s:bannercnt      |endif
9591   if exists("s:col")            |let w:netrw_col             = s:col            |unlet s:col            |endif
9592   if exists("s:curdir")         |let w:netrw_curdir          = s:curdir         |unlet s:curdir         |endif
9593   if exists("s:explore_bufnr")  |let w:netrw_explore_bufnr   = s:explore_bufnr  |unlet s:explore_bufnr  |endif
9594   if exists("s:explore_indx")   |let w:netrw_explore_indx    = s:explore_indx   |unlet s:explore_indx   |endif
9595   if exists("s:explore_line")   |let w:netrw_explore_line    = s:explore_line   |unlet s:explore_line   |endif
9596   if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
9597   if exists("s:explore_list")   |let w:netrw_explore_list    = s:explore_list   |unlet s:explore_list   |endif
9598   if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
9599   if exists("s:fpl")            |let w:netrw_fpl             = s:fpl            |unlet s:fpl            |endif
9600   if exists("s:hline")          |let w:netrw_hline           = s:hline          |unlet s:hline          |endif
9601   if exists("s:line")           |let w:netrw_line            = s:line           |unlet s:line           |endif
9602   if exists("s:liststyle")      |let w:netrw_liststyle       = s:liststyle      |unlet s:liststyle      |endif
9603   if exists("s:method")         |let w:netrw_method          = s:method         |unlet s:method         |endif
9604   if exists("s:prvdir")         |let w:netrw_prvdir          = s:prvdir         |unlet s:prvdir         |endif
9605   if exists("s:treedict")       |let w:netrw_treedict        = s:treedict       |unlet s:treedict       |endif
9606   if exists("s:treetop")        |let w:netrw_treetop         = s:treetop        |unlet s:treetop        |endif
9607   if exists("s:winnr")          |let w:netrw_winnr           = s:winnr          |unlet s:winnr          |endif
9608 "  call Dret("s:RestoreWinVars")
9609 endfun
9611 " ---------------------------------------------------------------------
9612 " s:Rexplore: implements returning from a buffer to a netrw directory {{{2
9614 "             s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
9615 "             is true) and a command, :Rexplore, which call this function.
9617 "             s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
9618 fun! s:NetrwRexplore(islocal,dirname)
9619   if exists("s:netrwdrag")
9620    return
9621   endif
9622 "  call Dfunc("s:NetrwRexplore() w:netrw_rexlocal=".w:netrw_rexlocal." w:netrw_rexdir<".w:netrw_rexdir.">")
9623   if !exists("w:netrw_rexlocal")
9624 "   "   call Dret("s:NetrwRexplore() w:netrw_rexlocal doesn't exist")
9625    return
9626   endif
9627   if w:netrw_rexlocal
9628    keepj call netrw#LocalBrowseCheck(w:netrw_rexdir)
9629   else
9630    keepj call s:NetrwBrowse(0,w:netrw_rexdir)
9631   endif
9632   if exists("s:initbeval")
9633    set beval
9634   endif
9635   if exists("s:rexposn_".bufnr("%"))
9636 "   call Decho("(NetrwRexplore) restore posn, then unlet s:rexposn_".bufnr('%'))
9637    keepj call netrw#NetrwRestorePosn(s:rexposn_{bufnr('%')})
9638    unlet s:rexposn_{bufnr('%')}
9639   else
9640 "   call Decho("(NetrwRexplore) s:rexposn_".bufnr('%')." doesn't exist")
9641   endif
9642   if exists("s:explore_match")
9643    exe "2match netrwMarkFile /".s:explore_match."/"
9644   endif
9645 "  call Dret("s:NetrwRexplore")
9646 endfun
9648 " ---------------------------------------------------------------------
9649 " s:SaveBufVars: {{{2
9650 fun! s:SaveBufVars()
9651 "  call Dfunc("s:SaveBufVars() buf#".bufnr("%"))
9653   if exists("b:netrw_curdir")        |let s:netrw_curdir         = b:netrw_curdir        |endif
9654   if exists("b:netrw_lastfile")      |let s:netrw_lastfile       = b:netrw_lastfile      |endif
9655   if exists("b:netrw_method")        |let s:netrw_method         = b:netrw_method        |endif
9656   if exists("b:netrw_fname")         |let s:netrw_fname          = b:netrw_fname         |endif
9657   if exists("b:netrw_machine")       |let s:netrw_machine        = b:netrw_machine       |endif
9658   if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
9660 "  call Dret("s:SaveBufVars")
9661 endfun
9663 " ---------------------------------------------------------------------
9664 " s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
9665 fun! s:SaveWinVars()
9666 "  call Dfunc("s:SaveWinVars() win#".winnr())
9667   if exists("w:netrw_bannercnt")      |let s:bannercnt       = w:netrw_bannercnt      |endif
9668   if exists("w:netrw_col")            |let s:col             = w:netrw_col            |endif
9669   if exists("w:netrw_curdir")         |let s:curdir          = w:netrw_curdir         |endif
9670   if exists("w:netrw_explore_bufnr")  |let s:explore_bufnr   = w:netrw_explore_bufnr  |endif
9671   if exists("w:netrw_explore_indx")   |let s:explore_indx    = w:netrw_explore_indx   |endif
9672   if exists("w:netrw_explore_line")   |let s:explore_line    = w:netrw_explore_line   |endif
9673   if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
9674   if exists("w:netrw_explore_list")   |let s:explore_list    = w:netrw_explore_list   |endif
9675   if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
9676   if exists("w:netrw_fpl")            |let s:fpl             = w:netrw_fpl            |endif
9677   if exists("w:netrw_hline")          |let s:hline           = w:netrw_hline          |endif
9678   if exists("w:netrw_line")           |let s:line            = w:netrw_line           |endif
9679   if exists("w:netrw_liststyle")      |let s:liststyle       = w:netrw_liststyle      |endif
9680   if exists("w:netrw_method")         |let s:method          = w:netrw_method         |endif
9681   if exists("w:netrw_prvdir")         |let s:prvdir          = w:netrw_prvdir         |endif
9682   if exists("w:netrw_treedict")       |let s:treedict        = w:netrw_treedict       |endif
9683   if exists("w:netrw_treetop")        |let s:treetop         = w:netrw_treetop        |endif
9684   if exists("w:netrw_winnr")          |let s:winnr           = w:netrw_winnr          |endif
9685 "  call Dret("s:SaveWinVars")
9686 endfun
9688 " ---------------------------------------------------------------------
9689 " s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
9690 "   To allow separate windows to have their own activities, such as
9691 "   Explore **/pattern, several variables have been made window-oriented.
9692 "   However, when the user splits a browser window (ex: ctrl-w s), these
9693 "   variables are not inherited by the new window.  SetBufWinVars() and
9694 "   UseBufWinVars() get around that.
9695 fun! s:SetBufWinVars()
9696 "  call Dfunc("s:SetBufWinVars() win#".winnr())
9697   if exists("w:netrw_liststyle")      |let b:netrw_liststyle      = w:netrw_liststyle      |endif
9698   if exists("w:netrw_bannercnt")      |let b:netrw_bannercnt      = w:netrw_bannercnt      |endif
9699   if exists("w:netrw_method")         |let b:netrw_method         = w:netrw_method         |endif
9700   if exists("w:netrw_prvdir")         |let b:netrw_prvdir         = w:netrw_prvdir         |endif
9701   if exists("w:netrw_explore_indx")   |let b:netrw_explore_indx   = w:netrw_explore_indx   |endif
9702   if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
9703   if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
9704   if exists("w:netrw_explore_bufnr")  |let b:netrw_explore_bufnr  = w:netrw_explore_bufnr  |endif
9705   if exists("w:netrw_explore_line")   |let b:netrw_explore_line   = w:netrw_explore_line   |endif
9706   if exists("w:netrw_explore_list")   |let b:netrw_explore_list   = w:netrw_explore_list   |endif
9707 "  call Dret("s:SetBufWinVars")
9708 endfun
9710 " ---------------------------------------------------------------------
9711 " s:SetRexDir: set directory for :Rexplore {{{2
9712 fun! s:SetRexDir(islocal,dirname)
9713 "  call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
9714   let w:netrw_rexdir   = a:dirname
9715   let w:netrw_rexlocal = a:islocal
9716 "  call Dret("s:SetRexDir : win#".winnr()." ".(a:islocal? "local" : "remote")." dir: ".a:dirname)
9717 endfun
9719 " ---------------------------------------------------------------------
9720 " s:Strlen: this function returns the length of a string, even if its {{{2
9721 "           using multiple-byte characters.
9722 "           Solution from Nicolai Weibull, vim docs (:help strlen()), Tony Mechelynck,
9723 "           and a bit from me.
9724 "           if g:netrw_xstrlen is zero (default), then the builtin strlen() function is used.
9725 fun! s:Strlen(x)
9726 "  call Dfunc("s:Strlen(x<".a:x.">")
9727   if g:netrw_xstrlen == 1
9728    " number of codepoints (Latin a + combining circumflex is two codepoints)
9729    " (comment from TM, solution from NW)
9730    let ret= strlen(substitute(a:x,'.','c','g'))
9732   elseif g:netrw_xstrlen == 2
9733    " number of spacing codepoints (Latin a + combining circumflex is one spacing 
9734    " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
9735    " (comment from TM, solution from TM)
9736    let ret=strlen(substitute(a:x, '.\Z', 'x', 'g')) 
9738   elseif g:netrw_xstrlen == 3
9739    " virtual length (counting, for instance, tabs as anything between 1 and 
9740    " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately 
9741    " preceded by lam, one otherwise, etc.)
9742    " (comment from TM, solution from me)
9743    let modkeep= &mod
9744    exe "keepj norm! o\<esc>"
9745    call setline(line("."),a:x)
9746    let ret= virtcol("$") - 1
9747    keepj d
9748    keepj norm! k
9749    let &mod= modkeep
9751   else
9752    " at least give a decent default
9753    let ret= strlen(a:x)
9754   endif
9755 "  call Dret("s:Strlen ".ret)
9756   return ret
9757 endfun
9759 " ---------------------------------------------------------------------
9760 " s:TreeListMove: {{{2
9761 fun! s:TreeListMove(dir)
9762 "  call Dfunc("s:TreeListMove(dir<".a:dir.">)")
9763   let curline  = getline('.')
9764   let prvline  = (line(".") > 1)?         getline(line(".")-1) : ''
9765   let nxtline  = (line(".") < line("$"))? getline(line(".")+1) : ''
9766   let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')
9767   let indentm1 = substitute(curindent,'^| ','','')
9768 "  call Decho("prvline  <".prvline."> #".line(".")-1)
9769 "  call Decho("curline  <".curline."> #".line("."))
9770 "  call Decho("nxtline  <".nxtline."> #".line(".")+1)
9771 "  call Decho("curindent<".curindent.">")
9772 "  call Decho("indentm1 <".indentm1.">")
9774   if curline !~ '/$'
9775 "   call Decho('regfile')
9776    if     a:dir == '[' && prvline != ''
9777     keepj norm! 0
9778     let nl = search('^'.indentm1.'[^|]','bWe')    " search backwards from regular file
9779 "    call Decho("regfile srch back: ".nl)
9780    elseif a:dir == ']' && nxtline != ''
9781     keepj norm! $
9782     let nl = search('^'.indentm1.'[^|]','We')     " search forwards from regular file
9783 "    call Decho("regfile srch fwd: ".nl)
9784    endif
9786   elseif a:dir == '[' && prvline != ''
9787    keepj norm! 0
9788    let curline= line(".")
9789    let nl     = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation
9790 "   call Decho("dir srch back ind: ".nl)
9791    if nl != 0
9792     if line(".") == curline-1
9793      let nl= search('^'.indentm1.'[^|]','bWe')     " search backwards from directory, indentation - 1
9794 "     call Decho("dir srch back ind-1: ".nl)
9795     endif
9796    endif
9798   elseif a:dir == ']' && nxtline != ''
9799    keepj norm! $
9800    let curline = line(".")
9801    let nl      = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation
9802 "   call Decho("dir srch fwd ind: ".nl)
9803    if nl != 0
9804     if line(".") == curline+1
9805      let nl= search('^'.indentm1.'[^|]','We')         " search forwards from directory, indentation - 1
9806 "     call Decho("dir srch fwd ind-1: ".nl)
9807     endif
9808    endif
9810   endif
9812 "  call Dret("s:TreeListMove")
9813 endfun
9815 " ---------------------------------------------------------------------
9816 " s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
9817 "                      The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
9818 "                      can't be called except via emenu.  But due to locale, that menu line may not be called
9819 "                      Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
9820 fun! s:UpdateBuffersMenu()
9821 "  call Dfunc("s:UpdateBuffersMenu()")
9822   if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
9823    try
9824     sil emenu Buffers.Refresh\ menu
9825    catch /^Vim\%((\a\+)\)\=:E/
9826     let v:errmsg= ""
9827     sil keepj call s:NetrwBMShow()
9828    endtry
9829   endif
9830 "  call Dret("s:UpdateBuffersMenu")
9831 endfun
9833 " ---------------------------------------------------------------------
9834 " s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
9835 "              Matching function to s:SetBufWinVars()
9836 fun! s:UseBufWinVars()
9837 "  call Dfunc("s:UseBufWinVars()")
9838   if exists("b:netrw_liststyle")       && !exists("w:netrw_liststyle")      |let w:netrw_liststyle       = b:netrw_liststyle      |endif
9839   if exists("b:netrw_bannercnt")       && !exists("w:netrw_bannercnt")      |let w:netrw_bannercnt       = b:netrw_bannercnt      |endif
9840   if exists("b:netrw_method")          && !exists("w:netrw_method")         |let w:netrw_method          = b:netrw_method         |endif
9841   if exists("b:netrw_prvdir")          && !exists("w:netrw_prvdir")         |let w:netrw_prvdir          = b:netrw_prvdir         |endif
9842   if exists("b:netrw_explore_indx")    && !exists("w:netrw_explore_indx")   |let w:netrw_explore_indx    = b:netrw_explore_indx   |endif
9843   if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
9844   if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
9845   if exists("b:netrw_explore_bufnr")   && !exists("w:netrw_explore_bufnr")  |let w:netrw_explore_bufnr   = b:netrw_explore_bufnr  |endif
9846   if exists("b:netrw_explore_line")    && !exists("w:netrw_explore_line")   |let w:netrw_explore_line    = b:netrw_explore_line   |endif
9847   if exists("b:netrw_explore_list")    && !exists("w:netrw_explore_list")   |let w:netrw_explore_list    = b:netrw_explore_list   |endif
9848 "  call Dret("s:UseBufWinVars")
9849 endfun
9851 " ---------------------------------------------------------------------
9852 " Settings Restoration: {{{1
9853 let &cpo= s:keepcpo
9854 unlet s:keepcpo
9856 " ------------------------------------------------------------------------
9857 " Modelines: {{{1
9858 " vim:ts=8 fdm=marker