Mercurial > vim
annotate runtime/autoload/vimball.vim @ 34603:02fbe0bd9418 v9.1.0193
patch 9.1.0193: May leak memory in completion when ga_grow() fails
Commit: https://github.com/vim/vim/commit/70e566b0bd29189b1baf3dc915b6a98de36fbded
Author: zeertzjq <zeertzjq@outlook.com>
Date: Thu Mar 21 07:11:58 2024 +0100
patch 9.1.0193: May leak memory in completion when ga_grow() fails
Problem: May leak memory in completion when ga_grow() fails.
Solution: Free "wca" when ga_grow() fails (zeertzjq).
fixes: #14248
closes: #14249
Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 21 Mar 2024 07:15:05 +0100 |
parents | 02bd0fe77c68 |
children |
rev | line source |
---|---|
1118 | 1 " vimball.vim : construct a file containing both paths and files |
34375
02bd0fe77c68
runtime(misc): announce adoption of various runtime files
Christian Brabandt <cb@256bit.org>
parents:
10228
diff
changeset
|
2 " Maintainer: This runtime file is looking for a new maintainer. |
02bd0fe77c68
runtime(misc): announce adoption of various runtime files
Christian Brabandt <cb@256bit.org>
parents:
10228
diff
changeset
|
3 " Original Author: Charles E. Campbell |
02bd0fe77c68
runtime(misc): announce adoption of various runtime files
Christian Brabandt <cb@256bit.org>
parents:
10228
diff
changeset
|
4 " Date: Apr 11, 2016 |
8876
47f17f66da3d
commit https://github.com/vim/vim/commit/03413f44167c4b5cd0012def9bb331e2518c83cf
Christian Brabandt <cb@256bit.org>
parents:
3281
diff
changeset
|
5 " Version: 37 |
792 | 6 " GetLatestVimScripts: 1502 1 :AutoInstall: vimball.vim |
8876
47f17f66da3d
commit https://github.com/vim/vim/commit/03413f44167c4b5cd0012def9bb331e2518c83cf
Christian Brabandt <cb@256bit.org>
parents:
3281
diff
changeset
|
7 " Copyright: (c) 2004-2011 by Charles E. Campbell |
792 | 8 " The VIM LICENSE applies to Vimball.vim, and Vimball.txt |
9 " (see |copyright|) except use "Vimball" instead of "Vim". | |
10 " No warranty, express or implied. | |
11 " *** *** Use At-Your-Own-Risk! *** *** | |
12 | |
13 " --------------------------------------------------------------------- | |
14 " Load Once: {{{1 | |
2034 | 15 if &cp || exists("g:loaded_vimball") |
792 | 16 finish |
17 endif | |
8876
47f17f66da3d
commit https://github.com/vim/vim/commit/03413f44167c4b5cd0012def9bb331e2518c83cf
Christian Brabandt <cb@256bit.org>
parents:
3281
diff
changeset
|
18 let g:loaded_vimball = "v37" |
2034 | 19 if v:version < 702 |
20 echohl WarningMsg | |
21 echo "***warning*** this version of vimball needs vim 7.2" | |
22 echohl Normal | |
23 finish | |
24 endif | |
25 let s:keepcpo= &cpo | |
792 | 26 set cpo&vim |
1618 | 27 "DechoTabOn |
792 | 28 |
29 " ===================================================================== | |
1118 | 30 " Constants: {{{1 |
31 if !exists("s:USAGE") | |
32 let s:USAGE = 0 | |
33 let s:WARNING = 1 | |
34 let s:ERROR = 2 | |
1618 | 35 |
36 " determine if cygwin is in use or not | |
37 if !exists("g:netrw_cygwin") | |
38 if has("win32") || has("win95") || has("win64") || has("win16") | |
39 if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$' | |
40 let g:netrw_cygwin= 1 | |
41 else | |
42 let g:netrw_cygwin= 0 | |
43 endif | |
44 else | |
45 let g:netrw_cygwin= 0 | |
46 endif | |
47 endif | |
48 | |
49 " set up g:vimball_mkdir if the mkdir() call isn't defined | |
50 if !exists("*mkdir") | |
51 if exists("g:netrw_local_mkdir") | |
52 let g:vimball_mkdir= g:netrw_local_mkdir | |
53 elseif executable("mkdir") | |
54 let g:vimball_mkdir= "mkdir" | |
55 elseif executable("makedir") | |
56 let g:vimball_mkdir= "makedir" | |
57 endif | |
58 if !exists(g:vimball_mkdir) | |
59 call vimball#ShowMesg(s:WARNING,"(vimball) g:vimball_mkdir undefined") | |
60 endif | |
61 endif | |
1118 | 62 endif |
63 | |
64 " ===================================================================== | |
792 | 65 " Functions: {{{1 |
66 | |
67 " --------------------------------------------------------------------- | |
1118 | 68 " vimball#MkVimball: creates a vimball given a list of paths to files {{{2 |
1618 | 69 " Input: |
70 " line1,line2: a range of lines containing paths to files to be included in the vimball | |
2908 | 71 " writelevel : if true, force a write to filename.vmb, even if it exists |
1618 | 72 " (usually accomplished with :MkVimball! ... |
2908 | 73 " filename : base name of file to be created (ie. filename.vmb) |
74 " Output: a filename.vmb using vimball format: | |
792 | 75 " path |
76 " filesize | |
77 " [file] | |
78 " path | |
79 " filesize | |
80 " [file] | |
1118 | 81 fun! vimball#MkVimball(line1,line2,writelevel,...) range |
82 " call Dfunc("MkVimball(line1=".a:line1." line2=".a:line2." writelevel=".a:writelevel." vimballname<".a:1.">) a:0=".a:0) | |
1618 | 83 if a:1 =~ '\.vim$' || a:1 =~ '\.txt$' |
2908 | 84 let vbname= substitute(a:1,'\.\a\{3}$','.vmb','') |
1118 | 85 else |
86 let vbname= a:1 | |
87 endif | |
2908 | 88 if vbname !~ '\.vmb$' |
89 let vbname= vbname.'.vmb' | |
1118 | 90 endif |
91 " call Decho("vbname<".vbname.">") | |
2034 | 92 if !a:writelevel && a:1 =~ '[\/]' |
93 call vimball#ShowMesg(s:ERROR,"(MkVimball) vimball name<".a:1."> should not include slashes; use ! to insist") | |
1118 | 94 " call Dret("MkVimball : vimball name<".a:1."> should not include slashes") |
95 return | |
96 endif | |
792 | 97 if !a:writelevel && filereadable(vbname) |
1118 | 98 call vimball#ShowMesg(s:ERROR,"(MkVimball) file<".vbname."> exists; use ! to insist") |
792 | 99 " call Dret("MkVimball : file<".vbname."> already exists; use ! to insist") |
100 return | |
101 endif | |
102 | |
103 " user option bypass | |
1618 | 104 call vimball#SaveSettings() |
792 | 105 |
1118 | 106 if a:0 >= 2 |
107 " allow user to specify where to get the files | |
108 let home= expand(a:2) | |
109 else | |
110 " use first existing directory from rtp | |
2034 | 111 let home= vimball#VimballHome() |
844 | 112 endif |
113 | |
114 " save current directory | |
792 | 115 let curdir = getcwd() |
844 | 116 call s:ChgDir(home) |
792 | 117 |
118 " record current tab, initialize while loop index | |
119 let curtabnr = tabpagenr() | |
120 let linenr = a:line1 | |
121 " call Decho("curtabnr=".curtabnr) | |
122 | |
123 while linenr <= a:line2 | |
124 let svfile = getline(linenr) | |
125 " call Decho("svfile<".svfile.">") | |
126 | |
127 if !filereadable(svfile) | |
1118 | 128 call vimball#ShowMesg(s:ERROR,"unable to read file<".svfile.">") |
844 | 129 call s:ChgDir(curdir) |
1618 | 130 call vimball#RestoreSettings() |
792 | 131 " call Dret("MkVimball") |
132 return | |
133 endif | |
134 | |
135 " create/switch to mkvimball tab | |
136 if !exists("vbtabnr") | |
137 tabnew | |
2908 | 138 sil! file Vimball |
792 | 139 let vbtabnr= tabpagenr() |
140 else | |
141 exe "tabn ".vbtabnr | |
142 endif | |
143 | |
144 let lastline= line("$") + 1 | |
145 if lastline == 2 && getline("$") == "" | |
8876
47f17f66da3d
commit https://github.com/vim/vim/commit/03413f44167c4b5cd0012def9bb331e2518c83cf
Christian Brabandt <cb@256bit.org>
parents:
3281
diff
changeset
|
146 call setline(1,'" Vimball Archiver by Charles E. Campbell') |
792 | 147 call setline(2,'UseVimball') |
148 call setline(3,'finish') | |
1118 | 149 let lastline= line("$") + 1 |
792 | 150 endif |
1118 | 151 call setline(lastline ,substitute(svfile,'$',' [[[1','')) |
792 | 152 call setline(lastline+1,0) |
844 | 153 |
154 " write the file from the tab | |
1698 | 155 " call Decho("exe $r ".fnameescape(svfile)) |
156 exe "$r ".fnameescape(svfile) | |
844 | 157 |
792 | 158 call setline(lastline+1,line("$") - lastline - 1) |
159 " call Decho("lastline=".lastline." line$=".line("$")) | |
160 | |
161 " restore to normal tab | |
162 exe "tabn ".curtabnr | |
163 let linenr= linenr + 1 | |
164 endwhile | |
165 | |
166 " write the vimball | |
167 exe "tabn ".vbtabnr | |
844 | 168 call s:ChgDir(curdir) |
1618 | 169 setlocal ff=unix |
796 | 170 if a:writelevel |
1698 | 171 " call Decho("exe w! ".fnameescape(vbname)) |
172 exe "w! ".fnameescape(vbname) | |
796 | 173 else |
1698 | 174 " call Decho("exe w ".fnameescape(vbname)) |
175 exe "w ".fnameescape(vbname) | |
792 | 176 endif |
177 " call Decho("Vimball<".vbname."> created") | |
178 echo "Vimball<".vbname."> created" | |
179 | |
180 " remove the evidence | |
181 setlocal nomod bh=wipe | |
182 exe "tabn ".curtabnr | |
8876
47f17f66da3d
commit https://github.com/vim/vim/commit/03413f44167c4b5cd0012def9bb331e2518c83cf
Christian Brabandt <cb@256bit.org>
parents:
3281
diff
changeset
|
183 exe "tabc! ".vbtabnr |
792 | 184 |
185 " restore options | |
1618 | 186 call vimball#RestoreSettings() |
792 | 187 |
188 " call Dret("MkVimball") | |
189 endfun | |
190 | |
191 " --------------------------------------------------------------------- | |
1118 | 192 " vimball#Vimball: extract and distribute contents from a vimball {{{2 |
1618 | 193 " (invoked the the UseVimball command embedded in |
194 " vimballs' prologue) | |
1118 | 195 fun! vimball#Vimball(really,...) |
196 " call Dfunc("vimball#Vimball(really=".a:really.") a:0=".a:0) | |
792 | 197 |
1698 | 198 if v:version < 701 || (v:version == 701 && !exists('*fnameescape')) |
2908 | 199 echoerr "your vim is missing the fnameescape() function (pls upgrade to vim 7.2 or later)" |
200 " call Dret("vimball#Vimball : needs 7.1 with patch 299 or later") | |
1618 | 201 return |
202 endif | |
203 | |
2034 | 204 if getline(1) !~ '^" Vimball Archiver' |
792 | 205 echoerr "(Vimball) The current file does not appear to be a Vimball!" |
1118 | 206 " call Dret("vimball#Vimball") |
792 | 207 return |
208 endif | |
209 | |
845 | 210 " set up standard settings |
1618 | 211 call vimball#SaveSettings() |
212 let curtabnr = tabpagenr() | |
213 let vimballfile = expand("%:tr") | |
792 | 214 |
215 " set up vimball tab | |
1118 | 216 " call Decho("setting up vimball tab") |
792 | 217 tabnew |
2908 | 218 sil! file Vimball |
792 | 219 let vbtabnr= tabpagenr() |
220 let didhelp= "" | |
221 | |
222 " go to vim plugin home | |
1118 | 223 if a:0 > 0 |
3153 | 224 " let user specify the directory where the vimball is to be unpacked. |
225 " If, however, the user did not specify a full path, set the home to be below the current directory | |
1118 | 226 let home= expand(a:1) |
3153 | 227 if has("win32") || has("win95") || has("win64") || has("win16") |
228 if home !~ '^\a:[/\\]' | |
229 let home= getcwd().'/'.a:1 | |
230 endif | |
231 elseif home !~ '^/' | |
232 let home= getcwd().'/'.a:1 | |
233 endif | |
1118 | 234 else |
2034 | 235 let home= vimball#VimballHome() |
844 | 236 endif |
237 " call Decho("home<".home.">") | |
238 | |
1118 | 239 " save current directory and remove older same-named vimball, if any |
792 | 240 let curdir = getcwd() |
1118 | 241 " call Decho("home<".home.">") |
242 " call Decho("curdir<".curdir.">") | |
243 | |
844 | 244 call s:ChgDir(home) |
1618 | 245 let s:ok_unablefind= 1 |
246 call vimball#RmVimball(vimballfile) | |
247 unlet s:ok_unablefind | |
844 | 248 |
792 | 249 let linenr = 4 |
250 let filecnt = 0 | |
251 | |
252 " give title to listing of (extracted) files from Vimball Archive | |
253 if a:really | |
1618 | 254 echohl Title | echomsg "Vimball Archive" | echohl None |
255 else | |
256 echohl Title | echomsg "Vimball Archive Listing" | echohl None | |
845 | 257 echohl Statement | echomsg "files would be placed under: ".home | echohl None |
792 | 258 endif |
259 | |
260 " apportion vimball contents to various files | |
261 " call Decho("exe tabn ".curtabnr) | |
262 exe "tabn ".curtabnr | |
263 " call Decho("linenr=".linenr." line$=".line("$")) | |
264 while 1 < linenr && linenr < line("$") | |
1118 | 265 let fname = substitute(getline(linenr),'\t\[\[\[1$','','') |
266 let fname = substitute(fname,'\\','/','g') | |
2034 | 267 let fsize = substitute(getline(linenr+1),'^\(\d\+\).\{-}$','\1','')+0 |
2908 | 268 let fenc = substitute(getline(linenr+1),'^\d\+\s*\(\S\{-}\)$','\1','') |
792 | 269 let filecnt = filecnt + 1 |
2908 | 270 " call Decho("fname<".fname."> fsize=".fsize." filecnt=".filecnt. " fenc=".fenc) |
1118 | 271 |
792 | 272 if a:really |
273 echomsg "extracted <".fname.">: ".fsize." lines" | |
274 else | |
275 echomsg "would extract <".fname.">: ".fsize." lines" | |
276 endif | |
842 | 277 " call Decho("using L#".linenr.": will extract file<".fname.">") |
278 " call Decho("using L#".(linenr+1).": fsize=".fsize) | |
792 | 279 |
1118 | 280 " Allow AsNeeded/ directory to take place of plugin/ directory |
1618 | 281 " when AsNeeded/filename is filereadable or was present in VimballRecord |
1118 | 282 if fname =~ '\<plugin/' |
283 let anfname= substitute(fname,'\<plugin/','AsNeeded/','') | |
8876
47f17f66da3d
commit https://github.com/vim/vim/commit/03413f44167c4b5cd0012def9bb331e2518c83cf
Christian Brabandt <cb@256bit.org>
parents:
3281
diff
changeset
|
284 if filereadable(anfname) || (exists("s:VBRstring") && s:VBRstring =~# anfname) |
1118 | 285 " call Decho("using anfname<".anfname."> instead of <".fname.">") |
286 let fname= anfname | |
287 endif | |
288 endif | |
289 | |
792 | 290 " make directories if they don't exist yet |
845 | 291 if a:really |
1118 | 292 " call Decho("making directories if they don't exist yet (fname<".fname.">)") |
293 let fnamebuf= substitute(fname,'\\','/','g') | |
294 let dirpath = substitute(home,'\\','/','g') | |
3153 | 295 " call Decho("init: fnamebuf<".fnamebuf.">") |
296 " call Decho("init: dirpath <".dirpath.">") | |
845 | 297 while fnamebuf =~ '/' |
1118 | 298 let dirname = dirpath."/".substitute(fnamebuf,'/.*$','','') |
299 let dirpath = dirname | |
300 let fnamebuf = substitute(fnamebuf,'^.\{-}/\(.*\)$','\1','') | |
301 " call Decho("dirname<".dirname.">") | |
3153 | 302 " call Decho("dirpath<".dirpath.">") |
845 | 303 if !isdirectory(dirname) |
1118 | 304 " call Decho("making <".dirname.">") |
1618 | 305 if exists("g:vimball_mkdir") |
2034 | 306 call system(g:vimball_mkdir." ".shellescape(dirname)) |
1618 | 307 else |
308 call mkdir(dirname) | |
309 endif | |
1118 | 310 call s:RecordInVar(home,"rmdir('".dirname."')") |
845 | 311 endif |
312 endwhile | |
313 endif | |
844 | 314 call s:ChgDir(home) |
792 | 315 |
316 " grab specified qty of lines and place into "a" buffer | |
842 | 317 " (skip over path/filename and qty-lines) |
318 let linenr = linenr + 2 | |
319 let lastline = linenr + fsize - 1 | |
320 " call Decho("exe ".linenr.",".lastline."yank a") | |
2908 | 321 " no point in handling a zero-length file |
322 if lastline >= linenr | |
323 exe "silent ".linenr.",".lastline."yank a" | |
792 | 324 |
2908 | 325 " copy "a" buffer into tab |
792 | 326 " call Decho('copy "a buffer into tab#'.vbtabnr) |
2908 | 327 exe "tabn ".vbtabnr |
328 setlocal ma | |
329 sil! %d | |
330 silent put a | |
331 1 | |
332 sil! d | |
792 | 333 |
2908 | 334 " write tab to file |
335 if a:really | |
336 let fnamepath= home."/".fname | |
1618 | 337 " call Decho("exe w! ".fnameescape(fnamepath)) |
2034 | 338 if fenc != "" |
339 exe "silent w! ++enc=".fnameescape(fenc)." ".fnameescape(fnamepath) | |
340 else | |
341 exe "silent w! ".fnameescape(fnamepath) | |
342 endif | |
343 echo "wrote ".fnameescape(fnamepath) | |
344 call s:RecordInVar(home,"call delete('".fnamepath."')") | |
2908 | 345 endif |
792 | 346 |
2908 | 347 " return to tab with vimball |
792 | 348 " call Decho("exe tabn ".curtabnr) |
2908 | 349 exe "tabn ".curtabnr |
842 | 350 |
10228
8a1481e59d64
commit https://github.com/vim/vim/commit/3e496b0ea31996b665824f45664dee1fdd73c4d0
Christian Brabandt <cb@256bit.org>
parents:
8876
diff
changeset
|
351 " set up help if it's a doc/*.txt file |
842 | 352 " call Decho("didhelp<".didhelp."> fname<".fname.">") |
2908 | 353 if a:really && didhelp == "" && fname =~ 'doc/[^/]\+\.\(txt\|..x\)$' |
354 let didhelp= substitute(fname,'^\(.*\<doc\)[/\\][^.]*\.\(txt\|..x\)$','\1','') | |
842 | 355 " call Decho("didhelp<".didhelp.">") |
2908 | 356 endif |
842 | 357 endif |
358 | |
359 " update for next file | |
1618 | 360 " call Decho("update linenr= [linenr=".linenr."] + [fsize=".fsize."] = ".(linenr+fsize)) |
361 let linenr= linenr + fsize | |
792 | 362 endwhile |
363 | |
364 " set up help | |
365 " call Decho("about to set up help: didhelp<".didhelp.">") | |
366 if didhelp != "" | |
1698 | 367 let htpath= home."/".didhelp |
844 | 368 " call Decho("exe helptags ".htpath) |
1698 | 369 exe "helptags ".fnameescape(htpath) |
844 | 370 echo "did helptags" |
792 | 371 endif |
372 | |
373 " make sure a "Press ENTER..." prompt appears to keep the messages showing! | |
796 | 374 while filecnt <= &ch |
792 | 375 echomsg " " |
376 let filecnt= filecnt + 1 | |
377 endwhile | |
378 | |
1118 | 379 " record actions in <.VimballRecord> |
380 call s:RecordInFile(home) | |
381 | |
792 | 382 " restore events, delete tab and buffer |
8876
47f17f66da3d
commit https://github.com/vim/vim/commit/03413f44167c4b5cd0012def9bb331e2518c83cf
Christian Brabandt <cb@256bit.org>
parents:
3281
diff
changeset
|
383 exe "sil! tabn ".vbtabnr |
792 | 384 setlocal nomod bh=wipe |
8876
47f17f66da3d
commit https://github.com/vim/vim/commit/03413f44167c4b5cd0012def9bb331e2518c83cf
Christian Brabandt <cb@256bit.org>
parents:
3281
diff
changeset
|
385 exe "sil! tabn ".curtabnr |
47f17f66da3d
commit https://github.com/vim/vim/commit/03413f44167c4b5cd0012def9bb331e2518c83cf
Christian Brabandt <cb@256bit.org>
parents:
3281
diff
changeset
|
386 exe "sil! tabc! ".vbtabnr |
1618 | 387 call vimball#RestoreSettings() |
844 | 388 call s:ChgDir(curdir) |
792 | 389 |
1118 | 390 " call Dret("vimball#Vimball") |
391 endfun | |
392 | |
393 " --------------------------------------------------------------------- | |
394 " vimball#RmVimball: remove any files, remove any directories made by any {{{2 | |
395 " previous vimball extraction based on a file of the current | |
396 " name. | |
397 " Usage: RmVimball (assume current file is a vimball; remove) | |
398 " RmVimball vimballname | |
399 fun! vimball#RmVimball(...) | |
400 " call Dfunc("vimball#RmVimball() a:0=".a:0) | |
401 if exists("g:vimball_norecord") | |
402 " call Dret("vimball#RmVimball : (g:vimball_norecord)") | |
403 return | |
404 endif | |
405 | |
406 if a:0 == 0 | |
1618 | 407 let curfile= expand("%:tr") |
408 " call Decho("case a:0=0: curfile<".curfile."> (used expand(%:tr))") | |
1118 | 409 else |
410 if a:1 =~ '[\/]' | |
411 call vimball#ShowMesg(s:USAGE,"RmVimball vimballname [path]") | |
412 " call Dret("vimball#RmVimball : suspect a:1<".a:1.">") | |
413 return | |
414 endif | |
415 let curfile= a:1 | |
1618 | 416 " call Decho("case a:0=".a:0.": curfile<".curfile.">") |
1118 | 417 endif |
2908 | 418 if curfile =~ '\.vmb$' |
419 let curfile= substitute(curfile,'\.vmb','','') | |
420 elseif curfile =~ '\.vba$' | |
1618 | 421 let curfile= substitute(curfile,'\.vba','','') |
1118 | 422 endif |
423 if a:0 >= 2 | |
424 let home= expand(a:2) | |
425 else | |
2034 | 426 let home= vimball#VimballHome() |
1118 | 427 endif |
428 let curdir = getcwd() | |
429 " call Decho("home <".home.">") | |
430 " call Decho("curfile<".curfile.">") | |
431 " call Decho("curdir <".curdir.">") | |
432 | |
433 call s:ChgDir(home) | |
434 if filereadable(".VimballRecord") | |
435 " call Decho(".VimballRecord is readable") | |
436 " call Decho("curfile<".curfile.">") | |
437 keepalt keepjumps 1split | |
2908 | 438 sil! keepalt keepjumps e .VimballRecord |
1118 | 439 let keepsrch= @/ |
2034 | 440 " call Decho('search for ^\M'.curfile.'.\m: ') |
2908 | 441 " call Decho('search for ^\M'.curfile.'.\m{vba|vmb}: ') |
442 " call Decho('search for ^\M'.curfile.'\m[-0-9.]*\.{vba|vmb}: ') | |
2034 | 443 if search('^\M'.curfile."\m: ".'cw') |
1618 | 444 let foundit= 1 |
2908 | 445 elseif search('^\M'.curfile.".\mvmb: ",'cw') |
446 let foundit= 2 | |
447 elseif search('^\M'.curfile.'\m[-0-9.]*\.vmb: ','cw') | |
448 let foundit= 2 | |
2034 | 449 elseif search('^\M'.curfile.".\mvba: ",'cw') |
1618 | 450 let foundit= 1 |
2034 | 451 elseif search('^\M'.curfile.'\m[-0-9.]*\.vba: ','cw') |
1618 | 452 let foundit= 1 |
453 else | |
454 let foundit = 0 | |
455 endif | |
456 if foundit | |
2908 | 457 if foundit == 1 |
458 let exestring = substitute(getline("."),'^\M'.curfile.'\m\S\{-}\.vba: ','','') | |
459 else | |
460 let exestring = substitute(getline("."),'^\M'.curfile.'\m\S\{-}\.vmb: ','','') | |
461 endif | |
1618 | 462 let s:VBRstring= substitute(exestring,'call delete(','','g') |
463 let s:VBRstring= substitute(s:VBRstring,"[')]",'','g') | |
1118 | 464 " call Decho("exe ".exestring) |
2908 | 465 sil! keepalt keepjumps exe exestring |
466 sil! keepalt keepjumps d | |
1618 | 467 let exestring= strlen(substitute(exestring,'call delete(.\{-})|\=',"D","g")) |
468 " call Decho("exestring<".exestring.">") | |
469 echomsg "removed ".exestring." files" | |
1118 | 470 else |
1618 | 471 let s:VBRstring= '' |
2908 | 472 let curfile = substitute(curfile,'\.vmb','','') |
1618 | 473 " call Decho("unable to find <".curfile."> in .VimballRecord") |
474 if !exists("s:ok_unablefind") | |
475 call vimball#ShowMesg(s:WARNING,"(RmVimball) unable to find <".curfile."> in .VimballRecord") | |
476 endif | |
1118 | 477 endif |
2908 | 478 sil! keepalt keepjumps g/^\s*$/d |
479 sil! keepalt keepjumps wq! | |
1118 | 480 let @/= keepsrch |
481 endif | |
482 call s:ChgDir(curdir) | |
483 | |
484 " call Dret("vimball#RmVimball") | |
792 | 485 endfun |
486 | |
843 | 487 " --------------------------------------------------------------------- |
488 " vimball#Decompress: attempts to automatically decompress vimballs {{{2 | |
2034 | 489 fun! vimball#Decompress(fname,...) |
490 " call Dfunc("Decompress(fname<".a:fname.">) a:0=".a:0) | |
843 | 491 |
492 " decompression: | |
493 if expand("%") =~ '.*\.gz' && executable("gunzip") | |
1618 | 494 " handle *.gz with gunzip |
2034 | 495 silent exe "!gunzip ".shellescape(a:fname) |
1618 | 496 if v:shell_error != 0 |
497 call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) gunzip may have failed with <".a:fname.">") | |
498 endif | |
499 let fname= substitute(a:fname,'\.gz$','','') | |
500 exe "e ".escape(fname,' \') | |
2034 | 501 if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif |
1618 | 502 |
503 elseif expand("%") =~ '.*\.gz' && executable("gzip") | |
504 " handle *.gz with gzip -d | |
2034 | 505 silent exe "!gzip -d ".shellescape(a:fname) |
1618 | 506 if v:shell_error != 0 |
507 call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "gzip -d" may have failed with <'.a:fname.">") | |
508 endif | |
843 | 509 let fname= substitute(a:fname,'\.gz$','','') |
844 | 510 exe "e ".escape(fname,' \') |
2034 | 511 if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif |
1618 | 512 |
843 | 513 elseif expand("%") =~ '.*\.bz2' && executable("bunzip2") |
1618 | 514 " handle *.bz2 with bunzip2 |
2034 | 515 silent exe "!bunzip2 ".shellescape(a:fname) |
1618 | 516 if v:shell_error != 0 |
517 call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) bunzip2 may have failed with <".a:fname.">") | |
518 endif | |
843 | 519 let fname= substitute(a:fname,'\.bz2$','','') |
844 | 520 exe "e ".escape(fname,' \') |
2034 | 521 if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif |
1618 | 522 |
523 elseif expand("%") =~ '.*\.bz2' && executable("bzip2") | |
524 " handle *.bz2 with bzip2 -d | |
2034 | 525 silent exe "!bzip2 -d ".shellescape(a:fname) |
1618 | 526 if v:shell_error != 0 |
527 call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "bzip2 -d" may have failed with <'.a:fname.">") | |
528 endif | |
529 let fname= substitute(a:fname,'\.bz2$','','') | |
530 exe "e ".escape(fname,' \') | |
2034 | 531 if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif |
1618 | 532 |
843 | 533 elseif expand("%") =~ '.*\.zip' && executable("unzip") |
1618 | 534 " handle *.zip with unzip |
2034 | 535 silent exe "!unzip ".shellescape(a:fname) |
1618 | 536 if v:shell_error != 0 |
537 call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) unzip may have failed with <".a:fname.">") | |
538 endif | |
843 | 539 let fname= substitute(a:fname,'\.zip$','','') |
844 | 540 exe "e ".escape(fname,' \') |
2034 | 541 if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif |
843 | 542 endif |
1618 | 543 |
2034 | 544 if a:0 == 0| setlocal noma bt=nofile fmr=[[[,]]] fdm=marker | endif |
843 | 545 |
546 " call Dret("Decompress") | |
547 endfun | |
548 | |
844 | 549 " --------------------------------------------------------------------- |
1118 | 550 " vimball#ShowMesg: {{{2 |
551 fun! vimball#ShowMesg(level,msg) | |
552 " call Dfunc("vimball#ShowMesg(level=".a:level." msg<".a:msg.">)") | |
2034 | 553 |
1118 | 554 let rulerkeep = &ruler |
555 let showcmdkeep = &showcmd | |
556 set noruler noshowcmd | |
557 redraw! | |
558 | |
8876
47f17f66da3d
commit https://github.com/vim/vim/commit/03413f44167c4b5cd0012def9bb331e2518c83cf
Christian Brabandt <cb@256bit.org>
parents:
3281
diff
changeset
|
559 if &fo =~# '[ta]' |
2034 | 560 echomsg "***vimball*** ".a:msg |
1118 | 561 else |
562 if a:level == s:WARNING || a:level == s:USAGE | |
563 echohl WarningMsg | |
564 elseif a:level == s:ERROR | |
565 echohl Error | |
566 endif | |
2034 | 567 echomsg "***vimball*** ".a:msg |
1118 | 568 echohl None |
569 endif | |
570 | |
571 if a:level != s:USAGE | |
572 call inputsave()|let ok= input("Press <cr> to continue")|call inputrestore() | |
573 endif | |
574 | |
575 let &ruler = rulerkeep | |
576 let &showcmd = showcmdkeep | |
577 | |
578 " call Dret("vimball#ShowMesg") | |
579 endfun | |
580 " ===================================================================== | |
581 " s:ChgDir: change directory (in spite of Windoze) {{{2 | |
844 | 582 fun! s:ChgDir(newdir) |
583 " call Dfunc("ChgDir(newdir<".a:newdir.">)") | |
584 if (has("win32") || has("win95") || has("win64") || has("win16")) | |
3153 | 585 try |
586 exe 'silent cd '.fnameescape(substitute(a:newdir,'/','\\','g')) | |
587 catch /^Vim\%((\a\+)\)\=:E/ | |
588 call mkdir(fnameescape(substitute(a:newdir,'/','\\','g'))) | |
589 exe 'silent cd '.fnameescape(substitute(a:newdir,'/','\\','g')) | |
590 endtry | |
844 | 591 else |
3153 | 592 try |
593 exe 'silent cd '.fnameescape(a:newdir) | |
594 catch /^Vim\%((\a\+)\)\=:E/ | |
595 call mkdir(fnameescape(a:newdir)) | |
596 exe 'silent cd '.fnameescape(a:newdir) | |
597 endtry | |
844 | 598 endif |
1618 | 599 " call Dret("ChgDir : curdir<".getcwd().">") |
844 | 600 endfun |
601 | |
602 " --------------------------------------------------------------------- | |
1118 | 603 " s:RecordInVar: record a un-vimball command in the .VimballRecord file {{{2 |
604 fun! s:RecordInVar(home,cmd) | |
605 " call Dfunc("RecordInVar(home<".a:home."> cmd<".a:cmd.">)") | |
606 if a:cmd =~ '^rmdir' | |
607 " if !exists("s:recorddir") | |
608 " let s:recorddir= substitute(a:cmd,'^rmdir',"call s:Rmdir",'') | |
609 " else | |
610 " let s:recorddir= s:recorddir."|".substitute(a:cmd,'^rmdir',"call s:Rmdir",'') | |
611 " endif | |
612 elseif !exists("s:recordfile") | |
613 let s:recordfile= a:cmd | |
614 else | |
615 let s:recordfile= s:recordfile."|".a:cmd | |
616 endif | |
1618 | 617 " call Dret("RecordInVar : s:recordfile<".(exists("s:recordfile")? s:recordfile : "")."> s:recorddir<".(exists("s:recorddir")? s:recorddir : "").">") |
1118 | 618 endfun |
619 | |
620 " --------------------------------------------------------------------- | |
621 " s:RecordInFile: {{{2 | |
622 fun! s:RecordInFile(home) | |
1618 | 623 " call Dfunc("s:RecordInFile()") |
1118 | 624 if exists("g:vimball_norecord") |
1618 | 625 " call Dret("s:RecordInFile : g:vimball_norecord") |
1118 | 626 return |
627 endif | |
628 | |
629 if exists("s:recordfile") || exists("s:recorddir") | |
630 let curdir= getcwd() | |
631 call s:ChgDir(a:home) | |
632 keepalt keepjumps 1split | |
1618 | 633 |
1118 | 634 let cmd= expand("%:tr").": " |
1618 | 635 " call Decho("cmd<".cmd.">") |
636 | |
2908 | 637 sil! keepalt keepjumps e .VimballRecord |
1618 | 638 setlocal ma |
1118 | 639 $ |
640 if exists("s:recordfile") && exists("s:recorddir") | |
641 let cmd= cmd.s:recordfile."|".s:recorddir | |
642 elseif exists("s:recorddir") | |
643 let cmd= cmd.s:recorddir | |
644 elseif exists("s:recordfile") | |
645 let cmd= cmd.s:recordfile | |
646 else | |
1618 | 647 " call Dret("s:RecordInFile : neither recordfile nor recorddir exist") |
1118 | 648 return |
649 endif | |
1618 | 650 " call Decho("cmd<".cmd.">") |
651 | |
652 " put command into buffer, write .VimballRecord `file | |
1118 | 653 keepalt keepjumps put=cmd |
2908 | 654 sil! keepalt keepjumps g/^\s*$/d |
655 sil! keepalt keepjumps wq! | |
1118 | 656 call s:ChgDir(curdir) |
1618 | 657 |
658 if exists("s:recorddir") | |
659 " call Decho("unlet s:recorddir<".s:recorddir.">") | |
660 unlet s:recorddir | |
661 endif | |
662 if exists("s:recordfile") | |
663 " call Decho("unlet s:recordfile<".s:recordfile.">") | |
664 unlet s:recordfile | |
665 endif | |
1118 | 666 else |
667 " call Decho("s:record[file|dir] doesn't exist") | |
668 endif | |
669 | |
1618 | 670 " call Dret("s:RecordInFile") |
1118 | 671 endfun |
672 | |
673 " --------------------------------------------------------------------- | |
2034 | 674 " vimball#VimballHome: determine/get home directory path (usually from rtp) {{{2 |
675 fun! vimball#VimballHome() | |
676 " call Dfunc("vimball#VimballHome()") | |
1118 | 677 if exists("g:vimball_home") |
678 let home= g:vimball_home | |
679 else | |
680 " go to vim plugin home | |
681 for home in split(&rtp,',') + [''] | |
682 if isdirectory(home) && filewritable(home) | break | endif | |
1618 | 683 let basehome= substitute(home,'[/\\]\.vim$','','') |
684 if isdirectory(basehome) && filewritable(basehome) | |
685 let home= basehome."/.vim" | |
686 break | |
687 endif | |
1118 | 688 endfor |
689 if home == "" | |
690 " just pick the first directory | |
691 let home= substitute(&rtp,',.*$','','') | |
692 endif | |
693 if (has("win32") || has("win95") || has("win64") || has("win16")) | |
694 let home= substitute(home,'/','\\','g') | |
695 endif | |
696 endif | |
1618 | 697 " insure that the home directory exists |
698 " call Decho("picked home<".home.">") | |
699 if !isdirectory(home) | |
700 if exists("g:vimball_mkdir") | |
701 " call Decho("home<".home."> isn't a directory -- making it now with g:vimball_mkdir<".g:vimball_mkdir.">") | |
2034 | 702 " call Decho("system(".g:vimball_mkdir." ".shellescape(home).")") |
703 call system(g:vimball_mkdir." ".shellescape(home)) | |
1618 | 704 else |
705 " call Decho("home<".home."> isn't a directory -- making it now with mkdir()") | |
706 call mkdir(home) | |
707 endif | |
708 endif | |
2034 | 709 " call Dret("vimball#VimballHome <".home.">") |
1118 | 710 return home |
844 | 711 endfun |
712 | |
713 " --------------------------------------------------------------------- | |
1618 | 714 " vimball#SaveSettings: {{{2 |
715 fun! vimball#SaveSettings() | |
845 | 716 " call Dfunc("SaveSettings()") |
717 let s:makeep = getpos("'a") | |
718 let s:regakeep= @a | |
8876
47f17f66da3d
commit https://github.com/vim/vim/commit/03413f44167c4b5cd0012def9bb331e2518c83cf
Christian Brabandt <cb@256bit.org>
parents:
3281
diff
changeset
|
719 if exists("+acd") |
857 | 720 let s:acdkeep = &acd |
721 endif | |
845 | 722 let s:eikeep = &ei |
1698 | 723 let s:fenkeep = &l:fen |
845 | 724 let s:hidkeep = &hidden |
725 let s:ickeep = &ic | |
1186 | 726 let s:lzkeep = &lz |
727 let s:pmkeep = &pm | |
845 | 728 let s:repkeep = &report |
729 let s:vekeep = &ve | |
1698 | 730 let s:ffkeep = &l:ff |
2908 | 731 let s:swfkeep = &l:swf |
8876
47f17f66da3d
commit https://github.com/vim/vim/commit/03413f44167c4b5cd0012def9bb331e2518c83cf
Christian Brabandt <cb@256bit.org>
parents:
3281
diff
changeset
|
732 if exists("+acd") |
2908 | 733 setlocal ei=all ve=all noacd nofen noic report=999 nohid bt= ma lz pm= ff=unix noswf |
857 | 734 else |
2908 | 735 setlocal ei=all ve=all nofen noic report=999 nohid bt= ma lz pm= ff=unix noswf |
857 | 736 endif |
1618 | 737 " vimballs should be in unix format |
738 setlocal ff=unix | |
845 | 739 " call Dret("SaveSettings") |
740 endfun | |
741 | |
742 " --------------------------------------------------------------------- | |
1618 | 743 " vimball#RestoreSettings: {{{2 |
744 fun! vimball#RestoreSettings() | |
845 | 745 " call Dfunc("RestoreSettings()") |
746 let @a = s:regakeep | |
8876
47f17f66da3d
commit https://github.com/vim/vim/commit/03413f44167c4b5cd0012def9bb331e2518c83cf
Christian Brabandt <cb@256bit.org>
parents:
3281
diff
changeset
|
747 if exists("+acd") |
857 | 748 let &acd = s:acdkeep |
749 endif | |
1698 | 750 let &l:fen = s:fenkeep |
845 | 751 let &hidden = s:hidkeep |
752 let &ic = s:ickeep | |
1118 | 753 let &lz = s:lzkeep |
1186 | 754 let &pm = s:pmkeep |
845 | 755 let &report = s:repkeep |
756 let &ve = s:vekeep | |
1118 | 757 let &ei = s:eikeep |
1698 | 758 let &l:ff = s:ffkeep |
845 | 759 if s:makeep[0] != 0 |
760 " restore mark a | |
761 " call Decho("restore mark-a: makeep=".string(makeep)) | |
762 call setpos("'a",s:makeep) | |
763 endif | |
8876
47f17f66da3d
commit https://github.com/vim/vim/commit/03413f44167c4b5cd0012def9bb331e2518c83cf
Christian Brabandt <cb@256bit.org>
parents:
3281
diff
changeset
|
764 if exists("+acd") |
1618 | 765 unlet s:acdkeep |
857 | 766 endif |
1618 | 767 unlet s:regakeep s:eikeep s:fenkeep s:hidkeep s:ickeep s:repkeep s:vekeep s:makeep s:lzkeep s:pmkeep s:ffkeep |
845 | 768 " call Dret("RestoreSettings") |
769 endfun | |
770 | |
3281 | 771 let &cpo = s:keepcpo |
772 unlet s:keepcpo | |
773 | |
845 | 774 " --------------------------------------------------------------------- |
792 | 775 " Modelines: {{{1 |
776 " vim: fdm=marker |