1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles 2a5792f58SBram Moolenaar" AUTOLOAD PORTION 3*2963456fSBram Moolenaar" Date: Jan 07, 2020 4*2963456fSBram Moolenaar" Version: 32 5*2963456fSBram Moolenaar" Maintainer: Charles E Campbell <[email protected]> 6a5792f58SBram Moolenaar" License: Vim License (see vim's :help license) 787e25fdfSBram Moolenaar" 8a5792f58SBram Moolenaar" Contains many ideas from Michael Toren's <tar.vim> 987e25fdfSBram Moolenaar" 10*2963456fSBram Moolenaar" Copyright: Copyright (C) 2005-2017 Charles E. Campbell {{{1 11a5792f58SBram Moolenaar" Permission is hereby granted to use and distribute this code, 12a5792f58SBram Moolenaar" with or without modifications, provided that this copyright 13a5792f58SBram Moolenaar" notice is copied with it. Like anything else that's free, 148c8de839SBram Moolenaar" tar.vim and tarPlugin.vim are provided *as is* and comes 158c8de839SBram Moolenaar" with no warranty of any kind, either expressed or implied. 168c8de839SBram Moolenaar" By using this plugin, you agree that in no event will the 178c8de839SBram Moolenaar" copyright holder be liable for any damages resulting from 188c8de839SBram Moolenaar" the use of this software. 195c73622aSBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 20ab194816SBram Moolenaar" --------------------------------------------------------------------- 21c81e5e79SBram Moolenaar" Load Once: {{{1 225c73622aSBram Moolenaarif &cp || exists("g:loaded_tar") 23a5792f58SBram Moolenaar finish 24a5792f58SBram Moolenaarendif 25*2963456fSBram Moolenaarlet g:loaded_tar= "v32" 265c73622aSBram Moolenaarif v:version < 702 275c73622aSBram Moolenaar echohl WarningMsg 285c73622aSBram Moolenaar echo "***warning*** this version of tar needs vim 7.2" 295c73622aSBram Moolenaar echohl Normal 305c73622aSBram Moolenaar finish 318c8de839SBram Moolenaarendif 325c73622aSBram Moolenaarlet s:keepcpo= &cpo 335c73622aSBram Moolenaarset cpo&vim 34ff034194SBram Moolenaar"DechoTabOn 355c73622aSBram Moolenaar"call Decho("loading autoload/tar.vim") 3687e25fdfSBram Moolenaar 37a5792f58SBram Moolenaar" --------------------------------------------------------------------- 38a5792f58SBram Moolenaar" Default Settings: {{{1 39a5792f58SBram Moolenaarif !exists("g:tar_browseoptions") 40a5792f58SBram Moolenaar let g:tar_browseoptions= "Ptf" 41a5792f58SBram Moolenaarendif 42a5792f58SBram Moolenaarif !exists("g:tar_readoptions") 43a5792f58SBram Moolenaar let g:tar_readoptions= "OPxf" 44a5792f58SBram Moolenaarendif 45910f66f9SBram Moolenaarif !exists("g:tar_cmd") 46910f66f9SBram Moolenaar let g:tar_cmd= "tar" 47910f66f9SBram Moolenaarendif 48a5792f58SBram Moolenaarif !exists("g:tar_writeoptions") 49a5792f58SBram Moolenaar let g:tar_writeoptions= "uf" 50a5792f58SBram Moolenaarendif 51*2963456fSBram Moolenaarif !exists("g:tar_delfile") 52*2963456fSBram Moolenaar let g:tar_delfile="--delete -f" 53*2963456fSBram Moolenaarendif 54251e1912SBram Moolenaarif !exists("g:netrw_cygwin") 55251e1912SBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 56251e1912SBram Moolenaar if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$' 57251e1912SBram Moolenaar let g:netrw_cygwin= 1 58251e1912SBram Moolenaar else 59251e1912SBram Moolenaar let g:netrw_cygwin= 0 60251e1912SBram Moolenaar endif 61251e1912SBram Moolenaar else 62251e1912SBram Moolenaar let g:netrw_cygwin= 0 63251e1912SBram Moolenaar endif 64251e1912SBram Moolenaarendif 655c73622aSBram Moolenaarif !exists("g:tar_copycmd") 665c73622aSBram Moolenaar if !exists("g:netrw_localcopycmd") 675c73622aSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 685c73622aSBram Moolenaar if g:netrw_cygwin 695c73622aSBram Moolenaar let g:netrw_localcopycmd= "cp" 705c73622aSBram Moolenaar else 715c73622aSBram Moolenaar let g:netrw_localcopycmd= "copy" 725c73622aSBram Moolenaar endif 735c73622aSBram Moolenaar elseif has("unix") || has("macunix") 745c73622aSBram Moolenaar let g:netrw_localcopycmd= "cp" 755c73622aSBram Moolenaar else 765c73622aSBram Moolenaar let g:netrw_localcopycmd= "" 775c73622aSBram Moolenaar endif 785c73622aSBram Moolenaar endif 795c73622aSBram Moolenaar let g:tar_copycmd= g:netrw_localcopycmd 805c73622aSBram Moolenaarendif 815c73622aSBram Moolenaarif !exists("g:tar_extractcmd") 825c73622aSBram Moolenaar let g:tar_extractcmd= "tar -xf" 835c73622aSBram Moolenaarendif 848c8de839SBram Moolenaar 858c8de839SBram Moolenaar" set up shell quoting character 86c81e5e79SBram Moolenaarif !exists("g:tar_shq") 87ff034194SBram Moolenaar if exists("+shq") && exists("&shq") && &shq != "" 888c8de839SBram Moolenaar let g:tar_shq= &shq 898c8de839SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16") 908c8de839SBram Moolenaar if exists("g:netrw_cygwin") && g:netrw_cygwin 91c81e5e79SBram Moolenaar let g:tar_shq= "'" 92c81e5e79SBram Moolenaar else 93c81e5e79SBram Moolenaar let g:tar_shq= '"' 94c81e5e79SBram Moolenaar endif 958c8de839SBram Moolenaar else 968c8de839SBram Moolenaar let g:tar_shq= "'" 978c8de839SBram Moolenaar endif 988c8de839SBram Moolenaar" call Decho("g:tar_shq<".g:tar_shq.">") 99c81e5e79SBram Moolenaarendif 100a5792f58SBram Moolenaar 101a5792f58SBram Moolenaar" ---------------- 102a5792f58SBram Moolenaar" Functions: {{{1 103a5792f58SBram Moolenaar" ---------------- 104a5792f58SBram Moolenaar 105a5792f58SBram Moolenaar" --------------------------------------------------------------------- 106a5792f58SBram Moolenaar" tar#Browse: {{{2 107a5792f58SBram Moolenaarfun! tar#Browse(tarfile) 108a5792f58SBram Moolenaar" call Dfunc("tar#Browse(tarfile<".a:tarfile.">)") 109bba577a2SBram Moolenaar let repkeep= &report 110bba577a2SBram Moolenaar set report=10 111a5792f58SBram Moolenaar 112a5792f58SBram Moolenaar " sanity checks 113910f66f9SBram Moolenaar if !executable(g:tar_cmd) 114c81e5e79SBram Moolenaar redraw! 115*2963456fSBram Moolenaar" call Decho('***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system') 116910f66f9SBram Moolenaar echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' 117bba577a2SBram Moolenaar let &report= repkeep 118a5792f58SBram Moolenaar" call Dret("tar#Browse") 11987e25fdfSBram Moolenaar return 12087e25fdfSBram Moolenaar endif 121a5792f58SBram Moolenaar if !filereadable(a:tarfile) 122910f66f9SBram Moolenaar" call Decho('a:tarfile<'.a:tarfile.'> not filereadable') 123a5792f58SBram Moolenaar if a:tarfile !~# '^\a\+://' 124*2963456fSBram Moolenaar " if its an url, don't complain, let url-handlers such as vim do its thing 125c81e5e79SBram Moolenaar redraw! 126*2963456fSBram Moolenaar" call Decho("***error*** (tar#Browse) File not readable<".a:tarfile.">") 127a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None 12887e25fdfSBram Moolenaar endif 129bba577a2SBram Moolenaar let &report= repkeep 130a5792f58SBram Moolenaar" call Dret("tar#Browse : file<".a:tarfile."> not readable") 13187e25fdfSBram Moolenaar return 13287e25fdfSBram Moolenaar endif 133a5792f58SBram Moolenaar if &ma != 1 134a5792f58SBram Moolenaar set ma 13587e25fdfSBram Moolenaar endif 1367fc0c065SBram Moolenaar let b:tarfile= a:tarfile 137a5792f58SBram Moolenaar 138a5792f58SBram Moolenaar setlocal noswapfile 139a5792f58SBram Moolenaar setlocal buftype=nofile 140a5792f58SBram Moolenaar setlocal bufhidden=hide 141a5792f58SBram Moolenaar setlocal nobuflisted 142a5792f58SBram Moolenaar setlocal nowrap 143a5792f58SBram Moolenaar set ft=tar 144a5792f58SBram Moolenaar 145a5792f58SBram Moolenaar " give header 146910f66f9SBram Moolenaar" call Decho("printing header") 1478c8de839SBram Moolenaar let lastline= line("$") 1488c8de839SBram Moolenaar call setline(lastline+1,'" tar.vim version '.g:loaded_tar) 1498c8de839SBram Moolenaar call setline(lastline+2,'" Browsing tarfile '.a:tarfile) 1508c8de839SBram Moolenaar call setline(lastline+3,'" Select a file with cursor and press ENTER') 151251e1912SBram Moolenaar keepj $put ='' 1526be7f873SBram Moolenaar keepj sil! 0d 153251e1912SBram Moolenaar keepj $ 154a5792f58SBram Moolenaar 155910f66f9SBram Moolenaar let tarfile= a:tarfile 156ff034194SBram Moolenaar if has("win32unix") && executable("cygpath") 157910f66f9SBram Moolenaar " assuming cygwin 1585c73622aSBram Moolenaar let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 159a5792f58SBram Moolenaar endif 160d68071d8SBram Moolenaar let curlast= line("$") 161*2963456fSBram Moolenaar 162*2963456fSBram Moolenaar if tarfile =~# '\.\(gz\)$' 1635c73622aSBram Moolenaar" call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 164*2963456fSBram Moolenaar exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 165*2963456fSBram Moolenaar 166*2963456fSBram Moolenaar elseif tarfile =~# '\.\(tgz\)$' || tarfile =~# '\.\(tbz\)$' || tarfile =~# '\.\(txz\)$' 167*2963456fSBram Moolenaar if has("unix") && executable("file") 168*2963456fSBram Moolenaar let filekind= system("file ".shellescape(tarfile,1)) =~ "bzip2" 169*2963456fSBram Moolenaar else 170*2963456fSBram Moolenaar let filekind= "" 171*2963456fSBram Moolenaar endif 172*2963456fSBram Moolenaar 173*2963456fSBram Moolenaar if filekind =~ "bzip2" 174*2963456fSBram Moolenaar exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 175*2963456fSBram Moolenaar elseif filekind =~ "XZ" 176*2963456fSBram Moolenaar exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 177*2963456fSBram Moolenaar else 178*2963456fSBram Moolenaar exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 179*2963456fSBram Moolenaar endif 180*2963456fSBram Moolenaar 1818c8de839SBram Moolenaar elseif tarfile =~# '\.lrp' 1825c73622aSBram Moolenaar" call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ") 183d4a1aabeSBram Moolenaar exe "sil! r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - " 1846be7f873SBram Moolenaar elseif tarfile =~# '\.\(bz2\|tbz\|tb2\)$' 1855c73622aSBram Moolenaar" call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 186251e1912SBram Moolenaar exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 1876be7f873SBram Moolenaar elseif tarfile =~# '\.\(lzma\|tlz\)$' 1885c73622aSBram Moolenaar" call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 189251e1912SBram Moolenaar exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 190477db060SBram Moolenaar elseif tarfile =~# '\.\(xz\|txz\)$' 191477db060SBram Moolenaar" call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 192251e1912SBram Moolenaar exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 193910f66f9SBram Moolenaar else 194ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 1955c73622aSBram Moolenaar " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. 196ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 197ed39e1d5SBram Moolenaar endif 1985c73622aSBram Moolenaar" call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0)) 199251e1912SBram Moolenaar exe "sil! r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1) 200910f66f9SBram Moolenaar endif 201910f66f9SBram Moolenaar if v:shell_error != 0 202c81e5e79SBram Moolenaar redraw! 203d68071d8SBram Moolenaar echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">" 204d68071d8SBram Moolenaar" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 205d68071d8SBram Moolenaar return 206d68071d8SBram Moolenaar endif 207*2963456fSBram Moolenaar if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~# '\c\%(warning\|error\|inappropriate\|unrecognized\)') 208c81e5e79SBram Moolenaar redraw! 209d68071d8SBram Moolenaar echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None 210251e1912SBram Moolenaar keepj sil! %d 211d68071d8SBram Moolenaar let eikeep= &ei 212d68071d8SBram Moolenaar set ei=BufReadCmd,FileReadCmd 213c236c16dSBram Moolenaar exe "r ".fnameescape(a:tarfile) 214d68071d8SBram Moolenaar let &ei= eikeep 215251e1912SBram Moolenaar keepj sil! 1d 216d68071d8SBram Moolenaar" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 217910f66f9SBram Moolenaar return 218910f66f9SBram Moolenaar endif 219a5792f58SBram Moolenaar 220*2963456fSBram Moolenaar " set up maps supported for tar 221a5792f58SBram Moolenaar setlocal noma nomod ro 222a5792f58SBram Moolenaar noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr> 223*2963456fSBram Moolenaar noremap <silent> <buffer> x :call tar#Extract()<cr> 224*2963456fSBram Moolenaar if &mouse != "" 225*2963456fSBram Moolenaar noremap <silent> <buffer> <leftmouse> <leftmouse>:call <SID>TarBrowseSelect()<cr> 226*2963456fSBram Moolenaar endif 227a5792f58SBram Moolenaar 228bba577a2SBram Moolenaar let &report= repkeep 2297fc0c065SBram Moolenaar" call Dret("tar#Browse : b:tarfile<".b:tarfile.">") 230ab194816SBram Moolenaarendfun 23187e25fdfSBram Moolenaar 232ab194816SBram Moolenaar" --------------------------------------------------------------------- 233a5792f58SBram Moolenaar" TarBrowseSelect: {{{2 234a5792f58SBram Moolenaarfun! s:TarBrowseSelect() 2357fc0c065SBram Moolenaar" call Dfunc("TarBrowseSelect() b:tarfile<".b:tarfile."> curfile<".expand("%").">") 236bba577a2SBram Moolenaar let repkeep= &report 237bba577a2SBram Moolenaar set report=10 238a5792f58SBram Moolenaar let fname= getline(".") 239a5792f58SBram Moolenaar" call Decho("fname<".fname.">") 240a5792f58SBram Moolenaar 241ed39e1d5SBram Moolenaar if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-' 242ed39e1d5SBram Moolenaar redraw! 2435c73622aSBram Moolenaar echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"' 244ed39e1d5SBram Moolenaar" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"') 245ed39e1d5SBram Moolenaar return 246ed39e1d5SBram Moolenaar endif 247ed39e1d5SBram Moolenaar 248a5792f58SBram Moolenaar " sanity check 249a5792f58SBram Moolenaar if fname =~ '^"' 250bba577a2SBram Moolenaar let &report= repkeep 251a5792f58SBram Moolenaar" call Dret("TarBrowseSelect") 252a5792f58SBram Moolenaar return 253a5792f58SBram Moolenaar endif 254a5792f58SBram Moolenaar 2557fc0c065SBram Moolenaar " about to make a new window, need to use b:tarfile 2567fc0c065SBram Moolenaar let tarfile= b:tarfile 257a5792f58SBram Moolenaar let curfile= expand("%") 258ff034194SBram Moolenaar if has("win32unix") && executable("cygpath") 259910f66f9SBram Moolenaar " assuming cygwin 2605c73622aSBram Moolenaar let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 261910f66f9SBram Moolenaar endif 262a5792f58SBram Moolenaar 263*2963456fSBram Moolenaar " open a new window (tar#Read will read a file into it) 264*2963456fSBram Moolenaar noswapfile new 2658c8de839SBram Moolenaar if !exists("g:tar_nomax") || g:tar_nomax == 0 266a5792f58SBram Moolenaar wincmd _ 2678c8de839SBram Moolenaar endif 268a5792f58SBram Moolenaar let s:tblfile_{winnr()}= curfile 2698c8de839SBram Moolenaar call tar#Read("tarfile:".tarfile.'::'.fname,1) 270a5792f58SBram Moolenaar filetype detect 271ff034194SBram Moolenaar set nomod 272ff034194SBram Moolenaar exe 'com! -buffer -nargs=? -complete=file TarDiff :call tar#Diff(<q-args>,"'.fnameescape(fname).'")' 273a5792f58SBram Moolenaar 274bba577a2SBram Moolenaar let &report= repkeep 275a5792f58SBram Moolenaar" call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 276a5792f58SBram Moolenaarendfun 277a5792f58SBram Moolenaar 278a5792f58SBram Moolenaar" --------------------------------------------------------------------- 279a5792f58SBram Moolenaar" tar#Read: {{{2 280a5792f58SBram Moolenaarfun! tar#Read(fname,mode) 281a5792f58SBram Moolenaar" call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")") 282bba577a2SBram Moolenaar let repkeep= &report 283bba577a2SBram Moolenaar set report=10 2848c8de839SBram Moolenaar let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','') 2858c8de839SBram Moolenaar let fname = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','') 286ff034194SBram Moolenaar if has("win32unix") && executable("cygpath") 287910f66f9SBram Moolenaar " assuming cygwin 2885c73622aSBram Moolenaar let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 289910f66f9SBram Moolenaar endif 290910f66f9SBram Moolenaar" call Decho("tarfile<".tarfile.">") 291910f66f9SBram Moolenaar" call Decho("fname<".fname.">") 292a5792f58SBram Moolenaar 2935c73622aSBram Moolenaar if fname =~ '\.bz2$' && executable("bzcat") 2945c73622aSBram Moolenaar let decmp= "|bzcat" 2955c73622aSBram Moolenaar let doro = 1 296*2963456fSBram Moolenaar elseif fname =~ '\.t\=gz$' && executable("zcat") 2978c8de839SBram Moolenaar let decmp= "|zcat" 2988c8de839SBram Moolenaar let doro = 1 2995c73622aSBram Moolenaar elseif fname =~ '\.lzma$' && executable("lzcat") 3005c73622aSBram Moolenaar let decmp= "|lzcat" 3018c8de839SBram Moolenaar let doro = 1 302477db060SBram Moolenaar elseif fname =~ '\.xz$' && executable("xzcat") 303477db060SBram Moolenaar let decmp= "|xzcat" 304477db060SBram Moolenaar let doro = 1 305a5792f58SBram Moolenaar else 3068c8de839SBram Moolenaar let decmp="" 3078c8de839SBram Moolenaar let doro = 0 308477db060SBram Moolenaar if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.xz$\|\.zip$\|\.Z$' 3098c8de839SBram Moolenaar setlocal bin 310a5792f58SBram Moolenaar endif 3118c8de839SBram Moolenaar endif 3128c8de839SBram Moolenaar 313ed39e1d5SBram Moolenaar if exists("g:tar_secure") 314ed39e1d5SBram Moolenaar let tar_secure= " -- " 3158c8de839SBram Moolenaar else 316ed39e1d5SBram Moolenaar let tar_secure= " " 317ed39e1d5SBram Moolenaar endif 31820aac6c1SBram Moolenaar 3195c73622aSBram Moolenaar if tarfile =~# '\.bz2$' 320251e1912SBram Moolenaar exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 321*2963456fSBram Moolenaar elseif tarfile =~# '\.\(gz\)$' 322*2963456fSBram Moolenaar exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 323*2963456fSBram Moolenaar 324*2963456fSBram Moolenaar elseif tarfile =~# '\(\.tgz\|\.tbz\|\.txz\)' 325*2963456fSBram Moolenaar if has("unix") && executable("file") 326*2963456fSBram Moolenaar let filekind= system("file ".shellescape(tarfile,1)) 327*2963456fSBram Moolenaar else 328*2963456fSBram Moolenaar let filekind= "" 329*2963456fSBram Moolenaar endif 330*2963456fSBram Moolenaar if filekind =~ "bzip2" 331*2963456fSBram Moolenaar exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 332*2963456fSBram Moolenaar elseif filekind =~ "XZ" 333*2963456fSBram Moolenaar exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 334*2963456fSBram Moolenaar else 335*2963456fSBram Moolenaar exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 336*2963456fSBram Moolenaar endif 337*2963456fSBram Moolenaar 338ed39e1d5SBram Moolenaar elseif tarfile =~# '\.lrp$' 339d4a1aabeSBram Moolenaar exe "sil! r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 3405c73622aSBram Moolenaar elseif tarfile =~# '\.lzma$' 341251e1912SBram Moolenaar exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 342477db060SBram Moolenaar elseif tarfile =~# '\.\(xz\|txz\)$' 343251e1912SBram Moolenaar exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 344ed39e1d5SBram Moolenaar else 345ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 3465c73622aSBram Moolenaar " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. 347ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 348ed39e1d5SBram Moolenaar endif 3495c73622aSBram Moolenaar" call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions.tar_secure.shellescape(tarfile,1)." ".shellescape(fname,1).decmp) 3505c73622aSBram Moolenaar exe "silent r! ".g:tar_cmd." -".g:tar_readoptions.shellescape(tarfile,1)." ".tar_secure.shellescape(fname,1).decmp 3518c8de839SBram Moolenaar endif 3528c8de839SBram Moolenaar 3538c8de839SBram Moolenaar if doro 3548c8de839SBram Moolenaar " because the reverse process of compressing changed files back into the tarball is not currently supported 3558c8de839SBram Moolenaar setlocal ro 3568c8de839SBram Moolenaar endif 3578c8de839SBram Moolenaar 3587fc0c065SBram Moolenaar let b:tarfile= a:fname 359c236c16dSBram Moolenaar exe "file tarfile::".fnameescape(fname) 360a5792f58SBram Moolenaar 361a5792f58SBram Moolenaar " cleanup 362251e1912SBram Moolenaar keepj sil! 0d 363a5792f58SBram Moolenaar set nomod 364a5792f58SBram Moolenaar 365bba577a2SBram Moolenaar let &report= repkeep 3667fc0c065SBram Moolenaar" call Dret("tar#Read : b:tarfile<".b:tarfile.">") 367a5792f58SBram Moolenaarendfun 368a5792f58SBram Moolenaar 369a5792f58SBram Moolenaar" --------------------------------------------------------------------- 370a5792f58SBram Moolenaar" tar#Write: {{{2 371a5792f58SBram Moolenaarfun! tar#Write(fname) 3727fc0c065SBram Moolenaar" call Dfunc("tar#Write(fname<".a:fname.">) b:tarfile<".b:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 373bba577a2SBram Moolenaar let repkeep= &report 374bba577a2SBram Moolenaar set report=10 375a5792f58SBram Moolenaar 376ed39e1d5SBram Moolenaar if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-' 377ed39e1d5SBram Moolenaar redraw! 3785c73622aSBram Moolenaar echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"' 379ed39e1d5SBram Moolenaar" call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"') 380ed39e1d5SBram Moolenaar return 381ed39e1d5SBram Moolenaar endif 382ed39e1d5SBram Moolenaar 383ab194816SBram Moolenaar " sanity checks 384910f66f9SBram Moolenaar if !executable(g:tar_cmd) 385c81e5e79SBram Moolenaar redraw! 386*2963456fSBram Moolenaar" call Decho('***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system') 387bba577a2SBram Moolenaar let &report= repkeep 388ab194816SBram Moolenaar" call Dret("tar#Write") 389ab194816SBram Moolenaar return 390ab194816SBram Moolenaar endif 391ab194816SBram Moolenaar if !exists("*mkdir") 392c81e5e79SBram Moolenaar redraw! 393*2963456fSBram Moolenaar" call Decho("***error*** (tar#Write) sorry, mkdir() doesn't work on your system") 394a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None 395bba577a2SBram Moolenaar let &report= repkeep 396ab194816SBram Moolenaar" call Dret("tar#Write") 397ab194816SBram Moolenaar return 398ab194816SBram Moolenaar endif 399ab194816SBram Moolenaar 400ab194816SBram Moolenaar let curdir= getcwd() 401ab194816SBram Moolenaar let tmpdir= tempname() 402ab194816SBram Moolenaar" call Decho("orig tempname<".tmpdir.">") 403ab194816SBram Moolenaar if tmpdir =~ '\.' 404ab194816SBram Moolenaar let tmpdir= substitute(tmpdir,'\.[^.]*$','','e') 405ab194816SBram Moolenaar endif 406ab194816SBram Moolenaar" call Decho("tmpdir<".tmpdir.">") 407ab194816SBram Moolenaar call mkdir(tmpdir,"p") 408ab194816SBram Moolenaar 409ab194816SBram Moolenaar " attempt to change to the indicated directory 410ab194816SBram Moolenaar try 4118c8de839SBram Moolenaar exe "cd ".fnameescape(tmpdir) 412ab194816SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E344/ 413c81e5e79SBram Moolenaar redraw! 414*2963456fSBram Moolenaar" call Decho("***error*** (tar#Write) cannot cd to temporary directory") 415a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None 416bba577a2SBram Moolenaar let &report= repkeep 417ab194816SBram Moolenaar" call Dret("tar#Write") 418ab194816SBram Moolenaar return 419ab194816SBram Moolenaar endtry 420ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 421ab194816SBram Moolenaar 422a5792f58SBram Moolenaar " place temporary files under .../_ZIPVIM_/ 423a5792f58SBram Moolenaar if isdirectory("_ZIPVIM_") 424a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 425ab194816SBram Moolenaar endif 426a5792f58SBram Moolenaar call mkdir("_ZIPVIM_") 427a5792f58SBram Moolenaar cd _ZIPVIM_ 428ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 429ab194816SBram Moolenaar 4307fc0c065SBram Moolenaar let tarfile = substitute(b:tarfile,'tarfile:\(.\{-}\)::.*$','\1','') 4317fc0c065SBram Moolenaar let fname = substitute(b:tarfile,'tarfile:.\{-}::\(.*\)$','\1','') 432a5792f58SBram Moolenaar 433a5792f58SBram Moolenaar " handle compressed archives 4345c73622aSBram Moolenaar if tarfile =~# '\.bz2' 4355c73622aSBram Moolenaar call system("bzip2 -d -- ".shellescape(tarfile,0)) 4365c73622aSBram Moolenaar let tarfile = substitute(tarfile,'\.bz2','','e') 4375c73622aSBram Moolenaar let compress= "bzip2 -- ".shellescape(tarfile,0) 4385c73622aSBram Moolenaar" call Decho("compress<".compress.">") 4395c73622aSBram Moolenaar elseif tarfile =~# '\.gz' 440*2963456fSBram Moolenaar call system("gzip -d -- ".shellescape(tarfile,0)) 441a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.gz','','e') 4425c73622aSBram Moolenaar let compress= "gzip -- ".shellescape(tarfile,0) 4435c73622aSBram Moolenaar" call Decho("compress<".compress.">") 444a5792f58SBram Moolenaar elseif tarfile =~# '\.tgz' 445*2963456fSBram Moolenaar call system("gzip -d -- ".shellescape(tarfile,0)) 446a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.tgz','.tar','e') 4475c73622aSBram Moolenaar let compress= "gzip -- ".shellescape(tarfile,0) 448a5792f58SBram Moolenaar let tgz = 1 449ed39e1d5SBram Moolenaar" call Decho("compress<".compress.">") 450477db060SBram Moolenaar elseif tarfile =~# '\.xz' 451477db060SBram Moolenaar call system("xz -d -- ".shellescape(tarfile,0)) 452477db060SBram Moolenaar let tarfile = substitute(tarfile,'\.xz','','e') 453477db060SBram Moolenaar let compress= "xz -- ".shellescape(tarfile,0) 454477db060SBram Moolenaar" call Decho("compress<".compress.">") 455477db060SBram Moolenaar elseif tarfile =~# '\.lzma' 456477db060SBram Moolenaar call system("lzma -d -- ".shellescape(tarfile,0)) 457477db060SBram Moolenaar let tarfile = substitute(tarfile,'\.lzma','','e') 458477db060SBram Moolenaar let compress= "lzma -- ".shellescape(tarfile,0) 459477db060SBram Moolenaar" call Decho("compress<".compress.">") 460a5792f58SBram Moolenaar endif 4618c8de839SBram Moolenaar" call Decho("tarfile<".tarfile.">") 462a5792f58SBram Moolenaar 463a5792f58SBram Moolenaar if v:shell_error != 0 464c81e5e79SBram Moolenaar redraw! 465*2963456fSBram Moolenaar" call Decho("***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname) 466a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None 467a5792f58SBram Moolenaar else 468a5792f58SBram Moolenaar 469a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 470a5792f58SBram Moolenaar 4711cbe5f73SBram Moolenaar if fname =~ '/' 472a5792f58SBram Moolenaar let dirpath = substitute(fname,'/[^/]\+$','','e') 473ff034194SBram Moolenaar if has("win32unix") && executable("cygpath") 4745c73622aSBram Moolenaar let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e') 4751cbe5f73SBram Moolenaar endif 4761cbe5f73SBram Moolenaar call mkdir(dirpath,"p") 4771cbe5f73SBram Moolenaar endif 478a5792f58SBram Moolenaar if tarfile !~ '/' 479a5792f58SBram Moolenaar let tarfile= curdir.'/'.tarfile 480a5792f58SBram Moolenaar endif 481ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 482ed39e1d5SBram Moolenaar " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that. 483ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 484ed39e1d5SBram Moolenaar endif 485a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 486a5792f58SBram Moolenaar 487ed39e1d5SBram Moolenaar if exists("g:tar_secure") 488ed39e1d5SBram Moolenaar let tar_secure= " -- " 489ed39e1d5SBram Moolenaar else 490ed39e1d5SBram Moolenaar let tar_secure= " " 491ed39e1d5SBram Moolenaar endif 4928c8de839SBram Moolenaar exe "w! ".fnameescape(fname) 493ff034194SBram Moolenaar if has("win32unix") && executable("cygpath") 4945c73622aSBram Moolenaar let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e') 495ab194816SBram Moolenaar endif 496ab194816SBram Moolenaar 497a5792f58SBram Moolenaar " delete old file from tarfile 498*2963456fSBram Moolenaar" call Decho("system(".g:tar_cmd." ".g:tar_delfile." ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")") 499*2963456fSBram Moolenaar call system(g:tar_cmd." ".g:tar_delfile." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 500ab194816SBram Moolenaar if v:shell_error != 0 501c81e5e79SBram Moolenaar redraw! 502*2963456fSBram Moolenaar" call Decho("***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname)) 5038c8de839SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 504ab194816SBram Moolenaar else 505a5792f58SBram Moolenaar 506a5792f58SBram Moolenaar " update tarfile with new file 5075c73622aSBram Moolenaar" call Decho(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 5085c73622aSBram Moolenaar call system(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 509a5792f58SBram Moolenaar if v:shell_error != 0 510c81e5e79SBram Moolenaar redraw! 511*2963456fSBram Moolenaar" call Decho("***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname)) 5128c8de839SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 513a5792f58SBram Moolenaar elseif exists("compress") 514a5792f58SBram Moolenaar" call Decho("call system(".compress.")") 515a5792f58SBram Moolenaar call system(compress) 516a5792f58SBram Moolenaar if exists("tgz") 517a5792f58SBram Moolenaar" call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")") 518a5792f58SBram Moolenaar call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e')) 519a5792f58SBram Moolenaar endif 520a5792f58SBram Moolenaar endif 521a5792f58SBram Moolenaar endif 522a5792f58SBram Moolenaar 523a5792f58SBram Moolenaar " support writing tarfiles across a network 524a5792f58SBram Moolenaar if s:tblfile_{winnr()} =~ '^\a\+://' 525a5792f58SBram Moolenaar" call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">") 526a5792f58SBram Moolenaar let tblfile= s:tblfile_{winnr()} 527*2963456fSBram Moolenaar 1split|noswapfile enew 5285c73622aSBram Moolenaar let binkeep= &l:binary 529a5792f58SBram Moolenaar let eikeep = &ei 530a5792f58SBram Moolenaar set binary ei=all 531*2963456fSBram Moolenaar exe "noswapfile e! ".fnameescape(tarfile) 532a5792f58SBram Moolenaar call netrw#NetWrite(tblfile) 533a5792f58SBram Moolenaar let &ei = eikeep 5345c73622aSBram Moolenaar let &l:binary = binkeep 535a5792f58SBram Moolenaar q! 536a5792f58SBram Moolenaar unlet s:tblfile_{winnr()} 537a5792f58SBram Moolenaar endif 538ab194816SBram Moolenaar endif 539ab194816SBram Moolenaar 540ab194816SBram Moolenaar " cleanup and restore current directory 541ab194816SBram Moolenaar cd .. 542a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 543c236c16dSBram Moolenaar exe "cd ".fnameescape(curdir) 544ab194816SBram Moolenaar setlocal nomod 545ab194816SBram Moolenaar 546bba577a2SBram Moolenaar let &report= repkeep 547ab194816SBram Moolenaar" call Dret("tar#Write") 548ab194816SBram Moolenaarendfun 549ab194816SBram Moolenaar 550ab194816SBram Moolenaar" --------------------------------------------------------------------- 551ff034194SBram Moolenaar" tar#Diff: {{{2 552ff034194SBram Moolenaarfun! tar#Diff(userfname,fname) 553ff034194SBram Moolenaar" call Dfunc("tar#Diff(userfname<".a:userfname."> fname<".a:fname.")") 554ff034194SBram Moolenaar let fname= a:fname 555ff034194SBram Moolenaar if a:userfname != "" 556ff034194SBram Moolenaar let fname= a:userfname 557ff034194SBram Moolenaar endif 558ff034194SBram Moolenaar if filereadable(fname) 559ff034194SBram Moolenaar " sets current file (from tarball) for diff'ing 560ff034194SBram Moolenaar " splits window vertically 561ff034194SBram Moolenaar " opens original file, sets it for diff'ing 562ff034194SBram Moolenaar " sets up b:tardiff_otherbuf variables so each buffer knows about the other (for closing purposes) 563ff034194SBram Moolenaar diffthis 564ff034194SBram Moolenaar wincmd v 565*2963456fSBram Moolenaar exe "noswapfile e ".fnameescape(fname) 566ff034194SBram Moolenaar diffthis 567ff034194SBram Moolenaar else 568ff034194SBram Moolenaar redraw! 569ff034194SBram Moolenaar echo "***warning*** unable to read file<".fname.">" 570ff034194SBram Moolenaar endif 571ff034194SBram Moolenaar" call Dret("tar#Diff") 572ff034194SBram Moolenaarendfun 573ff034194SBram Moolenaar 574ff034194SBram Moolenaar" --------------------------------------------------------------------- 575*2963456fSBram Moolenaar" tar#Extract: extract a file from a (possibly compressed) tar archive {{{2 576*2963456fSBram Moolenaarfun! tar#Extract() 577*2963456fSBram Moolenaar" call Dfunc("tar#Extract()") 578*2963456fSBram Moolenaar 579*2963456fSBram Moolenaar let repkeep= &report 580*2963456fSBram Moolenaar set report=10 581*2963456fSBram Moolenaar let fname= getline(".") 582*2963456fSBram Moolenaar" call Decho("fname<".fname.">") 583*2963456fSBram Moolenaar 584*2963456fSBram Moolenaar if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-' 585*2963456fSBram Moolenaar redraw! 586*2963456fSBram Moolenaar echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"' 587*2963456fSBram Moolenaar" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"') 588*2963456fSBram Moolenaar return 589*2963456fSBram Moolenaar endif 590*2963456fSBram Moolenaar 591*2963456fSBram Moolenaar " sanity check 592*2963456fSBram Moolenaar if fname =~ '^"' 593*2963456fSBram Moolenaar let &report= repkeep 594*2963456fSBram Moolenaar" call Dret("TarBrowseSelect") 595*2963456fSBram Moolenaar return 596*2963456fSBram Moolenaar endif 597*2963456fSBram Moolenaar 598*2963456fSBram Moolenaar let tarball = expand("%") 599*2963456fSBram Moolenaar" call Decho("tarball<".tarball.">") 600*2963456fSBram Moolenaar let tarbase = substitute(tarball,'\..*$','','') 601*2963456fSBram Moolenaar" call Decho("tarbase<".tarbase.">") 602*2963456fSBram Moolenaar 603*2963456fSBram Moolenaar let extractcmd= netrw#WinPath(g:tar_extractcmd) 604*2963456fSBram Moolenaar if filereadable(tarbase.".tar") 605*2963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar ".shellescape(fname).")") 606*2963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tar ".shellescape(fname)) 607*2963456fSBram Moolenaar if v:shell_error != 0 608*2963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar ".fname.": failed!" | echohl NONE 609*2963456fSBram Moolenaar" call Decho("***error*** ".extractcmd." ".tarbase.".tar ".fname.": failed!") 610*2963456fSBram Moolenaar else 611*2963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 612*2963456fSBram Moolenaar endif 613*2963456fSBram Moolenaar 614*2963456fSBram Moolenaar elseif filereadable(tarbase.".tgz") 615*2963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-z","") 616*2963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tgz ".shellescape(fname).")") 617*2963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tgz ".shellescape(fname)) 618*2963456fSBram Moolenaar if v:shell_error != 0 619*2963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tgz ".fname.": failed!" | echohl NONE 620*2963456fSBram Moolenaar" call Decho("***error*** ".extractcmd."t ".tarbase.".tgz ".fname.": failed!") 621*2963456fSBram Moolenaar else 622*2963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 623*2963456fSBram Moolenaar endif 624*2963456fSBram Moolenaar 625*2963456fSBram Moolenaar elseif filereadable(tarbase.".tar.gz") 626*2963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-z","") 627*2963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.gz ".shellescape(fname).")") 628*2963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tar.gz ".shellescape(fname)) 629*2963456fSBram Moolenaar if v:shell_error != 0 630*2963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.gz ".fname.": failed!" | echohl NONE 631*2963456fSBram Moolenaar" call Decho("***error*** ".extractcmd." ".tarbase.".tar.gz ".fname.": failed!") 632*2963456fSBram Moolenaar else 633*2963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 634*2963456fSBram Moolenaar endif 635*2963456fSBram Moolenaar 636*2963456fSBram Moolenaar elseif filereadable(tarbase.".tbz") 637*2963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-j","") 638*2963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tbz ".shellescape(fname).")") 639*2963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tbz ".shellescape(fname)) 640*2963456fSBram Moolenaar if v:shell_error != 0 641*2963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd."j ".tarbase.".tbz ".fname.": failed!" | echohl NONE 642*2963456fSBram Moolenaar" call Decho("***error*** ".extractcmd."j ".tarbase.".tbz ".fname.": failed!") 643*2963456fSBram Moolenaar else 644*2963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 645*2963456fSBram Moolenaar endif 646*2963456fSBram Moolenaar 647*2963456fSBram Moolenaar elseif filereadable(tarbase.".tar.bz2") 648*2963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-j","") 649*2963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.bz2 ".shellescape(fname).")") 650*2963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tar.bz2 ".shellescape(fname)) 651*2963456fSBram Moolenaar if v:shell_error != 0 652*2963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd."j ".tarbase.".tar.bz2 ".fname.": failed!" | echohl NONE 653*2963456fSBram Moolenaar" call Decho("***error*** ".extractcmd."j ".tarbase.".tar.bz2 ".fname.": failed!") 654*2963456fSBram Moolenaar else 655*2963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 656*2963456fSBram Moolenaar endif 657*2963456fSBram Moolenaar 658*2963456fSBram Moolenaar elseif filereadable(tarbase.".txz") 659*2963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-J","") 660*2963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname).")") 661*2963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname)) 662*2963456fSBram Moolenaar if v:shell_error != 0 663*2963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".txz ".fname.": failed!" | echohl NONE 664*2963456fSBram Moolenaar" call Decho("***error*** ".extractcmd." ".tarbase.".txz ".fname.": failed!") 665*2963456fSBram Moolenaar else 666*2963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 667*2963456fSBram Moolenaar endif 668*2963456fSBram Moolenaar 669*2963456fSBram Moolenaar elseif filereadable(tarbase.".tar.xz") 670*2963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-J","") 671*2963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname).")") 672*2963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname)) 673*2963456fSBram Moolenaar if v:shell_error != 0 674*2963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.xz ".fname.": failed!" | echohl NONE 675*2963456fSBram Moolenaar" call Decho("***error*** ".extractcmd." ".tarbase.".tar.xz ".fname.": failed!") 676*2963456fSBram Moolenaar else 677*2963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 678*2963456fSBram Moolenaar endif 679*2963456fSBram Moolenaar endif 680*2963456fSBram Moolenaar 681*2963456fSBram Moolenaar " restore option 682*2963456fSBram Moolenaar let &report= repkeep 683*2963456fSBram Moolenaar 684*2963456fSBram Moolenaar" call Dret("tar#Extract") 685*2963456fSBram Moolenaarendfun 686*2963456fSBram Moolenaar 687*2963456fSBram Moolenaar" --------------------------------------------------------------------- 6885c73622aSBram Moolenaar" s:Rmdir: {{{2 689ab194816SBram Moolenaarfun! s:Rmdir(fname) 690ab194816SBram Moolenaar" call Dfunc("Rmdir(fname<".a:fname.">)") 691ab194816SBram Moolenaar if has("unix") 6925c73622aSBram Moolenaar call system("/bin/rm -rf -- ".shellescape(a:fname,0)) 693ab194816SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16") 694ab194816SBram Moolenaar if &shell =~? "sh$" 6955c73622aSBram Moolenaar call system("/bin/rm -rf -- ".shellescape(a:fname,0)) 696ab194816SBram Moolenaar else 6975c73622aSBram Moolenaar call system("del /S ".shellescape(a:fname,0)) 698ab194816SBram Moolenaar endif 699ab194816SBram Moolenaar endif 700ab194816SBram Moolenaar" call Dret("Rmdir") 701ab194816SBram Moolenaarendfun 702ab194816SBram Moolenaar 7038c8de839SBram Moolenaar" --------------------------------------------------------------------- 7045c73622aSBram Moolenaar" tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2 7055c73622aSBram Moolenaarfun! tar#Vimuntar(...) 7065c73622aSBram Moolenaar" call Dfunc("tar#Vimuntar() a:0=".a:0." a:1<".(exists("a:1")? a:1 : "-n/a-").">") 7075c73622aSBram Moolenaar let tarball = expand("%") 7085c73622aSBram Moolenaar" call Decho("tarball<".tarball.">") 7095c73622aSBram Moolenaar let tarbase = substitute(tarball,'\..*$','','') 7105c73622aSBram Moolenaar" call Decho("tarbase<".tarbase.">") 7115c73622aSBram Moolenaar let tarhome = expand("%:p") 7125c73622aSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 7135c73622aSBram Moolenaar let tarhome= substitute(tarhome,'\\','/','g') 7145c73622aSBram Moolenaar endif 7155c73622aSBram Moolenaar let tarhome= substitute(tarhome,'/[^/]*$','','') 7165c73622aSBram Moolenaar" call Decho("tarhome<".tarhome.">") 7175c73622aSBram Moolenaar let tartail = expand("%:t") 7185c73622aSBram Moolenaar" call Decho("tartail<".tartail.">") 7195c73622aSBram Moolenaar let curdir = getcwd() 7205c73622aSBram Moolenaar" call Decho("curdir <".curdir.">") 7215c73622aSBram Moolenaar " set up vimhome 7225c73622aSBram Moolenaar if a:0 > 0 && a:1 != "" 7235c73622aSBram Moolenaar let vimhome= a:1 724c236c16dSBram Moolenaar else 7255c73622aSBram Moolenaar let vimhome= vimball#VimballHome() 7265c73622aSBram Moolenaar endif 7275c73622aSBram Moolenaar" call Decho("vimhome<".vimhome.">") 7285c73622aSBram Moolenaar 7295c73622aSBram Moolenaar" call Decho("curdir<".curdir."> vimhome<".vimhome.">") 7305c73622aSBram Moolenaar if simplify(curdir) != simplify(vimhome) 7315c73622aSBram Moolenaar " copy (possibly compressed) tarball to .vim/vimfiles 7325c73622aSBram Moolenaar" call Decho(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome)) 7335c73622aSBram Moolenaar call system(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome)) 7345c73622aSBram Moolenaar" call Decho("exe cd ".fnameescape(vimhome)) 7355c73622aSBram Moolenaar exe "cd ".fnameescape(vimhome) 7365c73622aSBram Moolenaar endif 7375c73622aSBram Moolenaar" call Decho("getcwd<".getcwd().">") 7385c73622aSBram Moolenaar 7395c73622aSBram Moolenaar " if necessary, decompress the tarball; then, extract it 7405c73622aSBram Moolenaar if tartail =~ '\.tgz' 741*2963456fSBram Moolenaar if executable("gunzip") 7425c73622aSBram Moolenaar silent exe "!gunzip ".shellescape(tartail) 7435c73622aSBram Moolenaar elseif executable("gzip") 7445c73622aSBram Moolenaar silent exe "!gzip -d ".shellescape(tartail) 7455c73622aSBram Moolenaar else 7465c73622aSBram Moolenaar echoerr "unable to decompress<".tartail."> on this sytem" 7475c73622aSBram Moolenaar if simplify(curdir) != simplify(tarhome) 7485c73622aSBram Moolenaar " remove decompressed tarball, restore directory 7495c73622aSBram Moolenaar" call Decho("delete(".tartail.".tar)") 7505c73622aSBram Moolenaar call delete(tartail.".tar") 7515c73622aSBram Moolenaar" call Decho("exe cd ".fnameescape(curdir)) 7525c73622aSBram Moolenaar exe "cd ".fnameescape(curdir) 7535c73622aSBram Moolenaar endif 7545c73622aSBram Moolenaar" call Dret("tar#Vimuntar") 7555c73622aSBram Moolenaar return 756c236c16dSBram Moolenaar endif 7578c8de839SBram Moolenaar else 7585c73622aSBram Moolenaar call vimball#Decompress(tartail,0) 7598c8de839SBram Moolenaar endif 7605c73622aSBram Moolenaar let extractcmd= netrw#WinPath(g:tar_extractcmd) 7615c73622aSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase.".tar").")") 7625c73622aSBram Moolenaar call system(extractcmd." ".shellescape(tarbase.".tar")) 7635c73622aSBram Moolenaar 7645c73622aSBram Moolenaar " set up help 7655c73622aSBram Moolenaar if filereadable("doc/".tarbase.".txt") 7665c73622aSBram Moolenaar" call Decho("exe helptags ".getcwd()."/doc") 7675c73622aSBram Moolenaar exe "helptags ".getcwd()."/doc" 7685c73622aSBram Moolenaar endif 7695c73622aSBram Moolenaar 7705c73622aSBram Moolenaar if simplify(tarhome) != simplify(vimhome) 7715c73622aSBram Moolenaar " remove decompressed tarball, restore directory 7725c73622aSBram Moolenaar call delete(vimhome."/".tarbase.".tar") 7735c73622aSBram Moolenaar exe "cd ".fnameescape(curdir) 7745c73622aSBram Moolenaar endif 7755c73622aSBram Moolenaar 7765c73622aSBram Moolenaar" call Dret("tar#Vimuntar") 7778c8de839SBram Moolenaarendfun 7788c8de839SBram Moolenaar 7795c73622aSBram Moolenaar" ===================================================================== 780a5792f58SBram Moolenaar" Modelines And Restoration: {{{1 781a5792f58SBram Moolenaarlet &cpo= s:keepcpo 782a5792f58SBram Moolenaarunlet s:keepcpo 783a5792f58SBram Moolenaar" vim:ts=8 fdm=marker 784