blob: 31fb32779f86d8c6adb104cede1df472562f08ef [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
Christian Brabandte2d9b0d2024-08-07 08:13:32 +020071if v:version < 901
72 " required for defer
73 call s:Mess('WarningMsg', "***warning*** this version of zip needs vim 9.1 or later")
Christian Brabandt8d529262024-08-06 18:35:00 +020074 finish
75endif
D. Ben Knoblecd8a3ea2023-11-04 05:11:17 -040076if !dist#vim#IsSafeExecutable('zip', g:zip_unzipcmd)
Christian Brabandt8d529262024-08-06 18:35:00 +020077 call s:Mess('Error', "Warning: NOT executing " .. g:zip_unzipcmd .. " from current directory!")
Christian Brabandt816fbcc2023-08-31 23:52:30 +020078 finish
79endif
Anton Sharonov67c951d2023-09-05 21:03:27 +020080
Bram Moolenaar60a795a2005-09-16 21:55:43 +000081" ----------------
82" Functions: {{{1
83" ----------------
84
85" ---------------------------------------------------------------------
86" zip#Browse: {{{2
87fun! zip#Browse(zipfile)
Damienc4be0662024-07-30 19:14:35 +020088 " sanity check: ensure that the zipfile has "PK" as its first two letters
89 " (zip files have a leading PK as a "magic cookie")
90 if filereadable(a:zipfile) && readblob(a:zipfile, 0, 2) != 0z50.4B
91 exe "noswapfile noautocmd e " .. fnameescape(a:zipfile)
Bram Moolenaar94f76b72013-07-04 22:50:40 +020092 return
Bram Moolenaar94f76b72013-07-04 22:50:40 +020093 endif
94
Christian Brabandt19636be2024-08-05 21:00:07 +020095 let dict = s:SetSaneOpts()
Christian Brabandtafea6b92024-08-06 18:50:59 +020096 defer s:RestoreOpts(dict)
Bram Moolenaar60a795a2005-09-16 21:55:43 +000097
98 " sanity checks
Bram Moolenaarccc18222007-05-10 18:25:20 +000099 if !executable(g:zip_unzipcmd)
Christian Brabandt8d529262024-08-06 18:35:00 +0200100 call s:Mess('Error', "***error*** (zip#Browse) unzip not available on your system")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000101 return
102 endif
103 if !filereadable(a:zipfile)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000104 if a:zipfile !~# '^\a\+://'
Bram Moolenaar8024f932020-01-14 19:29:13 +0100105 " if it's an url, don't complain, let url-handlers such as vim do its thing
Christian Brabandt8d529262024-08-06 18:35:00 +0200106 call s:Mess('Error', "***error*** (zip#Browse) File not readable <".a:zipfile.">")
Bram Moolenaara5792f52005-11-23 21:25:05 +0000107 endif
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
Bram Moolenaard68071d2006-05-02 22:08:30 +0000143 return
144 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000145
Bram Moolenaard0796902016-09-16 20:02:31 +0200146 " Maps associated with zip plugin
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000147 setlocal noma nomod ro
Bram Moolenaar29634562020-01-09 21:46:04 +0100148 noremap <silent> <buffer> <cr> :call <SID>ZipBrowseSelect()<cr>
149 noremap <silent> <buffer> x :call zip#Extract()<cr>
150 if &mouse != ""
151 noremap <silent> <buffer> <leftmouse> <leftmouse>:call <SID>ZipBrowseSelect()<cr>
152 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000153
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000154endfun
155
156" ---------------------------------------------------------------------
157" ZipBrowseSelect: {{{2
158fun! s:ZipBrowseSelect()
Christian Brabandt19636be2024-08-05 21:00:07 +0200159 let dict = s:SetSaneOpts()
Christian Brabandtafea6b92024-08-06 18:50:59 +0200160 defer s:RestoreOpts(dict)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000161 let fname= getline(".")
Bram Moolenaar71badf92023-04-22 22:40:14 +0100162 if !exists("b:zipfile")
Bram Moolenaar71badf92023-04-22 22:40:14 +0100163 return
164 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000165
166 " sanity check
167 if fname =~ '^"'
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000168 return
169 endif
170 if fname =~ '/$'
Christian Brabandt8d529262024-08-06 18:35:00 +0200171 call s:Mess('Error', "***error*** (zip#Browse) Please specify a file, not a directory")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000172 return
173 endif
174
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000175 " get zipfile to the new-window
Bram Moolenaarccc18222007-05-10 18:25:20 +0000176 let zipfile = b:zipfile
Bram Moolenaar29634562020-01-09 21:46:04 +0100177 let curfile = expand("%")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000178
Bram Moolenaar29634562020-01-09 21:46:04 +0100179 noswapfile new
Bram Moolenaar446cb832008-06-24 21:56:24 +0000180 if !exists("g:zip_nomax") || g:zip_nomax == 0
181 wincmd _
182 endif
Bram Moolenaara5792f52005-11-23 21:25:05 +0000183 let s:zipfile_{winnr()}= curfile
Bram Moolenaar519cc552021-11-16 19:18:26 +0000184 exe "noswapfile e ".fnameescape("zipfile://".zipfile.'::'.fname)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000185 filetype detect
186
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000187endfun
188
189" ---------------------------------------------------------------------
190" zip#Read: {{{2
191fun! zip#Read(fname,mode)
Christian Brabandt19636be2024-08-05 21:00:07 +0200192 let dict = s:SetSaneOpts()
Christian Brabandtafea6b92024-08-06 18:50:59 +0200193 defer s:RestoreOpts(dict)
Bram Moolenaar36c31f72005-11-28 23:01:53 +0000194
Bram Moolenaard68071d2006-05-02 22:08:30 +0000195 if has("unix")
Bram Moolenaar519cc552021-11-16 19:18:26 +0000196 let zipfile = substitute(a:fname,'zipfile://\(.\{-}\)::[^\\].*$','\1','')
197 let fname = substitute(a:fname,'zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000198 else
Bram Moolenaar519cc552021-11-16 19:18:26 +0000199 let zipfile = substitute(a:fname,'^.\{-}zipfile://\(.\{-}\)::[^\\].*$','\1','')
200 let fname = substitute(a:fname,'^.\{-}zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000201 endif
zeertzjqc5bdd662024-08-04 18:35:50 +0200202 let fname = substitute(fname, '[', '[[]', 'g')
Bram Moolenaard0796902016-09-16 20:02:31 +0200203 " sanity check
204 if !executable(substitute(g:zip_unzipcmd,'\s\+.*$','',''))
Christian Brabandt8d529262024-08-06 18:35:00 +0200205 call s:Mess('Error', "***error*** (zip#Read) sorry, your system doesn't appear to have the ".g:zip_unzipcmd." program")
Bram Moolenaard0796902016-09-16 20:02:31 +0200206 return
207 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000208
Bram Moolenaarff034192013-04-24 18:51:19 +0200209 " the following code does much the same thing as
zeertzjqc5bdd662024-08-04 18:35:50 +0200210 " exe "keepj sil! r! ".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fname,1)
Bram Moolenaar519cc552021-11-16 19:18:26 +0000211 " but allows zipfile://... entries in quickfix lists
Bram Moolenaarff034192013-04-24 18:51:19 +0200212 let temp = tempname()
213 let fn = expand('%:p')
Damienf0e9b722024-08-05 20:21:18 +0200214 exe "sil !".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fname,1).' > '.temp
Bram Moolenaarff034192013-04-24 18:51:19 +0200215 sil exe 'keepalt file '.temp
216 sil keepj e!
217 sil exe 'keepalt file '.fnameescape(fn)
218 call delete(temp)
219
Bram Moolenaar251e1912011-06-19 05:09:16 +0200220 filetype detect
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000221
222 " cleanup
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000223 set nomod
224
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000225endfun
226
227" ---------------------------------------------------------------------
228" zip#Write: {{{2
229fun! zip#Write(fname)
Christian Brabandt19636be2024-08-05 21:00:07 +0200230 let dict = s:SetSaneOpts()
Christian Brabandtafea6b92024-08-06 18:50:59 +0200231 defer s:RestoreOpts(dict)
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000232
233 " sanity checks
Bram Moolenaard0796902016-09-16 20:02:31 +0200234 if !executable(substitute(g:zip_zipcmd,'\s\+.*$','',''))
Christian Brabandt8d529262024-08-06 18:35:00 +0200235 call s:Mess('Error', "***error*** (zip#Write) sorry, your system doesn't appear to have the ".g:zip_zipcmd." program")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000236 return
237 endif
238 if !exists("*mkdir")
Christian Brabandt8d529262024-08-06 18:35:00 +0200239 call s:Mess('Error', "***error*** (zip#Write) sorry, mkdir() doesn't work on your system")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000240 return
241 endif
242
243 let curdir= getcwd()
244 let tmpdir= tempname()
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000245 if tmpdir =~ '\.'
246 let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
247 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000248 call mkdir(tmpdir,"p")
249
250 " attempt to change to the indicated directory
Bram Moolenaar9964e462007-05-05 17:54:07 +0000251 if s:ChgDir(tmpdir,s:ERROR,"(zip#Write) cannot cd to temporary directory")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000252 return
Bram Moolenaar9964e462007-05-05 17:54:07 +0000253 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000254
255 " place temporary files under .../_ZIPVIM_/
256 if isdirectory("_ZIPVIM_")
Damien2cad9412024-07-24 20:07:00 +0200257 call delete("_ZIPVIM_", "rf")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000258 endif
259 call mkdir("_ZIPVIM_")
260 cd _ZIPVIM_
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000261
Bram Moolenaard68071d2006-05-02 22:08:30 +0000262 if has("unix")
Bram Moolenaar519cc552021-11-16 19:18:26 +0000263 let zipfile = substitute(a:fname,'zipfile://\(.\{-}\)::[^\\].*$','\1','')
264 let fname = substitute(a:fname,'zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000265 else
Bram Moolenaar519cc552021-11-16 19:18:26 +0000266 let zipfile = substitute(a:fname,'^.\{-}zipfile://\(.\{-}\)::[^\\].*$','\1','')
267 let fname = substitute(a:fname,'^.\{-}zipfile://.\{-}::\([^\\].*\)$','\1','')
Bram Moolenaard68071d2006-05-02 22:08:30 +0000268 endif
Bram Moolenaarc7486e02005-12-29 22:48:26 +0000269
270 if fname =~ '/'
271 let dirpath = substitute(fname,'/[^/]\+$','','e')
Bram Moolenaarff034192013-04-24 18:51:19 +0200272 if has("win32unix") && executable("cygpath")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000273 let dirpath = substitute(system("cygpath ".s:Escape(dirpath,0)),'\n','','e')
Bram Moolenaarc7486e02005-12-29 22:48:26 +0000274 endif
275 call mkdir(dirpath,"p")
276 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000277 if zipfile !~ '/'
278 let zipfile= curdir.'/'.zipfile
279 endif
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000280
Bram Moolenaarc236c162008-07-13 17:41:49 +0000281 exe "w! ".fnameescape(fname)
Bram Moolenaarff034192013-04-24 18:51:19 +0200282 if has("win32unix") && executable("cygpath")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000283 let zipfile = substitute(system("cygpath ".s:Escape(zipfile,0)),'\n','','e')
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000284 endif
285
Bram Moolenaar9964e462007-05-05 17:54:07 +0000286 if (has("win32") || has("win95") || has("win64") || has("win16")) && &shell !~? 'sh$'
287 let fname = substitute(fname, '[', '[[]', 'g')
288 endif
289
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000290 call system(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0))
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000291 if v:shell_error != 0
Christian Brabandt8d529262024-08-06 18:35:00 +0200292 call s:Mess('Error', "***error*** (zip#Write) sorry, unable to update ".zipfile." with ".fname)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000293
294 elseif s:zipfile_{winnr()} =~ '^\a\+://'
295 " support writing zipfiles across a network
296 let netzipfile= s:zipfile_{winnr()}
Bram Moolenaara5792f52005-11-23 21:25:05 +0000297 1split|enew
298 let binkeep= &binary
299 let eikeep = &ei
300 set binary ei=all
Bram Moolenaar29634562020-01-09 21:46:04 +0100301 exe "noswapfile e! ".fnameescape(zipfile)
Bram Moolenaara5792f52005-11-23 21:25:05 +0000302 call netrw#NetWrite(netzipfile)
303 let &ei = eikeep
304 let &binary = binkeep
305 q!
306 unlet s:zipfile_{winnr()}
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000307 endif
Damien2cad9412024-07-24 20:07:00 +0200308
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000309 " cleanup and restore current directory
310 cd ..
Damien2cad9412024-07-24 20:07:00 +0200311 call delete("_ZIPVIM_", "rf")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000312 call s:ChgDir(curdir,s:WARNING,"(zip#Write) unable to return to ".curdir."!")
Damien2cad9412024-07-24 20:07:00 +0200313 call delete(tmpdir, "rf")
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000314 setlocal nomod
315
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000316endfun
317
318" ---------------------------------------------------------------------
Bram Moolenaard0796902016-09-16 20:02:31 +0200319" zip#Extract: extract a file from a zip archive {{{2
320fun! zip#Extract()
Bram Moolenaard0796902016-09-16 20:02:31 +0200321
Christian Brabandt19636be2024-08-05 21:00:07 +0200322 let dict = s:SetSaneOpts()
Christian Brabandtafea6b92024-08-06 18:50:59 +0200323 defer s:RestoreOpts(dict)
Bram Moolenaard0796902016-09-16 20:02:31 +0200324 let fname= getline(".")
Bram Moolenaard0796902016-09-16 20:02:31 +0200325
326 " sanity check
327 if fname =~ '^"'
Bram Moolenaard0796902016-09-16 20:02:31 +0200328 return
329 endif
330 if fname =~ '/$'
Christian Brabandt8d529262024-08-06 18:35:00 +0200331 call s:Mess('Error', "***error*** (zip#Extract) Please specify a file, not a directory")
Bram Moolenaard0796902016-09-16 20:02:31 +0200332 return
333 endif
334
335 " extract the file mentioned under the cursor
Damien38ce71c2024-07-23 19:56:54 +0200336 call system($"{g:zip_extractcmd} {shellescape(b:zipfile)} {shellescape(fname)}")
Bram Moolenaard0796902016-09-16 20:02:31 +0200337 if v:shell_error != 0
Christian Brabandt8d529262024-08-06 18:35:00 +0200338 call s:Mess('Error', "***error*** ".g:zip_extractcmd." ".b:zipfile." ".fname.": failed!")
Bram Moolenaard0796902016-09-16 20:02:31 +0200339 elseif !filereadable(fname)
Christian Brabandt8d529262024-08-06 18:35:00 +0200340 call s:Mess('Error', "***error*** attempted to extract ".fname." but it doesn't appear to be present!")
Bram Moolenaard0796902016-09-16 20:02:31 +0200341 else
Christian Brabandt120c0dd2024-08-05 20:51:47 +0200342 echomsg "***note*** successfully extracted ".fname
Bram Moolenaard0796902016-09-16 20:02:31 +0200343 endif
344
Bram Moolenaard0796902016-09-16 20:02:31 +0200345endfun
346
347" ---------------------------------------------------------------------
Bram Moolenaarc236c162008-07-13 17:41:49 +0000348" s:Escape: {{{2
349fun! s:Escape(fname,isfilt)
Bram Moolenaarc236c162008-07-13 17:41:49 +0000350 if exists("*shellescape")
351 if a:isfilt
352 let qnameq= shellescape(a:fname,1)
353 else
354 let qnameq= shellescape(a:fname)
355 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000356 else
357 let qnameq= g:zip_shq.escape(a:fname,g:zip_shq).g:zip_shq
358 endif
Bram Moolenaar446cb832008-06-24 21:56:24 +0000359 return qnameq
Bram Moolenaar9964e462007-05-05 17:54:07 +0000360endfun
361
362" ---------------------------------------------------------------------
Christian Brabandt19636be2024-08-05 21:00:07 +0200363" s:ChgDir: {{{2
Bram Moolenaar9964e462007-05-05 17:54:07 +0000364fun! s:ChgDir(newdir,errlvl,errmsg)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000365 try
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000366 exe "cd ".fnameescape(a:newdir)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000367 catch /^Vim\%((\a\+)\)\=:E344/
368 redraw!
369 if a:errlvl == s:NOTE
Christian Brabandt120c0dd2024-08-05 20:51:47 +0200370 echomsg "***note*** ".a:errmsg
Bram Moolenaar9964e462007-05-05 17:54:07 +0000371 elseif a:errlvl == s:WARNING
Christian Brabandt8d529262024-08-06 18:35:00 +0200372 call s:Mess("WarningMsg", "***warning*** ".a:errmsg)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000373 elseif a:errlvl == s:ERROR
Christian Brabandt8d529262024-08-06 18:35:00 +0200374 call s:Mess("Error", "***error*** ".a:errmsg)
Bram Moolenaar9964e462007-05-05 17:54:07 +0000375 endif
Bram Moolenaar9964e462007-05-05 17:54:07 +0000376 return 1
377 endtry
378
Bram Moolenaar9964e462007-05-05 17:54:07 +0000379 return 0
380endfun
381
Christian Brabandt19636be2024-08-05 21:00:07 +0200382" ---------------------------------------------------------------------
383" s:SetSaneOpts: {{{2
384fun! s:SetSaneOpts()
385 let dict = {}
386 let dict.report = &report
387 let dict.shellslash = &shellslash
388
389 let &report = 10
390 let &shellslash = 0
391
392 return dict
393endfun
394
395" ---------------------------------------------------------------------
396" s:RestoreOpts: {{{2
397fun! s:RestoreOpts(dict)
398 for [key, val] in items(a:dict)
399 exe $"let &{key} = {val}"
400 endfor
401endfun
402
Bram Moolenaar60a795a2005-09-16 21:55:43 +0000403" ------------------------------------------------------------------------
404" Modelines And Restoration: {{{1
405let &cpo= s:keepcpo
406unlet s:keepcpo
Bram Moolenaarccc18222007-05-10 18:25:20 +0000407" vim:ts=8 fdm=marker