forked from aniani/vim
		
	
		
			
				
	
	
		
			186 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
" vim:set ts=4 sw=4 ai nobackup:
 | 
						|
 | 
						|
" tar.vim -- a vim plugin for browsing tarfiles
 | 
						|
" Copyright (c) 2002, Michael C. Toren <mct@toren.net>
 | 
						|
"
 | 
						|
" Updates are available from <http://michael.toren.net/code/>.  If you
 | 
						|
" find this script useful, or have suggestions for improvements, please
 | 
						|
" let me know.
 | 
						|
"
 | 
						|
" Usage:
 | 
						|
" Once this script is installed, attempting to edit a tarfile will present
 | 
						|
" the user with a list of files contained in the tar archive.  By moving the
 | 
						|
" cursor over a filename and pressing ENTER, the contents of a file can be
 | 
						|
" viewed in read-only mode, in a new window.  Unfortunately, write support
 | 
						|
" for tarfile components is not currently possible.
 | 
						|
" 
 | 
						|
" Requirements:
 | 
						|
" GNU tar, or a tar implementation that supports the "P" (don't strip
 | 
						|
" out leading /'s from filenames), and "O" (extract files to standard
 | 
						|
" output) options.  Additionally, gzip is required for handling *.tar.Z,
 | 
						|
" *.tar.gz, and *.tgz compressed tarfiles, and bzip2 is required for
 | 
						|
" handling *.tar.bz2 compressed tarfiles.  A unix-like operating system
 | 
						|
" is probably also required.
 | 
						|
" 
 | 
						|
" Installation:
 | 
						|
" Place this file, tar.vim, in your $HOME/.vim/plugin directory, and
 | 
						|
" either restart vim, or execute ":source $HOME/.vim/plugin/tar.vim"
 | 
						|
"
 | 
						|
" Todo:
 | 
						|
" - Handle zipfiles?
 | 
						|
" - Implement write support, somehow.
 | 
						|
"
 | 
						|
" License:
 | 
						|
" This program is free software; you can redistribute it and/or modify it
 | 
						|
" under the terms of the GNU General Public License, version 2, as published
 | 
						|
" by the Free Software Foundation.
 | 
						|
"
 | 
						|
" This program is distributed in the hope that it will be useful, but
 | 
						|
" WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 | 
						|
" or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 | 
						|
" for more details.
 | 
						|
"
 | 
						|
" A copy of the GNU GPL is available as /usr/doc/copyright/GPL on Debian
 | 
						|
" systems, or on the World Wide Web at http://www.gnu.org/copyleft/gpl.html
 | 
						|
" You can also obtain it by writing to the Free Software Foundation, Inc.,
 | 
						|
" 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 | 
						|
"
 | 
						|
" Changelog:
 | 
						|
" Tue Dec 31 13:38:08 EST 2002	First release to beta testers
 | 
						|
" Sat Jan  4 14:06:19 EST 2003	Version 1.00 released
 | 
						|
 | 
						|
let s:version = "1.00"
 | 
						|
 | 
						|
if has("autocmd")
 | 
						|
augroup tar
 | 
						|
	au!
 | 
						|
	au BufReadCmd	tarfile:*	call s:TarRead(expand("<afile>"), 1)
 | 
						|
	au BufReadCmd	tarfile:*/*	call s:TarRead(expand("<afile>"), 1)
 | 
						|
	au FileReadCmd	tarfile:*	call s:TarRead(expand("<afile>"), 0)
 | 
						|
	au FileReadCmd	tarfile:*/*	call s:TarRead(expand("<afile>"), 0)
 | 
						|
 | 
						|
	au BufWriteCmd	tarfile:*	call s:TarWrite(expand("<afile>"))
 | 
						|
	au BufWriteCmd	tarfile:*/*	call s:TarWrite(expand("<afile>"))
 | 
						|
	au FileWriteCmd	tarfile:*	call s:TarWrite(expand("<afile>"))
 | 
						|
	au FileWriteCmd	tarfile:*/*	call s:TarWrite(expand("<afile>"))
 | 
						|
 | 
						|
	au BufReadCmd	*.tar		call s:TarBrowse(expand("<afile>"))
 | 
						|
	au BufReadCmd	*.tar.gz	call s:TarBrowse(expand("<afile>"))
 | 
						|
	au BufReadCmd	*.tar.bz2	call s:TarBrowse(expand("<afile>"))
 | 
						|
	au BufReadCmd	*.tar.Z		call s:TarBrowse(expand("<afile>"))
 | 
						|
	au BufReadCmd	*.tgz		call s:TarBrowse(expand("<afile>"))
 | 
						|
augroup END
 | 
						|
endif
 | 
						|
 | 
						|
function! s:TarWrite(argument)
 | 
						|
	echo "ERROR: Sorry, no write support for tarfiles yet"
 | 
						|
endfunction
 | 
						|
 | 
						|
function! s:TarRead(argument, cleanup)
 | 
						|
	let l:argument = a:argument
 | 
						|
	let l:argument = substitute(l:argument, '^tarfile:', '', '')
 | 
						|
	let l:argument = substitute(l:argument, '^\~', $HOME, '')
 | 
						|
 | 
						|
	let l:tarfile = l:argument
 | 
						|
	while 1
 | 
						|
		if (l:tarfile == "" || l:tarfile == "/")
 | 
						|
			echo "ERROR: Could not find a readable tarfile in path:" l:argument
 | 
						|
			return
 | 
						|
		endif
 | 
						|
 | 
						|
		if filereadable(l:tarfile) " found it!
 | 
						|
			break
 | 
						|
		endif
 | 
						|
 | 
						|
		let l:tarfile = fnamemodify(l:tarfile, ":h")
 | 
						|
	endwhile
 | 
						|
 | 
						|
	let l:toextract = strpart(l:argument, strlen(l:tarfile) + 1)
 | 
						|
 | 
						|
	if (l:toextract == "")
 | 
						|
		return
 | 
						|
	endif
 | 
						|
 | 
						|
	let l:cat = s:TarCatCommand(l:tarfile)
 | 
						|
	execute "r !" . l:cat . " < '" . l:tarfile . "'"
 | 
						|
		\ " | tar OPxf - '" . l:toextract . "'"
 | 
						|
 | 
						|
	if (a:cleanup)
 | 
						|
		0d "blank line
 | 
						|
		execute "doautocmd BufReadPost " . expand("%")
 | 
						|
		setlocal readonly
 | 
						|
		silent preserve
 | 
						|
	endif
 | 
						|
endfunction
 | 
						|
 | 
						|
function! s:TarBrowse(tarfile)
 | 
						|
	setlocal noswapfile
 | 
						|
	setlocal buftype=nofile
 | 
						|
	setlocal bufhidden=hide
 | 
						|
	setlocal filetype=
 | 
						|
	setlocal nobuflisted
 | 
						|
	setlocal buftype=nofile
 | 
						|
	setlocal wrap
 | 
						|
 | 
						|
	let l:tarfile = a:tarfile
 | 
						|
	let b:tarfile = l:tarfile
 | 
						|
	let l:cat = s:TarCatCommand(l:tarfile)
 | 
						|
 | 
						|
	if ! filereadable(l:tarfile)
 | 
						|
		let l:tarfile = substitute(l:tarfile, '^tarfile:', '', '')
 | 
						|
	endif
 | 
						|
 | 
						|
	if ! filereadable(l:tarfile)
 | 
						|
		echo "ERROR: File not readable:" l:tarfile
 | 
						|
		return
 | 
						|
	endif
 | 
						|
 | 
						|
	call s:Say("\" tar.vim version " . s:version)
 | 
						|
	call s:Say("\" Browsing tarfile " . l:tarfile)
 | 
						|
	call s:Say("\" Hit ENTER to view contents in new window")
 | 
						|
	call s:Say("")
 | 
						|
 | 
						|
	silent execute "r!" . l:cat . "<'" . l:tarfile . "'| tar Ptf - "
 | 
						|
	0d "blank line
 | 
						|
	/^$/1
 | 
						|
 | 
						|
	setlocal readonly
 | 
						|
	setlocal nomodifiable
 | 
						|
	noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
 | 
						|
endfunction
 | 
						|
 | 
						|
function! s:TarBrowseSelect()
 | 
						|
	let l:line = getline(".")
 | 
						|
 | 
						|
	if (l:line =~ '^" ')
 | 
						|
		return
 | 
						|
	endif
 | 
						|
 | 
						|
	if (l:line =~ '/$')
 | 
						|
		echo "Please specify a file, not a directory"
 | 
						|
		return
 | 
						|
	endif
 | 
						|
 | 
						|
	let l:selection = "tarfile:" .  b:tarfile . "/" . l:line
 | 
						|
	new
 | 
						|
	wincmd _
 | 
						|
	execute "e " . l:selection
 | 
						|
endfunction
 | 
						|
 | 
						|
" kludge to deal with compressed archives
 | 
						|
function! s:TarCatCommand(tarfile)
 | 
						|
	if a:tarfile =~# '\.\(gz\|tgz\|Z\)$'
 | 
						|
		let l:cat = "gzip -d -c"
 | 
						|
	elseif a:tarfile =~# '\.bz2$'
 | 
						|
		let l:cat = "bzip2 -d -c"
 | 
						|
	else
 | 
						|
		let l:cat = "cat"
 | 
						|
	endif
 | 
						|
	return l:cat
 | 
						|
endfunction
 | 
						|
 | 
						|
function! s:Say(string)
 | 
						|
	let @" = a:string
 | 
						|
	$ put
 | 
						|
endfunction
 |