xref: /vim-8.2.3635/runtime/autoload/tar.vim (revision ab194816)
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