blob: 0331a542aca409512b8f9a66688d98a22d761ac1 [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
Bram Moolenaar29634562020-01-09 21:46:04 +01005" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
Bram Moolenaar9964e462007-05-05 17:54:07 +00006" License: Vim License (see vim's :help license)
Bram Moolenaar29634562020-01-09 21:46:04 +01007" Copyright: Copyright (C) 2005-2019 Charles E. Campbell {{{1
Bram Moolenaar60a795a2005-09-16 21:55:43 +00008" Permission is hereby granted to use and distribute this code,
9" with or without modifications, provided that this copyright
10" notice is copied with it. Like anything else that's free,
Bram Moolenaar446cb832008-06-24 21:56:24 +000011" zip.vim and zipPlugin.vim are provided *as is* and comes with
12" no warranty of any kind, either expressed or implied. By using
13" this plugin, you agree that in no event will the copyright
Bram Moolenaar60a795a2005-09-16 21:55:43 +000014" holder be liable for any damages resulting from the use
15" of this software.
Bram Moolenaar94f76b72013-07-04 22:50:40 +020016"redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar60a795a2005-09-16 21:55:43 +000017
18" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +000019" Load Once: {{{1
Bram Moolenaar00a927d2010-05-14 23:24:24 +020020if &cp || exists("g:loaded_zip")
Bram Moolenaar60a795a2005-09-16 21:55:43 +000021 finish
22endif
Bram Moolenaar71badf92023-04-22 22:40:14 +010023let g:loaded_zip= "v33"
Bram Moolenaar00a927d2010-05-14 23:24:24 +020024if v:version < 702
25 echohl WarningMsg
Bram Moolenaard0796902016-09-16 20:02:31 +020026 echo "***warning*** this version of zip needs vim 7.2 or later"
Bram Moolenaar00a927d2010-05-14 23:24:24 +020027 echohl Normal
28 finish
29endif
30let s:keepcpo= &cpo
31set cpo&vim
Bram Moolenaar94f76b72013-07-04 22:50:40 +020032"DechoTabOn
Bram Moolenaar60a795a2005-09-16 21:55:43 +000033
Bram Moolenaardb552d602006-03-23 22:59:57 +000034let s:zipfile_escape = ' ?&;\'
Bram Moolenaar9964e462007-05-05 17:54:07 +000035let s:ERROR = 2
36let s:WARNING = 1
37let s:NOTE = 0
38
39" ---------------------------------------------------------------------
40" Global Values: {{{1
41if !exists("g:zip_shq")
Bram Moolenaar446cb832008-06-24 21:56:24 +000042 if &shq != ""
43 let g:zip_shq= &shq
44 elseif has("unix")
Bram Moolenaar9964e462007-05-05 17:54:07 +000045 let g:zip_shq= "'"
46 else
47 let g:zip_shq= '"'
48 endif
49endif
Bram Moolenaarccc18222007-05-10 18:25:20 +000050if !exists("g:zip_zipcmd")
51 let g:zip_zipcmd= "zip"
52endif
53if !exists("g:zip_unzipcmd")
54 let g:zip_unzipcmd= "unzip"
55endif
Bram Moolenaard0796902016-09-16 20:02:31 +020056if !exists("g:zip_extractcmd")
57 let g:zip_extractcmd= g:zip_unzipcmd
58endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +000059
Christian Brabandt816fbcc2023-08-31 23:52:30 +020060if fnamemodify(exepath(g:zip_unzipcmd), ":p:h") ==# getcwd()
61 echoerr "Warning: NOT executing " .. g:zip_unzipcmd .. " from current directory!"
62 finish
63endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +000064" ----------------
65" Functions: {{{1
66" ----------------
67
68" ---------------------------------------------------------------------
69" zip#Browse: {{{2
70fun! zip#Browse(zipfile)
71" call Dfunc("zip#Browse(zipfile<".a:zipfile.">)")
Bram Moolenaarcb80aa22020-10-26 21:12:46 +010072 " sanity check: insure that the zipfile has "PK" as its first two letters
Bram Moolenaar94f76b72013-07-04 22:50:40 +020073 " (zipped files have a leading PK as a "magic cookie")
74 if !filereadable(a:zipfile) || readfile(a:zipfile, "", 1)[0] !~ '^PK'
Bram Moolenaar29634562020-01-09 21:46:04 +010075 exe "noswapfile noautocmd noswapfile e ".fnameescape(a:zipfile)
Bram Moolenaar94f76b72013-07-04 22:50:40 +020076" call Dret("zip#Browse : not a zipfile<".a:zipfile.">")
77 return
78" else " Decho
Bram Moolenaar8024f932020-01-14 19:29:13 +010079" call Decho("zip#Browse: a:zipfile<".a:zipfile."> passed PK test - it's a zip file")
Bram Moolenaar94f76b72013-07-04 22:50:40 +020080 endif
81
Bram Moolenaar36c31f72005-11-28 23:01:53 +000082 let repkeep= &report
83 set report=10
Bram Moolenaar60a795a2005-09-16 21:55:43 +000084
85 " sanity checks
Bram Moolenaare37d50a2008-08-06 17:06:04 +000086 if !exists("*fnameescape")
87 if &verbose > 1
Bram Moolenaar6c391a72021-09-09 21:55:11 +020088 echoerr "the zip plugin is not available (your vim doesn't support fnameescape())"
Bram Moolenaare37d50a2008-08-06 17:06:04 +000089 endif
90 return
91 endif
Bram Moolenaarccc18222007-05-10 18:25:20 +000092 if !executable(g:zip_unzipcmd)
Bram Moolenaar9964e462007-05-05 17:54:07 +000093 redraw!
Bram Moolenaar60a795a2005-09-16 21:55:43 +000094 echohl Error | echo "***error*** (zip#Browse) unzip not available on your system"
Bram Moolenaar9964e462007-05-05 17:54:07 +000095" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar36c31f72005-11-28 23:01:53 +000096 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +000097" call Dret("zip#Browse")
98 return
99 endif
100 if !filereadable(a:zipfile)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000101 if a:zipfile !~# '^\a\+://'
Bram Moolenaar8024f932020-01-14 19:29:13 +0100102 " if it's an url, don't complain, let url-handlers such as vim do its thing
Bram Moolenaar9964e462007-05-05 17:54:07 +0000103 redraw!
Bram Moolenaara5792f52005-11-23 21:25:05 +0000104 echohl Error | echo "***error*** (zip#Browse) File not readable<".a:zipfile.">" | echohl None
Bram Moolenaar9964e462007-05-05 17:54:07 +0000105" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaara5792f52005-11-23 21:25:05 +0000106 endif
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000107 let &report= repkeep
Bram Moolenaara5792f52005-11-23 21:25:05 +0000108" call Dret("zip#Browse : file<".a:zipfile."> not readable")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000109 return
110 endif
Bram Moolenaardb552d602006-03-23 22:59:57 +0000111" call Decho("passed sanity checks")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000112 if &ma != 1
113 set ma
114 endif
Bram Moolenaarccc18222007-05-10 18:25:20 +0000115 let b:zipfile= a:zipfile
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000116
117 setlocal noswapfile
118 setlocal buftype=nofile
119 setlocal bufhidden=hide
120 setlocal nobuflisted
121 setlocal nowrap
Bram Moolenaar519cc552021-11-16 19:18:26 +0000122
123 " Oct 12, 2021: need to re-use Bram's syntax/tar.vim.
124 " Setting the filetype to zip doesn't do anything (currently),
125 " but it is perhaps less confusing to curious perusers who do
126 " a :echo &ft
127 setf zip
128 run! syntax/tar.vim
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000129
130 " give header
Bram Moolenaar251e1912011-06-19 05:09:16 +0200131 call append(0, ['" zip.vim version '.g:loaded_zip,
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100132 \ '" Browsing zipfile '.a:zipfile,
133 \ '" Select a file with cursor and press ENTER'])
Bram Moolenaar251e1912011-06-19 05:09:16 +0200134 keepj $
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000135
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000136" call Decho("exe silent r! ".g:zip_unzipcmd." -l -- ".s:Escape(a:zipfile,1))
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100137 exe "keepj sil! r! ".g:zip_unzipcmd." -Z -1 -- ".s:Escape(a:zipfile,1)
Bram Moolenaard68071d2006-05-02 22:08:30 +0000138 if v:shell_error != 0
Bram Moolenaar9964e462007-05-05 17:54:07 +0000139 redraw!
Bram Moolenaarc236c162008-07-13 17:41:49 +0000140 echohl WarningMsg | echo "***warning*** (zip#Browse) ".fnameescape(a:zipfile)." is not a zip file" | echohl None
Bram Moolenaar9964e462007-05-05 17:54:07 +0000141" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar251e1912011-06-19 05:09:16 +0200142 keepj sil! %d
Bram Moolenaard68071d2006-05-02 22:08:30 +0000143 let eikeep= &ei
144 set ei=BufReadCmd,FileReadCmd
Bram Moolenaar251e1912011-06-19 05:09:16 +0200145 exe "keepj r ".fnameescape(a:zipfile)
Bram Moolenaard68071d2006-05-02 22:08:30 +0000146 let &ei= eikeep
Bram Moolenaar251e1912011-06-19 05:09:16 +0200147 keepj 1d
Bram Moolenaard68071d2006-05-02 22:08:30 +0000148" call Dret("zip#Browse")
149 return
150 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000151
Bram Moolenaard0796902016-09-16 20:02:31 +0200152 " Maps associated with zip plugin
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000153 setlocal noma nomod ro
Bram Moolenaar29634562020-01-09 21:46:04 +0100154 noremap <silent> <buffer> <cr> :call <SID>ZipBrowseSelect()<cr>
155 noremap <silent> <buffer> x :call zip#Extract()<cr>
156 if &mouse != ""
157 noremap <silent> <buffer> <leftmouse> <leftmouse>:call <SID>ZipBrowseSelect()<cr>
158 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000159
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000160 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000161" call Dret("zip#Browse")
162endfun
163
164" ---------------------------------------------------------------------
165" ZipBrowseSelect: {{{2
166fun! s:ZipBrowseSelect()
Bram Moolenaar71badf92023-04-22 22:40:14 +0100167 " call Dfunc("ZipBrowseSelect() zipfile<".((exists("b:zipfile"))? b:zipfile : "n/a")."> curfile<".expand("%").">")
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000168 let repkeep= &report
169 set report=10
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000170 let fname= getline(".")
Bram Moolenaar71badf92023-04-22 22:40:14 +0100171 if !exists("b:zipfile")
172" call Dret("ZipBrowseSelect : b:zipfile doesn't exist!")
173 return
174 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000175
176 " sanity check
177 if fname =~ '^"'
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000178 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000179" call Dret("ZipBrowseSelect")
180 return
181 endif
182 if fname =~ '/$'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000183 redraw!
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000184 echohl Error | echo "***error*** (zip#Browse) Please specify a file, not a directory" | echohl None
Bram Moolenaar9964e462007-05-05 17:54:07 +0000185" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000186 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000187" call Dret("ZipBrowseSelect")
188 return
189 endif
190
191" call Decho("fname<".fname.">")
192
193 " get zipfile to the new-window
Bram Moolenaarccc18222007-05-10 18:25:20 +0000194 let zipfile = b:zipfile
Bram Moolenaar29634562020-01-09 21:46:04 +0100195 let curfile = expand("%")
Bram Moolenaardb552d602006-03-23 22:59:57 +0000196" call Decho("zipfile<".zipfile.">")
197" call Decho("curfile<".curfile.">")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000198
Bram Moolenaar29634562020-01-09 21:46:04 +0100199 noswapfile new
Bram Moolenaar446cb832008-06-24 21:56:24 +0000200 if !exists("g:zip_nomax") || g:zip_nomax == 0
201 wincmd _
202 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000203 let s:zipfile_{winnr()}= curfile
Bram Moolenaar519cc552021-11-16 19:18:26 +0000204" call Decho("exe e ".fnameescape("zipfile://".zipfile.'::'.fname))
205 exe "noswapfile e ".fnameescape("zipfile://".zipfile.'::'.fname)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000206 filetype detect
207
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000208 let &report= repkeep
Bram Moolenaara5792f52005-11-23 21:25:05 +0000209" call Dret("ZipBrowseSelect : s:zipfile_".winnr()."<".s:zipfile_{winnr()}.">")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000210endfun
211
212" ---------------------------------------------------------------------
213" zip#Read: {{{2
214fun! zip#Read(fname,mode)
215" call Dfunc("zip#Read(fname<".a:fname.">,mode=".a:mode.")")
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000216 let repkeep= &report
217 set report=10
218
Bram Moolenaard68071d2006-05-02 22:08:30 +0000219 if has("unix")
Bram Moolenaar519cc552021-11-16 19:18:26 +0000220 let zipfile = substitute(a:fname,'zipfile://\(.\{-}\)::[^\\].*$','\1','')
221 let fname = substitute(a:fname,'zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000222 else
Bram Moolenaar519cc552021-11-16 19:18:26 +0000223 let zipfile = substitute(a:fname,'^.\{-}zipfile://\(.\{-}\)::[^\\].*$','\1','')
224 let fname = substitute(a:fname,'^.\{-}zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaarff034192013-04-24 18:51:19 +0200225 let fname = substitute(fname, '[', '[[]', 'g')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000226 endif
227" call Decho("zipfile<".zipfile.">")
228" call Decho("fname <".fname.">")
Bram Moolenaard0796902016-09-16 20:02:31 +0200229 " sanity check
230 if !executable(substitute(g:zip_unzipcmd,'\s\+.*$','',''))
231 redraw!
232 echohl Error | echo "***error*** (zip#Read) sorry, your system doesn't appear to have the ".g:zip_unzipcmd." program" | echohl None
233" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
234 let &report= repkeep
235" call Dret("zip#Write")
236 return
237 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000238
Bram Moolenaarff034192013-04-24 18:51:19 +0200239 " the following code does much the same thing as
240 " exe "keepj sil! r! ".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1)
Bram Moolenaar519cc552021-11-16 19:18:26 +0000241 " but allows zipfile://... entries in quickfix lists
Bram Moolenaarff034192013-04-24 18:51:19 +0200242 let temp = tempname()
Bram Moolenaar94f76b72013-07-04 22:50:40 +0200243" call Decho("using temp file<".temp.">")
Bram Moolenaarff034192013-04-24 18:51:19 +0200244 let fn = expand('%:p')
245 exe "sil! !".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1).' > '.temp
246" call Decho("exe sil! !".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1).' > '.temp)
247 sil exe 'keepalt file '.temp
248 sil keepj e!
249 sil exe 'keepalt file '.fnameescape(fn)
250 call delete(temp)
251
Bram Moolenaar251e1912011-06-19 05:09:16 +0200252 filetype detect
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000253
254 " cleanup
Bram Moolenaar94f76b72013-07-04 22:50:40 +0200255 " keepj 0d " used to be needed for the ...r! ... method
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000256 set nomod
257
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000258 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000259" call Dret("zip#Read")
260endfun
261
262" ---------------------------------------------------------------------
263" zip#Write: {{{2
264fun! zip#Write(fname)
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000265" call Dfunc("zip#Write(fname<".a:fname.">) zipfile_".winnr()."<".s:zipfile_{winnr()}.">")
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000266 let repkeep= &report
267 set report=10
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000268
269 " sanity checks
Bram Moolenaard0796902016-09-16 20:02:31 +0200270 if !executable(substitute(g:zip_zipcmd,'\s\+.*$','',''))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000271 redraw!
Bram Moolenaard0796902016-09-16 20:02:31 +0200272 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 +0000273" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000274 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000275" call Dret("zip#Write")
276 return
277 endif
278 if !exists("*mkdir")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000279 redraw!
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000280 echohl Error | echo "***error*** (zip#Write) sorry, mkdir() doesn't work on your system" | echohl None
Bram Moolenaar9964e462007-05-05 17:54:07 +0000281" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000282 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000283" call Dret("zip#Write")
284 return
285 endif
286
287 let curdir= getcwd()
288 let tmpdir= tempname()
289" call Decho("orig tempname<".tmpdir.">")
290 if tmpdir =~ '\.'
291 let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
292 endif
293" call Decho("tmpdir<".tmpdir.">")
294 call mkdir(tmpdir,"p")
295
296 " attempt to change to the indicated directory
Bram Moolenaar9964e462007-05-05 17:54:07 +0000297 if s:ChgDir(tmpdir,s:ERROR,"(zip#Write) cannot cd to temporary directory")
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000298 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000299" call Dret("zip#Write")
300 return
Bram Moolenaar9964e462007-05-05 17:54:07 +0000301 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000302" call Decho("current directory now: ".getcwd())
303
304 " place temporary files under .../_ZIPVIM_/
305 if isdirectory("_ZIPVIM_")
306 call s:Rmdir("_ZIPVIM_")
307 endif
308 call mkdir("_ZIPVIM_")
309 cd _ZIPVIM_
310" call Decho("current directory now: ".getcwd())
311
Bram Moolenaard68071d2006-05-02 22:08:30 +0000312 if has("unix")
Bram Moolenaar519cc552021-11-16 19:18:26 +0000313 let zipfile = substitute(a:fname,'zipfile://\(.\{-}\)::[^\\].*$','\1','')
314 let fname = substitute(a:fname,'zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000315 else
Bram Moolenaar519cc552021-11-16 19:18:26 +0000316 let zipfile = substitute(a:fname,'^.\{-}zipfile://\(.\{-}\)::[^\\].*$','\1','')
317 let fname = substitute(a:fname,'^.\{-}zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000318 endif
319" call Decho("zipfile<".zipfile.">")
320" call Decho("fname <".fname.">")
Bram Moolenaarc7486e02005-12-29 22:48:26 +0000321
322 if fname =~ '/'
323 let dirpath = substitute(fname,'/[^/]\+$','','e')
Bram Moolenaarff034192013-04-24 18:51:19 +0200324 if has("win32unix") && executable("cygpath")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000325 let dirpath = substitute(system("cygpath ".s:Escape(dirpath,0)),'\n','','e')
Bram Moolenaarc7486e02005-12-29 22:48:26 +0000326 endif
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000327" call Decho("mkdir(dirpath<".dirpath.">,p)")
Bram Moolenaarc7486e02005-12-29 22:48:26 +0000328 call mkdir(dirpath,"p")
329 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000330 if zipfile !~ '/'
331 let zipfile= curdir.'/'.zipfile
332 endif
333" call Decho("zipfile<".zipfile."> fname<".fname.">")
334
Bram Moolenaarc236c162008-07-13 17:41:49 +0000335 exe "w! ".fnameescape(fname)
Bram Moolenaarff034192013-04-24 18:51:19 +0200336 if has("win32unix") && executable("cygpath")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000337 let zipfile = substitute(system("cygpath ".s:Escape(zipfile,0)),'\n','','e')
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000338 endif
339
Bram Moolenaar9964e462007-05-05 17:54:07 +0000340 if (has("win32") || has("win95") || has("win64") || has("win16")) && &shell !~? 'sh$'
341 let fname = substitute(fname, '[', '[[]', 'g')
342 endif
343
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000344" call Decho(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0))
345 call system(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0))
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000346 if v:shell_error != 0
Bram Moolenaar9964e462007-05-05 17:54:07 +0000347 redraw!
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000348 echohl Error | echo "***error*** (zip#Write) sorry, unable to update ".zipfile." with ".fname | echohl None
Bram Moolenaar9964e462007-05-05 17:54:07 +0000349" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
Bram Moolenaara5792f52005-11-23 21:25:05 +0000350
351 elseif s:zipfile_{winnr()} =~ '^\a\+://'
352 " support writing zipfiles across a network
353 let netzipfile= s:zipfile_{winnr()}
Bram Moolenaar9964e462007-05-05 17:54:07 +0000354" call Decho("handle writing <".zipfile."> across network as <".netzipfile.">")
Bram Moolenaara5792f52005-11-23 21:25:05 +0000355 1split|enew
356 let binkeep= &binary
357 let eikeep = &ei
358 set binary ei=all
Bram Moolenaar29634562020-01-09 21:46:04 +0100359 exe "noswapfile e! ".fnameescape(zipfile)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000360 call netrw#NetWrite(netzipfile)
361 let &ei = eikeep
362 let &binary = binkeep
363 q!
364 unlet s:zipfile_{winnr()}
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000365 endif
366
367 " cleanup and restore current directory
368 cd ..
369 call s:Rmdir("_ZIPVIM_")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000370 call s:ChgDir(curdir,s:WARNING,"(zip#Write) unable to return to ".curdir."!")
371 call s:Rmdir(tmpdir)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000372 setlocal nomod
373
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000374 let &report= repkeep
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000375" call Dret("zip#Write")
376endfun
377
378" ---------------------------------------------------------------------
Bram Moolenaard0796902016-09-16 20:02:31 +0200379" zip#Extract: extract a file from a zip archive {{{2
380fun! zip#Extract()
381" call Dfunc("zip#Extract()")
382
383 let repkeep= &report
384 set report=10
385 let fname= getline(".")
386" call Decho("fname<".fname.">")
387
388 " sanity check
389 if fname =~ '^"'
390 let &report= repkeep
391" call Dret("zip#Extract")
392 return
393 endif
394 if fname =~ '/$'
395 redraw!
396 echohl Error | echo "***error*** (zip#Extract) Please specify a file, not a directory" | echohl None
397 let &report= repkeep
398" call Dret("zip#Extract")
399 return
400 endif
401
402 " extract the file mentioned under the cursor
403" call Decho("system(".g:zip_extractcmd." ".shellescape(b:zipfile)." ".shellescape(shell).")")
404 call system(g:zip_extractcmd." ".shellescape(b:zipfile)." ".shellescape(shell))
405" call Decho("zipfile<".b:zipfile.">")
406 if v:shell_error != 0
407 echohl Error | echo "***error*** ".g:zip_extractcmd." ".b:zipfile." ".fname.": failed!" | echohl NONE
408 elseif !filereadable(fname)
409 echohl Error | echo "***error*** attempted to extract ".fname." but it doesn't appear to be present!"
410 else
411 echo "***note*** successfully extracted ".fname
412 endif
413
414 " restore option
415 let &report= repkeep
416
417" call Dret("zip#Extract")
418endfun
419
420" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +0000421" s:Escape: {{{2
422fun! s:Escape(fname,isfilt)
423" call Dfunc("QuoteFileDir(fname<".a:fname."> isfilt=".a:isfilt.")")
424 if exists("*shellescape")
425 if a:isfilt
426 let qnameq= shellescape(a:fname,1)
427 else
428 let qnameq= shellescape(a:fname)
429 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000430 else
431 let qnameq= g:zip_shq.escape(a:fname,g:zip_shq).g:zip_shq
432 endif
433" call Dret("QuoteFileDir <".qnameq.">")
434 return qnameq
Bram Moolenaar9964e462007-05-05 17:54:07 +0000435endfun
436
437" ---------------------------------------------------------------------
438" ChgDir: {{{2
439fun! s:ChgDir(newdir,errlvl,errmsg)
440" call Dfunc("ChgDir(newdir<".a:newdir."> errlvl=".a:errlvl." errmsg<".a:errmsg.">)")
441
Bram Moolenaar9964e462007-05-05 17:54:07 +0000442 try
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000443 exe "cd ".fnameescape(a:newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000444 catch /^Vim\%((\a\+)\)\=:E344/
445 redraw!
446 if a:errlvl == s:NOTE
447 echo "***note*** ".a:errmsg
448 elseif a:errlvl == s:WARNING
449 echohl WarningMsg | echo "***warning*** ".a:errmsg | echohl NONE
450 elseif a:errlvl == s:ERROR
451 echohl Error | echo "***error*** ".a:errmsg | echohl NONE
452 endif
453" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
454" call Dret("ChgDir 1")
455 return 1
456 endtry
457
458" call Dret("ChgDir 0")
459 return 0
460endfun
461
462" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +0000463" s:Rmdir: {{{2
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000464fun! s:Rmdir(fname)
465" call Dfunc("Rmdir(fname<".a:fname.">)")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000466 if (has("win32") || has("win95") || has("win64") || has("win16")) && &shell !~? 'sh$'
Bram Moolenaarc236c162008-07-13 17:41:49 +0000467 call system("rmdir /S/Q ".s:Escape(a:fname,0))
Bram Moolenaar9964e462007-05-05 17:54:07 +0000468 else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000469 call system("/bin/rm -rf ".s:Escape(a:fname,0))
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000470 endif
471" call Dret("Rmdir")
472endfun
473
474" ------------------------------------------------------------------------
475" Modelines And Restoration: {{{1
476let &cpo= s:keepcpo
477unlet s:keepcpo
Bram Moolenaarccc18222007-05-10 18:25:20 +0000478" vim:ts=8 fdm=marker