557
|
1 " tar.vim: Handles browsing tarfiles
|
|
2 " AUTOLOAD PORTION
|
1125
|
3 " Date: Sep 29, 2006
|
|
4 " Version: 11
|
|
5 " Maintainer: Charles E Campbell, Jr <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
|
557
|
6 " License: Vim License (see vim's :help license)
|
446
|
7 "
|
557
|
8 " Contains many ideas from Michael Toren's <tar.vim>
|
446
|
9 "
|
557
|
10 " Copyright: Copyright (C) 2005 Charles E. Campbell, Jr. {{{1
|
|
11 " Permission is hereby granted to use and distribute this code,
|
|
12 " with or without modifications, provided that this copyright
|
|
13 " notice is copied with it. Like anything else that's free,
|
|
14 " tarPlugin.vim is provided *as is* and comes with no warranty
|
|
15 " of any kind, either expressed or implied. By using this
|
|
16 " plugin, you agree that in no event will the copyright
|
|
17 " holder be liable for any damages resulting from the use
|
|
18 " of this software.
|
|
19
|
|
20 " ---------------------------------------------------------------------
|
1125
|
21 " Load Once: {{{1
|
557
|
22 let s:keepcpo= &cpo
|
|
23 set cpo&vim
|
1125
|
24 if &cp || exists("g:loaded_tar") || v:version < 700
|
527
|
25 finish
|
|
26 endif
|
1125
|
27 let g:loaded_tar= "v11"
|
819
|
28 "call Decho("loading autoload/tar.vim")
|
557
|
29
|
|
30 " ---------------------------------------------------------------------
|
|
31 " Default Settings: {{{1
|
|
32 if !exists("g:tar_browseoptions")
|
|
33 let g:tar_browseoptions= "Ptf"
|
|
34 endif
|
|
35 if !exists("g:tar_readoptions")
|
|
36 let g:tar_readoptions= "OPxf"
|
|
37 endif
|
819
|
38 if !exists("g:tar_cmd")
|
|
39 let g:tar_cmd= "tar"
|
|
40 endif
|
557
|
41 if !exists("g:tar_writeoptions")
|
|
42 let g:tar_writeoptions= "uf"
|
|
43 endif
|
1125
|
44 if !exists("g:tar_shq")
|
|
45 if has("unix")
|
|
46 let g:tar_shq= "'"
|
|
47 else
|
|
48 let g:tar_shq= '"'
|
|
49 endif
|
|
50 endif
|
557
|
51
|
|
52 " ----------------
|
|
53 " Functions: {{{1
|
|
54 " ----------------
|
446
|
55
|
527
|
56 " ---------------------------------------------------------------------
|
557
|
57 " tar#Browse: {{{2
|
|
58 fun! tar#Browse(tarfile)
|
|
59 " call Dfunc("tar#Browse(tarfile<".a:tarfile.">)")
|
569
|
60 let repkeep= &report
|
|
61 set report=10
|
446
|
62
|
557
|
63 " sanity checks
|
819
|
64 if !executable(g:tar_cmd)
|
1125
|
65 redraw!
|
819
|
66 echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
|
1125
|
67 " call inputsave()|call input("Press <cr> to continue")|call inputrestore()
|
569
|
68 let &report= repkeep
|
557
|
69 " call Dret("tar#Browse")
|
|
70 return
|
|
71 endif
|
|
72 if !filereadable(a:tarfile)
|
819
|
73 " call Decho('a:tarfile<'.a:tarfile.'> not filereadable')
|
557
|
74 if a:tarfile !~# '^\a\+://'
|
|
75 " if its an url, don't complain, let url-handlers such as vim do its thing
|
1125
|
76 redraw!
|
557
|
77 echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None
|
1125
|
78 " call inputsave()|call input("Press <cr> to continue")|call inputrestore()
|
557
|
79 endif
|
569
|
80 let &report= repkeep
|
557
|
81 " call Dret("tar#Browse : file<".a:tarfile."> not readable")
|
|
82 return
|
|
83 endif
|
|
84 if &ma != 1
|
|
85 set ma
|
|
86 endif
|
|
87 let w:tarfile= a:tarfile
|
446
|
88
|
557
|
89 setlocal noswapfile
|
|
90 setlocal buftype=nofile
|
|
91 setlocal bufhidden=hide
|
|
92 setlocal nobuflisted
|
|
93 setlocal nowrap
|
|
94 set ft=tar
|
446
|
95
|
557
|
96 " give header
|
819
|
97 " call Decho("printing header")
|
557
|
98 exe "$put ='".'\"'." tar.vim version ".g:loaded_tar."'"
|
|
99 exe "$put ='".'\"'." Browsing tarfile ".a:tarfile."'"
|
|
100 exe "$put ='".'\"'." Select a file with cursor and press ENTER"."'"
|
|
101 0d
|
|
102 $
|
446
|
103
|
819
|
104 let tarfile= a:tarfile
|
|
105 if has("win32") && executable("cygpath")
|
|
106 " assuming cygwin
|
|
107 let tarfile=substitute(system("cygpath -u ".tarfile),'\n$','','e')
|
|
108 endif
|
857
|
109 let curlast= line("$")
|
819
|
110 if tarfile =~# '\.\(gz\|tgz\)$'
|
1125
|
111 " call Decho("exe silent r! gzip -d -c ".g:tar_shq.tarfile.g:tar_shq."| ".g:tar_cmd." -".g:tar_browseoptions." - ")
|
|
112 exe "silent r! gzip -d -c ".g:tar_shq.tarfile.g:tar_shq."| ".g:tar_cmd." -".g:tar_browseoptions." - "
|
819
|
113 elseif tarfile =~# '\.bz2$'
|
1125
|
114 " call Decho("exe silent r! bzip2 -d -c ".g:tar_shq.tarfile.g:tar_shq."| ".g:tar_cmd." -".g:tar_browseoptions." - ")
|
|
115 exe "silent r! bzip2 -d -c ".g:tar_shq.tarfile.g:tar_shq."| ".g:tar_cmd." -".g:tar_browseoptions." - "
|
557
|
116 else
|
1125
|
117 " call Decho("exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".g:tar_shq.tarfile.g:tar_shq)
|
|
118 exe "silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".g:tar_shq.tarfile.g:tar_shq
|
557
|
119 endif
|
819
|
120 if v:shell_error != 0
|
1125
|
121 redraw!
|
857
|
122 echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">"
|
1125
|
123 " call inputsave()|call input("Press <cr> to continue")|call inputrestore()
|
857
|
124 " call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
|
|
125 return
|
|
126 endif
|
1125
|
127 if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)')
|
|
128 redraw!
|
857
|
129 echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None
|
1125
|
130 " call inputsave()|call input("Press <cr> to continue")|call inputrestore()
|
857
|
131 silent %d
|
|
132 let eikeep= &ei
|
|
133 set ei=BufReadCmd,FileReadCmd
|
|
134 exe "r ".a:tarfile
|
|
135 let &ei= eikeep
|
|
136 1d
|
|
137 " call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
|
819
|
138 return
|
|
139 endif
|
446
|
140
|
557
|
141 setlocal noma nomod ro
|
|
142 noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
|
|
143
|
569
|
144 let &report= repkeep
|
557
|
145 " call Dret("tar#Browse : w:tarfile<".w:tarfile.">")
|
527
|
146 endfun
|
|
147
|
|
148 " ---------------------------------------------------------------------
|
557
|
149 " TarBrowseSelect: {{{2
|
|
150 fun! s:TarBrowseSelect()
|
|
151 " call Dfunc("TarBrowseSelect() w:tarfile<".w:tarfile."> curfile<".expand("%").">")
|
569
|
152 let repkeep= &report
|
|
153 set report=10
|
557
|
154 let fname= getline(".")
|
|
155 " call Decho("fname<".fname.">")
|
|
156
|
|
157 " sanity check
|
|
158 if fname =~ '^"'
|
569
|
159 let &report= repkeep
|
557
|
160 " call Dret("TarBrowseSelect")
|
|
161 return
|
|
162 endif
|
|
163
|
|
164 " about to make a new window, need to use w:tarfile
|
|
165 let tarfile= w:tarfile
|
|
166 let curfile= expand("%")
|
819
|
167 if has("win32") && executable("cygpath")
|
|
168 " assuming cygwin
|
|
169 let tarfile=substitute(system("cygpath -u ".tarfile),'\n$','','e')
|
|
170 endif
|
557
|
171
|
|
172 new
|
|
173 wincmd _
|
|
174 let s:tblfile_{winnr()}= curfile
|
819
|
175 call tar#Read("tarfile:".tarfile.':'.fname,1)
|
557
|
176 filetype detect
|
|
177
|
569
|
178 let &report= repkeep
|
557
|
179 " call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
|
|
180 endfun
|
|
181
|
|
182 " ---------------------------------------------------------------------
|
|
183 " tar#Read: {{{2
|
|
184 fun! tar#Read(fname,mode)
|
|
185 " call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")")
|
569
|
186 let repkeep= &report
|
|
187 set report=10
|
557
|
188 let tarfile = substitute(a:fname,'tarfile:\(.\{-}\):.*$','\1','')
|
|
189 let fname = substitute(a:fname,'tarfile:.\{-}:\(.*\)$','\1','')
|
819
|
190 if has("win32") && executable("cygpath")
|
|
191 " assuming cygwin
|
|
192 let tarfile=substitute(system("cygpath -u ".tarfile),'\n$','','e')
|
|
193 endif
|
|
194 " call Decho("tarfile<".tarfile.">")
|
|
195 " call Decho("fname<".fname.">")
|
557
|
196
|
|
197 if tarfile =~# '\.\(gz\|tgz\)$'
|
1125
|
198 " call Decho("exe silent r! gzip -d -c ".g:tar_shq.tarfile.g:tar_shq."| ".g:tar_cmd." -OPxf - '".fname."'")
|
|
199 exe "silent r! gzip -d -c ".g:tar_shq.tarfile.g:tar_shq."| ".g:tar_cmd." -".g:tar_readoptions." - '".fname."'"
|
624
|
200 elseif tarfile =~# '\.bz2$'
|
1125
|
201 " call Decho("exe silent r! bzip2 -d -c ".g:tar_shq.tarfile.g:tar_shq."| ".g:tar_cmd." -".g:tar_readoptions." - '".fname."'")
|
|
202 exe "silent r! bzip2 -d -c ".g:tar_shq.tarfile.g:tar_shq."| ".g:tar_cmd." -".g:tar_readoptions." - '".fname."'"
|
557
|
203 else
|
1125
|
204 " call Decho("exe silent r! ".g:tar_cmd." -".g:tar_readoptions." ".g:tar_shq.tarfile.g:tar_shq." ".g:tar_shq.fname.g:tar_shq)
|
|
205 exe "silent r! ".g:tar_cmd." -".g:tar_readoptions." ".g:tar_shq.tarfile.g:tar_shq." ".g:tar_shq.fname.g:tar_shq
|
557
|
206 endif
|
|
207 let w:tarfile= a:fname
|
|
208 exe "file tarfile:".fname
|
|
209
|
|
210 " cleanup
|
|
211 0d
|
|
212 set nomod
|
|
213
|
569
|
214 let &report= repkeep
|
557
|
215 " call Dret("tar#Read : w:tarfile<".w:tarfile.">")
|
|
216 endfun
|
|
217
|
|
218 " ---------------------------------------------------------------------
|
|
219 " tar#Write: {{{2
|
|
220 fun! tar#Write(fname)
|
|
221 " call Dfunc("tar#Write(fname<".a:fname.">) w:tarfile<".w:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
|
569
|
222 let repkeep= &report
|
|
223 set report=10
|
557
|
224
|
527
|
225 " sanity checks
|
819
|
226 if !executable(g:tar_cmd)
|
1125
|
227 redraw!
|
819
|
228 echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
|
1125
|
229 " call inputsave()|call input("Press <cr> to continue")|call inputrestore()
|
569
|
230 let &report= repkeep
|
527
|
231 " call Dret("tar#Write")
|
|
232 return
|
|
233 endif
|
|
234 if !exists("*mkdir")
|
1125
|
235 redraw!
|
557
|
236 echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None
|
1125
|
237 " call inputsave()|call input("Press <cr> to continue")|call inputrestore()
|
569
|
238 let &report= repkeep
|
527
|
239 " call Dret("tar#Write")
|
|
240 return
|
|
241 endif
|
|
242
|
|
243 let curdir= getcwd()
|
|
244 let tmpdir= tempname()
|
|
245 " call Decho("orig tempname<".tmpdir.">")
|
|
246 if tmpdir =~ '\.'
|
|
247 let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
|
|
248 endif
|
|
249 " call Decho("tmpdir<".tmpdir.">")
|
|
250 call mkdir(tmpdir,"p")
|
|
251
|
|
252 " attempt to change to the indicated directory
|
|
253 try
|
|
254 exe "cd ".escape(tmpdir,' \')
|
|
255 catch /^Vim\%((\a\+)\)\=:E344/
|
1125
|
256 redraw!
|
557
|
257 echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None
|
1125
|
258 " call inputsave()|call input("Press <cr> to continue")|call inputrestore()
|
569
|
259 let &report= repkeep
|
527
|
260 " call Dret("tar#Write")
|
|
261 return
|
|
262 endtry
|
|
263 " call Decho("current directory now: ".getcwd())
|
446
|
264
|
557
|
265 " place temporary files under .../_ZIPVIM_/
|
|
266 if isdirectory("_ZIPVIM_")
|
|
267 call s:Rmdir("_ZIPVIM_")
|
527
|
268 endif
|
557
|
269 call mkdir("_ZIPVIM_")
|
|
270 cd _ZIPVIM_
|
527
|
271 " call Decho("current directory now: ".getcwd())
|
|
272
|
557
|
273 let tarfile = substitute(w:tarfile,'tarfile:\(.\{-}\):.*$','\1','')
|
|
274 let fname = substitute(w:tarfile,'tarfile:.\{-}:\(.*\)$','\1','')
|
|
275
|
|
276 " handle compressed archives
|
|
277 if tarfile =~# '\.gz'
|
|
278 call system("gzip -d ".tarfile)
|
|
279 let tarfile = substitute(tarfile,'\.gz','','e')
|
|
280 let compress= "gzip '".tarfile."'"
|
|
281 elseif tarfile =~# '\.tgz'
|
|
282 call system("gzip -d ".tarfile)
|
|
283 let tarfile = substitute(tarfile,'\.tgz','.tar','e')
|
|
284 let compress= "gzip '".tarfile."'"
|
|
285 let tgz = 1
|
|
286 elseif tarfile =~# '\.bz2'
|
|
287 call system("bzip2 -d ".tarfile)
|
|
288 let tarfile = substitute(tarfile,'\.bz2','','e')
|
|
289 let compress= "bzip2 '".tarfile."'"
|
527
|
290 endif
|
|
291
|
|
292 if v:shell_error != 0
|
1125
|
293 redraw!
|
557
|
294 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
|
1125
|
295 " call inputsave()|call input("Press <cr> to continue")|call inputrestore()
|
527
|
296 else
|
557
|
297
|
|
298 " call Decho("tarfile<".tarfile."> fname<".fname.">")
|
|
299
|
624
|
300 if fname =~ '/'
|
|
301 let dirpath = substitute(fname,'/[^/]\+$','','e')
|
|
302 if executable("cygpath")
|
|
303 let dirpath = substitute(system("cygpath ".dirpath),'\n','','e')
|
|
304 endif
|
|
305 call mkdir(dirpath,"p")
|
|
306 endif
|
557
|
307 if tarfile !~ '/'
|
|
308 let tarfile= curdir.'/'.tarfile
|
|
309 endif
|
|
310 " call Decho("tarfile<".tarfile."> fname<".fname.">")
|
|
311
|
|
312 exe "w! ".fname
|
|
313 if executable("cygpath")
|
|
314 let tarfile = substitute(system("cygpath ".tarfile),'\n','','e')
|
|
315 endif
|
|
316
|
|
317 " delete old file from tarfile
|
|
318 " call Decho("tar --delete -f '".tarfile."' '".fname."'")
|
|
319 call system("tar --delete -f '".tarfile."' '".fname."'")
|
|
320 if v:shell_error != 0
|
1125
|
321 redraw!
|
557
|
322 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
|
1125
|
323 " call inputsave()|call input("Press <cr> to continue")|call inputrestore()
|
557
|
324 else
|
|
325
|
|
326 " update tarfile with new file
|
|
327 " call Decho("tar -".g:tar_writeoptions." '".tarfile."' '".fname."'")
|
|
328 call system("tar -".g:tar_writeoptions." '".tarfile."' '".fname."'")
|
|
329 if v:shell_error != 0
|
1125
|
330 redraw!
|
557
|
331 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
|
1125
|
332 " call inputsave()|call input("Press <cr> to continue")|call inputrestore()
|
557
|
333 elseif exists("compress")
|
|
334 " call Decho("call system(".compress.")")
|
|
335 call system(compress)
|
|
336 if exists("tgz")
|
|
337 " call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
|
|
338 call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
|
|
339 endif
|
|
340 endif
|
|
341 endif
|
|
342
|
|
343 " support writing tarfiles across a network
|
|
344 if s:tblfile_{winnr()} =~ '^\a\+://'
|
|
345 " call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
|
|
346 let tblfile= s:tblfile_{winnr()}
|
|
347 1split|enew
|
|
348 let binkeep= &binary
|
|
349 let eikeep = &ei
|
|
350 set binary ei=all
|
|
351 exe "e! ".tarfile
|
|
352 call netrw#NetWrite(tblfile)
|
|
353 let &ei = eikeep
|
|
354 let &binary = binkeep
|
|
355 q!
|
|
356 unlet s:tblfile_{winnr()}
|
|
357 endif
|
527
|
358 endif
|
|
359
|
|
360 " cleanup and restore current directory
|
|
361 cd ..
|
557
|
362 call s:Rmdir("_ZIPVIM_")
|
527
|
363 exe "cd ".escape(curdir,' \')
|
|
364 setlocal nomod
|
|
365
|
569
|
366 let &report= repkeep
|
527
|
367 " call Dret("tar#Write")
|
|
368 endfun
|
|
369
|
|
370 " ---------------------------------------------------------------------
|
557
|
371 " Rmdir: {{{2
|
527
|
372 fun! s:Rmdir(fname)
|
|
373 " call Dfunc("Rmdir(fname<".a:fname.">)")
|
|
374 if has("unix")
|
|
375 call system("/bin/rm -rf ".a:fname)
|
|
376 elseif has("win32") || has("win95") || has("win64") || has("win16")
|
|
377 if &shell =~? "sh$"
|
|
378 call system("/bin/rm -rf ".a:fname)
|
|
379 else
|
|
380 call system("del /S ".a:fname)
|
|
381 endif
|
|
382 endif
|
|
383 " call Dret("Rmdir")
|
|
384 endfun
|
|
385
|
557
|
386 " ------------------------------------------------------------------------
|
|
387 " Modelines And Restoration: {{{1
|
|
388 let &cpo= s:keepcpo
|
|
389 unlet s:keepcpo
|
1125
|
390 " vim:ts=8 fdm=marker
|