xref: /vim-8.2.3635/runtime/autoload/zip.vim (revision 519cc559)
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