1*a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles 2*a5792f58SBram Moolenaar" AUTOLOAD PORTION 3*a5792f58SBram Moolenaar" Date: Nov 18, 2005 4*a5792f58SBram Moolenaar" Version: 4 5*a5792f58SBram Moolenaar" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz> 6*a5792f58SBram Moolenaar" License: Vim License (see vim's :help license) 787e25fdfSBram Moolenaar" 8*a5792f58SBram Moolenaar" Contains many ideas from Michael Toren's <tar.vim> 987e25fdfSBram Moolenaar" 10*a5792f58SBram Moolenaar" Copyright: Copyright (C) 2005 Charles E. Campbell, Jr. {{{1 11*a5792f58SBram Moolenaar" Permission is hereby granted to use and distribute this code, 12*a5792f58SBram Moolenaar" with or without modifications, provided that this copyright 13*a5792f58SBram Moolenaar" notice is copied with it. Like anything else that's free, 14*a5792f58SBram Moolenaar" tarPlugin.vim is provided *as is* and comes with no warranty 15*a5792f58SBram Moolenaar" of any kind, either expressed or implied. By using this 16*a5792f58SBram Moolenaar" plugin, you agree that in no event will the copyright 17*a5792f58SBram Moolenaar" holder be liable for any damages resulting from the use 18*a5792f58SBram Moolenaar" of this software. 1987e25fdfSBram Moolenaar 20ab194816SBram Moolenaar" --------------------------------------------------------------------- 21*a5792f58SBram Moolenaar" Initialization: {{{1 22*a5792f58SBram Moolenaarlet s:keepcpo= &cpo 23*a5792f58SBram Moolenaarset cpo&vim 24*a5792f58SBram Moolenaarif exists("g:loaded_tar") 25*a5792f58SBram Moolenaar finish 26*a5792f58SBram Moolenaarendif 27*a5792f58SBram Moolenaarlet g:loaded_tar= "v4" 2887e25fdfSBram Moolenaar 29*a5792f58SBram Moolenaar" --------------------------------------------------------------------- 30*a5792f58SBram Moolenaar" Default Settings: {{{1 31*a5792f58SBram Moolenaarif !exists("g:tar_browseoptions") 32*a5792f58SBram Moolenaar let g:tar_browseoptions= "Ptf" 33*a5792f58SBram Moolenaarendif 34*a5792f58SBram Moolenaarif !exists("g:tar_readoptions") 35*a5792f58SBram Moolenaar let g:tar_readoptions= "OPxf" 36*a5792f58SBram Moolenaarendif 37*a5792f58SBram Moolenaarif !exists("g:tar_writeoptions") 38*a5792f58SBram Moolenaar let g:tar_writeoptions= "uf" 39*a5792f58SBram Moolenaarendif 40*a5792f58SBram Moolenaar 41*a5792f58SBram Moolenaar" ---------------- 42*a5792f58SBram Moolenaar" Functions: {{{1 43*a5792f58SBram Moolenaar" ---------------- 44*a5792f58SBram Moolenaar 45*a5792f58SBram Moolenaar" --------------------------------------------------------------------- 46*a5792f58SBram Moolenaar" tar#Browse: {{{2 47*a5792f58SBram Moolenaarfun! tar#Browse(tarfile) 48*a5792f58SBram Moolenaar" call Dfunc("tar#Browse(tarfile<".a:tarfile.">)") 49*a5792f58SBram Moolenaar 50*a5792f58SBram Moolenaar " sanity checks 51*a5792f58SBram Moolenaar if !executable("tar") 52*a5792f58SBram Moolenaar echohl Error | echo '***error*** (tar#Browse) "tar" not available on your system' 53*a5792f58SBram Moolenaar call inputsave()|call input("Press <cr> to continue")|call inputrestore() 54*a5792f58SBram Moolenaar" call Dret("tar#Browse") 5587e25fdfSBram Moolenaar return 5687e25fdfSBram Moolenaar endif 57*a5792f58SBram Moolenaar if !filereadable(a:tarfile) 58*a5792f58SBram Moolenaar if a:tarfile !~# '^\a\+://' 59*a5792f58SBram Moolenaar " if its an url, don't complain, let url-handlers such as vim do its thing 60*a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None 61*a5792f58SBram Moolenaar call inputsave()|call input("Press <cr> to continue")|call inputrestore() 6287e25fdfSBram Moolenaar endif 63*a5792f58SBram Moolenaar" call Dret("tar#Browse : file<".a:tarfile."> not readable") 6487e25fdfSBram Moolenaar return 6587e25fdfSBram Moolenaar endif 66*a5792f58SBram Moolenaar if &ma != 1 67*a5792f58SBram Moolenaar set ma 6887e25fdfSBram Moolenaar endif 69*a5792f58SBram Moolenaar let w:tarfile= a:tarfile 70*a5792f58SBram Moolenaar 71*a5792f58SBram Moolenaar setlocal noswapfile 72*a5792f58SBram Moolenaar setlocal buftype=nofile 73*a5792f58SBram Moolenaar setlocal bufhidden=hide 74*a5792f58SBram Moolenaar setlocal nobuflisted 75*a5792f58SBram Moolenaar setlocal nowrap 76*a5792f58SBram Moolenaar set ft=tar 77*a5792f58SBram Moolenaar 78*a5792f58SBram Moolenaar " give header 79*a5792f58SBram Moolenaar exe "$put ='".'\"'." tar.vim version ".g:loaded_tar."'" 80*a5792f58SBram Moolenaar exe "$put ='".'\"'." Browsing tarfile ".a:tarfile."'" 81*a5792f58SBram Moolenaar exe "$put ='".'\"'." Select a file with cursor and press ENTER"."'" 82*a5792f58SBram Moolenaar 0d 83*a5792f58SBram Moolenaar $ 84*a5792f58SBram Moolenaar 85*a5792f58SBram Moolenaar if a:tarfile =~# '\.\(gz\|tgz\)$' 86*a5792f58SBram Moolenaar exe "silent r! gzip -d -c '".a:tarfile."'| tar -".g:tar_browseoptions." - " 87*a5792f58SBram Moolenaar elseif a:tarfile =~# '\.bz2$' 88*a5792f58SBram Moolenaar exe "silent r! bzip2 -d -c '".a:tarfile."'| tar -".g:tar_browseoptions." - " 89*a5792f58SBram Moolenaar else 90*a5792f58SBram Moolenaar exe "silent r! tar -".g:tar_browseoptions." '".a:tarfile."'" 91*a5792f58SBram Moolenaar endif 92*a5792f58SBram Moolenaar %g@/$@d 93*a5792f58SBram Moolenaar 94*a5792f58SBram Moolenaar setlocal noma nomod ro 95*a5792f58SBram Moolenaar noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr> 96*a5792f58SBram Moolenaar 97*a5792f58SBram Moolenaar" call Dret("tar#Browse : w:tarfile<".w:tarfile.">") 98ab194816SBram Moolenaarendfun 9987e25fdfSBram Moolenaar 100ab194816SBram Moolenaar" --------------------------------------------------------------------- 101*a5792f58SBram Moolenaar" TarBrowseSelect: {{{2 102*a5792f58SBram Moolenaarfun! s:TarBrowseSelect() 103*a5792f58SBram Moolenaar" call Dfunc("TarBrowseSelect() w:tarfile<".w:tarfile."> curfile<".expand("%").">") 104*a5792f58SBram Moolenaar let fname= getline(".") 105*a5792f58SBram Moolenaar" call Decho("fname<".fname.">") 106*a5792f58SBram Moolenaar 107*a5792f58SBram Moolenaar " sanity check 108*a5792f58SBram Moolenaar if fname =~ '^"' 109*a5792f58SBram Moolenaar" call Dret("TarBrowseSelect") 110*a5792f58SBram Moolenaar return 111*a5792f58SBram Moolenaar endif 112*a5792f58SBram Moolenaar 113*a5792f58SBram Moolenaar " about to make a new window, need to use w:tarfile 114*a5792f58SBram Moolenaar let tarfile= w:tarfile 115*a5792f58SBram Moolenaar let curfile= expand("%") 116*a5792f58SBram Moolenaar 117*a5792f58SBram Moolenaar new 118*a5792f58SBram Moolenaar wincmd _ 119*a5792f58SBram Moolenaar let s:tblfile_{winnr()}= curfile 120*a5792f58SBram Moolenaar" call Decho("exe e tarfile:".tarfile.':'.fname) 121*a5792f58SBram Moolenaar exe "e tarfile:".tarfile.':'.fname 122*a5792f58SBram Moolenaar filetype detect 123*a5792f58SBram Moolenaar 124*a5792f58SBram Moolenaar" call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 125*a5792f58SBram Moolenaarendfun 126*a5792f58SBram Moolenaar 127*a5792f58SBram Moolenaar" --------------------------------------------------------------------- 128*a5792f58SBram Moolenaar" tar#Read: {{{2 129*a5792f58SBram Moolenaarfun! tar#Read(fname,mode) 130*a5792f58SBram Moolenaar" call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")") 131*a5792f58SBram Moolenaar let tarfile = substitute(a:fname,'tarfile:\(.\{-}\):.*$','\1','') 132*a5792f58SBram Moolenaar let fname = substitute(a:fname,'tarfile:.\{-}:\(.*\)$','\1','') 133*a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 134*a5792f58SBram Moolenaar 135*a5792f58SBram Moolenaar if tarfile =~# '\.\(gz\|tgz\)$' 136*a5792f58SBram Moolenaar" call Decho("exe silent r! gzip -d -c '".tarfile."'| tar -OPxf - '".fname."'") 137*a5792f58SBram Moolenaar exe "silent r! gzip -d -c '".tarfile."'| tar -".g:tar_readoptions." - '".fname."'" 138*a5792f58SBram Moolenaar elseif a:fname =~# '\.bz2$' 139*a5792f58SBram Moolenaar" call Decho("exe silent r! bzip2 -d -c '".tarfile."'| tar -".g:tar_readoptions." - '".fname."'") 140*a5792f58SBram Moolenaar exe "silent r! bzip2 -d -c '".tarfile."'| tar -".g:tar_readoptions." - '".fname."'" 141*a5792f58SBram Moolenaar else 142*a5792f58SBram Moolenaar" call Decho("exe silent r! tar -".g:tar_readoptions." '".tarfile."' '".fname."'") 143*a5792f58SBram Moolenaar exe "silent r! tar -".g:tar_readoptions." '".tarfile."' '".fname."'" 144*a5792f58SBram Moolenaar endif 145*a5792f58SBram Moolenaar let w:tarfile= a:fname 146*a5792f58SBram Moolenaar exe "file tarfile:".fname 147*a5792f58SBram Moolenaar 148*a5792f58SBram Moolenaar " cleanup 149*a5792f58SBram Moolenaar 0d 150*a5792f58SBram Moolenaar set nomod 151*a5792f58SBram Moolenaar 152*a5792f58SBram Moolenaar" call Dret("tar#Read : w:tarfile<".w:tarfile.">") 153*a5792f58SBram Moolenaarendfun 154*a5792f58SBram Moolenaar 155*a5792f58SBram Moolenaar" --------------------------------------------------------------------- 156*a5792f58SBram Moolenaar" tar#Write: {{{2 157*a5792f58SBram Moolenaarfun! tar#Write(fname) 158*a5792f58SBram Moolenaar" call Dfunc("tar#Write(fname<".a:fname.">) w:tarfile<".w:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 159*a5792f58SBram Moolenaar 160ab194816SBram Moolenaar " sanity checks 161ab194816SBram Moolenaar if !executable("tar") 162*a5792f58SBram Moolenaar echohl Error | echo '***error*** (tar#Browse) "tar" not available on your system' 163*a5792f58SBram Moolenaar call inputsave()|call input("Press <cr> to continue")|call inputrestore() 164ab194816SBram Moolenaar" call Dret("tar#Write") 165ab194816SBram Moolenaar return 166ab194816SBram Moolenaar endif 167ab194816SBram Moolenaar if !exists("*mkdir") 168*a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None 169*a5792f58SBram Moolenaar call inputsave()|call input("Press <cr> to continue")|call inputrestore() 170ab194816SBram Moolenaar" call Dret("tar#Write") 171ab194816SBram Moolenaar return 172ab194816SBram Moolenaar endif 173ab194816SBram Moolenaar 174ab194816SBram Moolenaar let curdir= getcwd() 175ab194816SBram Moolenaar let tmpdir= tempname() 176ab194816SBram Moolenaar" call Decho("orig tempname<".tmpdir.">") 177ab194816SBram Moolenaar if tmpdir =~ '\.' 178ab194816SBram Moolenaar let tmpdir= substitute(tmpdir,'\.[^.]*$','','e') 179ab194816SBram Moolenaar endif 180ab194816SBram Moolenaar" call Decho("tmpdir<".tmpdir.">") 181ab194816SBram Moolenaar call mkdir(tmpdir,"p") 182ab194816SBram Moolenaar 183ab194816SBram Moolenaar " attempt to change to the indicated directory 184ab194816SBram Moolenaar try 185ab194816SBram Moolenaar exe "cd ".escape(tmpdir,' \') 186ab194816SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E344/ 187*a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None 188*a5792f58SBram Moolenaar call inputsave()|call input("Press <cr> to continue")|call inputrestore() 189ab194816SBram Moolenaar" call Dret("tar#Write") 190ab194816SBram Moolenaar return 191ab194816SBram Moolenaar endtry 192ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 193ab194816SBram Moolenaar 194*a5792f58SBram Moolenaar " place temporary files under .../_ZIPVIM_/ 195*a5792f58SBram Moolenaar if isdirectory("_ZIPVIM_") 196*a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 197ab194816SBram Moolenaar endif 198*a5792f58SBram Moolenaar call mkdir("_ZIPVIM_") 199*a5792f58SBram Moolenaar cd _ZIPVIM_ 200ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 201ab194816SBram Moolenaar 202*a5792f58SBram Moolenaar let tarfile = substitute(w:tarfile,'tarfile:\(.\{-}\):.*$','\1','') 203*a5792f58SBram Moolenaar let fname = substitute(w:tarfile,'tarfile:.\{-}:\(.*\)$','\1','') 204*a5792f58SBram Moolenaar 205*a5792f58SBram Moolenaar " handle compressed archives 206*a5792f58SBram Moolenaar if tarfile =~# '\.gz' 207*a5792f58SBram Moolenaar call system("gzip -d ".tarfile) 208*a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.gz','','e') 209*a5792f58SBram Moolenaar let compress= "gzip '".tarfile."'" 210*a5792f58SBram Moolenaar elseif tarfile =~# '\.tgz' 211*a5792f58SBram Moolenaar call system("gzip -d ".tarfile) 212*a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.tgz','.tar','e') 213*a5792f58SBram Moolenaar let compress= "gzip '".tarfile."'" 214*a5792f58SBram Moolenaar let tgz = 1 215*a5792f58SBram Moolenaar elseif tarfile =~# '\.bz2' 216*a5792f58SBram Moolenaar call system("bzip2 -d ".tarfile) 217*a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.bz2','','e') 218*a5792f58SBram Moolenaar let compress= "bzip2 '".tarfile."'" 219*a5792f58SBram Moolenaar endif 220*a5792f58SBram Moolenaar 221*a5792f58SBram Moolenaar if v:shell_error != 0 222*a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None 223*a5792f58SBram Moolenaar call inputsave()|call input("Press <cr> to continue")|call inputrestore() 224*a5792f58SBram Moolenaar else 225*a5792f58SBram Moolenaar 226*a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 227*a5792f58SBram Moolenaar 228*a5792f58SBram Moolenaar let dirpath = substitute(fname,'/[^/]\+$','','e') 229*a5792f58SBram Moolenaar if tarfile !~ '/' 230*a5792f58SBram Moolenaar let tarfile= curdir.'/'.tarfile 231*a5792f58SBram Moolenaar endif 232*a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 233*a5792f58SBram Moolenaar 234ab194816SBram Moolenaar call mkdir(dirpath,"p") 235*a5792f58SBram Moolenaar exe "w! ".fname 236ab194816SBram Moolenaar if executable("cygpath") 237*a5792f58SBram Moolenaar let dirpath = substitute(system("cygpath ".dirpath),'\n','','e') 238ab194816SBram Moolenaar let tarfile = substitute(system("cygpath ".tarfile),'\n','','e') 239ab194816SBram Moolenaar endif 240ab194816SBram Moolenaar 241*a5792f58SBram Moolenaar " delete old file from tarfile 242*a5792f58SBram Moolenaar" call Decho("tar --delete -f '".tarfile."' '".fname."'") 243*a5792f58SBram Moolenaar call system("tar --delete -f '".tarfile."' '".fname."'") 244ab194816SBram Moolenaar if v:shell_error != 0 245*a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None 246*a5792f58SBram Moolenaar call inputsave()|call input("Press <cr> to continue")|call inputrestore() 247ab194816SBram Moolenaar else 248*a5792f58SBram Moolenaar 249*a5792f58SBram Moolenaar " update tarfile with new file 250*a5792f58SBram Moolenaar" call Decho("tar -".g:tar_writeoptions." '".tarfile."' '".fname."'") 251*a5792f58SBram Moolenaar call system("tar -".g:tar_writeoptions." '".tarfile."' '".fname."'") 252*a5792f58SBram Moolenaar if v:shell_error != 0 253*a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None 254*a5792f58SBram Moolenaar call inputsave()|call input("Press <cr> to continue")|call inputrestore() 255*a5792f58SBram Moolenaar elseif exists("compress") 256*a5792f58SBram Moolenaar" call Decho("call system(".compress.")") 257*a5792f58SBram Moolenaar call system(compress) 258*a5792f58SBram Moolenaar if exists("tgz") 259*a5792f58SBram Moolenaar" call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")") 260*a5792f58SBram Moolenaar call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e')) 261*a5792f58SBram Moolenaar endif 262*a5792f58SBram Moolenaar endif 263*a5792f58SBram Moolenaar endif 264*a5792f58SBram Moolenaar 265*a5792f58SBram Moolenaar " support writing tarfiles across a network 266*a5792f58SBram Moolenaar if s:tblfile_{winnr()} =~ '^\a\+://' 267*a5792f58SBram Moolenaar" call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">") 268*a5792f58SBram Moolenaar let tblfile= s:tblfile_{winnr()} 269*a5792f58SBram Moolenaar 1split|enew 270*a5792f58SBram Moolenaar let binkeep= &binary 271*a5792f58SBram Moolenaar let eikeep = &ei 272*a5792f58SBram Moolenaar set binary ei=all 273*a5792f58SBram Moolenaar exe "e! ".tarfile 274*a5792f58SBram Moolenaar call netrw#NetWrite(tblfile) 275*a5792f58SBram Moolenaar let &ei = eikeep 276*a5792f58SBram Moolenaar let &binary = binkeep 277*a5792f58SBram Moolenaar q! 278*a5792f58SBram Moolenaar unlet s:tblfile_{winnr()} 279*a5792f58SBram Moolenaar endif 280ab194816SBram Moolenaar endif 281ab194816SBram Moolenaar 282ab194816SBram Moolenaar " cleanup and restore current directory 283ab194816SBram Moolenaar cd .. 284*a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 285ab194816SBram Moolenaar exe "cd ".escape(curdir,' \') 286ab194816SBram Moolenaar setlocal nomod 287ab194816SBram Moolenaar 288ab194816SBram Moolenaar" call Dret("tar#Write") 289ab194816SBram Moolenaarendfun 290ab194816SBram Moolenaar 291ab194816SBram Moolenaar" --------------------------------------------------------------------- 292*a5792f58SBram Moolenaar" Rmdir: {{{2 293ab194816SBram Moolenaarfun! s:Rmdir(fname) 294ab194816SBram Moolenaar" call Dfunc("Rmdir(fname<".a:fname.">)") 295ab194816SBram Moolenaar if has("unix") 296ab194816SBram Moolenaar call system("/bin/rm -rf ".a:fname) 297ab194816SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16") 298ab194816SBram Moolenaar if &shell =~? "sh$" 299ab194816SBram Moolenaar call system("/bin/rm -rf ".a:fname) 300ab194816SBram Moolenaar else 301ab194816SBram Moolenaar call system("del /S ".a:fname) 302ab194816SBram Moolenaar endif 303ab194816SBram Moolenaar endif 304ab194816SBram Moolenaar" call Dret("Rmdir") 305ab194816SBram Moolenaarendfun 306ab194816SBram Moolenaar 307*a5792f58SBram Moolenaar" ------------------------------------------------------------------------ 308*a5792f58SBram Moolenaar" Modelines And Restoration: {{{1 309*a5792f58SBram Moolenaarlet &cpo= s:keepcpo 310*a5792f58SBram Moolenaarunlet s:keepcpo 311*a5792f58SBram Moolenaar" vim:ts=8 fdm=marker 312