1*87e25fdfSBram Moolenaar" vim:set ts=8 sts=4 sw=4: 2*87e25fdfSBram Moolenaar" 3*87e25fdfSBram Moolenaar" tar.vim -- a Vim plugin for browsing tarfiles 4*87e25fdfSBram Moolenaar" Copyright (c) 2002, Michael C. Toren <[email protected]> 5*87e25fdfSBram Moolenaar" Distributed under the GNU General Public License. 6*87e25fdfSBram Moolenaar" 7*87e25fdfSBram Moolenaar" Version: 1.01 8*87e25fdfSBram Moolenaar" Last Change: 2005 Jul 26 9*87e25fdfSBram Moolenaar" 10*87e25fdfSBram Moolenaar" Updates are available from <http://michael.toren.net/code/>. If you 11*87e25fdfSBram Moolenaar" find this script useful, or have suggestions for improvements, please 12*87e25fdfSBram Moolenaar" let me know. 13*87e25fdfSBram Moolenaar" Also look there for further comments and documentation. 14*87e25fdfSBram Moolenaar" 15*87e25fdfSBram Moolenaar" This part defines the functions. The autocommands are in plugin/tar.vim. 16*87e25fdfSBram Moolenaar 17*87e25fdfSBram Moolenaarlet s:version = "1.01" 18*87e25fdfSBram Moolenaar 19*87e25fdfSBram Moolenaarfunction! tar#Write(argument) 20*87e25fdfSBram Moolenaar echo "ERROR: Sorry, no write support for tarfiles yet" 21*87e25fdfSBram Moolenaarendfunction 22*87e25fdfSBram Moolenaar 23*87e25fdfSBram Moolenaarfunction! tar#Read(argument, cleanup) 24*87e25fdfSBram Moolenaar let l:argument = a:argument 25*87e25fdfSBram Moolenaar let l:argument = substitute(l:argument, '^tarfile:', '', '') 26*87e25fdfSBram Moolenaar let l:argument = substitute(l:argument, '^\~', $HOME, '') 27*87e25fdfSBram Moolenaar 28*87e25fdfSBram Moolenaar let l:tarfile = l:argument 29*87e25fdfSBram Moolenaar while 1 30*87e25fdfSBram Moolenaar if (l:tarfile == "" || l:tarfile == "/") 31*87e25fdfSBram Moolenaar echo "ERROR: Could not find a readable tarfile in path:" l:argument 32*87e25fdfSBram Moolenaar return 33*87e25fdfSBram Moolenaar endif 34*87e25fdfSBram Moolenaar 35*87e25fdfSBram Moolenaar if filereadable(l:tarfile) " found it! 36*87e25fdfSBram Moolenaar break 37*87e25fdfSBram Moolenaar endif 38*87e25fdfSBram Moolenaar 39*87e25fdfSBram Moolenaar let l:tarfile = fnamemodify(l:tarfile, ":h") 40*87e25fdfSBram Moolenaar endwhile 41*87e25fdfSBram Moolenaar 42*87e25fdfSBram Moolenaar let l:toextract = strpart(l:argument, strlen(l:tarfile) + 1) 43*87e25fdfSBram Moolenaar 44*87e25fdfSBram Moolenaar if (l:toextract == "") 45*87e25fdfSBram Moolenaar return 46*87e25fdfSBram Moolenaar endif 47*87e25fdfSBram Moolenaar 48*87e25fdfSBram Moolenaar let l:cat = s:TarCatCommand(l:tarfile) 49*87e25fdfSBram Moolenaar execute "r !" . l:cat . " < '" . l:tarfile . "'" 50*87e25fdfSBram Moolenaar \ " | tar OPxf - '" . l:toextract . "'" 51*87e25fdfSBram Moolenaar 52*87e25fdfSBram Moolenaar if (a:cleanup) 53*87e25fdfSBram Moolenaar 0d "blank line 54*87e25fdfSBram Moolenaar execute "doautocmd BufReadPost " . expand("%") 55*87e25fdfSBram Moolenaar setlocal readonly 56*87e25fdfSBram Moolenaar silent preserve 57*87e25fdfSBram Moolenaar endif 58*87e25fdfSBram Moolenaarendfunction 59*87e25fdfSBram Moolenaar 60*87e25fdfSBram Moolenaarfunction! tar#Browse(tarfile) 61*87e25fdfSBram Moolenaar setlocal noswapfile 62*87e25fdfSBram Moolenaar setlocal buftype=nofile 63*87e25fdfSBram Moolenaar setlocal bufhidden=hide 64*87e25fdfSBram Moolenaar setlocal filetype= 65*87e25fdfSBram Moolenaar setlocal nobuflisted 66*87e25fdfSBram Moolenaar setlocal buftype=nofile 67*87e25fdfSBram Moolenaar setlocal wrap 68*87e25fdfSBram Moolenaar setlocal syntax=tar 69*87e25fdfSBram Moolenaar 70*87e25fdfSBram Moolenaar let l:tarfile = a:tarfile 71*87e25fdfSBram Moolenaar let b:tarfile = l:tarfile 72*87e25fdfSBram Moolenaar let l:cat = s:TarCatCommand(l:tarfile) 73*87e25fdfSBram Moolenaar 74*87e25fdfSBram Moolenaar if ! filereadable(l:tarfile) 75*87e25fdfSBram Moolenaar let l:tarfile = substitute(l:tarfile, '^tarfile:', '', '') 76*87e25fdfSBram Moolenaar endif 77*87e25fdfSBram Moolenaar 78*87e25fdfSBram Moolenaar if ! filereadable(l:tarfile) 79*87e25fdfSBram Moolenaar echo "ERROR: File not readable:" l:tarfile 80*87e25fdfSBram Moolenaar return 81*87e25fdfSBram Moolenaar endif 82*87e25fdfSBram Moolenaar 83*87e25fdfSBram Moolenaar call s:Say("\" tar.vim version " . s:version) 84*87e25fdfSBram Moolenaar call s:Say("\" Browsing tarfile " . l:tarfile) 85*87e25fdfSBram Moolenaar call s:Say("\" Hit ENTER to view a file in a new window") 86*87e25fdfSBram Moolenaar call s:Say("") 87*87e25fdfSBram Moolenaar 88*87e25fdfSBram Moolenaar silent execute "r!" . l:cat . "<'" . l:tarfile . "'| tar Ptf - " 89*87e25fdfSBram Moolenaar 0d "blank line 90*87e25fdfSBram Moolenaar /^$/1 91*87e25fdfSBram Moolenaar 92*87e25fdfSBram Moolenaar setlocal readonly 93*87e25fdfSBram Moolenaar setlocal nomodifiable 94*87e25fdfSBram Moolenaar noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr> 95*87e25fdfSBram Moolenaarendfunction 96*87e25fdfSBram Moolenaar 97*87e25fdfSBram Moolenaarfunction! s:TarBrowseSelect() 98*87e25fdfSBram Moolenaar let l:line = getline(".") 99*87e25fdfSBram Moolenaar 100*87e25fdfSBram Moolenaar if (l:line =~ '^" ') 101*87e25fdfSBram Moolenaar return 102*87e25fdfSBram Moolenaar endif 103*87e25fdfSBram Moolenaar 104*87e25fdfSBram Moolenaar if (l:line =~ '/$') 105*87e25fdfSBram Moolenaar echo "Please specify a file, not a directory" 106*87e25fdfSBram Moolenaar return 107*87e25fdfSBram Moolenaar endif 108*87e25fdfSBram Moolenaar 109*87e25fdfSBram Moolenaar let l:selection = "tarfile:" . b:tarfile . "/" . l:line 110*87e25fdfSBram Moolenaar new 111*87e25fdfSBram Moolenaar wincmd _ 112*87e25fdfSBram Moolenaar execute "e " . l:selection 113*87e25fdfSBram Moolenaarendfunction 114*87e25fdfSBram Moolenaar 115*87e25fdfSBram Moolenaar" kludge to deal with compressed archives 116*87e25fdfSBram Moolenaarfunction! s:TarCatCommand(tarfile) 117*87e25fdfSBram Moolenaar if a:tarfile =~# '\.\(gz\|tgz\|Z\)$' 118*87e25fdfSBram Moolenaar let l:cat = "gzip -d -c" 119*87e25fdfSBram Moolenaar elseif a:tarfile =~# '\.bz2$' 120*87e25fdfSBram Moolenaar let l:cat = "bzip2 -d -c" 121*87e25fdfSBram Moolenaar else 122*87e25fdfSBram Moolenaar let l:cat = "cat" 123*87e25fdfSBram Moolenaar endif 124*87e25fdfSBram Moolenaar return l:cat 125*87e25fdfSBram Moolenaarendfunction 126*87e25fdfSBram Moolenaar 127*87e25fdfSBram Moolenaarfunction! s:Say(string) 128*87e25fdfSBram Moolenaar let @" = a:string 129*87e25fdfSBram Moolenaar $ put 130*87e25fdfSBram Moolenaarendfunction 131