1" tar.vim: Handles browsing tarfiles 2" AUTOLOAD PORTION 3" Date: Apr 17, 2013 4" Version: 29 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-2011 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= "v29" 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: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 61endif 62if !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 77endif 78if !exists("g:tar_extractcmd") 79 let g:tar_extractcmd= "tar -xf" 80endif 81 82" set up shell quoting character 83if !exists("g:tar_shq") 84 if exists("+shq") && exists("&shq") && &shq != "" 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 93 let g:tar_shq= "'" 94 endif 95" call Decho("g:tar_shq<".g:tar_shq.">") 96endif 97 98" ---------------- 99" Functions: {{{1 100" ---------------- 101 102" --------------------------------------------------------------------- 103" tar#Browse: {{{2 104fun! tar#Browse(tarfile) 105" call Dfunc("tar#Browse(tarfile<".a:tarfile.">)") 106 let repkeep= &report 107 set report=10 108 109 " sanity checks 110 if !executable(g:tar_cmd) 111 redraw! 112 echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' 113 let &report= repkeep 114" call Dret("tar#Browse") 115 return 116 endif 117 if !filereadable(a:tarfile) 118" call Decho('a:tarfile<'.a:tarfile.'> not filereadable') 119 if a:tarfile !~# '^\a\+://' 120 " if it's an url, don't complain, let url-handlers such as vim do its thing 121 redraw! 122 echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None 123 endif 124 let &report= repkeep 125" call Dret("tar#Browse : file<".a:tarfile."> not readable") 126 return 127 endif 128 if &ma != 1 129 set ma 130 endif 131 let b:tarfile= a:tarfile 132 133 setlocal noswapfile 134 setlocal buftype=nofile 135 setlocal bufhidden=hide 136 setlocal nobuflisted 137 setlocal nowrap 138 set ft=tar 139 140 " give header 141" call Decho("printing header") 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') 146 keepj $put ='' 147 keepj sil! 0d 148 keepj $ 149 150 let tarfile= a:tarfile 151 if has("win32unix") && executable("cygpath") 152 " assuming cygwin 153 let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 154 endif 155 156 let curlast= line("$") 157 if tarfile =~# '\.\(gz\|tgz\)$' 158 let gzip_command = s:get_gzip_command(tarfile) 159" call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 160 exe "sil! r! " . gzip_command . " -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 161 elseif tarfile =~# '\.lrp' 162" call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ") 163 exe "sil! r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - " 164 elseif tarfile =~# '\.\(bz2\|tbz\|tb2\)$' 165" call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 166 exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 167 elseif tarfile =~# '\.\(lzma\|tlz\)$' 168" call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 169 exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 170 elseif tarfile =~# '\.\(xz\|txz\)$' 171" call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 172 exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 173 else 174 if tarfile =~ '^\s*-' 175 " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. 176 let tarfile = substitute(tarfile, '-', './-', '') 177 endif 178" call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0)) 179 exe "sil! r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1) 180 endif 181 if v:shell_error != 0 182 redraw! 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 187 if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)') 188 redraw! 189 echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None 190 keepj sil! %d 191 let eikeep= &ei 192 set ei=BufReadCmd,FileReadCmd 193 exe "r ".fnameescape(a:tarfile) 194 let &ei= eikeep 195 keepj sil! 1d 196" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 197 return 198 endif 199 200 setlocal noma nomod ro 201 noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr> 202 203 let &report= repkeep 204" call Dret("tar#Browse : b:tarfile<".b:tarfile.">") 205endfun 206 207" --------------------------------------------------------------------- 208" TarBrowseSelect: {{{2 209fun! s:TarBrowseSelect() 210" call Dfunc("TarBrowseSelect() b:tarfile<".b:tarfile."> curfile<".expand("%").">") 211 let repkeep= &report 212 set report=10 213 let fname= getline(".") 214" call Decho("fname<".fname.">") 215 216 if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-' 217 redraw! 218 echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"' 219" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"') 220 return 221 endif 222 223 " sanity check 224 if fname =~ '^"' 225 let &report= repkeep 226" call Dret("TarBrowseSelect") 227 return 228 endif 229 230 " about to make a new window, need to use b:tarfile 231 let tarfile= b:tarfile 232 let curfile= expand("%") 233 if has("win32unix") && executable("cygpath") 234 " assuming cygwin 235 let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 236 endif 237 238 new 239 if !exists("g:tar_nomax") || g:tar_nomax == 0 240 wincmd _ 241 endif 242 let s:tblfile_{winnr()}= curfile 243 call tar#Read("tarfile:".tarfile.'::'.fname,1) 244 filetype detect 245 set nomod 246 exe 'com! -buffer -nargs=? -complete=file TarDiff :call tar#Diff(<q-args>,"'.fnameescape(fname).'")' 247 248 let &report= repkeep 249" call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 250endfun 251 252" --------------------------------------------------------------------- 253" tar#Read: {{{2 254fun! tar#Read(fname,mode) 255" call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")") 256 let repkeep= &report 257 set report=10 258 let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','') 259 let fname = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','') 260 if has("win32unix") && executable("cygpath") 261 " assuming cygwin 262 let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 263 endif 264" call Decho("tarfile<".tarfile.">") 265" call Decho("fname<".fname.">") 266 267 if fname =~ '\.bz2$' && executable("bzcat") 268 let decmp= "|bzcat" 269 let doro = 1 270 elseif fname =~ '\.gz$' && executable("zcat") 271 let decmp= "|zcat" 272 let doro = 1 273 elseif fname =~ '\.lzma$' && executable("lzcat") 274 let decmp= "|lzcat" 275 let doro = 1 276 elseif fname =~ '\.xz$' && executable("xzcat") 277 let decmp= "|xzcat" 278 let doro = 1 279 else 280 let decmp="" 281 let doro = 0 282 if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.xz$\|\.zip$\|\.Z$' 283 setlocal bin 284 endif 285 endif 286 287 if exists("g:tar_secure") 288 let tar_secure= " -- " 289 else 290 let tar_secure= " " 291 endif 292 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) 295 exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 296 elseif tarfile =~# '\.\(gz\|tgz\)$' 297 let gzip_command = s:get_gzip_command(tarfile) 298" call Decho("5: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.tar_secure.shellescape(fname,1)) 299 exe "sil! r! " . gzip_command . " -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 300 elseif tarfile =~# '\.lrp$' 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) 302 exe "sil! r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 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) 305 exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 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) 308 exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 309 else 310 if tarfile =~ '^\s*-' 311 " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. 312 let tarfile = substitute(tarfile, '-', './-', '') 313 endif 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 316 endif 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 323 let b:tarfile= a:fname 324 exe "file tarfile::".fnameescape(fname) 325 326 " cleanup 327 keepj sil! 0d 328 set nomod 329 330 let &report= repkeep 331" call Dret("tar#Read : b:tarfile<".b:tarfile.">") 332endfun 333 334" --------------------------------------------------------------------- 335" tar#Write: {{{2 336fun! tar#Write(fname) 337" call Dfunc("tar#Write(fname<".a:fname.">) b:tarfile<".b:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 338 let repkeep= &report 339 set report=10 340 341 if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-' 342 redraw! 343 echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"' 344" call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"') 345 return 346 endif 347 348 " sanity checks 349 if !executable(g:tar_cmd) 350 redraw! 351 echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' 352 let &report= repkeep 353" call Dret("tar#Write") 354 return 355 endif 356 if !exists("*mkdir") 357 redraw! 358 echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None 359 let &report= repkeep 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 375 exe "cd ".fnameescape(tmpdir) 376 catch /^Vim\%((\a\+)\)\=:E344/ 377 redraw! 378 echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None 379 let &report= repkeep 380" call Dret("tar#Write") 381 return 382 endtry 383" call Decho("current directory now: ".getcwd()) 384 385 " place temporary files under .../_ZIPVIM_/ 386 if isdirectory("_ZIPVIM_") 387 call s:Rmdir("_ZIPVIM_") 388 endif 389 call mkdir("_ZIPVIM_") 390 cd _ZIPVIM_ 391" call Decho("current directory now: ".getcwd()) 392 393 let tarfile = substitute(b:tarfile,'tarfile:\(.\{-}\)::.*$','\1','') 394 let fname = substitute(b:tarfile,'tarfile:.\{-}::\(.*\)$','\1','') 395 396 let gzip_command = s:get_gzip_command(tarfile) 397 398 " handle compressed archives 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' 405 call system(gzip_command . " -d -- ".shellescape(tarfile,0)) 406 let tarfile = substitute(tarfile,'\.gz','','e') 407 let compress= "gzip -- ".shellescape(tarfile,0) 408" call Decho("compress<".compress.">") 409 elseif tarfile =~# '\.tgz' 410 call system(gzip_command . " -d -- ".shellescape(tarfile,0)) 411 let tarfile = substitute(tarfile,'\.tgz','.tar','e') 412 let compress= "gzip -- ".shellescape(tarfile,0) 413 let tgz = 1 414" call Decho("compress<".compress.">") 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.">") 425 endif 426" call Decho("tarfile<".tarfile.">") 427 428 if v:shell_error != 0 429 redraw! 430 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None 431 else 432 433" call Decho("tarfile<".tarfile."> fname<".fname.">") 434 435 if fname =~ '/' 436 let dirpath = substitute(fname,'/[^/]\+$','','e') 437 if has("win32unix") && executable("cygpath") 438 let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e') 439 endif 440 call mkdir(dirpath,"p") 441 endif 442 if tarfile !~ '/' 443 let tarfile= curdir.'/'.tarfile 444 endif 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 449" call Decho("tarfile<".tarfile."> fname<".fname.">") 450 451 if exists("g:tar_secure") 452 let tar_secure= " -- " 453 else 454 let tar_secure= " " 455 endif 456 exe "w! ".fnameescape(fname) 457 if has("win32unix") && executable("cygpath") 458 let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e') 459 endif 460 461 " delete old file from tarfile 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)) 464 if v:shell_error != 0 465 redraw! 466 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 467 else 468 469 " update tarfile with new file 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)) 472 if v:shell_error != 0 473 redraw! 474 echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 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 490 let binkeep= &l:binary 491 let eikeep = &ei 492 set binary ei=all 493 exe "e! ".fnameescape(tarfile) 494 call netrw#NetWrite(tblfile) 495 let &ei = eikeep 496 let &l:binary = binkeep 497 q! 498 unlet s:tblfile_{winnr()} 499 endif 500 endif 501 502 " cleanup and restore current directory 503 cd .. 504 call s:Rmdir("_ZIPVIM_") 505 exe "cd ".fnameescape(curdir) 506 setlocal nomod 507 508 let &report= repkeep 509" call Dret("tar#Write") 510endfun 511 512" --------------------------------------------------------------------- 513" tar#Diff: {{{2 514fun! 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") 534endfun 535 536" --------------------------------------------------------------------- 537" s:Rmdir: {{{2 538fun! s:Rmdir(fname) 539" call Dfunc("Rmdir(fname<".a:fname.">)") 540 if has("unix") 541 call system("/bin/rm -rf -- ".shellescape(a:fname,0)) 542 elseif has("win32") || has("win95") || has("win64") || has("win16") 543 if &shell =~? "sh$" 544 call system("/bin/rm -rf -- ".shellescape(a:fname,0)) 545 else 546 call system("del /S ".shellescape(a:fname,0)) 547 endif 548 endif 549" call Dret("Rmdir") 550endfun 551 552" --------------------------------------------------------------------- 553" tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2 554fun! 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' 590 let gzip_command = s:get_gzip_command(tarfile) 591 if executable(gzip_command) 592 silent exe "!" . gzip_command . " -d ".shellescape(tartail) 593 elseif executable("gunzip") 594 silent exe "!gunzip ".shellescape(tartail) 595 elseif executable("gzip") 596 silent exe "!gzip -d ".shellescape(tartail) 597 else 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 608 endif 609 else 610 call vimball#Decompress(tartail,0) 611 endif 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") 629endfun 630 631func s:get_gzip_command(file) 632 " Try using the "file" command to get the actual compression type, since 633 " there is no standard way for the naming: ".tgz", ".tbz", ".txz", etc. 634 " If the "file" command doesn't work fall back to just using the file name. 635 if a:file =~# 'z$' 636 let filetype = system('file ' . a:file) 637 if filetype =~ 'bzip2 compressed' && executable('bzip2') 638 return 'bzip2' 639 endif 640 if filetype =~ 'XZ compressed' && executable('xz') 641 return 'xz' 642 endif 643 endif 644 if a:file =~# 'bz2$' 645 return 'bzip2' 646 endif 647 if a:file =~# 'xz$' 648 return 'xz' 649 endif 650 return 'gzip' 651endfunc 652 653" ===================================================================== 654" Modelines And Restoration: {{{1 655let &cpo= s:keepcpo 656unlet s:keepcpo 657" vim:ts=8 fdm=marker 658