1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles 2a5792f58SBram Moolenaar" AUTOLOAD PORTION 3*8c8de839SBram Moolenaar" Date: Jun 12, 2008 4*8c8de839SBram Moolenaar" Version: 16 5c81e5e79SBram Moolenaar" Maintainer: Charles E Campbell, Jr <[email protected]> 6a5792f58SBram Moolenaar" License: Vim License (see vim's :help license) 787e25fdfSBram Moolenaar" 8a5792f58SBram Moolenaar" Contains many ideas from Michael Toren's <tar.vim> 987e25fdfSBram Moolenaar" 10*8c8de839SBram Moolenaar" Copyright: Copyright (C) 2005-2008 Charles E. Campbell, Jr. {{{1 11a5792f58SBram Moolenaar" Permission is hereby granted to use and distribute this code, 12a5792f58SBram Moolenaar" with or without modifications, provided that this copyright 13a5792f58SBram Moolenaar" notice is copied with it. Like anything else that's free, 14*8c8de839SBram Moolenaar" tar.vim and tarPlugin.vim are provided *as is* and comes 15*8c8de839SBram Moolenaar" with no warranty of any kind, either expressed or implied. 16*8c8de839SBram Moolenaar" By using this plugin, you agree that in no event will the 17*8c8de839SBram Moolenaar" copyright holder be liable for any damages resulting from 18*8c8de839SBram Moolenaar" the use of this software. 1987e25fdfSBram Moolenaar 20ab194816SBram Moolenaar" --------------------------------------------------------------------- 21c81e5e79SBram Moolenaar" Load Once: {{{1 22a5792f58SBram Moolenaarlet s:keepcpo= &cpo 23a5792f58SBram Moolenaarset cpo&vim 24c81e5e79SBram Moolenaarif &cp || exists("g:loaded_tar") || v:version < 700 25a5792f58SBram Moolenaar finish 26a5792f58SBram Moolenaarendif 27*8c8de839SBram Moolenaarlet g:loaded_tar= "v16" 28910f66f9SBram Moolenaar"call Decho("loading autoload/tar.vim") 29*8c8de839SBram Moolenaarif v:version < 701 || (v:version == 701 && !has("patch299")) 30*8c8de839SBram Moolenaar echoerr "(autoload/tar.vim) need vim v7.1 with patchlevel 299" 31*8c8de839SBram Moolenaarendif 3287e25fdfSBram Moolenaar 33a5792f58SBram Moolenaar" --------------------------------------------------------------------- 34a5792f58SBram Moolenaar" Default Settings: {{{1 35a5792f58SBram Moolenaarif !exists("g:tar_browseoptions") 36a5792f58SBram Moolenaar let g:tar_browseoptions= "Ptf" 37a5792f58SBram Moolenaarendif 38a5792f58SBram Moolenaarif !exists("g:tar_readoptions") 39a5792f58SBram Moolenaar let g:tar_readoptions= "OPxf" 40a5792f58SBram Moolenaarendif 41910f66f9SBram Moolenaarif !exists("g:tar_cmd") 42910f66f9SBram Moolenaar let g:tar_cmd= "tar" 43910f66f9SBram Moolenaarendif 44a5792f58SBram Moolenaarif !exists("g:tar_writeoptions") 45a5792f58SBram Moolenaar let g:tar_writeoptions= "uf" 46a5792f58SBram Moolenaarendif 47*8c8de839SBram Moolenaar 48*8c8de839SBram Moolenaarif !exists("g:netrw_cygwin") 49*8c8de839SBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 50*8c8de839SBram Moolenaar if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$' 51*8c8de839SBram Moolenaar let g:netrw_cygwin= 1 52*8c8de839SBram Moolenaar else 53*8c8de839SBram Moolenaar let g:netrw_cygwin= 0 54*8c8de839SBram Moolenaar endif 55*8c8de839SBram Moolenaar else 56*8c8de839SBram Moolenaar let g:netrw_cygwin= 0 57*8c8de839SBram Moolenaar endif 58*8c8de839SBram Moolenaarendif 59*8c8de839SBram Moolenaar 60*8c8de839SBram Moolenaar" set up shell quoting character 61c81e5e79SBram Moolenaarif !exists("g:tar_shq") 62*8c8de839SBram Moolenaar if exists("&shq") && &shq != "" 63*8c8de839SBram Moolenaar let g:tar_shq= &shq 64*8c8de839SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16") 65*8c8de839SBram Moolenaar if exists("g:netrw_cygwin") && g:netrw_cygwin 66c81e5e79SBram Moolenaar let g:tar_shq= "'" 67c81e5e79SBram Moolenaar else 68c81e5e79SBram Moolenaar let g:tar_shq= '"' 69c81e5e79SBram Moolenaar endif 70*8c8de839SBram Moolenaar else 71*8c8de839SBram Moolenaar let g:tar_shq= "'" 72*8c8de839SBram Moolenaar endif 73*8c8de839SBram Moolenaar" call Decho("g:tar_shq<".g:tar_shq.">") 74c81e5e79SBram Moolenaarendif 75a5792f58SBram Moolenaar 76a5792f58SBram Moolenaar" ---------------- 77a5792f58SBram Moolenaar" Functions: {{{1 78a5792f58SBram Moolenaar" ---------------- 79a5792f58SBram Moolenaar 80a5792f58SBram Moolenaar" --------------------------------------------------------------------- 81a5792f58SBram Moolenaar" tar#Browse: {{{2 82a5792f58SBram Moolenaarfun! tar#Browse(tarfile) 83a5792f58SBram Moolenaar" call Dfunc("tar#Browse(tarfile<".a:tarfile.">)") 84bba577a2SBram Moolenaar let repkeep= &report 85bba577a2SBram Moolenaar set report=10 86a5792f58SBram Moolenaar 87a5792f58SBram Moolenaar " sanity checks 88910f66f9SBram Moolenaar if !executable(g:tar_cmd) 89c81e5e79SBram Moolenaar redraw! 90910f66f9SBram Moolenaar echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' 91c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 92bba577a2SBram Moolenaar let &report= repkeep 93a5792f58SBram Moolenaar" call Dret("tar#Browse") 9487e25fdfSBram Moolenaar return 9587e25fdfSBram Moolenaar endif 96a5792f58SBram Moolenaar if !filereadable(a:tarfile) 97910f66f9SBram Moolenaar" call Decho('a:tarfile<'.a:tarfile.'> not filereadable') 98a5792f58SBram Moolenaar if a:tarfile !~# '^\a\+://' 99a5792f58SBram Moolenaar " if its an url, don't complain, let url-handlers such as vim do its thing 100c81e5e79SBram Moolenaar redraw! 101a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None 102c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 10387e25fdfSBram Moolenaar endif 104bba577a2SBram Moolenaar let &report= repkeep 105a5792f58SBram Moolenaar" call Dret("tar#Browse : file<".a:tarfile."> not readable") 10687e25fdfSBram Moolenaar return 10787e25fdfSBram Moolenaar endif 108a5792f58SBram Moolenaar if &ma != 1 109a5792f58SBram Moolenaar set ma 11087e25fdfSBram Moolenaar endif 111a5792f58SBram Moolenaar let w:tarfile= a:tarfile 112a5792f58SBram Moolenaar 113a5792f58SBram Moolenaar setlocal noswapfile 114a5792f58SBram Moolenaar setlocal buftype=nofile 115a5792f58SBram Moolenaar setlocal bufhidden=hide 116a5792f58SBram Moolenaar setlocal nobuflisted 117a5792f58SBram Moolenaar setlocal nowrap 118a5792f58SBram Moolenaar set ft=tar 119a5792f58SBram Moolenaar 120a5792f58SBram Moolenaar " give header 121910f66f9SBram Moolenaar" call Decho("printing header") 122*8c8de839SBram Moolenaar let lastline= line("$") 123*8c8de839SBram Moolenaar call setline(lastline+1,'" tar.vim version '.g:loaded_tar) 124*8c8de839SBram Moolenaar call setline(lastline+2,'" Browsing tarfile '.a:tarfile) 125*8c8de839SBram Moolenaar call setline(lastline+3,'" Select a file with cursor and press ENTER') 126*8c8de839SBram Moolenaar $put ='' 127a5792f58SBram Moolenaar 0d 128a5792f58SBram Moolenaar $ 129a5792f58SBram Moolenaar 130910f66f9SBram Moolenaar let tarfile= a:tarfile 131910f66f9SBram Moolenaar if has("win32") && executable("cygpath") 132910f66f9SBram Moolenaar " assuming cygwin 133*8c8de839SBram Moolenaar let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile)),'\n$','','e') 134a5792f58SBram Moolenaar endif 135d68071d8SBram Moolenaar let curlast= line("$") 136910f66f9SBram Moolenaar if tarfile =~# '\.\(gz\|tgz\)$' 137*8c8de839SBram Moolenaar" call Decho("1: exe silent r! gzip -d -c ".s:Escape(tarfile)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 138*8c8de839SBram Moolenaar exe "silent r! gzip -d -c -- ".s:Escape(tarfile)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 139*8c8de839SBram Moolenaar elseif tarfile =~# '\.lrp' 140*8c8de839SBram Moolenaar" call Decho("2: exe silent r! cat -- ".s:Escape(tarfile)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ") 141*8c8de839SBram Moolenaar exe "silent r! cat -- ".s:Escape(tarfile)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - " 142910f66f9SBram Moolenaar elseif tarfile =~# '\.bz2$' 143*8c8de839SBram Moolenaar" call Decho("3: exe silent r! bzip2 -d -c ".s:Escape(tarfile)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 144*8c8de839SBram Moolenaar exe "silent r! bzip2 -d -c -- ".s:Escape(tarfile)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 145910f66f9SBram Moolenaar else 146*8c8de839SBram Moolenaar" call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".s:Escape(tarfile)) 147*8c8de839SBram Moolenaar exe "silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".s:Escape(tarfile) 148910f66f9SBram Moolenaar endif 149910f66f9SBram Moolenaar if v:shell_error != 0 150c81e5e79SBram Moolenaar redraw! 151d68071d8SBram Moolenaar echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">" 152c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 153d68071d8SBram Moolenaar" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 154d68071d8SBram Moolenaar return 155d68071d8SBram Moolenaar endif 156c81e5e79SBram Moolenaar if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)') 157c81e5e79SBram Moolenaar redraw! 158d68071d8SBram Moolenaar echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None 159c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 160d68071d8SBram Moolenaar silent %d 161d68071d8SBram Moolenaar let eikeep= &ei 162d68071d8SBram Moolenaar set ei=BufReadCmd,FileReadCmd 163d68071d8SBram Moolenaar exe "r ".a:tarfile 164d68071d8SBram Moolenaar let &ei= eikeep 165d68071d8SBram Moolenaar 1d 166d68071d8SBram Moolenaar" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 167910f66f9SBram Moolenaar return 168910f66f9SBram Moolenaar endif 169a5792f58SBram Moolenaar 170a5792f58SBram Moolenaar setlocal noma nomod ro 171a5792f58SBram Moolenaar noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr> 172a5792f58SBram Moolenaar 173bba577a2SBram Moolenaar let &report= repkeep 174a5792f58SBram Moolenaar" call Dret("tar#Browse : w:tarfile<".w:tarfile.">") 175ab194816SBram Moolenaarendfun 17687e25fdfSBram Moolenaar 177ab194816SBram Moolenaar" --------------------------------------------------------------------- 178a5792f58SBram Moolenaar" TarBrowseSelect: {{{2 179a5792f58SBram Moolenaarfun! s:TarBrowseSelect() 180a5792f58SBram Moolenaar" call Dfunc("TarBrowseSelect() w:tarfile<".w:tarfile."> curfile<".expand("%").">") 181bba577a2SBram Moolenaar let repkeep= &report 182bba577a2SBram Moolenaar set report=10 183a5792f58SBram Moolenaar let fname= getline(".") 184a5792f58SBram Moolenaar" call Decho("fname<".fname.">") 185a5792f58SBram Moolenaar 186a5792f58SBram Moolenaar " sanity check 187a5792f58SBram Moolenaar if fname =~ '^"' 188bba577a2SBram Moolenaar let &report= repkeep 189a5792f58SBram Moolenaar" call Dret("TarBrowseSelect") 190a5792f58SBram Moolenaar return 191a5792f58SBram Moolenaar endif 192a5792f58SBram Moolenaar 193a5792f58SBram Moolenaar " about to make a new window, need to use w:tarfile 194a5792f58SBram Moolenaar let tarfile= w:tarfile 195a5792f58SBram Moolenaar let curfile= expand("%") 196910f66f9SBram Moolenaar if has("win32") && executable("cygpath") 197910f66f9SBram Moolenaar " assuming cygwin 198*8c8de839SBram Moolenaar let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile)),'\n$','','e') 199910f66f9SBram Moolenaar endif 200a5792f58SBram Moolenaar 201a5792f58SBram Moolenaar new 202*8c8de839SBram Moolenaar if !exists("g:tar_nomax") || g:tar_nomax == 0 203a5792f58SBram Moolenaar wincmd _ 204*8c8de839SBram Moolenaar endif 205a5792f58SBram Moolenaar let s:tblfile_{winnr()}= curfile 206*8c8de839SBram Moolenaar call tar#Read("tarfile:".tarfile.'::'.fname,1) 207a5792f58SBram Moolenaar filetype detect 208a5792f58SBram Moolenaar 209bba577a2SBram Moolenaar let &report= repkeep 210a5792f58SBram Moolenaar" call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 211a5792f58SBram Moolenaarendfun 212a5792f58SBram Moolenaar 213a5792f58SBram Moolenaar" --------------------------------------------------------------------- 214a5792f58SBram Moolenaar" tar#Read: {{{2 215a5792f58SBram Moolenaarfun! tar#Read(fname,mode) 216a5792f58SBram Moolenaar" call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")") 217bba577a2SBram Moolenaar let repkeep= &report 218bba577a2SBram Moolenaar set report=10 219*8c8de839SBram Moolenaar let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','') 220*8c8de839SBram Moolenaar let fname = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','') 221910f66f9SBram Moolenaar if has("win32") && executable("cygpath") 222910f66f9SBram Moolenaar " assuming cygwin 223*8c8de839SBram Moolenaar let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile)),'\n$','','e') 224910f66f9SBram Moolenaar endif 225910f66f9SBram Moolenaar" call Decho("tarfile<".tarfile.">") 226910f66f9SBram Moolenaar" call Decho("fname<".fname.">") 227a5792f58SBram Moolenaar 228*8c8de839SBram Moolenaar if fname =~ '\.gz$' && executable("zcat") 229*8c8de839SBram Moolenaar let decmp= "|zcat" 230*8c8de839SBram Moolenaar let doro = 1 231*8c8de839SBram Moolenaar elseif fname =~ '\.bz2$' && executable("bzcat") 232*8c8de839SBram Moolenaar let decmp= "|bzcat" 233*8c8de839SBram Moolenaar let doro = 1 234a5792f58SBram Moolenaar else 235*8c8de839SBram Moolenaar let decmp="" 236*8c8de839SBram Moolenaar let doro = 0 237*8c8de839SBram Moolenaar if fname =~ '\.gz$\|\.bz2$\|\.Z$\|\.zip$' 238*8c8de839SBram Moolenaar setlocal bin 239a5792f58SBram Moolenaar endif 240*8c8de839SBram Moolenaar endif 241*8c8de839SBram Moolenaar 242*8c8de839SBram Moolenaar if tarfile =~# '\.\(gz\|tgz\)$' 243*8c8de839SBram Moolenaar" call Decho("5: exe silent r! gzip -d -c -- ".s:Escape(tarfile)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.s:Escape(fname)) 244*8c8de839SBram Moolenaar exe "silent r! gzip -d -c -- ".s:Escape(tarfile)."| ".g:tar_cmd." -".g:tar_readoptions." - ".s:Escape(fname).decmp 245*8c8de839SBram Moolenaar elseif tarfile =~# '\.lrp$' 246*8c8de839SBram Moolenaar" call Decho("6: exe silent r! cat ".s:Escape(tarfile)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".s:Escape(fname).decmp) 247*8c8de839SBram Moolenaar exe "silent r! cat -- ".s:Escape(tarfile)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".s:Escape(fname).decmp 248*8c8de839SBram Moolenaar elseif tarfile =~# '\.bz2$' 249*8c8de839SBram Moolenaar" call Decho("7: exe silent r! bzip2 -d -c ".s:Escape(tarfile)."| ".g:tar_cmd." -".g:tar_readoptions." - ".s:Escape(fname).decmp) 250*8c8de839SBram Moolenaar exe "silent r! bzip2 -d -c -- ".s:Escape(tarfile)."| ".g:tar_cmd." -".g:tar_readoptions." - ".s:Escape(fname).decmp 251*8c8de839SBram Moolenaar else 252*8c8de839SBram Moolenaar" call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions." -- ".s:Escape(tarfile)." ".s:Escape(fname)) 253*8c8de839SBram Moolenaar exe "silent r! ".g:tar_cmd." -".g:tar_readoptions." ".s:Escape(tarfile)." -- ".s:Escape(fname).decmp 254*8c8de839SBram Moolenaar endif 255*8c8de839SBram Moolenaar 256*8c8de839SBram Moolenaar if doro 257*8c8de839SBram Moolenaar " because the reverse process of compressing changed files back into the tarball is not currently supported 258*8c8de839SBram Moolenaar setlocal ro 259*8c8de839SBram Moolenaar endif 260*8c8de839SBram Moolenaar 261a5792f58SBram Moolenaar let w:tarfile= a:fname 262*8c8de839SBram Moolenaar exe "file tarfile::".fname 263a5792f58SBram Moolenaar 264a5792f58SBram Moolenaar " cleanup 265a5792f58SBram Moolenaar 0d 266a5792f58SBram Moolenaar set nomod 267a5792f58SBram Moolenaar 268bba577a2SBram Moolenaar let &report= repkeep 269a5792f58SBram Moolenaar" call Dret("tar#Read : w:tarfile<".w:tarfile.">") 270a5792f58SBram Moolenaarendfun 271a5792f58SBram Moolenaar 272a5792f58SBram Moolenaar" --------------------------------------------------------------------- 273a5792f58SBram Moolenaar" tar#Write: {{{2 274a5792f58SBram Moolenaarfun! tar#Write(fname) 275a5792f58SBram Moolenaar" call Dfunc("tar#Write(fname<".a:fname.">) w:tarfile<".w:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 276bba577a2SBram Moolenaar let repkeep= &report 277bba577a2SBram Moolenaar set report=10 278a5792f58SBram Moolenaar 279ab194816SBram Moolenaar " sanity checks 280910f66f9SBram Moolenaar if !executable(g:tar_cmd) 281c81e5e79SBram Moolenaar redraw! 282910f66f9SBram Moolenaar echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' 283c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 284bba577a2SBram Moolenaar let &report= repkeep 285ab194816SBram Moolenaar" call Dret("tar#Write") 286ab194816SBram Moolenaar return 287ab194816SBram Moolenaar endif 288ab194816SBram Moolenaar if !exists("*mkdir") 289c81e5e79SBram Moolenaar redraw! 290a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None 291c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 292bba577a2SBram Moolenaar let &report= repkeep 293ab194816SBram Moolenaar" call Dret("tar#Write") 294ab194816SBram Moolenaar return 295ab194816SBram Moolenaar endif 296ab194816SBram Moolenaar 297ab194816SBram Moolenaar let curdir= getcwd() 298ab194816SBram Moolenaar let tmpdir= tempname() 299ab194816SBram Moolenaar" call Decho("orig tempname<".tmpdir.">") 300ab194816SBram Moolenaar if tmpdir =~ '\.' 301ab194816SBram Moolenaar let tmpdir= substitute(tmpdir,'\.[^.]*$','','e') 302ab194816SBram Moolenaar endif 303ab194816SBram Moolenaar" call Decho("tmpdir<".tmpdir.">") 304ab194816SBram Moolenaar call mkdir(tmpdir,"p") 305ab194816SBram Moolenaar 306ab194816SBram Moolenaar " attempt to change to the indicated directory 307ab194816SBram Moolenaar try 308*8c8de839SBram Moolenaar exe "cd ".fnameescape(tmpdir) 309ab194816SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E344/ 310c81e5e79SBram Moolenaar redraw! 311a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None 312c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 313bba577a2SBram Moolenaar let &report= repkeep 314ab194816SBram Moolenaar" call Dret("tar#Write") 315ab194816SBram Moolenaar return 316ab194816SBram Moolenaar endtry 317ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 318ab194816SBram Moolenaar 319a5792f58SBram Moolenaar " place temporary files under .../_ZIPVIM_/ 320a5792f58SBram Moolenaar if isdirectory("_ZIPVIM_") 321a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 322ab194816SBram Moolenaar endif 323a5792f58SBram Moolenaar call mkdir("_ZIPVIM_") 324a5792f58SBram Moolenaar cd _ZIPVIM_ 325ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 326ab194816SBram Moolenaar 327*8c8de839SBram Moolenaar let tarfile = substitute(w:tarfile,'tarfile:\(.\{-}\)::.*$','\1','') 328*8c8de839SBram Moolenaar let fname = substitute(w:tarfile,'tarfile:.\{-}::\(.*\)$','\1','') 329a5792f58SBram Moolenaar 330a5792f58SBram Moolenaar " handle compressed archives 331a5792f58SBram Moolenaar if tarfile =~# '\.gz' 332*8c8de839SBram Moolenaar call system("gzip -d -- ".tarfile) 333a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.gz','','e') 334*8c8de839SBram Moolenaar let compress= "gzip ".s:Escape(tarfile) 335a5792f58SBram Moolenaar elseif tarfile =~# '\.tgz' 336*8c8de839SBram Moolenaar call system("gzip -d -- ".s:Escape(tarfile)) 337a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.tgz','.tar','e') 338*8c8de839SBram Moolenaar let compress= "gzip -- ".s:Escape(tarfile) 339a5792f58SBram Moolenaar let tgz = 1 340a5792f58SBram Moolenaar elseif tarfile =~# '\.bz2' 341*8c8de839SBram Moolenaar call system("bzip2 -d -- ".s:Escape(tarfile)) 342a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.bz2','','e') 343*8c8de839SBram Moolenaar let compress= "bzip2 -- ".s:Escape(tarfile) 344a5792f58SBram Moolenaar endif 345*8c8de839SBram Moolenaar" call Decho("tarfile<".tarfile.">") 346*8c8de839SBram Moolenaar" call Decho("compress<".compress.">") 347a5792f58SBram Moolenaar 348a5792f58SBram Moolenaar if v:shell_error != 0 349c81e5e79SBram Moolenaar redraw! 350a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None 351c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 352a5792f58SBram Moolenaar else 353a5792f58SBram Moolenaar 354a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 355a5792f58SBram Moolenaar 3561cbe5f73SBram Moolenaar if fname =~ '/' 357a5792f58SBram Moolenaar let dirpath = substitute(fname,'/[^/]\+$','','e') 3581cbe5f73SBram Moolenaar if executable("cygpath") 3591cbe5f73SBram Moolenaar let dirpath = substitute(system("cygpath ".dirpath),'\n','','e') 3601cbe5f73SBram Moolenaar endif 3611cbe5f73SBram Moolenaar call mkdir(dirpath,"p") 3621cbe5f73SBram Moolenaar endif 363a5792f58SBram Moolenaar if tarfile !~ '/' 364a5792f58SBram Moolenaar let tarfile= curdir.'/'.tarfile 365a5792f58SBram Moolenaar endif 366a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 367a5792f58SBram Moolenaar 368*8c8de839SBram Moolenaar exe "w! ".fnameescape(fname) 369ab194816SBram Moolenaar if executable("cygpath") 370*8c8de839SBram Moolenaar let tarfile = substitute(system("cygpath ".s:Escape(tarfile)),'\n','','e') 371ab194816SBram Moolenaar endif 372ab194816SBram Moolenaar 373a5792f58SBram Moolenaar " delete old file from tarfile 374*8c8de839SBram Moolenaar" call Decho("system(tar --delete -f ".s:Escape(tarfile)." -- ".s:Escape(fname).")") 375*8c8de839SBram Moolenaar call system("tar --delete -f ".s:Escape(tarfile)." -- ".s:Escape(fname)) 376ab194816SBram Moolenaar if v:shell_error != 0 377c81e5e79SBram Moolenaar redraw! 378*8c8de839SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 379c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 380ab194816SBram Moolenaar else 381a5792f58SBram Moolenaar 382a5792f58SBram Moolenaar " update tarfile with new file 383*8c8de839SBram Moolenaar" call Decho("tar -".g:tar_writeoptions." ".s:Escape(tarfile)." -- ".s:Escape(fname)) 384*8c8de839SBram Moolenaar call system("tar -".g:tar_writeoptions." ".s:Escape(tarfile)." -- ".s:Escape(fname)) 385a5792f58SBram Moolenaar if v:shell_error != 0 386c81e5e79SBram Moolenaar redraw! 387*8c8de839SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 388c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 389a5792f58SBram Moolenaar elseif exists("compress") 390a5792f58SBram Moolenaar" call Decho("call system(".compress.")") 391a5792f58SBram Moolenaar call system(compress) 392a5792f58SBram Moolenaar if exists("tgz") 393a5792f58SBram Moolenaar" call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")") 394a5792f58SBram Moolenaar call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e')) 395a5792f58SBram Moolenaar endif 396a5792f58SBram Moolenaar endif 397a5792f58SBram Moolenaar endif 398a5792f58SBram Moolenaar 399a5792f58SBram Moolenaar " support writing tarfiles across a network 400a5792f58SBram Moolenaar if s:tblfile_{winnr()} =~ '^\a\+://' 401a5792f58SBram Moolenaar" call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">") 402a5792f58SBram Moolenaar let tblfile= s:tblfile_{winnr()} 403a5792f58SBram Moolenaar 1split|enew 404a5792f58SBram Moolenaar let binkeep= &binary 405a5792f58SBram Moolenaar let eikeep = &ei 406a5792f58SBram Moolenaar set binary ei=all 407a5792f58SBram Moolenaar exe "e! ".tarfile 408a5792f58SBram Moolenaar call netrw#NetWrite(tblfile) 409a5792f58SBram Moolenaar let &ei = eikeep 410a5792f58SBram Moolenaar let &binary = binkeep 411a5792f58SBram Moolenaar q! 412a5792f58SBram Moolenaar unlet s:tblfile_{winnr()} 413a5792f58SBram Moolenaar endif 414ab194816SBram Moolenaar endif 415ab194816SBram Moolenaar 416ab194816SBram Moolenaar " cleanup and restore current directory 417ab194816SBram Moolenaar cd .. 418a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 419ab194816SBram Moolenaar exe "cd ".escape(curdir,' \') 420ab194816SBram Moolenaar setlocal nomod 421ab194816SBram Moolenaar 422bba577a2SBram Moolenaar let &report= repkeep 423ab194816SBram Moolenaar" call Dret("tar#Write") 424ab194816SBram Moolenaarendfun 425ab194816SBram Moolenaar 426ab194816SBram Moolenaar" --------------------------------------------------------------------- 427a5792f58SBram Moolenaar" Rmdir: {{{2 428ab194816SBram Moolenaarfun! s:Rmdir(fname) 429ab194816SBram Moolenaar" call Dfunc("Rmdir(fname<".a:fname.">)") 430ab194816SBram Moolenaar if has("unix") 431*8c8de839SBram Moolenaar call system("/bin/rm -rf -- ".s:Escape(a:fname)) 432ab194816SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16") 433ab194816SBram Moolenaar if &shell =~? "sh$" 434*8c8de839SBram Moolenaar call system("/bin/rm -rf -- ".s:Escape(a:fname)) 435ab194816SBram Moolenaar else 436*8c8de839SBram Moolenaar call system("del /S ".s:Escape(a:fname)) 437ab194816SBram Moolenaar endif 438ab194816SBram Moolenaar endif 439ab194816SBram Moolenaar" call Dret("Rmdir") 440ab194816SBram Moolenaarendfun 441ab194816SBram Moolenaar 442*8c8de839SBram Moolenaar" --------------------------------------------------------------------- 443*8c8de839SBram Moolenaar" s:Escape: {{{2 444*8c8de839SBram Moolenaarfun s:Escape(name) 445*8c8de839SBram Moolenaar " shellescape() was added by patch 7.0.111 446*8c8de839SBram Moolenaar if exists("*shellescape") 447*8c8de839SBram Moolenaar let qnameq= shellescape(a:name) 448*8c8de839SBram Moolenaar else 449*8c8de839SBram Moolenaar let qnameq= g:tar_shq . a:name . g:tar_shq 450*8c8de839SBram Moolenaar endif 451*8c8de839SBram Moolenaar return qnameq 452*8c8de839SBram Moolenaarendfun 453*8c8de839SBram Moolenaar 454*8c8de839SBram Moolenaar" --------------------------------------------------------------------- 455a5792f58SBram Moolenaar" Modelines And Restoration: {{{1 456a5792f58SBram Moolenaarlet &cpo= s:keepcpo 457a5792f58SBram Moolenaarunlet s:keepcpo 458a5792f58SBram Moolenaar" vim:ts=8 fdm=marker 459