187e25fdfSBram Moolenaar" 287e25fdfSBram Moolenaar" tar.vim -- a Vim plugin for browsing tarfiles 387e25fdfSBram Moolenaar" Copyright (c) 2002, Michael C. Toren <[email protected]> 487e25fdfSBram Moolenaar" Distributed under the GNU General Public License. 587e25fdfSBram Moolenaar" 6*ab194816SBram Moolenaar" Version: 2 7*ab194816SBram Moolenaar" Date: Sep 14, 2005 8*ab194816SBram Moolenaar" Modified By: Charles E. Campbell, Jr. 987e25fdfSBram Moolenaar" 1087e25fdfSBram Moolenaar" Updates are available from <http://michael.toren.net/code/>. If you 1187e25fdfSBram Moolenaar" find this script useful, or have suggestions for improvements, please 1287e25fdfSBram Moolenaar" let me know. 1387e25fdfSBram Moolenaar" Also look there for further comments and documentation. 1487e25fdfSBram Moolenaar" 1587e25fdfSBram Moolenaar" This part defines the functions. The autocommands are in plugin/tar.vim. 16*ab194816SBram Moolenaarif exists("g:loaded_tar") || &cp 17*ab194816SBram Moolenaar finish 18*ab194816SBram Moolenaarendif 19*ab194816SBram Moolenaarlet g:loaded_tar= "v2" 2087e25fdfSBram Moolenaar 21*ab194816SBram Moolenaar" --------------------------------------------------------------------- 22*ab194816SBram Moolenaar" tar#Read: {{{1 23*ab194816SBram Moolenaarfun! tar#Read(argument, cleanup) 24*ab194816SBram Moolenaar" call Dfunc("tar#Read(argument<".a:argument."> cleanup=".a:cleanup.")") 2587e25fdfSBram Moolenaar let l:argument = a:argument 2687e25fdfSBram Moolenaar let l:argument = substitute(l:argument, '^tarfile:', '', '') 2787e25fdfSBram Moolenaar let l:argument = substitute(l:argument, '^\~', $HOME, '') 2887e25fdfSBram Moolenaar 2987e25fdfSBram Moolenaar let l:tarfile = l:argument 3087e25fdfSBram Moolenaar while 1 3187e25fdfSBram Moolenaar if (l:tarfile == "" || l:tarfile == "/") 32*ab194816SBram Moolenaar echo "***error*** (tar#Read) Could not find a readable tarfile in path:" l:argument 33*ab194816SBram Moolenaar" call Dret("tar#Read") 3487e25fdfSBram Moolenaar return 3587e25fdfSBram Moolenaar endif 3687e25fdfSBram Moolenaar 3787e25fdfSBram Moolenaar if filereadable(l:tarfile) " found it! 3887e25fdfSBram Moolenaar break 3987e25fdfSBram Moolenaar endif 4087e25fdfSBram Moolenaar 4187e25fdfSBram Moolenaar let l:tarfile = fnamemodify(l:tarfile, ":h") 4287e25fdfSBram Moolenaar endwhile 4387e25fdfSBram Moolenaar 4487e25fdfSBram Moolenaar let l:toextract = strpart(l:argument, strlen(l:tarfile) + 1) 4587e25fdfSBram Moolenaar 4687e25fdfSBram Moolenaar if (l:toextract == "") 47*ab194816SBram Moolenaar" call Dret("tar#Read") 4887e25fdfSBram Moolenaar return 4987e25fdfSBram Moolenaar endif 5087e25fdfSBram Moolenaar 5187e25fdfSBram Moolenaar let l:cat = s:TarCatCommand(l:tarfile) 5287e25fdfSBram Moolenaar execute "r !" . l:cat . " < '" . l:tarfile . "'" 5387e25fdfSBram Moolenaar \ " | tar OPxf - '" . l:toextract . "'" 5487e25fdfSBram Moolenaar 5587e25fdfSBram Moolenaar if (a:cleanup) 5687e25fdfSBram Moolenaar 0d "blank line 5787e25fdfSBram Moolenaar execute "doautocmd BufReadPost " . expand("%") 58*ab194816SBram Moolenaar setlocal nomod 5987e25fdfSBram Moolenaar silent preserve 6087e25fdfSBram Moolenaar endif 61*ab194816SBram Moolenaar" call Dret("tar#Read") 62*ab194816SBram Moolenaarendfun 6387e25fdfSBram Moolenaar 64*ab194816SBram Moolenaar" --------------------------------------------------------------------- 65*ab194816SBram Moolenaar" tar#Write: {{{1 66*ab194816SBram Moolenaarfun! tar#Write(argument) 67*ab194816SBram Moolenaar" call Dfunc("tar#Write(argument<".a:argument.">)") 68*ab194816SBram Moolenaar" 69*ab194816SBram Moolenaar " sanity checks 70*ab194816SBram Moolenaar if !executable("tar") 71*ab194816SBram Moolenaar echo "***error*** (TarWrite) sorry, your system doesn't appear to have the tar pgm" 72*ab194816SBram Moolenaar" call Dret("tar#Write") 73*ab194816SBram Moolenaar return 74*ab194816SBram Moolenaar endif 75*ab194816SBram Moolenaar if !exists("*mkdir") 76*ab194816SBram Moolenaar echo "***error*** (TarWrite) sorry, mkdir() doesn't work on your system" 77*ab194816SBram Moolenaar" call Dret("tar#Write") 78*ab194816SBram Moolenaar return 79*ab194816SBram Moolenaar endif 80*ab194816SBram Moolenaar 81*ab194816SBram Moolenaar let curdir= getcwd() 82*ab194816SBram Moolenaar let tmpdir= tempname() 83*ab194816SBram Moolenaar" call Decho("orig tempname<".tmpdir.">") 84*ab194816SBram Moolenaar if tmpdir =~ '\.' 85*ab194816SBram Moolenaar let tmpdir= substitute(tmpdir,'\.[^.]*$','','e') 86*ab194816SBram Moolenaar endif 87*ab194816SBram Moolenaar" call Decho("tmpdir<".tmpdir.">") 88*ab194816SBram Moolenaar call mkdir(tmpdir,"p") 89*ab194816SBram Moolenaar 90*ab194816SBram Moolenaar " attempt to change to the indicated directory 91*ab194816SBram Moolenaar try 92*ab194816SBram Moolenaar exe "cd ".escape(tmpdir,' \') 93*ab194816SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E344/ 94*ab194816SBram Moolenaar echo "***error*** (TarWrite) cannot cd to temporary directory" 95*ab194816SBram Moolenaar" call Dret("tar#Write") 96*ab194816SBram Moolenaar return 97*ab194816SBram Moolenaar endtry 98*ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 99*ab194816SBram Moolenaar 100*ab194816SBram Moolenaar " place temporary files under .../_TARVIM_/ 101*ab194816SBram Moolenaar if isdirectory("_TARVIM_") 102*ab194816SBram Moolenaar call s:Rmdir("_TARVIM_") 103*ab194816SBram Moolenaar endif 104*ab194816SBram Moolenaar call mkdir("_TARVIM_") 105*ab194816SBram Moolenaar cd _TARVIM_ 106*ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 107*ab194816SBram Moolenaar 108*ab194816SBram Moolenaar let tarfile = curdir."/".substitute(a:argument,'tarfile:\([^/]\{-}\)/.*$','\1','') 109*ab194816SBram Moolenaar let path = substitute(a:argument,'^.\{-}/','','') 110*ab194816SBram Moolenaar let dirpath = substitute(path,'/\=[^/]\+$','','') 111*ab194816SBram Moolenaar" call Decho("path <".path.">") 112*ab194816SBram Moolenaar" call Decho("dirpath<".dirpath.">") 113*ab194816SBram Moolenaar call mkdir(dirpath,"p") 114*ab194816SBram Moolenaar exe "w! ".path 115*ab194816SBram Moolenaar if executable("cygpath") 116*ab194816SBram Moolenaar let path = substitute(system("cygpath ".path),'\n','','e') 117*ab194816SBram Moolenaar let tarfile = substitute(system("cygpath ".tarfile),'\n','','e') 118*ab194816SBram Moolenaar endif 119*ab194816SBram Moolenaar 120*ab194816SBram Moolenaar" call Decho("tar --delete -f ".tarfile." ".path) 121*ab194816SBram Moolenaar call system("tar --delete -f ".tarfile." ".path) 122*ab194816SBram Moolenaar if v:shell_error != 0 123*ab194816SBram Moolenaar echo "***error*** (TarWrite) sorry, your tar pgm doesn't support deletion of ".path 124*ab194816SBram Moolenaar else 125*ab194816SBram Moolenaar" call Decho("tar -rf ".tarfile." ".path) 126*ab194816SBram Moolenaar call system("tar -rf ".tarfile." ".path) 127*ab194816SBram Moolenaar endif 128*ab194816SBram Moolenaar 129*ab194816SBram Moolenaar " cleanup and restore current directory 130*ab194816SBram Moolenaar cd .. 131*ab194816SBram Moolenaar call s:Rmdir("_TARVIM_") 132*ab194816SBram Moolenaar exe "cd ".escape(curdir,' \') 133*ab194816SBram Moolenaar setlocal nomod 134*ab194816SBram Moolenaar 135*ab194816SBram Moolenaar" call Dret("tar#Write") 136*ab194816SBram Moolenaarendfun 137*ab194816SBram Moolenaar 138*ab194816SBram Moolenaar" --------------------------------------------------------------------- 139*ab194816SBram Moolenaar" tar#Browse: {{{1 140*ab194816SBram Moolenaarfun! tar#Browse(tarfile) 141*ab194816SBram Moolenaar" call Dfunc("tar#Browse(tarfile<".a:tarfile.">)") 14287e25fdfSBram Moolenaar setlocal noswapfile 14387e25fdfSBram Moolenaar setlocal buftype=nofile 14487e25fdfSBram Moolenaar setlocal bufhidden=hide 14587e25fdfSBram Moolenaar setlocal filetype= 14687e25fdfSBram Moolenaar setlocal nobuflisted 14787e25fdfSBram Moolenaar setlocal buftype=nofile 14887e25fdfSBram Moolenaar setlocal wrap 14987e25fdfSBram Moolenaar setlocal syntax=tar 15087e25fdfSBram Moolenaar 15187e25fdfSBram Moolenaar let l:tarfile = a:tarfile 15287e25fdfSBram Moolenaar let b:tarfile = l:tarfile 15387e25fdfSBram Moolenaar let l:cat = s:TarCatCommand(l:tarfile) 15487e25fdfSBram Moolenaar 15587e25fdfSBram Moolenaar if ! filereadable(l:tarfile) 15687e25fdfSBram Moolenaar let l:tarfile = substitute(l:tarfile, '^tarfile:', '', '') 15787e25fdfSBram Moolenaar endif 15887e25fdfSBram Moolenaar 15987e25fdfSBram Moolenaar if ! filereadable(l:tarfile) 160*ab194816SBram Moolenaar echo "***error*** (tar#Browse) File not readable:" l:tarfile 161*ab194816SBram Moolenaar" call Dret("tar#Browse") 16287e25fdfSBram Moolenaar return 16387e25fdfSBram Moolenaar endif 16487e25fdfSBram Moolenaar 165*ab194816SBram Moolenaar call s:Say("\" tar.vim version " . g:loaded_tar) 16687e25fdfSBram Moolenaar call s:Say("\" Browsing tarfile " . l:tarfile) 16787e25fdfSBram Moolenaar call s:Say("\" Hit ENTER to view a file in a new window") 16887e25fdfSBram Moolenaar call s:Say("") 16987e25fdfSBram Moolenaar 17087e25fdfSBram Moolenaar silent execute "r!" . l:cat . "<'" . l:tarfile . "'| tar Ptf - " 17187e25fdfSBram Moolenaar 0d "blank line 17287e25fdfSBram Moolenaar /^$/1 17387e25fdfSBram Moolenaar 174*ab194816SBram Moolenaar setlocal noma nomod ro 17587e25fdfSBram Moolenaar 176*ab194816SBram Moolenaar noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr> 177*ab194816SBram Moolenaar" call Dret("tar#Browse") 178*ab194816SBram Moolenaarendfun 179*ab194816SBram Moolenaar 180*ab194816SBram Moolenaar" --------------------------------------------------------------------- 181*ab194816SBram Moolenaar" TarBrowseSelect: {{{1 182*ab194816SBram Moolenaarfun! s:TarBrowseSelect() 18387e25fdfSBram Moolenaar let l:line = getline(".") 18487e25fdfSBram Moolenaar 18587e25fdfSBram Moolenaar if (l:line =~ '^" ') 18687e25fdfSBram Moolenaar return 18787e25fdfSBram Moolenaar endif 18887e25fdfSBram Moolenaar 18987e25fdfSBram Moolenaar if (l:line =~ '/$') 19087e25fdfSBram Moolenaar echo "Please specify a file, not a directory" 19187e25fdfSBram Moolenaar return 19287e25fdfSBram Moolenaar endif 19387e25fdfSBram Moolenaar 19487e25fdfSBram Moolenaar let l:selection = "tarfile:" . b:tarfile . "/" . l:line 19587e25fdfSBram Moolenaar new 19687e25fdfSBram Moolenaar wincmd _ 19787e25fdfSBram Moolenaar execute "e " . l:selection 198*ab194816SBram Moolenaarendfun 19987e25fdfSBram Moolenaar 200*ab194816SBram Moolenaar" --------------------------------------------------------------------- 201*ab194816SBram Moolenaar" TarCatCommand: kludge to deal with compressed archives {{{1 202*ab194816SBram Moolenaarfun! s:TarCatCommand(tarfile) 203*ab194816SBram Moolenaar" call Dfunc("s:TarCatCommand(tarfile<".a:tarfile.">)") 20487e25fdfSBram Moolenaar if a:tarfile =~# '\.\(gz\|tgz\|Z\)$' 20587e25fdfSBram Moolenaar let l:cat = "gzip -d -c" 20687e25fdfSBram Moolenaar elseif a:tarfile =~# '\.bz2$' 20787e25fdfSBram Moolenaar let l:cat = "bzip2 -d -c" 20887e25fdfSBram Moolenaar else 20987e25fdfSBram Moolenaar let l:cat = "cat" 21087e25fdfSBram Moolenaar endif 211*ab194816SBram Moolenaar" call Dret("s:TarCatCommand ".l:cat) 21287e25fdfSBram Moolenaar return l:cat 213*ab194816SBram Moolenaarendfun 21487e25fdfSBram Moolenaar 215*ab194816SBram Moolenaar" --------------------------------------------------------------------- 216*ab194816SBram Moolenaar" Say: {{{1 217*ab194816SBram Moolenaarfun! s:Say(string) 21887e25fdfSBram Moolenaar let @" = a:string 21987e25fdfSBram Moolenaar $ put 220*ab194816SBram Moolenaarendfun 221*ab194816SBram Moolenaar 222*ab194816SBram Moolenaar" --------------------------------------------------------------------- 223*ab194816SBram Moolenaar" Rmdir: {{{1 224*ab194816SBram Moolenaarfun! s:Rmdir(fname) 225*ab194816SBram Moolenaar" call Dfunc("Rmdir(fname<".a:fname.">)") 226*ab194816SBram Moolenaar if has("unix") 227*ab194816SBram Moolenaar call system("/bin/rm -rf ".a:fname) 228*ab194816SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16") 229*ab194816SBram Moolenaar if &shell =~? "sh$" 230*ab194816SBram Moolenaar call system("/bin/rm -rf ".a:fname) 231*ab194816SBram Moolenaar else 232*ab194816SBram Moolenaar call system("del /S ".a:fname) 233*ab194816SBram Moolenaar endif 234*ab194816SBram Moolenaar endif 235*ab194816SBram Moolenaar" call Dret("Rmdir") 236*ab194816SBram Moolenaarendfun 237*ab194816SBram Moolenaar 238*ab194816SBram Moolenaar" --------------------------------------------------------------------- 239*ab194816SBram Moolenaar" Modelines: {{{1 240*ab194816SBram Moolenaar" vim:set ts=8 sts=4 sw=4 fdm=marker: 241