updated for version 7.2c-000
diff --git a/runtime/autoload/netrw.vim b/runtime/autoload/netrw.vim
index 6221294..8bd597a 100644
--- a/runtime/autoload/netrw.vim
+++ b/runtime/autoload/netrw.vim
@@ -1,7 +1,7 @@
 " netrw.vim: Handles file transfer and remote directory listing across
 "            AUTOLOAD SECTION
-" Date:		Jul 12, 2008
-" Version:	127
+" Date:		Aug 01, 2008
+" Version:	131
 " Maintainer:	Charles E Campbell, Jr <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
 " GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
 " Copyright:    Copyright (C) 1999-2008 Charles E. Campbell, Jr. {{{1
@@ -27,7 +27,7 @@
  let s:WARNING = 1
  let s:ERROR   = 2
 endif
-let g:loaded_netrw = "v127"
+let g:loaded_netrw = "v131"
 
 " sanity checks
 if v:version < 700
@@ -76,7 +76,13 @@
   let g:netrw_ftp_cmd	= "ftp"
 endif
 if !exists("g:netrw_http_cmd")
- if executable("curl")
+ if executable("elinks")
+  let g:netrw_http_cmd = "elinks"
+  let g:netrw_http_xcmd= "-dump >"
+ elseif executable("links")
+  let g:netrw_http_cmd = "links"
+  let g:netrw_http_xcmd= "-dump >"
+ elseif executable("curl")
   let g:netrw_http_cmd	= "curl -o"
  elseif executable("wget")
   let g:netrw_http_cmd	= "wget -q -O"
@@ -359,6 +365,7 @@
 if !exists("g:netrw_tmpfile_escape")
  let g:netrw_tmpfile_escape= ' &;'
 endif
+let s:netrw_map_escape = "<|\n\r\\\<C-V>\""
 
 " BufEnter event ignored by decho when following variable is true
 "  Has a side effect that doau BufReadPost doesn't work, so
@@ -712,15 +719,16 @@
 "     call Decho("read via ftp+.netrc (method #2)")
      let netrw_fname= b:netrw_fname
      call s:SaveBufVars()|new|call s:RestoreBufVars()
+     let filtbuf= bufnr("%")
      setlocal ff=unix
-     exe "put ='".g:netrw_ftpmode."'"
-"     call Decho("filter input: ".getline('.'))
+     put =g:netrw_ftpmode
+"     call Decho("filter input: ".getline(line("$")))
      if exists("g:netrw_ftpextracmd")
-      exe "put ='".g:netrw_ftpextracmd."'"
-"      call Decho("filter input: ".getline('.'))
+      put =g:netrw_ftpextracmd
+"      call Decho("filter input: ".getline(line("$")))
      endif
-     exe "put ='".'get \"'.netrw_fname.'\" '.tmpfile."'"
-"     call Decho("filter input: ".getline('.'))
+     call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile)
+"     call Decho("filter input: ".getline(line("$")))
      if exists("g:netrw_port") && g:netrw_port != ""
 "      call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1))
       exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1)
@@ -746,6 +754,7 @@
 "    call Decho("read via ftp+mipf (method #3)")
     let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
     call s:SaveBufVars()|new|call s:RestoreBufVars()
+    let filtbuf= bufnr("%")
     setlocal ff=unix
     if exists("g:netrw_port") && g:netrw_port != ""
      put ='open '.g:netrw_machine.' '.g:netrw_port
@@ -770,7 +779,7 @@
 "     call Decho("filter input: ".getline('.'))
     endif
     if exists("g:netrw_ftpextracmd")
-     exe "put ='".g:netrw_ftpextracmd."'"
+     put =g:netrw_ftpextracmd
 "     call Decho("filter input: ".getline('.'))
     endif
     put ='get \"'.netrw_fname.'\" '.tmpfile
@@ -820,15 +829,20 @@
      return
     endif
 
-    if match(b:netrw_fname,"#") == -1
-     " using g:netrw_http_cmd (usually wget or curl)
+    if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd")
+     " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch)
 "     call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)")
-"     call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_fname,1))
-     exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)
+     if exists("g:netrw_http_xcmd")
+"      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))
+      exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1)
+     else
+"      call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1))
+      exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)
+     endif
      let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
 
     else
-     " wget/curl plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
+     " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
 "     call Decho(("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
      let netrw_html= substitute(b:netrw_fname,"#.*$","","")
      let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
@@ -1084,14 +1098,14 @@
     new
 "    call Decho("filter input window#".winnr())
     setlocal ff=unix
-    exe "put ='".g:netrw_ftpmode."'"
-"    call Decho("filter input: ".getline('.'))
+    put =g:netrw_ftpmode
+"    call Decho("filter input: ".getline('$'))
     if exists("g:netrw_ftpextracmd")
-     exe "put ='".g:netrw_ftpextracmd."'"
-"     call Decho("filter input: ".getline('.'))
+     put =g:netrw_ftpextracmd
+"     call Decho("filter input: ".getline("$"))
     endif
-    exe "put ='".'put \"'.tmpfile.'\" \"'.netrw_fname.'\"'."'"
-"    call Decho("filter input: ".getline('.'))
+    call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"')
+"    call Decho("filter input: ".getline("$"))
     if exists("g:netrw_port") && g:netrw_port != ""
 "     call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
      exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)
@@ -1276,10 +1290,11 @@
    let i= 1
    while i <= a:0
     call netrw#NetRead(3,a:{i})
-"    call Decho("s:netread_tmpfile<".s:netrw_tmpfile.">")
+"    call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">")
     if s:FileReadable(s:netrw_tmpfile)
-"     call Decho("exe so ".s:netrw_tmpfile)
-     exe "so ".s:netrw_tmpfile
+"     call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile))
+     exe "so ".fnameescape(s:netrw_tmpfile)
+"     call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")")
      call delete(s:netrw_tmpfile)
      unlet s:netrw_tmpfile
     else
@@ -1654,6 +1669,7 @@
 fun! s:BrowserMaps(islocal)
 "  call Dfunc("s:BrowserMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
   if a:islocal
+"   call Decho("make local maps")
    nnoremap <buffer> <silent> <cr>	:call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
    nnoremap <buffer> <silent> -		:exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr>
    nnoremap <buffer> <silent> a		:call <SID>NetrwHide(1)<cr>
@@ -1709,23 +1725,25 @@
    if s:didstarstar || !mapcheck("<s-up>","n")
     nnoremap <buffer> <silent> <s-up>	:Pexplore<cr>
    endif
+   let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
    if g:netrw_mousemaps == 1
     nnoremap <buffer> <silent> <leftmouse>   <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
     nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
     nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
-    exe 'nnoremap <buffer> <silent> <rightmouse>  <leftmouse>:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
-    exe 'vnoremap <buffer> <silent> <rightmouse>  <leftmouse>:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
+    exe 'nnoremap <buffer> <silent> <rightmouse>  <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
+    exe 'vnoremap <buffer> <silent> <rightmouse>  <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
    endif
-   exe 'nnoremap <buffer> <silent> <del>	:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
-   exe 'vnoremap <buffer> <silent> <del>	:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
-   exe 'nnoremap <buffer> <silent> D		:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
-   exe 'vnoremap <buffer> <silent> D		:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
-   exe 'nnoremap <buffer> <silent> R		:call <SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>'
-   exe 'vnoremap <buffer> <silent> R		:call <SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>'
+   exe 'nnoremap <buffer> <silent> <del>	:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
+   exe 'vnoremap <buffer> <silent> <del>	:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
+   exe 'nnoremap <buffer> <silent> D		:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
+   exe 'vnoremap <buffer> <silent> D		:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
+   exe 'nnoremap <buffer> <silent> R		:call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
+   exe 'vnoremap <buffer> <silent> R		:call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
    exe 'nnoremap <buffer> <silent> <Leader>m	:call <SID>NetrwMakeDir("")<cr>'
    nnoremap <buffer> <F1>		:he netrw-quickhelp<cr>
 
   else " remote
+"   call Decho("make remote maps")
    call s:RemotePathAnalysis(b:netrw_curdir)
    nnoremap <buffer> <silent> <cr>	:call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
    nnoremap <buffer> <silent> <c-l>	:call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
@@ -1774,21 +1792,25 @@
    if !hasmapto('<Plug>NetrwRefresh')
     nmap <buffer> <c-l> <Plug>NetrwRefresh
    endif
+
+   let mapsafepath     = escape(s:path, s:netrw_map_escape)
+   let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape)
+
    nnoremap <buffer> <silent> <Plug>NetrwRefresh		:call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
    if g:netrw_mousemaps == 1
     nnoremap <buffer> <silent> <leftmouse>   <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
     nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
     nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
-    exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
-    exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
+    exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
+    exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
    endif
-   exe 'nnoremap <buffer> <silent> <del>	:call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
-   exe 'vnoremap <buffer> <silent> <del>	:call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
-   exe 'nnoremap <buffer> <silent> d	:call <SID>NetrwMakeDir("'.s:user.s:machine.'")<cr>'
-   exe 'nnoremap <buffer> <silent> D	:call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
-   exe 'vnoremap <buffer> <silent> D	:call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
-   exe 'nnoremap <buffer> <silent> R	:call <SID>NetrwRemoteRename("'.s:user.s:machine.'","'.s:path.'")<cr>'
-   exe 'vnoremap <buffer> <silent> R	:call <SID>NetrwRemoteRename("'.s:user.s:machine.'","'.s:path.'")<cr>'
+   exe 'nnoremap <buffer> <silent> <del>	:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
+   exe 'vnoremap <buffer> <silent> <del>	:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
+   exe 'nnoremap <buffer> <silent> d	:call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
+   exe 'nnoremap <buffer> <silent> D	:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
+   exe 'vnoremap <buffer> <silent> D	:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
+   exe 'nnoremap <buffer> <silent> R	:call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
+   exe 'vnoremap <buffer> <silent> R	:call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
    nnoremap <buffer> <F1>			:he netrw-quickhelp<cr>
   endif
   call s:SetRexDir(a:islocal,b:netrw_curdir)
@@ -1842,7 +1864,7 @@
    " change to the bookmarked directory
 "   call Decho("(user: <B>) change to the bookmarked directory")
    if exists("g:NETRW_BOOKMARKDIR_{v:count}")
-    exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
+    exe "e ".fnameescape(g:NETRW_BOOKMARKDIR_{v:count})
    else
     echomsg "Sorry, bookmark#".v:count." doesn't exist!"
    endif
@@ -2340,8 +2362,8 @@
 "    let v:errmsg= "" " Decho
     let escdirname= fnameescape(dirname)
 "    call Decho("  errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
-"    call Decho('  exe silent! keepalt file '.fnameescape(escdirname))
-    exe 'silent! keepalt file '.fnameescape(escdirname)
+"    call Decho('  exe silent! keepalt file '.escdirname)
+    exe 'silent! keepalt file '.escdirname
 "    call Decho("  errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
    endif
 "   call Decho("  named enew buffer#".bufnr("%")."<".bufname("%").">")
@@ -3273,7 +3295,7 @@
      if starpat == 1
       " starpat=1: Explore *//pattern  (current directory only search for files containing pattern)
 "      call Decho("starpat=".starpat.": build *//pattern list")
-      exe "vimgrep /".pattern."/gj ".b:netrw_curdir."/*"
+      exe "vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
       let w:netrw_explore_list = map(getqflist(),'bufname(v:val.bufnr)')
       if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
 
@@ -3707,6 +3729,14 @@
 "                  of whatever may happen to be under the cursor at that
 "                  moment.  When the mouse and gui are available,
 "                  shift-leftmouse may also be used to mark files.
+"
+"  Creates two lists
+"    s:netrwmarkfilelist    -- holds complete paths to all marked files
+"    s:netrwmarkfilelist_#  -- holds list of marked files in current-buffer's directory (#==bufnr())
+"
+"  Creates a marked file match string
+"    s:netrwmarfilemtch_#   -- used with 2match to display marked files
+"
 fun! s:NetrwMarkFile(islocal,fname)
 "  call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
   let curbufnr= bufnr("%")
@@ -3826,7 +3856,7 @@
         let fname= shellescape(s:ComposePath(curdir,fname))
        endif
       else
-       let fname= shellescape(b:netrw_curdir.fname)
+       let fname= shellescape(b:netrw_curdir.fname,1)
       endif
       if executable(exe)
        if a:islocal
@@ -3886,7 +3916,7 @@
   if      a:islocal &&  s:netrwmftgt_islocal
    " Copy marked files, local directory to local directory
 "   call Decho("copy from local to local")
-   let args= join(map(copy(s:netrwmarkfilelist_{bufnr('%')}),"b:netrw_curdir.\"/\".shellescape(v:val)"))
+   let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)"))
 "   call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")")
    call system(s:WinPath(g:netrw_localcopycmd)." ".args." ".shellescape(s:netrwmftgt))
 
@@ -3914,7 +3944,7 @@
    if isdirectory(tmpdir)
     exe "keepjumps lcd ".fnameescape(tmpdir)
     call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
-    let localfiles= map(copy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
+    let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
     call s:NetrwUpload(localfiles,s:netrwmftgt)
     if getcwd() == tmpdir
      for fname in s:netrwmarkfilelist_{bufnr('%')}
@@ -3957,24 +3987,21 @@
 fun! s:NetrwMarkFileDiff(islocal)
 "  call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
   let curbufnr= bufnr("%")
-  if exists("s:netrwmarkfilelist_{curbufnr}")
 
+  if exists("s:netrwmarkfilelist_{curbufnr}")
    let cnt    = 0
    let curdir = b:netrw_curdir
    for fname in s:netrwmarkfilelist
     let cnt= cnt + 1
-    if !a:islocal
-     let fname= curdir.fname
-    endif
     if cnt == 1
-"     call Decho("diffthis: ".fname)
-     exe "e ".fname
+"     call Decho("diffthis: fname<".fname.">")
+     exe "e ".fnameescape(fname)
      diffthis
     elseif cnt == 2 || cnt == 3
      vsplit
      wincmd l
 "     call Decho("diffthis: ".fname)
-     exe "e ".fname
+     exe "e ".fnameescape(fname)
      diffthis
     else
      break
@@ -3982,6 +4009,7 @@
    endfor
    call s:NetrwUnmarkList(curbufnr,curdir)
   endif
+
 "  call Dret("s:NetrwMarkFileDiff")
 endfun
 
@@ -3995,17 +4023,7 @@
   let curbufnr = bufnr("%")
   if exists("s:netrwmarkfilelist_{curbufnr}")
    call s:SetRexDir(a:islocal,curdir)
-   if a:islocal && g:netrw_keepdir
-    " use complete paths if its local and keepdir enabled
-    let flist= ""
-    for fname in s:netrwmarkfilelist
-"     let flist= flist." ".s:ComposePath(curdir,fname)
-     let flist= flist." ".fname
-    endfor
-   else
-"    let flist= substitute(escape(join(s:netrwmarkfilelist_{curbufnr},"\t"),' '),"\t",' ','g')
-    let flist= substitute(escape(join(s:netrwmarkfilelist,"\t"),' '),"\t",' ','g')
-   endif
+   let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
    " unmark markedfile list
 "   call s:NetrwUnmarkList(curbufnr,curdir)
    call s:NetrwUnmarkAll()
@@ -4138,17 +4156,11 @@
 fun! s:NetrwMarkFileGrep(islocal)
 "  call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
   let svpos    = netrw#NetrwSavePosn()
-  let curdir   = b:netrw_curdir
   let curbufnr = bufnr("%")
 
   if exists("s:netrwmarkfilelist")
 "  call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
-   let netrwmarkfilelist= ""
-   for fname in s:netrwmarkfilelist
-"    call Decho("fname<".fname.">")
-    let fname             = escape(substitute(fname,"[\"']","","g")," ")
-    let netrwmarkfilelist = netrwmarkfilelist." ".fname
-   endfor
+   let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
    call s:NetrwUnmarkAll()
 
    " ask user for pattern
@@ -4295,7 +4307,7 @@
     1split
     " the autocmds will handle both local and remote files
 "    call Decho("exe silent e ".escape(fname,' '))
-    exe "silent e ".escape(fname,' ')
+    exe "silent e ".fnameescape(fname)
 "    call Decho("hardcopy")
     hardcopy
     q
@@ -4419,21 +4431,11 @@
 
   if exists("s:netrwmarkfilelist")
 "   call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
-   if a:islocal && g:netrw_keepdir
-    let netrwmarkfilelist= ""
-    for fname in s:netrwmarkfilelist
-"     let netrwmarkfilelist= netrwmarkfilelist." ".s:ComposePath(curdir,fname)
-     let netrwmarkfilelist= netrwmarkfilelist." ".fname
-    endfor
-   else
-    let netrwmarkfilelist= string(s:netrwmarkfilelist)
-    let netrwmarkfilelist= substitute(netrwmarkfilelist,'[[\],]','','g')
-   endif
+   let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")"))
    call s:NetrwUnmarkAll()
 
    if a:islocal
     if executable(g:netrw_ctags)
-     call map(netrwmarkfilelist,"shellescape(v:val)")
 "     call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
      call system(g:netrw_ctags." ".netrwmarkfilelist)
     else
@@ -4447,7 +4449,7 @@
     e tags
     let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
 "    call Decho("curdir<".curdir."> path<".path.">")
-    exe '%s/\t\(\S\+\)\t/\t'.escape(path,'/').'\1\t/e'
+    exe '%s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
     wq!
    endif
    2match none
@@ -4771,7 +4773,7 @@
      endfor
     else
      " transfer files with one command
-     let filelist= join(map(copy(fname),"shellescape(v:val)"))
+     let filelist= join(map(deepcopy(fname),"shellescape(v:val)"))
 "     call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
      call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
     endif
@@ -4801,7 +4803,7 @@
     else
      let path= ""
     endif
-    let filelist= join(map(copy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1))'))
+    let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)'))
 "    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1))
     exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)
 
@@ -4812,7 +4814,7 @@
      let tmpbufnr= bufnr("%")
      setlocal ff=unix
      if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
-      exe "put ='".g:netrw_ftpmode."'"
+      put =g:netrw_ftpmode
 "      call Decho("filter input: ".getline('$'))
      endif
 
@@ -4822,7 +4824,7 @@
      endif
 
      if exists("g:netrw_ftpextracmd")
-      exe "put ='".g:netrw_ftpextracmd."'"
+      put =g:netrw_ftpextracmd
 "      call Decho("filter input: ".getline('$'))
      endif
      for fname in fnamelist
@@ -4880,12 +4882,12 @@
     endif
 
     if exists("g:netrw_ftpextracmd")
-     exe "put ='".g:netrw_ftpextracmd."'"
+     put =g:netrw_ftpextracmd
 "     call Decho("filter input: ".getline('$'))
     endif
 
     if exists("g:netrw_ftpextracmd")
-     exe "put ='".g:netrw_ftpextracmd."'"
+     put =g:netrw_ftpextracmd
 "     call Decho("filter input: ".getline('$'))
     endif
     for fname in fnamelist
@@ -5053,15 +5055,13 @@
    " handle uploading a single file using NetWrite
 "   call Decho("handle uploading a single file via NetWrite")
    1split
-   let efname= escape(a:fname,g:netrw_fname_escape)
-"   call Decho("exe e ".efname)
-   exe "e ".efname
+"   call Decho("exe e ".fnameescape(a:fname))
+   exe "e ".fnameescape(a:fname)
 "   call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
    if a:tgt =~ '/$'
     let wfname= substitute(a:fname,'^.*/','','')
-    let wfname= escape(a:tgt.wfname,g:netrw_fname_escape)
 "    call Decho("exe w! ".fnameescape(wfname))
-    exe "w! ".fnameescape(wfname)
+    exe "w! ".fnameescape(a:tgt.wfname)
    else
 "    call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
     exe "w ".fnameescape(a:tgt)
@@ -5075,8 +5075,8 @@
    let curdir= getcwd()
    if a:tgt =~ '^scp:'
     exe "keepjumps silent lcd ".fnameescape(fromdir)
-    let filelist= copy(s:netrwmarkfilelist_{bufnr('%')})
-    let args    = join(map(filelist,"shellescape(v:val)"))
+    let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
+    let args    = join(map(filelist,"shellescape(v:val, 1)"))
     if exists("g:netrw_port") && g:netrw_port != ""
      let useport= " ".g:netrw_scpport." ".g:netrw_port
     else
@@ -5097,11 +5097,11 @@
      silent keepjumps new
 "     call Decho("filter input window#".winnr())
 
-     exe "put ='".g:netrw_ftpmode."'"
+     put =g:netrw_ftpmode
 "     call Decho("filter input: ".getline('$'))
 
      if exists("g:netrw_ftpextracmd")
-      exe "put ='".g:netrw_ftpextracmd."'"
+      put =g:netrw_ftpextracmd
 "      call Decho("filter input: ".getline('$'))
      endif
 
@@ -5166,7 +5166,7 @@
      endif
 
      if exists("g:netrw_ftpextracmd")
-      exe "put ='".g:netrw_ftpextracmd."'"
+      put =g:netrw_ftpextracmd
 "      call Decho("filter input: ".getline('$'))
      endif
 
@@ -5210,7 +5210,7 @@
   call s:NetrwSafeOptions()
   if has("quickfix")
    if !isdirectory(a:path)
-    exe (g:netrw_preview? "vert " : "")."pedit ".escape(a:path,g:netrw_fname_escape)
+    exe (g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
    elseif !exists("g:netrw_quiet")
     call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
    endif
@@ -6027,8 +6027,8 @@
    let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
 "   call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
    if g:netrw_scp_cmd =~ '^pscp'
-"    call Decho("1: exe silent r! ".listcmd.s:path)
-    exe "silent r! ".listcmd.s:path
+"    call Decho("1: exe silent r! ".shellescape(listcmd.s:path, 1))
+    exe "silent r! ".listcmd.shellescape(s:path, 1)
     " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
     g/^Listing directory/d
     g/^d[-rwx][-rwx][-rwx]/s+$+/+e
@@ -6286,7 +6286,7 @@
     put ='cd \"'.a:path.'\"'
    endif
    if exists("g:netrw_ftpextracmd")
-    exe "put ='".g:netrw_ftpextracmd."'"
+    put =g:netrw_ftpextracmd
 "    call Decho("filter input: ".getline('.'))
    endif
    call setline(line("$")+1,a:listcmd)
@@ -6320,7 +6320,7 @@
     put ='cd \"'.a:path.'\"'
    endif
    if exists("g:netrw_ftpextracmd")
-    exe "put ='".g:netrw_ftpextracmd."'"
+    put =g:netrw_ftpextracmd
 "    call Decho("filter input: ".getline('.'))
    endif
    call setline(line("$")+1,a:listcmd)
@@ -6669,7 +6669,7 @@
    if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
     " wipe out any non-displaying netrw buffer
 "    call Decho("wiping  buf#".ibuf,"<".bufname(ibuf).">")
-    exe "silent! bd ".ibuf
+    exe "silent! bd ".fnameescape(ibuf)
     call remove(s:netrw_browselist,ibl)
 "    call Decho("browselist=".string(s:netrw_browselist))
     continue
@@ -6860,7 +6860,7 @@
       let newname = substitute(oldname,subfrom,subto,'')
      endif
     endif
-    let ret= rename(oldname,newname)
+    call rename(oldname,newname)
    endfor
    2match none
    unlet s:netrwmarkfilelist_{bufnr("%")}
@@ -6891,7 +6891,7 @@
     let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
     call inputrestore()
 
-    let ret= rename(oldname,newname)
+    call rename(oldname,newname)
 "   call Decho("renaming <".oldname."> to <".newname.">")
 
     let ctr= ctr + 1
@@ -7570,22 +7570,24 @@
 "  call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
   " set up Rex and leftmouse-double-click
   if a:islocal
-   exe 'com! Rexplore call s:NetrwRexplore(1,"'.a:dirname.'")'
+   exe 'com! Rexplore call s:NetrwRexplore(1,"'.escape(a:dirname,'"\').'")'
    if g:netrw_retmap
     silent! unmap <2-leftmouse>
     if !hasmapto("<Plug>NetrwReturn")
      nmap <unique> <silent> <2-leftmouse>	<Plug>NetrwReturn
     endif
-    exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(1,"'.a:dirname.'")<cr>'
+    let dir = escape(a:dirname, s:netrw_map_escape)
+    exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(1,"'.dir.'")<cr>'
    endif
   else
-   exe 'com! Rexplore call s:NetrwRexplore(0,"'.a:dirname.'")'
+   exe 'com! Rexplore call s:NetrwRexplore(0,"'.escape(a:dirname,'"\').'")'
    if g:netrw_retmap
     silent! unmap <2-leftmouse>
     if !hasmapto("<Plug>NetrwReturn")
      nmap <unique> <silent> <2-leftmouse>	<Plug>NetrwReturn
     endif
-    exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(0,"'.a:dirname.'")<cr>'
+    let dir = escape(a:dirname, s:netrw_map_escape)
+    exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(0,"'.dir.'")<cr>'
    endif
   endif
 "  call Dret("s:SetRexDir")
diff --git a/runtime/autoload/tar.vim b/runtime/autoload/tar.vim
index b1529d6..fc168e8 100644
--- a/runtime/autoload/tar.vim
+++ b/runtime/autoload/tar.vim
@@ -1,7 +1,7 @@
 " tar.vim: Handles browsing tarfiles
 "            AUTOLOAD PORTION
-" Date:			Jul 12, 2008
-" Version:		19 + changes by Bram
+" Date:			Jul 30, 2008
+" Version:		20
 " Maintainer:	Charles E Campbell, Jr <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
 " License:		Vim License  (see vim's :help license)
 "
@@ -24,7 +24,7 @@
 if &cp || exists("g:loaded_tar") || v:version < 700
  finish
 endif
-let g:loaded_tar= "v19+b"
+let g:loaded_tar= "v20"
 "call Decho("loading autoload/tar.vim")
 if v:version < 701 || (v:version == 701 && !has("patch299"))
  echoerr "(autoload/tar.vim) need vim v7.1 with patchlevel 299"
diff --git a/runtime/autoload/vimball.vim b/runtime/autoload/vimball.vim
index d69c645..4f6292b 100644
--- a/runtime/autoload/vimball.vim
+++ b/runtime/autoload/vimball.vim
@@ -1,7 +1,7 @@
 " vimball.vim : construct a file containing both paths and files
 " Author:	Charles E. Campbell, Jr.
-" Date:		Jun 05, 2008
-" Version:	27
+" Date:		Jul 30, 2008
+" Version:	29
 " GetLatestVimScripts: 1502 1 :AutoInstall: vimball.vim
 " Copyright: (c) 2004-2008 by Charles E. Campbell, Jr.
 "            The VIM LICENSE applies to Vimball.vim, and Vimball.txt
@@ -15,7 +15,7 @@
  finish
 endif
 let s:keepcpo        = &cpo
-let g:loaded_vimball = "v27"
+let g:loaded_vimball = "v29"
 set cpo&vim
 "DechoTabOn
 
@@ -169,9 +169,8 @@
    call setline(lastline+1,0)
 
    " write the file from the tab
-   let svfilepath= s:Path(svfile,'')
-"   call Decho("exe $r ".fnameescape(svfilepath))
-   exe "$r ".fnameescape(svfilepath)
+"   call Decho("exe $r ".fnameescape(svfile))
+   exe "$r ".fnameescape(svfile)
 
    call setline(lastline+1,line("$") - lastline - 1)
 "   call Decho("lastline=".lastline." line$=".line("$"))
@@ -186,13 +185,11 @@
   call s:ChgDir(curdir)
   setlocal ff=unix
   if a:writelevel
-   let vbnamepath= s:Path(vbname,'')
-"   call Decho("exe w! ".fnameescape(vbnamepath))
-   exe "w! ".fnameescape(vbnamepath)
+"   call Decho("exe w! ".fnameescape(vbname))
+   exe "w! ".fnameescape(vbname)
   else
-   let vbnamepath= s:Path(vbname,'')
-"   call Decho("exe w ".fnameescape(vbnamepath))
-   exe "w ".fnameescape(vbnamepath)
+"   call Decho("exe w ".fnameescape(vbname))
+   exe "w ".fnameescape(vbname)
   endif
 "  call Decho("Vimball<".vbname."> created")
   echo "Vimball<".vbname."> created"
@@ -215,8 +212,8 @@
 fun! vimball#Vimball(really,...)
 "  call Dfunc("vimball#Vimball(really=".a:really.") a:0=".a:0)
 
-  if v:version < 701 || (v:version == 701 && !has("patch299"))
-   echoerr "This version of vimball requires vim 7.1 with patch 299"
+  if v:version < 701 || (v:version == 701 && !exists('*fnameescape'))
+   echoerr "your vim is missing the fnameescape() function"
 "   call Dret("vimball#Vimball : needs 7.1 with patch 299")
    return
   endif
@@ -338,7 +335,7 @@
 
    " write tab to file
    if a:really
-    let fnamepath= s:Path(home."/".fname,'')
+    let fnamepath= home."/".fname
 "    call Decho("exe w! ".fnameescape(fnamepath))
 	exe "silent w! ".fnameescape(fnamepath)
     echo "wrote ".fnamepath
@@ -364,9 +361,9 @@
   " set up help
 "  call Decho("about to set up help: didhelp<".didhelp.">")
   if didhelp != ""
-   let htpath= s:Path(home."/".didhelp,"")
+   let htpath= home."/".didhelp
 "   call Decho("exe helptags ".htpath)
-   exe "helptags ".htpath
+   exe "helptags ".fnameescape(htpath)
    echo "did helptags"
   endif
 
@@ -578,27 +575,6 @@
 endfun
 
 " ---------------------------------------------------------------------
-" s:Path: prepend and append quotes and do escaping {{{2
-fun! s:Path(cmd,quote)
-"  call Dfunc("Path(cmd<".a:cmd."> quote<".a:quote.">) vimball_path_escape<".g:vimball_path_escape.">")
-  if (has("win32") || has("win95") || has("win64") || has("win16"))
-"   let cmdpath= a:quote.substitute(a:cmd,'/','\\','g').a:quote
-   let cmdpath= a:quote.substitute(a:cmd,'\\','/','g').a:quote
-"   call Decho("cmdpath<".cmdpath."> (win32 mod)")
-  else
-   let cmdpath= a:quote.a:cmd.a:quote
-"   call Decho("cmdpath<".cmdpath."> (not-win32 mod)")
-  endif
-  if a:quote == "" && g:vimball_path_escape !~ ' '
-   let cmdpath= escape(cmdpath,' ')
-"   call Decho("cmdpath<".cmdpath."> (empty quote case)")
-  endif
-  let cmdpath= escape(cmdpath,g:vimball_path_escape)
-"  call Dret("Path <".cmdpath.">")
-  return cmdpath
-endfun
-
-" ---------------------------------------------------------------------
 " s:RecordInVar: record a un-vimball command in the .VimballRecord file {{{2
 fun! s:RecordInVar(home,cmd)
 "  call Dfunc("RecordInVar(home<".a:home."> cmd<".a:cmd.">)")
@@ -719,14 +695,14 @@
    let s:acdkeep = &acd
   endif
   let s:eikeep  = &ei
-  let s:fenkeep = &fen
+  let s:fenkeep = &l:fen
   let s:hidkeep = &hidden
   let s:ickeep  = &ic
   let s:lzkeep  = &lz
   let s:pmkeep  = &pm
   let s:repkeep = &report
   let s:vekeep  = &ve
-  let s:ffkeep  = &ff
+  let s:ffkeep  = &l:ff
   if exists("&acd")
    setlocal ei=all ve=all noacd nofen noic report=999 nohid bt= ma lz pm= ff=unix
   else
@@ -745,7 +721,7 @@
   if exists("&acd")
    let &acd   = s:acdkeep
   endif
-  let &fen    = s:fenkeep
+  let &l:fen  = s:fenkeep
   let &hidden = s:hidkeep
   let &ic     = s:ickeep
   let &lz     = s:lzkeep
@@ -753,7 +729,7 @@
   let &report = s:repkeep
   let &ve     = s:vekeep
   let &ei     = s:eikeep
-  let &ff     = s:ffkeep
+  let &l:ff   = s:ffkeep
   if s:makeep[0] != 0
    " restore mark a
 "   call Decho("restore mark-a: makeep=".string(makeep))
diff --git a/runtime/autoload/zip.vim b/runtime/autoload/zip.vim
index b35a411..af56944 100644
--- a/runtime/autoload/zip.vim
+++ b/runtime/autoload/zip.vim
@@ -1,7 +1,7 @@
 " zip.vim: Handles browsing zipfiles
 "            AUTOLOAD PORTION
-" Date:		Jul 12, 2008
-" Version:	21 (modified by Bram)
+" Date:		Jul 30, 2008
+" Version:	22
 " Maintainer:	Charles E Campbell, Jr <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
 " License:	Vim License  (see vim's :help license)
 " Copyright:    Copyright (C) 2005-2008 Charles E. Campbell, Jr. {{{1
@@ -22,7 +22,7 @@
  finish
 endif
 
-let g:loaded_zip     = "v21+b"
+let g:loaded_zip     = "v22"
 let s:zipfile_escape = ' ?&;\'
 let s:ERROR          = 2
 let s:WARNING        = 1
@@ -58,6 +58,12 @@
   set report=10
 
   " sanity checks
+  if !exists("*fnameescape")
+   if &verbose > 1
+    echoerr "the zip plugin is not available (your vim doens't support fnameescape())"
+   endif
+   return
+  endif
   if !executable(g:zip_unzipcmd)
    redraw!
    echohl Error | echo "***error*** (zip#Browse) unzip not available on your system"
@@ -99,8 +105,8 @@
   0d
   $
 
-"  call Decho("exe silent r! ".g:zip_unzipcmd." -l ".s:Escape(a:zipfile,1))
-  exe "silent r! ".g:zip_unzipcmd." -l ".s:Escape(a:zipfile,1)
+"  call Decho("exe silent r! ".g:zip_unzipcmd." -l -- ".s:Escape(a:zipfile,1))
+  exe "silent r! ".g:zip_unzipcmd." -l -- ".s:Escape(a:zipfile,1)
   if v:shell_error != 0
    redraw!
    echohl WarningMsg | echo "***warning*** (zip#Browse) ".fnameescape(a:zipfile)." is not a zip file" | echohl None
@@ -193,8 +199,8 @@
 "  call Decho("zipfile<".zipfile.">")
 "  call Decho("fname  <".fname.">")
 
-"  call Decho("exe r! ".g:zip_unzipcmd." -p ".s:Escape(zipfile,1)." ".s:Escape(fname,1))
-  exe "silent r! ".g:zip_unzipcmd." -p ".s:Escape(zipfile,1)." ".s:Escape(fname,1)
+"  call Decho("exe r! ".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fname,1))
+  exe "silent r! ".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fname,1)
 
   " cleanup
   0d
@@ -286,8 +292,8 @@
     let fname = substitute(fname, '[', '[[]', 'g')
   endif
 
-"  call Decho(g:zip_zipcmd." -u ".s:Escape(zipfile,0)." ".s:Escape(fname,0))
-  call system(g:zip_zipcmd." -u ".s:Escape(zipfile,0)." ".s:Escape(fname,0))
+"  call Decho(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0))
+  call system(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0))
   if v:shell_error != 0
    redraw!
    echohl Error | echo "***error*** (zip#Write) sorry, unable to update ".zipfile." with ".fname | echohl None
@@ -342,9 +348,8 @@
 fun! s:ChgDir(newdir,errlvl,errmsg)
 "  call Dfunc("ChgDir(newdir<".a:newdir."> errlvl=".a:errlvl."  errmsg<".a:errmsg.">)")
 
-
   try
-   exe "cd ".fnameescape(newdir)
+   exe "cd ".fnameescape(a:newdir)
   catch /^Vim\%((\a\+)\)\=:E344/
    redraw!
    if a:errlvl == s:NOTE