Mercurial > vim
annotate runtime/autoload/zip.vim @ 32401:3bf4736649b7 v9.0.1532
patch 9.0.1532: crash when expanding "~" in substitute causes very long text
Commit: https://github.com/vim/vim/commit/ab9a2d884b3a4abe319606ea95a5a6d6b01cd73a
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue May 9 21:15:30 2023 +0100
patch 9.0.1532: crash when expanding "~" in substitute causes very long text
Problem: Crash when expanding "~" in substitute causes very long text.
Solution: Limit the text length to MAXCOL.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 09 May 2023 22:30:04 +0200 |
parents | b2e8663e6dcc |
children | 828bcb1a37e7 |
rev | line source |
---|---|
530 | 1 " zip.vim: Handles browsing zipfiles |
2 " AUTOLOAD PORTION | |
32294 | 3 " Date: Mar 12, 2023 |
4 " Version: 33 | |
19099 | 5 " Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM> |
1121 | 6 " License: Vim License (see vim's :help license) |
19099 | 7 " Copyright: Copyright (C) 2005-2019 Charles E. Campbell {{{1 |
530 | 8 " 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, | |
1621 | 11 " 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 | |
530 | 14 " holder be liable for any damages resulting from the use |
15 " of this software. | |
5130
71e066e10a47
updated for version 7.3.1308
Bram Moolenaar <bram@vim.org>
parents:
4339
diff
changeset
|
16 "redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore() |
530 | 17 |
18 " --------------------------------------------------------------------- | |
1121 | 19 " Load Once: {{{1 |
2152 | 20 if &cp || exists("g:loaded_zip") |
21 finish | |
22 endif | |
32294 | 23 let g:loaded_zip= "v33" |
2152 | 24 if v:version < 702 |
25 echohl WarningMsg | |
10211
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
26 echo "***warning*** this version of zip needs vim 7.2 or later" |
2152 | 27 echohl Normal |
28 finish | |
29 endif | |
530 | 30 let s:keepcpo= &cpo |
31 set cpo&vim | |
5130
71e066e10a47
updated for version 7.3.1308
Bram Moolenaar <bram@vim.org>
parents:
4339
diff
changeset
|
32 "DechoTabOn |
530 | 33 |
798 | 34 let s:zipfile_escape = ' ?&;\' |
1121 | 35 let s:ERROR = 2 |
36 let s:WARNING = 1 | |
37 let s:NOTE = 0 | |
38 | |
39 " --------------------------------------------------------------------- | |
40 " Global Values: {{{1 | |
41 if !exists("g:zip_shq") | |
1621 | 42 if &shq != "" |
43 let g:zip_shq= &shq | |
44 elseif has("unix") | |
1121 | 45 let g:zip_shq= "'" |
46 else | |
47 let g:zip_shq= '"' | |
48 endif | |
49 endif | |
1214 | 50 if !exists("g:zip_zipcmd") |
51 let g:zip_zipcmd= "zip" | |
52 endif | |
53 if !exists("g:zip_unzipcmd") | |
54 let g:zip_unzipcmd= "unzip" | |
55 endif | |
10211
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
56 if !exists("g:zip_extractcmd") |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
57 let g:zip_extractcmd= g:zip_unzipcmd |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
58 endif |
530 | 59 |
60 " ---------------- | |
61 " Functions: {{{1 | |
62 " ---------------- | |
63 | |
64 " --------------------------------------------------------------------- | |
65 " zip#Browse: {{{2 | |
66 fun! zip#Browse(zipfile) | |
67 " call Dfunc("zip#Browse(zipfile<".a:zipfile.">)") | |
22723 | 68 " sanity check: insure that the zipfile has "PK" as its first two letters |
5130
71e066e10a47
updated for version 7.3.1308
Bram Moolenaar <bram@vim.org>
parents:
4339
diff
changeset
|
69 " (zipped files have a leading PK as a "magic cookie") |
71e066e10a47
updated for version 7.3.1308
Bram Moolenaar <bram@vim.org>
parents:
4339
diff
changeset
|
70 if !filereadable(a:zipfile) || readfile(a:zipfile, "", 1)[0] !~ '^PK' |
19099 | 71 exe "noswapfile noautocmd noswapfile e ".fnameescape(a:zipfile) |
5130
71e066e10a47
updated for version 7.3.1308
Bram Moolenaar <bram@vim.org>
parents:
4339
diff
changeset
|
72 " call Dret("zip#Browse : not a zipfile<".a:zipfile.">") |
71e066e10a47
updated for version 7.3.1308
Bram Moolenaar <bram@vim.org>
parents:
4339
diff
changeset
|
73 return |
71e066e10a47
updated for version 7.3.1308
Bram Moolenaar <bram@vim.org>
parents:
4339
diff
changeset
|
74 " else " Decho |
19116 | 75 " call Decho("zip#Browse: a:zipfile<".a:zipfile."> passed PK test - it's a zip file") |
5130
71e066e10a47
updated for version 7.3.1308
Bram Moolenaar <bram@vim.org>
parents:
4339
diff
changeset
|
76 endif |
71e066e10a47
updated for version 7.3.1308
Bram Moolenaar <bram@vim.org>
parents:
4339
diff
changeset
|
77 |
568 | 78 let repkeep= &report |
79 set report=10 | |
530 | 80 |
81 " sanity checks | |
1698 | 82 if !exists("*fnameescape") |
83 if &verbose > 1 | |
25773 | 84 echoerr "the zip plugin is not available (your vim doesn't support fnameescape())" |
1698 | 85 endif |
86 return | |
87 endif | |
1214 | 88 if !executable(g:zip_unzipcmd) |
1121 | 89 redraw! |
530 | 90 echohl Error | echo "***error*** (zip#Browse) unzip not available on your system" |
1121 | 91 " call inputsave()|call input("Press <cr> to continue")|call inputrestore() |
568 | 92 let &report= repkeep |
530 | 93 " call Dret("zip#Browse") |
94 return | |
95 endif | |
96 if !filereadable(a:zipfile) | |
557 | 97 if a:zipfile !~# '^\a\+://' |
19116 | 98 " if it's an url, don't complain, let url-handlers such as vim do its thing |
1121 | 99 redraw! |
557 | 100 echohl Error | echo "***error*** (zip#Browse) File not readable<".a:zipfile.">" | echohl None |
1121 | 101 " call inputsave()|call input("Press <cr> to continue")|call inputrestore() |
557 | 102 endif |
568 | 103 let &report= repkeep |
557 | 104 " call Dret("zip#Browse : file<".a:zipfile."> not readable") |
530 | 105 return |
106 endif | |
798 | 107 " call Decho("passed sanity checks") |
530 | 108 if &ma != 1 |
109 set ma | |
110 endif | |
1214 | 111 let b:zipfile= a:zipfile |
530 | 112 |
113 setlocal noswapfile | |
114 setlocal buftype=nofile | |
115 setlocal bufhidden=hide | |
116 setlocal nobuflisted | |
117 setlocal nowrap | |
26148 | 118 |
119 " Oct 12, 2021: need to re-use Bram's syntax/tar.vim. | |
120 " Setting the filetype to zip doesn't do anything (currently), | |
121 " but it is perhaps less confusing to curious perusers who do | |
122 " a :echo &ft | |
123 setf zip | |
124 run! syntax/tar.vim | |
530 | 125 |
126 " give header | |
2908 | 127 call append(0, ['" zip.vim version '.g:loaded_zip, |
3281 | 128 \ '" Browsing zipfile '.a:zipfile, |
129 \ '" Select a file with cursor and press ENTER']) | |
2908 | 130 keepj $ |
530 | 131 |
1698 | 132 " call Decho("exe silent r! ".g:zip_unzipcmd." -l -- ".s:Escape(a:zipfile,1)) |
3281 | 133 exe "keepj sil! r! ".g:zip_unzipcmd." -Z -1 -- ".s:Escape(a:zipfile,1) |
857 | 134 if v:shell_error != 0 |
1121 | 135 redraw! |
1668 | 136 echohl WarningMsg | echo "***warning*** (zip#Browse) ".fnameescape(a:zipfile)." is not a zip file" | echohl None |
1121 | 137 " call inputsave()|call input("Press <cr> to continue")|call inputrestore() |
2908 | 138 keepj sil! %d |
857 | 139 let eikeep= &ei |
140 set ei=BufReadCmd,FileReadCmd | |
2908 | 141 exe "keepj r ".fnameescape(a:zipfile) |
857 | 142 let &ei= eikeep |
2908 | 143 keepj 1d |
857 | 144 " call Dret("zip#Browse") |
145 return | |
146 endif | |
530 | 147 |
10211
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
148 " Maps associated with zip plugin |
530 | 149 setlocal noma nomod ro |
19099 | 150 noremap <silent> <buffer> <cr> :call <SID>ZipBrowseSelect()<cr> |
151 noremap <silent> <buffer> x :call zip#Extract()<cr> | |
152 if &mouse != "" | |
153 noremap <silent> <buffer> <leftmouse> <leftmouse>:call <SID>ZipBrowseSelect()<cr> | |
154 endif | |
530 | 155 |
568 | 156 let &report= repkeep |
530 | 157 " call Dret("zip#Browse") |
158 endfun | |
159 | |
160 " --------------------------------------------------------------------- | |
161 " ZipBrowseSelect: {{{2 | |
162 fun! s:ZipBrowseSelect() | |
32294 | 163 " call Dfunc("ZipBrowseSelect() zipfile<".((exists("b:zipfile"))? b:zipfile : "n/a")."> curfile<".expand("%").">") |
568 | 164 let repkeep= &report |
165 set report=10 | |
530 | 166 let fname= getline(".") |
32294 | 167 if !exists("b:zipfile") |
168 " call Dret("ZipBrowseSelect : b:zipfile doesn't exist!") | |
169 return | |
170 endif | |
530 | 171 |
172 " sanity check | |
173 if fname =~ '^"' | |
568 | 174 let &report= repkeep |
530 | 175 " call Dret("ZipBrowseSelect") |
176 return | |
177 endif | |
178 if fname =~ '/$' | |
1121 | 179 redraw! |
530 | 180 echohl Error | echo "***error*** (zip#Browse) Please specify a file, not a directory" | echohl None |
1121 | 181 " call inputsave()|call input("Press <cr> to continue")|call inputrestore() |
568 | 182 let &report= repkeep |
530 | 183 " call Dret("ZipBrowseSelect") |
184 return | |
185 endif | |
186 | |
187 " call Decho("fname<".fname.">") | |
188 | |
189 " get zipfile to the new-window | |
1214 | 190 let zipfile = b:zipfile |
19099 | 191 let curfile = expand("%") |
798 | 192 " call Decho("zipfile<".zipfile.">") |
193 " call Decho("curfile<".curfile.">") | |
530 | 194 |
19099 | 195 noswapfile new |
1621 | 196 if !exists("g:zip_nomax") || g:zip_nomax == 0 |
197 wincmd _ | |
198 endif | |
557 | 199 let s:zipfile_{winnr()}= curfile |
26148 | 200 " call Decho("exe e ".fnameescape("zipfile://".zipfile.'::'.fname)) |
201 exe "noswapfile e ".fnameescape("zipfile://".zipfile.'::'.fname) | |
530 | 202 filetype detect |
203 | |
568 | 204 let &report= repkeep |
557 | 205 " call Dret("ZipBrowseSelect : s:zipfile_".winnr()."<".s:zipfile_{winnr()}.">") |
530 | 206 endfun |
207 | |
208 " --------------------------------------------------------------------- | |
209 " zip#Read: {{{2 | |
210 fun! zip#Read(fname,mode) | |
211 " call Dfunc("zip#Read(fname<".a:fname.">,mode=".a:mode.")") | |
568 | 212 let repkeep= &report |
213 set report=10 | |
214 | |
857 | 215 if has("unix") |
26148 | 216 let zipfile = substitute(a:fname,'zipfile://\(.\{-}\)::[^\\].*$','\1','') |
217 let fname = substitute(a:fname,'zipfile://.\{-}::\([^\\].*\)$','\1','') | |
857 | 218 else |
26148 | 219 let zipfile = substitute(a:fname,'^.\{-}zipfile://\(.\{-}\)::[^\\].*$','\1','') |
220 let fname = substitute(a:fname,'^.\{-}zipfile://.\{-}::\([^\\].*\)$','\1','') | |
4339 | 221 let fname = substitute(fname, '[', '[[]', 'g') |
857 | 222 endif |
223 " call Decho("zipfile<".zipfile.">") | |
224 " call Decho("fname <".fname.">") | |
10211
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
225 " sanity check |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
226 if !executable(substitute(g:zip_unzipcmd,'\s\+.*$','','')) |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
227 redraw! |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
228 echohl Error | echo "***error*** (zip#Read) sorry, your system doesn't appear to have the ".g:zip_unzipcmd." program" | echohl None |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
229 " call inputsave()|call input("Press <cr> to continue")|call inputrestore() |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
230 let &report= repkeep |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
231 " call Dret("zip#Write") |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
232 return |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
233 endif |
530 | 234 |
4339 | 235 " the following code does much the same thing as |
236 " exe "keepj sil! r! ".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1) | |
26148 | 237 " but allows zipfile://... entries in quickfix lists |
4339 | 238 let temp = tempname() |
5130
71e066e10a47
updated for version 7.3.1308
Bram Moolenaar <bram@vim.org>
parents:
4339
diff
changeset
|
239 " call Decho("using temp file<".temp.">") |
4339 | 240 let fn = expand('%:p') |
241 exe "sil! !".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1).' > '.temp | |
242 " call Decho("exe sil! !".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1).' > '.temp) | |
243 sil exe 'keepalt file '.temp | |
244 sil keepj e! | |
245 sil exe 'keepalt file '.fnameescape(fn) | |
246 call delete(temp) | |
247 | |
2908 | 248 filetype detect |
530 | 249 |
250 " cleanup | |
5130
71e066e10a47
updated for version 7.3.1308
Bram Moolenaar <bram@vim.org>
parents:
4339
diff
changeset
|
251 " keepj 0d " used to be needed for the ...r! ... method |
530 | 252 set nomod |
253 | |
568 | 254 let &report= repkeep |
530 | 255 " call Dret("zip#Read") |
256 endfun | |
257 | |
258 " --------------------------------------------------------------------- | |
259 " zip#Write: {{{2 | |
260 fun! zip#Write(fname) | |
819 | 261 " call Dfunc("zip#Write(fname<".a:fname.">) zipfile_".winnr()."<".s:zipfile_{winnr()}.">") |
568 | 262 let repkeep= &report |
263 set report=10 | |
530 | 264 |
265 " sanity checks | |
10211
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
266 if !executable(substitute(g:zip_zipcmd,'\s\+.*$','','')) |
1121 | 267 redraw! |
10211
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
268 echohl Error | echo "***error*** (zip#Write) sorry, your system doesn't appear to have the ".g:zip_zipcmd." program" | echohl None |
1121 | 269 " call inputsave()|call input("Press <cr> to continue")|call inputrestore() |
568 | 270 let &report= repkeep |
530 | 271 " call Dret("zip#Write") |
272 return | |
273 endif | |
274 if !exists("*mkdir") | |
1121 | 275 redraw! |
530 | 276 echohl Error | echo "***error*** (zip#Write) sorry, mkdir() doesn't work on your system" | echohl None |
1121 | 277 " call inputsave()|call input("Press <cr> to continue")|call inputrestore() |
568 | 278 let &report= repkeep |
530 | 279 " call Dret("zip#Write") |
280 return | |
281 endif | |
282 | |
283 let curdir= getcwd() | |
284 let tmpdir= tempname() | |
285 " call Decho("orig tempname<".tmpdir.">") | |
286 if tmpdir =~ '\.' | |
287 let tmpdir= substitute(tmpdir,'\.[^.]*$','','e') | |
288 endif | |
289 " call Decho("tmpdir<".tmpdir.">") | |
290 call mkdir(tmpdir,"p") | |
291 | |
292 " attempt to change to the indicated directory | |
1121 | 293 if s:ChgDir(tmpdir,s:ERROR,"(zip#Write) cannot cd to temporary directory") |
568 | 294 let &report= repkeep |
530 | 295 " call Dret("zip#Write") |
296 return | |
1121 | 297 endif |
530 | 298 " call Decho("current directory now: ".getcwd()) |
299 | |
300 " place temporary files under .../_ZIPVIM_/ | |
301 if isdirectory("_ZIPVIM_") | |
302 call s:Rmdir("_ZIPVIM_") | |
303 endif | |
304 call mkdir("_ZIPVIM_") | |
305 cd _ZIPVIM_ | |
306 " call Decho("current directory now: ".getcwd()) | |
307 | |
857 | 308 if has("unix") |
26148 | 309 let zipfile = substitute(a:fname,'zipfile://\(.\{-}\)::[^\\].*$','\1','') |
310 let fname = substitute(a:fname,'zipfile://.\{-}::\([^\\].*\)$','\1','') | |
857 | 311 else |
26148 | 312 let zipfile = substitute(a:fname,'^.\{-}zipfile://\(.\{-}\)::[^\\].*$','\1','') |
313 let fname = substitute(a:fname,'^.\{-}zipfile://.\{-}::\([^\\].*\)$','\1','') | |
857 | 314 endif |
315 " call Decho("zipfile<".zipfile.">") | |
316 " call Decho("fname <".fname.">") | |
623 | 317 |
318 if fname =~ '/' | |
319 let dirpath = substitute(fname,'/[^/]\+$','','e') | |
4339 | 320 if has("win32unix") && executable("cygpath") |
1668 | 321 let dirpath = substitute(system("cygpath ".s:Escape(dirpath,0)),'\n','','e') |
623 | 322 endif |
819 | 323 " call Decho("mkdir(dirpath<".dirpath.">,p)") |
623 | 324 call mkdir(dirpath,"p") |
325 endif | |
530 | 326 if zipfile !~ '/' |
327 let zipfile= curdir.'/'.zipfile | |
328 endif | |
329 " call Decho("zipfile<".zipfile."> fname<".fname.">") | |
330 | |
1668 | 331 exe "w! ".fnameescape(fname) |
4339 | 332 if has("win32unix") && executable("cygpath") |
1668 | 333 let zipfile = substitute(system("cygpath ".s:Escape(zipfile,0)),'\n','','e') |
530 | 334 endif |
335 | |
1121 | 336 if (has("win32") || has("win95") || has("win64") || has("win16")) && &shell !~? 'sh$' |
337 let fname = substitute(fname, '[', '[[]', 'g') | |
338 endif | |
339 | |
1698 | 340 " call Decho(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0)) |
341 call system(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0)) | |
530 | 342 if v:shell_error != 0 |
1121 | 343 redraw! |
530 | 344 echohl Error | echo "***error*** (zip#Write) sorry, unable to update ".zipfile." with ".fname | echohl None |
1121 | 345 " call inputsave()|call input("Press <cr> to continue")|call inputrestore() |
557 | 346 |
347 elseif s:zipfile_{winnr()} =~ '^\a\+://' | |
348 " support writing zipfiles across a network | |
349 let netzipfile= s:zipfile_{winnr()} | |
1121 | 350 " call Decho("handle writing <".zipfile."> across network as <".netzipfile.">") |
557 | 351 1split|enew |
352 let binkeep= &binary | |
353 let eikeep = &ei | |
354 set binary ei=all | |
19099 | 355 exe "noswapfile e! ".fnameescape(zipfile) |
557 | 356 call netrw#NetWrite(netzipfile) |
357 let &ei = eikeep | |
358 let &binary = binkeep | |
359 q! | |
360 unlet s:zipfile_{winnr()} | |
530 | 361 endif |
362 | |
363 " cleanup and restore current directory | |
364 cd .. | |
365 call s:Rmdir("_ZIPVIM_") | |
1121 | 366 call s:ChgDir(curdir,s:WARNING,"(zip#Write) unable to return to ".curdir."!") |
367 call s:Rmdir(tmpdir) | |
530 | 368 setlocal nomod |
369 | |
568 | 370 let &report= repkeep |
530 | 371 " call Dret("zip#Write") |
372 endfun | |
373 | |
374 " --------------------------------------------------------------------- | |
10211
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
375 " zip#Extract: extract a file from a zip archive {{{2 |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
376 fun! zip#Extract() |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
377 " call Dfunc("zip#Extract()") |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
378 |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
379 let repkeep= &report |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
380 set report=10 |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
381 let fname= getline(".") |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
382 " call Decho("fname<".fname.">") |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
383 |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
384 " sanity check |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
385 if fname =~ '^"' |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
386 let &report= repkeep |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
387 " call Dret("zip#Extract") |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
388 return |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
389 endif |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
390 if fname =~ '/$' |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
391 redraw! |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
392 echohl Error | echo "***error*** (zip#Extract) Please specify a file, not a directory" | echohl None |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
393 let &report= repkeep |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
394 " call Dret("zip#Extract") |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
395 return |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
396 endif |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
397 |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
398 " extract the file mentioned under the cursor |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
399 " call Decho("system(".g:zip_extractcmd." ".shellescape(b:zipfile)." ".shellescape(shell).")") |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
400 call system(g:zip_extractcmd." ".shellescape(b:zipfile)." ".shellescape(shell)) |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
401 " call Decho("zipfile<".b:zipfile.">") |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
402 if v:shell_error != 0 |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
403 echohl Error | echo "***error*** ".g:zip_extractcmd." ".b:zipfile." ".fname.": failed!" | echohl NONE |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
404 elseif !filereadable(fname) |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
405 echohl Error | echo "***error*** attempted to extract ".fname." but it doesn't appear to be present!" |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
406 else |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
407 echo "***note*** successfully extracted ".fname |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
408 endif |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
409 |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
410 " restore option |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
411 let &report= repkeep |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
412 |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
413 " call Dret("zip#Extract") |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
414 endfun |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
415 |
b7da8d4c594c
commit https://github.com/vim/vim/commit/d07969093a9b3051511c478d71c36de6fc33c0d6
Christian Brabandt <cb@256bit.org>
parents:
5130
diff
changeset
|
416 " --------------------------------------------------------------------- |
1668 | 417 " s:Escape: {{{2 |
418 fun! s:Escape(fname,isfilt) | |
419 " call Dfunc("QuoteFileDir(fname<".a:fname."> isfilt=".a:isfilt.")") | |
420 if exists("*shellescape") | |
421 if a:isfilt | |
422 let qnameq= shellescape(a:fname,1) | |
423 else | |
424 let qnameq= shellescape(a:fname) | |
425 endif | |
1621 | 426 else |
427 let qnameq= g:zip_shq.escape(a:fname,g:zip_shq).g:zip_shq | |
428 endif | |
429 " call Dret("QuoteFileDir <".qnameq.">") | |
430 return qnameq | |
1121 | 431 endfun |
432 | |
433 " --------------------------------------------------------------------- | |
434 " ChgDir: {{{2 | |
435 fun! s:ChgDir(newdir,errlvl,errmsg) | |
436 " call Dfunc("ChgDir(newdir<".a:newdir."> errlvl=".a:errlvl." errmsg<".a:errmsg.">)") | |
437 | |
438 try | |
1698 | 439 exe "cd ".fnameescape(a:newdir) |
1121 | 440 catch /^Vim\%((\a\+)\)\=:E344/ |
441 redraw! | |
442 if a:errlvl == s:NOTE | |
443 echo "***note*** ".a:errmsg | |
444 elseif a:errlvl == s:WARNING | |
445 echohl WarningMsg | echo "***warning*** ".a:errmsg | echohl NONE | |
446 elseif a:errlvl == s:ERROR | |
447 echohl Error | echo "***error*** ".a:errmsg | echohl NONE | |
448 endif | |
449 " call inputsave()|call input("Press <cr> to continue")|call inputrestore() | |
450 " call Dret("ChgDir 1") | |
451 return 1 | |
452 endtry | |
453 | |
454 " call Dret("ChgDir 0") | |
455 return 0 | |
456 endfun | |
457 | |
458 " --------------------------------------------------------------------- | |
1668 | 459 " s:Rmdir: {{{2 |
530 | 460 fun! s:Rmdir(fname) |
461 " call Dfunc("Rmdir(fname<".a:fname.">)") | |
1121 | 462 if (has("win32") || has("win95") || has("win64") || has("win16")) && &shell !~? 'sh$' |
1668 | 463 call system("rmdir /S/Q ".s:Escape(a:fname,0)) |
1121 | 464 else |
1668 | 465 call system("/bin/rm -rf ".s:Escape(a:fname,0)) |
530 | 466 endif |
467 " call Dret("Rmdir") | |
468 endfun | |
469 | |
470 " ------------------------------------------------------------------------ | |
471 " Modelines And Restoration: {{{1 | |
472 let &cpo= s:keepcpo | |
473 unlet s:keepcpo | |
1214 | 474 " vim:ts=8 fdm=marker |