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