1" tar.vim: Handles browsing tarfiles 2" AUTOLOAD PORTION 3" Date: Jan 07, 2020 4" Version: 32 5" Maintainer: Charles E Campbell <[email protected]> 6" License: Vim License (see vim's :help license) 7" 8" Contains many ideas from Michael Toren's <tar.vim> 9" 10" Copyright: Copyright (C) 2005-2017 Charles E. Campbell {{{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" 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. 19" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 20" --------------------------------------------------------------------- 21" Load Once: {{{1 22if &cp || exists("g:loaded_tar") 23 finish 24endif 25let g:loaded_tar= "v32" 26if v:version < 702 27 echohl WarningMsg 28 echo "***warning*** this version of tar needs vim 7.2" 29 echohl Normal 30 finish 31endif 32let s:keepcpo= &cpo 33set cpo&vim 34"DechoTabOn 35"call Decho("loading autoload/tar.vim") 36 37" --------------------------------------------------------------------- 38" Default Settings: {{{1 39if !exists("g:tar_browseoptions") 40 let g:tar_browseoptions= "Ptf" 41endif 42if !exists("g:tar_readoptions") 43 let g:tar_readoptions= "OPxf" 44endif 45if !exists("g:tar_cmd") 46 let g:tar_cmd= "tar" 47endif 48if !exists("g:tar_writeoptions") 49 let g:tar_writeoptions= "uf" 50endif 51if !exists("g:tar_delfile") 52 let g:tar_delfile="--delete -f" 53endif 54if !exists("g:netrw_cygwin") 55 if has("win32") || has("win95") || has("win64") || has("win16") 56 if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$' 57 let g:netrw_cygwin= 1 58 else 59 let g:netrw_cygwin= 0 60 endif 61 else 62 let g:netrw_cygwin= 0 63 endif 64endif 65if !exists("g:tar_copycmd") 66 if !exists("g:netrw_localcopycmd") 67 if has("win32") || has("win95") || has("win64") || has("win16") 68 if g:netrw_cygwin 69 let g:netrw_localcopycmd= "cp" 70 else 71 let g:netrw_localcopycmd= "copy" 72 endif 73 elseif has("unix") || has("macunix") 74 let g:netrw_localcopycmd= "cp" 75 else 76 let g:netrw_localcopycmd= "" 77 endif 78 endif 79 let g:tar_copycmd= g:netrw_localcopycmd 80endif 81if !exists("g:tar_extractcmd") 82 let g:tar_extractcmd= "tar -xf" 83endif 84 85" set up shell quoting character 86if !exists("g:tar_shq") 87 if exists("+shq") && exists("&shq") && &shq != "" 88 let g:tar_shq= &shq 89 elseif has("win32") || has("win95") || has("win64") || has("win16") 90 if exists("g:netrw_cygwin") && g:netrw_cygwin 91 let g:tar_shq= "'" 92 else 93 let g:tar_shq= '"' 94 endif 95 else 96 let g:tar_shq= "'" 97 endif 98" call Decho("g:tar_shq<".g:tar_shq.">") 99endif 100 101" ---------------- 102" Functions: {{{1 103" ---------------- 104 105" --------------------------------------------------------------------- 106" tar#Browse: {{{2 107fun! tar#Browse(tarfile) 108" call Dfunc("tar#Browse(tarfile<".a:tarfile.">)") 109 let repkeep= &report 110 set report=10 111 112 " sanity checks 113 if !executable(g:tar_cmd) 114 redraw! 115" call Decho('***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system') 116 echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' 117 let &report= repkeep 118" call Dret("tar#Browse") 119 return 120 endif 121 if !filereadable(a:tarfile) 122" call Decho('a:tarfile<'.a:tarfile.'> not filereadable') 123 if a:tarfile !~# '^\a\+://' 124 " if it's an url, don't complain, let url-handlers such as vim do its thing 125 redraw! 126" call Decho("***error*** (tar#Browse) File not readable<".a:tarfile.">") 127 echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None 128 endif 129 let &report= repkeep 130" call Dret("tar#Browse : file<".a:tarfile."> not readable") 131 return 132 endif 133 if &ma != 1 134 set ma 135 endif 136 let b:tarfile= a:tarfile 137 138 setlocal noswapfile 139 setlocal buftype=nofile 140 setlocal bufhidden=hide 141 setlocal nobuflisted 142 setlocal nowrap 143 set ft=tar 144 145 " give header 146" call Decho("printing header") 147 let lastline= line("$") 148 call setline(lastline+1,'" tar.vim version '.g:loaded_tar) 149 call setline(lastline+2,'" Browsing tarfile '.a:tarfile) 150 call setline(lastline+3,'" Select a file with cursor and press ENTER') 151 keepj $put ='' 152 keepj sil! 0d 153 keepj $ 154 155 let tarfile= a:tarfile 156 if has("win32unix") && executable("cygpath") 157 " assuming cygwin 158 let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 159 endif 160 let curlast= line("$") 161 162 if tarfile =~# '\.\(gz\)$' 163" call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 164 exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 165 166 elseif tarfile =~# '\.\(tgz\)$' || tarfile =~# '\.\(tbz\)$' || tarfile =~# '\.\(txz\)$' 167 if has("unix") && executable("file") 168 let filekind= system("file ".shellescape(tarfile,1)) =~ "bzip2" 169 else 170 let filekind= "" 171 endif 172 173 if filekind =~ "bzip2" 174 exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 175 elseif filekind =~ "XZ" 176 exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 177 else 178 exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 179 endif 180 181 elseif tarfile =~# '\.lrp' 182" call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ") 183 exe "sil! r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - " 184 elseif tarfile =~# '\.\(bz2\|tbz\|tb2\)$' 185" call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 186 exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 187 elseif tarfile =~# '\.\(lzma\|tlz\)$' 188" call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 189 exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 190 elseif tarfile =~# '\.\(xz\|txz\)$' 191" call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 192 exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 193 else 194 if tarfile =~ '^\s*-' 195 " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. 196 let tarfile = substitute(tarfile, '-', './-', '') 197 endif 198" call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0)) 199 exe "sil! r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1) 200 endif 201 if v:shell_error != 0 202 redraw! 203 echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">" 204" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 205 return 206 endif 207 if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~# '\c\%(warning\|error\|inappropriate\|unrecognized\)') 208 redraw! 209 echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None 210 keepj sil! %d 211 let eikeep= &ei 212 set ei=BufReadCmd,FileReadCmd 213 exe "r ".fnameescape(a:tarfile) 214 let &ei= eikeep 215 keepj sil! 1d 216" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 217 return 218 endif 219 220 " set up maps supported for tar 221 setlocal noma nomod ro 222 noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr> 223 noremap <silent> <buffer> x :call tar#Extract()<cr> 224 if &mouse != "" 225 noremap <silent> <buffer> <leftmouse> <leftmouse>:call <SID>TarBrowseSelect()<cr> 226 endif 227 228 let &report= repkeep 229" call Dret("tar#Browse : b:tarfile<".b:tarfile.">") 230endfun 231 232" --------------------------------------------------------------------- 233" TarBrowseSelect: {{{2 234fun! s:TarBrowseSelect() 235" call Dfunc("TarBrowseSelect() b:tarfile<".b:tarfile."> curfile<".expand("%").">") 236 let repkeep= &report 237 set report=10 238 let fname= getline(".") 239" call Decho("fname<".fname.">") 240 241 if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-' 242 redraw! 243 echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"' 244" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"') 245 return 246 endif 247 248 " sanity check 249 if fname =~ '^"' 250 let &report= repkeep 251" call Dret("TarBrowseSelect") 252 return 253 endif 254 255 " about to make a new window, need to use b:tarfile 256 let tarfile= b:tarfile 257 let curfile= expand("%") 258 if has("win32unix") && executable("cygpath") 259 " assuming cygwin 260 let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 261 endif 262 263 " open a new window (tar#Read will read a file into it) 264 noswapfile new 265 if !exists("g:tar_nomax") || g:tar_nomax == 0 266 wincmd _ 267 endif 268 let s:tblfile_{winnr()}= curfile 269 call tar#Read("tarfile:".tarfile.'::'.fname,1) 270 filetype detect 271 set nomod 272 exe 'com! -buffer -nargs=? -complete=file TarDiff :call tar#Diff(<q-args>,"'.fnameescape(fname).'")' 273 274 let &report= repkeep 275" call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 276endfun 277 278" --------------------------------------------------------------------- 279" tar#Read: {{{2 280fun! tar#Read(fname,mode) 281" call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")") 282 let repkeep= &report 283 set report=10 284 let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','') 285 let fname = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','') 286 if has("win32unix") && executable("cygpath") 287 " assuming cygwin 288 let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 289 endif 290" call Decho("tarfile<".tarfile.">") 291" call Decho("fname<".fname.">") 292 293 if fname =~ '\.bz2$' && executable("bzcat") 294 let decmp= "|bzcat" 295 let doro = 1 296 elseif fname =~ '\.t\=gz$' && executable("zcat") 297 let decmp= "|zcat" 298 let doro = 1 299 elseif fname =~ '\.lzma$' && executable("lzcat") 300 let decmp= "|lzcat" 301 let doro = 1 302 elseif fname =~ '\.xz$' && executable("xzcat") 303 let decmp= "|xzcat" 304 let doro = 1 305 else 306 let decmp="" 307 let doro = 0 308 if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.xz$\|\.zip$\|\.Z$' 309 setlocal bin 310 endif 311 endif 312 313 if exists("g:tar_secure") 314 let tar_secure= " -- " 315 else 316 let tar_secure= " " 317 endif 318 319 if tarfile =~# '\.bz2$' 320 exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 321 elseif tarfile =~# '\.\(gz\)$' 322 exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 323 324 elseif tarfile =~# '\(\.tgz\|\.tbz\|\.txz\)' 325 if has("unix") && executable("file") 326 let filekind= system("file ".shellescape(tarfile,1)) 327 else 328 let filekind= "" 329 endif 330 if filekind =~ "bzip2" 331 exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 332 elseif filekind =~ "XZ" 333 exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 334 else 335 exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 336 endif 337 338 elseif tarfile =~# '\.lrp$' 339 exe "sil! r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 340 elseif tarfile =~# '\.lzma$' 341 exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 342 elseif tarfile =~# '\.\(xz\|txz\)$' 343 exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 344 else 345 if tarfile =~ '^\s*-' 346 " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. 347 let tarfile = substitute(tarfile, '-', './-', '') 348 endif 349" call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions.tar_secure.shellescape(tarfile,1)." ".shellescape(fname,1).decmp) 350 exe "silent r! ".g:tar_cmd." -".g:tar_readoptions.shellescape(tarfile,1)." ".tar_secure.shellescape(fname,1).decmp 351 endif 352 353 if doro 354 " because the reverse process of compressing changed files back into the tarball is not currently supported 355 setlocal ro 356 endif 357 358 let b:tarfile= a:fname 359 exe "file tarfile::".fnameescape(fname) 360 361 " cleanup 362 keepj sil! 0d 363 set nomod 364 365 let &report= repkeep 366" call Dret("tar#Read : b:tarfile<".b:tarfile.">") 367endfun 368 369" --------------------------------------------------------------------- 370" tar#Write: {{{2 371fun! tar#Write(fname) 372" call Dfunc("tar#Write(fname<".a:fname.">) b:tarfile<".b:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 373 let repkeep= &report 374 set report=10 375 376 if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-' 377 redraw! 378 echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"' 379" call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"') 380 return 381 endif 382 383 " sanity checks 384 if !executable(g:tar_cmd) 385 redraw! 386" call Decho('***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system') 387 let &report= repkeep 388" call Dret("tar#Write") 389 return 390 endif 391 if !exists("*mkdir") 392 redraw! 393" call Decho("***error*** (tar#Write) sorry, mkdir() doesn't work on your system") 394 echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None 395 let &report= repkeep 396" call Dret("tar#Write") 397 return 398 endif 399 400 let curdir= getcwd() 401 let tmpdir= tempname() 402" call Decho("orig tempname<".tmpdir.">") 403 if tmpdir =~ '\.' 404 let tmpdir= substitute(tmpdir,'\.[^.]*$','','e') 405 endif 406" call Decho("tmpdir<".tmpdir.">") 407 call mkdir(tmpdir,"p") 408 409 " attempt to change to the indicated directory 410 try 411 exe "cd ".fnameescape(tmpdir) 412 catch /^Vim\%((\a\+)\)\=:E344/ 413 redraw! 414" call Decho("***error*** (tar#Write) cannot cd to temporary directory") 415 echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None 416 let &report= repkeep 417" call Dret("tar#Write") 418 return 419 endtry 420" call Decho("current directory now: ".getcwd()) 421 422 " place temporary files under .../_ZIPVIM_/ 423 if isdirectory("_ZIPVIM_") 424 call s:Rmdir("_ZIPVIM_") 425 endif 426 call mkdir("_ZIPVIM_") 427 cd _ZIPVIM_ 428" call Decho("current directory now: ".getcwd()) 429 430 let tarfile = substitute(b:tarfile,'tarfile:\(.\{-}\)::.*$','\1','') 431 let fname = substitute(b:tarfile,'tarfile:.\{-}::\(.*\)$','\1','') 432 433 " handle compressed archives 434 if tarfile =~# '\.bz2' 435 call system("bzip2 -d -- ".shellescape(tarfile,0)) 436 let tarfile = substitute(tarfile,'\.bz2','','e') 437 let compress= "bzip2 -- ".shellescape(tarfile,0) 438" call Decho("compress<".compress.">") 439 elseif tarfile =~# '\.gz' 440 call system("gzip -d -- ".shellescape(tarfile,0)) 441 let tarfile = substitute(tarfile,'\.gz','','e') 442 let compress= "gzip -- ".shellescape(tarfile,0) 443" call Decho("compress<".compress.">") 444 elseif tarfile =~# '\.tgz' 445 call system("gzip -d -- ".shellescape(tarfile,0)) 446 let tarfile = substitute(tarfile,'\.tgz','.tar','e') 447 let compress= "gzip -- ".shellescape(tarfile,0) 448 let tgz = 1 449" call Decho("compress<".compress.">") 450 elseif tarfile =~# '\.xz' 451 call system("xz -d -- ".shellescape(tarfile,0)) 452 let tarfile = substitute(tarfile,'\.xz','','e') 453 let compress= "xz -- ".shellescape(tarfile,0) 454" call Decho("compress<".compress.">") 455 elseif tarfile =~# '\.lzma' 456 call system("lzma -d -- ".shellescape(tarfile,0)) 457 let tarfile = substitute(tarfile,'\.lzma','','e') 458 let compress= "lzma -- ".shellescape(tarfile,0) 459" call Decho("compress<".compress.">") 460 endif 461" call Decho("tarfile<".tarfile.">") 462 463 if v:shell_error != 0 464 redraw! 465" call Decho("***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname) 466 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None 467 else 468 469" call Decho("tarfile<".tarfile."> fname<".fname.">") 470 471 if fname =~ '/' 472 let dirpath = substitute(fname,'/[^/]\+$','','e') 473 if has("win32unix") && executable("cygpath") 474 let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e') 475 endif 476 call mkdir(dirpath,"p") 477 endif 478 if tarfile !~ '/' 479 let tarfile= curdir.'/'.tarfile 480 endif 481 if tarfile =~ '^\s*-' 482 " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that. 483 let tarfile = substitute(tarfile, '-', './-', '') 484 endif 485" call Decho("tarfile<".tarfile."> fname<".fname.">") 486 487 if exists("g:tar_secure") 488 let tar_secure= " -- " 489 else 490 let tar_secure= " " 491 endif 492 exe "w! ".fnameescape(fname) 493 if has("win32unix") && executable("cygpath") 494 let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e') 495 endif 496 497 " delete old file from tarfile 498" call Decho("system(".g:tar_cmd." ".g:tar_delfile." ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")") 499 call system(g:tar_cmd." ".g:tar_delfile." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 500 if v:shell_error != 0 501 redraw! 502" call Decho("***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname)) 503 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 504 else 505 506 " update tarfile with new file 507" call Decho(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 508 call system(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 509 if v:shell_error != 0 510 redraw! 511" call Decho("***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname)) 512 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 513 elseif exists("compress") 514" call Decho("call system(".compress.")") 515 call system(compress) 516 if exists("tgz") 517" call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")") 518 call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e')) 519 endif 520 endif 521 endif 522 523 " support writing tarfiles across a network 524 if s:tblfile_{winnr()} =~ '^\a\+://' 525" call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">") 526 let tblfile= s:tblfile_{winnr()} 527 1split|noswapfile enew 528 let binkeep= &l:binary 529 let eikeep = &ei 530 set binary ei=all 531 exe "noswapfile e! ".fnameescape(tarfile) 532 call netrw#NetWrite(tblfile) 533 let &ei = eikeep 534 let &l:binary = binkeep 535 q! 536 unlet s:tblfile_{winnr()} 537 endif 538 endif 539 540 " cleanup and restore current directory 541 cd .. 542 call s:Rmdir("_ZIPVIM_") 543 exe "cd ".fnameescape(curdir) 544 setlocal nomod 545 546 let &report= repkeep 547" call Dret("tar#Write") 548endfun 549 550" --------------------------------------------------------------------- 551" tar#Diff: {{{2 552fun! tar#Diff(userfname,fname) 553" call Dfunc("tar#Diff(userfname<".a:userfname."> fname<".a:fname.")") 554 let fname= a:fname 555 if a:userfname != "" 556 let fname= a:userfname 557 endif 558 if filereadable(fname) 559 " sets current file (from tarball) for diff'ing 560 " splits window vertically 561 " opens original file, sets it for diff'ing 562 " sets up b:tardiff_otherbuf variables so each buffer knows about the other (for closing purposes) 563 diffthis 564 wincmd v 565 exe "noswapfile e ".fnameescape(fname) 566 diffthis 567 else 568 redraw! 569 echo "***warning*** unable to read file<".fname.">" 570 endif 571" call Dret("tar#Diff") 572endfun 573 574" --------------------------------------------------------------------- 575" tar#Extract: extract a file from a (possibly compressed) tar archive {{{2 576fun! tar#Extract() 577" call Dfunc("tar#Extract()") 578 579 let repkeep= &report 580 set report=10 581 let fname= getline(".") 582" call Decho("fname<".fname.">") 583 584 if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-' 585 redraw! 586 echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"' 587" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"') 588 return 589 endif 590 591 " sanity check 592 if fname =~ '^"' 593 let &report= repkeep 594" call Dret("TarBrowseSelect") 595 return 596 endif 597 598 let tarball = expand("%") 599" call Decho("tarball<".tarball.">") 600 let tarbase = substitute(tarball,'\..*$','','') 601" call Decho("tarbase<".tarbase.">") 602 603 let extractcmd= netrw#WinPath(g:tar_extractcmd) 604 if filereadable(tarbase.".tar") 605" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar ".shellescape(fname).")") 606 call system(extractcmd." ".shellescape(tarbase).".tar ".shellescape(fname)) 607 if v:shell_error != 0 608 echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar ".fname.": failed!" | echohl NONE 609" call Decho("***error*** ".extractcmd." ".tarbase.".tar ".fname.": failed!") 610 else 611 echo "***note*** successfully extracted ".fname 612 endif 613 614 elseif filereadable(tarbase.".tgz") 615 let extractcmd= substitute(extractcmd,"-","-z","") 616" call Decho("system(".extractcmd." ".shellescape(tarbase).".tgz ".shellescape(fname).")") 617 call system(extractcmd." ".shellescape(tarbase).".tgz ".shellescape(fname)) 618 if v:shell_error != 0 619 echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tgz ".fname.": failed!" | echohl NONE 620" call Decho("***error*** ".extractcmd."t ".tarbase.".tgz ".fname.": failed!") 621 else 622 echo "***note*** successfully extracted ".fname 623 endif 624 625 elseif filereadable(tarbase.".tar.gz") 626 let extractcmd= substitute(extractcmd,"-","-z","") 627" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.gz ".shellescape(fname).")") 628 call system(extractcmd." ".shellescape(tarbase).".tar.gz ".shellescape(fname)) 629 if v:shell_error != 0 630 echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.gz ".fname.": failed!" | echohl NONE 631" call Decho("***error*** ".extractcmd." ".tarbase.".tar.gz ".fname.": failed!") 632 else 633 echo "***note*** successfully extracted ".fname 634 endif 635 636 elseif filereadable(tarbase.".tbz") 637 let extractcmd= substitute(extractcmd,"-","-j","") 638" call Decho("system(".extractcmd." ".shellescape(tarbase).".tbz ".shellescape(fname).")") 639 call system(extractcmd." ".shellescape(tarbase).".tbz ".shellescape(fname)) 640 if v:shell_error != 0 641 echohl Error | echo "***error*** ".extractcmd."j ".tarbase.".tbz ".fname.": failed!" | echohl NONE 642" call Decho("***error*** ".extractcmd."j ".tarbase.".tbz ".fname.": failed!") 643 else 644 echo "***note*** successfully extracted ".fname 645 endif 646 647 elseif filereadable(tarbase.".tar.bz2") 648 let extractcmd= substitute(extractcmd,"-","-j","") 649" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.bz2 ".shellescape(fname).")") 650 call system(extractcmd." ".shellescape(tarbase).".tar.bz2 ".shellescape(fname)) 651 if v:shell_error != 0 652 echohl Error | echo "***error*** ".extractcmd."j ".tarbase.".tar.bz2 ".fname.": failed!" | echohl NONE 653" call Decho("***error*** ".extractcmd."j ".tarbase.".tar.bz2 ".fname.": failed!") 654 else 655 echo "***note*** successfully extracted ".fname 656 endif 657 658 elseif filereadable(tarbase.".txz") 659 let extractcmd= substitute(extractcmd,"-","-J","") 660" call Decho("system(".extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname).")") 661 call system(extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname)) 662 if v:shell_error != 0 663 echohl Error | echo "***error*** ".extractcmd." ".tarbase.".txz ".fname.": failed!" | echohl NONE 664" call Decho("***error*** ".extractcmd." ".tarbase.".txz ".fname.": failed!") 665 else 666 echo "***note*** successfully extracted ".fname 667 endif 668 669 elseif filereadable(tarbase.".tar.xz") 670 let extractcmd= substitute(extractcmd,"-","-J","") 671" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname).")") 672 call system(extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname)) 673 if v:shell_error != 0 674 echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.xz ".fname.": failed!" | echohl NONE 675" call Decho("***error*** ".extractcmd." ".tarbase.".tar.xz ".fname.": failed!") 676 else 677 echo "***note*** successfully extracted ".fname 678 endif 679 endif 680 681 " restore option 682 let &report= repkeep 683 684" call Dret("tar#Extract") 685endfun 686 687" --------------------------------------------------------------------- 688" s:Rmdir: {{{2 689fun! s:Rmdir(fname) 690" call Dfunc("Rmdir(fname<".a:fname.">)") 691 if has("unix") 692 call system("/bin/rm -rf -- ".shellescape(a:fname,0)) 693 elseif has("win32") || has("win95") || has("win64") || has("win16") 694 if &shell =~? "sh$" 695 call system("/bin/rm -rf -- ".shellescape(a:fname,0)) 696 else 697 call system("del /S ".shellescape(a:fname,0)) 698 endif 699 endif 700" call Dret("Rmdir") 701endfun 702 703" --------------------------------------------------------------------- 704" tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2 705fun! tar#Vimuntar(...) 706" call Dfunc("tar#Vimuntar() a:0=".a:0." a:1<".(exists("a:1")? a:1 : "-n/a-").">") 707 let tarball = expand("%") 708" call Decho("tarball<".tarball.">") 709 let tarbase = substitute(tarball,'\..*$','','') 710" call Decho("tarbase<".tarbase.">") 711 let tarhome = expand("%:p") 712 if has("win32") || has("win95") || has("win64") || has("win16") 713 let tarhome= substitute(tarhome,'\\','/','g') 714 endif 715 let tarhome= substitute(tarhome,'/[^/]*$','','') 716" call Decho("tarhome<".tarhome.">") 717 let tartail = expand("%:t") 718" call Decho("tartail<".tartail.">") 719 let curdir = getcwd() 720" call Decho("curdir <".curdir.">") 721 " set up vimhome 722 if a:0 > 0 && a:1 != "" 723 let vimhome= a:1 724 else 725 let vimhome= vimball#VimballHome() 726 endif 727" call Decho("vimhome<".vimhome.">") 728 729" call Decho("curdir<".curdir."> vimhome<".vimhome.">") 730 if simplify(curdir) != simplify(vimhome) 731 " copy (possibly compressed) tarball to .vim/vimfiles 732" call Decho(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome)) 733 call system(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome)) 734" call Decho("exe cd ".fnameescape(vimhome)) 735 exe "cd ".fnameescape(vimhome) 736 endif 737" call Decho("getcwd<".getcwd().">") 738 739 " if necessary, decompress the tarball; then, extract it 740 if tartail =~ '\.tgz' 741 if executable("gunzip") 742 silent exe "!gunzip ".shellescape(tartail) 743 elseif executable("gzip") 744 silent exe "!gzip -d ".shellescape(tartail) 745 else 746 echoerr "unable to decompress<".tartail."> on this sytem" 747 if simplify(curdir) != simplify(tarhome) 748 " remove decompressed tarball, restore directory 749" call Decho("delete(".tartail.".tar)") 750 call delete(tartail.".tar") 751" call Decho("exe cd ".fnameescape(curdir)) 752 exe "cd ".fnameescape(curdir) 753 endif 754" call Dret("tar#Vimuntar") 755 return 756 endif 757 else 758 call vimball#Decompress(tartail,0) 759 endif 760 let extractcmd= netrw#WinPath(g:tar_extractcmd) 761" call Decho("system(".extractcmd." ".shellescape(tarbase.".tar").")") 762 call system(extractcmd." ".shellescape(tarbase.".tar")) 763 764 " set up help 765 if filereadable("doc/".tarbase.".txt") 766" call Decho("exe helptags ".getcwd()."/doc") 767 exe "helptags ".getcwd()."/doc" 768 endif 769 770 if simplify(tarhome) != simplify(vimhome) 771 " remove decompressed tarball, restore directory 772 call delete(vimhome."/".tarbase.".tar") 773 exe "cd ".fnameescape(curdir) 774 endif 775 776" call Dret("tar#Vimuntar") 777endfun 778 779" ===================================================================== 780" Modelines And Restoration: {{{1 781let &cpo= s:keepcpo 782unlet s:keepcpo 783" vim:ts=8 fdm=marker 784