1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles 2a5792f58SBram Moolenaar" AUTOLOAD PORTION 32963456fSBram Moolenaar" Date: Jan 07, 2020 42963456fSBram Moolenaar" Version: 32 52963456fSBram 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" 102963456fSBram 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 252963456fSBram 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 512963456fSBram Moolenaarif !exists("g:tar_delfile") 522963456fSBram Moolenaar let g:tar_delfile="--delete -f" 532963456fSBram 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! 1152963456fSBram 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\+://' 1248024f936SBram Moolenaar " if it's an url, don't complain, let url-handlers such as vim do its thing 125c81e5e79SBram Moolenaar redraw! 1262963456fSBram 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("$") 1612963456fSBram Moolenaar 1622963456fSBram Moolenaar if tarfile =~# '\.\(gz\)$' 1635c73622aSBram Moolenaar" call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 1642963456fSBram Moolenaar exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 1652963456fSBram Moolenaar 166*23515b4eSBram Moolenaar elseif tarfile =~# '\.\(tgz\)$' || tarfile =~# '\.\(tbz\)$' || tarfile =~# '\.\(txz\)$' || tarfile =~# '\.\(tzs\)$' 1672963456fSBram Moolenaar if has("unix") && executable("file") 1682963456fSBram Moolenaar let filekind= system("file ".shellescape(tarfile,1)) =~ "bzip2" 1692963456fSBram Moolenaar else 1702963456fSBram Moolenaar let filekind= "" 1712963456fSBram Moolenaar endif 1722963456fSBram Moolenaar 1732963456fSBram Moolenaar if filekind =~ "bzip2" 1742963456fSBram Moolenaar exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 1752963456fSBram Moolenaar elseif filekind =~ "XZ" 1762963456fSBram Moolenaar exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 177*23515b4eSBram Moolenaar elseif filekind =~ "Zstandard" 178*23515b4eSBram Moolenaar exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 1792963456fSBram Moolenaar else 1802963456fSBram Moolenaar exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 1812963456fSBram Moolenaar endif 1822963456fSBram Moolenaar 1838c8de839SBram Moolenaar elseif tarfile =~# '\.lrp' 1845c73622aSBram Moolenaar" call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ") 185d4a1aabeSBram Moolenaar exe "sil! r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - " 1866be7f873SBram Moolenaar elseif tarfile =~# '\.\(bz2\|tbz\|tb2\)$' 1875c73622aSBram Moolenaar" call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 188251e1912SBram Moolenaar exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 1896be7f873SBram Moolenaar elseif tarfile =~# '\.\(lzma\|tlz\)$' 1905c73622aSBram Moolenaar" call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 191251e1912SBram Moolenaar exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 192477db060SBram Moolenaar elseif tarfile =~# '\.\(xz\|txz\)$' 193477db060SBram Moolenaar" call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 194251e1912SBram Moolenaar exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 195*23515b4eSBram Moolenaar elseif tarfile =~# '\.\(zst\|tzs\)$' 196*23515b4eSBram Moolenaar exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 197910f66f9SBram Moolenaar else 198ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 1995c73622aSBram Moolenaar " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. 200ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 201ed39e1d5SBram Moolenaar endif 2025c73622aSBram Moolenaar" call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0)) 203251e1912SBram Moolenaar exe "sil! r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1) 204910f66f9SBram Moolenaar endif 205910f66f9SBram Moolenaar if v:shell_error != 0 206c81e5e79SBram Moolenaar redraw! 207d68071d8SBram Moolenaar echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">" 208d68071d8SBram Moolenaar" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 209d68071d8SBram Moolenaar return 210d68071d8SBram Moolenaar endif 2112963456fSBram Moolenaar if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~# '\c\%(warning\|error\|inappropriate\|unrecognized\)') 212c81e5e79SBram Moolenaar redraw! 213d68071d8SBram Moolenaar echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None 214251e1912SBram Moolenaar keepj sil! %d 215d68071d8SBram Moolenaar let eikeep= &ei 216d68071d8SBram Moolenaar set ei=BufReadCmd,FileReadCmd 217c236c16dSBram Moolenaar exe "r ".fnameescape(a:tarfile) 218d68071d8SBram Moolenaar let &ei= eikeep 219251e1912SBram Moolenaar keepj sil! 1d 220d68071d8SBram Moolenaar" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 221910f66f9SBram Moolenaar return 222910f66f9SBram Moolenaar endif 223a5792f58SBram Moolenaar 2242963456fSBram Moolenaar " set up maps supported for tar 225a5792f58SBram Moolenaar setlocal noma nomod ro 226a5792f58SBram Moolenaar noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr> 2272963456fSBram Moolenaar noremap <silent> <buffer> x :call tar#Extract()<cr> 2282963456fSBram Moolenaar if &mouse != "" 2292963456fSBram Moolenaar noremap <silent> <buffer> <leftmouse> <leftmouse>:call <SID>TarBrowseSelect()<cr> 2302963456fSBram Moolenaar endif 231a5792f58SBram Moolenaar 232bba577a2SBram Moolenaar let &report= repkeep 2337fc0c065SBram Moolenaar" call Dret("tar#Browse : b:tarfile<".b:tarfile.">") 234ab194816SBram Moolenaarendfun 23587e25fdfSBram Moolenaar 236ab194816SBram Moolenaar" --------------------------------------------------------------------- 237a5792f58SBram Moolenaar" TarBrowseSelect: {{{2 238a5792f58SBram Moolenaarfun! s:TarBrowseSelect() 2397fc0c065SBram Moolenaar" call Dfunc("TarBrowseSelect() b:tarfile<".b:tarfile."> curfile<".expand("%").">") 240bba577a2SBram Moolenaar let repkeep= &report 241bba577a2SBram Moolenaar set report=10 242a5792f58SBram Moolenaar let fname= getline(".") 243a5792f58SBram Moolenaar" call Decho("fname<".fname.">") 244a5792f58SBram Moolenaar 245ed39e1d5SBram Moolenaar if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-' 246ed39e1d5SBram Moolenaar redraw! 2475c73622aSBram Moolenaar echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"' 248ed39e1d5SBram Moolenaar" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"') 249ed39e1d5SBram Moolenaar return 250ed39e1d5SBram Moolenaar endif 251ed39e1d5SBram Moolenaar 252a5792f58SBram Moolenaar " sanity check 253a5792f58SBram Moolenaar if fname =~ '^"' 254bba577a2SBram Moolenaar let &report= repkeep 255a5792f58SBram Moolenaar" call Dret("TarBrowseSelect") 256a5792f58SBram Moolenaar return 257a5792f58SBram Moolenaar endif 258a5792f58SBram Moolenaar 2597fc0c065SBram Moolenaar " about to make a new window, need to use b:tarfile 2607fc0c065SBram Moolenaar let tarfile= b:tarfile 261a5792f58SBram Moolenaar let curfile= expand("%") 262ff034194SBram Moolenaar if has("win32unix") && executable("cygpath") 263910f66f9SBram Moolenaar " assuming cygwin 2645c73622aSBram Moolenaar let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 265910f66f9SBram Moolenaar endif 266a5792f58SBram Moolenaar 2672963456fSBram Moolenaar " open a new window (tar#Read will read a file into it) 2682963456fSBram Moolenaar noswapfile new 2698c8de839SBram Moolenaar if !exists("g:tar_nomax") || g:tar_nomax == 0 270a5792f58SBram Moolenaar wincmd _ 2718c8de839SBram Moolenaar endif 272a5792f58SBram Moolenaar let s:tblfile_{winnr()}= curfile 2738c8de839SBram Moolenaar call tar#Read("tarfile:".tarfile.'::'.fname,1) 274a5792f58SBram Moolenaar filetype detect 275ff034194SBram Moolenaar set nomod 276ff034194SBram Moolenaar exe 'com! -buffer -nargs=? -complete=file TarDiff :call tar#Diff(<q-args>,"'.fnameescape(fname).'")' 277a5792f58SBram Moolenaar 278bba577a2SBram Moolenaar let &report= repkeep 279a5792f58SBram Moolenaar" call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 280a5792f58SBram Moolenaarendfun 281a5792f58SBram Moolenaar 282a5792f58SBram Moolenaar" --------------------------------------------------------------------- 283a5792f58SBram Moolenaar" tar#Read: {{{2 284a5792f58SBram Moolenaarfun! tar#Read(fname,mode) 285a5792f58SBram Moolenaar" call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")") 286bba577a2SBram Moolenaar let repkeep= &report 287bba577a2SBram Moolenaar set report=10 2888c8de839SBram Moolenaar let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','') 2898c8de839SBram Moolenaar let fname = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','') 290ff034194SBram Moolenaar if has("win32unix") && executable("cygpath") 291910f66f9SBram Moolenaar " assuming cygwin 2925c73622aSBram Moolenaar let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 293910f66f9SBram Moolenaar endif 294910f66f9SBram Moolenaar" call Decho("tarfile<".tarfile.">") 295910f66f9SBram Moolenaar" call Decho("fname<".fname.">") 296a5792f58SBram Moolenaar 2975c73622aSBram Moolenaar if fname =~ '\.bz2$' && executable("bzcat") 2985c73622aSBram Moolenaar let decmp= "|bzcat" 2995c73622aSBram Moolenaar let doro = 1 3002963456fSBram Moolenaar elseif fname =~ '\.t\=gz$' && executable("zcat") 3018c8de839SBram Moolenaar let decmp= "|zcat" 3028c8de839SBram Moolenaar let doro = 1 3035c73622aSBram Moolenaar elseif fname =~ '\.lzma$' && executable("lzcat") 3045c73622aSBram Moolenaar let decmp= "|lzcat" 3058c8de839SBram Moolenaar let doro = 1 306477db060SBram Moolenaar elseif fname =~ '\.xz$' && executable("xzcat") 307477db060SBram Moolenaar let decmp= "|xzcat" 308477db060SBram Moolenaar let doro = 1 309*23515b4eSBram Moolenaar elseif fname =~ '\.zst$' && executable("zstdcat") 310*23515b4eSBram Moolenaar let decmp= "|zstdcat" 311*23515b4eSBram Moolenaar let doro = 1 312a5792f58SBram Moolenaar else 3138c8de839SBram Moolenaar let decmp="" 3148c8de839SBram Moolenaar let doro = 0 315477db060SBram Moolenaar if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.xz$\|\.zip$\|\.Z$' 3168c8de839SBram Moolenaar setlocal bin 317a5792f58SBram Moolenaar endif 3188c8de839SBram Moolenaar endif 3198c8de839SBram Moolenaar 320ed39e1d5SBram Moolenaar if exists("g:tar_secure") 321ed39e1d5SBram Moolenaar let tar_secure= " -- " 3228c8de839SBram Moolenaar else 323ed39e1d5SBram Moolenaar let tar_secure= " " 324ed39e1d5SBram Moolenaar endif 32520aac6c1SBram Moolenaar 3265c73622aSBram Moolenaar if tarfile =~# '\.bz2$' 327251e1912SBram Moolenaar exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 3282963456fSBram Moolenaar elseif tarfile =~# '\.\(gz\)$' 3292963456fSBram Moolenaar exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 3302963456fSBram Moolenaar 3312963456fSBram Moolenaar elseif tarfile =~# '\(\.tgz\|\.tbz\|\.txz\)' 3322963456fSBram Moolenaar if has("unix") && executable("file") 3332963456fSBram Moolenaar let filekind= system("file ".shellescape(tarfile,1)) 3342963456fSBram Moolenaar else 3352963456fSBram Moolenaar let filekind= "" 3362963456fSBram Moolenaar endif 3372963456fSBram Moolenaar if filekind =~ "bzip2" 3382963456fSBram Moolenaar exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 3392963456fSBram Moolenaar elseif filekind =~ "XZ" 3402963456fSBram Moolenaar exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 341*23515b4eSBram Moolenaar elseif filekind =~ "Zstandard" 342*23515b4eSBram Moolenaar exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 3432963456fSBram Moolenaar else 3442963456fSBram Moolenaar exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 3452963456fSBram Moolenaar endif 3462963456fSBram Moolenaar 347ed39e1d5SBram Moolenaar elseif tarfile =~# '\.lrp$' 348d4a1aabeSBram Moolenaar exe "sil! r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 3495c73622aSBram Moolenaar elseif tarfile =~# '\.lzma$' 350251e1912SBram Moolenaar exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 351477db060SBram Moolenaar elseif tarfile =~# '\.\(xz\|txz\)$' 352251e1912SBram Moolenaar exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 353ed39e1d5SBram Moolenaar else 354ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 3555c73622aSBram Moolenaar " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. 356ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 357ed39e1d5SBram Moolenaar endif 3585c73622aSBram Moolenaar" call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions.tar_secure.shellescape(tarfile,1)." ".shellescape(fname,1).decmp) 3595c73622aSBram Moolenaar exe "silent r! ".g:tar_cmd." -".g:tar_readoptions.shellescape(tarfile,1)." ".tar_secure.shellescape(fname,1).decmp 3608c8de839SBram Moolenaar endif 3618c8de839SBram Moolenaar 3628c8de839SBram Moolenaar if doro 3638c8de839SBram Moolenaar " because the reverse process of compressing changed files back into the tarball is not currently supported 3648c8de839SBram Moolenaar setlocal ro 3658c8de839SBram Moolenaar endif 3668c8de839SBram Moolenaar 3677fc0c065SBram Moolenaar let b:tarfile= a:fname 368c236c16dSBram Moolenaar exe "file tarfile::".fnameescape(fname) 369a5792f58SBram Moolenaar 370a5792f58SBram Moolenaar " cleanup 371251e1912SBram Moolenaar keepj sil! 0d 372a5792f58SBram Moolenaar set nomod 373a5792f58SBram Moolenaar 374bba577a2SBram Moolenaar let &report= repkeep 3757fc0c065SBram Moolenaar" call Dret("tar#Read : b:tarfile<".b:tarfile.">") 376a5792f58SBram Moolenaarendfun 377a5792f58SBram Moolenaar 378a5792f58SBram Moolenaar" --------------------------------------------------------------------- 379a5792f58SBram Moolenaar" tar#Write: {{{2 380a5792f58SBram Moolenaarfun! tar#Write(fname) 3817fc0c065SBram Moolenaar" call Dfunc("tar#Write(fname<".a:fname.">) b:tarfile<".b:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 382bba577a2SBram Moolenaar let repkeep= &report 383bba577a2SBram Moolenaar set report=10 384a5792f58SBram Moolenaar 385ed39e1d5SBram Moolenaar if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-' 386ed39e1d5SBram Moolenaar redraw! 3875c73622aSBram Moolenaar echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"' 388ed39e1d5SBram Moolenaar" call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"') 389ed39e1d5SBram Moolenaar return 390ed39e1d5SBram Moolenaar endif 391ed39e1d5SBram Moolenaar 392ab194816SBram Moolenaar " sanity checks 393910f66f9SBram Moolenaar if !executable(g:tar_cmd) 394c81e5e79SBram Moolenaar redraw! 3952963456fSBram Moolenaar" call Decho('***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system') 396bba577a2SBram Moolenaar let &report= repkeep 397ab194816SBram Moolenaar" call Dret("tar#Write") 398ab194816SBram Moolenaar return 399ab194816SBram Moolenaar endif 400ab194816SBram Moolenaar if !exists("*mkdir") 401c81e5e79SBram Moolenaar redraw! 4022963456fSBram Moolenaar" call Decho("***error*** (tar#Write) sorry, mkdir() doesn't work on your system") 403a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None 404bba577a2SBram Moolenaar let &report= repkeep 405ab194816SBram Moolenaar" call Dret("tar#Write") 406ab194816SBram Moolenaar return 407ab194816SBram Moolenaar endif 408ab194816SBram Moolenaar 409ab194816SBram Moolenaar let curdir= getcwd() 410ab194816SBram Moolenaar let tmpdir= tempname() 411ab194816SBram Moolenaar" call Decho("orig tempname<".tmpdir.">") 412ab194816SBram Moolenaar if tmpdir =~ '\.' 413ab194816SBram Moolenaar let tmpdir= substitute(tmpdir,'\.[^.]*$','','e') 414ab194816SBram Moolenaar endif 415ab194816SBram Moolenaar" call Decho("tmpdir<".tmpdir.">") 416ab194816SBram Moolenaar call mkdir(tmpdir,"p") 417ab194816SBram Moolenaar 418ab194816SBram Moolenaar " attempt to change to the indicated directory 419ab194816SBram Moolenaar try 4208c8de839SBram Moolenaar exe "cd ".fnameescape(tmpdir) 421ab194816SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E344/ 422c81e5e79SBram Moolenaar redraw! 4232963456fSBram Moolenaar" call Decho("***error*** (tar#Write) cannot cd to temporary directory") 424a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None 425bba577a2SBram Moolenaar let &report= repkeep 426ab194816SBram Moolenaar" call Dret("tar#Write") 427ab194816SBram Moolenaar return 428ab194816SBram Moolenaar endtry 429ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 430ab194816SBram Moolenaar 431a5792f58SBram Moolenaar " place temporary files under .../_ZIPVIM_/ 432a5792f58SBram Moolenaar if isdirectory("_ZIPVIM_") 433a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 434ab194816SBram Moolenaar endif 435a5792f58SBram Moolenaar call mkdir("_ZIPVIM_") 436a5792f58SBram Moolenaar cd _ZIPVIM_ 437ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 438ab194816SBram Moolenaar 4397fc0c065SBram Moolenaar let tarfile = substitute(b:tarfile,'tarfile:\(.\{-}\)::.*$','\1','') 4407fc0c065SBram Moolenaar let fname = substitute(b:tarfile,'tarfile:.\{-}::\(.*\)$','\1','') 441a5792f58SBram Moolenaar 442a5792f58SBram Moolenaar " handle compressed archives 4435c73622aSBram Moolenaar if tarfile =~# '\.bz2' 4445c73622aSBram Moolenaar call system("bzip2 -d -- ".shellescape(tarfile,0)) 4455c73622aSBram Moolenaar let tarfile = substitute(tarfile,'\.bz2','','e') 4465c73622aSBram Moolenaar let compress= "bzip2 -- ".shellescape(tarfile,0) 4475c73622aSBram Moolenaar" call Decho("compress<".compress.">") 4485c73622aSBram Moolenaar elseif tarfile =~# '\.gz' 4492963456fSBram Moolenaar call system("gzip -d -- ".shellescape(tarfile,0)) 450a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.gz','','e') 4515c73622aSBram Moolenaar let compress= "gzip -- ".shellescape(tarfile,0) 4525c73622aSBram Moolenaar" call Decho("compress<".compress.">") 453a5792f58SBram Moolenaar elseif tarfile =~# '\.tgz' 4542963456fSBram Moolenaar call system("gzip -d -- ".shellescape(tarfile,0)) 455a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.tgz','.tar','e') 4565c73622aSBram Moolenaar let compress= "gzip -- ".shellescape(tarfile,0) 457a5792f58SBram Moolenaar let tgz = 1 458ed39e1d5SBram Moolenaar" call Decho("compress<".compress.">") 459477db060SBram Moolenaar elseif tarfile =~# '\.xz' 460477db060SBram Moolenaar call system("xz -d -- ".shellescape(tarfile,0)) 461477db060SBram Moolenaar let tarfile = substitute(tarfile,'\.xz','','e') 462477db060SBram Moolenaar let compress= "xz -- ".shellescape(tarfile,0) 463477db060SBram Moolenaar" call Decho("compress<".compress.">") 464*23515b4eSBram Moolenaar elseif tarfile =~# '\.zst' 465*23515b4eSBram Moolenaar call system("zstd --decompress -- ".shellescape(tarfile,0)) 466*23515b4eSBram Moolenaar let tarfile = substitute(tarfile,'\.zst','','e') 467*23515b4eSBram Moolenaar let compress= "zstd -- ".shellescape(tarfile,0) 468477db060SBram Moolenaar elseif tarfile =~# '\.lzma' 469477db060SBram Moolenaar call system("lzma -d -- ".shellescape(tarfile,0)) 470477db060SBram Moolenaar let tarfile = substitute(tarfile,'\.lzma','','e') 471477db060SBram Moolenaar let compress= "lzma -- ".shellescape(tarfile,0) 472477db060SBram Moolenaar" call Decho("compress<".compress.">") 473a5792f58SBram Moolenaar endif 4748c8de839SBram Moolenaar" call Decho("tarfile<".tarfile.">") 475a5792f58SBram Moolenaar 476a5792f58SBram Moolenaar if v:shell_error != 0 477c81e5e79SBram Moolenaar redraw! 4782963456fSBram Moolenaar" call Decho("***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname) 479a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None 480a5792f58SBram Moolenaar else 481a5792f58SBram Moolenaar 482a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 483a5792f58SBram Moolenaar 4841cbe5f73SBram Moolenaar if fname =~ '/' 485a5792f58SBram Moolenaar let dirpath = substitute(fname,'/[^/]\+$','','e') 486ff034194SBram Moolenaar if has("win32unix") && executable("cygpath") 4875c73622aSBram Moolenaar let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e') 4881cbe5f73SBram Moolenaar endif 4891cbe5f73SBram Moolenaar call mkdir(dirpath,"p") 4901cbe5f73SBram Moolenaar endif 491a5792f58SBram Moolenaar if tarfile !~ '/' 492a5792f58SBram Moolenaar let tarfile= curdir.'/'.tarfile 493a5792f58SBram Moolenaar endif 494ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 495ed39e1d5SBram Moolenaar " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that. 496ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 497ed39e1d5SBram Moolenaar endif 498a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 499a5792f58SBram Moolenaar 500ed39e1d5SBram Moolenaar if exists("g:tar_secure") 501ed39e1d5SBram Moolenaar let tar_secure= " -- " 502ed39e1d5SBram Moolenaar else 503ed39e1d5SBram Moolenaar let tar_secure= " " 504ed39e1d5SBram Moolenaar endif 5058c8de839SBram Moolenaar exe "w! ".fnameescape(fname) 506ff034194SBram Moolenaar if has("win32unix") && executable("cygpath") 5075c73622aSBram Moolenaar let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e') 508ab194816SBram Moolenaar endif 509ab194816SBram Moolenaar 510a5792f58SBram Moolenaar " delete old file from tarfile 5112963456fSBram Moolenaar" call Decho("system(".g:tar_cmd." ".g:tar_delfile." ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")") 5122963456fSBram Moolenaar call system(g:tar_cmd." ".g:tar_delfile." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 513ab194816SBram Moolenaar if v:shell_error != 0 514c81e5e79SBram Moolenaar redraw! 5152963456fSBram Moolenaar" call Decho("***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname)) 5168c8de839SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 517ab194816SBram Moolenaar else 518a5792f58SBram Moolenaar 519a5792f58SBram Moolenaar " update tarfile with new file 5205c73622aSBram Moolenaar" call Decho(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 5215c73622aSBram Moolenaar call system(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 522a5792f58SBram Moolenaar if v:shell_error != 0 523c81e5e79SBram Moolenaar redraw! 5242963456fSBram Moolenaar" call Decho("***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname)) 5258c8de839SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 526a5792f58SBram Moolenaar elseif exists("compress") 527a5792f58SBram Moolenaar" call Decho("call system(".compress.")") 528a5792f58SBram Moolenaar call system(compress) 529a5792f58SBram Moolenaar if exists("tgz") 530a5792f58SBram Moolenaar" call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")") 531a5792f58SBram Moolenaar call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e')) 532a5792f58SBram Moolenaar endif 533a5792f58SBram Moolenaar endif 534a5792f58SBram Moolenaar endif 535a5792f58SBram Moolenaar 536a5792f58SBram Moolenaar " support writing tarfiles across a network 537a5792f58SBram Moolenaar if s:tblfile_{winnr()} =~ '^\a\+://' 538a5792f58SBram Moolenaar" call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">") 539a5792f58SBram Moolenaar let tblfile= s:tblfile_{winnr()} 5402963456fSBram Moolenaar 1split|noswapfile enew 5415c73622aSBram Moolenaar let binkeep= &l:binary 542a5792f58SBram Moolenaar let eikeep = &ei 543a5792f58SBram Moolenaar set binary ei=all 5442963456fSBram Moolenaar exe "noswapfile e! ".fnameescape(tarfile) 545a5792f58SBram Moolenaar call netrw#NetWrite(tblfile) 546a5792f58SBram Moolenaar let &ei = eikeep 5475c73622aSBram Moolenaar let &l:binary = binkeep 548a5792f58SBram Moolenaar q! 549a5792f58SBram Moolenaar unlet s:tblfile_{winnr()} 550a5792f58SBram Moolenaar endif 551ab194816SBram Moolenaar endif 552ab194816SBram Moolenaar 553ab194816SBram Moolenaar " cleanup and restore current directory 554ab194816SBram Moolenaar cd .. 555a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 556c236c16dSBram Moolenaar exe "cd ".fnameescape(curdir) 557ab194816SBram Moolenaar setlocal nomod 558ab194816SBram Moolenaar 559bba577a2SBram Moolenaar let &report= repkeep 560ab194816SBram Moolenaar" call Dret("tar#Write") 561ab194816SBram Moolenaarendfun 562ab194816SBram Moolenaar 563ab194816SBram Moolenaar" --------------------------------------------------------------------- 564ff034194SBram Moolenaar" tar#Diff: {{{2 565ff034194SBram Moolenaarfun! tar#Diff(userfname,fname) 566ff034194SBram Moolenaar" call Dfunc("tar#Diff(userfname<".a:userfname."> fname<".a:fname.")") 567ff034194SBram Moolenaar let fname= a:fname 568ff034194SBram Moolenaar if a:userfname != "" 569ff034194SBram Moolenaar let fname= a:userfname 570ff034194SBram Moolenaar endif 571ff034194SBram Moolenaar if filereadable(fname) 572ff034194SBram Moolenaar " sets current file (from tarball) for diff'ing 573ff034194SBram Moolenaar " splits window vertically 574ff034194SBram Moolenaar " opens original file, sets it for diff'ing 575ff034194SBram Moolenaar " sets up b:tardiff_otherbuf variables so each buffer knows about the other (for closing purposes) 576ff034194SBram Moolenaar diffthis 577ff034194SBram Moolenaar wincmd v 5782963456fSBram Moolenaar exe "noswapfile e ".fnameescape(fname) 579ff034194SBram Moolenaar diffthis 580ff034194SBram Moolenaar else 581ff034194SBram Moolenaar redraw! 582ff034194SBram Moolenaar echo "***warning*** unable to read file<".fname.">" 583ff034194SBram Moolenaar endif 584ff034194SBram Moolenaar" call Dret("tar#Diff") 585ff034194SBram Moolenaarendfun 586ff034194SBram Moolenaar 587ff034194SBram Moolenaar" --------------------------------------------------------------------- 5882963456fSBram Moolenaar" tar#Extract: extract a file from a (possibly compressed) tar archive {{{2 5892963456fSBram Moolenaarfun! tar#Extract() 5902963456fSBram Moolenaar" call Dfunc("tar#Extract()") 5912963456fSBram Moolenaar 5922963456fSBram Moolenaar let repkeep= &report 5932963456fSBram Moolenaar set report=10 5942963456fSBram Moolenaar let fname= getline(".") 5952963456fSBram Moolenaar" call Decho("fname<".fname.">") 5962963456fSBram Moolenaar 5972963456fSBram Moolenaar if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-' 5982963456fSBram Moolenaar redraw! 5992963456fSBram Moolenaar echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"' 6002963456fSBram Moolenaar" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"') 6012963456fSBram Moolenaar return 6022963456fSBram Moolenaar endif 6032963456fSBram Moolenaar 6042963456fSBram Moolenaar " sanity check 6052963456fSBram Moolenaar if fname =~ '^"' 6062963456fSBram Moolenaar let &report= repkeep 6072963456fSBram Moolenaar" call Dret("TarBrowseSelect") 6082963456fSBram Moolenaar return 6092963456fSBram Moolenaar endif 6102963456fSBram Moolenaar 6112963456fSBram Moolenaar let tarball = expand("%") 6122963456fSBram Moolenaar" call Decho("tarball<".tarball.">") 6132963456fSBram Moolenaar let tarbase = substitute(tarball,'\..*$','','') 6142963456fSBram Moolenaar" call Decho("tarbase<".tarbase.">") 6152963456fSBram Moolenaar 6162963456fSBram Moolenaar let extractcmd= netrw#WinPath(g:tar_extractcmd) 6172963456fSBram Moolenaar if filereadable(tarbase.".tar") 6182963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar ".shellescape(fname).")") 6192963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tar ".shellescape(fname)) 6202963456fSBram Moolenaar if v:shell_error != 0 6212963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar ".fname.": failed!" | echohl NONE 6222963456fSBram Moolenaar" call Decho("***error*** ".extractcmd." ".tarbase.".tar ".fname.": failed!") 6232963456fSBram Moolenaar else 6242963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 6252963456fSBram Moolenaar endif 6262963456fSBram Moolenaar 6272963456fSBram Moolenaar elseif filereadable(tarbase.".tgz") 6282963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-z","") 6292963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tgz ".shellescape(fname).")") 6302963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tgz ".shellescape(fname)) 6312963456fSBram Moolenaar if v:shell_error != 0 6322963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tgz ".fname.": failed!" | echohl NONE 6332963456fSBram Moolenaar" call Decho("***error*** ".extractcmd."t ".tarbase.".tgz ".fname.": failed!") 6342963456fSBram Moolenaar else 6352963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 6362963456fSBram Moolenaar endif 6372963456fSBram Moolenaar 6382963456fSBram Moolenaar elseif filereadable(tarbase.".tar.gz") 6392963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-z","") 6402963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.gz ".shellescape(fname).")") 6412963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tar.gz ".shellescape(fname)) 6422963456fSBram Moolenaar if v:shell_error != 0 6432963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.gz ".fname.": failed!" | echohl NONE 6442963456fSBram Moolenaar" call Decho("***error*** ".extractcmd." ".tarbase.".tar.gz ".fname.": failed!") 6452963456fSBram Moolenaar else 6462963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 6472963456fSBram Moolenaar endif 6482963456fSBram Moolenaar 6492963456fSBram Moolenaar elseif filereadable(tarbase.".tbz") 6502963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-j","") 6512963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tbz ".shellescape(fname).")") 6522963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tbz ".shellescape(fname)) 6532963456fSBram Moolenaar if v:shell_error != 0 6542963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd."j ".tarbase.".tbz ".fname.": failed!" | echohl NONE 6552963456fSBram Moolenaar" call Decho("***error*** ".extractcmd."j ".tarbase.".tbz ".fname.": failed!") 6562963456fSBram Moolenaar else 6572963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 6582963456fSBram Moolenaar endif 6592963456fSBram Moolenaar 6602963456fSBram Moolenaar elseif filereadable(tarbase.".tar.bz2") 6612963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-j","") 6622963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.bz2 ".shellescape(fname).")") 6632963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tar.bz2 ".shellescape(fname)) 6642963456fSBram Moolenaar if v:shell_error != 0 6652963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd."j ".tarbase.".tar.bz2 ".fname.": failed!" | echohl NONE 6662963456fSBram Moolenaar" call Decho("***error*** ".extractcmd."j ".tarbase.".tar.bz2 ".fname.": failed!") 6672963456fSBram Moolenaar else 6682963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 6692963456fSBram Moolenaar endif 6702963456fSBram Moolenaar 6712963456fSBram Moolenaar elseif filereadable(tarbase.".txz") 6722963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-J","") 6732963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname).")") 6742963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname)) 6752963456fSBram Moolenaar if v:shell_error != 0 6762963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".txz ".fname.": failed!" | echohl NONE 6772963456fSBram Moolenaar" call Decho("***error*** ".extractcmd." ".tarbase.".txz ".fname.": failed!") 6782963456fSBram Moolenaar else 6792963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 6802963456fSBram Moolenaar endif 6812963456fSBram Moolenaar 6822963456fSBram Moolenaar elseif filereadable(tarbase.".tar.xz") 6832963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-J","") 6842963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname).")") 6852963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname)) 6862963456fSBram Moolenaar if v:shell_error != 0 6872963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.xz ".fname.": failed!" | echohl NONE 6882963456fSBram Moolenaar" call Decho("***error*** ".extractcmd." ".tarbase.".tar.xz ".fname.": failed!") 6892963456fSBram Moolenaar else 6902963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 6912963456fSBram Moolenaar endif 692*23515b4eSBram Moolenaar 693*23515b4eSBram Moolenaar elseif filereadable(tarbase.".tzs") 694*23515b4eSBram Moolenaar let extractcmd= substitute(extractcmd,"-","--zstd","") 695*23515b4eSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tzs ".shellescape(fname).")") 696*23515b4eSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname)) 697*23515b4eSBram Moolenaar if v:shell_error != 0 698*23515b4eSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tzs ".fname.": failed!" | echohl NONE 699*23515b4eSBram Moolenaar" call Decho("***error*** ".extractcmd." ".tarbase.".tzs ".fname.": failed!") 700*23515b4eSBram Moolenaar else 701*23515b4eSBram Moolenaar echo "***note*** successfully extracted ".fname 702*23515b4eSBram Moolenaar endif 703*23515b4eSBram Moolenaar 704*23515b4eSBram Moolenaar elseif filereadable(tarbase.".tar.zst") 705*23515b4eSBram Moolenaar let extractcmd= substitute(extractcmd,"-","--zstd","") 706*23515b4eSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.zst ".shellescape(fname).")") 707*23515b4eSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname)) 708*23515b4eSBram Moolenaar if v:shell_error != 0 709*23515b4eSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.zst ".fname.": failed!" | echohl NONE 710*23515b4eSBram Moolenaar" call Decho("***error*** ".extractcmd." ".tarbase.".tar.zst ".fname.": failed!") 711*23515b4eSBram Moolenaar else 712*23515b4eSBram Moolenaar echo "***note*** successfully extracted ".fname 713*23515b4eSBram Moolenaar endif 7142963456fSBram Moolenaar endif 7152963456fSBram Moolenaar 7162963456fSBram Moolenaar " restore option 7172963456fSBram Moolenaar let &report= repkeep 7182963456fSBram Moolenaar 7192963456fSBram Moolenaar" call Dret("tar#Extract") 7202963456fSBram Moolenaarendfun 7212963456fSBram Moolenaar 7222963456fSBram Moolenaar" --------------------------------------------------------------------- 7235c73622aSBram Moolenaar" s:Rmdir: {{{2 724ab194816SBram Moolenaarfun! s:Rmdir(fname) 725ab194816SBram Moolenaar" call Dfunc("Rmdir(fname<".a:fname.">)") 726ab194816SBram Moolenaar if has("unix") 7275c73622aSBram Moolenaar call system("/bin/rm -rf -- ".shellescape(a:fname,0)) 728ab194816SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16") 729ab194816SBram Moolenaar if &shell =~? "sh$" 7305c73622aSBram Moolenaar call system("/bin/rm -rf -- ".shellescape(a:fname,0)) 731ab194816SBram Moolenaar else 7325c73622aSBram Moolenaar call system("del /S ".shellescape(a:fname,0)) 733ab194816SBram Moolenaar endif 734ab194816SBram Moolenaar endif 735ab194816SBram Moolenaar" call Dret("Rmdir") 736ab194816SBram Moolenaarendfun 737ab194816SBram Moolenaar 7388c8de839SBram Moolenaar" --------------------------------------------------------------------- 7395c73622aSBram Moolenaar" tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2 7405c73622aSBram Moolenaarfun! tar#Vimuntar(...) 7415c73622aSBram Moolenaar" call Dfunc("tar#Vimuntar() a:0=".a:0." a:1<".(exists("a:1")? a:1 : "-n/a-").">") 7425c73622aSBram Moolenaar let tarball = expand("%") 7435c73622aSBram Moolenaar" call Decho("tarball<".tarball.">") 7445c73622aSBram Moolenaar let tarbase = substitute(tarball,'\..*$','','') 7455c73622aSBram Moolenaar" call Decho("tarbase<".tarbase.">") 7465c73622aSBram Moolenaar let tarhome = expand("%:p") 7475c73622aSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 7485c73622aSBram Moolenaar let tarhome= substitute(tarhome,'\\','/','g') 7495c73622aSBram Moolenaar endif 7505c73622aSBram Moolenaar let tarhome= substitute(tarhome,'/[^/]*$','','') 7515c73622aSBram Moolenaar" call Decho("tarhome<".tarhome.">") 7525c73622aSBram Moolenaar let tartail = expand("%:t") 7535c73622aSBram Moolenaar" call Decho("tartail<".tartail.">") 7545c73622aSBram Moolenaar let curdir = getcwd() 7555c73622aSBram Moolenaar" call Decho("curdir <".curdir.">") 7565c73622aSBram Moolenaar " set up vimhome 7575c73622aSBram Moolenaar if a:0 > 0 && a:1 != "" 7585c73622aSBram Moolenaar let vimhome= a:1 759c236c16dSBram Moolenaar else 7605c73622aSBram Moolenaar let vimhome= vimball#VimballHome() 7615c73622aSBram Moolenaar endif 7625c73622aSBram Moolenaar" call Decho("vimhome<".vimhome.">") 7635c73622aSBram Moolenaar 7645c73622aSBram Moolenaar" call Decho("curdir<".curdir."> vimhome<".vimhome.">") 7655c73622aSBram Moolenaar if simplify(curdir) != simplify(vimhome) 7665c73622aSBram Moolenaar " copy (possibly compressed) tarball to .vim/vimfiles 7675c73622aSBram Moolenaar" call Decho(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome)) 7685c73622aSBram Moolenaar call system(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome)) 7695c73622aSBram Moolenaar" call Decho("exe cd ".fnameescape(vimhome)) 7705c73622aSBram Moolenaar exe "cd ".fnameescape(vimhome) 7715c73622aSBram Moolenaar endif 7725c73622aSBram Moolenaar" call Decho("getcwd<".getcwd().">") 7735c73622aSBram Moolenaar 7745c73622aSBram Moolenaar " if necessary, decompress the tarball; then, extract it 7755c73622aSBram Moolenaar if tartail =~ '\.tgz' 7762963456fSBram Moolenaar if executable("gunzip") 7775c73622aSBram Moolenaar silent exe "!gunzip ".shellescape(tartail) 7785c73622aSBram Moolenaar elseif executable("gzip") 7795c73622aSBram Moolenaar silent exe "!gzip -d ".shellescape(tartail) 7805c73622aSBram Moolenaar else 7815c73622aSBram Moolenaar echoerr "unable to decompress<".tartail."> on this sytem" 7825c73622aSBram Moolenaar if simplify(curdir) != simplify(tarhome) 7835c73622aSBram Moolenaar " remove decompressed tarball, restore directory 7845c73622aSBram Moolenaar" call Decho("delete(".tartail.".tar)") 7855c73622aSBram Moolenaar call delete(tartail.".tar") 7865c73622aSBram Moolenaar" call Decho("exe cd ".fnameescape(curdir)) 7875c73622aSBram Moolenaar exe "cd ".fnameescape(curdir) 7885c73622aSBram Moolenaar endif 7895c73622aSBram Moolenaar" call Dret("tar#Vimuntar") 7905c73622aSBram Moolenaar return 791c236c16dSBram Moolenaar endif 7928c8de839SBram Moolenaar else 7935c73622aSBram Moolenaar call vimball#Decompress(tartail,0) 7948c8de839SBram Moolenaar endif 7955c73622aSBram Moolenaar let extractcmd= netrw#WinPath(g:tar_extractcmd) 7965c73622aSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase.".tar").")") 7975c73622aSBram Moolenaar call system(extractcmd." ".shellescape(tarbase.".tar")) 7985c73622aSBram Moolenaar 7995c73622aSBram Moolenaar " set up help 8005c73622aSBram Moolenaar if filereadable("doc/".tarbase.".txt") 8015c73622aSBram Moolenaar" call Decho("exe helptags ".getcwd()."/doc") 8025c73622aSBram Moolenaar exe "helptags ".getcwd()."/doc" 8035c73622aSBram Moolenaar endif 8045c73622aSBram Moolenaar 8055c73622aSBram Moolenaar if simplify(tarhome) != simplify(vimhome) 8065c73622aSBram Moolenaar " remove decompressed tarball, restore directory 8075c73622aSBram Moolenaar call delete(vimhome."/".tarbase.".tar") 8085c73622aSBram Moolenaar exe "cd ".fnameescape(curdir) 8095c73622aSBram Moolenaar endif 8105c73622aSBram Moolenaar 8115c73622aSBram Moolenaar" call Dret("tar#Vimuntar") 8128c8de839SBram Moolenaarendfun 8138c8de839SBram Moolenaar 8145c73622aSBram Moolenaar" ===================================================================== 815a5792f58SBram Moolenaar" Modelines And Restoration: {{{1 816a5792f58SBram Moolenaarlet &cpo= s:keepcpo 817a5792f58SBram Moolenaarunlet s:keepcpo 818a5792f58SBram Moolenaar" vim:ts=8 fdm=marker 819