blob: 55e8760ea9fb5c8943494a6c85ed82997fd150f4 [file] [log] [blame]
Bram Moolenaar60a795a2005-09-16 21:55:43 +00001" zip.vim: Handles browsing zipfiles
Damien2cad9412024-07-24 20:07:00 +02002" AUTOLOAD PORTION
Damienf0e9b722024-08-05 20:21:18 +02003" Date: Aug 05, 2024
Christian Brabandta336d8f2024-08-05 21:26:46 +02004" Version: 34
Christian Brabandtf9ca1392024-02-19 20:37:11 +01005" Maintainer: This runtime file is looking for a new maintainer.
6" Former Maintainer: Charles E Campbell
Christian Brabandt1c673422024-06-15 14:49:24 +02007" Last Change:
Damien2cad9412024-07-24 20:07:00 +02008" 2024 Jun 16 by Vim Project: handle whitespace on Windows properly (#14998)
9" 2024 Jul 23 by Vim Project: fix 'x' command
10" 2024 Jul 24 by Vim Project: use delete() function
Damienf0e9b722024-08-05 20:21:18 +020011" 2024 Jul 30 by Vim Project: fix opening remote zipfile
zeertzjqc5bdd662024-08-04 18:35:50 +020012" 2024 Aug 04 by Vim Project: escape '[' in name of file to be extracted
Damienf0e9b722024-08-05 20:21:18 +020013" 2024 Aug 05 by Vim Project: workaround for the FreeBSD's unzip
Christian Brabandta63f66e2024-08-05 20:47:34 +020014" 2024 Aug 05 by Vim Project: clean-up and make it work with shellslash on Windows
Bram Moolenaar9964e462007-05-05 17:54:07 +000015" License: Vim License (see vim's :help license)
Christian Brabandt1c673422024-06-15 14:49:24 +020016" Copyright: Copyright (C) 2005-2019 Charles E. Campbell {{{1
17" Permission is hereby granted to use and distribute this code,
18" with or without modifications, provided that this copyright
19" notice is copied with it. Like anything else that's free,
20" zip.vim and zipPlugin.vim are provided *as is* and comes with
21" no warranty of any kind, either expressed or implied. By using
22" this plugin, you agree that in no event will the copyright
23" holder be liable for any damages resulting from the use
24" of this software.
Bram Moolenaar60a795a2005-09-16 21:55:43 +000025
26" ---------------------------------------------------------------------
Bram Moolenaar9964e462007-05-05 17:54:07 +000027" Load Once: {{{1
Bram Moolenaar00a927d2010-05-14 23:24:24 +020028if &cp || exists("g:loaded_zip")
Bram Moolenaar60a795a2005-09-16 21:55:43 +000029 finish
30endif
Christian Brabandta336d8f2024-08-05 21:26:46 +020031let g:loaded_zip= "v34"
Bram Moolenaar00a927d2010-05-14 23:24:24 +020032let s:keepcpo= &cpo
33set cpo&vim
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
Christian Brabandt8d529262024-08-06 18:35:00 +020061" ---------------------------------------------------------------------
62" required early
63" s:Mess: {{{2
64fun! s:Mess(group, msg)
65 redraw!
66 exe "echohl " . a:group
67 echomsg a:msg
68 echohl Normal
69endfun
70
71if v:version < 900
72 call s:Mess('WarningMsg', "***warning*** this version of zip needs vim 9.0 or later")
73 finish
74endif
D. Ben Knoblecd8a3ea2023-11-04 05:11:17 -040075if !dist#vim#IsSafeExecutable('zip', g:zip_unzipcmd)
Christian Brabandt8d529262024-08-06 18:35:00 +020076 call s:Mess('Error', "Warning: NOT executing " .. g:zip_unzipcmd .. " from current directory!")
Christian Brabandt816fbcc2023-08-31 23:52:30 +020077 finish
78endif
Anton Sharonov67c951d2023-09-05 21:03:27 +020079
Bram Moolenaar60a795a2005-09-16 21:55:43 +000080" ----------------
81" Functions: {{{1
82" ----------------
83
84" ---------------------------------------------------------------------
85" zip#Browse: {{{2
86fun! zip#Browse(zipfile)
Damienc4be0662024-07-30 19:14:35 +020087 " sanity check: ensure that the zipfile has "PK" as its first two letters
88 " (zip files have a leading PK as a "magic cookie")
89 if filereadable(a:zipfile) && readblob(a:zipfile, 0, 2) != 0z50.4B
90 exe "noswapfile noautocmd e " .. fnameescape(a:zipfile)
Bram Moolenaar94f76b72013-07-04 22:50:40 +020091 return
Bram Moolenaar94f76b72013-07-04 22:50:40 +020092 endif
93
Christian Brabandt19636be2024-08-05 21:00:07 +020094 let dict = s:SetSaneOpts()
Bram Moolenaar60a795a2005-09-16 21:55:43 +000095
96 " sanity checks
Bram Moolenaarccc18222007-05-10 18:25:20 +000097 if !executable(g:zip_unzipcmd)
Christian Brabandt8d529262024-08-06 18:35:00 +020098 call s:Mess('Error', "***error*** (zip#Browse) unzip not available on your system")
Christian Brabandt19636be2024-08-05 21:00:07 +020099 call s:RestoreOpts(dict)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000100 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
Christian Brabandt8d529262024-08-06 18:35:00 +0200105 call s:Mess('Error', "***error*** (zip#Browse) File not readable <".a:zipfile.">")
Bram Moolenaara5792f52005-11-23 21:25:05 +0000106 endif
Christian Brabandt19636be2024-08-05 21:00:07 +0200107 call s:RestoreOpts(dict)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000108 return
109 endif
110 if &ma != 1
111 set ma
112 endif
Bram Moolenaarccc18222007-05-10 18:25:20 +0000113 let b:zipfile= a:zipfile
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000114
115 setlocal noswapfile
116 setlocal buftype=nofile
117 setlocal bufhidden=hide
118 setlocal nobuflisted
119 setlocal nowrap
Bram Moolenaar519cc552021-11-16 19:18:26 +0000120
121 " Oct 12, 2021: need to re-use Bram's syntax/tar.vim.
122 " Setting the filetype to zip doesn't do anything (currently),
123 " but it is perhaps less confusing to curious perusers who do
124 " a :echo &ft
125 setf zip
126 run! syntax/tar.vim
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000127
128 " give header
Bram Moolenaar251e1912011-06-19 05:09:16 +0200129 call append(0, ['" zip.vim version '.g:loaded_zip,
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100130 \ '" Browsing zipfile '.a:zipfile,
131 \ '" Select a file with cursor and press ENTER'])
Bram Moolenaar251e1912011-06-19 05:09:16 +0200132 keepj $
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000133
Damienf0e9b722024-08-05 20:21:18 +0200134 exe $"keepj sil r! {g:zip_unzipcmd} -Z1 -- {s:Escape(a:zipfile, 1)}"
Bram Moolenaard68071d2006-05-02 22:08:30 +0000135 if v:shell_error != 0
Christian Brabandt8d529262024-08-06 18:35:00 +0200136 call s:Mess('WarningMsg', "***warning*** (zip#Browse) ".fnameescape(a:zipfile)." is not a zip file")
Bram Moolenaar251e1912011-06-19 05:09:16 +0200137 keepj sil! %d
Bram Moolenaard68071d2006-05-02 22:08:30 +0000138 let eikeep= &ei
139 set ei=BufReadCmd,FileReadCmd
Bram Moolenaar251e1912011-06-19 05:09:16 +0200140 exe "keepj r ".fnameescape(a:zipfile)
Bram Moolenaard68071d2006-05-02 22:08:30 +0000141 let &ei= eikeep
Bram Moolenaar251e1912011-06-19 05:09:16 +0200142 keepj 1d
Christian Brabandt19636be2024-08-05 21:00:07 +0200143 call s:RestoreOpts(dict)
Bram Moolenaard68071d2006-05-02 22:08:30 +0000144 return
145 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000146
Bram Moolenaard0796902016-09-16 20:02:31 +0200147 " Maps associated with zip plugin
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000148 setlocal noma nomod ro
Bram Moolenaar29634562020-01-09 21:46:04 +0100149 noremap <silent> <buffer> <cr> :call <SID>ZipBrowseSelect()<cr>
150 noremap <silent> <buffer> x :call zip#Extract()<cr>
151 if &mouse != ""
152 noremap <silent> <buffer> <leftmouse> <leftmouse>:call <SID>ZipBrowseSelect()<cr>
153 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000154
Christian Brabandt19636be2024-08-05 21:00:07 +0200155 call s:RestoreOpts(dict)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000156endfun
157
158" ---------------------------------------------------------------------
159" ZipBrowseSelect: {{{2
160fun! s:ZipBrowseSelect()
Christian Brabandt19636be2024-08-05 21:00:07 +0200161 let dict = s:SetSaneOpts()
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000162 let fname= getline(".")
Bram Moolenaar71badf92023-04-22 22:40:14 +0100163 if !exists("b:zipfile")
Christian Brabandt19636be2024-08-05 21:00:07 +0200164 call s:RestoreOpts(dict)
Bram Moolenaar71badf92023-04-22 22:40:14 +0100165 return
166 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000167
168 " sanity check
169 if fname =~ '^"'
Christian Brabandt19636be2024-08-05 21:00:07 +0200170 call s:RestoreOpts(dict)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000171 return
172 endif
173 if fname =~ '/$'
Christian Brabandt8d529262024-08-06 18:35:00 +0200174 call s:Mess('Error', "***error*** (zip#Browse) Please specify a file, not a directory")
Christian Brabandt19636be2024-08-05 21:00:07 +0200175 call s:RestoreOpts(dict)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000176 return
177 endif
178
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000179 " get zipfile to the new-window
Bram Moolenaarccc18222007-05-10 18:25:20 +0000180 let zipfile = b:zipfile
Bram Moolenaar29634562020-01-09 21:46:04 +0100181 let curfile = expand("%")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000182
Bram Moolenaar29634562020-01-09 21:46:04 +0100183 noswapfile new
Bram Moolenaar446cb832008-06-24 21:56:24 +0000184 if !exists("g:zip_nomax") || g:zip_nomax == 0
185 wincmd _
186 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000187 let s:zipfile_{winnr()}= curfile
Bram Moolenaar519cc552021-11-16 19:18:26 +0000188 exe "noswapfile e ".fnameescape("zipfile://".zipfile.'::'.fname)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000189 filetype detect
190
Christian Brabandt19636be2024-08-05 21:00:07 +0200191 call s:RestoreOpts(dict)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000192endfun
193
194" ---------------------------------------------------------------------
195" zip#Read: {{{2
196fun! zip#Read(fname,mode)
Christian Brabandt19636be2024-08-05 21:00:07 +0200197 let dict = s:SetSaneOpts()
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000198
Bram Moolenaard68071d2006-05-02 22:08:30 +0000199 if has("unix")
Bram Moolenaar519cc552021-11-16 19:18:26 +0000200 let zipfile = substitute(a:fname,'zipfile://\(.\{-}\)::[^\\].*$','\1','')
201 let fname = substitute(a:fname,'zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000202 else
Bram Moolenaar519cc552021-11-16 19:18:26 +0000203 let zipfile = substitute(a:fname,'^.\{-}zipfile://\(.\{-}\)::[^\\].*$','\1','')
204 let fname = substitute(a:fname,'^.\{-}zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000205 endif
zeertzjqc5bdd662024-08-04 18:35:50 +0200206 let fname = substitute(fname, '[', '[[]', 'g')
Bram Moolenaard0796902016-09-16 20:02:31 +0200207 " sanity check
208 if !executable(substitute(g:zip_unzipcmd,'\s\+.*$','',''))
Christian Brabandt8d529262024-08-06 18:35:00 +0200209 call s:Mess('Error', "***error*** (zip#Read) sorry, your system doesn't appear to have the ".g:zip_unzipcmd." program")
Christian Brabandt19636be2024-08-05 21:00:07 +0200210 call s:RestoreOpts(dict)
Bram Moolenaard0796902016-09-16 20:02:31 +0200211 return
212 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000213
Bram Moolenaarff034192013-04-24 18:51:19 +0200214 " the following code does much the same thing as
zeertzjqc5bdd662024-08-04 18:35:50 +0200215 " exe "keepj sil! r! ".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fname,1)
Bram Moolenaar519cc552021-11-16 19:18:26 +0000216 " but allows zipfile://... entries in quickfix lists
Bram Moolenaarff034192013-04-24 18:51:19 +0200217 let temp = tempname()
218 let fn = expand('%:p')
Damienf0e9b722024-08-05 20:21:18 +0200219 exe "sil !".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fname,1).' > '.temp
Bram Moolenaarff034192013-04-24 18:51:19 +0200220 sil exe 'keepalt file '.temp
221 sil keepj e!
222 sil exe 'keepalt file '.fnameescape(fn)
223 call delete(temp)
224
Bram Moolenaar251e1912011-06-19 05:09:16 +0200225 filetype detect
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000226
227 " cleanup
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000228 set nomod
229
Christian Brabandt19636be2024-08-05 21:00:07 +0200230 call s:RestoreOpts(dict)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000231endfun
232
233" ---------------------------------------------------------------------
234" zip#Write: {{{2
235fun! zip#Write(fname)
Christian Brabandt19636be2024-08-05 21:00:07 +0200236 let dict = s:SetSaneOpts()
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000237
238 " sanity checks
Bram Moolenaard0796902016-09-16 20:02:31 +0200239 if !executable(substitute(g:zip_zipcmd,'\s\+.*$','',''))
Christian Brabandt8d529262024-08-06 18:35:00 +0200240 call s:Mess('Error', "***error*** (zip#Write) sorry, your system doesn't appear to have the ".g:zip_zipcmd." program")
Christian Brabandt19636be2024-08-05 21:00:07 +0200241 call s:RestoreOpts(dict)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000242 return
243 endif
244 if !exists("*mkdir")
Christian Brabandt8d529262024-08-06 18:35:00 +0200245 call s:Mess('Error', "***error*** (zip#Write) sorry, mkdir() doesn't work on your system")
Christian Brabandt19636be2024-08-05 21:00:07 +0200246 call s:RestoreOpts(dict)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000247 return
248 endif
249
250 let curdir= getcwd()
251 let tmpdir= tempname()
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000252 if tmpdir =~ '\.'
253 let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
254 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000255 call mkdir(tmpdir,"p")
256
257 " attempt to change to the indicated directory
Bram Moolenaar9964e462007-05-05 17:54:07 +0000258 if s:ChgDir(tmpdir,s:ERROR,"(zip#Write) cannot cd to temporary directory")
Christian Brabandt19636be2024-08-05 21:00:07 +0200259 call s:RestoreOpts(dict)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000260 return
Bram Moolenaar9964e462007-05-05 17:54:07 +0000261 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000262
263 " place temporary files under .../_ZIPVIM_/
264 if isdirectory("_ZIPVIM_")
Damien2cad9412024-07-24 20:07:00 +0200265 call delete("_ZIPVIM_", "rf")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000266 endif
267 call mkdir("_ZIPVIM_")
268 cd _ZIPVIM_
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000269
Bram Moolenaard68071d2006-05-02 22:08:30 +0000270 if has("unix")
Bram Moolenaar519cc552021-11-16 19:18:26 +0000271 let zipfile = substitute(a:fname,'zipfile://\(.\{-}\)::[^\\].*$','\1','')
272 let fname = substitute(a:fname,'zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000273 else
Bram Moolenaar519cc552021-11-16 19:18:26 +0000274 let zipfile = substitute(a:fname,'^.\{-}zipfile://\(.\{-}\)::[^\\].*$','\1','')
275 let fname = substitute(a:fname,'^.\{-}zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000276 endif
Bram Moolenaarc7486e02005-12-29 22:48:26 +0000277
278 if fname =~ '/'
279 let dirpath = substitute(fname,'/[^/]\+$','','e')
Bram Moolenaarff034192013-04-24 18:51:19 +0200280 if has("win32unix") && executable("cygpath")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000281 let dirpath = substitute(system("cygpath ".s:Escape(dirpath,0)),'\n','','e')
Bram Moolenaarc7486e02005-12-29 22:48:26 +0000282 endif
283 call mkdir(dirpath,"p")
284 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000285 if zipfile !~ '/'
286 let zipfile= curdir.'/'.zipfile
287 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000288
Bram Moolenaarc236c162008-07-13 17:41:49 +0000289 exe "w! ".fnameescape(fname)
Bram Moolenaarff034192013-04-24 18:51:19 +0200290 if has("win32unix") && executable("cygpath")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000291 let zipfile = substitute(system("cygpath ".s:Escape(zipfile,0)),'\n','','e')
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000292 endif
293
Bram Moolenaar9964e462007-05-05 17:54:07 +0000294 if (has("win32") || has("win95") || has("win64") || has("win16")) && &shell !~? 'sh$'
295 let fname = substitute(fname, '[', '[[]', 'g')
296 endif
297
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000298 call system(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0))
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000299 if v:shell_error != 0
Christian Brabandt8d529262024-08-06 18:35:00 +0200300 call s:Mess('Error', "***error*** (zip#Write) sorry, unable to update ".zipfile." with ".fname)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000301
302 elseif s:zipfile_{winnr()} =~ '^\a\+://'
303 " support writing zipfiles across a network
304 let netzipfile= s:zipfile_{winnr()}
Bram Moolenaara5792f52005-11-23 21:25:05 +0000305 1split|enew
306 let binkeep= &binary
307 let eikeep = &ei
308 set binary ei=all
Bram Moolenaar29634562020-01-09 21:46:04 +0100309 exe "noswapfile e! ".fnameescape(zipfile)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000310 call netrw#NetWrite(netzipfile)
311 let &ei = eikeep
312 let &binary = binkeep
313 q!
314 unlet s:zipfile_{winnr()}
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000315 endif
Damien2cad9412024-07-24 20:07:00 +0200316
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000317 " cleanup and restore current directory
318 cd ..
Damien2cad9412024-07-24 20:07:00 +0200319 call delete("_ZIPVIM_", "rf")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000320 call s:ChgDir(curdir,s:WARNING,"(zip#Write) unable to return to ".curdir."!")
Damien2cad9412024-07-24 20:07:00 +0200321 call delete(tmpdir, "rf")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000322 setlocal nomod
323
Christian Brabandt19636be2024-08-05 21:00:07 +0200324 call s:RestoreOpts(dict)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000325endfun
326
327" ---------------------------------------------------------------------
Bram Moolenaard0796902016-09-16 20:02:31 +0200328" zip#Extract: extract a file from a zip archive {{{2
329fun! zip#Extract()
Bram Moolenaard0796902016-09-16 20:02:31 +0200330
Christian Brabandt19636be2024-08-05 21:00:07 +0200331 let dict = s:SetSaneOpts()
Bram Moolenaard0796902016-09-16 20:02:31 +0200332 let fname= getline(".")
Bram Moolenaard0796902016-09-16 20:02:31 +0200333
334 " sanity check
335 if fname =~ '^"'
Christian Brabandt19636be2024-08-05 21:00:07 +0200336 call s:RestoreOpts(dict)
Bram Moolenaard0796902016-09-16 20:02:31 +0200337 return
338 endif
339 if fname =~ '/$'
Christian Brabandt8d529262024-08-06 18:35:00 +0200340 call s:Mess('Error', "***error*** (zip#Extract) Please specify a file, not a directory")
Christian Brabandt19636be2024-08-05 21:00:07 +0200341 call s:RestoreOpts(dict)
Bram Moolenaard0796902016-09-16 20:02:31 +0200342 return
343 endif
344
345 " extract the file mentioned under the cursor
Damien38ce71c2024-07-23 19:56:54 +0200346 call system($"{g:zip_extractcmd} {shellescape(b:zipfile)} {shellescape(fname)}")
Bram Moolenaard0796902016-09-16 20:02:31 +0200347 if v:shell_error != 0
Christian Brabandt8d529262024-08-06 18:35:00 +0200348 call s:Mess('Error', "***error*** ".g:zip_extractcmd." ".b:zipfile." ".fname.": failed!")
Bram Moolenaard0796902016-09-16 20:02:31 +0200349 elseif !filereadable(fname)
Christian Brabandt8d529262024-08-06 18:35:00 +0200350 call s:Mess('Error', "***error*** attempted to extract ".fname." but it doesn't appear to be present!")
Bram Moolenaard0796902016-09-16 20:02:31 +0200351 else
Christian Brabandt120c0dd2024-08-05 20:51:47 +0200352 echomsg "***note*** successfully extracted ".fname
Bram Moolenaard0796902016-09-16 20:02:31 +0200353 endif
354
355 " restore option
Christian Brabandt19636be2024-08-05 21:00:07 +0200356 call s:RestoreOpts(dict)
Bram Moolenaard0796902016-09-16 20:02:31 +0200357
Bram Moolenaard0796902016-09-16 20:02:31 +0200358endfun
359
360" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +0000361" s:Escape: {{{2
362fun! s:Escape(fname,isfilt)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000363 if exists("*shellescape")
364 if a:isfilt
365 let qnameq= shellescape(a:fname,1)
366 else
367 let qnameq= shellescape(a:fname)
368 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000369 else
370 let qnameq= g:zip_shq.escape(a:fname,g:zip_shq).g:zip_shq
371 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000372 return qnameq
Bram Moolenaar9964e462007-05-05 17:54:07 +0000373endfun
374
375" ---------------------------------------------------------------------
Christian Brabandt19636be2024-08-05 21:00:07 +0200376" s:ChgDir: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000377fun! s:ChgDir(newdir,errlvl,errmsg)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000378 try
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000379 exe "cd ".fnameescape(a:newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000380 catch /^Vim\%((\a\+)\)\=:E344/
381 redraw!
382 if a:errlvl == s:NOTE
Christian Brabandt120c0dd2024-08-05 20:51:47 +0200383 echomsg "***note*** ".a:errmsg
Bram Moolenaar9964e462007-05-05 17:54:07 +0000384 elseif a:errlvl == s:WARNING
Christian Brabandt8d529262024-08-06 18:35:00 +0200385 call s:Mess("WarningMsg", "***warning*** ".a:errmsg)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000386 elseif a:errlvl == s:ERROR
Christian Brabandt8d529262024-08-06 18:35:00 +0200387 call s:Mess("Error", "***error*** ".a:errmsg)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000388 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000389 return 1
390 endtry
391
Bram Moolenaar9964e462007-05-05 17:54:07 +0000392 return 0
393endfun
394
Christian Brabandt19636be2024-08-05 21:00:07 +0200395" ---------------------------------------------------------------------
396" s:SetSaneOpts: {{{2
397fun! s:SetSaneOpts()
398 let dict = {}
399 let dict.report = &report
400 let dict.shellslash = &shellslash
401
402 let &report = 10
403 let &shellslash = 0
404
405 return dict
406endfun
407
408" ---------------------------------------------------------------------
409" s:RestoreOpts: {{{2
410fun! s:RestoreOpts(dict)
411 for [key, val] in items(a:dict)
412 exe $"let &{key} = {val}"
413 endfor
414endfun
415
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000416" ------------------------------------------------------------------------
417" Modelines And Restoration: {{{1
418let &cpo= s:keepcpo
419unlet s:keepcpo
Bram Moolenaarccc18222007-05-10 18:25:20 +0000420" vim:ts=8 fdm=marker