blob: c0034f8a7abdb87427fc71d5b4c26c9fc68b04b3 [file] [log] [blame]
Bram Moolenaar60a795a2005-09-16 21:55:43 +00001" zip.vim: Handles browsing zipfiles
2" AUTOLOAD PORTION
Bram Moolenaar71badf92023-04-22 22:40:14 +01003" Date: Mar 12, 2023
4" Version: 33
Christian Brabandtf9ca1392024-02-19 20:37:11 +01005" Maintainer: This runtime file is looking for a new maintainer.
6" Former Maintainer: Charles E Campbell
Bram Moolenaar9964e462007-05-05 17:54:07 +00007" License: Vim License (see vim's :help license)
Bram Moolenaar29634562020-01-09 21:46:04 +01008" Copyright: Copyright (C) 2005-2019 Charles E. Campbell {{{1
Bram Moolenaar60a795a2005-09-16 21:55:43 +00009" Permission is hereby granted to use and distribute this code,
10" with or without modifications, provided that this copyright
11" notice is copied with it. Like anything else that's free,
Bram Moolenaar446cb832008-06-24 21:56:24 +000012" zip.vim and zipPlugin.vim are provided *as is* and comes with
13" no warranty of any kind, either expressed or implied. By using
14" this plugin, you agree that in no event will the copyright
Bram Moolenaar60a795a2005-09-16 21:55:43 +000015" holder be liable for any damages resulting from the use
16" of this software.
Bram Moolenaar94f76b72013-07-04 22:50:40 +020017"redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar60a795a2005-09-16 21:55:43 +000018
19" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +000020" Load Once: {{{1
Bram Moolenaar00a927d2010-05-14 23:24:24 +020021if &cp || exists("g:loaded_zip")
Bram Moolenaar60a795a2005-09-16 21:55:43 +000022 finish
23endif
Bram Moolenaar71badf92023-04-22 22:40:14 +010024let g:loaded_zip= "v33"
Bram Moolenaar00a927d2010-05-14 23:24:24 +020025if v:version < 702
26 echohl WarningMsg
Bram Moolenaard0796902016-09-16 20:02:31 +020027 echo "***warning*** this version of zip needs vim 7.2 or later"
Bram Moolenaar00a927d2010-05-14 23:24:24 +020028 echohl Normal
29 finish
30endif
31let s:keepcpo= &cpo
32set cpo&vim
Bram Moolenaar94f76b72013-07-04 22:50:40 +020033"DechoTabOn
Bram Moolenaar60a795a2005-09-16 21:55:43 +000034
Bram Moolenaardb552d602006-03-23 22:59:57 +000035let s:zipfile_escape = ' ?&;\'
Bram Moolenaar9964e462007-05-05 17:54:07 +000036let s:ERROR = 2
37let s:WARNING = 1
38let s:NOTE = 0
39
40" ---------------------------------------------------------------------
41" Global Values: {{{1
42if !exists("g:zip_shq")
Bram Moolenaar446cb832008-06-24 21:56:24 +000043 if &shq != ""
44 let g:zip_shq= &shq
45 elseif has("unix")
Bram Moolenaar9964e462007-05-05 17:54:07 +000046 let g:zip_shq= "'"
47 else
48 let g:zip_shq= '"'
49 endif
50endif
Bram Moolenaarccc18222007-05-10 18:25:20 +000051if !exists("g:zip_zipcmd")
52 let g:zip_zipcmd= "zip"
53endif
54if !exists("g:zip_unzipcmd")
55 let g:zip_unzipcmd= "unzip"
56endif
Bram Moolenaard0796902016-09-16 20:02:31 +020057if !exists("g:zip_extractcmd")
58 let g:zip_extractcmd= g:zip_unzipcmd
59endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +000060
D. Ben Knoblecd8a3ea2023-11-04 05:11:17 -040061if !dist#vim#IsSafeExecutable('zip', g:zip_unzipcmd)
Christian Brabandt816fbcc2023-08-31 23:52:30 +020062 echoerr "Warning: NOT executing " .. g:zip_unzipcmd .. " from current directory!"
63 finish
64endif
Anton Sharonov67c951d2023-09-05 21:03:27 +020065
Bram Moolenaar60a795a2005-09-16 21:55:43 +000066" ----------------
67" Functions: {{{1
68" ----------------
69
70" ---------------------------------------------------------------------
71" zip#Browse: {{{2
72fun! zip#Browse(zipfile)
73" call Dfunc("zip#Browse(zipfile<".a:zipfile.">)")
Bram Moolenaarcb80aa22020-10-26 21:12:46 +010074 " sanity check: insure that the zipfile has "PK" as its first two letters
Bram Moolenaar94f76b72013-07-04 22:50:40 +020075 " (zipped files have a leading PK as a "magic cookie")
76 if !filereadable(a:zipfile) || readfile(a:zipfile, "", 1)[0] !~ '^PK'
Bram Moolenaar29634562020-01-09 21:46:04 +010077 exe "noswapfile noautocmd noswapfile e ".fnameescape(a:zipfile)
Bram Moolenaar94f76b72013-07-04 22:50:40 +020078" call Dret("zip#Browse : not a zipfile<".a:zipfile.">")
79 return
80" else " Decho
Bram Moolenaar8024f932020-01-14 19:29:13 +010081" call Decho("zip#Browse: a:zipfile<".a:zipfile."> passed PK test - it's a zip file")
Bram Moolenaar94f76b72013-07-04 22:50:40 +020082 endif
83
Bram Moolenaar36c31f72005-11-28 23:01:53 +000084 let repkeep= &report
85 set report=10
Bram Moolenaar60a795a2005-09-16 21:55:43 +000086
87 " sanity checks
Bram Moolenaare37d50a2008-08-06 17:06:04 +000088 if !exists("*fnameescape")
89 if &verbose > 1
Bram Moolenaar6c391a72021-09-09 21:55:11 +020090 echoerr "the zip plugin is not available (your vim doesn't support fnameescape())"
Bram Moolenaare37d50a2008-08-06 17:06:04 +000091 endif
92 return
93 endif
Bram Moolenaarccc18222007-05-10 18:25:20 +000094 if !executable(g:zip_unzipcmd)
Bram Moolenaar9964e462007-05-05 17:54:07 +000095 redraw!
Bram Moolenaar60a795a2005-09-16 21:55:43 +000096 echohl Error | echo "***error*** (zip#Browse) unzip not available on your system"
Bram Moolenaar9964e462007-05-05 17:54:07 +000097" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar36c31f72005-11-28 23:01:53 +000098 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +000099" call Dret("zip#Browse")
100 return
101 endif
102 if !filereadable(a:zipfile)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000103 if a:zipfile !~# '^\a\+://'
Bram Moolenaar8024f932020-01-14 19:29:13 +0100104 " if it's an url, don't complain, let url-handlers such as vim do its thing
Bram Moolenaar9964e462007-05-05 17:54:07 +0000105 redraw!
Bram Moolenaara5792f52005-11-23 21:25:05 +0000106 echohl Error | echo "***error*** (zip#Browse) File not readable<".a:zipfile.">" | echohl None
Bram Moolenaar9964e462007-05-05 17:54:07 +0000107" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaara5792f52005-11-23 21:25:05 +0000108 endif
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000109 let &report= repkeep
Bram Moolenaara5792f52005-11-23 21:25:05 +0000110" call Dret("zip#Browse : file<".a:zipfile."> not readable")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000111 return
112 endif
Bram Moolenaardb552d602006-03-23 22:59:57 +0000113" call Decho("passed sanity checks")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000114 if &ma != 1
115 set ma
116 endif
Bram Moolenaarccc18222007-05-10 18:25:20 +0000117 let b:zipfile= a:zipfile
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000118
119 setlocal noswapfile
120 setlocal buftype=nofile
121 setlocal bufhidden=hide
122 setlocal nobuflisted
123 setlocal nowrap
Bram Moolenaar519cc552021-11-16 19:18:26 +0000124
125 " Oct 12, 2021: need to re-use Bram's syntax/tar.vim.
126 " Setting the filetype to zip doesn't do anything (currently),
127 " but it is perhaps less confusing to curious perusers who do
128 " a :echo &ft
129 setf zip
130 run! syntax/tar.vim
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000131
132 " give header
Bram Moolenaar251e1912011-06-19 05:09:16 +0200133 call append(0, ['" zip.vim version '.g:loaded_zip,
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100134 \ '" Browsing zipfile '.a:zipfile,
135 \ '" Select a file with cursor and press ENTER'])
Bram Moolenaar251e1912011-06-19 05:09:16 +0200136 keepj $
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000137
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000138" call Decho("exe silent r! ".g:zip_unzipcmd." -l -- ".s:Escape(a:zipfile,1))
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100139 exe "keepj sil! r! ".g:zip_unzipcmd." -Z -1 -- ".s:Escape(a:zipfile,1)
Bram Moolenaard68071d2006-05-02 22:08:30 +0000140 if v:shell_error != 0
Bram Moolenaar9964e462007-05-05 17:54:07 +0000141 redraw!
Bram Moolenaarc236c162008-07-13 17:41:49 +0000142 echohl WarningMsg | echo "***warning*** (zip#Browse) ".fnameescape(a:zipfile)." is not a zip file" | echohl None
Bram Moolenaar9964e462007-05-05 17:54:07 +0000143" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar251e1912011-06-19 05:09:16 +0200144 keepj sil! %d
Bram Moolenaard68071d2006-05-02 22:08:30 +0000145 let eikeep= &ei
146 set ei=BufReadCmd,FileReadCmd
Bram Moolenaar251e1912011-06-19 05:09:16 +0200147 exe "keepj r ".fnameescape(a:zipfile)
Bram Moolenaard68071d2006-05-02 22:08:30 +0000148 let &ei= eikeep
Bram Moolenaar251e1912011-06-19 05:09:16 +0200149 keepj 1d
Bram Moolenaard68071d2006-05-02 22:08:30 +0000150" call Dret("zip#Browse")
151 return
152 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000153
Bram Moolenaard0796902016-09-16 20:02:31 +0200154 " Maps associated with zip plugin
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000155 setlocal noma nomod ro
Bram Moolenaar29634562020-01-09 21:46:04 +0100156 noremap <silent> <buffer> <cr> :call <SID>ZipBrowseSelect()<cr>
157 noremap <silent> <buffer> x :call zip#Extract()<cr>
158 if &mouse != ""
159 noremap <silent> <buffer> <leftmouse> <leftmouse>:call <SID>ZipBrowseSelect()<cr>
160 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000161
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000162 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000163" call Dret("zip#Browse")
164endfun
165
166" ---------------------------------------------------------------------
167" ZipBrowseSelect: {{{2
168fun! s:ZipBrowseSelect()
Bram Moolenaar71badf92023-04-22 22:40:14 +0100169 " call Dfunc("ZipBrowseSelect() zipfile<".((exists("b:zipfile"))? b:zipfile : "n/a")."> curfile<".expand("%").">")
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000170 let repkeep= &report
171 set report=10
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000172 let fname= getline(".")
Bram Moolenaar71badf92023-04-22 22:40:14 +0100173 if !exists("b:zipfile")
174" call Dret("ZipBrowseSelect : b:zipfile doesn't exist!")
175 return
176 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000177
178 " sanity check
179 if fname =~ '^"'
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000180 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000181" call Dret("ZipBrowseSelect")
182 return
183 endif
184 if fname =~ '/$'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000185 redraw!
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000186 echohl Error | echo "***error*** (zip#Browse) Please specify a file, not a directory" | echohl None
Bram Moolenaar9964e462007-05-05 17:54:07 +0000187" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000188 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000189" call Dret("ZipBrowseSelect")
190 return
191 endif
192
193" call Decho("fname<".fname.">")
194
195 " get zipfile to the new-window
Bram Moolenaarccc18222007-05-10 18:25:20 +0000196 let zipfile = b:zipfile
Bram Moolenaar29634562020-01-09 21:46:04 +0100197 let curfile = expand("%")
Bram Moolenaardb552d602006-03-23 22:59:57 +0000198" call Decho("zipfile<".zipfile.">")
199" call Decho("curfile<".curfile.">")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000200
Bram Moolenaar29634562020-01-09 21:46:04 +0100201 noswapfile new
Bram Moolenaar446cb832008-06-24 21:56:24 +0000202 if !exists("g:zip_nomax") || g:zip_nomax == 0
203 wincmd _
204 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000205 let s:zipfile_{winnr()}= curfile
Bram Moolenaar519cc552021-11-16 19:18:26 +0000206" call Decho("exe e ".fnameescape("zipfile://".zipfile.'::'.fname))
207 exe "noswapfile e ".fnameescape("zipfile://".zipfile.'::'.fname)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000208 filetype detect
209
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000210 let &report= repkeep
Bram Moolenaara5792f52005-11-23 21:25:05 +0000211" call Dret("ZipBrowseSelect : s:zipfile_".winnr()."<".s:zipfile_{winnr()}.">")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000212endfun
213
214" ---------------------------------------------------------------------
215" zip#Read: {{{2
216fun! zip#Read(fname,mode)
217" call Dfunc("zip#Read(fname<".a:fname.">,mode=".a:mode.")")
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000218 let repkeep= &report
219 set report=10
220
Bram Moolenaard68071d2006-05-02 22:08:30 +0000221 if has("unix")
Bram Moolenaar519cc552021-11-16 19:18:26 +0000222 let zipfile = substitute(a:fname,'zipfile://\(.\{-}\)::[^\\].*$','\1','')
223 let fname = substitute(a:fname,'zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000224 else
Bram Moolenaar519cc552021-11-16 19:18:26 +0000225 let zipfile = substitute(a:fname,'^.\{-}zipfile://\(.\{-}\)::[^\\].*$','\1','')
226 let fname = substitute(a:fname,'^.\{-}zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaarff034192013-04-24 18:51:19 +0200227 let fname = substitute(fname, '[', '[[]', 'g')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000228 endif
229" call Decho("zipfile<".zipfile.">")
230" call Decho("fname <".fname.">")
Bram Moolenaard0796902016-09-16 20:02:31 +0200231 " sanity check
232 if !executable(substitute(g:zip_unzipcmd,'\s\+.*$','',''))
233 redraw!
234 echohl Error | echo "***error*** (zip#Read) sorry, your system doesn't appear to have the ".g:zip_unzipcmd." program" | echohl None
235" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
236 let &report= repkeep
237" call Dret("zip#Write")
238 return
239 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000240
Bram Moolenaarff034192013-04-24 18:51:19 +0200241 " the following code does much the same thing as
242 " exe "keepj sil! r! ".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1)
Bram Moolenaar519cc552021-11-16 19:18:26 +0000243 " but allows zipfile://... entries in quickfix lists
Bram Moolenaarff034192013-04-24 18:51:19 +0200244 let temp = tempname()
Bram Moolenaar94f76b72013-07-04 22:50:40 +0200245" call Decho("using temp file<".temp.">")
Bram Moolenaarff034192013-04-24 18:51:19 +0200246 let fn = expand('%:p')
247 exe "sil! !".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1).' > '.temp
248" call Decho("exe sil! !".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1).' > '.temp)
249 sil exe 'keepalt file '.temp
250 sil keepj e!
251 sil exe 'keepalt file '.fnameescape(fn)
252 call delete(temp)
253
Bram Moolenaar251e1912011-06-19 05:09:16 +0200254 filetype detect
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000255
256 " cleanup
Bram Moolenaar94f76b72013-07-04 22:50:40 +0200257 " keepj 0d " used to be needed for the ...r! ... method
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000258 set nomod
259
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000260 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000261" call Dret("zip#Read")
262endfun
263
264" ---------------------------------------------------------------------
265" zip#Write: {{{2
266fun! zip#Write(fname)
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000267" call Dfunc("zip#Write(fname<".a:fname.">) zipfile_".winnr()."<".s:zipfile_{winnr()}.">")
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000268 let repkeep= &report
269 set report=10
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000270
271 " sanity checks
Bram Moolenaard0796902016-09-16 20:02:31 +0200272 if !executable(substitute(g:zip_zipcmd,'\s\+.*$','',''))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000273 redraw!
Bram Moolenaard0796902016-09-16 20:02:31 +0200274 echohl Error | echo "***error*** (zip#Write) sorry, your system doesn't appear to have the ".g:zip_zipcmd." program" | echohl None
Bram Moolenaar9964e462007-05-05 17:54:07 +0000275" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000276 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000277" call Dret("zip#Write")
278 return
279 endif
280 if !exists("*mkdir")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000281 redraw!
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000282 echohl Error | echo "***error*** (zip#Write) sorry, mkdir() doesn't work on your system" | echohl None
Bram Moolenaar9964e462007-05-05 17:54:07 +0000283" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000284 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000285" call Dret("zip#Write")
286 return
287 endif
288
289 let curdir= getcwd()
290 let tmpdir= tempname()
291" call Decho("orig tempname<".tmpdir.">")
292 if tmpdir =~ '\.'
293 let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
294 endif
295" call Decho("tmpdir<".tmpdir.">")
296 call mkdir(tmpdir,"p")
297
298 " attempt to change to the indicated directory
Bram Moolenaar9964e462007-05-05 17:54:07 +0000299 if s:ChgDir(tmpdir,s:ERROR,"(zip#Write) cannot cd to temporary directory")
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000300 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000301" call Dret("zip#Write")
302 return
Bram Moolenaar9964e462007-05-05 17:54:07 +0000303 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000304" call Decho("current directory now: ".getcwd())
305
306 " place temporary files under .../_ZIPVIM_/
307 if isdirectory("_ZIPVIM_")
308 call s:Rmdir("_ZIPVIM_")
309 endif
310 call mkdir("_ZIPVIM_")
311 cd _ZIPVIM_
312" call Decho("current directory now: ".getcwd())
313
Bram Moolenaard68071d2006-05-02 22:08:30 +0000314 if has("unix")
Bram Moolenaar519cc552021-11-16 19:18:26 +0000315 let zipfile = substitute(a:fname,'zipfile://\(.\{-}\)::[^\\].*$','\1','')
316 let fname = substitute(a:fname,'zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000317 else
Bram Moolenaar519cc552021-11-16 19:18:26 +0000318 let zipfile = substitute(a:fname,'^.\{-}zipfile://\(.\{-}\)::[^\\].*$','\1','')
319 let fname = substitute(a:fname,'^.\{-}zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000320 endif
321" call Decho("zipfile<".zipfile.">")
322" call Decho("fname <".fname.">")
Bram Moolenaarc7486e02005-12-29 22:48:26 +0000323
324 if fname =~ '/'
325 let dirpath = substitute(fname,'/[^/]\+$','','e')
Bram Moolenaarff034192013-04-24 18:51:19 +0200326 if has("win32unix") && executable("cygpath")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000327 let dirpath = substitute(system("cygpath ".s:Escape(dirpath,0)),'\n','','e')
Bram Moolenaarc7486e02005-12-29 22:48:26 +0000328 endif
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000329" call Decho("mkdir(dirpath<".dirpath.">,p)")
Bram Moolenaarc7486e02005-12-29 22:48:26 +0000330 call mkdir(dirpath,"p")
331 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000332 if zipfile !~ '/'
333 let zipfile= curdir.'/'.zipfile
334 endif
335" call Decho("zipfile<".zipfile."> fname<".fname.">")
336
Bram Moolenaarc236c162008-07-13 17:41:49 +0000337 exe "w! ".fnameescape(fname)
Bram Moolenaarff034192013-04-24 18:51:19 +0200338 if has("win32unix") && executable("cygpath")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000339 let zipfile = substitute(system("cygpath ".s:Escape(zipfile,0)),'\n','','e')
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000340 endif
341
Bram Moolenaar9964e462007-05-05 17:54:07 +0000342 if (has("win32") || has("win95") || has("win64") || has("win16")) && &shell !~? 'sh$'
343 let fname = substitute(fname, '[', '[[]', 'g')
344 endif
345
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000346" call Decho(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0))
347 call system(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0))
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000348 if v:shell_error != 0
Bram Moolenaar9964e462007-05-05 17:54:07 +0000349 redraw!
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000350 echohl Error | echo "***error*** (zip#Write) sorry, unable to update ".zipfile." with ".fname | echohl None
Bram Moolenaar9964e462007-05-05 17:54:07 +0000351" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaara5792f52005-11-23 21:25:05 +0000352
353 elseif s:zipfile_{winnr()} =~ '^\a\+://'
354 " support writing zipfiles across a network
355 let netzipfile= s:zipfile_{winnr()}
Bram Moolenaar9964e462007-05-05 17:54:07 +0000356" call Decho("handle writing <".zipfile."> across network as <".netzipfile.">")
Bram Moolenaara5792f52005-11-23 21:25:05 +0000357 1split|enew
358 let binkeep= &binary
359 let eikeep = &ei
360 set binary ei=all
Bram Moolenaar29634562020-01-09 21:46:04 +0100361 exe "noswapfile e! ".fnameescape(zipfile)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000362 call netrw#NetWrite(netzipfile)
363 let &ei = eikeep
364 let &binary = binkeep
365 q!
366 unlet s:zipfile_{winnr()}
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000367 endif
368
369 " cleanup and restore current directory
370 cd ..
371 call s:Rmdir("_ZIPVIM_")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000372 call s:ChgDir(curdir,s:WARNING,"(zip#Write) unable to return to ".curdir."!")
373 call s:Rmdir(tmpdir)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000374 setlocal nomod
375
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000376 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000377" call Dret("zip#Write")
378endfun
379
380" ---------------------------------------------------------------------
Bram Moolenaard0796902016-09-16 20:02:31 +0200381" zip#Extract: extract a file from a zip archive {{{2
382fun! zip#Extract()
383" call Dfunc("zip#Extract()")
384
385 let repkeep= &report
386 set report=10
387 let fname= getline(".")
388" call Decho("fname<".fname.">")
389
390 " sanity check
391 if fname =~ '^"'
392 let &report= repkeep
393" call Dret("zip#Extract")
394 return
395 endif
396 if fname =~ '/$'
397 redraw!
398 echohl Error | echo "***error*** (zip#Extract) Please specify a file, not a directory" | echohl None
399 let &report= repkeep
400" call Dret("zip#Extract")
401 return
402 endif
403
404 " extract the file mentioned under the cursor
405" call Decho("system(".g:zip_extractcmd." ".shellescape(b:zipfile)." ".shellescape(shell).")")
406 call system(g:zip_extractcmd." ".shellescape(b:zipfile)." ".shellescape(shell))
407" call Decho("zipfile<".b:zipfile.">")
408 if v:shell_error != 0
409 echohl Error | echo "***error*** ".g:zip_extractcmd." ".b:zipfile." ".fname.": failed!" | echohl NONE
410 elseif !filereadable(fname)
411 echohl Error | echo "***error*** attempted to extract ".fname." but it doesn't appear to be present!"
412 else
413 echo "***note*** successfully extracted ".fname
414 endif
415
416 " restore option
417 let &report= repkeep
418
419" call Dret("zip#Extract")
420endfun
421
422" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +0000423" s:Escape: {{{2
424fun! s:Escape(fname,isfilt)
425" call Dfunc("QuoteFileDir(fname<".a:fname."> isfilt=".a:isfilt.")")
426 if exists("*shellescape")
427 if a:isfilt
428 let qnameq= shellescape(a:fname,1)
429 else
430 let qnameq= shellescape(a:fname)
431 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000432 else
433 let qnameq= g:zip_shq.escape(a:fname,g:zip_shq).g:zip_shq
434 endif
435" call Dret("QuoteFileDir <".qnameq.">")
436 return qnameq
Bram Moolenaar9964e462007-05-05 17:54:07 +0000437endfun
438
439" ---------------------------------------------------------------------
440" ChgDir: {{{2
441fun! s:ChgDir(newdir,errlvl,errmsg)
442" call Dfunc("ChgDir(newdir<".a:newdir."> errlvl=".a:errlvl." errmsg<".a:errmsg.">)")
443
Bram Moolenaar9964e462007-05-05 17:54:07 +0000444 try
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000445 exe "cd ".fnameescape(a:newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000446 catch /^Vim\%((\a\+)\)\=:E344/
447 redraw!
448 if a:errlvl == s:NOTE
449 echo "***note*** ".a:errmsg
450 elseif a:errlvl == s:WARNING
451 echohl WarningMsg | echo "***warning*** ".a:errmsg | echohl NONE
452 elseif a:errlvl == s:ERROR
453 echohl Error | echo "***error*** ".a:errmsg | echohl NONE
454 endif
455" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
456" call Dret("ChgDir 1")
457 return 1
458 endtry
459
460" call Dret("ChgDir 0")
461 return 0
462endfun
463
464" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +0000465" s:Rmdir: {{{2
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000466fun! s:Rmdir(fname)
467" call Dfunc("Rmdir(fname<".a:fname.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000468 if (has("win32") || has("win95") || has("win64") || has("win16")) && &shell !~? 'sh$'
Bram Moolenaarc236c162008-07-13 17:41:49 +0000469 call system("rmdir /S/Q ".s:Escape(a:fname,0))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000470 else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000471 call system("/bin/rm -rf ".s:Escape(a:fname,0))
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000472 endif
473" call Dret("Rmdir")
474endfun
475
476" ------------------------------------------------------------------------
477" Modelines And Restoration: {{{1
478let &cpo= s:keepcpo
479unlet s:keepcpo
Bram Moolenaarccc18222007-05-10 18:25:20 +0000480" vim:ts=8 fdm=marker