1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles 2a5792f58SBram Moolenaar" AUTOLOAD PORTION 3*251e1912SBram Moolenaar" Date: May 31, 2011 4*251e1912SBram Moolenaar" Version: 27 5c81e5e79SBram Moolenaar" Maintainer: Charles E Campbell, Jr <[email protected]> 6a5792f58SBram Moolenaar" License: Vim License (see vim's :help license) 787e25fdfSBram Moolenaar" 8a5792f58SBram Moolenaar" Contains many ideas from Michael Toren's <tar.vim> 987e25fdfSBram Moolenaar" 10*251e1912SBram Moolenaar" Copyright: Copyright (C) 2005-2011 Charles E. Campbell, Jr. {{{1 11a5792f58SBram Moolenaar" Permission is hereby granted to use and distribute this code, 12a5792f58SBram Moolenaar" with or without modifications, provided that this copyright 13a5792f58SBram Moolenaar" notice is copied with it. Like anything else that's free, 148c8de839SBram Moolenaar" tar.vim and tarPlugin.vim are provided *as is* and comes 158c8de839SBram Moolenaar" with no warranty of any kind, either expressed or implied. 168c8de839SBram Moolenaar" By using this plugin, you agree that in no event will the 178c8de839SBram Moolenaar" copyright holder be liable for any damages resulting from 188c8de839SBram Moolenaar" the use of this software. 195c73622aSBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 20ab194816SBram Moolenaar" --------------------------------------------------------------------- 21c81e5e79SBram Moolenaar" Load Once: {{{1 225c73622aSBram Moolenaarif &cp || exists("g:loaded_tar") 23a5792f58SBram Moolenaar finish 24a5792f58SBram Moolenaarendif 25*251e1912SBram Moolenaarlet g:loaded_tar= "v27" 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 345c73622aSBram Moolenaar"call Decho("loading autoload/tar.vim") 3587e25fdfSBram Moolenaar 36a5792f58SBram Moolenaar" --------------------------------------------------------------------- 37a5792f58SBram Moolenaar" Default Settings: {{{1 38a5792f58SBram Moolenaarif !exists("g:tar_browseoptions") 39a5792f58SBram Moolenaar let g:tar_browseoptions= "Ptf" 40a5792f58SBram Moolenaarendif 41a5792f58SBram Moolenaarif !exists("g:tar_readoptions") 42a5792f58SBram Moolenaar let g:tar_readoptions= "OPxf" 43a5792f58SBram Moolenaarendif 44910f66f9SBram Moolenaarif !exists("g:tar_cmd") 45910f66f9SBram Moolenaar let g:tar_cmd= "tar" 46910f66f9SBram Moolenaarendif 47a5792f58SBram Moolenaarif !exists("g:tar_writeoptions") 48a5792f58SBram Moolenaar let g:tar_writeoptions= "uf" 49a5792f58SBram Moolenaarendif 50*251e1912SBram Moolenaarif !exists("g:netrw_cygwin") 51*251e1912SBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 52*251e1912SBram Moolenaar if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$' 53*251e1912SBram Moolenaar let g:netrw_cygwin= 1 54*251e1912SBram Moolenaar else 55*251e1912SBram Moolenaar let g:netrw_cygwin= 0 56*251e1912SBram Moolenaar endif 57*251e1912SBram Moolenaar else 58*251e1912SBram Moolenaar let g:netrw_cygwin= 0 59*251e1912SBram Moolenaar endif 60*251e1912SBram Moolenaarendif 615c73622aSBram Moolenaarif !exists("g:tar_copycmd") 625c73622aSBram Moolenaar if !exists("g:netrw_localcopycmd") 635c73622aSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 645c73622aSBram Moolenaar if g:netrw_cygwin 655c73622aSBram Moolenaar let g:netrw_localcopycmd= "cp" 665c73622aSBram Moolenaar else 675c73622aSBram Moolenaar let g:netrw_localcopycmd= "copy" 685c73622aSBram Moolenaar endif 695c73622aSBram Moolenaar elseif has("unix") || has("macunix") 705c73622aSBram Moolenaar let g:netrw_localcopycmd= "cp" 715c73622aSBram Moolenaar else 725c73622aSBram Moolenaar let g:netrw_localcopycmd= "" 735c73622aSBram Moolenaar endif 745c73622aSBram Moolenaar endif 755c73622aSBram Moolenaar let g:tar_copycmd= g:netrw_localcopycmd 765c73622aSBram Moolenaarendif 775c73622aSBram Moolenaarif !exists("g:tar_extractcmd") 785c73622aSBram Moolenaar let g:tar_extractcmd= "tar -xf" 795c73622aSBram Moolenaarendif 808c8de839SBram Moolenaar 818c8de839SBram Moolenaar" set up shell quoting character 82c81e5e79SBram Moolenaarif !exists("g:tar_shq") 838c8de839SBram Moolenaar if exists("&shq") && &shq != "" 848c8de839SBram Moolenaar let g:tar_shq= &shq 858c8de839SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16") 868c8de839SBram Moolenaar if exists("g:netrw_cygwin") && g:netrw_cygwin 87c81e5e79SBram Moolenaar let g:tar_shq= "'" 88c81e5e79SBram Moolenaar else 89c81e5e79SBram Moolenaar let g:tar_shq= '"' 90c81e5e79SBram Moolenaar endif 918c8de839SBram Moolenaar else 928c8de839SBram Moolenaar let g:tar_shq= "'" 938c8de839SBram Moolenaar endif 948c8de839SBram Moolenaar" call Decho("g:tar_shq<".g:tar_shq.">") 95c81e5e79SBram Moolenaarendif 96a5792f58SBram Moolenaar 97a5792f58SBram Moolenaar" ---------------- 98a5792f58SBram Moolenaar" Functions: {{{1 99a5792f58SBram Moolenaar" ---------------- 100a5792f58SBram Moolenaar 101a5792f58SBram Moolenaar" --------------------------------------------------------------------- 102a5792f58SBram Moolenaar" tar#Browse: {{{2 103a5792f58SBram Moolenaarfun! tar#Browse(tarfile) 104a5792f58SBram Moolenaar" call Dfunc("tar#Browse(tarfile<".a:tarfile.">)") 105bba577a2SBram Moolenaar let repkeep= &report 106bba577a2SBram Moolenaar set report=10 107a5792f58SBram Moolenaar 108a5792f58SBram Moolenaar " sanity checks 109910f66f9SBram Moolenaar if !executable(g:tar_cmd) 110c81e5e79SBram Moolenaar redraw! 111910f66f9SBram Moolenaar echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' 112bba577a2SBram Moolenaar let &report= repkeep 113a5792f58SBram Moolenaar" call Dret("tar#Browse") 11487e25fdfSBram Moolenaar return 11587e25fdfSBram Moolenaar endif 116a5792f58SBram Moolenaar if !filereadable(a:tarfile) 117910f66f9SBram Moolenaar" call Decho('a:tarfile<'.a:tarfile.'> not filereadable') 118a5792f58SBram Moolenaar if a:tarfile !~# '^\a\+://' 119a5792f58SBram Moolenaar " if its an url, don't complain, let url-handlers such as vim do its thing 120c81e5e79SBram Moolenaar redraw! 121a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None 12287e25fdfSBram Moolenaar endif 123bba577a2SBram Moolenaar let &report= repkeep 124a5792f58SBram Moolenaar" call Dret("tar#Browse : file<".a:tarfile."> not readable") 12587e25fdfSBram Moolenaar return 12687e25fdfSBram Moolenaar endif 127a5792f58SBram Moolenaar if &ma != 1 128a5792f58SBram Moolenaar set ma 12987e25fdfSBram Moolenaar endif 1307fc0c065SBram Moolenaar let b:tarfile= a:tarfile 131a5792f58SBram Moolenaar 132a5792f58SBram Moolenaar setlocal noswapfile 133a5792f58SBram Moolenaar setlocal buftype=nofile 134a5792f58SBram Moolenaar setlocal bufhidden=hide 135a5792f58SBram Moolenaar setlocal nobuflisted 136a5792f58SBram Moolenaar setlocal nowrap 137a5792f58SBram Moolenaar set ft=tar 138a5792f58SBram Moolenaar 139a5792f58SBram Moolenaar " give header 140910f66f9SBram Moolenaar" call Decho("printing header") 1418c8de839SBram Moolenaar let lastline= line("$") 1428c8de839SBram Moolenaar call setline(lastline+1,'" tar.vim version '.g:loaded_tar) 1438c8de839SBram Moolenaar call setline(lastline+2,'" Browsing tarfile '.a:tarfile) 1448c8de839SBram Moolenaar call setline(lastline+3,'" Select a file with cursor and press ENTER') 145*251e1912SBram Moolenaar keepj $put ='' 146*251e1912SBram Moolenaar keepj 0d 147*251e1912SBram Moolenaar keepj $ 148a5792f58SBram Moolenaar 149910f66f9SBram Moolenaar let tarfile= a:tarfile 150910f66f9SBram Moolenaar if has("win32") && executable("cygpath") 151910f66f9SBram Moolenaar " assuming cygwin 1525c73622aSBram Moolenaar let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 153a5792f58SBram Moolenaar endif 154d68071d8SBram Moolenaar let curlast= line("$") 155910f66f9SBram Moolenaar if tarfile =~# '\.\(gz\|tgz\)$' 1565c73622aSBram Moolenaar" call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 157*251e1912SBram Moolenaar exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 1588c8de839SBram Moolenaar elseif tarfile =~# '\.lrp' 1595c73622aSBram Moolenaar" call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ") 160*251e1912SBram Moolenaar exe "sil! r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - " 161910f66f9SBram Moolenaar elseif tarfile =~# '\.bz2$' 1625c73622aSBram Moolenaar" call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 163*251e1912SBram Moolenaar exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 1645c73622aSBram Moolenaar elseif tarfile =~# '\.lzma$' 1655c73622aSBram Moolenaar" call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 166*251e1912SBram Moolenaar exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 167477db060SBram Moolenaar elseif tarfile =~# '\.\(xz\|txz\)$' 168477db060SBram Moolenaar" call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 169*251e1912SBram Moolenaar exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 170910f66f9SBram Moolenaar else 171ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 1725c73622aSBram Moolenaar " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. 173ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 174ed39e1d5SBram Moolenaar endif 1755c73622aSBram Moolenaar" call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0)) 176*251e1912SBram Moolenaar exe "sil! r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1) 177910f66f9SBram Moolenaar endif 178910f66f9SBram Moolenaar if v:shell_error != 0 179c81e5e79SBram Moolenaar redraw! 180d68071d8SBram Moolenaar echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">" 181d68071d8SBram Moolenaar" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 182d68071d8SBram Moolenaar return 183d68071d8SBram Moolenaar endif 184c81e5e79SBram Moolenaar if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)') 185c81e5e79SBram Moolenaar redraw! 186d68071d8SBram Moolenaar echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None 187*251e1912SBram Moolenaar keepj sil! %d 188d68071d8SBram Moolenaar let eikeep= &ei 189d68071d8SBram Moolenaar set ei=BufReadCmd,FileReadCmd 190c236c16dSBram Moolenaar exe "r ".fnameescape(a:tarfile) 191d68071d8SBram Moolenaar let &ei= eikeep 192*251e1912SBram Moolenaar keepj sil! 1d 193d68071d8SBram Moolenaar" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 194910f66f9SBram Moolenaar return 195910f66f9SBram Moolenaar endif 196a5792f58SBram Moolenaar 197a5792f58SBram Moolenaar setlocal noma nomod ro 198a5792f58SBram Moolenaar noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr> 199a5792f58SBram Moolenaar 200bba577a2SBram Moolenaar let &report= repkeep 2017fc0c065SBram Moolenaar" call Dret("tar#Browse : b:tarfile<".b:tarfile.">") 202ab194816SBram Moolenaarendfun 20387e25fdfSBram Moolenaar 204ab194816SBram Moolenaar" --------------------------------------------------------------------- 205a5792f58SBram Moolenaar" TarBrowseSelect: {{{2 206a5792f58SBram Moolenaarfun! s:TarBrowseSelect() 2077fc0c065SBram Moolenaar" call Dfunc("TarBrowseSelect() b:tarfile<".b:tarfile."> curfile<".expand("%").">") 208bba577a2SBram Moolenaar let repkeep= &report 209bba577a2SBram Moolenaar set report=10 210a5792f58SBram Moolenaar let fname= getline(".") 211a5792f58SBram Moolenaar" call Decho("fname<".fname.">") 212a5792f58SBram Moolenaar 213ed39e1d5SBram Moolenaar if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-' 214ed39e1d5SBram Moolenaar redraw! 2155c73622aSBram Moolenaar echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"' 216ed39e1d5SBram Moolenaar" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"') 217ed39e1d5SBram Moolenaar return 218ed39e1d5SBram Moolenaar endif 219ed39e1d5SBram Moolenaar 220a5792f58SBram Moolenaar " sanity check 221a5792f58SBram Moolenaar if fname =~ '^"' 222bba577a2SBram Moolenaar let &report= repkeep 223a5792f58SBram Moolenaar" call Dret("TarBrowseSelect") 224a5792f58SBram Moolenaar return 225a5792f58SBram Moolenaar endif 226a5792f58SBram Moolenaar 2277fc0c065SBram Moolenaar " about to make a new window, need to use b:tarfile 2287fc0c065SBram Moolenaar let tarfile= b:tarfile 229a5792f58SBram Moolenaar let curfile= expand("%") 230910f66f9SBram Moolenaar if has("win32") && executable("cygpath") 231910f66f9SBram Moolenaar " assuming cygwin 2325c73622aSBram Moolenaar let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 233910f66f9SBram Moolenaar endif 234a5792f58SBram Moolenaar 235a5792f58SBram Moolenaar new 2368c8de839SBram Moolenaar if !exists("g:tar_nomax") || g:tar_nomax == 0 237a5792f58SBram Moolenaar wincmd _ 2388c8de839SBram Moolenaar endif 239a5792f58SBram Moolenaar let s:tblfile_{winnr()}= curfile 2408c8de839SBram Moolenaar call tar#Read("tarfile:".tarfile.'::'.fname,1) 241a5792f58SBram Moolenaar filetype detect 242a5792f58SBram Moolenaar 243bba577a2SBram Moolenaar let &report= repkeep 244a5792f58SBram Moolenaar" call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 245a5792f58SBram Moolenaarendfun 246a5792f58SBram Moolenaar 247a5792f58SBram Moolenaar" --------------------------------------------------------------------- 248a5792f58SBram Moolenaar" tar#Read: {{{2 249a5792f58SBram Moolenaarfun! tar#Read(fname,mode) 250a5792f58SBram Moolenaar" call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")") 251bba577a2SBram Moolenaar let repkeep= &report 252bba577a2SBram Moolenaar set report=10 2538c8de839SBram Moolenaar let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','') 2548c8de839SBram Moolenaar let fname = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','') 255910f66f9SBram Moolenaar if has("win32") && executable("cygpath") 256910f66f9SBram Moolenaar " assuming cygwin 2575c73622aSBram Moolenaar let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 258910f66f9SBram Moolenaar endif 259910f66f9SBram Moolenaar" call Decho("tarfile<".tarfile.">") 260910f66f9SBram Moolenaar" call Decho("fname<".fname.">") 261a5792f58SBram Moolenaar 2625c73622aSBram Moolenaar if fname =~ '\.bz2$' && executable("bzcat") 2635c73622aSBram Moolenaar let decmp= "|bzcat" 2645c73622aSBram Moolenaar let doro = 1 2655c73622aSBram Moolenaar elseif fname =~ '\.gz$' && executable("zcat") 2668c8de839SBram Moolenaar let decmp= "|zcat" 2678c8de839SBram Moolenaar let doro = 1 2685c73622aSBram Moolenaar elseif fname =~ '\.lzma$' && executable("lzcat") 2695c73622aSBram Moolenaar let decmp= "|lzcat" 2708c8de839SBram Moolenaar let doro = 1 271477db060SBram Moolenaar elseif fname =~ '\.xz$' && executable("xzcat") 272477db060SBram Moolenaar let decmp= "|xzcat" 273477db060SBram Moolenaar let doro = 1 274a5792f58SBram Moolenaar else 2758c8de839SBram Moolenaar let decmp="" 2768c8de839SBram Moolenaar let doro = 0 277477db060SBram Moolenaar if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.xz$\|\.zip$\|\.Z$' 2788c8de839SBram Moolenaar setlocal bin 279a5792f58SBram Moolenaar endif 2808c8de839SBram Moolenaar endif 2818c8de839SBram Moolenaar 282ed39e1d5SBram Moolenaar if exists("g:tar_secure") 283ed39e1d5SBram Moolenaar let tar_secure= " -- " 2848c8de839SBram Moolenaar else 285ed39e1d5SBram Moolenaar let tar_secure= " " 286ed39e1d5SBram Moolenaar endif 2875c73622aSBram Moolenaar if tarfile =~# '\.bz2$' 2885c73622aSBram Moolenaar" call Decho("7: exe silent r! bzip2 -d -c ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp) 289*251e1912SBram Moolenaar exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 2905c73622aSBram Moolenaar elseif tarfile =~# '\.\(gz\|tgz\)$' 2915c73622aSBram Moolenaar" call Decho("5: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.tar_secure.shellescape(fname,1)) 292*251e1912SBram Moolenaar exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 293ed39e1d5SBram Moolenaar elseif tarfile =~# '\.lrp$' 2945c73622aSBram Moolenaar" call Decho("6: exe silent r! cat ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp) 295*251e1912SBram Moolenaar exe "sil! r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 2965c73622aSBram Moolenaar elseif tarfile =~# '\.lzma$' 2975c73622aSBram Moolenaar" call Decho("7: exe silent r! lzma -d -c ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp) 298*251e1912SBram Moolenaar exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 299477db060SBram Moolenaar elseif tarfile =~# '\.\(xz\|txz\)$' 300477db060SBram Moolenaar" call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp) 301*251e1912SBram Moolenaar exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 302ed39e1d5SBram Moolenaar else 303ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 3045c73622aSBram Moolenaar " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. 305ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 306ed39e1d5SBram Moolenaar endif 3075c73622aSBram Moolenaar" call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions.tar_secure.shellescape(tarfile,1)." ".shellescape(fname,1).decmp) 3085c73622aSBram Moolenaar exe "silent r! ".g:tar_cmd." -".g:tar_readoptions.shellescape(tarfile,1)." ".tar_secure.shellescape(fname,1).decmp 3098c8de839SBram Moolenaar endif 3108c8de839SBram Moolenaar 3118c8de839SBram Moolenaar if doro 3128c8de839SBram Moolenaar " because the reverse process of compressing changed files back into the tarball is not currently supported 3138c8de839SBram Moolenaar setlocal ro 3148c8de839SBram Moolenaar endif 3158c8de839SBram Moolenaar 3167fc0c065SBram Moolenaar let b:tarfile= a:fname 317c236c16dSBram Moolenaar exe "file tarfile::".fnameescape(fname) 318a5792f58SBram Moolenaar 319a5792f58SBram Moolenaar " cleanup 320*251e1912SBram Moolenaar keepj sil! 0d 321a5792f58SBram Moolenaar set nomod 322a5792f58SBram Moolenaar 323bba577a2SBram Moolenaar let &report= repkeep 3247fc0c065SBram Moolenaar" call Dret("tar#Read : b:tarfile<".b:tarfile.">") 325a5792f58SBram Moolenaarendfun 326a5792f58SBram Moolenaar 327a5792f58SBram Moolenaar" --------------------------------------------------------------------- 328a5792f58SBram Moolenaar" tar#Write: {{{2 329a5792f58SBram Moolenaarfun! tar#Write(fname) 3307fc0c065SBram Moolenaar" call Dfunc("tar#Write(fname<".a:fname.">) b:tarfile<".b:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 331bba577a2SBram Moolenaar let repkeep= &report 332bba577a2SBram Moolenaar set report=10 333a5792f58SBram Moolenaar 334ed39e1d5SBram Moolenaar if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-' 335ed39e1d5SBram Moolenaar redraw! 3365c73622aSBram Moolenaar echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"' 337ed39e1d5SBram Moolenaar" call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"') 338ed39e1d5SBram Moolenaar return 339ed39e1d5SBram Moolenaar endif 340ed39e1d5SBram Moolenaar 341ab194816SBram Moolenaar " sanity checks 342910f66f9SBram Moolenaar if !executable(g:tar_cmd) 343c81e5e79SBram Moolenaar redraw! 344910f66f9SBram Moolenaar echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' 345bba577a2SBram Moolenaar let &report= repkeep 346ab194816SBram Moolenaar" call Dret("tar#Write") 347ab194816SBram Moolenaar return 348ab194816SBram Moolenaar endif 349ab194816SBram Moolenaar if !exists("*mkdir") 350c81e5e79SBram Moolenaar redraw! 351a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None 352bba577a2SBram Moolenaar let &report= repkeep 353ab194816SBram Moolenaar" call Dret("tar#Write") 354ab194816SBram Moolenaar return 355ab194816SBram Moolenaar endif 356ab194816SBram Moolenaar 357ab194816SBram Moolenaar let curdir= getcwd() 358ab194816SBram Moolenaar let tmpdir= tempname() 359ab194816SBram Moolenaar" call Decho("orig tempname<".tmpdir.">") 360ab194816SBram Moolenaar if tmpdir =~ '\.' 361ab194816SBram Moolenaar let tmpdir= substitute(tmpdir,'\.[^.]*$','','e') 362ab194816SBram Moolenaar endif 363ab194816SBram Moolenaar" call Decho("tmpdir<".tmpdir.">") 364ab194816SBram Moolenaar call mkdir(tmpdir,"p") 365ab194816SBram Moolenaar 366ab194816SBram Moolenaar " attempt to change to the indicated directory 367ab194816SBram Moolenaar try 3688c8de839SBram Moolenaar exe "cd ".fnameescape(tmpdir) 369ab194816SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E344/ 370c81e5e79SBram Moolenaar redraw! 371a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None 372bba577a2SBram Moolenaar let &report= repkeep 373ab194816SBram Moolenaar" call Dret("tar#Write") 374ab194816SBram Moolenaar return 375ab194816SBram Moolenaar endtry 376ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 377ab194816SBram Moolenaar 378a5792f58SBram Moolenaar " place temporary files under .../_ZIPVIM_/ 379a5792f58SBram Moolenaar if isdirectory("_ZIPVIM_") 380a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 381ab194816SBram Moolenaar endif 382a5792f58SBram Moolenaar call mkdir("_ZIPVIM_") 383a5792f58SBram Moolenaar cd _ZIPVIM_ 384ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 385ab194816SBram Moolenaar 3867fc0c065SBram Moolenaar let tarfile = substitute(b:tarfile,'tarfile:\(.\{-}\)::.*$','\1','') 3877fc0c065SBram Moolenaar let fname = substitute(b:tarfile,'tarfile:.\{-}::\(.*\)$','\1','') 388a5792f58SBram Moolenaar 389a5792f58SBram Moolenaar " handle compressed archives 3905c73622aSBram Moolenaar if tarfile =~# '\.bz2' 3915c73622aSBram Moolenaar call system("bzip2 -d -- ".shellescape(tarfile,0)) 3925c73622aSBram Moolenaar let tarfile = substitute(tarfile,'\.bz2','','e') 3935c73622aSBram Moolenaar let compress= "bzip2 -- ".shellescape(tarfile,0) 3945c73622aSBram Moolenaar" call Decho("compress<".compress.">") 3955c73622aSBram Moolenaar elseif tarfile =~# '\.gz' 3965c73622aSBram Moolenaar call system("gzip -d -- ".shellescape(tarfile,0)) 397a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.gz','','e') 3985c73622aSBram Moolenaar let compress= "gzip -- ".shellescape(tarfile,0) 3995c73622aSBram Moolenaar" call Decho("compress<".compress.">") 400a5792f58SBram Moolenaar elseif tarfile =~# '\.tgz' 4015c73622aSBram Moolenaar call system("gzip -d -- ".shellescape(tarfile,0)) 402a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.tgz','.tar','e') 4035c73622aSBram Moolenaar let compress= "gzip -- ".shellescape(tarfile,0) 404a5792f58SBram Moolenaar let tgz = 1 405ed39e1d5SBram Moolenaar" call Decho("compress<".compress.">") 406477db060SBram Moolenaar elseif tarfile =~# '\.xz' 407477db060SBram Moolenaar call system("xz -d -- ".shellescape(tarfile,0)) 408477db060SBram Moolenaar let tarfile = substitute(tarfile,'\.xz','','e') 409477db060SBram Moolenaar let compress= "xz -- ".shellescape(tarfile,0) 410477db060SBram Moolenaar" call Decho("compress<".compress.">") 411477db060SBram Moolenaar elseif tarfile =~# '\.lzma' 412477db060SBram Moolenaar call system("lzma -d -- ".shellescape(tarfile,0)) 413477db060SBram Moolenaar let tarfile = substitute(tarfile,'\.lzma','','e') 414477db060SBram Moolenaar let compress= "lzma -- ".shellescape(tarfile,0) 415477db060SBram Moolenaar" call Decho("compress<".compress.">") 416a5792f58SBram Moolenaar endif 4178c8de839SBram Moolenaar" call Decho("tarfile<".tarfile.">") 418a5792f58SBram Moolenaar 419a5792f58SBram Moolenaar if v:shell_error != 0 420c81e5e79SBram Moolenaar redraw! 421a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None 422a5792f58SBram Moolenaar else 423a5792f58SBram Moolenaar 424a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 425a5792f58SBram Moolenaar 4261cbe5f73SBram Moolenaar if fname =~ '/' 427a5792f58SBram Moolenaar let dirpath = substitute(fname,'/[^/]\+$','','e') 4281cbe5f73SBram Moolenaar if executable("cygpath") 4295c73622aSBram Moolenaar let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e') 4301cbe5f73SBram Moolenaar endif 4311cbe5f73SBram Moolenaar call mkdir(dirpath,"p") 4321cbe5f73SBram Moolenaar endif 433a5792f58SBram Moolenaar if tarfile !~ '/' 434a5792f58SBram Moolenaar let tarfile= curdir.'/'.tarfile 435a5792f58SBram Moolenaar endif 436ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 437ed39e1d5SBram Moolenaar " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that. 438ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 439ed39e1d5SBram Moolenaar endif 440a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 441a5792f58SBram Moolenaar 442ed39e1d5SBram Moolenaar if exists("g:tar_secure") 443ed39e1d5SBram Moolenaar let tar_secure= " -- " 444ed39e1d5SBram Moolenaar else 445ed39e1d5SBram Moolenaar let tar_secure= " " 446ed39e1d5SBram Moolenaar endif 4478c8de839SBram Moolenaar exe "w! ".fnameescape(fname) 448ab194816SBram Moolenaar if executable("cygpath") 4495c73622aSBram Moolenaar let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e') 450ab194816SBram Moolenaar endif 451ab194816SBram Moolenaar 452a5792f58SBram Moolenaar " delete old file from tarfile 4535c73622aSBram Moolenaar" call Decho("system(".g:tar_cmd." --delete -f ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")") 4545c73622aSBram Moolenaar call system(g:tar_cmd." --delete -f ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 455ab194816SBram Moolenaar if v:shell_error != 0 456c81e5e79SBram Moolenaar redraw! 4578c8de839SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 458ab194816SBram Moolenaar else 459a5792f58SBram Moolenaar 460a5792f58SBram Moolenaar " update tarfile with new file 4615c73622aSBram Moolenaar" call Decho(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 4625c73622aSBram Moolenaar call system(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 463a5792f58SBram Moolenaar if v:shell_error != 0 464c81e5e79SBram Moolenaar redraw! 4658c8de839SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 466a5792f58SBram Moolenaar elseif exists("compress") 467a5792f58SBram Moolenaar" call Decho("call system(".compress.")") 468a5792f58SBram Moolenaar call system(compress) 469a5792f58SBram Moolenaar if exists("tgz") 470a5792f58SBram Moolenaar" call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")") 471a5792f58SBram Moolenaar call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e')) 472a5792f58SBram Moolenaar endif 473a5792f58SBram Moolenaar endif 474a5792f58SBram Moolenaar endif 475a5792f58SBram Moolenaar 476a5792f58SBram Moolenaar " support writing tarfiles across a network 477a5792f58SBram Moolenaar if s:tblfile_{winnr()} =~ '^\a\+://' 478a5792f58SBram Moolenaar" call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">") 479a5792f58SBram Moolenaar let tblfile= s:tblfile_{winnr()} 480a5792f58SBram Moolenaar 1split|enew 4815c73622aSBram Moolenaar let binkeep= &l:binary 482a5792f58SBram Moolenaar let eikeep = &ei 483a5792f58SBram Moolenaar set binary ei=all 484c236c16dSBram Moolenaar exe "e! ".fnameescape(tarfile) 485a5792f58SBram Moolenaar call netrw#NetWrite(tblfile) 486a5792f58SBram Moolenaar let &ei = eikeep 4875c73622aSBram Moolenaar let &l:binary = binkeep 488a5792f58SBram Moolenaar q! 489a5792f58SBram Moolenaar unlet s:tblfile_{winnr()} 490a5792f58SBram Moolenaar endif 491ab194816SBram Moolenaar endif 492ab194816SBram Moolenaar 493ab194816SBram Moolenaar " cleanup and restore current directory 494ab194816SBram Moolenaar cd .. 495a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 496c236c16dSBram Moolenaar exe "cd ".fnameescape(curdir) 497ab194816SBram Moolenaar setlocal nomod 498ab194816SBram Moolenaar 499bba577a2SBram Moolenaar let &report= repkeep 500ab194816SBram Moolenaar" call Dret("tar#Write") 501ab194816SBram Moolenaarendfun 502ab194816SBram Moolenaar 503ab194816SBram Moolenaar" --------------------------------------------------------------------- 5045c73622aSBram Moolenaar" s:Rmdir: {{{2 505ab194816SBram Moolenaarfun! s:Rmdir(fname) 506ab194816SBram Moolenaar" call Dfunc("Rmdir(fname<".a:fname.">)") 507ab194816SBram Moolenaar if has("unix") 5085c73622aSBram Moolenaar call system("/bin/rm -rf -- ".shellescape(a:fname,0)) 509ab194816SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16") 510ab194816SBram Moolenaar if &shell =~? "sh$" 5115c73622aSBram Moolenaar call system("/bin/rm -rf -- ".shellescape(a:fname,0)) 512ab194816SBram Moolenaar else 5135c73622aSBram Moolenaar call system("del /S ".shellescape(a:fname,0)) 514ab194816SBram Moolenaar endif 515ab194816SBram Moolenaar endif 516ab194816SBram Moolenaar" call Dret("Rmdir") 517ab194816SBram Moolenaarendfun 518ab194816SBram Moolenaar 5198c8de839SBram Moolenaar" --------------------------------------------------------------------- 5205c73622aSBram Moolenaar" tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2 5215c73622aSBram Moolenaarfun! tar#Vimuntar(...) 5225c73622aSBram Moolenaar" call Dfunc("tar#Vimuntar() a:0=".a:0." a:1<".(exists("a:1")? a:1 : "-n/a-").">") 5235c73622aSBram Moolenaar let tarball = expand("%") 5245c73622aSBram Moolenaar" call Decho("tarball<".tarball.">") 5255c73622aSBram Moolenaar let tarbase = substitute(tarball,'\..*$','','') 5265c73622aSBram Moolenaar" call Decho("tarbase<".tarbase.">") 5275c73622aSBram Moolenaar let tarhome = expand("%:p") 5285c73622aSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 5295c73622aSBram Moolenaar let tarhome= substitute(tarhome,'\\','/','g') 5305c73622aSBram Moolenaar endif 5315c73622aSBram Moolenaar let tarhome= substitute(tarhome,'/[^/]*$','','') 5325c73622aSBram Moolenaar" call Decho("tarhome<".tarhome.">") 5335c73622aSBram Moolenaar let tartail = expand("%:t") 5345c73622aSBram Moolenaar" call Decho("tartail<".tartail.">") 5355c73622aSBram Moolenaar let curdir = getcwd() 5365c73622aSBram Moolenaar" call Decho("curdir <".curdir.">") 5375c73622aSBram Moolenaar " set up vimhome 5385c73622aSBram Moolenaar if a:0 > 0 && a:1 != "" 5395c73622aSBram Moolenaar let vimhome= a:1 540c236c16dSBram Moolenaar else 5415c73622aSBram Moolenaar let vimhome= vimball#VimballHome() 5425c73622aSBram Moolenaar endif 5435c73622aSBram Moolenaar" call Decho("vimhome<".vimhome.">") 5445c73622aSBram Moolenaar 5455c73622aSBram Moolenaar" call Decho("curdir<".curdir."> vimhome<".vimhome.">") 5465c73622aSBram Moolenaar if simplify(curdir) != simplify(vimhome) 5475c73622aSBram Moolenaar " copy (possibly compressed) tarball to .vim/vimfiles 5485c73622aSBram Moolenaar" call Decho(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome)) 5495c73622aSBram Moolenaar call system(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome)) 5505c73622aSBram Moolenaar" call Decho("exe cd ".fnameescape(vimhome)) 5515c73622aSBram Moolenaar exe "cd ".fnameescape(vimhome) 5525c73622aSBram Moolenaar endif 5535c73622aSBram Moolenaar" call Decho("getcwd<".getcwd().">") 5545c73622aSBram Moolenaar 5555c73622aSBram Moolenaar " if necessary, decompress the tarball; then, extract it 5565c73622aSBram Moolenaar if tartail =~ '\.tgz' 5575c73622aSBram Moolenaar if executable("gunzip") 5585c73622aSBram Moolenaar silent exe "!gunzip ".shellescape(tartail) 5595c73622aSBram Moolenaar elseif executable("gzip") 5605c73622aSBram Moolenaar silent exe "!gzip -d ".shellescape(tartail) 5615c73622aSBram Moolenaar else 5625c73622aSBram Moolenaar echoerr "unable to decompress<".tartail."> on this sytem" 5635c73622aSBram Moolenaar if simplify(curdir) != simplify(tarhome) 5645c73622aSBram Moolenaar " remove decompressed tarball, restore directory 5655c73622aSBram Moolenaar" call Decho("delete(".tartail.".tar)") 5665c73622aSBram Moolenaar call delete(tartail.".tar") 5675c73622aSBram Moolenaar" call Decho("exe cd ".fnameescape(curdir)) 5685c73622aSBram Moolenaar exe "cd ".fnameescape(curdir) 5695c73622aSBram Moolenaar endif 5705c73622aSBram Moolenaar" call Dret("tar#Vimuntar") 5715c73622aSBram Moolenaar return 572c236c16dSBram Moolenaar endif 5738c8de839SBram Moolenaar else 5745c73622aSBram Moolenaar call vimball#Decompress(tartail,0) 5758c8de839SBram Moolenaar endif 5765c73622aSBram Moolenaar let extractcmd= netrw#WinPath(g:tar_extractcmd) 5775c73622aSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase.".tar").")") 5785c73622aSBram Moolenaar call system(extractcmd." ".shellescape(tarbase.".tar")) 5795c73622aSBram Moolenaar 5805c73622aSBram Moolenaar " set up help 5815c73622aSBram Moolenaar if filereadable("doc/".tarbase.".txt") 5825c73622aSBram Moolenaar" call Decho("exe helptags ".getcwd()."/doc") 5835c73622aSBram Moolenaar exe "helptags ".getcwd()."/doc" 5845c73622aSBram Moolenaar endif 5855c73622aSBram Moolenaar 5865c73622aSBram Moolenaar if simplify(tarhome) != simplify(vimhome) 5875c73622aSBram Moolenaar " remove decompressed tarball, restore directory 5885c73622aSBram Moolenaar call delete(vimhome."/".tarbase.".tar") 5895c73622aSBram Moolenaar exe "cd ".fnameescape(curdir) 5905c73622aSBram Moolenaar endif 5915c73622aSBram Moolenaar 5925c73622aSBram Moolenaar" call Dret("tar#Vimuntar") 5938c8de839SBram Moolenaarendfun 5948c8de839SBram Moolenaar 5955c73622aSBram Moolenaar" ===================================================================== 596a5792f58SBram Moolenaar" Modelines And Restoration: {{{1 597a5792f58SBram Moolenaarlet &cpo= s:keepcpo 598a5792f58SBram Moolenaarunlet s:keepcpo 599a5792f58SBram Moolenaar" vim:ts=8 fdm=marker 600