1a5792f58SBram Moolenaar" tar.vim: Handles browsing tarfiles 2a5792f58SBram Moolenaar" AUTOLOAD PORTION 3*ed39e1d5SBram Moolenaar" Date: Aug 08, 2008 4*ed39e1d5SBram Moolenaar" Version: 23 + modifications by Bram 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" 108c8de839SBram Moolenaar" Copyright: Copyright (C) 2005-2008 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. 1987e25fdfSBram Moolenaar 20ab194816SBram Moolenaar" --------------------------------------------------------------------- 21c81e5e79SBram Moolenaar" Load Once: {{{1 22a5792f58SBram Moolenaarlet s:keepcpo= &cpo 23a5792f58SBram Moolenaarset cpo&vim 24c81e5e79SBram Moolenaarif &cp || exists("g:loaded_tar") || v:version < 700 25a5792f58SBram Moolenaar finish 26a5792f58SBram Moolenaarendif 27*ed39e1d5SBram Moolenaarlet g:loaded_tar= "v23b" 28910f66f9SBram Moolenaar"call Decho("loading autoload/tar.vim") 298c8de839SBram Moolenaarif v:version < 701 || (v:version == 701 && !has("patch299")) 308c8de839SBram Moolenaar echoerr "(autoload/tar.vim) need vim v7.1 with patchlevel 299" 318c8de839SBram Moolenaarendif 3287e25fdfSBram Moolenaar 33a5792f58SBram Moolenaar" --------------------------------------------------------------------- 34a5792f58SBram Moolenaar" Default Settings: {{{1 35a5792f58SBram Moolenaarif !exists("g:tar_browseoptions") 36a5792f58SBram Moolenaar let g:tar_browseoptions= "Ptf" 37a5792f58SBram Moolenaarendif 38a5792f58SBram Moolenaarif !exists("g:tar_readoptions") 39a5792f58SBram Moolenaar let g:tar_readoptions= "OPxf" 40a5792f58SBram Moolenaarendif 41910f66f9SBram Moolenaarif !exists("g:tar_cmd") 42910f66f9SBram Moolenaar let g:tar_cmd= "tar" 43910f66f9SBram Moolenaarendif 44a5792f58SBram Moolenaarif !exists("g:tar_writeoptions") 45a5792f58SBram Moolenaar let g:tar_writeoptions= "uf" 46a5792f58SBram Moolenaarendif 478c8de839SBram Moolenaar 488c8de839SBram Moolenaarif !exists("g:netrw_cygwin") 498c8de839SBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 508c8de839SBram Moolenaar if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$' 518c8de839SBram Moolenaar let g:netrw_cygwin= 1 528c8de839SBram Moolenaar else 538c8de839SBram Moolenaar let g:netrw_cygwin= 0 548c8de839SBram Moolenaar endif 558c8de839SBram Moolenaar else 568c8de839SBram Moolenaar let g:netrw_cygwin= 0 578c8de839SBram Moolenaar endif 588c8de839SBram Moolenaarendif 598c8de839SBram Moolenaar 608c8de839SBram Moolenaar" set up shell quoting character 61c81e5e79SBram Moolenaarif !exists("g:tar_shq") 628c8de839SBram Moolenaar if exists("&shq") && &shq != "" 638c8de839SBram Moolenaar let g:tar_shq= &shq 648c8de839SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16") 658c8de839SBram Moolenaar if exists("g:netrw_cygwin") && g:netrw_cygwin 66c81e5e79SBram Moolenaar let g:tar_shq= "'" 67c81e5e79SBram Moolenaar else 68c81e5e79SBram Moolenaar let g:tar_shq= '"' 69c81e5e79SBram Moolenaar endif 708c8de839SBram Moolenaar else 718c8de839SBram Moolenaar let g:tar_shq= "'" 728c8de839SBram Moolenaar endif 738c8de839SBram Moolenaar" call Decho("g:tar_shq<".g:tar_shq.">") 74c81e5e79SBram Moolenaarendif 75a5792f58SBram Moolenaar 76a5792f58SBram Moolenaar" ---------------- 77a5792f58SBram Moolenaar" Functions: {{{1 78a5792f58SBram Moolenaar" ---------------- 79a5792f58SBram Moolenaar 80a5792f58SBram Moolenaar" --------------------------------------------------------------------- 81a5792f58SBram Moolenaar" tar#Browse: {{{2 82a5792f58SBram Moolenaarfun! tar#Browse(tarfile) 83a5792f58SBram Moolenaar" call Dfunc("tar#Browse(tarfile<".a:tarfile.">)") 84bba577a2SBram Moolenaar let repkeep= &report 85bba577a2SBram Moolenaar set report=10 86a5792f58SBram Moolenaar 87a5792f58SBram Moolenaar " sanity checks 88910f66f9SBram Moolenaar if !executable(g:tar_cmd) 89c81e5e79SBram Moolenaar redraw! 90910f66f9SBram Moolenaar echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' 91c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 92bba577a2SBram Moolenaar let &report= repkeep 93a5792f58SBram Moolenaar" call Dret("tar#Browse") 9487e25fdfSBram Moolenaar return 9587e25fdfSBram Moolenaar endif 96a5792f58SBram Moolenaar if !filereadable(a:tarfile) 97910f66f9SBram Moolenaar" call Decho('a:tarfile<'.a:tarfile.'> not filereadable') 98a5792f58SBram Moolenaar if a:tarfile !~# '^\a\+://' 99a5792f58SBram Moolenaar " if its an url, don't complain, let url-handlers such as vim do its thing 100c81e5e79SBram Moolenaar redraw! 101a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None 102c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 10387e25fdfSBram Moolenaar endif 104bba577a2SBram Moolenaar let &report= repkeep 105a5792f58SBram Moolenaar" call Dret("tar#Browse : file<".a:tarfile."> not readable") 10687e25fdfSBram Moolenaar return 10787e25fdfSBram Moolenaar endif 108a5792f58SBram Moolenaar if &ma != 1 109a5792f58SBram Moolenaar set ma 11087e25fdfSBram Moolenaar endif 111a5792f58SBram Moolenaar let w:tarfile= a:tarfile 112a5792f58SBram Moolenaar 113a5792f58SBram Moolenaar setlocal noswapfile 114a5792f58SBram Moolenaar setlocal buftype=nofile 115a5792f58SBram Moolenaar setlocal bufhidden=hide 116a5792f58SBram Moolenaar setlocal nobuflisted 117a5792f58SBram Moolenaar setlocal nowrap 118a5792f58SBram Moolenaar set ft=tar 119a5792f58SBram Moolenaar 120a5792f58SBram Moolenaar " give header 121910f66f9SBram Moolenaar" call Decho("printing header") 1228c8de839SBram Moolenaar let lastline= line("$") 1238c8de839SBram Moolenaar call setline(lastline+1,'" tar.vim version '.g:loaded_tar) 1248c8de839SBram Moolenaar call setline(lastline+2,'" Browsing tarfile '.a:tarfile) 1258c8de839SBram Moolenaar call setline(lastline+3,'" Select a file with cursor and press ENTER') 1268c8de839SBram Moolenaar $put ='' 127a5792f58SBram Moolenaar 0d 128a5792f58SBram Moolenaar $ 129a5792f58SBram Moolenaar 130910f66f9SBram Moolenaar let tarfile= a:tarfile 131910f66f9SBram Moolenaar if has("win32") && executable("cygpath") 132910f66f9SBram Moolenaar " assuming cygwin 133c236c16dSBram Moolenaar let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile,0)),'\n$','','e') 134a5792f58SBram Moolenaar endif 135d68071d8SBram Moolenaar let curlast= line("$") 136910f66f9SBram Moolenaar if tarfile =~# '\.\(gz\|tgz\)$' 137*ed39e1d5SBram Moolenaar" call Decho("1: exe silent r! gzip -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 138c236c16dSBram Moolenaar exe "silent r! gzip -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 1398c8de839SBram Moolenaar elseif tarfile =~# '\.lrp' 140c236c16dSBram Moolenaar" call Decho("2: exe silent r! cat -- ".s:Escape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ") 141c236c16dSBram Moolenaar exe "silent r! cat -- ".s:Escape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - " 142910f66f9SBram Moolenaar elseif tarfile =~# '\.bz2$' 143*ed39e1d5SBram Moolenaar" call Decho("3: exe silent r! bzip2 -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") 144c236c16dSBram Moolenaar exe "silent r! bzip2 -d -c -- ".s:Escape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " 145910f66f9SBram Moolenaar else 146*ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 147*ed39e1d5SBram Moolenaar " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that. 148*ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 149*ed39e1d5SBram Moolenaar endif 150*ed39e1d5SBram Moolenaar" call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".s:Escape(tarfile,1)) 151c236c16dSBram Moolenaar exe "silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".s:Escape(tarfile,1) 152910f66f9SBram Moolenaar endif 153910f66f9SBram Moolenaar if v:shell_error != 0 154c81e5e79SBram Moolenaar redraw! 155d68071d8SBram Moolenaar echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">" 156c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 157d68071d8SBram Moolenaar" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 158d68071d8SBram Moolenaar return 159d68071d8SBram Moolenaar endif 160c81e5e79SBram Moolenaar if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)') 161c81e5e79SBram Moolenaar redraw! 162d68071d8SBram Moolenaar echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None 163c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 164d68071d8SBram Moolenaar silent %d 165d68071d8SBram Moolenaar let eikeep= &ei 166d68071d8SBram Moolenaar set ei=BufReadCmd,FileReadCmd 167c236c16dSBram Moolenaar exe "r ".fnameescape(a:tarfile) 168d68071d8SBram Moolenaar let &ei= eikeep 169d68071d8SBram Moolenaar 1d 170d68071d8SBram Moolenaar" call Dret("tar#Browse : a:tarfile<".a:tarfile.">") 171910f66f9SBram Moolenaar return 172910f66f9SBram Moolenaar endif 173a5792f58SBram Moolenaar 174a5792f58SBram Moolenaar setlocal noma nomod ro 175a5792f58SBram Moolenaar noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr> 176a5792f58SBram Moolenaar 177bba577a2SBram Moolenaar let &report= repkeep 178a5792f58SBram Moolenaar" call Dret("tar#Browse : w:tarfile<".w:tarfile.">") 179ab194816SBram Moolenaarendfun 18087e25fdfSBram Moolenaar 181ab194816SBram Moolenaar" --------------------------------------------------------------------- 182a5792f58SBram Moolenaar" TarBrowseSelect: {{{2 183a5792f58SBram Moolenaarfun! s:TarBrowseSelect() 184a5792f58SBram Moolenaar" call Dfunc("TarBrowseSelect() w:tarfile<".w:tarfile."> curfile<".expand("%").">") 185bba577a2SBram Moolenaar let repkeep= &report 186bba577a2SBram Moolenaar set report=10 187a5792f58SBram Moolenaar let fname= getline(".") 188a5792f58SBram Moolenaar" call Decho("fname<".fname.">") 189a5792f58SBram Moolenaar 190*ed39e1d5SBram Moolenaar if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-' 191*ed39e1d5SBram Moolenaar redraw! 192*ed39e1d5SBram Moolenaar echohl WarningMsg | echo '***error*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"; See :help tar-options' 193*ed39e1d5SBram Moolenaar" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"') 194*ed39e1d5SBram Moolenaar return 195*ed39e1d5SBram Moolenaar endif 196*ed39e1d5SBram Moolenaar 197a5792f58SBram Moolenaar " sanity check 198a5792f58SBram Moolenaar if fname =~ '^"' 199bba577a2SBram Moolenaar let &report= repkeep 200a5792f58SBram Moolenaar" call Dret("TarBrowseSelect") 201a5792f58SBram Moolenaar return 202a5792f58SBram Moolenaar endif 203a5792f58SBram Moolenaar 204a5792f58SBram Moolenaar " about to make a new window, need to use w:tarfile 205a5792f58SBram Moolenaar let tarfile= w:tarfile 206a5792f58SBram Moolenaar let curfile= expand("%") 207910f66f9SBram Moolenaar if has("win32") && executable("cygpath") 208910f66f9SBram Moolenaar " assuming cygwin 209c236c16dSBram Moolenaar let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile,0)),'\n$','','e') 210910f66f9SBram Moolenaar endif 211a5792f58SBram Moolenaar 212a5792f58SBram Moolenaar new 2138c8de839SBram Moolenaar if !exists("g:tar_nomax") || g:tar_nomax == 0 214a5792f58SBram Moolenaar wincmd _ 2158c8de839SBram Moolenaar endif 216a5792f58SBram Moolenaar let s:tblfile_{winnr()}= curfile 2178c8de839SBram Moolenaar call tar#Read("tarfile:".tarfile.'::'.fname,1) 218a5792f58SBram Moolenaar filetype detect 219a5792f58SBram Moolenaar 220bba577a2SBram Moolenaar let &report= repkeep 221a5792f58SBram Moolenaar" call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 222a5792f58SBram Moolenaarendfun 223a5792f58SBram Moolenaar 224a5792f58SBram Moolenaar" --------------------------------------------------------------------- 225a5792f58SBram Moolenaar" tar#Read: {{{2 226a5792f58SBram Moolenaarfun! tar#Read(fname,mode) 227a5792f58SBram Moolenaar" call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")") 228bba577a2SBram Moolenaar let repkeep= &report 229bba577a2SBram Moolenaar set report=10 2308c8de839SBram Moolenaar let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','') 2318c8de839SBram Moolenaar let fname = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','') 232910f66f9SBram Moolenaar if has("win32") && executable("cygpath") 233910f66f9SBram Moolenaar " assuming cygwin 234c236c16dSBram Moolenaar let tarfile=substitute(system("cygpath -u ".s:Escape(tarfile,0)),'\n$','','e') 235910f66f9SBram Moolenaar endif 236910f66f9SBram Moolenaar" call Decho("tarfile<".tarfile.">") 237910f66f9SBram Moolenaar" call Decho("fname<".fname.">") 238a5792f58SBram Moolenaar 2398c8de839SBram Moolenaar if fname =~ '\.gz$' && executable("zcat") 2408c8de839SBram Moolenaar let decmp= "|zcat" 2418c8de839SBram Moolenaar let doro = 1 2428c8de839SBram Moolenaar elseif fname =~ '\.bz2$' && executable("bzcat") 2438c8de839SBram Moolenaar let decmp= "|bzcat" 2448c8de839SBram Moolenaar let doro = 1 245a5792f58SBram Moolenaar else 2468c8de839SBram Moolenaar let decmp="" 2478c8de839SBram Moolenaar let doro = 0 2488c8de839SBram Moolenaar if fname =~ '\.gz$\|\.bz2$\|\.Z$\|\.zip$' 2498c8de839SBram Moolenaar setlocal bin 250a5792f58SBram Moolenaar endif 2518c8de839SBram Moolenaar endif 2528c8de839SBram Moolenaar 253*ed39e1d5SBram Moolenaar if exists("g:tar_secure") 254*ed39e1d5SBram Moolenaar let tar_secure= " -- " 2558c8de839SBram Moolenaar else 256*ed39e1d5SBram Moolenaar let tar_secure= " " 257*ed39e1d5SBram Moolenaar endif 258*ed39e1d5SBram Moolenaar if tarfile =~# '\.\(gz\|tgz\)$' 259*ed39e1d5SBram Moolenaar" call Decho("5: exe silent r! gzip -d -c -- ".s:Escape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.tar_secure.s:Escape(fname,1)) 260*ed39e1d5SBram Moolenaar exe "silent r! gzip -d -c -- ".s:Escape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp 261*ed39e1d5SBram Moolenaar elseif tarfile =~# '\.lrp$' 262*ed39e1d5SBram Moolenaar" call Decho("6: exe silent r! cat ".s:Escape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp) 263*ed39e1d5SBram Moolenaar exe "silent r! cat -- ".s:Escape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp 264*ed39e1d5SBram Moolenaar elseif tarfile =~# '\.bz2$' 265*ed39e1d5SBram Moolenaar" call Decho("7: exe silent r! bzip2 -d -c ".s:Escape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp) 266*ed39e1d5SBram Moolenaar exe "silent r! bzip2 -d -c -- ".s:Escape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.s:Escape(fname,1).decmp 267*ed39e1d5SBram Moolenaar else 268*ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 269*ed39e1d5SBram Moolenaar " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that. 270*ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 271*ed39e1d5SBram Moolenaar endif 272*ed39e1d5SBram Moolenaar" call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions." "s:Escape(tarfile,1).tar_secure..s:Escape(fname,1).decmp) 273*ed39e1d5SBram Moolenaar exe "silent r! ".g:tar_cmd." -".g:tar_readoptions." ".s:Escape(tarfile,1).tar_secure.s:Escape(fname,1).decmp 2748c8de839SBram Moolenaar endif 2758c8de839SBram Moolenaar 2768c8de839SBram Moolenaar if doro 2778c8de839SBram Moolenaar " because the reverse process of compressing changed files back into the tarball is not currently supported 2788c8de839SBram Moolenaar setlocal ro 2798c8de839SBram Moolenaar endif 2808c8de839SBram Moolenaar 281a5792f58SBram Moolenaar let w:tarfile= a:fname 282c236c16dSBram Moolenaar exe "file tarfile::".fnameescape(fname) 283a5792f58SBram Moolenaar 284a5792f58SBram Moolenaar " cleanup 285a5792f58SBram Moolenaar 0d 286a5792f58SBram Moolenaar set nomod 287a5792f58SBram Moolenaar 288bba577a2SBram Moolenaar let &report= repkeep 289a5792f58SBram Moolenaar" call Dret("tar#Read : w:tarfile<".w:tarfile.">") 290a5792f58SBram Moolenaarendfun 291a5792f58SBram Moolenaar 292a5792f58SBram Moolenaar" --------------------------------------------------------------------- 293a5792f58SBram Moolenaar" tar#Write: {{{2 294a5792f58SBram Moolenaarfun! tar#Write(fname) 295a5792f58SBram Moolenaar" call Dfunc("tar#Write(fname<".a:fname.">) w:tarfile<".w:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">") 296bba577a2SBram Moolenaar let repkeep= &report 297bba577a2SBram Moolenaar set report=10 298a5792f58SBram Moolenaar 299*ed39e1d5SBram Moolenaar if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-' 300*ed39e1d5SBram Moolenaar redraw! 301*ed39e1d5SBram Moolenaar echohl WarningMsg | echo '***error*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"; See :help tar-options' 302*ed39e1d5SBram Moolenaar" call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"') 303*ed39e1d5SBram Moolenaar return 304*ed39e1d5SBram Moolenaar endif 305*ed39e1d5SBram Moolenaar 306ab194816SBram Moolenaar " sanity checks 307910f66f9SBram Moolenaar if !executable(g:tar_cmd) 308c81e5e79SBram Moolenaar redraw! 309910f66f9SBram Moolenaar echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system' 310c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 311bba577a2SBram Moolenaar let &report= repkeep 312ab194816SBram Moolenaar" call Dret("tar#Write") 313ab194816SBram Moolenaar return 314ab194816SBram Moolenaar endif 315ab194816SBram Moolenaar if !exists("*mkdir") 316c81e5e79SBram Moolenaar redraw! 317a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None 318c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 319bba577a2SBram Moolenaar let &report= repkeep 320ab194816SBram Moolenaar" call Dret("tar#Write") 321ab194816SBram Moolenaar return 322ab194816SBram Moolenaar endif 323ab194816SBram Moolenaar 324ab194816SBram Moolenaar let curdir= getcwd() 325ab194816SBram Moolenaar let tmpdir= tempname() 326ab194816SBram Moolenaar" call Decho("orig tempname<".tmpdir.">") 327ab194816SBram Moolenaar if tmpdir =~ '\.' 328ab194816SBram Moolenaar let tmpdir= substitute(tmpdir,'\.[^.]*$','','e') 329ab194816SBram Moolenaar endif 330ab194816SBram Moolenaar" call Decho("tmpdir<".tmpdir.">") 331ab194816SBram Moolenaar call mkdir(tmpdir,"p") 332ab194816SBram Moolenaar 333ab194816SBram Moolenaar " attempt to change to the indicated directory 334ab194816SBram Moolenaar try 3358c8de839SBram Moolenaar exe "cd ".fnameescape(tmpdir) 336ab194816SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E344/ 337c81e5e79SBram Moolenaar redraw! 338a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None 339c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 340bba577a2SBram Moolenaar let &report= repkeep 341ab194816SBram Moolenaar" call Dret("tar#Write") 342ab194816SBram Moolenaar return 343ab194816SBram Moolenaar endtry 344ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 345ab194816SBram Moolenaar 346a5792f58SBram Moolenaar " place temporary files under .../_ZIPVIM_/ 347a5792f58SBram Moolenaar if isdirectory("_ZIPVIM_") 348a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 349ab194816SBram Moolenaar endif 350a5792f58SBram Moolenaar call mkdir("_ZIPVIM_") 351a5792f58SBram Moolenaar cd _ZIPVIM_ 352ab194816SBram Moolenaar" call Decho("current directory now: ".getcwd()) 353ab194816SBram Moolenaar 3548c8de839SBram Moolenaar let tarfile = substitute(w:tarfile,'tarfile:\(.\{-}\)::.*$','\1','') 3558c8de839SBram Moolenaar let fname = substitute(w:tarfile,'tarfile:.\{-}::\(.*\)$','\1','') 356a5792f58SBram Moolenaar 357a5792f58SBram Moolenaar " handle compressed archives 358a5792f58SBram Moolenaar if tarfile =~# '\.gz' 359c236c16dSBram Moolenaar call system("gzip -d -- ".s:Escape(tarfile,0)) 360a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.gz','','e') 361*ed39e1d5SBram Moolenaar let compress= "gzip -- ".s:Escape(tarfile,0) 362*ed39e1d5SBram Moolenaar" call Decho("compress<".compress.">") 363a5792f58SBram Moolenaar elseif tarfile =~# '\.tgz' 364c236c16dSBram Moolenaar call system("gzip -d -- ".s:Escape(tarfile,0)) 365a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.tgz','.tar','e') 366c236c16dSBram Moolenaar let compress= "gzip -- ".s:Escape(tarfile,0) 367a5792f58SBram Moolenaar let tgz = 1 368*ed39e1d5SBram Moolenaar" call Decho("compress<".compress.">") 369a5792f58SBram Moolenaar elseif tarfile =~# '\.bz2' 370c236c16dSBram Moolenaar call system("bzip2 -d -- ".s:Escape(tarfile,0)) 371a5792f58SBram Moolenaar let tarfile = substitute(tarfile,'\.bz2','','e') 372c236c16dSBram Moolenaar let compress= "bzip2 -- ".s:Escape(tarfile,0) 373*ed39e1d5SBram Moolenaar" call Decho("compress<".compress.">") 374a5792f58SBram Moolenaar endif 3758c8de839SBram Moolenaar" call Decho("tarfile<".tarfile.">") 376a5792f58SBram Moolenaar 377a5792f58SBram Moolenaar if v:shell_error != 0 378c81e5e79SBram Moolenaar redraw! 379a5792f58SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None 380c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 381a5792f58SBram Moolenaar else 382a5792f58SBram Moolenaar 383a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 384a5792f58SBram Moolenaar 3851cbe5f73SBram Moolenaar if fname =~ '/' 386a5792f58SBram Moolenaar let dirpath = substitute(fname,'/[^/]\+$','','e') 3871cbe5f73SBram Moolenaar if executable("cygpath") 388c236c16dSBram Moolenaar let dirpath = substitute(system("cygpath ".s:Escape(dirpath, 0)),'\n','','e') 3891cbe5f73SBram Moolenaar endif 3901cbe5f73SBram Moolenaar call mkdir(dirpath,"p") 3911cbe5f73SBram Moolenaar endif 392a5792f58SBram Moolenaar if tarfile !~ '/' 393a5792f58SBram Moolenaar let tarfile= curdir.'/'.tarfile 394a5792f58SBram Moolenaar endif 395*ed39e1d5SBram Moolenaar if tarfile =~ '^\s*-' 396*ed39e1d5SBram Moolenaar " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that. 397*ed39e1d5SBram Moolenaar let tarfile = substitute(tarfile, '-', './-', '') 398*ed39e1d5SBram Moolenaar endif 399a5792f58SBram Moolenaar" call Decho("tarfile<".tarfile."> fname<".fname.">") 400a5792f58SBram Moolenaar 401*ed39e1d5SBram Moolenaar if exists("g:tar_secure") 402*ed39e1d5SBram Moolenaar let tar_secure= " -- " 403*ed39e1d5SBram Moolenaar else 404*ed39e1d5SBram Moolenaar let tar_secure= " " 405*ed39e1d5SBram Moolenaar endif 4068c8de839SBram Moolenaar exe "w! ".fnameescape(fname) 407ab194816SBram Moolenaar if executable("cygpath") 408c236c16dSBram Moolenaar let tarfile = substitute(system("cygpath ".s:Escape(tarfile,0)),'\n','','e') 409ab194816SBram Moolenaar endif 410ab194816SBram Moolenaar 411a5792f58SBram Moolenaar " delete old file from tarfile 412*ed39e1d5SBram Moolenaar" call Decho("system(".g:tar_cmd." --delete -f ".s:Escape(tarfile,0)." -- ".s:Escape(fname,0).")") 413*ed39e1d5SBram Moolenaar call system(g:tar_cmd." --delete -f ".s:Escape(tarfile,0).tar_secure.s:Escape(fname,0)) 414ab194816SBram Moolenaar if v:shell_error != 0 415c81e5e79SBram Moolenaar redraw! 4168c8de839SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 417c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 418ab194816SBram Moolenaar else 419a5792f58SBram Moolenaar 420a5792f58SBram Moolenaar " update tarfile with new file 421*ed39e1d5SBram Moolenaar" call Decho(g:tar_cmd." -".g:tar_writeoptions." ".s:Escape(tarfile,0).tar_secure.s:Escape(fname,0)) 422*ed39e1d5SBram Moolenaar call system(g:tar_cmd." -".g:tar_writeoptions." ".s:Escape(tarfile,0).tar_secure.s:Escape(fname,0)) 423a5792f58SBram Moolenaar if v:shell_error != 0 424c81e5e79SBram Moolenaar redraw! 4258c8de839SBram Moolenaar echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None 426c81e5e79SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 427a5792f58SBram Moolenaar elseif exists("compress") 428a5792f58SBram Moolenaar" call Decho("call system(".compress.")") 429a5792f58SBram Moolenaar call system(compress) 430a5792f58SBram Moolenaar if exists("tgz") 431a5792f58SBram Moolenaar" call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")") 432a5792f58SBram Moolenaar call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e')) 433a5792f58SBram Moolenaar endif 434a5792f58SBram Moolenaar endif 435a5792f58SBram Moolenaar endif 436a5792f58SBram Moolenaar 437a5792f58SBram Moolenaar " support writing tarfiles across a network 438a5792f58SBram Moolenaar if s:tblfile_{winnr()} =~ '^\a\+://' 439a5792f58SBram Moolenaar" call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">") 440a5792f58SBram Moolenaar let tblfile= s:tblfile_{winnr()} 441a5792f58SBram Moolenaar 1split|enew 442a5792f58SBram Moolenaar let binkeep= &binary 443a5792f58SBram Moolenaar let eikeep = &ei 444a5792f58SBram Moolenaar set binary ei=all 445c236c16dSBram Moolenaar exe "e! ".fnameescape(tarfile) 446a5792f58SBram Moolenaar call netrw#NetWrite(tblfile) 447a5792f58SBram Moolenaar let &ei = eikeep 448a5792f58SBram Moolenaar let &binary = binkeep 449a5792f58SBram Moolenaar q! 450a5792f58SBram Moolenaar unlet s:tblfile_{winnr()} 451a5792f58SBram Moolenaar endif 452ab194816SBram Moolenaar endif 453ab194816SBram Moolenaar 454ab194816SBram Moolenaar " cleanup and restore current directory 455ab194816SBram Moolenaar cd .. 456a5792f58SBram Moolenaar call s:Rmdir("_ZIPVIM_") 457c236c16dSBram Moolenaar exe "cd ".fnameescape(curdir) 458ab194816SBram Moolenaar setlocal nomod 459ab194816SBram Moolenaar 460bba577a2SBram Moolenaar let &report= repkeep 461ab194816SBram Moolenaar" call Dret("tar#Write") 462ab194816SBram Moolenaarendfun 463ab194816SBram Moolenaar 464ab194816SBram Moolenaar" --------------------------------------------------------------------- 465a5792f58SBram Moolenaar" Rmdir: {{{2 466ab194816SBram Moolenaarfun! s:Rmdir(fname) 467ab194816SBram Moolenaar" call Dfunc("Rmdir(fname<".a:fname.">)") 468ab194816SBram Moolenaar if has("unix") 469c236c16dSBram Moolenaar call system("/bin/rm -rf -- ".s:Escape(a:fname,0)) 470ab194816SBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16") 471ab194816SBram Moolenaar if &shell =~? "sh$" 472c236c16dSBram Moolenaar call system("/bin/rm -rf -- ".s:Escape(a:fname,0)) 473ab194816SBram Moolenaar else 474c236c16dSBram Moolenaar call system("del /S ".s:Escape(a:fname,0)) 475ab194816SBram Moolenaar endif 476ab194816SBram Moolenaar endif 477ab194816SBram Moolenaar" call Dret("Rmdir") 478ab194816SBram Moolenaarendfun 479ab194816SBram Moolenaar 4808c8de839SBram Moolenaar" --------------------------------------------------------------------- 4818c8de839SBram Moolenaar" s:Escape: {{{2 482c236c16dSBram Moolenaarfun s:Escape(name,isfilt) 4838c8de839SBram Moolenaar " shellescape() was added by patch 7.0.111 4848c8de839SBram Moolenaar if exists("*shellescape") 485c236c16dSBram Moolenaar if a:isfilt 486c236c16dSBram Moolenaar let qnameq= shellescape(a:name,1) 487c236c16dSBram Moolenaar else 4888c8de839SBram Moolenaar let qnameq= shellescape(a:name) 489c236c16dSBram Moolenaar endif 4908c8de839SBram Moolenaar else 4918c8de839SBram Moolenaar let qnameq= g:tar_shq . a:name . g:tar_shq 4928c8de839SBram Moolenaar endif 4938c8de839SBram Moolenaar return qnameq 4948c8de839SBram Moolenaarendfun 4958c8de839SBram Moolenaar 4968c8de839SBram Moolenaar" --------------------------------------------------------------------- 497a5792f58SBram Moolenaar" Modelines And Restoration: {{{1 498a5792f58SBram Moolenaarlet &cpo= s:keepcpo 499a5792f58SBram Moolenaarunlet s:keepcpo 500a5792f58SBram Moolenaar" vim:ts=8 fdm=marker 501