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