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\+://' 124*8024f936SBram 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 1662963456fSBram Moolenaar elseif tarfile =~# '\.\(tgz\)$' || tarfile =~# '\.\(tbz\)$' || tarfile =~# '\.\(txz\)$' 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." - " 1772963456fSBram Moolenaar else 1782963456fSBram Moolenaar exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 1792963456fSBram Moolenaar endif 1802963456fSBram 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 2072963456fSBram 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 2202963456fSBram Moolenaar " set up maps supported for tar 221a5792f58SBram Moolenaar setlocal noma nomod ro 222a5792f58SBram Moolenaar noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr> 2232963456fSBram Moolenaar noremap <silent> <buffer> x :call tar#Extract()<cr> 2242963456fSBram Moolenaar if &mouse != "" 2252963456fSBram Moolenaar noremap <silent> <buffer> <leftmouse> <leftmouse>:call <SID>TarBrowseSelect()<cr> 2262963456fSBram 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 2632963456fSBram Moolenaar " open a new window (tar#Read will read a file into it) 2642963456fSBram 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 2962963456fSBram 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 3212963456fSBram Moolenaar elseif tarfile =~# '\.\(gz\)$' 3222963456fSBram Moolenaar exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 3232963456fSBram Moolenaar 3242963456fSBram Moolenaar elseif tarfile =~# '\(\.tgz\|\.tbz\|\.txz\)' 3252963456fSBram Moolenaar if has("unix") && executable("file") 3262963456fSBram Moolenaar let filekind= system("file ".shellescape(tarfile,1)) 3272963456fSBram Moolenaar else 3282963456fSBram Moolenaar let filekind= "" 3292963456fSBram Moolenaar endif 3302963456fSBram Moolenaar if filekind =~ "bzip2" 3312963456fSBram Moolenaar exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 3322963456fSBram Moolenaar elseif filekind =~ "XZ" 3332963456fSBram Moolenaar exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 3342963456fSBram Moolenaar else 3352963456fSBram Moolenaar exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 3362963456fSBram Moolenaar endif 3372963456fSBram 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! 3862963456fSBram 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! 3932963456fSBram 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! 4142963456fSBram 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' 4402963456fSBram 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' 4452963456fSBram 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! 4652963456fSBram 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 4982963456fSBram Moolenaar" call Decho("system(".g:tar_cmd." ".g:tar_delfile." ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")") 4992963456fSBram 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! 5022963456fSBram 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! 5112963456fSBram 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()} 5272963456fSBram Moolenaar 1split|noswapfile enew 5285c73622aSBram Moolenaar let binkeep= &l:binary 529a5792f58SBram Moolenaar let eikeep = &ei 530a5792f58SBram Moolenaar set binary ei=all 5312963456fSBram 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 5652963456fSBram 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" --------------------------------------------------------------------- 5752963456fSBram Moolenaar" tar#Extract: extract a file from a (possibly compressed) tar archive {{{2 5762963456fSBram Moolenaarfun! tar#Extract() 5772963456fSBram Moolenaar" call Dfunc("tar#Extract()") 5782963456fSBram Moolenaar 5792963456fSBram Moolenaar let repkeep= &report 5802963456fSBram Moolenaar set report=10 5812963456fSBram Moolenaar let fname= getline(".") 5822963456fSBram Moolenaar" call Decho("fname<".fname.">") 5832963456fSBram Moolenaar 5842963456fSBram Moolenaar if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-' 5852963456fSBram Moolenaar redraw! 5862963456fSBram Moolenaar echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"' 5872963456fSBram Moolenaar" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"') 5882963456fSBram Moolenaar return 5892963456fSBram Moolenaar endif 5902963456fSBram Moolenaar 5912963456fSBram Moolenaar " sanity check 5922963456fSBram Moolenaar if fname =~ '^"' 5932963456fSBram Moolenaar let &report= repkeep 5942963456fSBram Moolenaar" call Dret("TarBrowseSelect") 5952963456fSBram Moolenaar return 5962963456fSBram Moolenaar endif 5972963456fSBram Moolenaar 5982963456fSBram Moolenaar let tarball = expand("%") 5992963456fSBram Moolenaar" call Decho("tarball<".tarball.">") 6002963456fSBram Moolenaar let tarbase = substitute(tarball,'\..*$','','') 6012963456fSBram Moolenaar" call Decho("tarbase<".tarbase.">") 6022963456fSBram Moolenaar 6032963456fSBram Moolenaar let extractcmd= netrw#WinPath(g:tar_extractcmd) 6042963456fSBram Moolenaar if filereadable(tarbase.".tar") 6052963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar ".shellescape(fname).")") 6062963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tar ".shellescape(fname)) 6072963456fSBram Moolenaar if v:shell_error != 0 6082963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar ".fname.": failed!" | echohl NONE 6092963456fSBram Moolenaar" call Decho("***error*** ".extractcmd." ".tarbase.".tar ".fname.": failed!") 6102963456fSBram Moolenaar else 6112963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 6122963456fSBram Moolenaar endif 6132963456fSBram Moolenaar 6142963456fSBram Moolenaar elseif filereadable(tarbase.".tgz") 6152963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-z","") 6162963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tgz ".shellescape(fname).")") 6172963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tgz ".shellescape(fname)) 6182963456fSBram Moolenaar if v:shell_error != 0 6192963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tgz ".fname.": failed!" | echohl NONE 6202963456fSBram Moolenaar" call Decho("***error*** ".extractcmd."t ".tarbase.".tgz ".fname.": failed!") 6212963456fSBram Moolenaar else 6222963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 6232963456fSBram Moolenaar endif 6242963456fSBram Moolenaar 6252963456fSBram Moolenaar elseif filereadable(tarbase.".tar.gz") 6262963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-z","") 6272963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.gz ".shellescape(fname).")") 6282963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tar.gz ".shellescape(fname)) 6292963456fSBram Moolenaar if v:shell_error != 0 6302963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.gz ".fname.": failed!" | echohl NONE 6312963456fSBram Moolenaar" call Decho("***error*** ".extractcmd." ".tarbase.".tar.gz ".fname.": failed!") 6322963456fSBram Moolenaar else 6332963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 6342963456fSBram Moolenaar endif 6352963456fSBram Moolenaar 6362963456fSBram Moolenaar elseif filereadable(tarbase.".tbz") 6372963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-j","") 6382963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tbz ".shellescape(fname).")") 6392963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tbz ".shellescape(fname)) 6402963456fSBram Moolenaar if v:shell_error != 0 6412963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd."j ".tarbase.".tbz ".fname.": failed!" | echohl NONE 6422963456fSBram Moolenaar" call Decho("***error*** ".extractcmd."j ".tarbase.".tbz ".fname.": failed!") 6432963456fSBram Moolenaar else 6442963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 6452963456fSBram Moolenaar endif 6462963456fSBram Moolenaar 6472963456fSBram Moolenaar elseif filereadable(tarbase.".tar.bz2") 6482963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-j","") 6492963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.bz2 ".shellescape(fname).")") 6502963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tar.bz2 ".shellescape(fname)) 6512963456fSBram Moolenaar if v:shell_error != 0 6522963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd."j ".tarbase.".tar.bz2 ".fname.": failed!" | echohl NONE 6532963456fSBram Moolenaar" call Decho("***error*** ".extractcmd."j ".tarbase.".tar.bz2 ".fname.": failed!") 6542963456fSBram Moolenaar else 6552963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 6562963456fSBram Moolenaar endif 6572963456fSBram Moolenaar 6582963456fSBram Moolenaar elseif filereadable(tarbase.".txz") 6592963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-J","") 6602963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname).")") 6612963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname)) 6622963456fSBram Moolenaar if v:shell_error != 0 6632963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".txz ".fname.": failed!" | echohl NONE 6642963456fSBram Moolenaar" call Decho("***error*** ".extractcmd." ".tarbase.".txz ".fname.": failed!") 6652963456fSBram Moolenaar else 6662963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 6672963456fSBram Moolenaar endif 6682963456fSBram Moolenaar 6692963456fSBram Moolenaar elseif filereadable(tarbase.".tar.xz") 6702963456fSBram Moolenaar let extractcmd= substitute(extractcmd,"-","-J","") 6712963456fSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname).")") 6722963456fSBram Moolenaar call system(extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname)) 6732963456fSBram Moolenaar if v:shell_error != 0 6742963456fSBram Moolenaar echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.xz ".fname.": failed!" | echohl NONE 6752963456fSBram Moolenaar" call Decho("***error*** ".extractcmd." ".tarbase.".tar.xz ".fname.": failed!") 6762963456fSBram Moolenaar else 6772963456fSBram Moolenaar echo "***note*** successfully extracted ".fname 6782963456fSBram Moolenaar endif 6792963456fSBram Moolenaar endif 6802963456fSBram Moolenaar 6812963456fSBram Moolenaar " restore option 6822963456fSBram Moolenaar let &report= repkeep 6832963456fSBram Moolenaar 6842963456fSBram Moolenaar" call Dret("tar#Extract") 6852963456fSBram Moolenaarendfun 6862963456fSBram Moolenaar 6872963456fSBram 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' 7412963456fSBram 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