home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / runtime / dos / autoload / tar.vim < prev    next >
Encoding:
Text File  |  2012-05-31  |  21.3 KB  |  600 lines

  1. " tar.vim: Handles browsing tarfiles
  2. "            AUTOLOAD PORTION
  3. " Date:            Jan 17, 2012
  4. " Version:        28
  5. " Maintainer:    Charles E Campbell, Jr <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
  6. " License:        Vim License  (see vim's :help license)
  7. "
  8. "    Contains many ideas from Michael Toren's <tar.vim>
  9. "
  10. " Copyright:    Copyright (C) 2005-2011 Charles E. Campbell, Jr. {{{1
  11. "               Permission is hereby granted to use and distribute this code,
  12. "               with or without modifications, provided that this copyright
  13. "               notice is copied with it. Like anything else that's free,
  14. "               tar.vim and tarPlugin.vim are provided *as is* and comes
  15. "               with no warranty of any kind, either expressed or implied.
  16. "               By using this plugin, you agree that in no event will the
  17. "               copyright holder be liable for any damages resulting from
  18. "               the use of this software.
  19. "     call inputsave()|call input("Press <cr> to continue")|call inputrestore()
  20. " ---------------------------------------------------------------------
  21. " Load Once: {{{1
  22. if &cp || exists("g:loaded_tar")
  23.  finish
  24. endif
  25. let g:loaded_tar= "v28"
  26. if v:version < 702
  27.  echohl WarningMsg
  28.  echo "***warning*** this version of tar needs vim 7.2"
  29.  echohl Normal
  30.  finish
  31. endif
  32. let s:keepcpo= &cpo
  33. set cpo&vim
  34. "call Decho("loading autoload/tar.vim")
  35.  
  36. " ---------------------------------------------------------------------
  37. "  Default Settings: {{{1
  38. if !exists("g:tar_browseoptions")
  39.  let g:tar_browseoptions= "Ptf"
  40. endif
  41. if !exists("g:tar_readoptions")
  42.  let g:tar_readoptions= "OPxf"
  43. endif
  44. if !exists("g:tar_cmd")
  45.  let g:tar_cmd= "tar"
  46. endif
  47. if !exists("g:tar_writeoptions")
  48.  let g:tar_writeoptions= "uf"
  49. endif
  50. if !exists("g:netrw_cygwin")
  51.  if has("win32") || has("win95") || has("win64") || has("win16")
  52.   if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
  53.    let g:netrw_cygwin= 1
  54.   else
  55.    let g:netrw_cygwin= 0
  56.   endif
  57.  else
  58.   let g:netrw_cygwin= 0
  59.  endif
  60. endif
  61. if !exists("g:tar_copycmd")
  62.  if !exists("g:netrw_localcopycmd")
  63.   if has("win32") || has("win95") || has("win64") || has("win16")
  64.    if g:netrw_cygwin
  65.     let g:netrw_localcopycmd= "cp"
  66.    else
  67.     let g:netrw_localcopycmd= "copy"
  68.    endif
  69.   elseif has("unix") || has("macunix")
  70.    let g:netrw_localcopycmd= "cp"
  71.   else
  72.    let g:netrw_localcopycmd= ""
  73.   endif
  74.  endif
  75.  let g:tar_copycmd= g:netrw_localcopycmd
  76. endif
  77. if !exists("g:tar_extractcmd")
  78.  let g:tar_extractcmd= "tar -xf"
  79. endif
  80.  
  81. " set up shell quoting character
  82. if !exists("g:tar_shq")
  83.  if exists("&shq") && &shq != ""
  84.   let g:tar_shq= &shq
  85.  elseif has("win32") || has("win95") || has("win64") || has("win16")
  86.   if exists("g:netrw_cygwin") && g:netrw_cygwin
  87.    let g:tar_shq= "'"
  88.   else
  89.    let g:tar_shq= '"'
  90.   endif
  91.  else
  92.   let g:tar_shq= "'"
  93.  endif
  94. " call Decho("g:tar_shq<".g:tar_shq.">")
  95. endif
  96.  
  97. " ----------------
  98. "  Functions: {{{1
  99. " ----------------
  100.  
  101. " ---------------------------------------------------------------------
  102. " tar#Browse: {{{2
  103. fun! tar#Browse(tarfile)
  104. "  call Dfunc("tar#Browse(tarfile<".a:tarfile.">)")
  105.   let repkeep= &report
  106.   set report=10
  107.  
  108.   " sanity checks
  109.   if !executable(g:tar_cmd)
  110.    redraw!
  111.    echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
  112.    let &report= repkeep
  113. "   call Dret("tar#Browse")
  114.    return
  115.   endif
  116.   if !filereadable(a:tarfile)
  117. "   call Decho('a:tarfile<'.a:tarfile.'> not filereadable')
  118.    if a:tarfile !~# '^\a\+://'
  119.     " if its an url, don't complain, let url-handlers such as vim do its thing
  120.     redraw!
  121.     echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None
  122.    endif
  123.    let &report= repkeep
  124. "   call Dret("tar#Browse : file<".a:tarfile."> not readable")
  125.    return
  126.   endif
  127.   if &ma != 1
  128.    set ma
  129.   endif
  130.   let b:tarfile= a:tarfile
  131.  
  132.   setlocal noswapfile
  133.   setlocal buftype=nofile
  134.   setlocal bufhidden=hide
  135.   setlocal nobuflisted
  136.   setlocal nowrap
  137.   set ft=tar
  138.  
  139.   " give header
  140. "  call Decho("printing header")
  141.   let lastline= line("$")
  142.   call setline(lastline+1,'" tar.vim version '.g:loaded_tar)
  143.   call setline(lastline+2,'" Browsing tarfile '.a:tarfile)
  144.   call setline(lastline+3,'" Select a file with cursor and press ENTER')
  145.   keepj $put =''
  146.   keepj sil! 0d
  147.   keepj $
  148.  
  149.   let tarfile= a:tarfile
  150.   if has("win32") && executable("cygpath")
  151.    " assuming cygwin
  152.    let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
  153.   endif
  154.   let curlast= line("$")
  155.   if tarfile =~# '\.\(gz\|tgz\)$'
  156. "   call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
  157.    exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
  158.   elseif tarfile =~# '\.lrp'
  159. "   call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ")
  160.    exe "sil! r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - "
  161.   elseif tarfile =~# '\.\(bz2\|tbz\|tb2\)$'
  162. "   call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
  163.    exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
  164.   elseif tarfile =~# '\.\(lzma\|tlz\)$'
  165. "   call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
  166.    exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
  167.   elseif tarfile =~# '\.\(xz\|txz\)$'
  168. "   call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
  169.    exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
  170.   else
  171.    if tarfile =~ '^\s*-'
  172.     " A file name starting with a dash is taken as an option.  Prepend ./ to avoid that.
  173.     let tarfile = substitute(tarfile, '-', './-', '')
  174.    endif
  175. "   call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0))
  176.    exe "sil! r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1)
  177.   endif
  178.   if v:shell_error != 0
  179.    redraw!
  180.    echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">"
  181. "   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
  182.    return
  183.   endif
  184.   if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)')
  185.    redraw!
  186.    echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None
  187.    keepj sil! %d
  188.    let eikeep= &ei
  189.    set ei=BufReadCmd,FileReadCmd
  190.    exe "r ".fnameescape(a:tarfile)
  191.    let &ei= eikeep
  192.    keepj sil! 1d
  193. "   call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
  194.    return
  195.   endif
  196.  
  197.   setlocal noma nomod ro
  198.   noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
  199.  
  200.   let &report= repkeep
  201. "  call Dret("tar#Browse : b:tarfile<".b:tarfile.">")
  202. endfun
  203.  
  204. " ---------------------------------------------------------------------
  205. " TarBrowseSelect: {{{2
  206. fun! s:TarBrowseSelect()
  207. "  call Dfunc("TarBrowseSelect() b:tarfile<".b:tarfile."> curfile<".expand("%").">")
  208.   let repkeep= &report
  209.   set report=10
  210.   let fname= getline(".")
  211. "  call Decho("fname<".fname.">")
  212.  
  213.   if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-'
  214.    redraw!
  215.    echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"'
  216. "   call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"')
  217.    return
  218.   endif
  219.  
  220.   " sanity check
  221.   if fname =~ '^"'
  222.    let &report= repkeep
  223. "   call Dret("TarBrowseSelect")
  224.    return
  225.   endif
  226.  
  227.   " about to make a new window, need to use b:tarfile
  228.   let tarfile= b:tarfile
  229.   let curfile= expand("%")
  230.   if has("win32") && executable("cygpath")
  231.    " assuming cygwin
  232.    let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
  233.   endif
  234.  
  235.   new
  236.   if !exists("g:tar_nomax") || g:tar_nomax == 0
  237.    wincmd _
  238.   endif
  239.   let s:tblfile_{winnr()}= curfile
  240.   call tar#Read("tarfile:".tarfile.'::'.fname,1)
  241.   filetype detect
  242.  
  243.   let &report= repkeep
  244. "  call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
  245. endfun
  246.  
  247. " ---------------------------------------------------------------------
  248. " tar#Read: {{{2
  249. fun! tar#Read(fname,mode)
  250. "  call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")")
  251.   let repkeep= &report
  252.   set report=10
  253.   let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','')
  254.   let fname   = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','')
  255.   if has("win32") && executable("cygpath")
  256.    " assuming cygwin
  257.    let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
  258.   endif
  259. "  call Decho("tarfile<".tarfile.">")
  260. "  call Decho("fname<".fname.">")
  261.  
  262.   if  fname =~ '\.bz2$' && executable("bzcat")
  263.    let decmp= "|bzcat"
  264.    let doro = 1
  265.   elseif      fname =~ '\.gz$'  && executable("zcat")
  266.    let decmp= "|zcat"
  267.    let doro = 1
  268.   elseif  fname =~ '\.lzma$' && executable("lzcat")
  269.    let decmp= "|lzcat"
  270.    let doro = 1
  271.   elseif  fname =~ '\.xz$' && executable("xzcat")
  272.    let decmp= "|xzcat"
  273.    let doro = 1
  274.   else
  275.    let decmp=""
  276.    let doro = 0
  277.    if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.xz$\|\.zip$\|\.Z$'
  278.     setlocal bin
  279.    endif
  280.   endif
  281.  
  282.   if exists("g:tar_secure")
  283.    let tar_secure= " -- "
  284.   else
  285.    let tar_secure= " "
  286.   endif
  287.   if tarfile =~# '\.bz2$'
  288. "   call Decho("7: exe silent r! bzip2 -d -c ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
  289.    exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
  290.   elseif tarfile =~# '\.\(gz\|tgz\)$'
  291. "   call Decho("5: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.tar_secure.shellescape(fname,1))
  292.    exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
  293.   elseif tarfile =~# '\.lrp$'
  294. "   call Decho("6: exe silent r! cat ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
  295.    exe "sil! r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
  296.   elseif tarfile =~# '\.lzma$'
  297. "   call Decho("7: exe silent r! lzma -d -c ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
  298.    exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
  299.   elseif tarfile =~# '\.\(xz\|txz\)$'
  300. "   call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp)
  301.    exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
  302.   else
  303.    if tarfile =~ '^\s*-'
  304.     " A file name starting with a dash is taken as an option.  Prepend ./ to avoid that.
  305.     let tarfile = substitute(tarfile, '-', './-', '')
  306.    endif
  307. "   call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions.tar_secure.shellescape(tarfile,1)." ".shellescape(fname,1).decmp)
  308.    exe "silent r! ".g:tar_cmd." -".g:tar_readoptions.shellescape(tarfile,1)." ".tar_secure.shellescape(fname,1).decmp
  309.   endif
  310.  
  311.   if doro
  312.    " because the reverse process of compressing changed files back into the tarball is not currently supported
  313.    setlocal ro
  314.   endif
  315.  
  316.   let b:tarfile= a:fname
  317.   exe "file tarfile::".fnameescape(fname)
  318.  
  319.   " cleanup
  320.   keepj sil! 0d
  321.   set nomod
  322.  
  323.   let &report= repkeep
  324. "  call Dret("tar#Read : b:tarfile<".b:tarfile.">")
  325. endfun
  326.  
  327. " ---------------------------------------------------------------------
  328. " tar#Write: {{{2
  329. fun! tar#Write(fname)
  330. "  call Dfunc("tar#Write(fname<".a:fname.">) b:tarfile<".b:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
  331.   let repkeep= &report
  332.   set report=10
  333.  
  334.   if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-'
  335.    redraw!
  336.    echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"'
  337. "   call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"')
  338.    return
  339.   endif
  340.  
  341.   " sanity checks
  342.   if !executable(g:tar_cmd)
  343.    redraw!
  344.    echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
  345.    let &report= repkeep
  346. "   call Dret("tar#Write")
  347.    return
  348.   endif
  349.   if !exists("*mkdir")
  350.    redraw!
  351.    echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None
  352.    let &report= repkeep
  353. "   call Dret("tar#Write")
  354.    return
  355.   endif
  356.  
  357.   let curdir= getcwd()
  358.   let tmpdir= tempname()
  359. "  call Decho("orig tempname<".tmpdir.">")
  360.   if tmpdir =~ '\.'
  361.    let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
  362.   endif
  363. "  call Decho("tmpdir<".tmpdir.">")
  364.   call mkdir(tmpdir,"p")
  365.  
  366.   " attempt to change to the indicated directory
  367.   try
  368.    exe "cd ".fnameescape(tmpdir)
  369.   catch /^Vim\%((\a\+)\)\=:E344/
  370.    redraw!
  371.    echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None
  372.    let &report= repkeep
  373. "   call Dret("tar#Write")
  374.    return
  375.   endtry
  376. "  call Decho("current directory now: ".getcwd())
  377.  
  378.   " place temporary files under .../_ZIPVIM_/
  379.   if isdirectory("_ZIPVIM_")
  380.    call s:Rmdir("_ZIPVIM_")
  381.   endif
  382.   call mkdir("_ZIPVIM_")
  383.   cd _ZIPVIM_
  384. "  call Decho("current directory now: ".getcwd())
  385.  
  386.   let tarfile = substitute(b:tarfile,'tarfile:\(.\{-}\)::.*$','\1','')
  387.   let fname   = substitute(b:tarfile,'tarfile:.\{-}::\(.*\)$','\1','')
  388.  
  389.   " handle compressed archives
  390.   if tarfile =~# '\.bz2'
  391.    call system("bzip2 -d -- ".shellescape(tarfile,0))
  392.    let tarfile = substitute(tarfile,'\.bz2','','e')
  393.    let compress= "bzip2 -- ".shellescape(tarfile,0)
  394. "   call Decho("compress<".compress.">")
  395.   elseif tarfile =~# '\.gz'
  396.    call system("gzip -d -- ".shellescape(tarfile,0))
  397.    let tarfile = substitute(tarfile,'\.gz','','e')
  398.    let compress= "gzip -- ".shellescape(tarfile,0)
  399. "   call Decho("compress<".compress.">")
  400.   elseif tarfile =~# '\.tgz'
  401.    call system("gzip -d -- ".shellescape(tarfile,0))
  402.    let tarfile = substitute(tarfile,'\.tgz','.tar','e')
  403.    let compress= "gzip -- ".shellescape(tarfile,0)
  404.    let tgz     = 1
  405. "   call Decho("compress<".compress.">")
  406.   elseif tarfile =~# '\.xz'
  407.    call system("xz -d -- ".shellescape(tarfile,0))
  408.    let tarfile = substitute(tarfile,'\.xz','','e')
  409.    let compress= "xz -- ".shellescape(tarfile,0)
  410. "   call Decho("compress<".compress.">")
  411.   elseif tarfile =~# '\.lzma'
  412.    call system("lzma -d -- ".shellescape(tarfile,0))
  413.    let tarfile = substitute(tarfile,'\.lzma','','e')
  414.    let compress= "lzma -- ".shellescape(tarfile,0)
  415. "   call Decho("compress<".compress.">")
  416.   endif
  417. "  call Decho("tarfile<".tarfile.">")
  418.  
  419.   if v:shell_error != 0
  420.    redraw!
  421.    echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
  422.   else
  423.  
  424. "   call Decho("tarfile<".tarfile."> fname<".fname.">")
  425.  
  426.    if fname =~ '/'
  427.     let dirpath = substitute(fname,'/[^/]\+$','','e')
  428.     if executable("cygpath")
  429.      let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e')
  430.     endif
  431.     call mkdir(dirpath,"p")
  432.    endif
  433.    if tarfile !~ '/'
  434.     let tarfile= curdir.'/'.tarfile
  435.    endif
  436.    if tarfile =~ '^\s*-'
  437.     " A file name starting with a dash may be taken as an option.  Prepend ./ to avoid that.
  438.     let tarfile = substitute(tarfile, '-', './-', '')
  439.    endif
  440. "   call Decho("tarfile<".tarfile."> fname<".fname.">")
  441.  
  442.    if exists("g:tar_secure")
  443.     let tar_secure= " -- "
  444.    else
  445.     let tar_secure= " "
  446.    endif
  447.    exe "w! ".fnameescape(fname)
  448.    if executable("cygpath")
  449.     let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e')
  450.    endif
  451.  
  452.    " delete old file from tarfile
  453. "   call Decho("system(".g:tar_cmd." --delete -f ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")")
  454.    call system(g:tar_cmd." --delete -f ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
  455.    if v:shell_error != 0
  456.     redraw!
  457.     echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
  458.    else
  459.  
  460.     " update tarfile with new file 
  461. "    call Decho(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
  462.     call system(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
  463.     if v:shell_error != 0
  464.      redraw!
  465.      echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
  466.     elseif exists("compress")
  467. "     call Decho("call system(".compress.")")
  468.      call system(compress)
  469.      if exists("tgz")
  470. "      call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
  471.       call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
  472.      endif
  473.     endif
  474.    endif
  475.  
  476.    " support writing tarfiles across a network
  477.    if s:tblfile_{winnr()} =~ '^\a\+://'
  478. "    call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
  479.     let tblfile= s:tblfile_{winnr()}
  480.     1split|enew
  481.     let binkeep= &l:binary
  482.     let eikeep = &ei
  483.     set binary ei=all
  484.     exe "e! ".fnameescape(tarfile)
  485.     call netrw#NetWrite(tblfile)
  486.     let &ei       = eikeep
  487.     let &l:binary = binkeep
  488.     q!
  489.     unlet s:tblfile_{winnr()}
  490.    endif
  491.   endif
  492.   
  493.   " cleanup and restore current directory
  494.   cd ..
  495.   call s:Rmdir("_ZIPVIM_")
  496.   exe "cd ".fnameescape(curdir)
  497.   setlocal nomod
  498.  
  499.   let &report= repkeep
  500. "  call Dret("tar#Write")
  501. endfun
  502.  
  503. " ---------------------------------------------------------------------
  504. " s:Rmdir: {{{2
  505. fun! s:Rmdir(fname)
  506. "  call Dfunc("Rmdir(fname<".a:fname.">)")
  507.   if has("unix")
  508.    call system("/bin/rm -rf -- ".shellescape(a:fname,0))
  509.   elseif has("win32") || has("win95") || has("win64") || has("win16")
  510.    if &shell =~? "sh$"
  511.     call system("/bin/rm -rf -- ".shellescape(a:fname,0))
  512.    else
  513.     call system("del /S ".shellescape(a:fname,0))
  514.    endif
  515.   endif
  516. "  call Dret("Rmdir")
  517. endfun
  518.  
  519. " ---------------------------------------------------------------------
  520. " tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2
  521. fun! tar#Vimuntar(...)
  522. "  call Dfunc("tar#Vimuntar() a:0=".a:0." a:1<".(exists("a:1")? a:1 : "-n/a-").">")
  523.   let tarball = expand("%")
  524. "  call Decho("tarball<".tarball.">")
  525.   let tarbase = substitute(tarball,'\..*$','','')
  526. "  call Decho("tarbase<".tarbase.">")
  527.   let tarhome = expand("%:p")
  528.   if has("win32") || has("win95") || has("win64") || has("win16")
  529.    let tarhome= substitute(tarhome,'\\','/','g')
  530.   endif
  531.   let tarhome= substitute(tarhome,'/[^/]*$','','')
  532. "  call Decho("tarhome<".tarhome.">")
  533.   let tartail = expand("%:t")
  534. "  call Decho("tartail<".tartail.">")
  535.   let curdir  = getcwd()
  536. "  call Decho("curdir <".curdir.">")
  537.   " set up vimhome
  538.   if a:0 > 0 && a:1 != ""
  539.    let vimhome= a:1
  540.   else
  541.    let vimhome= vimball#VimballHome()
  542.   endif
  543. "  call Decho("vimhome<".vimhome.">")
  544.  
  545. "  call Decho("curdir<".curdir."> vimhome<".vimhome.">")
  546.   if simplify(curdir) != simplify(vimhome)
  547.    " copy (possibly compressed) tarball to .vim/vimfiles
  548. "   call Decho(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
  549.    call system(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
  550. "   call Decho("exe cd ".fnameescape(vimhome))
  551.    exe "cd ".fnameescape(vimhome)
  552.   endif
  553. "  call Decho("getcwd<".getcwd().">")
  554.  
  555.   " if necessary, decompress the tarball; then, extract it
  556.   if tartail =~ '\.tgz'
  557.    if executable("gunzip")
  558.     silent exe "!gunzip ".shellescape(tartail)
  559.    elseif executable("gzip")
  560.     silent exe "!gzip -d ".shellescape(tartail)
  561.    else
  562.     echoerr "unable to decompress<".tartail."> on this sytem"
  563.     if simplify(curdir) != simplify(tarhome)
  564.      " remove decompressed tarball, restore directory
  565. "     call Decho("delete(".tartail.".tar)")
  566.      call delete(tartail.".tar")
  567. "     call Decho("exe cd ".fnameescape(curdir))
  568.      exe "cd ".fnameescape(curdir)
  569.     endif
  570. "    call Dret("tar#Vimuntar")
  571.     return
  572.    endif
  573.   else
  574.    call vimball#Decompress(tartail,0)
  575.   endif
  576.   let extractcmd= netrw#WinPath(g:tar_extractcmd)
  577. "  call Decho("system(".extractcmd." ".shellescape(tarbase.".tar").")")
  578.   call system(extractcmd." ".shellescape(tarbase.".tar"))
  579.  
  580.   " set up help
  581.   if filereadable("doc/".tarbase.".txt")
  582. "   call Decho("exe helptags ".getcwd()."/doc")
  583.    exe "helptags ".getcwd()."/doc"
  584.   endif
  585.  
  586.   if simplify(tarhome) != simplify(vimhome)
  587.    " remove decompressed tarball, restore directory
  588.    call delete(vimhome."/".tarbase.".tar")
  589.    exe "cd ".fnameescape(curdir)
  590.   endif
  591.  
  592. "  call Dret("tar#Vimuntar")
  593. endfun
  594.  
  595. " =====================================================================
  596. " Modelines And Restoration: {{{1
  597. let &cpo= s:keepcpo
  598. unlet s:keepcpo
  599. " vim:ts=8 fdm=marker
  600.