updated for version 7.0002
diff --git a/runtime/plugin/netrw.vim b/runtime/plugin/netrw.vim
index d3058c5..fdb6d27 100644
--- a/runtime/plugin/netrw.vim
+++ b/runtime/plugin/netrw.vim
@@ -1,7 +1,7 @@
 " netrw.vim: (global plugin) Handles file transfer across a network
-" Last Change:	Jun 04, 2004
+" Last Change:	Jun 18, 2004
 " Maintainer:	Charles E. Campbell, Jr. PhD   <drchipNOSPAM at campbellfamily.biz>
-" Version:	44
+" Version:	46
 " License:	Vim License  (see vim's :help license)
 "
 "  But be doers of the word, and not only hearers, deluding your own selves
@@ -12,7 +12,7 @@
 if exists("loaded_netrw") || &cp
   finish
 endif
-let loaded_netrw = "v44"
+let loaded_netrw = "v46"
 let s:save_cpo   = &cpo
 set cpo&vim
 
@@ -68,6 +68,20 @@
   let g:netrw_fetch_cmd	= ""
  endif
 endif
+if !exists("g:netrw_list_cmd")
+ if executable("ssh")
+  let g:netrw_list_cmd= "ssh HOSTNAME ls -Fa"
+ else
+"  call Decho("ssh is not executable, can't do netlist")
+  let g:netrw_list_cmd= ""
+ endif
+endif
+if exists("g:netrw_silent") && g:netrw_silent != 0
+ let g:netrw_silentxfer= "silent "
+else
+ let g:netrw_silentxfer= ""
+endif
+ 
 
 if has("win32")
   \ && exists("g:netrw_use_nt_rcp")
@@ -97,7 +111,7 @@
   endif
   au BufReadCmd  ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://*	exe "doau BufReadPre ".expand("<afile>")|exe "Nread 0r ".expand("<afile>")|exe "doau BufReadPost ".expand("<afile>")
   au FileReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://*	exe "doau BufReadPre ".expand("<afile>")|exe "Nread "   .expand("<afile>")|exe "doau BufReadPost ".expand("<afile>")
-  au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://*		exe "Nwrite "  .expand("<afile>")|call <SID>NetRestorePosn()
+  au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://*    		exe "Nwrite "  .expand("<afile>")|call <SID>NetRestorePosn()
  augroup END
 endif
 
@@ -151,9 +165,6 @@
  " save options
  call s:NetOptionSave()
 
- " get name of a temporary file
- let tmpfile= tempname()
-
  " Special Exception: if a file is named "0r", then
  "		      "0r" will be used to read the
  "		      following files instead of "r"
@@ -168,6 +179,10 @@
   let ichoice = 1
  endif
 
+ " get name of a temporary file
+ let tmpfile= tempname()
+
+" call Decho("ichoice=".ichoice." readcmd<".readcmd.">")
  while ichoice <= a:0
 
   " attempt to repeat with previous host-file-etc
@@ -178,7 +193,7 @@
 
   else
    exe "let choice= a:" . ichoice
-"   call Decho("NetRead1: choice<" . choice . ">")
+"   call Decho("no lastfile: choice<" . choice . ">")
 
    " Reconstruct Choice if choice starts with '"'
    if match(choice,"?") == 0
@@ -219,13 +234,13 @@
     endif
    endif
   endif
-"  call Decho("NetRead2: choice<" . choice . ">")
+"  call Decho("choice<" . choice . ">")
   let ichoice= ichoice + 1
 
   " fix up windows urls
   if has("win32")
    let choice = substitute(choice,'\\','/','ge')
-"   call Decho("fixing up windows url to <".choice.">")
+"   call Decho("fixing up windows url to <".choice."> tmpfile<".tmpfile)
    exe 'lcd ' . fnamemodify(tmpfile,':h')
    let tmpfile = fnamemodify(tmpfile,':t')
   endif
@@ -233,12 +248,24 @@
   " Determine method of read (ftp, rcp, etc)
   call s:NetMethod(choice)
 
+  " Check if NetList() should be handling this request
+"  call Decho("checking if netlist: choice<".choice."> netrw_list_cmd<".g:netrw_list_cmd.">")
+  if choice =~ "^.*/$"
+   if strlen(g:netrw_list_cmd) > 0
+    call s:NetList(choice)
+"    call Dret("NetRead")
+   else
+    echoerr "sorry, can't do a remote listing; ssh isn't executable"
+   endif
+   return
+  endif
+
   " ============
   " Perform Read
   " ============
 
   ".........................................
-  " rcp:  Method #1
+  " rcp:  NetRead Method #1
   if  b:netrw_method == 1 " read with rcp
 "   call Decho("read via rcp (method #1)")
   " ER: noting done with g:netrw_uid yet?
@@ -260,12 +287,12 @@
    endif
   endif
 "  call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
-  exe "!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
-  let result		= s:NetGetFile(readcmd, tmpfile, b:netrw_method)
+  exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
+  let result           = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
   let b:netrw_lastfile = choice
 
   ".........................................
-  " ftp + <.netrc>:  Method #2
+  " ftp + <.netrc>:  NetRead Method #2
   elseif b:netrw_method  == 2		" read with ftp + <.netrc>
 "   call Decho("read via ftp+.netrc (method #2)")
     let netrw_fname= b:netrw_fname
@@ -275,10 +302,10 @@
     exe "put ='get ".netrw_fname." ".tmpfile."'"
     if exists("g:netrw_port") && g:netrw_port != ""
 "     call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
-     exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
+     exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
     else
 "     call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
-     exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
+     exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
     endif
     " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
     if getline(1) !~ "^$"
@@ -289,7 +316,7 @@
     let b:netrw_lastfile = choice
 
   ".........................................
-  " ftp + machine,id,passwd,filename:  Method #3
+  " ftp + machine,id,passwd,filename:  NetRead Method #3
   elseif b:netrw_method == 3		" read with ftp + machine, id, passwd, and fname
    " Construct execution string (four lines) which will be passed through filter
 "  call Decho("read via ftp+mipf (method #3)")
@@ -321,7 +348,7 @@
 "   call Decho('performing ftp -i -n')
    norm 1Gdd
 "   call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
-   exe "%!".g:netrw_ftp_cmd." -i -n"
+   exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
    " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
    if getline(1) !~ "^$"
     echoerr getline(1)
@@ -331,7 +358,7 @@
    let b:netrw_lastfile = choice
 
   ".........................................
-  " scp: Method #4
+  " scp: NetRead Method #4
   elseif     b:netrw_method  == 4	" read with scp
 "   call Decho("read via scp (method #4)")
    if exists("g:netrw_port") && g:netrw_port != ""
@@ -342,10 +369,10 @@
    if g:netrw_cygwin == 1
     let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
 "    call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
-    exe "!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
+    exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
    else
 "    call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
-    exe "!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
+    exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
    endif
    let result		= s:NetGetFile(readcmd, tmpfile, b:netrw_method)
    let b:netrw_lastfile = choice
@@ -361,7 +388,7 @@
    if match(b:netrw_fname,"#") == -1
     " simple wget
 "    call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&'))
-    exe "!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
+    exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.escape(b:netrw_fname,' ?&')
     let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
 
    else
@@ -371,7 +398,7 @@
 "	call Decho("netrw_html<".netrw_html.">")
 "	call Decho("netrw_tag <".netrw_tag.">")
 "    call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
-    exe "!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
+    exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
     let result = s:NetGetFile(readcmd, tmpfile, b:netrw_method)
 "    call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
     exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
@@ -379,7 +406,7 @@
    let b:netrw_lastfile = choice
 
   ".........................................
-  " cadaver: Method #6
+  " cadaver: NetRead Method #6
   elseif     b:netrw_method  == 6	" read with cadaver
 "   call Decho("read via cadaver (method #6)")
 
@@ -404,28 +431,28 @@
    " perform cadaver operation:
    norm 1Gdd
 "   call Decho("executing: %!".g:netrw_dav_cmd)
-   exe "%!".g:netrw_dav_cmd
+   exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
    bd!
    let result		= s:NetGetFile(readcmd, tmpfile, b:netrw_method)
    let b:netrw_lastfile = choice
 
   ".........................................
-  " rsync: Method #7
+  " rsync: NetRead Method #7
   elseif     b:netrw_method  == 7	" read with rsync
 "   call Decho("read via rsync (method #7)")
    if g:netrw_cygwin == 1
     let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
 "    call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile)
-    exe "!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
+    exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
    else
 "    call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
-    exe "!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
+    exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
    endif
    let result		= s:NetGetFile(readcmd,tmpfile, b:netrw_method)
    let b:netrw_lastfile = choice
 
   ".........................................
-  " fetch: Method #8
+  " fetch: NetRead Method #8
   "    fetch://[user@]host[:http]/path
   elseif     b:netrw_method  == 8	" read with fetch
    if g:netrw_fetch_cmd == ""
@@ -441,17 +468,17 @@
 
    if exists("g:netrw_uid") && g:netrw_uid != "" && exists("g:netrw_passwd") && g:netrw_passwd != ""
 "    call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
-    exe "!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
+    exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.g:netrw_passwd.'@'.g:netrw_machine."/".escape(b:netrw_fname,' ?&')
    else
 "    call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&'))
-    exe "!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
+    exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".escape(b:netrw_fname,' ?&')
    endif
 
    let result		= s:NetGetFile(readcmd,tmpfile, b:netrw_method)
    let b:netrw_lastfile = choice
 
   ".........................................
-  " sftp: Method #9
+  " sftp: NetRead Method #9
   elseif     b:netrw_method  == 9	" read with sftp
 "   call Decho("read via sftp (method #4)")
    if g:netrw_cygwin == 1
@@ -461,7 +488,7 @@
     exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".cygtmpfile
    else
 "    call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile)
-    exe "!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
+    exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')." ".tmpfile
    endif
    let result		= s:NetGetFile(readcmd, tmpfile, b:netrw_method)
    let b:netrw_lastfile = choice
@@ -488,7 +515,7 @@
 " ------------------------------------------------------------------------
 " NetGetFile: Function to read file "fname" with command "readcmd". {{{1
 fun! s:NetGetFile(readcmd, fname, method)
-"  call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
+""  call Dfunc("NetGetFile(readcmd<".a:readcmd.">,fname<".a:fname."> method<".a:method.">)")
 
  if exists("*NetReadFixup")
   " for the use of NetReadFixup (not otherwise used internally)
@@ -499,14 +526,14 @@
  if &term == "win32"
   if &shell == "bash"
    let fname=a:fname
-"  call Decho("(win32 && bash) fname<".fname.">")
+""  call Decho("(win32 && bash) fname<".fname.">")
   else
    let fname=substitute(a:fname,'/','\\\\','ge')
-"  call Decho("(win32 && !bash) fname<".fname.">")
+""  call Decho("(win32 && !bash) fname<".fname.">")
   endif
  else
   let fname= a:fname
-"  call Decho("(copied) fname<".fname.">")
+""  call Decho("(copied) fname<".fname.">")
  endif
 
  " get the file, but disable undo when reading a new buffer
@@ -576,21 +603,21 @@
   else
    let line2= line("$") - line2
   endif
-"  call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
+""  call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")")
   call NetReadFixup(a:method, line1, line2)
  endif
-" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
+"" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> fname<".a:fname."> readable=".filereadable(a:fname))
 
 " insure that we have the right filetype and that its being displayed
  filetype detect
  redraw!
-" call Dret("NetGetFile")
+"" call Dret("NetGetFile")
 endfun
 
 " ------------------------------------------------------------------------
 " NetWrite: responsible for writing a file over the net {{{1
 fun! s:NetWrite(...) range
-" call Dfunc("NetWrite(a:0=".a:0.")")
+"" call Dfunc("NetWrite(a:0=".a:0.")")
 
  " option handling
  let mod= 0
@@ -612,7 +639,7 @@
 
   " attempt to repeat with previous host-file-etc
   if exists("b:netrw_lastfile") && a:0 == 0
-"   call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
+""   call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">")
    let choice = b:netrw_lastfile
    let ichoice= ichoice + 1
   else
@@ -647,7 +674,7 @@
       let ichoice    = ichoice + 1
       if choice > a:0
        echoerr "Unbalanced string in filename '". wholechoice ."'"
-"       call Dret("NetWrite")
+""       call Dret("NetWrite")
        return
       endif
       let choice= a:{ichoice}
@@ -656,7 +683,7 @@
     endif
    endif
   endif
-"  call Decho("choice<" . choice . ">")
+""  call Decho("choice<" . choice . ">")
   let ichoice= ichoice + 1
 
   " fix up windows urls
@@ -675,9 +702,9 @@
   " =============
 
   ".........................................
-  " rcp: Method #1
+  " rcp: NetWrite Method #1
   if  b:netrw_method == 1	" write with rcp
-"	Decho "write via rcp (method #1)"
+""	Decho "write via rcp (method #1)"
    if s:netrw_has_nt_rcp == 1
     if exists("g:netrw_uid") &&  ( g:netrw_uid != "" )
      let uid_machine = g:netrw_machine .'.'. g:netrw_uid
@@ -691,26 +718,26 @@
      let uid_machine = g:netrw_machine
     endif
    endif
-"   call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
-   exe "!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
+""   call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&'))
+   exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".tmpfile." ".uid_machine.":".escape(b:netrw_fname,' ?&')
    let b:netrw_lastfile = choice
 
   ".........................................
-  " ftp + <.netrc>: Method #2
+  " ftp + <.netrc>: NetWrite Method #2
   elseif b:netrw_method == 2	" write with ftp + <.netrc>
    let netrw_fname = b:netrw_fname
    new
    set ff=unix
    exe "put ='".g:netrw_ftpmode."'"
-"   call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
+""   call Decho(" NetWrite: put ='".g:netrw_ftpmode."'")
    exe "put ='put ".tmpfile." ".netrw_fname."'"
-"   call Decho("put ='put ".tmpfile." ".netrw_fname."'")
+""   call Decho("put ='put ".tmpfile." ".netrw_fname."'")
    if exists("g:netrw_port") && g:netrw_port != ""
-"    call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
-    exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
+""    call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
+    exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
    else
-"    call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
-    exe "%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
+""    call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
+    exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
    endif
    " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
    if getline(1) !~ "^$"
@@ -721,7 +748,7 @@
    let b:netrw_lastfile = choice
 
   ".........................................
-  " ftp + machine, id, passwd, filename: Method #3
+  " ftp + machine, id, passwd, filename: NetWrite Method #3
   elseif b:netrw_method == 3	" write with ftp + machine, id, passwd, and fname
    let netrw_fname= b:netrw_fname
    new
@@ -745,10 +772,10 @@
    " -i       : turns off interactive prompting from ftp
    " -n  unix : DON'T use <.netrc>, even though it exists
    " -n  win32: quit being obnoxious about password
-"   call Decho('performing ftp -i -n')
+""   call Decho('performing ftp -i -n')
    norm 1Gdd
-"   call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
-   exe "%!".g:netrw_ftp_cmd." -i -n"
+""   call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
+   exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
    " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
    if getline(1) !~ "^$"
     echoerr getline(1)
@@ -757,7 +784,7 @@
    bd!
 
   ".........................................
-  " scp: Method #4
+  " scp: NetWrite Method #4
   elseif     b:netrw_method == 4	" write with scp
    if exists("g:netrw_port") && g:netrw_port != ""
     let useport= " -P ".g:netrw_port
@@ -766,23 +793,23 @@
    endif
    if g:netrw_cygwin == 1
     let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
-"    call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
-    exe "!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
+""    call Decho("executing: !".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
+    exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
    else
-"    call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
-    exe "!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
+""    call Decho("executing: !".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
+    exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
    endif
    let b:netrw_lastfile = choice
 
   ".........................................
-  " http: Method #5
+  " http: NetWrite Method #5
   elseif     b:netrw_method == 5
    echoerr "***warning*** currently <netrw.vim> does not support writing using http:"
 
   ".........................................
-  " dav: Method #6
+  " dav: NetWrite Method #6
   elseif     b:netrw_method == 6	" write with cadaver
-"   call Decho("write via cadaver (method #6)")
+""   call Decho("write via cadaver (method #6)")
 
    " Construct execution string (four lines) which will be passed through filter
    let netrw_fname= b:netrw_fname
@@ -804,26 +831,26 @@
 
    " perform cadaver operation:
    norm 1Gdd
-"   call Decho("executing: %!".g:netrw_dav_cmd)
-   exe "%!".g:netrw_dav_cmd
+""   call Decho("executing: %!".g:netrw_dav_cmd)
+   exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
    bd!
    let b:netrw_lastfile = choice
 
   ".........................................
-  " rsync: Method #7
+  " rsync: NetWrite Method #7
   elseif     b:netrw_method == 7	" write with rsync
    if g:netrw_cygwin == 1
     let cygtmpfile=substitute(tmpfile,'^\(\a\):','/cygdrive/\1/','e')
-"    call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
-    exe "!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
+""    call Decho("executing: !".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
+    exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".cygtmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
    else
-"    call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
-    exe "!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
+""    call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&'))
+    exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".escape(b:netrw_fname,' ?&')
    endif
    let b:netrw_lastfile = choice
 
   ".........................................
-  " scp: Method #9
+  " scp: NetWrite Method #9
   elseif     b:netrw_method == 9	" write with sftp
    let netrw_fname= b:netrw_fname
    if exists("g:netrw_uid") &&  ( g:netrw_uid != "" )
@@ -835,8 +862,8 @@
    set ff=unix
    put ='put '.tmpfile.' '.netrw_fname
    norm 1Gdd
-"   call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
-   exe "%!".g:netrw_sftp_cmd.' '.uid_machine
+""   call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
+   exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
    bd!
    let b:netrw_lastfile= choice
 
@@ -847,7 +874,7 @@
  endwhile
 
  " cleanup
-" call Decho("cleanup")
+"" call Decho("cleanup")
  let result=delete(tmpfile)
  call s:NetOptionRestore()
 
@@ -855,11 +882,146 @@
   let &mod= mod	" usually equivalent to set nomod
  endif
 
-" call Dret("NetWrite")
+"" call Dret("NetWrite")
 endfun
 " end of NetWrite
 
 " ------------------------------------------------------------------------
+" NetList: This function uses the command in g:netrw_list_cmd to get a list {{{1
+"  of the contents of a remote directory.  It is assumed that the
+"  g:netrw_list_cmd has a string, HOSTNAME, that needs to be substituted
+"  with the requested remote hostname first.
+fun! <SID>NetList(dirname)
+""  call Dfunc("NetList(dirname<".a:dirname.">)")
+
+  " sanity maintenance
+  let dirname= a:dirname
+  if dirname !~ '/$' && (!exists("g:netrw_machine") || !exists("b:netlist_method") || !exists("b:netlist_path"))
+   let dirname= dirname."/"
+  endif
+  set ma
+
+  if dirname !~ '/$' && dirname !~ '^"'
+   " looks like a regular file, attempt transfer
+""   call Decho("attempt transfer with regular file<".dirname.">")
+""   call Decho("netlist method<".b:netlist_method."> cmd<".b:netlist_cmd."> path<".b:netlist_path.">")
+   %d
+
+   " remove any filetype indicator from end of dirname, except for the
+   " "this is a directory" indicator (/)
+   let dirname= substitute(dirname,"[*=@|]$","","e")
+""   call Decho("modified dirname<".dirname.">")
+
+   " remote-read the requested file into current buffer
+   let machine= g:netrw_machine
+   let method = b:netlist_method
+   let path   = b:netlist_path
+   enew!
+   exe "file ".method."://".machine."/".path.dirname
+   exe "doau BufReadPre ".dirname
+   silent call s:NetRead(method."://".machine."/".path.dirname)
+   exe "doau BufReadPost ".dirname
+   1d
+   set nomod noma
+
+   silent! unlet b:netlist_method
+   silent! unlet b:netlist_cmd
+   silent! unlet b:netlist_path
+""   call Dret("NetList")
+   return
+
+  elseif dirname == './'
+   " refresh the directory list
+""   call Decho("refresh directory listing")
+""   call Decho("netlist method<".b:netlist_method."> cmd<".b:netlist_cmd."> path<".b:netlist_path.">")
+   %d
+
+  elseif dirname == '../'
+   " go up one directory
+
+   if b:netlist_path !~ '/' && strlen(b:netlist_path) > 0
+    " go to top (rltv) directory
+""    call Decho("go up one directory : 1 path<".b:netlist_path.">")
+    let b:netlist_path= ""
+
+   elseif b:netlist_path !~ '^[./]\+$' && strlen(b:netlist_path) > 0
+    " remove a directory from the netlist_path
+""    call Decho("go up one directory : 2 path<".b:netlist_path.">")
+    if b:netlist_path =~ '^[^/]*/$'
+     let b:netlist_path= ""
+    else
+     let b:netlist_path= substitute(b:netlist_path,'^\(.*/\)[^/]*/$','\1','')
+    endif
+
+   else
+    " append ../
+""    call Decho("go up one directory : 3 path<".b:netlist_path.">")
+    let b:netlist_path= b:netlist_path.'../'
+   endif
+""   call Decho("netlist method<".b:netlist_method."> cmd<".b:netlist_cmd."> path<".b:netlist_path.">")
+   %d
+
+  elseif dirname !~ '^\w\+:' && dirname =~ '/$'
+   " go down one directory
+""   call Decho("go down one directory<".dirname.">")
+   let b:netlist_path=b:netlist_path.dirname
+""   call Decho("netlist method<".b:netlist_method."> cmd<".b:netlist_cmd."> path<".b:netlist_path.">")
+   %d
+
+  else
+   " normal initial directory listing
+""   call Decho("normal initial directory listing")
+
+   let listcmd = substitute(g:netrw_list_cmd,'\<HOSTNAME\>',g:netrw_machine,'')
+   let method  = substitute(dirname,'^\(\w\+\):.*$','\1','')
+   let fname   = b:netrw_fname
+""   call Decho("set up listcmd<".listcmd.">")
+""   call Decho("set up method <".method.">")
+""   call Decho("set up fname  <".fname.">")
+
+   " set up window
+   if &mod == 1
+    wincmd s
+   endif
+   enew!
+   if v:version >= 602
+    setlocal bh=wipe
+   endif
+   
+   " set up buffer-local variables
+   let b:netlist_method = method
+   let b:netlist_cmd    = listcmd
+   let b:netlist_path   = fname
+
+   " set up buffer-local map
+   nnoremap <buffer> <cr>	:call <SID>NetList(expand("<cWORD>"))<cr>
+
+""   call Decho("netlist method<".b:netlist_method."> cmd<".b:netlist_cmd."> path<".b:netlist_path.">")
+  endif
+
+""  call Decho("executing: r! ".b:netlist_cmd." '".b:netlist_path."'")
+  put ='\" =============================='
+  put ='\" Netrw Remote Directory Listing'
+  put ='\"   '.g:netrw_machine.':'.b:netlist_path
+  put ='\" =============================='
+  exe "silent r! ".b:netlist_cmd." '".b:netlist_path."'"
+  1d
+  set ft=netrwlist
+  silent 5,$s/^\(.*\)\/$/ \1/e
+  silent 5,$call s:NetSort()
+  silent 5,$s/^ \(.*\)$/\1\//e
+  5
+  exe 'file ['.g:netrw_machine.':'.b:netlist_path.']'
+  if v:version >= 602
+   setlocal nomod bh=wipe bt=nofile nobl noma
+  else
+   setlocal nomod
+  endif
+
+""  call Dret("NetList")
+endfun
+
+" ------------------------------------------------------------------------
 " NetMethod:  determine method of transfer {{{1
 "  method == 1: rcp
 "	     2: ftp + <.netrc>
@@ -871,7 +1033,7 @@
 "	     8: fetch
 "	     9: sftp
 fun! s:NetMethod(choice)  " globals: method machine id passwd fname
-" call Dfunc("NetMethod(a:choice<".a:choice.">)")
+"" call Dfunc("NetMethod(a:choice<".a:choice.">)")
 
  " initialization
  let b:netrw_method  = 0
@@ -891,23 +1053,23 @@
  " rsyncurm : rsync://host[:port]/path              Use rsync
  " fetchurm : fetch://[user@]host[:http]/filename   Use fetch (defaults to ftp, override for http)
  " sftpurm  : sftp://[user@]host/filename  Use scp
- let mipf     = '\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)'
- let mf       = '\(\S\+\)\s\+\(\S\+\)'
- let ftpurm   = 'ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
- let rcpurm   = 'rcp://\(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
- let rcphf    = '\(\([^@]\{-}\)@\)\=\(\I\i*\):\(\S\+\)'
- let scpurm   = 'scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
- let httpurm  = 'http://\([^/]\{-}\)\(/.*\)\=$'
- let davurm   = 'dav://\([^/]\{-}\)/\(.*\)\=$'
- let rsyncurm = 'rsync://\([^/]\{-}\)/\(.*\)\=$'
- let fetchurm = 'fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
- let sftpurm  = 'sftp://\([^/]\{-}\)/\(.*\)\=$'
+ let mipf     = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
+ let mf       = '^\(\S\+\)\s\+\(\S\+\)$'
+ let ftpurm   = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
+ let rcpurm   = '^rcp://\(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$'
+ let rcphf    = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
+ let scpurm   = '^scp://\([^/]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
+ let httpurm  = '^http://\([^/]\{-}\)\(/.*\)\=$'
+ let davurm   = '^dav://\([^/]\{-}\)/\(.*\)\=$'
+ let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
+ let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
+ let sftpurm  = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
 
-" call Decho("determine method:")
+"" call Decho("determine method:")
  " Determine Method
  " rcp://user@hostname/...path-to-file
  if match(a:choice,rcpurm) == 0
-"  call Decho("rcp://...")
+""  call Decho("rcp://...")
   let b:netrw_method = 1
   let userid	     = substitute(a:choice,rcpurm,'\2',"")
   let g:netrw_machine= substitute(a:choice,rcpurm,'\3',"")
@@ -918,7 +1080,7 @@
 
  " scp://user@hostname/...path-to-file
  elseif match(a:choice,scpurm) == 0
-"  call Decho("scp://...")
+""  call Decho("scp://...")
   let b:netrw_method = 4
   let g:netrw_machine= substitute(a:choice,scpurm,'\1',"")
   let b:netrw_port   = substitute(a:choice,scpurm,'\2',"")
@@ -926,28 +1088,28 @@
 
  " http://user@hostname/...path-to-file
  elseif match(a:choice,httpurm) == 0
-"  call Decho("http://...")
+""  call Decho("http://...")
   let b:netrw_method = 5
   let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
   let b:netrw_fname  = substitute(a:choice,httpurm,'\2',"")
 
  " dav://hostname[:port]/..path-to-file..
  elseif match(a:choice,davurm) == 0
-"  call Decho("dav://...")
+""  call Decho("dav://...")
   let b:netrw_method= 6
   let g:netrw_machine= substitute(a:choice,davurm,'\1',"")
   let b:netrw_fname  = substitute(a:choice,davurm,'\2',"")
 
  " rsync://user@hostname/...path-to-file
  elseif match(a:choice,rsyncurm) == 0
-"  call Decho("rsync://...")
+""  call Decho("rsync://...")
   let b:netrw_method = 7
   let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
   let b:netrw_fname  = substitute(a:choice,rsyncurm,'\2',"")
 
  " ftp://[user@]hostname[[:#]port]/...path-to-file
  elseif match(a:choice,ftpurm) == 0
-"  call Decho("ftp://...")
+""  call Decho("ftp://...")
   let userid	     = substitute(a:choice,ftpurm,'\2',"")
   let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
   let g:netrw_port   = substitute(a:choice,ftpurm,'\4',"")
@@ -975,7 +1137,7 @@
   endif
 
  elseif match(a:choice,fetchurm) == 0
-"  call Decho("fetch://...")
+""  call Decho("fetch://...")
   let b:netrw_method = 8
   let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
   let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
@@ -984,7 +1146,7 @@
 
  " Issue an ftp : "machine id password [path/]filename"
  elseif match(a:choice,mipf) == 0
-"  call Decho("(ftp) host id pass file")
+""  call Decho("(ftp) host id pass file")
   let b:netrw_method  = 3
   let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
   let g:netrw_uid     = substitute(a:choice,mipf,'\2',"")
@@ -993,7 +1155,7 @@
 
  " Issue an ftp: "hostname [path/]filename"
  elseif match(a:choice,mf) == 0
-"  call Decho("(ftp) host file")
+""  call Decho("(ftp) host file")
   if exists("g:netrw_uid") && exists("g:netrw_passwd")
    let b:netrw_method  = 3
    let g:netrw_machine = substitute(a:choice,mf,'\1',"")
@@ -1007,18 +1169,22 @@
 
  " sftp://user@hostname/...path-to-file
  elseif match(a:choice,sftpurm) == 0
-"  call Decho("sftp://...")
+""  call Decho("sftp://...")
   let b:netrw_method = 9
   let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
   let b:netrw_fname  = substitute(a:choice,sftpurm,'\2',"")
 
  " Issue an rcp: hostname:filename"  (this one should be last)
  elseif match(a:choice,rcphf) == 0
-"  call Decho("(rcp) host:file)")
+""  call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
   let b:netrw_method = 1
   let userid	     = substitute(a:choice,rcphf,'\2',"")
   let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
   let b:netrw_fname  = substitute(a:choice,rcphf,'\4',"")
+""  call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
+""  call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
+""  call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
+""  call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">")
   if userid != ""
    let g:netrw_uid= userid
   endif
@@ -1032,18 +1198,18 @@
   let b:netrw_method  = -1
  endif
 
-" call Decho("a:choice       <".a:choice.">")
-" call Decho("b:netrw_method <".b:netrw_method.">")
-" call Decho("g:netrw_machine<".g:netrw_machine.">")
-" call Decho("g:netrw_port   <".g:netrw_port.">")
-" if exists("g:netrw_uid")		"Decho
-"  call Decho("g:netrw_uid    <".g:netrw_uid.">")
-" endif					"Decho
-" if exists("g:netrw_passwd")		"Decho
-"  call Decho("g:netrw_passwd <".g:netrw_passwd.">")
-" endif					"Decho
-" call Decho("b:netrw_fname  <".b:netrw_fname.">")
-" call Dret("NetMethod")
+"" call Decho("a:choice       <".a:choice.">")
+"" call Decho("b:netrw_method <".b:netrw_method.">")
+"" call Decho("g:netrw_machine<".g:netrw_machine.">")
+"" call Decho("g:netrw_port   <".g:netrw_port.">")
+"" if exists("g:netrw_uid")		"Decho
+""  call Decho("g:netrw_uid    <".g:netrw_uid.">")
+"" endif					"Decho
+"" if exists("g:netrw_passwd")		"Decho
+""  call Decho("g:netrw_passwd <".g:netrw_passwd.">")
+"" endif					"Decho
+"" call Decho("b:netrw_fname  <".b:netrw_fname.">")
+"" call Dret("NetMethod")
 endfun
 " end of NetMethod
 
@@ -1056,32 +1222,32 @@
 
  " get/set userid
  if a:0 == 0
-"  call Dfunc("NetUserPass(a:0<".a:0.">)")
+""  call Dfunc("NetUserPass(a:0<".a:0.">)")
   if !exists("g:netrw_uid") || g:netrw_uid == ""
    " via prompt
    let g:netrw_uid= input('Enter username: ')
   endif
  else	" from command line
-"  call Dfunc("NetUserPass(a:1<".a:1.">) {")
+""  call Dfunc("NetUserPass(a:1<".a:1.">) {")
   let g:netrw_uid= a:1
  endif
 
  " get password
  if a:0 <= 1 " via prompt
-"  call Decho("a:0=".a:0." case <=1:")
+""  call Decho("a:0=".a:0." case <=1:")
   let g:netrw_passwd= inputsecret("Enter Password: ")
  else " from command line
-"  call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
+""  call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
   let g:netrw_passwd=a:2
  endif
-"  call Dret("NetUserPass")
+""  call Dret("NetUserPass")
 endfun
 " end NetUserPass
 
 " ------------------------------------------------------------------------
 " NetOptionSave: save options and set to "standard" form {{{1
 fun!s:NetOptionSave()
-" call Dfunc("NetOptionSave()")
+"" call Dfunc("NetOptionSave()")
 
  " Get Temporary Filename
  let s:aikeep	= &ai
@@ -1100,16 +1266,16 @@
  if has("win32") && !has("win95")
   let s:swfkeep= &swf
   set noswf
-"  call Decho("setting s:swfkeep to <".&swf.">")
+""  call Decho("setting s:swfkeep to <".&swf.">")
  endif
 
-" call Dret("NetOptionSave")
+"" call Dret("NetOptionSave")
 endfun
 
 " ------------------------------------------------------------------------
 " NetOptionRestore: restore options {{{1
 fun! s:NetOptionRestore()
-" call Dfunc("NetOptionRestore()")
+"" call Dfunc("NetOptionRestore()")
 
  let &ai	= s:aikeep
  let &cin	= s:cinkeep
@@ -1132,27 +1298,55 @@
  unlet s:twkeep
  unlet s:dirkeep
 
-" call Dret("NetOptionRestore")
+"" call Dret("NetOptionRestore")
 endfun
 
 " ------------------------------------------------------------------------
 " NetReadFixup: this sort of function is typically written by the user {{{1
-"		to handle extra junk that their system's ftp dumps
-"		into the transfer.  This function is provided as an
-"		example and as a fix for a Windows 95 problem: in my
-"		experience, win95's ftp always dumped four blank lines
-"		at the end of the transfer.
+"               to handle extra junk that their system's ftp dumps
+"               into the transfer.  This function is provided as an
+"               example and as a fix for a Windows 95 problem: in my
+"               experience, win95's ftp always dumped four blank lines
+"               at the end of the transfer.
 if has("win95") && g:netrw_win95ftp
  fun! NetReadFixup(method, line1, line2)
-"   call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
+""   call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
    if method == 3   " ftp (no <.netrc>)
     let fourblanklines= line2 - 3
     silent fourblanklines.",".line2."g/^\s*/d"
    endif
-"   call Dret("NetReadFixup")
+""   call Dret("NetReadFixup")
  endfun
 endif
 
+" ---------------------------------------------------------------------
+" NetSort: Piet Delport's BISort2() function, modified to take a range
+fun! <SID>NetSort() range
+  let i = a:firstline + 1
+  while i <= a:lastline
+    " find insertion point via binary search
+    let i_val = getline(i)
+    let lo    = a:firstline
+    let hi    = i
+    while lo < hi
+      let mid     = (lo + hi) / 2
+      let mid_val = getline(mid)
+      if i_val < mid_val
+        let hi = mid
+      else
+        let lo = mid + 1
+        if i_val == mid_val | break | endif
+      endif
+    endwhile
+    " do insert
+    if lo < i
+      exec i.'d_'
+      call append(lo - 1, i_val)
+    endif
+    let i = i + 1
+  endwhile
+endfun
+
 " ------------------------------------------------------------------------
 " Restore {{{1
 let &cpo= s:save_cpo