1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles 2a5792f58SBram Moolenaar" AUTOLOAD PORTION 3*ff034194SBram Moolenaar" Date: Apr 17, 2013 4*ff034194SBram Moolenaar" Version: 29 5*ff034194SBram Moolenaar" Maintainer: Charles E Campbell <[email protected]> 6a5792f58SBram Moolenaar" License: Vim License (see vim's :help license) 787e25fdfSBram Moolenaar" 8a5792f58SBram Moolenaar" Contains many ideas from Michael Toren's <tar.vim> 987e25fdfSBram Moolenaar" 10*ff034194SBram Moolenaar" Copyright: Copyright (C) 2005-2011 Charles E. Campbell {{{1 11a5792f58SBram Moolenaar" Permission is hereby granted to use and distribute this code, 12a5792f58SBram Moolenaar" with or without modifications, provided that this copyright 13a5792f58SBram Moolenaar" notice is copied with it. Like anything else that's free, 148c8de839SBram Moolenaar" tar.vim and tarPlugin.vim are provided *as is* and comes 158c8de839SBram Moolenaar" with no warranty of any kind, either expressed or implied. 168c8de839SBram Moolenaar" By using this plugin, you agree that in no event will the 178c8de839SBram Moolenaar" copyright holder be liable for any damages resulting from 188c8de839SBram Moolenaar" the use of this software. 195c73622aSBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 20ab194816SBram Moolenaar" --------------------------------------------------------------------- 21c81e5e79SBram Moolenaar" Load Once: {{{1 225c73622aSBram Moolenaarif &cp || exists("g:loaded_tar") 23a5792f58SBram Moolenaar finish 24a5792f58SBram Moolenaarendif 25*ff034194SBram Moolenaarlet g:loaded_tar= "v29" 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 34*ff034194SBram 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 51251e1912SBram Moolenaarif !exists("g:netrw_cygwin") 52251e1912SBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 53251e1912SBram Moolenaar if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$' 54251e1912SBram Moolenaar let g:netrw_cygwin= 1 55251e1912SBram Moolenaar else 56251e1912SBram Moolenaar let g:netrw_cygwin= 0 57251e1912SBram Moolenaar endif 58251e1912SBram Moolenaar else 59251e1912SBram Moolenaar let g:netrw_cygwin= 0 60251e1912SBram Moolenaar endif 61251e1912SBram Moolenaarendif 625c73622aSBram Moolenaarif !exists("g:tar_copycmd") 635c73622aSBram Moolenaar if !exists("g:netrw_localcopycmd") 645c73622aSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 655c73622aSBram Moolenaar if g:netrw_cygwin 665c73622aSBram Moolenaar let g:netrw_localcopycmd= "cp" 675c73622aSBram Moolenaar else 685c73622aSBram Moolenaar let g:netrw_localcopycmd= "copy" 695c73622aSBram Moolenaar endif 705c73622aSBram Moolenaar elseif has("unix") || has("macunix") 715c73622aSBram Moolenaar let g:netrw_localcopycmd= "cp" 725c73622aSBram Moolenaar else 735c73622aSBram Moolenaar let g:netrw_localcopycmd= "" 745c73622aSBram Moolenaar endif 755c73622aSBram Moolenaar endif 765c73622aSBram Moolenaar let g:tar_copycmd= g:netrw_localcopycmd 775c73622aSBram Moolenaarendif 785c73622aSBram Moolenaarif !exists("g:tar_extractcmd") 795c73622aSBram Moolenaar let g:tar_extractcmd= "tar -xf" 805c73622aSBram Moolenaarendif 818c8de839SBram Moolenaar 828c8de839SBram Moolenaar" set up shell quoting character 83c81e5e79SBram Moolenaarif !exists("g:tar_shq") 84*ff034194SBram Moolenaar if exists("+shq") && exists("&shq") && &shq != "" 858c8de839SBram Moolenaar let g:tar_shq= &shq 868c8de839SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16") 878c8de839SBram Moolenaar if exists("g:netrw_cygwin") && g:netrw_cygwin 88c81e5e79SBram Moolenaar let g:tar_shq= "'" 89c81e5e79SBram Moolenaar else 90c81e5e79SBram Moolenaar let g:tar_shq= '"' 91c81e5e79SBram Moolenaar endif 928c8de839SBram Moolenaar else 938c8de839SBram Moolenaar let g:tar_shq= "'" 948c8de839SBram Moolenaar endif 958c8de839SBram Moolenaar" call Decho("g:tar_shq<".g:tar_shq.">") 96c81e5e79SBram Moolenaarendif 97a5792f58SBram Moolenaar 98a5792f58SBram Moolenaar" ---------------- 99a5792f58SBram Moolenaar" Functions: {{{1 100a5792f58SBram Moolenaar" ---------------- 101a5792f58SBram Moolenaar 102a5792f58SBram Moolenaar" --------------------------------------------------------------------- 103a5792f58SBram Moolenaar" tar#Browse: {{{2 104a5792f58SBram Moolenaarfun! tar#Browse(tarfile) 105a5792f58SBram Moolenaar" call Dfunc("tar#Browse(tarfile<".a:tarfile.">)") 106bba577a2SBram Moolenaar let repkeep= &report 107bba577a2SBram Moolenaar set report=10 108a5792f58SBram Moolenaar 109a5792f58SBram Moolenaar " sanity checks 110910f66f9SBram Moolenaar if !executable(g:tar_cmd) 111c81e5e79SBram Moolenaar redraw! 112910f66f9SBram Moolenaar echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' 113bba577a2SBram Moolenaar let &report= repkeep 114a5792f58SBram Moolenaar" call Dret("tar#Browse") 11587e25fdfSBram Moolenaar return 11687e25fdfSBram Moolenaar endif 117a5792f58SBram Moolenaar if !filereadable(a:tarfile) 118910f66f9SBram Moolenaar" call Decho('a:tarfile<'.a:tarfile.'> not filereadable') 119a5792f58SBram Moolenaar if a:tarfile !~# '^\a\+://' 120a5792f58SBram Moolenaar " if its an url, don't complain, let url-handlers such as vim do its thing 121c81e5e79SBram Moolenaar redraw! 122a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None 12387e25fdfSBram Moolenaar endif 124bba577a2SBram Moolenaar let &report= repkeep 125a5792f58SBram Moolenaar" call Dret("tar#Browse : file<".a:tarfile."> not readable") 12687e25fdfSBram Moolenaar return 12787e25fdfSBram Moolenaar endif 128a5792f58SBram Moolenaar if &ma != 1 129a5792f58SBram Moolenaar set ma 13087e25fdfSBram Moolenaar endif 1317fc0c065SBram Moolenaar let b:tarfile= a:tarfile 132a5792f58SBram Moolenaar 133a5792f58SBram Moolenaar setlocal noswapfile 134a5792f58SBram Moolenaar setlocal buftype=nofile 135a5792f58SBram Moolenaar setlocal bufhidden=hide 136a5792f58SBram Moolenaar setlocal nobuflisted 137a5792f58SBram Moolenaar setlocal nowrap 138a5792f58SBram Moolenaar set ft=tar 139a5792f58SBram Moolenaar 140a5792f58SBram Moolenaar " give header 141910f66f9SBram Moolenaar" call Decho("printing header") 1428c8de839SBram Moolenaar let lastline= line("$") 1438c8de839SBram Moolenaar call setline(lastline+1,'" tar.vim version '.g:loaded_tar) 1448c8de839SBram Moolenaar call setline(lastline+2,'" Browsing tarfile '.a:tarfile) 1458c8de839SBram Moolenaar call setline(lastline+3,'" Select a file with cursor and press ENTER') 146251e1912SBram Moolenaar keepj $put ='' 1476be7f873SBram Moolenaar keepj sil! 0d 148251e1912SBram Moolenaar keepj $ 149a5792f58SBram Moolenaar 150910f66f9SBram Moolenaar let tarfile= a:tarfile 151*ff034194SBram Moolenaar if has("win32unix") && executable("cygpath") 152910f66f9SBram Moolenaar " assuming cygwin 1535c73622aSBram Moolenaar let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 154a5792f58SBram Moolenaar endif 155d68071d8SBram Moolenaar let curlast= line("$") 156910f66f9SBram Moolenaar if tarfile =~# '\.\(gz\|tgz\)$' 1575c73622aSBram Moolenaar" call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 158251e1912SBram Moolenaar exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 1598c8de839SBram Moolenaar elseif tarfile =~# '\.lrp' 1605c73622aSBram Moolenaar" call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ") 161251e1912SBram Moolenaar exe "sil! r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - " 1626be7f873SBram Moolenaar elseif tarfile =~# '\.\(bz2\|tbz\|tb2\)$' 1635c73622aSBram Moolenaar" call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 164251e1912SBram Moolenaar exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 1656be7f873SBram Moolenaar elseif tarfile =~# '\.\(lzma\|tlz\)$' 1665c73622aSBram Moolenaar" call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 167251e1912SBram Moolenaar exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 168477db060SBram Moolenaar elseif tarfile =~# '\.\(xz\|txz\)$' 169477db060SBram Moolenaar" call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 170251e1912SBram Moolenaar exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 171910f66f9SBram Moolenaar else 172ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 1735c73622aSBram Moolenaar " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. 174ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 175ed39e1d5SBram Moolenaar endif 1765c73622aSBram Moolenaar" call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0)) 177251e1912SBram Moolenaar exe "sil! r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1) 178910f66f9SBram Moolenaar endif 179910f66f9SBram Moolenaar if v:shell_error != 0 180c81e5e79SBram Moolenaar redraw! 181d68071d8SBram Moolenaar echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">" 182d68071d8SBram Moolenaar" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 183d68071d8SBram Moolenaar return 184d68071d8SBram Moolenaar endif 185c81e5e79SBram Moolenaar if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)') 186c81e5e79SBram Moolenaar redraw! 187d68071d8SBram Moolenaar echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None 188251e1912SBram Moolenaar keepj sil! %d 189d68071d8SBram Moolenaar let eikeep= &ei 190d68071d8SBram Moolenaar set ei=BufReadCmd,FileReadCmd 191c236c16dSBram Moolenaar exe "r ".fnameescape(a:tarfile) 192d68071d8SBram Moolenaar let &ei= eikeep 193251e1912SBram Moolenaar keepj sil! 1d 194d68071d8SBram Moolenaar" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 195910f66f9SBram Moolenaar return 196910f66f9SBram Moolenaar endif 197a5792f58SBram Moolenaar 198a5792f58SBram Moolenaar setlocal noma nomod ro 199a5792f58SBram Moolenaar noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr> 200a5792f58SBram Moolenaar 201bba577a2SBram Moolenaar let &report= repkeep 2027fc0c065SBram Moolenaar" call Dret("tar#Browse : b:tarfile<".b:tarfile.">") 203ab194816SBram Moolenaarendfun 20487e25fdfSBram Moolenaar 205ab194816SBram Moolenaar" --------------------------------------------------------------------- 206a5792f58SBram Moolenaar" TarBrowseSelect: {{{2 207a5792f58SBram Moolenaarfun! s:TarBrowseSelect() 2087fc0c065SBram Moolenaar" call Dfunc("TarBrowseSelect() b:tarfile<".b:tarfile."> curfile<".expand("%").">") 209bba577a2SBram Moolenaar let repkeep= &report 210bba577a2SBram Moolenaar set report=10 211a5792f58SBram Moolenaar let fname= getline(".") 212a5792f58SBram Moolenaar" call Decho("fname<".fname.">") 213a5792f58SBram Moolenaar 214ed39e1d5SBram Moolenaar if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-' 215ed39e1d5SBram Moolenaar redraw! 2165c73622aSBram Moolenaar echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"' 217ed39e1d5SBram Moolenaar" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"') 218ed39e1d5SBram Moolenaar return 219ed39e1d5SBram Moolenaar endif 220ed39e1d5SBram Moolenaar 221a5792f58SBram Moolenaar " sanity check 222a5792f58SBram Moolenaar if fname =~ '^"' 223bba577a2SBram Moolenaar let &report= repkeep 224a5792f58SBram Moolenaar" call Dret("TarBrowseSelect") 225a5792f58SBram Moolenaar return 226a5792f58SBram Moolenaar endif 227a5792f58SBram Moolenaar 2287fc0c065SBram Moolenaar " about to make a new window, need to use b:tarfile 2297fc0c065SBram Moolenaar let tarfile= b:tarfile 230a5792f58SBram Moolenaar let curfile= expand("%") 231*ff034194SBram Moolenaar if has("win32unix") && executable("cygpath") 232910f66f9SBram Moolenaar " assuming cygwin 2335c73622aSBram Moolenaar let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 234910f66f9SBram Moolenaar endif 235a5792f58SBram Moolenaar 236a5792f58SBram Moolenaar new 2378c8de839SBram Moolenaar if !exists("g:tar_nomax") || g:tar_nomax == 0 238a5792f58SBram Moolenaar wincmd _ 2398c8de839SBram Moolenaar endif 240a5792f58SBram Moolenaar let s:tblfile_{winnr()}= curfile 2418c8de839SBram Moolenaar call tar#Read("tarfile:".tarfile.'::'.fname,1) 242a5792f58SBram Moolenaar filetype detect 243*ff034194SBram Moolenaar set nomod 244*ff034194SBram Moolenaar exe 'com! -buffer -nargs=? -complete=file TarDiff :call tar#Diff(<q-args>,"'.fnameescape(fname).'")' 245a5792f58SBram Moolenaar 246bba577a2SBram Moolenaar let &report= repkeep 247a5792f58SBram Moolenaar" call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 248a5792f58SBram Moolenaarendfun 249a5792f58SBram Moolenaar 250a5792f58SBram Moolenaar" --------------------------------------------------------------------- 251a5792f58SBram Moolenaar" tar#Read: {{{2 252a5792f58SBram Moolenaarfun! tar#Read(fname,mode) 253a5792f58SBram Moolenaar" call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")") 254bba577a2SBram Moolenaar let repkeep= &report 255bba577a2SBram Moolenaar set report=10 2568c8de839SBram Moolenaar let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','') 2578c8de839SBram Moolenaar let fname = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','') 258*ff034194SBram 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 262910f66f9SBram Moolenaar" call Decho("tarfile<".tarfile.">") 263910f66f9SBram Moolenaar" call Decho("fname<".fname.">") 264a5792f58SBram Moolenaar 2655c73622aSBram Moolenaar if fname =~ '\.bz2$' && executable("bzcat") 2665c73622aSBram Moolenaar let decmp= "|bzcat" 2675c73622aSBram Moolenaar let doro = 1 2685c73622aSBram Moolenaar elseif fname =~ '\.gz$' && executable("zcat") 2698c8de839SBram Moolenaar let decmp= "|zcat" 2708c8de839SBram Moolenaar let doro = 1 2715c73622aSBram Moolenaar elseif fname =~ '\.lzma$' && executable("lzcat") 2725c73622aSBram Moolenaar let decmp= "|lzcat" 2738c8de839SBram Moolenaar let doro = 1 274477db060SBram Moolenaar elseif fname =~ '\.xz$' && executable("xzcat") 275477db060SBram Moolenaar let decmp= "|xzcat" 276477db060SBram Moolenaar let doro = 1 277a5792f58SBram Moolenaar else 2788c8de839SBram Moolenaar let decmp="" 2798c8de839SBram Moolenaar let doro = 0 280477db060SBram Moolenaar if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.xz$\|\.zip$\|\.Z$' 2818c8de839SBram Moolenaar setlocal bin 282a5792f58SBram Moolenaar endif 2838c8de839SBram Moolenaar endif 2848c8de839SBram Moolenaar 285ed39e1d5SBram Moolenaar if exists("g:tar_secure") 286ed39e1d5SBram Moolenaar let tar_secure= " -- " 2878c8de839SBram Moolenaar else 288ed39e1d5SBram Moolenaar let tar_secure= " " 289ed39e1d5SBram Moolenaar endif 2905c73622aSBram Moolenaar if tarfile =~# '\.bz2$' 2915c73622aSBram 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) 292251e1912SBram Moolenaar exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 2935c73622aSBram Moolenaar elseif tarfile =~# '\.\(gz\|tgz\)$' 2945c73622aSBram Moolenaar" call Decho("5: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.tar_secure.shellescape(fname,1)) 295251e1912SBram Moolenaar exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 296ed39e1d5SBram Moolenaar elseif tarfile =~# '\.lrp$' 2975c73622aSBram 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) 298251e1912SBram Moolenaar exe "sil! r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 2995c73622aSBram Moolenaar elseif tarfile =~# '\.lzma$' 3005c73622aSBram 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) 301251e1912SBram Moolenaar exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 302477db060SBram Moolenaar elseif tarfile =~# '\.\(xz\|txz\)$' 303477db060SBram 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) 304251e1912SBram Moolenaar exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 305ed39e1d5SBram Moolenaar else 306ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 3075c73622aSBram Moolenaar " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. 308ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 309ed39e1d5SBram Moolenaar endif 3105c73622aSBram Moolenaar" call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions.tar_secure.shellescape(tarfile,1)." ".shellescape(fname,1).decmp) 3115c73622aSBram Moolenaar exe "silent r! ".g:tar_cmd." -".g:tar_readoptions.shellescape(tarfile,1)." ".tar_secure.shellescape(fname,1).decmp 3128c8de839SBram Moolenaar endif 3138c8de839SBram Moolenaar 3148c8de839SBram Moolenaar if doro 3158c8de839SBram Moolenaar " because the reverse process of compressing changed files back into the tarball is not currently supported 3168c8de839SBram Moolenaar setlocal ro 3178c8de839SBram Moolenaar endif 3188c8de839SBram Moolenaar 3197fc0c065SBram Moolenaar let b:tarfile= a:fname 320c236c16dSBram Moolenaar exe "file tarfile::".fnameescape(fname) 321a5792f58SBram Moolenaar 322a5792f58SBram Moolenaar " cleanup 323251e1912SBram Moolenaar keepj sil! 0d 324a5792f58SBram Moolenaar set nomod 325a5792f58SBram Moolenaar 326bba577a2SBram Moolenaar let &report= repkeep 3277fc0c065SBram Moolenaar" call Dret("tar#Read : b:tarfile<".b:tarfile.">") 328a5792f58SBram Moolenaarendfun 329a5792f58SBram Moolenaar 330a5792f58SBram Moolenaar" --------------------------------------------------------------------- 331a5792f58SBram Moolenaar" tar#Write: {{{2 332a5792f58SBram Moolenaarfun! tar#Write(fname) 3337fc0c065SBram Moolenaar" call Dfunc("tar#Write(fname<".a:fname.">) b:tarfile<".b:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 334bba577a2SBram Moolenaar let repkeep= &report 335bba577a2SBram Moolenaar set report=10 336a5792f58SBram Moolenaar 337ed39e1d5SBram Moolenaar if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-' 338ed39e1d5SBram Moolenaar redraw! 3395c73622aSBram Moolenaar echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"' 340ed39e1d5SBram Moolenaar" call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"') 341ed39e1d5SBram Moolenaar return 342ed39e1d5SBram Moolenaar endif 343ed39e1d5SBram Moolenaar 344ab194816SBram Moolenaar " sanity checks 345910f66f9SBram Moolenaar if !executable(g:tar_cmd) 346c81e5e79SBram Moolenaar redraw! 347910f66f9SBram Moolenaar echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' 348bba577a2SBram Moolenaar let &report= repkeep 349ab194816SBram Moolenaar" call Dret("tar#Write") 350ab194816SBram Moolenaar return 351ab194816SBram Moolenaar endif 352ab194816SBram Moolenaar if !exists("*mkdir") 353c81e5e79SBram Moolenaar redraw! 354a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None 355bba577a2SBram Moolenaar let &report= repkeep 356ab194816SBram Moolenaar" call Dret("tar#Write") 357ab194816SBram Moolenaar return 358ab194816SBram Moolenaar endif 359ab194816SBram Moolenaar 360ab194816SBram Moolenaar let curdir= getcwd() 361ab194816SBram Moolenaar let tmpdir= tempname() 362ab194816SBram Moolenaar" call Decho("orig tempname<".tmpdir.">") 363ab194816SBram Moolenaar if tmpdir =~ '\.' 364ab194816SBram Moolenaar let tmpdir= substitute(tmpdir,'\.[^.]*$','','e') 365ab194816SBram Moolenaar endif 366ab194816SBram Moolenaar" call Decho("tmpdir<".tmpdir.">") 367ab194816SBram Moolenaar call mkdir(tmpdir,"p") 368ab194816SBram Moolenaar 369ab194816SBram Moolenaar " attempt to change to the indicated directory 370ab194816SBram Moolenaar try 3718c8de839SBram Moolenaar exe "cd ".fnameescape(tmpdir) 372ab194816SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E344/ 373c81e5e79SBram Moolenaar redraw! 374a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None 375bba577a2SBram Moolenaar let &report= repkeep 376ab194816SBram Moolenaar" call Dret("tar#Write") 377ab194816SBram Moolenaar return 378ab194816SBram Moolenaar endtry 379ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 380ab194816SBram Moolenaar 381a5792f58SBram Moolenaar " place temporary files under .../_ZIPVIM_/ 382a5792f58SBram Moolenaar if isdirectory("_ZIPVIM_") 383a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 384ab194816SBram Moolenaar endif 385a5792f58SBram Moolenaar call mkdir("_ZIPVIM_") 386a5792f58SBram Moolenaar cd _ZIPVIM_ 387ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 388ab194816SBram Moolenaar 3897fc0c065SBram Moolenaar let tarfile = substitute(b:tarfile,'tarfile:\(.\{-}\)::.*$','\1','') 3907fc0c065SBram Moolenaar let fname = substitute(b:tarfile,'tarfile:.\{-}::\(.*\)$','\1','') 391a5792f58SBram Moolenaar 392a5792f58SBram Moolenaar " handle compressed archives 3935c73622aSBram Moolenaar if tarfile =~# '\.bz2' 3945c73622aSBram Moolenaar call system("bzip2 -d -- ".shellescape(tarfile,0)) 3955c73622aSBram Moolenaar let tarfile = substitute(tarfile,'\.bz2','','e') 3965c73622aSBram Moolenaar let compress= "bzip2 -- ".shellescape(tarfile,0) 3975c73622aSBram Moolenaar" call Decho("compress<".compress.">") 3985c73622aSBram Moolenaar elseif tarfile =~# '\.gz' 3995c73622aSBram Moolenaar call system("gzip -d -- ".shellescape(tarfile,0)) 400a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.gz','','e') 4015c73622aSBram Moolenaar let compress= "gzip -- ".shellescape(tarfile,0) 4025c73622aSBram Moolenaar" call Decho("compress<".compress.">") 403a5792f58SBram Moolenaar elseif tarfile =~# '\.tgz' 4045c73622aSBram Moolenaar call system("gzip -d -- ".shellescape(tarfile,0)) 405a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.tgz','.tar','e') 4065c73622aSBram Moolenaar let compress= "gzip -- ".shellescape(tarfile,0) 407a5792f58SBram Moolenaar let tgz = 1 408ed39e1d5SBram Moolenaar" call Decho("compress<".compress.">") 409477db060SBram Moolenaar elseif tarfile =~# '\.xz' 410477db060SBram Moolenaar call system("xz -d -- ".shellescape(tarfile,0)) 411477db060SBram Moolenaar let tarfile = substitute(tarfile,'\.xz','','e') 412477db060SBram Moolenaar let compress= "xz -- ".shellescape(tarfile,0) 413477db060SBram Moolenaar" call Decho("compress<".compress.">") 414477db060SBram Moolenaar elseif tarfile =~# '\.lzma' 415477db060SBram Moolenaar call system("lzma -d -- ".shellescape(tarfile,0)) 416477db060SBram Moolenaar let tarfile = substitute(tarfile,'\.lzma','','e') 417477db060SBram Moolenaar let compress= "lzma -- ".shellescape(tarfile,0) 418477db060SBram Moolenaar" call Decho("compress<".compress.">") 419a5792f58SBram Moolenaar endif 4208c8de839SBram Moolenaar" call Decho("tarfile<".tarfile.">") 421a5792f58SBram Moolenaar 422a5792f58SBram Moolenaar if v:shell_error != 0 423c81e5e79SBram Moolenaar redraw! 424a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None 425a5792f58SBram Moolenaar else 426a5792f58SBram Moolenaar 427a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 428a5792f58SBram Moolenaar 4291cbe5f73SBram Moolenaar if fname =~ '/' 430a5792f58SBram Moolenaar let dirpath = substitute(fname,'/[^/]\+$','','e') 431*ff034194SBram Moolenaar if has("win32unix") && executable("cygpath") 4325c73622aSBram Moolenaar let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e') 4331cbe5f73SBram Moolenaar endif 4341cbe5f73SBram Moolenaar call mkdir(dirpath,"p") 4351cbe5f73SBram Moolenaar endif 436a5792f58SBram Moolenaar if tarfile !~ '/' 437a5792f58SBram Moolenaar let tarfile= curdir.'/'.tarfile 438a5792f58SBram Moolenaar endif 439ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 440ed39e1d5SBram Moolenaar " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that. 441ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 442ed39e1d5SBram Moolenaar endif 443a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 444a5792f58SBram Moolenaar 445ed39e1d5SBram Moolenaar if exists("g:tar_secure") 446ed39e1d5SBram Moolenaar let tar_secure= " -- " 447ed39e1d5SBram Moolenaar else 448ed39e1d5SBram Moolenaar let tar_secure= " " 449ed39e1d5SBram Moolenaar endif 4508c8de839SBram Moolenaar exe "w! ".fnameescape(fname) 451*ff034194SBram Moolenaar if has("win32unix") && executable("cygpath") 4525c73622aSBram Moolenaar let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e') 453ab194816SBram Moolenaar endif 454ab194816SBram Moolenaar 455a5792f58SBram Moolenaar " delete old file from tarfile 4565c73622aSBram Moolenaar" call Decho("system(".g:tar_cmd." --delete -f ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")") 4575c73622aSBram Moolenaar call system(g:tar_cmd." --delete -f ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 458ab194816SBram Moolenaar if v:shell_error != 0 459c81e5e79SBram Moolenaar redraw! 4608c8de839SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 461ab194816SBram Moolenaar else 462a5792f58SBram Moolenaar 463a5792f58SBram Moolenaar " update tarfile with new file 4645c73622aSBram Moolenaar" call Decho(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 4655c73622aSBram Moolenaar call system(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 466a5792f58SBram Moolenaar if v:shell_error != 0 467c81e5e79SBram Moolenaar redraw! 4688c8de839SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 469a5792f58SBram Moolenaar elseif exists("compress") 470a5792f58SBram Moolenaar" call Decho("call system(".compress.")") 471a5792f58SBram Moolenaar call system(compress) 472a5792f58SBram Moolenaar if exists("tgz") 473a5792f58SBram Moolenaar" call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")") 474a5792f58SBram Moolenaar call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e')) 475a5792f58SBram Moolenaar endif 476a5792f58SBram Moolenaar endif 477a5792f58SBram Moolenaar endif 478a5792f58SBram Moolenaar 479a5792f58SBram Moolenaar " support writing tarfiles across a network 480a5792f58SBram Moolenaar if s:tblfile_{winnr()} =~ '^\a\+://' 481a5792f58SBram Moolenaar" call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">") 482a5792f58SBram Moolenaar let tblfile= s:tblfile_{winnr()} 483a5792f58SBram Moolenaar 1split|enew 4845c73622aSBram Moolenaar let binkeep= &l:binary 485a5792f58SBram Moolenaar let eikeep = &ei 486a5792f58SBram Moolenaar set binary ei=all 487c236c16dSBram Moolenaar exe "e! ".fnameescape(tarfile) 488a5792f58SBram Moolenaar call netrw#NetWrite(tblfile) 489a5792f58SBram Moolenaar let &ei = eikeep 4905c73622aSBram Moolenaar let &l:binary = binkeep 491a5792f58SBram Moolenaar q! 492a5792f58SBram Moolenaar unlet s:tblfile_{winnr()} 493a5792f58SBram Moolenaar endif 494ab194816SBram Moolenaar endif 495ab194816SBram Moolenaar 496ab194816SBram Moolenaar " cleanup and restore current directory 497ab194816SBram Moolenaar cd .. 498a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 499c236c16dSBram Moolenaar exe "cd ".fnameescape(curdir) 500ab194816SBram Moolenaar setlocal nomod 501ab194816SBram Moolenaar 502bba577a2SBram Moolenaar let &report= repkeep 503ab194816SBram Moolenaar" call Dret("tar#Write") 504ab194816SBram Moolenaarendfun 505ab194816SBram Moolenaar 506ab194816SBram Moolenaar" --------------------------------------------------------------------- 507*ff034194SBram Moolenaar" tar#Diff: {{{2 508*ff034194SBram Moolenaarfun! tar#Diff(userfname,fname) 509*ff034194SBram Moolenaar" call Dfunc("tar#Diff(userfname<".a:userfname."> fname<".a:fname.")") 510*ff034194SBram Moolenaar let fname= a:fname 511*ff034194SBram Moolenaar if a:userfname != "" 512*ff034194SBram Moolenaar let fname= a:userfname 513*ff034194SBram Moolenaar endif 514*ff034194SBram Moolenaar if filereadable(fname) 515*ff034194SBram Moolenaar " sets current file (from tarball) for diff'ing 516*ff034194SBram Moolenaar " splits window vertically 517*ff034194SBram Moolenaar " opens original file, sets it for diff'ing 518*ff034194SBram Moolenaar " sets up b:tardiff_otherbuf variables so each buffer knows about the other (for closing purposes) 519*ff034194SBram Moolenaar diffthis 520*ff034194SBram Moolenaar wincmd v 521*ff034194SBram Moolenaar exe "e ".fnameescape(fname) 522*ff034194SBram Moolenaar diffthis 523*ff034194SBram Moolenaar else 524*ff034194SBram Moolenaar redraw! 525*ff034194SBram Moolenaar echo "***warning*** unable to read file<".fname.">" 526*ff034194SBram Moolenaar endif 527*ff034194SBram Moolenaar" call Dret("tar#Diff") 528*ff034194SBram Moolenaarendfun 529*ff034194SBram Moolenaar 530*ff034194SBram Moolenaar" --------------------------------------------------------------------- 5315c73622aSBram Moolenaar" s:Rmdir: {{{2 532ab194816SBram Moolenaarfun! s:Rmdir(fname) 533ab194816SBram Moolenaar" call Dfunc("Rmdir(fname<".a:fname.">)") 534ab194816SBram Moolenaar if has("unix") 5355c73622aSBram Moolenaar call system("/bin/rm -rf -- ".shellescape(a:fname,0)) 536ab194816SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16") 537ab194816SBram Moolenaar if &shell =~? "sh$" 5385c73622aSBram Moolenaar call system("/bin/rm -rf -- ".shellescape(a:fname,0)) 539ab194816SBram Moolenaar else 5405c73622aSBram Moolenaar call system("del /S ".shellescape(a:fname,0)) 541ab194816SBram Moolenaar endif 542ab194816SBram Moolenaar endif 543ab194816SBram Moolenaar" call Dret("Rmdir") 544ab194816SBram Moolenaarendfun 545ab194816SBram Moolenaar 5468c8de839SBram Moolenaar" --------------------------------------------------------------------- 5475c73622aSBram Moolenaar" tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2 5485c73622aSBram Moolenaarfun! tar#Vimuntar(...) 5495c73622aSBram Moolenaar" call Dfunc("tar#Vimuntar() a:0=".a:0." a:1<".(exists("a:1")? a:1 : "-n/a-").">") 5505c73622aSBram Moolenaar let tarball = expand("%") 5515c73622aSBram Moolenaar" call Decho("tarball<".tarball.">") 5525c73622aSBram Moolenaar let tarbase = substitute(tarball,'\..*$','','') 5535c73622aSBram Moolenaar" call Decho("tarbase<".tarbase.">") 5545c73622aSBram Moolenaar let tarhome = expand("%:p") 5555c73622aSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 5565c73622aSBram Moolenaar let tarhome= substitute(tarhome,'\\','/','g') 5575c73622aSBram Moolenaar endif 5585c73622aSBram Moolenaar let tarhome= substitute(tarhome,'/[^/]*$','','') 5595c73622aSBram Moolenaar" call Decho("tarhome<".tarhome.">") 5605c73622aSBram Moolenaar let tartail = expand("%:t") 5615c73622aSBram Moolenaar" call Decho("tartail<".tartail.">") 5625c73622aSBram Moolenaar let curdir = getcwd() 5635c73622aSBram Moolenaar" call Decho("curdir <".curdir.">") 5645c73622aSBram Moolenaar " set up vimhome 5655c73622aSBram Moolenaar if a:0 > 0 && a:1 != "" 5665c73622aSBram Moolenaar let vimhome= a:1 567c236c16dSBram Moolenaar else 5685c73622aSBram Moolenaar let vimhome= vimball#VimballHome() 5695c73622aSBram Moolenaar endif 5705c73622aSBram Moolenaar" call Decho("vimhome<".vimhome.">") 5715c73622aSBram Moolenaar 5725c73622aSBram Moolenaar" call Decho("curdir<".curdir."> vimhome<".vimhome.">") 5735c73622aSBram Moolenaar if simplify(curdir) != simplify(vimhome) 5745c73622aSBram Moolenaar " copy (possibly compressed) tarball to .vim/vimfiles 5755c73622aSBram Moolenaar" call Decho(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome)) 5765c73622aSBram Moolenaar call system(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome)) 5775c73622aSBram Moolenaar" call Decho("exe cd ".fnameescape(vimhome)) 5785c73622aSBram Moolenaar exe "cd ".fnameescape(vimhome) 5795c73622aSBram Moolenaar endif 5805c73622aSBram Moolenaar" call Decho("getcwd<".getcwd().">") 5815c73622aSBram Moolenaar 5825c73622aSBram Moolenaar " if necessary, decompress the tarball; then, extract it 5835c73622aSBram Moolenaar if tartail =~ '\.tgz' 5845c73622aSBram Moolenaar if executable("gunzip") 5855c73622aSBram Moolenaar silent exe "!gunzip ".shellescape(tartail) 5865c73622aSBram Moolenaar elseif executable("gzip") 5875c73622aSBram Moolenaar silent exe "!gzip -d ".shellescape(tartail) 5885c73622aSBram Moolenaar else 5895c73622aSBram Moolenaar echoerr "unable to decompress<".tartail."> on this sytem" 5905c73622aSBram Moolenaar if simplify(curdir) != simplify(tarhome) 5915c73622aSBram Moolenaar " remove decompressed tarball, restore directory 5925c73622aSBram Moolenaar" call Decho("delete(".tartail.".tar)") 5935c73622aSBram Moolenaar call delete(tartail.".tar") 5945c73622aSBram Moolenaar" call Decho("exe cd ".fnameescape(curdir)) 5955c73622aSBram Moolenaar exe "cd ".fnameescape(curdir) 5965c73622aSBram Moolenaar endif 5975c73622aSBram Moolenaar" call Dret("tar#Vimuntar") 5985c73622aSBram Moolenaar return 599c236c16dSBram Moolenaar endif 6008c8de839SBram Moolenaar else 6015c73622aSBram Moolenaar call vimball#Decompress(tartail,0) 6028c8de839SBram Moolenaar endif 6035c73622aSBram Moolenaar let extractcmd= netrw#WinPath(g:tar_extractcmd) 6045c73622aSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase.".tar").")") 6055c73622aSBram Moolenaar call system(extractcmd." ".shellescape(tarbase.".tar")) 6065c73622aSBram Moolenaar 6075c73622aSBram Moolenaar " set up help 6085c73622aSBram Moolenaar if filereadable("doc/".tarbase.".txt") 6095c73622aSBram Moolenaar" call Decho("exe helptags ".getcwd()."/doc") 6105c73622aSBram Moolenaar exe "helptags ".getcwd()."/doc" 6115c73622aSBram Moolenaar endif 6125c73622aSBram Moolenaar 6135c73622aSBram Moolenaar if simplify(tarhome) != simplify(vimhome) 6145c73622aSBram Moolenaar " remove decompressed tarball, restore directory 6155c73622aSBram Moolenaar call delete(vimhome."/".tarbase.".tar") 6165c73622aSBram Moolenaar exe "cd ".fnameescape(curdir) 6175c73622aSBram Moolenaar endif 6185c73622aSBram Moolenaar 6195c73622aSBram Moolenaar" call Dret("tar#Vimuntar") 6208c8de839SBram Moolenaarendfun 6218c8de839SBram Moolenaar 6225c73622aSBram Moolenaar" ===================================================================== 623a5792f58SBram Moolenaar" Modelines And Restoration: {{{1 624a5792f58SBram Moolenaarlet &cpo= s:keepcpo 625a5792f58SBram Moolenaarunlet s:keepcpo 626a5792f58SBram Moolenaar" vim:ts=8 fdm=marker 627