Mercurial > vim
annotate runtime/autoload/tar.vim @ 19000:8a0f02d2c9a0
Added tag v8.2.0060 for changeset 6fb11e7fb9cdcb4b16599a4298208fe4583c13fe
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 30 Dec 2019 18:00:04 +0100 |
parents | ba010fa2bcba |
children | 1a951a4beee3 |
rev | line source |
---|---|
557 | 1 " tar.vim: Handles browsing tarfiles |
2 " AUTOLOAD PORTION | |
4339 | 3 " Date: Apr 17, 2013 |
4 " Version: 29 | |
5 " Maintainer: Charles E Campbell <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 " |
4339 | 10 " Copyright: Copyright (C) 2005-2011 Charles E. Campbell {{{1 |
557 | 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, | |
1624 | 14 " tar.vim and tarPlugin.vim are provided *as is* and comes |
15 " with no warranty of any kind, either expressed or implied. | |
16 " By using this plugin, you agree that in no event will the | |
17 " copyright holder be liable for any damages resulting from | |
18 " the use of this software. | |
2034 | 19 " call inputsave()|call input("Press <cr> to continue")|call inputrestore() |
557 | 20 " --------------------------------------------------------------------- |
1125 | 21 " Load Once: {{{1 |
2034 | 22 if &cp || exists("g:loaded_tar") |
23 finish | |
24 endif | |
4339 | 25 let g:loaded_tar= "v29" |
2034 | 26 if v:version < 702 |
27 echohl WarningMsg | |
28 echo "***warning*** this version of tar needs vim 7.2" | |
29 echohl Normal | |
30 finish | |
31 endif | |
557 | 32 let s:keepcpo= &cpo |
33 set cpo&vim | |
4339 | 34 "DechoTabOn |
819 | 35 "call Decho("loading autoload/tar.vim") |
557 | 36 |
37 " --------------------------------------------------------------------- | |
38 " Default Settings: {{{1 | |
39 if !exists("g:tar_browseoptions") | |
40 let g:tar_browseoptions= "Ptf" | |
41 endif | |
42 if !exists("g:tar_readoptions") | |
43 let g:tar_readoptions= "OPxf" | |
44 endif | |
819 | 45 if !exists("g:tar_cmd") |
46 let g:tar_cmd= "tar" | |
47 endif | |
557 | 48 if !exists("g:tar_writeoptions") |
49 let g:tar_writeoptions= "uf" | |
50 endif | |
2908 | 51 if !exists("g:netrw_cygwin") |
52 if has("win32") || has("win95") || has("win64") || has("win16") | |
53 if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$' | |
54 let g:netrw_cygwin= 1 | |
55 else | |
56 let g:netrw_cygwin= 0 | |
57 endif | |
58 else | |
59 let g:netrw_cygwin= 0 | |
60 endif | |
61 endif | |
2034 | 62 if !exists("g:tar_copycmd") |
63 if !exists("g:netrw_localcopycmd") | |
64 if has("win32") || has("win95") || has("win64") || has("win16") | |
65 if g:netrw_cygwin | |
66 let g:netrw_localcopycmd= "cp" | |
67 else | |
68 let g:netrw_localcopycmd= "copy" | |
69 endif | |
70 elseif has("unix") || has("macunix") | |
71 let g:netrw_localcopycmd= "cp" | |
72 else | |
73 let g:netrw_localcopycmd= "" | |
74 endif | |
75 endif | |
76 let g:tar_copycmd= g:netrw_localcopycmd | |
77 endif | |
78 if !exists("g:tar_extractcmd") | |
79 let g:tar_extractcmd= "tar -xf" | |
80 endif | |
1624 | 81 |
82 " set up shell quoting character | |
1125 | 83 if !exists("g:tar_shq") |
4339 | 84 if exists("+shq") && exists("&shq") && &shq != "" |
1624 | 85 let g:tar_shq= &shq |
86 elseif has("win32") || has("win95") || has("win64") || has("win16") | |
87 if exists("g:netrw_cygwin") && g:netrw_cygwin | |
88 let g:tar_shq= "'" | |
89 else | |
90 let g:tar_shq= '"' | |
91 endif | |
92 else | |
1125 | 93 let g:tar_shq= "'" |
94 endif | |
1624 | 95 " call Decho("g:tar_shq<".g:tar_shq.">") |
1125 | 96 endif |
557 | 97 |
98 " ---------------- | |
99 " Functions: {{{1 | |
100 " ---------------- | |
446 | 101 |
527 | 102 " --------------------------------------------------------------------- |
557 | 103 " tar#Browse: {{{2 |
104 fun! tar#Browse(tarfile) | |
105 " call Dfunc("tar#Browse(tarfile<".a:tarfile.">)") | |
569 | 106 let repkeep= &report |
107 set report=10 | |
446 | 108 |
557 | 109 " sanity checks |
819 | 110 if !executable(g:tar_cmd) |
1125 | 111 redraw! |
819 | 112 echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' |
569 | 113 let &report= repkeep |
557 | 114 " call Dret("tar#Browse") |
115 return | |
116 endif | |
117 if !filereadable(a:tarfile) | |
819 | 118 " call Decho('a:tarfile<'.a:tarfile.'> not filereadable') |
557 | 119 if a:tarfile !~# '^\a\+://' |
10228
8a1481e59d64
commit https://github.com/vim/vim/commit/3e496b0ea31996b665824f45664dee1fdd73c4d0
Christian Brabandt <cb@256bit.org>
parents:
4339
diff
changeset
|
120 " if it's an url, don't complain, let url-handlers such as vim do its thing |
1125 | 121 redraw! |
557 | 122 echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None |
123 endif | |
569 | 124 let &report= repkeep |
557 | 125 " call Dret("tar#Browse : file<".a:tarfile."> not readable") |
126 return | |
127 endif | |
128 if &ma != 1 | |
129 set ma | |
130 endif | |
2535
31e51111bd14
Runtime file updates. Fix tar plugin window split.
Bram Moolenaar <bram@vim.org>
parents:
2426
diff
changeset
|
131 let b:tarfile= a:tarfile |
446 | 132 |
557 | 133 setlocal noswapfile |
134 setlocal buftype=nofile | |
135 setlocal bufhidden=hide | |
136 setlocal nobuflisted | |
137 setlocal nowrap | |
138 set ft=tar | |
446 | 139 |
557 | 140 " give header |
819 | 141 " call Decho("printing header") |
1624 | 142 let lastline= line("$") |
143 call setline(lastline+1,'" tar.vim version '.g:loaded_tar) | |
144 call setline(lastline+2,'" Browsing tarfile '.a:tarfile) | |
145 call setline(lastline+3,'" Select a file with cursor and press ENTER') | |
2908 | 146 keepj $put ='' |
3281 | 147 keepj sil! 0d |
2908 | 148 keepj $ |
446 | 149 |
819 | 150 let tarfile= a:tarfile |
4339 | 151 if has("win32unix") && executable("cygpath") |
819 | 152 " assuming cygwin |
2034 | 153 let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') |
819 | 154 endif |
14668 | 155 |
857 | 156 let curlast= line("$") |
819 | 157 if tarfile =~# '\.\(gz\|tgz\)$' |
14679
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
158 let gzip_command = s:get_gzip_command(tarfile) |
2034 | 159 " call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") |
14668 | 160 exe "sil! r! " . gzip_command . " -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " |
1624 | 161 elseif tarfile =~# '\.lrp' |
2034 | 162 " call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ") |
14679
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
163 exe "sil! r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - " |
3281 | 164 elseif tarfile =~# '\.\(bz2\|tbz\|tb2\)$' |
2034 | 165 " call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") |
2908 | 166 exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " |
3281 | 167 elseif tarfile =~# '\.\(lzma\|tlz\)$' |
2034 | 168 " call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") |
2908 | 169 exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " |
2426 | 170 elseif tarfile =~# '\.\(xz\|txz\)$' |
171 " call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") | |
2908 | 172 exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " |
557 | 173 else |
1702 | 174 if tarfile =~ '^\s*-' |
2034 | 175 " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. |
1702 | 176 let tarfile = substitute(tarfile, '-', './-', '') |
177 endif | |
2034 | 178 " call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0)) |
2908 | 179 exe "sil! r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1) |
557 | 180 endif |
819 | 181 if v:shell_error != 0 |
1125 | 182 redraw! |
857 | 183 echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">" |
184 " call Dret("tar#Browse : a:tarfile<".a:tarfile.">") | |
185 return | |
186 endif | |
1125 | 187 if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)') |
188 redraw! | |
857 | 189 echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None |
2908 | 190 keepj sil! %d |
857 | 191 let eikeep= &ei |
192 set ei=BufReadCmd,FileReadCmd | |
1668 | 193 exe "r ".fnameescape(a:tarfile) |
857 | 194 let &ei= eikeep |
2908 | 195 keepj sil! 1d |
857 | 196 " call Dret("tar#Browse : a:tarfile<".a:tarfile.">") |
819 | 197 return |
198 endif | |
446 | 199 |
557 | 200 setlocal noma nomod ro |
201 noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr> | |
202 | |
569 | 203 let &report= repkeep |
2535
31e51111bd14
Runtime file updates. Fix tar plugin window split.
Bram Moolenaar <bram@vim.org>
parents:
2426
diff
changeset
|
204 " call Dret("tar#Browse : b:tarfile<".b:tarfile.">") |
527 | 205 endfun |
206 | |
207 " --------------------------------------------------------------------- | |
557 | 208 " TarBrowseSelect: {{{2 |
209 fun! s:TarBrowseSelect() | |
2535
31e51111bd14
Runtime file updates. Fix tar plugin window split.
Bram Moolenaar <bram@vim.org>
parents:
2426
diff
changeset
|
210 " call Dfunc("TarBrowseSelect() b:tarfile<".b:tarfile."> curfile<".expand("%").">") |
569 | 211 let repkeep= &report |
212 set report=10 | |
557 | 213 let fname= getline(".") |
214 " call Decho("fname<".fname.">") | |
215 | |
1702 | 216 if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-' |
217 redraw! | |
2034 | 218 echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"' |
1702 | 219 " call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"') |
220 return | |
221 endif | |
222 | |
557 | 223 " sanity check |
224 if fname =~ '^"' | |
569 | 225 let &report= repkeep |
557 | 226 " call Dret("TarBrowseSelect") |
227 return | |
228 endif | |
229 | |
2535
31e51111bd14
Runtime file updates. Fix tar plugin window split.
Bram Moolenaar <bram@vim.org>
parents:
2426
diff
changeset
|
230 " about to make a new window, need to use b:tarfile |
31e51111bd14
Runtime file updates. Fix tar plugin window split.
Bram Moolenaar <bram@vim.org>
parents:
2426
diff
changeset
|
231 let tarfile= b:tarfile |
557 | 232 let curfile= expand("%") |
4339 | 233 if has("win32unix") && executable("cygpath") |
819 | 234 " assuming cygwin |
2034 | 235 let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') |
819 | 236 endif |
557 | 237 |
238 new | |
1624 | 239 if !exists("g:tar_nomax") || g:tar_nomax == 0 |
240 wincmd _ | |
241 endif | |
557 | 242 let s:tblfile_{winnr()}= curfile |
1624 | 243 call tar#Read("tarfile:".tarfile.'::'.fname,1) |
557 | 244 filetype detect |
4339 | 245 set nomod |
246 exe 'com! -buffer -nargs=? -complete=file TarDiff :call tar#Diff(<q-args>,"'.fnameescape(fname).'")' | |
557 | 247 |
569 | 248 let &report= repkeep |
557 | 249 " call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">") |
250 endfun | |
251 | |
252 " --------------------------------------------------------------------- | |
253 " tar#Read: {{{2 | |
254 fun! tar#Read(fname,mode) | |
255 " call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")") | |
569 | 256 let repkeep= &report |
257 set report=10 | |
1624 | 258 let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','') |
259 let fname = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','') | |
4339 | 260 if has("win32unix") && executable("cygpath") |
819 | 261 " assuming cygwin |
2034 | 262 let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') |
819 | 263 endif |
264 " call Decho("tarfile<".tarfile.">") | |
265 " call Decho("fname<".fname.">") | |
557 | 266 |
2034 | 267 if fname =~ '\.bz2$' && executable("bzcat") |
268 let decmp= "|bzcat" | |
269 let doro = 1 | |
270 elseif fname =~ '\.gz$' && executable("zcat") | |
1624 | 271 let decmp= "|zcat" |
272 let doro = 1 | |
2034 | 273 elseif fname =~ '\.lzma$' && executable("lzcat") |
274 let decmp= "|lzcat" | |
1624 | 275 let doro = 1 |
2426 | 276 elseif fname =~ '\.xz$' && executable("xzcat") |
277 let decmp= "|xzcat" | |
278 let doro = 1 | |
1624 | 279 else |
280 let decmp="" | |
281 let doro = 0 | |
2426 | 282 if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.xz$\|\.zip$\|\.Z$' |
1624 | 283 setlocal bin |
284 endif | |
285 endif | |
286 | |
1702 | 287 if exists("g:tar_secure") |
288 let tar_secure= " -- " | |
289 else | |
290 let tar_secure= " " | |
291 endif | |
14668 | 292 |
2034 | 293 if tarfile =~# '\.bz2$' |
294 " call Decho("7: exe silent r! bzip2 -d -c ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp) | |
2908 | 295 exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp |
2034 | 296 elseif tarfile =~# '\.\(gz\|tgz\)$' |
14679
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
297 let gzip_command = s:get_gzip_command(tarfile) |
2034 | 298 " call Decho("5: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.tar_secure.shellescape(fname,1)) |
14668 | 299 exe "sil! r! " . gzip_command . " -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp |
1624 | 300 elseif tarfile =~# '\.lrp$' |
2034 | 301 " call Decho("6: exe silent r! cat ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp) |
14679
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
302 exe "sil! r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp |
2034 | 303 elseif tarfile =~# '\.lzma$' |
304 " call Decho("7: exe silent r! lzma -d -c ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp) | |
2908 | 305 exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp |
2426 | 306 elseif tarfile =~# '\.\(xz\|txz\)$' |
307 " call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp) | |
2908 | 308 exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp |
557 | 309 else |
1702 | 310 if tarfile =~ '^\s*-' |
2034 | 311 " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. |
1702 | 312 let tarfile = substitute(tarfile, '-', './-', '') |
313 endif | |
2034 | 314 " call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions.tar_secure.shellescape(tarfile,1)." ".shellescape(fname,1).decmp) |
315 exe "silent r! ".g:tar_cmd." -".g:tar_readoptions.shellescape(tarfile,1)." ".tar_secure.shellescape(fname,1).decmp | |
557 | 316 endif |
1624 | 317 |
318 if doro | |
319 " because the reverse process of compressing changed files back into the tarball is not currently supported | |
320 setlocal ro | |
321 endif | |
322 | |
2535
31e51111bd14
Runtime file updates. Fix tar plugin window split.
Bram Moolenaar <bram@vim.org>
parents:
2426
diff
changeset
|
323 let b:tarfile= a:fname |
1668 | 324 exe "file tarfile::".fnameescape(fname) |
557 | 325 |
326 " cleanup | |
2908 | 327 keepj sil! 0d |
557 | 328 set nomod |
329 | |
569 | 330 let &report= repkeep |
2535
31e51111bd14
Runtime file updates. Fix tar plugin window split.
Bram Moolenaar <bram@vim.org>
parents:
2426
diff
changeset
|
331 " call Dret("tar#Read : b:tarfile<".b:tarfile.">") |
557 | 332 endfun |
333 | |
334 " --------------------------------------------------------------------- | |
335 " tar#Write: {{{2 | |
336 fun! tar#Write(fname) | |
2535
31e51111bd14
Runtime file updates. Fix tar plugin window split.
Bram Moolenaar <bram@vim.org>
parents:
2426
diff
changeset
|
337 " call Dfunc("tar#Write(fname<".a:fname.">) b:tarfile<".b:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">") |
569 | 338 let repkeep= &report |
339 set report=10 | |
557 | 340 |
1702 | 341 if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-' |
342 redraw! | |
2034 | 343 echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"' |
1702 | 344 " call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"') |
345 return | |
346 endif | |
347 | |
527 | 348 " sanity checks |
819 | 349 if !executable(g:tar_cmd) |
1125 | 350 redraw! |
819 | 351 echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' |
569 | 352 let &report= repkeep |
527 | 353 " call Dret("tar#Write") |
354 return | |
355 endif | |
356 if !exists("*mkdir") | |
1125 | 357 redraw! |
557 | 358 echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None |
569 | 359 let &report= repkeep |
527 | 360 " call Dret("tar#Write") |
361 return | |
362 endif | |
363 | |
364 let curdir= getcwd() | |
365 let tmpdir= tempname() | |
366 " call Decho("orig tempname<".tmpdir.">") | |
367 if tmpdir =~ '\.' | |
368 let tmpdir= substitute(tmpdir,'\.[^.]*$','','e') | |
369 endif | |
370 " call Decho("tmpdir<".tmpdir.">") | |
371 call mkdir(tmpdir,"p") | |
372 | |
373 " attempt to change to the indicated directory | |
374 try | |
1624 | 375 exe "cd ".fnameescape(tmpdir) |
527 | 376 catch /^Vim\%((\a\+)\)\=:E344/ |
1125 | 377 redraw! |
557 | 378 echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None |
569 | 379 let &report= repkeep |
527 | 380 " call Dret("tar#Write") |
381 return | |
382 endtry | |
383 " call Decho("current directory now: ".getcwd()) | |
446 | 384 |
557 | 385 " place temporary files under .../_ZIPVIM_/ |
386 if isdirectory("_ZIPVIM_") | |
387 call s:Rmdir("_ZIPVIM_") | |
527 | 388 endif |
557 | 389 call mkdir("_ZIPVIM_") |
390 cd _ZIPVIM_ | |
527 | 391 " call Decho("current directory now: ".getcwd()) |
392 | |
2535
31e51111bd14
Runtime file updates. Fix tar plugin window split.
Bram Moolenaar <bram@vim.org>
parents:
2426
diff
changeset
|
393 let tarfile = substitute(b:tarfile,'tarfile:\(.\{-}\)::.*$','\1','') |
31e51111bd14
Runtime file updates. Fix tar plugin window split.
Bram Moolenaar <bram@vim.org>
parents:
2426
diff
changeset
|
394 let fname = substitute(b:tarfile,'tarfile:.\{-}::\(.*\)$','\1','') |
557 | 395 |
14668 | 396 let gzip_command = s:get_gzip_command(tarfile) |
397 | |
557 | 398 " handle compressed archives |
2034 | 399 if tarfile =~# '\.bz2' |
400 call system("bzip2 -d -- ".shellescape(tarfile,0)) | |
401 let tarfile = substitute(tarfile,'\.bz2','','e') | |
402 let compress= "bzip2 -- ".shellescape(tarfile,0) | |
403 " call Decho("compress<".compress.">") | |
404 elseif tarfile =~# '\.gz' | |
14668 | 405 call system(gzip_command . " -d -- ".shellescape(tarfile,0)) |
557 | 406 let tarfile = substitute(tarfile,'\.gz','','e') |
2034 | 407 let compress= "gzip -- ".shellescape(tarfile,0) |
408 " call Decho("compress<".compress.">") | |
557 | 409 elseif tarfile =~# '\.tgz' |
14668 | 410 call system(gzip_command . " -d -- ".shellescape(tarfile,0)) |
557 | 411 let tarfile = substitute(tarfile,'\.tgz','.tar','e') |
2034 | 412 let compress= "gzip -- ".shellescape(tarfile,0) |
557 | 413 let tgz = 1 |
1702 | 414 " call Decho("compress<".compress.">") |
2426 | 415 elseif tarfile =~# '\.xz' |
416 call system("xz -d -- ".shellescape(tarfile,0)) | |
417 let tarfile = substitute(tarfile,'\.xz','','e') | |
418 let compress= "xz -- ".shellescape(tarfile,0) | |
419 " call Decho("compress<".compress.">") | |
420 elseif tarfile =~# '\.lzma' | |
421 call system("lzma -d -- ".shellescape(tarfile,0)) | |
422 let tarfile = substitute(tarfile,'\.lzma','','e') | |
423 let compress= "lzma -- ".shellescape(tarfile,0) | |
424 " call Decho("compress<".compress.">") | |
527 | 425 endif |
1624 | 426 " call Decho("tarfile<".tarfile.">") |
527 | 427 |
428 if v:shell_error != 0 | |
1125 | 429 redraw! |
557 | 430 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None |
527 | 431 else |
557 | 432 |
433 " call Decho("tarfile<".tarfile."> fname<".fname.">") | |
434 | |
624 | 435 if fname =~ '/' |
436 let dirpath = substitute(fname,'/[^/]\+$','','e') | |
4339 | 437 if has("win32unix") && executable("cygpath") |
2034 | 438 let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e') |
624 | 439 endif |
440 call mkdir(dirpath,"p") | |
441 endif | |
557 | 442 if tarfile !~ '/' |
443 let tarfile= curdir.'/'.tarfile | |
444 endif | |
1702 | 445 if tarfile =~ '^\s*-' |
446 " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that. | |
447 let tarfile = substitute(tarfile, '-', './-', '') | |
448 endif | |
557 | 449 " call Decho("tarfile<".tarfile."> fname<".fname.">") |
450 | |
1702 | 451 if exists("g:tar_secure") |
452 let tar_secure= " -- " | |
453 else | |
454 let tar_secure= " " | |
455 endif | |
1624 | 456 exe "w! ".fnameescape(fname) |
4339 | 457 if has("win32unix") && executable("cygpath") |
2034 | 458 let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e') |
557 | 459 endif |
460 | |
461 " delete old file from tarfile | |
2034 | 462 " call Decho("system(".g:tar_cmd." --delete -f ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")") |
463 call system(g:tar_cmd." --delete -f ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) | |
557 | 464 if v:shell_error != 0 |
1125 | 465 redraw! |
1624 | 466 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None |
557 | 467 else |
468 | |
469 " update tarfile with new file | |
2034 | 470 " call Decho(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) |
471 call system(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) | |
557 | 472 if v:shell_error != 0 |
1125 | 473 redraw! |
1624 | 474 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None |
557 | 475 elseif exists("compress") |
476 " call Decho("call system(".compress.")") | |
477 call system(compress) | |
478 if exists("tgz") | |
479 " call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")") | |
480 call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e')) | |
481 endif | |
482 endif | |
483 endif | |
484 | |
485 " support writing tarfiles across a network | |
486 if s:tblfile_{winnr()} =~ '^\a\+://' | |
487 " call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">") | |
488 let tblfile= s:tblfile_{winnr()} | |
489 1split|enew | |
2034 | 490 let binkeep= &l:binary |
557 | 491 let eikeep = &ei |
492 set binary ei=all | |
1668 | 493 exe "e! ".fnameescape(tarfile) |
557 | 494 call netrw#NetWrite(tblfile) |
2034 | 495 let &ei = eikeep |
496 let &l:binary = binkeep | |
557 | 497 q! |
498 unlet s:tblfile_{winnr()} | |
499 endif | |
527 | 500 endif |
501 | |
502 " cleanup and restore current directory | |
503 cd .. | |
557 | 504 call s:Rmdir("_ZIPVIM_") |
1668 | 505 exe "cd ".fnameescape(curdir) |
527 | 506 setlocal nomod |
507 | |
569 | 508 let &report= repkeep |
527 | 509 " call Dret("tar#Write") |
510 endfun | |
511 | |
512 " --------------------------------------------------------------------- | |
4339 | 513 " tar#Diff: {{{2 |
514 fun! tar#Diff(userfname,fname) | |
515 " call Dfunc("tar#Diff(userfname<".a:userfname."> fname<".a:fname.")") | |
516 let fname= a:fname | |
517 if a:userfname != "" | |
518 let fname= a:userfname | |
519 endif | |
520 if filereadable(fname) | |
521 " sets current file (from tarball) for diff'ing | |
522 " splits window vertically | |
523 " opens original file, sets it for diff'ing | |
524 " sets up b:tardiff_otherbuf variables so each buffer knows about the other (for closing purposes) | |
525 diffthis | |
526 wincmd v | |
527 exe "e ".fnameescape(fname) | |
528 diffthis | |
529 else | |
530 redraw! | |
531 echo "***warning*** unable to read file<".fname.">" | |
532 endif | |
533 " call Dret("tar#Diff") | |
534 endfun | |
535 | |
536 " --------------------------------------------------------------------- | |
2034 | 537 " s:Rmdir: {{{2 |
527 | 538 fun! s:Rmdir(fname) |
539 " call Dfunc("Rmdir(fname<".a:fname.">)") | |
540 if has("unix") | |
2034 | 541 call system("/bin/rm -rf -- ".shellescape(a:fname,0)) |
527 | 542 elseif has("win32") || has("win95") || has("win64") || has("win16") |
543 if &shell =~? "sh$" | |
2034 | 544 call system("/bin/rm -rf -- ".shellescape(a:fname,0)) |
527 | 545 else |
2034 | 546 call system("del /S ".shellescape(a:fname,0)) |
527 | 547 endif |
548 endif | |
549 " call Dret("Rmdir") | |
550 endfun | |
551 | |
1624 | 552 " --------------------------------------------------------------------- |
2034 | 553 " tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2 |
554 fun! tar#Vimuntar(...) | |
555 " call Dfunc("tar#Vimuntar() a:0=".a:0." a:1<".(exists("a:1")? a:1 : "-n/a-").">") | |
556 let tarball = expand("%") | |
557 " call Decho("tarball<".tarball.">") | |
558 let tarbase = substitute(tarball,'\..*$','','') | |
559 " call Decho("tarbase<".tarbase.">") | |
560 let tarhome = expand("%:p") | |
561 if has("win32") || has("win95") || has("win64") || has("win16") | |
562 let tarhome= substitute(tarhome,'\\','/','g') | |
563 endif | |
564 let tarhome= substitute(tarhome,'/[^/]*$','','') | |
565 " call Decho("tarhome<".tarhome.">") | |
566 let tartail = expand("%:t") | |
567 " call Decho("tartail<".tartail.">") | |
568 let curdir = getcwd() | |
569 " call Decho("curdir <".curdir.">") | |
570 " set up vimhome | |
571 if a:0 > 0 && a:1 != "" | |
572 let vimhome= a:1 | |
573 else | |
574 let vimhome= vimball#VimballHome() | |
575 endif | |
576 " call Decho("vimhome<".vimhome.">") | |
577 | |
578 " call Decho("curdir<".curdir."> vimhome<".vimhome.">") | |
579 if simplify(curdir) != simplify(vimhome) | |
580 " copy (possibly compressed) tarball to .vim/vimfiles | |
581 " call Decho(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome)) | |
582 call system(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome)) | |
583 " call Decho("exe cd ".fnameescape(vimhome)) | |
584 exe "cd ".fnameescape(vimhome) | |
585 endif | |
586 " call Decho("getcwd<".getcwd().">") | |
587 | |
588 " if necessary, decompress the tarball; then, extract it | |
589 if tartail =~ '\.tgz' | |
14679
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
590 let gzip_command = s:get_gzip_command(tarfile) |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
591 if executable(gzip_command) |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
592 silent exe "!" . gzip_command . " -d ".shellescape(tartail) |
14668 | 593 elseif executable("gunzip") |
2034 | 594 silent exe "!gunzip ".shellescape(tartail) |
595 elseif executable("gzip") | |
596 silent exe "!gzip -d ".shellescape(tartail) | |
1668 | 597 else |
2034 | 598 echoerr "unable to decompress<".tartail."> on this sytem" |
599 if simplify(curdir) != simplify(tarhome) | |
600 " remove decompressed tarball, restore directory | |
601 " call Decho("delete(".tartail.".tar)") | |
602 call delete(tartail.".tar") | |
603 " call Decho("exe cd ".fnameescape(curdir)) | |
604 exe "cd ".fnameescape(curdir) | |
605 endif | |
606 " call Dret("tar#Vimuntar") | |
607 return | |
1668 | 608 endif |
1624 | 609 else |
2034 | 610 call vimball#Decompress(tartail,0) |
1624 | 611 endif |
2034 | 612 let extractcmd= netrw#WinPath(g:tar_extractcmd) |
613 " call Decho("system(".extractcmd." ".shellescape(tarbase.".tar").")") | |
614 call system(extractcmd." ".shellescape(tarbase.".tar")) | |
615 | |
616 " set up help | |
617 if filereadable("doc/".tarbase.".txt") | |
618 " call Decho("exe helptags ".getcwd()."/doc") | |
619 exe "helptags ".getcwd()."/doc" | |
620 endif | |
621 | |
622 if simplify(tarhome) != simplify(vimhome) | |
623 " remove decompressed tarball, restore directory | |
624 call delete(vimhome."/".tarbase.".tar") | |
625 exe "cd ".fnameescape(curdir) | |
626 endif | |
627 | |
628 " call Dret("tar#Vimuntar") | |
1624 | 629 endfun |
630 | |
14668 | 631 func s:get_gzip_command(file) |
14679
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
632 " Try using the "file" command to get the actual compression type, since |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
633 " there is no standard way for the naming: ".tgz", ".tbz", ".txz", etc. |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
634 " If the "file" command doesn't work fall back to just using the file name. |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
635 if a:file =~# 'z$' |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
636 let filetype = system('file ' . a:file) |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
637 if filetype =~ 'bzip2 compressed' && executable('bzip2') |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
638 return 'bzip2' |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
639 endif |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
640 if filetype =~ 'XZ compressed' && executable('xz') |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
641 return 'xz' |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
642 endif |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
643 endif |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
644 if a:file =~# 'bz2$' |
14668 | 645 return 'bzip2' |
646 endif | |
14679
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
647 if a:file =~# 'xz$' |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
648 return 'xz' |
ba010fa2bcba
patch 8.1.0352: browsing compressed tar files does not always work
Christian Brabandt <cb@256bit.org>
parents:
14668
diff
changeset
|
649 endif |
14668 | 650 return 'gzip' |
651 endfunc | |
652 | |
2034 | 653 " ===================================================================== |
557 | 654 " Modelines And Restoration: {{{1 |
655 let &cpo= s:keepcpo | |
656 unlet s:keepcpo | |
1624 | 657 " vim:ts=8 fdm=marker |