updated for version 7.0158
diff --git a/runtime/autoload/tar.vim b/runtime/autoload/tar.vim
index 0234059..66d2eb5 100644
--- a/runtime/autoload/tar.vim
+++ b/runtime/autoload/tar.vim
@@ -1,79 +1,172 @@
+" tar.vim: Handles browsing tarfiles
+"            AUTOLOAD PORTION
+" Date:			Nov 18, 2005
+" Version:		4
+" Maintainer:	Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
+" License:		Vim License  (see vim's :help license)
 "
-" tar.vim -- a Vim plugin for browsing tarfiles
-" Copyright (c) 2002, Michael C. Toren <mct@toren.net>
-" Distributed under the GNU General Public License.
+"	Contains many ideas from Michael Toren's <tar.vim>
 "
-" Version:	2
-" Date:		Sep 14, 2005
-" Modified By:	Charles E. Campbell, Jr.
-"
-" Updates are available from <http://michael.toren.net/code/>.  If you
-" find this script useful, or have suggestions for improvements, please
-" let me know.
-" Also look there for further comments and documentation.
-"
-" This part defines the functions.  The autocommands are in plugin/tar.vim.
-if exists("g:loaded_tar") || &cp
- finish
-endif
-let g:loaded_tar= "v2"
+" Copyright:    Copyright (C) 2005 Charles E. Campbell, Jr. {{{1
+"               Permission is hereby granted to use and distribute this code,
+"               with or without modifications, provided that this copyright
+"               notice is copied with it. Like anything else that's free,
+"               tarPlugin.vim is provided *as is* and comes with no warranty
+"               of any kind, either expressed or implied. By using this
+"               plugin, you agree that in no event will the copyright
+"               holder be liable for any damages resulting from the use
+"               of this software.
 
 " ---------------------------------------------------------------------
-"  tar#Read: {{{1
-fun! tar#Read(argument, cleanup)
-"    call Dfunc("tar#Read(argument<".a:argument."> cleanup=".a:cleanup.")")
-    let l:argument = a:argument
-    let l:argument = substitute(l:argument, '^tarfile:', '', '')
-    let l:argument = substitute(l:argument, '^\~', $HOME, '')
+" Initialization: {{{1
+let s:keepcpo= &cpo
+set cpo&vim
+if exists("g:loaded_tar")
+ finish
+endif
+let g:loaded_tar= "v4"
 
-    let l:tarfile = l:argument
-    while 1
-	if (l:tarfile == "" || l:tarfile == "/")
-	    echo "***error*** (tar#Read) Could not find a readable tarfile in path:" l:argument
-"            call Dret("tar#Read")
-	    return
-	endif
+" ---------------------------------------------------------------------
+"  Default Settings: {{{1
+if !exists("g:tar_browseoptions")
+ let g:tar_browseoptions= "Ptf"
+endif
+if !exists("g:tar_readoptions")
+ let g:tar_readoptions= "OPxf"
+endif
+if !exists("g:tar_writeoptions")
+ let g:tar_writeoptions= "uf"
+endif
 
-	if filereadable(l:tarfile) " found it!
-	    break
-	endif
+" ----------------
+"  Functions: {{{1
+" ----------------
 
-	let l:tarfile = fnamemodify(l:tarfile, ":h")
-    endwhile
+" ---------------------------------------------------------------------
+" tar#Browse: {{{2
+fun! tar#Browse(tarfile)
+"  call Dfunc("tar#Browse(tarfile<".a:tarfile.">)")
 
-    let l:toextract = strpart(l:argument, strlen(l:tarfile) + 1)
+  " sanity checks
+  if !executable("tar")
+   echohl Error | echo '***error*** (tar#Browse) "tar" not available on your system'
+   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+"   call Dret("tar#Browse")
+   return
+  endif
+  if !filereadable(a:tarfile)
+   if a:tarfile !~# '^\a\+://'
+    " if its an url, don't complain, let url-handlers such as vim do its thing
+    echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None
+    call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+   endif
+"   call Dret("tar#Browse : file<".a:tarfile."> not readable")
+   return
+  endif
+  if &ma != 1
+   set ma
+  endif
+  let w:tarfile= a:tarfile
 
-    if (l:toextract == "")
-"        call Dret("tar#Read")
-	return
-    endif
+  setlocal noswapfile
+  setlocal buftype=nofile
+  setlocal bufhidden=hide
+  setlocal nobuflisted
+  setlocal nowrap
+  set ft=tar
 
-    let l:cat = s:TarCatCommand(l:tarfile)
-    execute "r !" . l:cat . " < '" . l:tarfile . "'"
-	\ " | tar OPxf - '" . l:toextract . "'"
+  " give header
+  exe "$put ='".'\"'." tar.vim version ".g:loaded_tar."'"
+  exe "$put ='".'\"'." Browsing tarfile ".a:tarfile."'"
+  exe "$put ='".'\"'." Select a file with cursor and press ENTER"."'"
+  0d
+  $
 
-    if (a:cleanup)
-	0d "blank line
-	execute "doautocmd BufReadPost " . expand("%")
-	setlocal nomod
-	silent preserve
-    endif
-"    call Dret("tar#Read")
+  if a:tarfile =~# '\.\(gz\|tgz\)$'
+   exe "silent r! gzip -d -c '".a:tarfile."'| tar -".g:tar_browseoptions." - "
+  elseif a:tarfile =~# '\.bz2$'
+   exe "silent r! bzip2 -d -c '".a:tarfile."'| tar -".g:tar_browseoptions." - "
+  else
+   exe "silent r! tar -".g:tar_browseoptions." '".a:tarfile."'"
+  endif
+  %g@/$@d
+
+  setlocal noma nomod ro
+  noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
+
+"  call Dret("tar#Browse : w:tarfile<".w:tarfile.">")
 endfun
 
 " ---------------------------------------------------------------------
-" tar#Write: {{{1
-fun! tar#Write(argument)
-"  call Dfunc("tar#Write(argument<".a:argument.">)")
-"
+" TarBrowseSelect: {{{2
+fun! s:TarBrowseSelect()
+"  call Dfunc("TarBrowseSelect() w:tarfile<".w:tarfile."> curfile<".expand("%").">")
+  let fname= getline(".")
+"  call Decho("fname<".fname.">")
+
+  " sanity check
+  if fname =~ '^"'
+"   call Dret("TarBrowseSelect")
+   return
+  endif
+
+  " about to make a new window, need to use w:tarfile
+  let tarfile= w:tarfile
+  let curfile= expand("%")
+
+  new
+  wincmd _
+  let s:tblfile_{winnr()}= curfile
+"  call Decho("exe e tarfile:".tarfile.':'.fname)
+  exe "e tarfile:".tarfile.':'.fname
+  filetype detect
+
+"  call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
+endfun
+
+" ---------------------------------------------------------------------
+" tar#Read: {{{2
+fun! tar#Read(fname,mode)
+"  call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")")
+  let tarfile = substitute(a:fname,'tarfile:\(.\{-}\):.*$','\1','')
+  let fname   = substitute(a:fname,'tarfile:.\{-}:\(.*\)$','\1','')
+"  call Decho("tarfile<".tarfile."> fname<".fname.">")
+
+  if tarfile =~# '\.\(gz\|tgz\)$'
+"   call Decho("exe silent r! gzip -d -c '".tarfile."'| tar -OPxf - '".fname."'")
+   exe "silent r! gzip -d -c '".tarfile."'| tar -".g:tar_readoptions." - '".fname."'"
+  elseif a:fname =~# '\.bz2$'
+"   call Decho("exe silent r! bzip2 -d -c '".tarfile."'| tar -".g:tar_readoptions." - '".fname."'")
+   exe "silent r! bzip2 -d -c '".tarfile."'| tar -".g:tar_readoptions." - '".fname."'"
+  else
+"   call Decho("exe silent r! tar -".g:tar_readoptions." '".tarfile."' '".fname."'")
+   exe "silent r! tar -".g:tar_readoptions." '".tarfile."' '".fname."'"
+  endif
+  let w:tarfile= a:fname
+  exe "file tarfile:".fname
+
+  " cleanup
+  0d
+  set nomod
+
+"  call Dret("tar#Read : w:tarfile<".w:tarfile.">")
+endfun
+
+" ---------------------------------------------------------------------
+" tar#Write: {{{2
+fun! tar#Write(fname)
+"  call Dfunc("tar#Write(fname<".a:fname.">) w:tarfile<".w:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
+
   " sanity checks
   if !executable("tar")
-   echo "***error*** (TarWrite) sorry, your system doesn't appear to have the tar pgm"
+   echohl Error | echo '***error*** (tar#Browse) "tar" not available on your system'
+   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
 "   call Dret("tar#Write")
    return
   endif
   if !exists("*mkdir")
-   echo "***error*** (TarWrite) sorry, mkdir() doesn't work on your system"
+   echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None
+   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
 "   call Dret("tar#Write")
    return
   endif
@@ -91,44 +184,104 @@
   try
    exe "cd ".escape(tmpdir,' \')
   catch /^Vim\%((\a\+)\)\=:E344/
-   echo "***error*** (TarWrite) cannot cd to temporary directory"
+   echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None
+   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
 "   call Dret("tar#Write")
    return
   endtry
 "  call Decho("current directory now: ".getcwd())
 
-  " place temporary files under .../_TARVIM_/
-  if isdirectory("_TARVIM_")
-   call s:Rmdir("_TARVIM_")
+  " place temporary files under .../_ZIPVIM_/
+  if isdirectory("_ZIPVIM_")
+   call s:Rmdir("_ZIPVIM_")
   endif
-  call mkdir("_TARVIM_")
-  cd _TARVIM_
+  call mkdir("_ZIPVIM_")
+  cd _ZIPVIM_
 "  call Decho("current directory now: ".getcwd())
 
-  let tarfile = curdir."/".substitute(a:argument,'tarfile:\([^/]\{-}\)/.*$','\1','')
-  let path    = substitute(a:argument,'^.\{-}/','','')
-  let dirpath = substitute(path,'/\=[^/]\+$','','')
-"  call Decho("path   <".path.">")
-"  call Decho("dirpath<".dirpath.">")
-  call mkdir(dirpath,"p")
-  exe "w! ".path
-  if executable("cygpath")
-   let path    = substitute(system("cygpath ".path),'\n','','e')
-   let tarfile = substitute(system("cygpath ".tarfile),'\n','','e')
+  let tarfile = substitute(w:tarfile,'tarfile:\(.\{-}\):.*$','\1','')
+  let fname   = substitute(w:tarfile,'tarfile:.\{-}:\(.*\)$','\1','')
+
+  " handle compressed archives
+  if tarfile =~# '\.gz'
+   call system("gzip -d ".tarfile)
+   let tarfile = substitute(tarfile,'\.gz','','e')
+   let compress= "gzip '".tarfile."'"
+  elseif tarfile =~# '\.tgz'
+   call system("gzip -d ".tarfile)
+   let tarfile = substitute(tarfile,'\.tgz','.tar','e')
+   let compress= "gzip '".tarfile."'"
+   let tgz     = 1
+  elseif tarfile =~# '\.bz2'
+   call system("bzip2 -d ".tarfile)
+   let tarfile = substitute(tarfile,'\.bz2','','e')
+   let compress= "bzip2 '".tarfile."'"
   endif
 
-"  call Decho("tar --delete -f ".tarfile." ".path)
-  call system("tar --delete -f ".tarfile." ".path)
   if v:shell_error != 0
-   echo "***error*** (TarWrite) sorry, your tar pgm doesn't support deletion of ".path
+   echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
+   call inputsave()|call input("Press <cr> to continue")|call inputrestore()
   else
-"   call Decho("tar -rf ".tarfile." ".path)
-   call system("tar -rf ".tarfile." ".path)
+
+"   call Decho("tarfile<".tarfile."> fname<".fname.">")
+ 
+   let dirpath = substitute(fname,'/[^/]\+$','','e')
+   if tarfile !~ '/'
+    let tarfile= curdir.'/'.tarfile
+   endif
+"   call Decho("tarfile<".tarfile."> fname<".fname.">")
+ 
+   call mkdir(dirpath,"p")
+   exe "w! ".fname
+   if executable("cygpath")
+    let dirpath = substitute(system("cygpath ".dirpath),'\n','','e')
+    let tarfile = substitute(system("cygpath ".tarfile),'\n','','e')
+   endif
+ 
+   " delete old file from tarfile
+"   call Decho("tar --delete -f '".tarfile."' '".fname."'")
+   call system("tar --delete -f '".tarfile."' '".fname."'")
+   if v:shell_error != 0
+    echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
+    call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+   else
+ 
+    " update tarfile with new file 
+"    call Decho("tar -".g:tar_writeoptions." '".tarfile."' '".fname."'")
+    call system("tar -".g:tar_writeoptions." '".tarfile."' '".fname."'")
+    if v:shell_error != 0
+     echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
+     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+    elseif exists("compress")
+"     call Decho("call system(".compress.")")
+     call system(compress)
+     if exists("tgz")
+"      call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
+      call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
+     endif
+    endif
+   endif
+
+   " support writing tarfiles across a network
+   if s:tblfile_{winnr()} =~ '^\a\+://'
+"    call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
+    let tblfile= s:tblfile_{winnr()}
+    1split|enew
+    let binkeep= &binary
+    let eikeep = &ei
+    set binary ei=all
+    exe "e! ".tarfile
+    call netrw#NetWrite(tblfile)
+    let &ei     = eikeep
+    let &binary = binkeep
+    q!
+    unlet s:tblfile_{winnr()}
+   endif
   endif
   
   " cleanup and restore current directory
   cd ..
-  call s:Rmdir("_TARVIM_")
+  call s:Rmdir("_ZIPVIM_")
   exe "cd ".escape(curdir,' \')
   setlocal nomod
 
@@ -136,91 +289,7 @@
 endfun
 
 " ---------------------------------------------------------------------
-"  tar#Browse: {{{1
-fun! tar#Browse(tarfile)
-"    call Dfunc("tar#Browse(tarfile<".a:tarfile.">)")
-    setlocal noswapfile
-    setlocal buftype=nofile
-    setlocal bufhidden=hide
-    setlocal filetype=
-    setlocal nobuflisted
-    setlocal buftype=nofile
-    setlocal wrap
-    setlocal syntax=tar
-
-    let l:tarfile = a:tarfile
-    let b:tarfile = l:tarfile
-    let l:cat = s:TarCatCommand(l:tarfile)
-
-    if ! filereadable(l:tarfile)
-	let l:tarfile = substitute(l:tarfile, '^tarfile:', '', '')
-    endif
-
-    if ! filereadable(l:tarfile)
-	echo "***error*** (tar#Browse) File not readable:" l:tarfile
-"        call Dret("tar#Browse")
-	return
-    endif
-
-    call s:Say("\" tar.vim version " . g:loaded_tar)
-    call s:Say("\" Browsing tarfile " . l:tarfile)
-    call s:Say("\" Hit ENTER to view a file in a new window")
-    call s:Say("")
-
-    silent execute "r!" . l:cat . "<'" . l:tarfile . "'| tar Ptf - "
-    0d "blank line
-    /^$/1
-
-    setlocal noma nomod ro
-
-    noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
-"    call Dret("tar#Browse")
-endfun
-
-" ---------------------------------------------------------------------
-"  TarBrowseSelect: {{{1
-fun! s:TarBrowseSelect()
-    let l:line = getline(".")
-
-    if (l:line =~ '^" ')
-	return
-    endif
-
-    if (l:line =~ '/$')
-	echo "Please specify a file, not a directory"
-	return
-    endif
-
-    let l:selection = "tarfile:" .  b:tarfile . "/" . l:line
-    new
-    wincmd _
-    execute "e " . l:selection
-endfun
-
-" ---------------------------------------------------------------------
-" TarCatCommand: kludge to deal with compressed archives {{{1
-fun! s:TarCatCommand(tarfile)
-"    call Dfunc("s:TarCatCommand(tarfile<".a:tarfile.">)")
-    if a:tarfile =~# '\.\(gz\|tgz\|Z\)$'
-	let l:cat = "gzip -d -c"
-    elseif a:tarfile =~# '\.bz2$'
-	let l:cat = "bzip2 -d -c"
-    else
-	let l:cat = "cat"
-    endif
-"    call Dret("s:TarCatCommand ".l:cat)
-    return l:cat
-endfun
-
-" ---------------------------------------------------------------------
-"  Say: {{{1
-fun! s:Say(string)
-    let @" = a:string
-    $ put
-endfun
-
-" ---------------------------------------------------------------------
-" Rmdir: {{{1
+" Rmdir: {{{2
 fun! s:Rmdir(fname)
 "  call Dfunc("Rmdir(fname<".a:fname.">)")
   if has("unix")
@@ -235,6 +304,8 @@
 "  call Dret("Rmdir")
 endfun
 
-" ---------------------------------------------------------------------
-"  Modelines: {{{1
-" vim:set ts=8 sts=4 sw=4 fdm=marker:
+" ------------------------------------------------------------------------
+" Modelines And Restoration: {{{1
+let &cpo= s:keepcpo
+unlet s:keepcpo
+" vim:ts=8 fdm=marker