160a795aaSBram Moolenaar" zip.vim: Handles browsing zipfiles 260a795aaSBram Moolenaar" AUTOLOAD PORTION 3*519cc559SBram Moolenaar" Date: Nov 08, 2021 4*519cc559SBram Moolenaar" Version: 32 52963456fSBram Moolenaar" Maintainer: Charles E Campbell <[email protected]> 660a795aaSBram Moolenaar" License: Vim License (see vim's :help license) 72963456fSBram Moolenaar" Copyright: Copyright (C) 2005-2019 Charles E. Campbell {{{1 860a795aaSBram Moolenaar" Permission is hereby granted to use and distribute this code, 960a795aaSBram Moolenaar" with or without modifications, provided that this copyright 1060a795aaSBram Moolenaar" notice is copied with it. Like anything else that's free, 11446cb837SBram Moolenaar" zip.vim and zipPlugin.vim are provided *as is* and comes with 12446cb837SBram Moolenaar" no warranty of any kind, either expressed or implied. By using 13446cb837SBram Moolenaar" this plugin, you agree that in no event will the copyright 1460a795aaSBram Moolenaar" holder be liable for any damages resulting from the use 1560a795aaSBram Moolenaar" of this software. 1694f76b7fSBram Moolenaar"redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore() 1760a795aaSBram Moolenaar 1860a795aaSBram Moolenaar" --------------------------------------------------------------------- 199964e468SBram Moolenaar" Load Once: {{{1 2000a927d6SBram Moolenaarif &cp || exists("g:loaded_zip") 2160a795aaSBram Moolenaar finish 2260a795aaSBram Moolenaarendif 23*519cc559SBram Moolenaarlet g:loaded_zip= "v32" 2400a927d6SBram Moolenaarif v:version < 702 2500a927d6SBram Moolenaar echohl WarningMsg 26d0796909SBram Moolenaar echo "***warning*** this version of zip needs vim 7.2 or later" 2700a927d6SBram Moolenaar echohl Normal 2800a927d6SBram Moolenaar finish 2900a927d6SBram Moolenaarendif 3000a927d6SBram Moolenaarlet s:keepcpo= &cpo 3100a927d6SBram Moolenaarset cpo&vim 3294f76b7fSBram Moolenaar"DechoTabOn 3360a795aaSBram Moolenaar 34db552d60SBram Moolenaarlet s:zipfile_escape = ' ?&;\' 359964e468SBram Moolenaarlet s:ERROR = 2 369964e468SBram Moolenaarlet s:WARNING = 1 379964e468SBram Moolenaarlet s:NOTE = 0 389964e468SBram Moolenaar 399964e468SBram Moolenaar" --------------------------------------------------------------------- 409964e468SBram Moolenaar" Global Values: {{{1 419964e468SBram Moolenaarif !exists("g:zip_shq") 42446cb837SBram Moolenaar if &shq != "" 43446cb837SBram Moolenaar let g:zip_shq= &shq 44446cb837SBram Moolenaar elseif has("unix") 459964e468SBram Moolenaar let g:zip_shq= "'" 469964e468SBram Moolenaar else 479964e468SBram Moolenaar let g:zip_shq= '"' 489964e468SBram Moolenaar endif 499964e468SBram Moolenaarendif 50ccc18222SBram Moolenaarif !exists("g:zip_zipcmd") 51ccc18222SBram Moolenaar let g:zip_zipcmd= "zip" 52ccc18222SBram Moolenaarendif 53ccc18222SBram Moolenaarif !exists("g:zip_unzipcmd") 54ccc18222SBram Moolenaar let g:zip_unzipcmd= "unzip" 55ccc18222SBram Moolenaarendif 56d0796909SBram Moolenaarif !exists("g:zip_extractcmd") 57d0796909SBram Moolenaar let g:zip_extractcmd= g:zip_unzipcmd 58d0796909SBram Moolenaarendif 5960a795aaSBram Moolenaar 6060a795aaSBram Moolenaar" ---------------- 6160a795aaSBram Moolenaar" Functions: {{{1 6260a795aaSBram Moolenaar" ---------------- 6360a795aaSBram Moolenaar 6460a795aaSBram Moolenaar" --------------------------------------------------------------------- 6560a795aaSBram Moolenaar" zip#Browse: {{{2 6660a795aaSBram Moolenaarfun! zip#Browse(zipfile) 6760a795aaSBram Moolenaar" call Dfunc("zip#Browse(zipfile<".a:zipfile.">)") 68cb80aa2dSBram Moolenaar " sanity check: insure that the zipfile has "PK" as its first two letters 6994f76b7fSBram Moolenaar " (zipped files have a leading PK as a "magic cookie") 7094f76b7fSBram Moolenaar if !filereadable(a:zipfile) || readfile(a:zipfile, "", 1)[0] !~ '^PK' 712963456fSBram Moolenaar exe "noswapfile noautocmd noswapfile e ".fnameescape(a:zipfile) 7294f76b7fSBram Moolenaar" call Dret("zip#Browse : not a zipfile<".a:zipfile.">") 7394f76b7fSBram Moolenaar return 7494f76b7fSBram Moolenaar" else " Decho 758024f936SBram Moolenaar" call Decho("zip#Browse: a:zipfile<".a:zipfile."> passed PK test - it's a zip file") 7694f76b7fSBram Moolenaar endif 7794f76b7fSBram Moolenaar 7836c31f71SBram Moolenaar let repkeep= &report 7936c31f71SBram Moolenaar set report=10 8060a795aaSBram Moolenaar 8160a795aaSBram Moolenaar " sanity checks 82e37d50a5SBram Moolenaar if !exists("*fnameescape") 83e37d50a5SBram Moolenaar if &verbose > 1 846c391a74SBram Moolenaar echoerr "the zip plugin is not available (your vim doesn't support fnameescape())" 85e37d50a5SBram Moolenaar endif 86e37d50a5SBram Moolenaar return 87e37d50a5SBram Moolenaar endif 88ccc18222SBram Moolenaar if !executable(g:zip_unzipcmd) 899964e468SBram Moolenaar redraw! 9060a795aaSBram Moolenaar echohl Error | echo "***error*** (zip#Browse) unzip not available on your system" 919964e468SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 9236c31f71SBram Moolenaar let &report= repkeep 9360a795aaSBram Moolenaar" call Dret("zip#Browse") 9460a795aaSBram Moolenaar return 9560a795aaSBram Moolenaar endif 9660a795aaSBram Moolenaar if !filereadable(a:zipfile) 97a5792f58SBram Moolenaar if a:zipfile !~# '^\a\+://' 988024f936SBram Moolenaar " if it's an url, don't complain, let url-handlers such as vim do its thing 999964e468SBram Moolenaar redraw! 10060a795aaSBram Moolenaar echohl Error | echo "***error*** (zip#Browse) File not readable<".a:zipfile.">" | echohl None 1019964e468SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 102a5792f58SBram Moolenaar endif 10336c31f71SBram Moolenaar let &report= repkeep 104a5792f58SBram Moolenaar" call Dret("zip#Browse : file<".a:zipfile."> not readable") 10560a795aaSBram Moolenaar return 10660a795aaSBram Moolenaar endif 107db552d60SBram Moolenaar" call Decho("passed sanity checks") 10860a795aaSBram Moolenaar if &ma != 1 10960a795aaSBram Moolenaar set ma 11060a795aaSBram Moolenaar endif 111ccc18222SBram Moolenaar let b:zipfile= a:zipfile 11260a795aaSBram Moolenaar 11360a795aaSBram Moolenaar setlocal noswapfile 11460a795aaSBram Moolenaar setlocal buftype=nofile 11560a795aaSBram Moolenaar setlocal bufhidden=hide 11660a795aaSBram Moolenaar setlocal nobuflisted 11760a795aaSBram Moolenaar setlocal nowrap 118*519cc559SBram Moolenaar 119*519cc559SBram Moolenaar " Oct 12, 2021: need to re-use Bram's syntax/tar.vim. 120*519cc559SBram Moolenaar " Setting the filetype to zip doesn't do anything (currently), 121*519cc559SBram Moolenaar " but it is perhaps less confusing to curious perusers who do 122*519cc559SBram Moolenaar " a :echo &ft 123*519cc559SBram Moolenaar setf zip 124*519cc559SBram Moolenaar run! syntax/tar.vim 12560a795aaSBram Moolenaar 12660a795aaSBram Moolenaar " give header 127251e1912SBram Moolenaar call append(0, ['" zip.vim version '.g:loaded_zip, 128251e1912SBram Moolenaar \ '" Browsing zipfile '.a:zipfile, 129251e1912SBram Moolenaar \ '" Select a file with cursor and press ENTER']) 130251e1912SBram Moolenaar keepj $ 13160a795aaSBram Moolenaar 132e37d50a5SBram Moolenaar" call Decho("exe silent r! ".g:zip_unzipcmd." -l -- ".s:Escape(a:zipfile,1)) 1336be7f873SBram Moolenaar exe "keepj sil! r! ".g:zip_unzipcmd." -Z -1 -- ".s:Escape(a:zipfile,1) 134d68071d8SBram Moolenaar if v:shell_error != 0 1359964e468SBram Moolenaar redraw! 136c236c16dSBram Moolenaar echohl WarningMsg | echo "***warning*** (zip#Browse) ".fnameescape(a:zipfile)." is not a zip file" | echohl None 1379964e468SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 138251e1912SBram Moolenaar keepj sil! %d 139d68071d8SBram Moolenaar let eikeep= &ei 140d68071d8SBram Moolenaar set ei=BufReadCmd,FileReadCmd 141251e1912SBram Moolenaar exe "keepj r ".fnameescape(a:zipfile) 142d68071d8SBram Moolenaar let &ei= eikeep 143251e1912SBram Moolenaar keepj 1d 144d68071d8SBram Moolenaar" call Dret("zip#Browse") 145d68071d8SBram Moolenaar return 146d68071d8SBram Moolenaar endif 14760a795aaSBram Moolenaar 148d0796909SBram Moolenaar " Maps associated with zip plugin 14960a795aaSBram Moolenaar setlocal noma nomod ro 15060a795aaSBram Moolenaar noremap <silent> <buffer> <cr> :call <SID>ZipBrowseSelect()<cr> 151d0796909SBram Moolenaar noremap <silent> <buffer> x :call zip#Extract()<cr> 1522963456fSBram Moolenaar if &mouse != "" 1532963456fSBram Moolenaar noremap <silent> <buffer> <leftmouse> <leftmouse>:call <SID>ZipBrowseSelect()<cr> 1542963456fSBram Moolenaar endif 15560a795aaSBram Moolenaar 15636c31f71SBram Moolenaar let &report= repkeep 15760a795aaSBram Moolenaar" call Dret("zip#Browse") 15860a795aaSBram Moolenaarendfun 15960a795aaSBram Moolenaar 16060a795aaSBram Moolenaar" --------------------------------------------------------------------- 16160a795aaSBram Moolenaar" ZipBrowseSelect: {{{2 16260a795aaSBram Moolenaarfun! s:ZipBrowseSelect() 163ccc18222SBram Moolenaar" call Dfunc("ZipBrowseSelect() zipfile<".b:zipfile."> curfile<".expand("%").">") 16436c31f71SBram Moolenaar let repkeep= &report 16536c31f71SBram Moolenaar set report=10 16660a795aaSBram Moolenaar let fname= getline(".") 16760a795aaSBram Moolenaar 16860a795aaSBram Moolenaar " sanity check 16960a795aaSBram Moolenaar if fname =~ '^"' 17036c31f71SBram Moolenaar let &report= repkeep 17160a795aaSBram Moolenaar" call Dret("ZipBrowseSelect") 17260a795aaSBram Moolenaar return 17360a795aaSBram Moolenaar endif 17460a795aaSBram Moolenaar if fname =~ '/$' 1759964e468SBram Moolenaar redraw! 17660a795aaSBram Moolenaar echohl Error | echo "***error*** (zip#Browse) Please specify a file, not a directory" | echohl None 1779964e468SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 17836c31f71SBram Moolenaar let &report= repkeep 17960a795aaSBram Moolenaar" call Dret("ZipBrowseSelect") 18060a795aaSBram Moolenaar return 18160a795aaSBram Moolenaar endif 18260a795aaSBram Moolenaar 18360a795aaSBram Moolenaar" call Decho("fname<".fname.">") 18460a795aaSBram Moolenaar 18560a795aaSBram Moolenaar " get zipfile to the new-window 186ccc18222SBram Moolenaar let zipfile = b:zipfile 187910f66f9SBram Moolenaar let curfile = expand("%") 188db552d60SBram Moolenaar" call Decho("zipfile<".zipfile.">") 189db552d60SBram Moolenaar" call Decho("curfile<".curfile.">") 19060a795aaSBram Moolenaar 1912963456fSBram Moolenaar noswapfile new 192446cb837SBram Moolenaar if !exists("g:zip_nomax") || g:zip_nomax == 0 19360a795aaSBram Moolenaar wincmd _ 194446cb837SBram Moolenaar endif 195a5792f58SBram Moolenaar let s:zipfile_{winnr()}= curfile 196*519cc559SBram Moolenaar" call Decho("exe e ".fnameescape("zipfile://".zipfile.'::'.fname)) 197*519cc559SBram Moolenaar exe "noswapfile e ".fnameescape("zipfile://".zipfile.'::'.fname) 19860a795aaSBram Moolenaar filetype detect 19960a795aaSBram Moolenaar 20036c31f71SBram Moolenaar let &report= repkeep 201a5792f58SBram Moolenaar" call Dret("ZipBrowseSelect : s:zipfile_".winnr()."<".s:zipfile_{winnr()}.">") 20260a795aaSBram Moolenaarendfun 20360a795aaSBram Moolenaar 20460a795aaSBram Moolenaar" --------------------------------------------------------------------- 20560a795aaSBram Moolenaar" zip#Read: {{{2 20660a795aaSBram Moolenaarfun! zip#Read(fname,mode) 20760a795aaSBram Moolenaar" call Dfunc("zip#Read(fname<".a:fname.">,mode=".a:mode.")") 20836c31f71SBram Moolenaar let repkeep= &report 20936c31f71SBram Moolenaar set report=10 21036c31f71SBram Moolenaar 211d68071d8SBram Moolenaar if has("unix") 212*519cc559SBram Moolenaar let zipfile = substitute(a:fname,'zipfile://\(.\{-}\)::[^\\].*$','\1','') 213*519cc559SBram Moolenaar let fname = substitute(a:fname,'zipfile://.\{-}::\([^\\].*\)$','\1','') 214d68071d8SBram Moolenaar else 215*519cc559SBram Moolenaar let zipfile = substitute(a:fname,'^.\{-}zipfile://\(.\{-}\)::[^\\].*$','\1','') 216*519cc559SBram Moolenaar let fname = substitute(a:fname,'^.\{-}zipfile://.\{-}::\([^\\].*\)$','\1','') 2179964e468SBram Moolenaar let fname = substitute(fname, '[', '[[]', 'g') 218d68071d8SBram Moolenaar endif 219d68071d8SBram Moolenaar" call Decho("zipfile<".zipfile.">") 220d68071d8SBram Moolenaar" call Decho("fname <".fname.">") 221d0796909SBram Moolenaar " sanity check 222d0796909SBram Moolenaar if !executable(substitute(g:zip_unzipcmd,'\s\+.*$','','')) 223d0796909SBram Moolenaar redraw! 224d0796909SBram Moolenaar echohl Error | echo "***error*** (zip#Read) sorry, your system doesn't appear to have the ".g:zip_unzipcmd." program" | echohl None 225d0796909SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 226d0796909SBram Moolenaar let &report= repkeep 227d0796909SBram Moolenaar" call Dret("zip#Write") 228d0796909SBram Moolenaar return 229d0796909SBram Moolenaar endif 23060a795aaSBram Moolenaar 231ff034194SBram Moolenaar " the following code does much the same thing as 232ff034194SBram Moolenaar " exe "keepj sil! r! ".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1) 233*519cc559SBram Moolenaar " but allows zipfile://... entries in quickfix lists 234ff034194SBram Moolenaar let temp = tempname() 23594f76b7fSBram Moolenaar" call Decho("using temp file<".temp.">") 236ff034194SBram Moolenaar let fn = expand('%:p') 237ff034194SBram Moolenaar exe "sil! !".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1).' > '.temp 238ff034194SBram Moolenaar" call Decho("exe sil! !".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1).' > '.temp) 239ff034194SBram Moolenaar sil exe 'keepalt file '.temp 240ff034194SBram Moolenaar sil keepj e! 241ff034194SBram Moolenaar sil exe 'keepalt file '.fnameescape(fn) 242ff034194SBram Moolenaar call delete(temp) 243ff034194SBram Moolenaar 244251e1912SBram Moolenaar filetype detect 24560a795aaSBram Moolenaar 24660a795aaSBram Moolenaar " cleanup 24794f76b7fSBram Moolenaar " keepj 0d " used to be needed for the ...r! ... method 24860a795aaSBram Moolenaar set nomod 24960a795aaSBram Moolenaar 25036c31f71SBram Moolenaar let &report= repkeep 25160a795aaSBram Moolenaar" call Dret("zip#Read") 25260a795aaSBram Moolenaarendfun 25360a795aaSBram Moolenaar 25460a795aaSBram Moolenaar" --------------------------------------------------------------------- 25560a795aaSBram Moolenaar" zip#Write: {{{2 25660a795aaSBram Moolenaarfun! zip#Write(fname) 257910f66f9SBram Moolenaar" call Dfunc("zip#Write(fname<".a:fname.">) zipfile_".winnr()."<".s:zipfile_{winnr()}.">") 25836c31f71SBram Moolenaar let repkeep= &report 25936c31f71SBram Moolenaar set report=10 26060a795aaSBram Moolenaar 26160a795aaSBram Moolenaar " sanity checks 262d0796909SBram Moolenaar if !executable(substitute(g:zip_zipcmd,'\s\+.*$','','')) 2639964e468SBram Moolenaar redraw! 264d0796909SBram Moolenaar echohl Error | echo "***error*** (zip#Write) sorry, your system doesn't appear to have the ".g:zip_zipcmd." program" | echohl None 2659964e468SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 26636c31f71SBram Moolenaar let &report= repkeep 26760a795aaSBram Moolenaar" call Dret("zip#Write") 26860a795aaSBram Moolenaar return 26960a795aaSBram Moolenaar endif 27060a795aaSBram Moolenaar if !exists("*mkdir") 2719964e468SBram Moolenaar redraw! 27260a795aaSBram Moolenaar echohl Error | echo "***error*** (zip#Write) sorry, mkdir() doesn't work on your system" | echohl None 2739964e468SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 27436c31f71SBram Moolenaar let &report= repkeep 27560a795aaSBram Moolenaar" call Dret("zip#Write") 27660a795aaSBram Moolenaar return 27760a795aaSBram Moolenaar endif 27860a795aaSBram Moolenaar 27960a795aaSBram Moolenaar let curdir= getcwd() 28060a795aaSBram Moolenaar let tmpdir= tempname() 28160a795aaSBram Moolenaar" call Decho("orig tempname<".tmpdir.">") 28260a795aaSBram Moolenaar if tmpdir =~ '\.' 28360a795aaSBram Moolenaar let tmpdir= substitute(tmpdir,'\.[^.]*$','','e') 28460a795aaSBram Moolenaar endif 28560a795aaSBram Moolenaar" call Decho("tmpdir<".tmpdir.">") 28660a795aaSBram Moolenaar call mkdir(tmpdir,"p") 28760a795aaSBram Moolenaar 28860a795aaSBram Moolenaar " attempt to change to the indicated directory 2899964e468SBram Moolenaar if s:ChgDir(tmpdir,s:ERROR,"(zip#Write) cannot cd to temporary directory") 29036c31f71SBram Moolenaar let &report= repkeep 29160a795aaSBram Moolenaar" call Dret("zip#Write") 29260a795aaSBram Moolenaar return 2939964e468SBram Moolenaar endif 29460a795aaSBram Moolenaar" call Decho("current directory now: ".getcwd()) 29560a795aaSBram Moolenaar 29660a795aaSBram Moolenaar " place temporary files under .../_ZIPVIM_/ 29760a795aaSBram Moolenaar if isdirectory("_ZIPVIM_") 29860a795aaSBram Moolenaar call s:Rmdir("_ZIPVIM_") 29960a795aaSBram Moolenaar endif 30060a795aaSBram Moolenaar call mkdir("_ZIPVIM_") 30160a795aaSBram Moolenaar cd _ZIPVIM_ 30260a795aaSBram Moolenaar" call Decho("current directory now: ".getcwd()) 30360a795aaSBram Moolenaar 304d68071d8SBram Moolenaar if has("unix") 305*519cc559SBram Moolenaar let zipfile = substitute(a:fname,'zipfile://\(.\{-}\)::[^\\].*$','\1','') 306*519cc559SBram Moolenaar let fname = substitute(a:fname,'zipfile://.\{-}::\([^\\].*\)$','\1','') 307d68071d8SBram Moolenaar else 308*519cc559SBram Moolenaar let zipfile = substitute(a:fname,'^.\{-}zipfile://\(.\{-}\)::[^\\].*$','\1','') 309*519cc559SBram Moolenaar let fname = substitute(a:fname,'^.\{-}zipfile://.\{-}::\([^\\].*\)$','\1','') 310d68071d8SBram Moolenaar endif 311d68071d8SBram Moolenaar" call Decho("zipfile<".zipfile.">") 312d68071d8SBram Moolenaar" call Decho("fname <".fname.">") 313c7486e03SBram Moolenaar 314c7486e03SBram Moolenaar if fname =~ '/' 31560a795aaSBram Moolenaar let dirpath = substitute(fname,'/[^/]\+$','','e') 316ff034194SBram Moolenaar if has("win32unix") && executable("cygpath") 317c236c16dSBram Moolenaar let dirpath = substitute(system("cygpath ".s:Escape(dirpath,0)),'\n','','e') 318c7486e03SBram Moolenaar endif 319910f66f9SBram Moolenaar" call Decho("mkdir(dirpath<".dirpath.">,p)") 320c7486e03SBram Moolenaar call mkdir(dirpath,"p") 321c7486e03SBram Moolenaar endif 32260a795aaSBram Moolenaar if zipfile !~ '/' 32360a795aaSBram Moolenaar let zipfile= curdir.'/'.zipfile 32460a795aaSBram Moolenaar endif 32560a795aaSBram Moolenaar" call Decho("zipfile<".zipfile."> fname<".fname.">") 32660a795aaSBram Moolenaar 327c236c16dSBram Moolenaar exe "w! ".fnameescape(fname) 328ff034194SBram Moolenaar if has("win32unix") && executable("cygpath") 329c236c16dSBram Moolenaar let zipfile = substitute(system("cygpath ".s:Escape(zipfile,0)),'\n','','e') 33060a795aaSBram Moolenaar endif 33160a795aaSBram Moolenaar 3329964e468SBram Moolenaar if (has("win32") || has("win95") || has("win64") || has("win16")) && &shell !~? 'sh$' 3339964e468SBram Moolenaar let fname = substitute(fname, '[', '[[]', 'g') 3349964e468SBram Moolenaar endif 3359964e468SBram Moolenaar 336e37d50a5SBram Moolenaar" call Decho(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0)) 337e37d50a5SBram Moolenaar call system(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0)) 33860a795aaSBram Moolenaar if v:shell_error != 0 3399964e468SBram Moolenaar redraw! 34060a795aaSBram Moolenaar echohl Error | echo "***error*** (zip#Write) sorry, unable to update ".zipfile." with ".fname | echohl None 3419964e468SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 342a5792f58SBram Moolenaar 343a5792f58SBram Moolenaar elseif s:zipfile_{winnr()} =~ '^\a\+://' 344a5792f58SBram Moolenaar " support writing zipfiles across a network 345a5792f58SBram Moolenaar let netzipfile= s:zipfile_{winnr()} 3469964e468SBram Moolenaar" call Decho("handle writing <".zipfile."> across network as <".netzipfile.">") 347a5792f58SBram Moolenaar 1split|enew 348a5792f58SBram Moolenaar let binkeep= &binary 349a5792f58SBram Moolenaar let eikeep = &ei 350a5792f58SBram Moolenaar set binary ei=all 3512963456fSBram Moolenaar exe "noswapfile e! ".fnameescape(zipfile) 352a5792f58SBram Moolenaar call netrw#NetWrite(netzipfile) 353a5792f58SBram Moolenaar let &ei = eikeep 354a5792f58SBram Moolenaar let &binary = binkeep 355a5792f58SBram Moolenaar q! 356a5792f58SBram Moolenaar unlet s:zipfile_{winnr()} 35760a795aaSBram Moolenaar endif 35860a795aaSBram Moolenaar 35960a795aaSBram Moolenaar " cleanup and restore current directory 36060a795aaSBram Moolenaar cd .. 36160a795aaSBram Moolenaar call s:Rmdir("_ZIPVIM_") 3629964e468SBram Moolenaar call s:ChgDir(curdir,s:WARNING,"(zip#Write) unable to return to ".curdir."!") 3639964e468SBram Moolenaar call s:Rmdir(tmpdir) 36460a795aaSBram Moolenaar setlocal nomod 36560a795aaSBram Moolenaar 36636c31f71SBram Moolenaar let &report= repkeep 36760a795aaSBram Moolenaar" call Dret("zip#Write") 36860a795aaSBram Moolenaarendfun 36960a795aaSBram Moolenaar 37060a795aaSBram Moolenaar" --------------------------------------------------------------------- 371d0796909SBram Moolenaar" zip#Extract: extract a file from a zip archive {{{2 372d0796909SBram Moolenaarfun! zip#Extract() 373d0796909SBram Moolenaar" call Dfunc("zip#Extract()") 374d0796909SBram Moolenaar 375d0796909SBram Moolenaar let repkeep= &report 376d0796909SBram Moolenaar set report=10 377d0796909SBram Moolenaar let fname= getline(".") 378d0796909SBram Moolenaar" call Decho("fname<".fname.">") 379d0796909SBram Moolenaar 380d0796909SBram Moolenaar " sanity check 381d0796909SBram Moolenaar if fname =~ '^"' 382d0796909SBram Moolenaar let &report= repkeep 383d0796909SBram Moolenaar" call Dret("zip#Extract") 384d0796909SBram Moolenaar return 385d0796909SBram Moolenaar endif 386d0796909SBram Moolenaar if fname =~ '/$' 387d0796909SBram Moolenaar redraw! 388d0796909SBram Moolenaar echohl Error | echo "***error*** (zip#Extract) Please specify a file, not a directory" | echohl None 389d0796909SBram Moolenaar let &report= repkeep 390d0796909SBram Moolenaar" call Dret("zip#Extract") 391d0796909SBram Moolenaar return 392d0796909SBram Moolenaar endif 393d0796909SBram Moolenaar 394d0796909SBram Moolenaar " extract the file mentioned under the cursor 395d0796909SBram Moolenaar" call Decho("system(".g:zip_extractcmd." ".shellescape(b:zipfile)." ".shellescape(shell).")") 396d0796909SBram Moolenaar call system(g:zip_extractcmd." ".shellescape(b:zipfile)." ".shellescape(shell)) 397d0796909SBram Moolenaar" call Decho("zipfile<".b:zipfile.">") 398d0796909SBram Moolenaar if v:shell_error != 0 399d0796909SBram Moolenaar echohl Error | echo "***error*** ".g:zip_extractcmd." ".b:zipfile." ".fname.": failed!" | echohl NONE 400d0796909SBram Moolenaar elseif !filereadable(fname) 401d0796909SBram Moolenaar echohl Error | echo "***error*** attempted to extract ".fname." but it doesn't appear to be present!" 402d0796909SBram Moolenaar else 403d0796909SBram Moolenaar echo "***note*** successfully extracted ".fname 404d0796909SBram Moolenaar endif 405d0796909SBram Moolenaar 406d0796909SBram Moolenaar " restore option 407d0796909SBram Moolenaar let &report= repkeep 408d0796909SBram Moolenaar 409d0796909SBram Moolenaar" call Dret("zip#Extract") 410d0796909SBram Moolenaarendfun 411d0796909SBram Moolenaar 412d0796909SBram Moolenaar" --------------------------------------------------------------------- 413c236c16dSBram Moolenaar" s:Escape: {{{2 414c236c16dSBram Moolenaarfun! s:Escape(fname,isfilt) 415c236c16dSBram Moolenaar" call Dfunc("QuoteFileDir(fname<".a:fname."> isfilt=".a:isfilt.")") 416c236c16dSBram Moolenaar if exists("*shellescape") 417c236c16dSBram Moolenaar if a:isfilt 418c236c16dSBram Moolenaar let qnameq= shellescape(a:fname,1) 419c236c16dSBram Moolenaar else 420446cb837SBram Moolenaar let qnameq= shellescape(a:fname) 421c236c16dSBram Moolenaar endif 422446cb837SBram Moolenaar else 423446cb837SBram Moolenaar let qnameq= g:zip_shq.escape(a:fname,g:zip_shq).g:zip_shq 424446cb837SBram Moolenaar endif 425446cb837SBram Moolenaar" call Dret("QuoteFileDir <".qnameq.">") 426446cb837SBram Moolenaar return qnameq 4279964e468SBram Moolenaarendfun 4289964e468SBram Moolenaar 4299964e468SBram Moolenaar" --------------------------------------------------------------------- 4309964e468SBram Moolenaar" ChgDir: {{{2 4319964e468SBram Moolenaarfun! s:ChgDir(newdir,errlvl,errmsg) 4329964e468SBram Moolenaar" call Dfunc("ChgDir(newdir<".a:newdir."> errlvl=".a:errlvl." errmsg<".a:errmsg.">)") 4339964e468SBram Moolenaar 4349964e468SBram Moolenaar try 435e37d50a5SBram Moolenaar exe "cd ".fnameescape(a:newdir) 4369964e468SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E344/ 4379964e468SBram Moolenaar redraw! 4389964e468SBram Moolenaar if a:errlvl == s:NOTE 4399964e468SBram Moolenaar echo "***note*** ".a:errmsg 4409964e468SBram Moolenaar elseif a:errlvl == s:WARNING 4419964e468SBram Moolenaar echohl WarningMsg | echo "***warning*** ".a:errmsg | echohl NONE 4429964e468SBram Moolenaar elseif a:errlvl == s:ERROR 4439964e468SBram Moolenaar echohl Error | echo "***error*** ".a:errmsg | echohl NONE 4449964e468SBram Moolenaar endif 4459964e468SBram Moolenaar" call inputsave()|call input("Press <cr> to continue")|call inputrestore() 4469964e468SBram Moolenaar" call Dret("ChgDir 1") 4479964e468SBram Moolenaar return 1 4489964e468SBram Moolenaar endtry 4499964e468SBram Moolenaar 4509964e468SBram Moolenaar" call Dret("ChgDir 0") 4519964e468SBram Moolenaar return 0 4529964e468SBram Moolenaarendfun 4539964e468SBram Moolenaar 4549964e468SBram Moolenaar" --------------------------------------------------------------------- 455c236c16dSBram Moolenaar" s:Rmdir: {{{2 45660a795aaSBram Moolenaarfun! s:Rmdir(fname) 45760a795aaSBram Moolenaar" call Dfunc("Rmdir(fname<".a:fname.">)") 4589964e468SBram Moolenaar if (has("win32") || has("win95") || has("win64") || has("win16")) && &shell !~? 'sh$' 459c236c16dSBram Moolenaar call system("rmdir /S/Q ".s:Escape(a:fname,0)) 46060a795aaSBram Moolenaar else 461c236c16dSBram Moolenaar call system("/bin/rm -rf ".s:Escape(a:fname,0)) 46260a795aaSBram Moolenaar endif 46360a795aaSBram Moolenaar" call Dret("Rmdir") 46460a795aaSBram Moolenaarendfun 46560a795aaSBram Moolenaar 46660a795aaSBram Moolenaar" ------------------------------------------------------------------------ 46760a795aaSBram Moolenaar" Modelines And Restoration: {{{1 46860a795aaSBram Moolenaarlet &cpo= s:keepcpo 46960a795aaSBram Moolenaarunlet s:keepcpo 47060a795aaSBram Moolenaar" vim:ts=8 fdm=marker 471