1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles 2a5792f58SBram Moolenaar" AUTOLOAD PORTION 3*5c73622aSBram Moolenaar" Date: Dec 28, 2009 4*5c73622aSBram Moolenaar" Version: 24 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*5c73622aSBram Moolenaar" Copyright: Copyright (C) 2005-2009 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. 19*5c73622aSBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 20ab194816SBram Moolenaar" --------------------------------------------------------------------- 21c81e5e79SBram Moolenaar" Load Once: {{{1 22*5c73622aSBram Moolenaarif &cp || exists("g:loaded_tar") 23a5792f58SBram Moolenaar finish 24a5792f58SBram Moolenaarendif 25*5c73622aSBram Moolenaarlet g:loaded_tar= "v24" 26*5c73622aSBram Moolenaarif v:version < 702 27*5c73622aSBram Moolenaar echohl WarningMsg 28*5c73622aSBram Moolenaar echo "***warning*** this version of tar needs vim 7.2" 29*5c73622aSBram Moolenaar echohl Normal 30*5c73622aSBram Moolenaar finish 318c8de839SBram Moolenaarendif 32*5c73622aSBram Moolenaarlet s:keepcpo= &cpo 33*5c73622aSBram Moolenaarset cpo&vim 34*5c73622aSBram 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*5c73622aSBram Moolenaarif !exists("g:tar_copycmd") 51*5c73622aSBram Moolenaar if !exists("g:netrw_localcopycmd") 52*5c73622aSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 53*5c73622aSBram Moolenaar if g:netrw_cygwin 54*5c73622aSBram Moolenaar let g:netrw_localcopycmd= "cp" 55*5c73622aSBram Moolenaar else 56*5c73622aSBram Moolenaar let g:netrw_localcopycmd= "copy" 57*5c73622aSBram Moolenaar endif 58*5c73622aSBram Moolenaar elseif has("unix") || has("macunix") 59*5c73622aSBram Moolenaar let g:netrw_localcopycmd= "cp" 60*5c73622aSBram Moolenaar else 61*5c73622aSBram Moolenaar let g:netrw_localcopycmd= "" 62*5c73622aSBram Moolenaar endif 63*5c73622aSBram Moolenaar endif 64*5c73622aSBram Moolenaar let g:tar_copycmd= g:netrw_localcopycmd 65*5c73622aSBram Moolenaarendif 668c8de839SBram Moolenaarif !exists("g:netrw_cygwin") 678c8de839SBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 688c8de839SBram Moolenaar if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$' 698c8de839SBram Moolenaar let g:netrw_cygwin= 1 708c8de839SBram Moolenaar else 718c8de839SBram Moolenaar let g:netrw_cygwin= 0 728c8de839SBram Moolenaar endif 738c8de839SBram Moolenaar else 748c8de839SBram Moolenaar let g:netrw_cygwin= 0 758c8de839SBram Moolenaar endif 768c8de839SBram Moolenaarendif 77*5c73622aSBram Moolenaarif !exists("g:tar_extractcmd") 78*5c73622aSBram Moolenaar let g:tar_extractcmd= "tar -xf" 79*5c73622aSBram 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 130a5792f58SBram Moolenaar let w: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') 1458c8de839SBram Moolenaar $put ='' 146a5792f58SBram Moolenaar 0d 147a5792f58SBram Moolenaar $ 148a5792f58SBram Moolenaar 149910f66f9SBram Moolenaar let tarfile= a:tarfile 150910f66f9SBram Moolenaar if has("win32") && executable("cygpath") 151910f66f9SBram Moolenaar " assuming cygwin 152*5c73622aSBram 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\)$' 156*5c73622aSBram Moolenaar" call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 157*5c73622aSBram Moolenaar exe "silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 1588c8de839SBram Moolenaar elseif tarfile =~# '\.lrp' 159*5c73622aSBram Moolenaar" call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ") 160*5c73622aSBram Moolenaar exe "silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - " 161910f66f9SBram Moolenaar elseif tarfile =~# '\.bz2$' 162*5c73622aSBram Moolenaar" call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 163*5c73622aSBram Moolenaar exe "silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 164*5c73622aSBram Moolenaar elseif tarfile =~# '\.lzma$' 165*5c73622aSBram Moolenaar" call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 166*5c73622aSBram Moolenaar exe "silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 167910f66f9SBram Moolenaar else 168ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 169*5c73622aSBram Moolenaar " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. 170ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 171ed39e1d5SBram Moolenaar endif 172*5c73622aSBram Moolenaar" call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0)) 173*5c73622aSBram Moolenaar exe "silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1) 174910f66f9SBram Moolenaar endif 175910f66f9SBram Moolenaar if v:shell_error != 0 176c81e5e79SBram Moolenaar redraw! 177d68071d8SBram Moolenaar echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">" 178d68071d8SBram Moolenaar" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 179d68071d8SBram Moolenaar return 180d68071d8SBram Moolenaar endif 181c81e5e79SBram Moolenaar if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)') 182c81e5e79SBram Moolenaar redraw! 183d68071d8SBram Moolenaar echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None 184d68071d8SBram Moolenaar silent %d 185d68071d8SBram Moolenaar let eikeep= &ei 186d68071d8SBram Moolenaar set ei=BufReadCmd,FileReadCmd 187c236c16dSBram Moolenaar exe "r ".fnameescape(a:tarfile) 188d68071d8SBram Moolenaar let &ei= eikeep 189d68071d8SBram Moolenaar 1d 190d68071d8SBram Moolenaar" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 191910f66f9SBram Moolenaar return 192910f66f9SBram Moolenaar endif 193a5792f58SBram Moolenaar 194a5792f58SBram Moolenaar setlocal noma nomod ro 195a5792f58SBram Moolenaar noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr> 196a5792f58SBram Moolenaar 197bba577a2SBram Moolenaar let &report= repkeep 198a5792f58SBram Moolenaar" call Dret("tar#Browse : w:tarfile<".w:tarfile.">") 199ab194816SBram Moolenaarendfun 20087e25fdfSBram Moolenaar 201ab194816SBram Moolenaar" --------------------------------------------------------------------- 202a5792f58SBram Moolenaar" TarBrowseSelect: {{{2 203a5792f58SBram Moolenaarfun! s:TarBrowseSelect() 204a5792f58SBram Moolenaar" call Dfunc("TarBrowseSelect() w:tarfile<".w:tarfile."> curfile<".expand("%").">") 205bba577a2SBram Moolenaar let repkeep= &report 206bba577a2SBram Moolenaar set report=10 207a5792f58SBram Moolenaar let fname= getline(".") 208a5792f58SBram Moolenaar" call Decho("fname<".fname.">") 209a5792f58SBram Moolenaar 210ed39e1d5SBram Moolenaar if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-' 211ed39e1d5SBram Moolenaar redraw! 212*5c73622aSBram Moolenaar echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"' 213ed39e1d5SBram Moolenaar" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"') 214ed39e1d5SBram Moolenaar return 215ed39e1d5SBram Moolenaar endif 216ed39e1d5SBram Moolenaar 217a5792f58SBram Moolenaar " sanity check 218a5792f58SBram Moolenaar if fname =~ '^"' 219bba577a2SBram Moolenaar let &report= repkeep 220a5792f58SBram Moolenaar" call Dret("TarBrowseSelect") 221a5792f58SBram Moolenaar return 222a5792f58SBram Moolenaar endif 223a5792f58SBram Moolenaar 224a5792f58SBram Moolenaar " about to make a new window, need to use w:tarfile 225a5792f58SBram Moolenaar let tarfile= w:tarfile 226a5792f58SBram Moolenaar let curfile= expand("%") 227910f66f9SBram Moolenaar if has("win32") && executable("cygpath") 228910f66f9SBram Moolenaar " assuming cygwin 229*5c73622aSBram Moolenaar let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 230910f66f9SBram Moolenaar endif 231a5792f58SBram Moolenaar 232a5792f58SBram Moolenaar new 2338c8de839SBram Moolenaar if !exists("g:tar_nomax") || g:tar_nomax == 0 234a5792f58SBram Moolenaar wincmd _ 2358c8de839SBram Moolenaar endif 236a5792f58SBram Moolenaar let s:tblfile_{winnr()}= curfile 2378c8de839SBram Moolenaar call tar#Read("tarfile:".tarfile.'::'.fname,1) 238a5792f58SBram Moolenaar filetype detect 239a5792f58SBram Moolenaar 240bba577a2SBram Moolenaar let &report= repkeep 241a5792f58SBram Moolenaar" call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 242a5792f58SBram Moolenaarendfun 243a5792f58SBram Moolenaar 244a5792f58SBram Moolenaar" --------------------------------------------------------------------- 245a5792f58SBram Moolenaar" tar#Read: {{{2 246a5792f58SBram Moolenaarfun! tar#Read(fname,mode) 247a5792f58SBram Moolenaar" call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")") 248bba577a2SBram Moolenaar let repkeep= &report 249bba577a2SBram Moolenaar set report=10 2508c8de839SBram Moolenaar let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','') 2518c8de839SBram Moolenaar let fname = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','') 252910f66f9SBram Moolenaar if has("win32") && executable("cygpath") 253910f66f9SBram Moolenaar " assuming cygwin 254*5c73622aSBram Moolenaar let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') 255910f66f9SBram Moolenaar endif 256910f66f9SBram Moolenaar" call Decho("tarfile<".tarfile.">") 257910f66f9SBram Moolenaar" call Decho("fname<".fname.">") 258a5792f58SBram Moolenaar 259*5c73622aSBram Moolenaar if fname =~ '\.bz2$' && executable("bzcat") 260*5c73622aSBram Moolenaar let decmp= "|bzcat" 261*5c73622aSBram Moolenaar let doro = 1 262*5c73622aSBram Moolenaar elseif fname =~ '\.gz$' && executable("zcat") 2638c8de839SBram Moolenaar let decmp= "|zcat" 2648c8de839SBram Moolenaar let doro = 1 265*5c73622aSBram Moolenaar elseif fname =~ '\.lzma$' && executable("lzcat") 266*5c73622aSBram Moolenaar let decmp= "|lzcat" 2678c8de839SBram Moolenaar let doro = 1 268a5792f58SBram Moolenaar else 2698c8de839SBram Moolenaar let decmp="" 2708c8de839SBram Moolenaar let doro = 0 271*5c73622aSBram Moolenaar if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.zip$\|\.Z$' 2728c8de839SBram Moolenaar setlocal bin 273a5792f58SBram Moolenaar endif 2748c8de839SBram Moolenaar endif 2758c8de839SBram Moolenaar 276ed39e1d5SBram Moolenaar if exists("g:tar_secure") 277ed39e1d5SBram Moolenaar let tar_secure= " -- " 2788c8de839SBram Moolenaar else 279ed39e1d5SBram Moolenaar let tar_secure= " " 280ed39e1d5SBram Moolenaar endif 281*5c73622aSBram Moolenaar if tarfile =~# '\.bz2$' 282*5c73622aSBram 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) 283*5c73622aSBram Moolenaar exe "silent r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 284*5c73622aSBram Moolenaar elseif tarfile =~# '\.\(gz\|tgz\)$' 285*5c73622aSBram Moolenaar" call Decho("5: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.tar_secure.shellescape(fname,1)) 286*5c73622aSBram Moolenaar exe "silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 287ed39e1d5SBram Moolenaar elseif tarfile =~# '\.lrp$' 288*5c73622aSBram 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) 289*5c73622aSBram Moolenaar exe "silent r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 290*5c73622aSBram Moolenaar elseif tarfile =~# '\.lzma$' 291*5c73622aSBram 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) 292*5c73622aSBram Moolenaar exe "silent r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp 293ed39e1d5SBram Moolenaar else 294ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 295*5c73622aSBram Moolenaar " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. 296ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 297ed39e1d5SBram Moolenaar endif 298*5c73622aSBram Moolenaar" call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions.tar_secure.shellescape(tarfile,1)." ".shellescape(fname,1).decmp) 299*5c73622aSBram Moolenaar exe "silent r! ".g:tar_cmd." -".g:tar_readoptions.shellescape(tarfile,1)." ".tar_secure.shellescape(fname,1).decmp 3008c8de839SBram Moolenaar endif 3018c8de839SBram Moolenaar 3028c8de839SBram Moolenaar if doro 3038c8de839SBram Moolenaar " because the reverse process of compressing changed files back into the tarball is not currently supported 3048c8de839SBram Moolenaar setlocal ro 3058c8de839SBram Moolenaar endif 3068c8de839SBram Moolenaar 307a5792f58SBram Moolenaar let w:tarfile= a:fname 308c236c16dSBram Moolenaar exe "file tarfile::".fnameescape(fname) 309a5792f58SBram Moolenaar 310a5792f58SBram Moolenaar " cleanup 311a5792f58SBram Moolenaar 0d 312a5792f58SBram Moolenaar set nomod 313a5792f58SBram Moolenaar 314bba577a2SBram Moolenaar let &report= repkeep 315a5792f58SBram Moolenaar" call Dret("tar#Read : w:tarfile<".w:tarfile.">") 316a5792f58SBram Moolenaarendfun 317a5792f58SBram Moolenaar 318a5792f58SBram Moolenaar" --------------------------------------------------------------------- 319a5792f58SBram Moolenaar" tar#Write: {{{2 320a5792f58SBram Moolenaarfun! tar#Write(fname) 321a5792f58SBram Moolenaar" call Dfunc("tar#Write(fname<".a:fname.">) w:tarfile<".w:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 322bba577a2SBram Moolenaar let repkeep= &report 323bba577a2SBram Moolenaar set report=10 324a5792f58SBram Moolenaar 325ed39e1d5SBram Moolenaar if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-' 326ed39e1d5SBram Moolenaar redraw! 327*5c73622aSBram Moolenaar echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"' 328ed39e1d5SBram Moolenaar" call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"') 329ed39e1d5SBram Moolenaar return 330ed39e1d5SBram Moolenaar endif 331ed39e1d5SBram Moolenaar 332ab194816SBram Moolenaar " sanity checks 333910f66f9SBram Moolenaar if !executable(g:tar_cmd) 334c81e5e79SBram Moolenaar redraw! 335910f66f9SBram Moolenaar echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' 336bba577a2SBram Moolenaar let &report= repkeep 337ab194816SBram Moolenaar" call Dret("tar#Write") 338ab194816SBram Moolenaar return 339ab194816SBram Moolenaar endif 340ab194816SBram Moolenaar if !exists("*mkdir") 341c81e5e79SBram Moolenaar redraw! 342a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None 343bba577a2SBram Moolenaar let &report= repkeep 344ab194816SBram Moolenaar" call Dret("tar#Write") 345ab194816SBram Moolenaar return 346ab194816SBram Moolenaar endif 347ab194816SBram Moolenaar 348ab194816SBram Moolenaar let curdir= getcwd() 349ab194816SBram Moolenaar let tmpdir= tempname() 350ab194816SBram Moolenaar" call Decho("orig tempname<".tmpdir.">") 351ab194816SBram Moolenaar if tmpdir =~ '\.' 352ab194816SBram Moolenaar let tmpdir= substitute(tmpdir,'\.[^.]*$','','e') 353ab194816SBram Moolenaar endif 354ab194816SBram Moolenaar" call Decho("tmpdir<".tmpdir.">") 355ab194816SBram Moolenaar call mkdir(tmpdir,"p") 356ab194816SBram Moolenaar 357ab194816SBram Moolenaar " attempt to change to the indicated directory 358ab194816SBram Moolenaar try 3598c8de839SBram Moolenaar exe "cd ".fnameescape(tmpdir) 360ab194816SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E344/ 361c81e5e79SBram Moolenaar redraw! 362a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None 363bba577a2SBram Moolenaar let &report= repkeep 364ab194816SBram Moolenaar" call Dret("tar#Write") 365ab194816SBram Moolenaar return 366ab194816SBram Moolenaar endtry 367ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 368ab194816SBram Moolenaar 369a5792f58SBram Moolenaar " place temporary files under .../_ZIPVIM_/ 370a5792f58SBram Moolenaar if isdirectory("_ZIPVIM_") 371a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 372ab194816SBram Moolenaar endif 373a5792f58SBram Moolenaar call mkdir("_ZIPVIM_") 374a5792f58SBram Moolenaar cd _ZIPVIM_ 375ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 376ab194816SBram Moolenaar 3778c8de839SBram Moolenaar let tarfile = substitute(w:tarfile,'tarfile:\(.\{-}\)::.*$','\1','') 3788c8de839SBram Moolenaar let fname = substitute(w:tarfile,'tarfile:.\{-}::\(.*\)$','\1','') 379a5792f58SBram Moolenaar 380a5792f58SBram Moolenaar " handle compressed archives 381*5c73622aSBram Moolenaar if tarfile =~# '\.bz2' 382*5c73622aSBram Moolenaar call system("bzip2 -d -- ".shellescape(tarfile,0)) 383*5c73622aSBram Moolenaar let tarfile = substitute(tarfile,'\.bz2','','e') 384*5c73622aSBram Moolenaar let compress= "bzip2 -- ".shellescape(tarfile,0) 385*5c73622aSBram Moolenaar" call Decho("compress<".compress.">") 386*5c73622aSBram Moolenaar elseif tarfile =~# '\.gz' 387*5c73622aSBram Moolenaar call system("gzip -d -- ".shellescape(tarfile,0)) 388a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.gz','','e') 389*5c73622aSBram Moolenaar let compress= "gzip -- ".shellescape(tarfile,0) 390*5c73622aSBram Moolenaar" call Decho("compress<".compress.">") 391*5c73622aSBram Moolenaar elseif tarfile =~# '\.lzma' 392*5c73622aSBram Moolenaar call system("lzma -d -- ".shellescape(tarfile,0)) 393*5c73622aSBram Moolenaar let tarfile = substitute(tarfile,'\.lzma','','e') 394*5c73622aSBram Moolenaar let compress= "lzma -- ".shellescape(tarfile,0) 395ed39e1d5SBram Moolenaar" call Decho("compress<".compress.">") 396a5792f58SBram Moolenaar elseif tarfile =~# '\.tgz' 397*5c73622aSBram Moolenaar call system("gzip -d -- ".shellescape(tarfile,0)) 398a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.tgz','.tar','e') 399*5c73622aSBram Moolenaar let compress= "gzip -- ".shellescape(tarfile,0) 400a5792f58SBram Moolenaar let tgz = 1 401ed39e1d5SBram Moolenaar" call Decho("compress<".compress.">") 402a5792f58SBram Moolenaar endif 4038c8de839SBram Moolenaar" call Decho("tarfile<".tarfile.">") 404a5792f58SBram Moolenaar 405a5792f58SBram Moolenaar if v:shell_error != 0 406c81e5e79SBram Moolenaar redraw! 407a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None 408a5792f58SBram Moolenaar else 409a5792f58SBram Moolenaar 410a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 411a5792f58SBram Moolenaar 4121cbe5f73SBram Moolenaar if fname =~ '/' 413a5792f58SBram Moolenaar let dirpath = substitute(fname,'/[^/]\+$','','e') 4141cbe5f73SBram Moolenaar if executable("cygpath") 415*5c73622aSBram Moolenaar let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e') 4161cbe5f73SBram Moolenaar endif 4171cbe5f73SBram Moolenaar call mkdir(dirpath,"p") 4181cbe5f73SBram Moolenaar endif 419a5792f58SBram Moolenaar if tarfile !~ '/' 420a5792f58SBram Moolenaar let tarfile= curdir.'/'.tarfile 421a5792f58SBram Moolenaar endif 422ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 423ed39e1d5SBram Moolenaar " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that. 424ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 425ed39e1d5SBram Moolenaar endif 426a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 427a5792f58SBram Moolenaar 428ed39e1d5SBram Moolenaar if exists("g:tar_secure") 429ed39e1d5SBram Moolenaar let tar_secure= " -- " 430ed39e1d5SBram Moolenaar else 431ed39e1d5SBram Moolenaar let tar_secure= " " 432ed39e1d5SBram Moolenaar endif 4338c8de839SBram Moolenaar exe "w! ".fnameescape(fname) 434ab194816SBram Moolenaar if executable("cygpath") 435*5c73622aSBram Moolenaar let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e') 436ab194816SBram Moolenaar endif 437ab194816SBram Moolenaar 438a5792f58SBram Moolenaar " delete old file from tarfile 439*5c73622aSBram Moolenaar" call Decho("system(".g:tar_cmd." --delete -f ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")") 440*5c73622aSBram Moolenaar call system(g:tar_cmd." --delete -f ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 441ab194816SBram Moolenaar if v:shell_error != 0 442c81e5e79SBram Moolenaar redraw! 4438c8de839SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 444ab194816SBram Moolenaar else 445a5792f58SBram Moolenaar 446a5792f58SBram Moolenaar " update tarfile with new file 447*5c73622aSBram Moolenaar" call Decho(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 448*5c73622aSBram Moolenaar call system(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0)) 449a5792f58SBram Moolenaar if v:shell_error != 0 450c81e5e79SBram Moolenaar redraw! 4518c8de839SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 452a5792f58SBram Moolenaar elseif exists("compress") 453a5792f58SBram Moolenaar" call Decho("call system(".compress.")") 454a5792f58SBram Moolenaar call system(compress) 455a5792f58SBram Moolenaar if exists("tgz") 456a5792f58SBram Moolenaar" call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")") 457a5792f58SBram Moolenaar call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e')) 458a5792f58SBram Moolenaar endif 459a5792f58SBram Moolenaar endif 460a5792f58SBram Moolenaar endif 461a5792f58SBram Moolenaar 462a5792f58SBram Moolenaar " support writing tarfiles across a network 463a5792f58SBram Moolenaar if s:tblfile_{winnr()} =~ '^\a\+://' 464a5792f58SBram Moolenaar" call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">") 465a5792f58SBram Moolenaar let tblfile= s:tblfile_{winnr()} 466a5792f58SBram Moolenaar 1split|enew 467*5c73622aSBram Moolenaar let binkeep= &l:binary 468a5792f58SBram Moolenaar let eikeep = &ei 469a5792f58SBram Moolenaar set binary ei=all 470c236c16dSBram Moolenaar exe "e! ".fnameescape(tarfile) 471a5792f58SBram Moolenaar call netrw#NetWrite(tblfile) 472a5792f58SBram Moolenaar let &ei = eikeep 473*5c73622aSBram Moolenaar let &l:binary = binkeep 474a5792f58SBram Moolenaar q! 475a5792f58SBram Moolenaar unlet s:tblfile_{winnr()} 476a5792f58SBram Moolenaar endif 477ab194816SBram Moolenaar endif 478ab194816SBram Moolenaar 479ab194816SBram Moolenaar " cleanup and restore current directory 480ab194816SBram Moolenaar cd .. 481a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 482c236c16dSBram Moolenaar exe "cd ".fnameescape(curdir) 483ab194816SBram Moolenaar setlocal nomod 484ab194816SBram Moolenaar 485bba577a2SBram Moolenaar let &report= repkeep 486ab194816SBram Moolenaar" call Dret("tar#Write") 487ab194816SBram Moolenaarendfun 488ab194816SBram Moolenaar 489ab194816SBram Moolenaar" --------------------------------------------------------------------- 490*5c73622aSBram Moolenaar" s:Rmdir: {{{2 491ab194816SBram Moolenaarfun! s:Rmdir(fname) 492ab194816SBram Moolenaar" call Dfunc("Rmdir(fname<".a:fname.">)") 493ab194816SBram Moolenaar if has("unix") 494*5c73622aSBram Moolenaar call system("/bin/rm -rf -- ".shellescape(a:fname,0)) 495ab194816SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16") 496ab194816SBram Moolenaar if &shell =~? "sh$" 497*5c73622aSBram Moolenaar call system("/bin/rm -rf -- ".shellescape(a:fname,0)) 498ab194816SBram Moolenaar else 499*5c73622aSBram Moolenaar call system("del /S ".shellescape(a:fname,0)) 500ab194816SBram Moolenaar endif 501ab194816SBram Moolenaar endif 502ab194816SBram Moolenaar" call Dret("Rmdir") 503ab194816SBram Moolenaarendfun 504ab194816SBram Moolenaar 5058c8de839SBram Moolenaar" --------------------------------------------------------------------- 506*5c73622aSBram Moolenaar" tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2 507*5c73622aSBram Moolenaarfun! tar#Vimuntar(...) 508*5c73622aSBram Moolenaar" call Dfunc("tar#Vimuntar() a:0=".a:0." a:1<".(exists("a:1")? a:1 : "-n/a-").">") 509*5c73622aSBram Moolenaar let tarball = expand("%") 510*5c73622aSBram Moolenaar" call Decho("tarball<".tarball.">") 511*5c73622aSBram Moolenaar let tarbase = substitute(tarball,'\..*$','','') 512*5c73622aSBram Moolenaar" call Decho("tarbase<".tarbase.">") 513*5c73622aSBram Moolenaar let tarhome = expand("%:p") 514*5c73622aSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 515*5c73622aSBram Moolenaar let tarhome= substitute(tarhome,'\\','/','g') 516*5c73622aSBram Moolenaar endif 517*5c73622aSBram Moolenaar let tarhome= substitute(tarhome,'/[^/]*$','','') 518*5c73622aSBram Moolenaar" call Decho("tarhome<".tarhome.">") 519*5c73622aSBram Moolenaar let tartail = expand("%:t") 520*5c73622aSBram Moolenaar" call Decho("tartail<".tartail.">") 521*5c73622aSBram Moolenaar let curdir = getcwd() 522*5c73622aSBram Moolenaar" call Decho("curdir <".curdir.">") 523*5c73622aSBram Moolenaar " set up vimhome 524*5c73622aSBram Moolenaar if a:0 > 0 && a:1 != "" 525*5c73622aSBram Moolenaar let vimhome= a:1 526c236c16dSBram Moolenaar else 527*5c73622aSBram Moolenaar let vimhome= vimball#VimballHome() 528*5c73622aSBram Moolenaar endif 529*5c73622aSBram Moolenaar" call Decho("vimhome<".vimhome.">") 530*5c73622aSBram Moolenaar 531*5c73622aSBram Moolenaar" call Decho("curdir<".curdir."> vimhome<".vimhome.">") 532*5c73622aSBram Moolenaar if simplify(curdir) != simplify(vimhome) 533*5c73622aSBram Moolenaar " copy (possibly compressed) tarball to .vim/vimfiles 534*5c73622aSBram Moolenaar" call Decho(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome)) 535*5c73622aSBram Moolenaar call system(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome)) 536*5c73622aSBram Moolenaar" call Decho("exe cd ".fnameescape(vimhome)) 537*5c73622aSBram Moolenaar exe "cd ".fnameescape(vimhome) 538*5c73622aSBram Moolenaar endif 539*5c73622aSBram Moolenaar" call Decho("getcwd<".getcwd().">") 540*5c73622aSBram Moolenaar 541*5c73622aSBram Moolenaar " if necessary, decompress the tarball; then, extract it 542*5c73622aSBram Moolenaar if tartail =~ '\.tgz' 543*5c73622aSBram Moolenaar if executable("gunzip") 544*5c73622aSBram Moolenaar silent exe "!gunzip ".shellescape(tartail) 545*5c73622aSBram Moolenaar elseif executable("gzip") 546*5c73622aSBram Moolenaar silent exe "!gzip -d ".shellescape(tartail) 547*5c73622aSBram Moolenaar else 548*5c73622aSBram Moolenaar echoerr "unable to decompress<".tartail."> on this sytem" 549*5c73622aSBram Moolenaar if simplify(curdir) != simplify(tarhome) 550*5c73622aSBram Moolenaar " remove decompressed tarball, restore directory 551*5c73622aSBram Moolenaar" call Decho("delete(".tartail.".tar)") 552*5c73622aSBram Moolenaar call delete(tartail.".tar") 553*5c73622aSBram Moolenaar" call Decho("exe cd ".fnameescape(curdir)) 554*5c73622aSBram Moolenaar exe "cd ".fnameescape(curdir) 555*5c73622aSBram Moolenaar endif 556*5c73622aSBram Moolenaar" call Dret("tar#Vimuntar") 557*5c73622aSBram Moolenaar return 558c236c16dSBram Moolenaar endif 5598c8de839SBram Moolenaar else 560*5c73622aSBram Moolenaar call vimball#Decompress(tartail,0) 5618c8de839SBram Moolenaar endif 562*5c73622aSBram Moolenaar let extractcmd= netrw#WinPath(g:tar_extractcmd) 563*5c73622aSBram Moolenaar" call Decho("system(".extractcmd." ".shellescape(tarbase.".tar").")") 564*5c73622aSBram Moolenaar call system(extractcmd." ".shellescape(tarbase.".tar")) 565*5c73622aSBram Moolenaar 566*5c73622aSBram Moolenaar " set up help 567*5c73622aSBram Moolenaar if filereadable("doc/".tarbase.".txt") 568*5c73622aSBram Moolenaar" call Decho("exe helptags ".getcwd()."/doc") 569*5c73622aSBram Moolenaar exe "helptags ".getcwd()."/doc" 570*5c73622aSBram Moolenaar endif 571*5c73622aSBram Moolenaar 572*5c73622aSBram Moolenaar if simplify(tarhome) != simplify(vimhome) 573*5c73622aSBram Moolenaar " remove decompressed tarball, restore directory 574*5c73622aSBram Moolenaar call delete(vimhome."/".tarbase.".tar") 575*5c73622aSBram Moolenaar exe "cd ".fnameescape(curdir) 576*5c73622aSBram Moolenaar endif 577*5c73622aSBram Moolenaar 578*5c73622aSBram Moolenaar" call Dret("tar#Vimuntar") 5798c8de839SBram Moolenaarendfun 5808c8de839SBram Moolenaar 581*5c73622aSBram Moolenaar" ===================================================================== 582a5792f58SBram Moolenaar" Modelines And Restoration: {{{1 583a5792f58SBram Moolenaarlet &cpo= s:keepcpo 584a5792f58SBram Moolenaarunlet s:keepcpo 585a5792f58SBram Moolenaar" vim:ts=8 fdm=marker 586