blob: 4f6292b9c090f458091d548cc55495ee15a52f23 [file] [log] [blame]
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +00001" vimball.vim : construct a file containing both paths and files
2" Author: Charles E. Campbell, Jr.
Bram Moolenaare37d50a2008-08-06 17:06:04 +00003" Date: Jul 30, 2008
4" Version: 29
Bram Moolenaareee697b2006-03-21 21:20:39 +00005" GetLatestVimScripts: 1502 1 :AutoInstall: vimball.vim
Bram Moolenaarf2330482008-06-24 20:19:36 +00006" Copyright: (c) 2004-2008 by Charles E. Campbell, Jr.
Bram Moolenaareee697b2006-03-21 21:20:39 +00007" The VIM LICENSE applies to Vimball.vim, and Vimball.txt
8" (see |copyright|) except use "Vimball" instead of "Vim".
9" No warranty, express or implied.
10" *** *** Use At-Your-Own-Risk! *** ***
11
12" ---------------------------------------------------------------------
13" Load Once: {{{1
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000014if &cp || exists("g:loaded_vimball") || v:version < 700
Bram Moolenaareee697b2006-03-21 21:20:39 +000015 finish
16endif
17let s:keepcpo = &cpo
Bram Moolenaare37d50a2008-08-06 17:06:04 +000018let g:loaded_vimball = "v29"
Bram Moolenaareee697b2006-03-21 21:20:39 +000019set cpo&vim
Bram Moolenaarf2330482008-06-24 20:19:36 +000020"DechoTabOn
Bram Moolenaareee697b2006-03-21 21:20:39 +000021
22" =====================================================================
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000023" Constants: {{{1
24if !exists("s:USAGE")
25 let s:USAGE = 0
26 let s:WARNING = 1
27 let s:ERROR = 2
Bram Moolenaarf2330482008-06-24 20:19:36 +000028
29 " determine if cygwin is in use or not
30 if !exists("g:netrw_cygwin")
31 if has("win32") || has("win95") || has("win64") || has("win16")
32 if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
33 let g:netrw_cygwin= 1
34 else
35 let g:netrw_cygwin= 0
36 endif
37 else
38 let g:netrw_cygwin= 0
39 endif
40 endif
41
42 " set up g:vimball_mkdir if the mkdir() call isn't defined
43 if !exists("*mkdir")
44 if exists("g:netrw_local_mkdir")
45 let g:vimball_mkdir= g:netrw_local_mkdir
46 elseif executable("mkdir")
47 let g:vimball_mkdir= "mkdir"
48 elseif executable("makedir")
49 let g:vimball_mkdir= "makedir"
50 endif
51 if !exists(g:vimball_mkdir)
52 call vimball#ShowMesg(s:WARNING,"(vimball) g:vimball_mkdir undefined")
53 endif
54 endif
55
56 " set up shell quoting character
57 if exists("g:vimball_shq") && !exists("g:netrw_shq")
58 let g:netrw_shq= g:vimball_shq
59 endif
60 if !exists("g:netrw_shq")
61 if exists("&shq") && &shq != ""
62 let g:netrw_shq= &shq
63 elseif has("win32") || has("win95") || has("win64") || has("win16")
64 if g:netrw_cygwin
65 let g:netrw_shq= "'"
66 else
67 let g:netrw_shq= '"'
68 endif
69 else
70 let g:netrw_shq= "'"
71 endif
72" call Decho("g:netrw_shq<".g:netrw_shq.">")
73 endif
74
75 " set up escape string (used to protect paths)
76 if !exists("g:vimball_path_escape")
77 let g:vimball_path_escape= ' ;#%'
78 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000079endif
80
81" =====================================================================
Bram Moolenaareee697b2006-03-21 21:20:39 +000082" Functions: {{{1
83
84" ---------------------------------------------------------------------
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000085" vimball#MkVimball: creates a vimball given a list of paths to files {{{2
Bram Moolenaarf2330482008-06-24 20:19:36 +000086" Input:
87" line1,line2: a range of lines containing paths to files to be included in the vimball
88" writelevel : if true, force a write to filename.vba, even if it exists
89" (usually accomplished with :MkVimball! ...
90" filename : base name of file to be created (ie. filename.vba)
91" Output: a filename.vba using vimball format:
Bram Moolenaareee697b2006-03-21 21:20:39 +000092" path
93" filesize
94" [file]
95" path
96" filesize
97" [file]
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000098fun! vimball#MkVimball(line1,line2,writelevel,...) range
99" call Dfunc("MkVimball(line1=".a:line1." line2=".a:line2." writelevel=".a:writelevel." vimballname<".a:1.">) a:0=".a:0)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000100 if a:1 =~ '\.vim$' || a:1 =~ '\.txt$'
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000101 let vbname= substitute(a:1,'\.\a\{3}$','.vba','')
102 else
103 let vbname= a:1
104 endif
105 if vbname !~ '\.vba$'
106 let vbname= vbname.'.vba'
107 endif
108" call Decho("vbname<".vbname.">")
109 if a:1 =~ '[\/]'
110 call vimball#ShowMesg(s:ERROR,"(MkVimball) vimball name<".a:1."> should not include slashes")
111" call Dret("MkVimball : vimball name<".a:1."> should not include slashes")
112 return
113 endif
Bram Moolenaareee697b2006-03-21 21:20:39 +0000114 if !a:writelevel && filereadable(vbname)
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000115 call vimball#ShowMesg(s:ERROR,"(MkVimball) file<".vbname."> exists; use ! to insist")
Bram Moolenaareee697b2006-03-21 21:20:39 +0000116" call Dret("MkVimball : file<".vbname."> already exists; use ! to insist")
117 return
118 endif
119
120 " user option bypass
Bram Moolenaarf2330482008-06-24 20:19:36 +0000121 call vimball#SaveSettings()
Bram Moolenaareee697b2006-03-21 21:20:39 +0000122
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000123 if a:0 >= 2
124 " allow user to specify where to get the files
125 let home= expand(a:2)
126 else
127 " use first existing directory from rtp
128 let home= s:VimballHome()
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000129 endif
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000130
131 " save current directory
Bram Moolenaareee697b2006-03-21 21:20:39 +0000132 let curdir = getcwd()
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000133 call s:ChgDir(home)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000134
135 " record current tab, initialize while loop index
136 let curtabnr = tabpagenr()
137 let linenr = a:line1
138" call Decho("curtabnr=".curtabnr)
139
140 while linenr <= a:line2
141 let svfile = getline(linenr)
142" call Decho("svfile<".svfile.">")
143
144 if !filereadable(svfile)
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000145 call vimball#ShowMesg(s:ERROR,"unable to read file<".svfile.">")
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000146 call s:ChgDir(curdir)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000147 call vimball#RestoreSettings()
Bram Moolenaareee697b2006-03-21 21:20:39 +0000148" call Dret("MkVimball")
149 return
150 endif
151
152 " create/switch to mkvimball tab
153 if !exists("vbtabnr")
154 tabnew
155 silent! file Vimball
156 let vbtabnr= tabpagenr()
157 else
158 exe "tabn ".vbtabnr
159 endif
160
161 let lastline= line("$") + 1
162 if lastline == 2 && getline("$") == ""
163 call setline(1,'" Vimball Archiver by Charles E. Campbell, Jr., Ph.D.')
164 call setline(2,'UseVimball')
165 call setline(3,'finish')
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000166 let lastline= line("$") + 1
Bram Moolenaareee697b2006-03-21 21:20:39 +0000167 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000168 call setline(lastline ,substitute(svfile,'$',' [[[1',''))
Bram Moolenaareee697b2006-03-21 21:20:39 +0000169 call setline(lastline+1,0)
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000170
171 " write the file from the tab
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000172" call Decho("exe $r ".fnameescape(svfile))
173 exe "$r ".fnameescape(svfile)
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000174
Bram Moolenaareee697b2006-03-21 21:20:39 +0000175 call setline(lastline+1,line("$") - lastline - 1)
176" call Decho("lastline=".lastline." line$=".line("$"))
177
178 " restore to normal tab
179 exe "tabn ".curtabnr
180 let linenr= linenr + 1
181 endwhile
182
183 " write the vimball
184 exe "tabn ".vbtabnr
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000185 call s:ChgDir(curdir)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000186 setlocal ff=unix
Bram Moolenaar8ab561d2006-03-23 22:44:10 +0000187 if a:writelevel
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000188" call Decho("exe w! ".fnameescape(vbname))
189 exe "w! ".fnameescape(vbname)
Bram Moolenaar8ab561d2006-03-23 22:44:10 +0000190 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000191" call Decho("exe w ".fnameescape(vbname))
192 exe "w ".fnameescape(vbname)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000193 endif
194" call Decho("Vimball<".vbname."> created")
195 echo "Vimball<".vbname."> created"
196
197 " remove the evidence
198 setlocal nomod bh=wipe
199 exe "tabn ".curtabnr
200 exe "tabc ".vbtabnr
201
202 " restore options
Bram Moolenaarf2330482008-06-24 20:19:36 +0000203 call vimball#RestoreSettings()
Bram Moolenaareee697b2006-03-21 21:20:39 +0000204
205" call Dret("MkVimball")
206endfun
207
208" ---------------------------------------------------------------------
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000209" vimball#Vimball: extract and distribute contents from a vimball {{{2
Bram Moolenaarf2330482008-06-24 20:19:36 +0000210" (invoked the the UseVimball command embedded in
211" vimballs' prologue)
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000212fun! vimball#Vimball(really,...)
213" call Dfunc("vimball#Vimball(really=".a:really.") a:0=".a:0)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000214
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000215 if v:version < 701 || (v:version == 701 && !exists('*fnameescape'))
216 echoerr "your vim is missing the fnameescape() function"
Bram Moolenaarf2330482008-06-24 20:19:36 +0000217" call Dret("vimball#Vimball : needs 7.1 with patch 299")
218 return
219 endif
220
Bram Moolenaareee697b2006-03-21 21:20:39 +0000221 if getline(1) !~ '^" Vimball Archiver by Charles E. Campbell, Jr., Ph.D.$'
222 echoerr "(Vimball) The current file does not appear to be a Vimball!"
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000223" call Dret("vimball#Vimball")
Bram Moolenaareee697b2006-03-21 21:20:39 +0000224 return
225 endif
226
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000227 " set up standard settings
Bram Moolenaarf2330482008-06-24 20:19:36 +0000228 call vimball#SaveSettings()
229 let curtabnr = tabpagenr()
230 let vimballfile = expand("%:tr")
Bram Moolenaareee697b2006-03-21 21:20:39 +0000231
232 " set up vimball tab
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000233" call Decho("setting up vimball tab")
Bram Moolenaareee697b2006-03-21 21:20:39 +0000234 tabnew
235 silent! file Vimball
236 let vbtabnr= tabpagenr()
237 let didhelp= ""
238
239 " go to vim plugin home
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000240 if a:0 > 0
241 let home= expand(a:1)
242 else
243 let home= s:VimballHome()
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000244 endif
245" call Decho("home<".home.">")
246
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000247 " save current directory and remove older same-named vimball, if any
Bram Moolenaareee697b2006-03-21 21:20:39 +0000248 let curdir = getcwd()
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000249" call Decho("home<".home.">")
250" call Decho("curdir<".curdir.">")
251
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000252 call s:ChgDir(home)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000253 let s:ok_unablefind= 1
254 call vimball#RmVimball(vimballfile)
255 unlet s:ok_unablefind
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000256
Bram Moolenaareee697b2006-03-21 21:20:39 +0000257 let linenr = 4
258 let filecnt = 0
259
260 " give title to listing of (extracted) files from Vimball Archive
261 if a:really
Bram Moolenaarf2330482008-06-24 20:19:36 +0000262 echohl Title | echomsg "Vimball Archive" | echohl None
263 else
264 echohl Title | echomsg "Vimball Archive Listing" | echohl None
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000265 echohl Statement | echomsg "files would be placed under: ".home | echohl None
Bram Moolenaareee697b2006-03-21 21:20:39 +0000266 endif
267
268 " apportion vimball contents to various files
269" call Decho("exe tabn ".curtabnr)
270 exe "tabn ".curtabnr
271" call Decho("linenr=".linenr." line$=".line("$"))
272 while 1 < linenr && linenr < line("$")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000273 let fname = substitute(getline(linenr),'\t\[\[\[1$','','')
274 let fname = substitute(fname,'\\','/','g')
Bram Moolenaarf2330482008-06-24 20:19:36 +0000275 let fsize = getline(linenr+1)+0
Bram Moolenaareee697b2006-03-21 21:20:39 +0000276 let filecnt = filecnt + 1
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000277" call Decho("fname<".fname."> fsize=".fsize." filecnt=".filecnt)
278
Bram Moolenaareee697b2006-03-21 21:20:39 +0000279 if a:really
280 echomsg "extracted <".fname.">: ".fsize." lines"
281 else
282 echomsg "would extract <".fname.">: ".fsize." lines"
283 endif
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000284" call Decho("using L#".linenr.": will extract file<".fname.">")
285" call Decho("using L#".(linenr+1).": fsize=".fsize)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000286
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000287 " Allow AsNeeded/ directory to take place of plugin/ directory
Bram Moolenaarf2330482008-06-24 20:19:36 +0000288 " when AsNeeded/filename is filereadable or was present in VimballRecord
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000289 if fname =~ '\<plugin/'
290 let anfname= substitute(fname,'\<plugin/','AsNeeded/','')
Bram Moolenaarf2330482008-06-24 20:19:36 +0000291 if filereadable(anfname) || (exists("s:VBRstring") && s:VBRstring =~ anfname)
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000292" call Decho("using anfname<".anfname."> instead of <".fname.">")
293 let fname= anfname
294 endif
295 endif
296
Bram Moolenaareee697b2006-03-21 21:20:39 +0000297 " make directories if they don't exist yet
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000298 if a:really
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000299" call Decho("making directories if they don't exist yet (fname<".fname.">)")
300 let fnamebuf= substitute(fname,'\\','/','g')
301 let dirpath = substitute(home,'\\','/','g')
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000302 while fnamebuf =~ '/'
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000303 let dirname = dirpath."/".substitute(fnamebuf,'/.*$','','')
304 let dirpath = dirname
305 let fnamebuf = substitute(fnamebuf,'^.\{-}/\(.*\)$','\1','')
306" call Decho("dirname<".dirname.">")
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000307 if !isdirectory(dirname)
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000308" call Decho("making <".dirname.">")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000309 if exists("g:vimball_mkdir")
310 call system(g:vimball_mkdir." ".s:Escape(dirname))
311 else
312 call mkdir(dirname)
313 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000314 call s:RecordInVar(home,"rmdir('".dirname."')")
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000315 endif
316 endwhile
317 endif
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000318 call s:ChgDir(home)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000319
320 " grab specified qty of lines and place into "a" buffer
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000321 " (skip over path/filename and qty-lines)
322 let linenr = linenr + 2
323 let lastline = linenr + fsize - 1
324" call Decho("exe ".linenr.",".lastline."yank a")
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000325 exe "silent ".linenr.",".lastline."yank a"
Bram Moolenaareee697b2006-03-21 21:20:39 +0000326
327 " copy "a" buffer into tab
328" call Decho('copy "a buffer into tab#'.vbtabnr)
329 exe "tabn ".vbtabnr
Bram Moolenaarf2330482008-06-24 20:19:36 +0000330 setlocal ma
Bram Moolenaareee697b2006-03-21 21:20:39 +0000331 silent! %d
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000332 silent put a
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000333 1
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000334 silent d
Bram Moolenaareee697b2006-03-21 21:20:39 +0000335
336 " write tab to file
Bram Moolenaar8ab561d2006-03-23 22:44:10 +0000337 if a:really
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000338 let fnamepath= home."/".fname
Bram Moolenaarf2330482008-06-24 20:19:36 +0000339" call Decho("exe w! ".fnameescape(fnamepath))
340 exe "silent w! ".fnameescape(fnamepath)
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000341 echo "wrote ".fnamepath
Bram Moolenaarf2330482008-06-24 20:19:36 +0000342 call s:RecordInVar(home,"call delete('".fnameescape(fnamepath)."')")
Bram Moolenaar8ab561d2006-03-23 22:44:10 +0000343 endif
Bram Moolenaareee697b2006-03-21 21:20:39 +0000344
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000345 " return to tab with vimball
Bram Moolenaareee697b2006-03-21 21:20:39 +0000346" call Decho("exe tabn ".curtabnr)
347 exe "tabn ".curtabnr
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000348
349 " set up help if its a doc/*.txt file
350" call Decho("didhelp<".didhelp."> fname<".fname.">")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000351 if a:really && didhelp == "" && fname =~ 'doc/[^/]\+\.\(txt\|..x\)$'
352 let didhelp= substitute(fname,'^\(.*\<doc\)[/\\][^.]*\.\(txt\|..x\)$','\1','')
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000353" call Decho("didhelp<".didhelp.">")
354 endif
355
356 " update for next file
Bram Moolenaarf2330482008-06-24 20:19:36 +0000357" call Decho("update linenr= [linenr=".linenr."] + [fsize=".fsize."] = ".(linenr+fsize))
358 let linenr= linenr + fsize
Bram Moolenaareee697b2006-03-21 21:20:39 +0000359 endwhile
360
361 " set up help
362" call Decho("about to set up help: didhelp<".didhelp.">")
363 if didhelp != ""
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000364 let htpath= home."/".didhelp
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000365" call Decho("exe helptags ".htpath)
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000366 exe "helptags ".fnameescape(htpath)
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000367 echo "did helptags"
Bram Moolenaareee697b2006-03-21 21:20:39 +0000368 endif
369
370 " make sure a "Press ENTER..." prompt appears to keep the messages showing!
Bram Moolenaar8ab561d2006-03-23 22:44:10 +0000371 while filecnt <= &ch
Bram Moolenaareee697b2006-03-21 21:20:39 +0000372 echomsg " "
373 let filecnt= filecnt + 1
374 endwhile
375
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000376 " record actions in <.VimballRecord>
377 call s:RecordInFile(home)
378
Bram Moolenaareee697b2006-03-21 21:20:39 +0000379 " restore events, delete tab and buffer
380 exe "tabn ".vbtabnr
381 setlocal nomod bh=wipe
382 exe "tabn ".curtabnr
383 exe "tabc ".vbtabnr
Bram Moolenaarf2330482008-06-24 20:19:36 +0000384 call vimball#RestoreSettings()
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000385 call s:ChgDir(curdir)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000386
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000387" call Dret("vimball#Vimball")
388endfun
389
390" ---------------------------------------------------------------------
391" vimball#RmVimball: remove any files, remove any directories made by any {{{2
392" previous vimball extraction based on a file of the current
393" name.
394" Usage: RmVimball (assume current file is a vimball; remove)
395" RmVimball vimballname
396fun! vimball#RmVimball(...)
397" call Dfunc("vimball#RmVimball() a:0=".a:0)
398 if exists("g:vimball_norecord")
399" call Dret("vimball#RmVimball : (g:vimball_norecord)")
400 return
401 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000402
403 if a:0 == 0
Bram Moolenaarf2330482008-06-24 20:19:36 +0000404 let curfile= expand("%:tr")
405" call Decho("case a:0=0: curfile<".curfile."> (used expand(%:tr))")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000406 else
407 if a:1 =~ '[\/]'
408 call vimball#ShowMesg(s:USAGE,"RmVimball vimballname [path]")
409" call Dret("vimball#RmVimball : suspect a:1<".a:1.">")
410 return
411 endif
412 let curfile= a:1
Bram Moolenaarf2330482008-06-24 20:19:36 +0000413" call Decho("case a:0=".a:0.": curfile<".curfile.">")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000414 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000415 if curfile =~ '\.vba$'
416 let curfile= substitute(curfile,'\.vba','','')
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000417 endif
418 if a:0 >= 2
419 let home= expand(a:2)
420 else
421 let home= s:VimballHome()
422 endif
423 let curdir = getcwd()
424" call Decho("home <".home.">")
425" call Decho("curfile<".curfile.">")
426" call Decho("curdir <".curdir.">")
427
428 call s:ChgDir(home)
429 if filereadable(".VimballRecord")
430" call Decho(".VimballRecord is readable")
431" call Decho("curfile<".curfile.">")
432 keepalt keepjumps 1split
433 silent! keepalt keepjumps e .VimballRecord
434 let keepsrch= @/
Bram Moolenaarf2330482008-06-24 20:19:36 +0000435" call Decho("search for ^".curfile.".vba:")
436" call Decho("search for ^".curfile."[-0-9.]*.vba:")
437 if search('^'.curfile.": ".'cw')
438 let foundit= 1
439 elseif search('^'.curfile.".vba: ",'cw')
440 let foundit= 1
441 elseif search('^'.curfile.'[-0-9.]*.vba: ','cw')
442 let foundit= 1
443 else
444 let foundit = 0
445 endif
446 if foundit
447 let exestring = substitute(getline("."),'^'.curfile.'\S\{-}\.vba: ','','')
448 let s:VBRstring= substitute(exestring,'call delete(','','g')
449 let s:VBRstring= substitute(s:VBRstring,"[')]",'','g')
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000450" call Decho("exe ".exestring)
451 silent! keepalt keepjumps exe exestring
452 silent! keepalt keepjumps d
Bram Moolenaarf2330482008-06-24 20:19:36 +0000453 let exestring= strlen(substitute(exestring,'call delete(.\{-})|\=',"D","g"))
454" call Decho("exestring<".exestring.">")
455 echomsg "removed ".exestring." files"
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000456 else
Bram Moolenaarf2330482008-06-24 20:19:36 +0000457 let s:VBRstring= ''
458 let curfile = substitute(curfile,'\.vba','','')
459" call Decho("unable to find <".curfile."> in .VimballRecord")
460 if !exists("s:ok_unablefind")
461 call vimball#ShowMesg(s:WARNING,"(RmVimball) unable to find <".curfile."> in .VimballRecord")
462 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000463 endif
464 silent! keepalt keepjumps g/^\s*$/d
465 silent! keepalt keepjumps wq!
466 let @/= keepsrch
467 endif
468 call s:ChgDir(curdir)
469
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000470" call Dret("vimball#RmVimball")
Bram Moolenaareee697b2006-03-21 21:20:39 +0000471endfun
472
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000473" ---------------------------------------------------------------------
474" vimball#Decompress: attempts to automatically decompress vimballs {{{2
475fun! vimball#Decompress(fname)
476" call Dfunc("Decompress(fname<".a:fname.">)")
477
478 " decompression:
479 if expand("%") =~ '.*\.gz' && executable("gunzip")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000480 " handle *.gz with gunzip
481 silent exe "!gunzip ".s:Escape(a:fname)
482 if v:shell_error != 0
483 call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) gunzip may have failed with <".a:fname.">")
484 endif
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000485 let fname= substitute(a:fname,'\.gz$','','')
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000486 exe "e ".escape(fname,' \')
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000487 call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000488
489 elseif expand("%") =~ '.*\.gz' && executable("gzip")
490 " handle *.gz with gzip -d
491 silent exe "!gzip -d ".s:Escape(a:fname)
492 if v:shell_error != 0
493 call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "gzip -d" may have failed with <'.a:fname.">")
494 endif
495 let fname= substitute(a:fname,'\.gz$','','')
496 exe "e ".escape(fname,' \')
497 call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)")
498
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000499 elseif expand("%") =~ '.*\.bz2' && executable("bunzip2")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000500 " handle *.bz2 with bunzip2
501 silent exe "!bunzip2 ".s:Escape(a:fname)
502 if v:shell_error != 0
503 call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) bunzip2 may have failed with <".a:fname.">")
504 endif
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000505 let fname= substitute(a:fname,'\.bz2$','','')
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000506 exe "e ".escape(fname,' \')
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000507 call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000508
509 elseif expand("%") =~ '.*\.bz2' && executable("bzip2")
510 " handle *.bz2 with bzip2 -d
511 silent exe "!bzip2 -d ".s:Escape(a:fname)
512 if v:shell_error != 0
513 call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "bzip2 -d" may have failed with <'.a:fname.">")
514 endif
515 let fname= substitute(a:fname,'\.bz2$','','')
516 exe "e ".escape(fname,' \')
517 call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)")
518
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000519 elseif expand("%") =~ '.*\.zip' && executable("unzip")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000520 " handle *.zip with unzip
521 silent exe "!unzip ".s:Escape(a:fname)
522 if v:shell_error != 0
523 call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) unzip may have failed with <".a:fname.">")
524 endif
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000525 let fname= substitute(a:fname,'\.zip$','','')
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000526 exe "e ".escape(fname,' \')
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000527 call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)")
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000528 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000529
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000530 set noma bt=nofile fmr=[[[,]]] fdm=marker
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000531
532" call Dret("Decompress")
533endfun
534
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000535" ---------------------------------------------------------------------
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000536" vimball#ShowMesg: {{{2
537fun! vimball#ShowMesg(level,msg)
538" call Dfunc("vimball#ShowMesg(level=".a:level." msg<".a:msg.">)")
539 let rulerkeep = &ruler
540 let showcmdkeep = &showcmd
541 set noruler noshowcmd
542 redraw!
543
544 if &fo =~ '[ta]'
545 echomsg "***vimball*** " a:msg
546 else
547 if a:level == s:WARNING || a:level == s:USAGE
548 echohl WarningMsg
549 elseif a:level == s:ERROR
550 echohl Error
551 endif
552 echomsg "***vimball*** " a:msg
553 echohl None
554 endif
555
556 if a:level != s:USAGE
557 call inputsave()|let ok= input("Press <cr> to continue")|call inputrestore()
558 endif
559
560 let &ruler = rulerkeep
561 let &showcmd = showcmdkeep
562
563" call Dret("vimball#ShowMesg")
564endfun
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000565" =====================================================================
566" s:ChgDir: change directory (in spite of Windoze) {{{2
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000567fun! s:ChgDir(newdir)
568" call Dfunc("ChgDir(newdir<".a:newdir.">)")
569 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaarf2330482008-06-24 20:19:36 +0000570 exe 'silent cd '.fnameescape(substitute(a:newdir,'/','\\','g'))
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000571 else
Bram Moolenaarf2330482008-06-24 20:19:36 +0000572 exe 'silent cd '.fnameescape(a:newdir)
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000573 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000574" call Dret("ChgDir : curdir<".getcwd().">")
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000575endfun
576
577" ---------------------------------------------------------------------
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000578" s:RecordInVar: record a un-vimball command in the .VimballRecord file {{{2
579fun! s:RecordInVar(home,cmd)
580" call Dfunc("RecordInVar(home<".a:home."> cmd<".a:cmd.">)")
581 if a:cmd =~ '^rmdir'
582" if !exists("s:recorddir")
583" let s:recorddir= substitute(a:cmd,'^rmdir',"call s:Rmdir",'')
584" else
585" let s:recorddir= s:recorddir."|".substitute(a:cmd,'^rmdir',"call s:Rmdir",'')
586" endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000587 elseif !exists("s:recordfile")
588 let s:recordfile= a:cmd
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000589 else
590 let s:recordfile= s:recordfile."|".a:cmd
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000591 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000592" call Dret("RecordInVar : s:recordfile<".(exists("s:recordfile")? s:recordfile : "")."> s:recorddir<".(exists("s:recorddir")? s:recorddir : "").">")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000593endfun
594
595" ---------------------------------------------------------------------
596" s:RecordInFile: {{{2
597fun! s:RecordInFile(home)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000598" call Dfunc("s:RecordInFile()")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000599 if exists("g:vimball_norecord")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000600" call Dret("s:RecordInFile : g:vimball_norecord")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000601 return
602 endif
603
604 if exists("s:recordfile") || exists("s:recorddir")
605 let curdir= getcwd()
606 call s:ChgDir(a:home)
607 keepalt keepjumps 1split
Bram Moolenaarf2330482008-06-24 20:19:36 +0000608
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000609 let cmd= expand("%:tr").": "
Bram Moolenaarf2330482008-06-24 20:19:36 +0000610" call Decho("cmd<".cmd.">")
611
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000612 silent! keepalt keepjumps e .VimballRecord
Bram Moolenaarf2330482008-06-24 20:19:36 +0000613 setlocal ma
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000614 $
615 if exists("s:recordfile") && exists("s:recorddir")
616 let cmd= cmd.s:recordfile."|".s:recorddir
617 elseif exists("s:recorddir")
618 let cmd= cmd.s:recorddir
619 elseif exists("s:recordfile")
620 let cmd= cmd.s:recordfile
621 else
Bram Moolenaarf2330482008-06-24 20:19:36 +0000622" call Dret("s:RecordInFile : neither recordfile nor recorddir exist")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000623 return
624 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000625" call Decho("cmd<".cmd.">")
626
627 " put command into buffer, write .VimballRecord `file
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000628 keepalt keepjumps put=cmd
629 silent! keepalt keepjumps g/^\s*$/d
630 silent! keepalt keepjumps wq!
631 call s:ChgDir(curdir)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000632
633 if exists("s:recorddir")
634" call Decho("unlet s:recorddir<".s:recorddir.">")
635 unlet s:recorddir
636 endif
637 if exists("s:recordfile")
638" call Decho("unlet s:recordfile<".s:recordfile.">")
639 unlet s:recordfile
640 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000641 else
642" call Decho("s:record[file|dir] doesn't exist")
643 endif
644
Bram Moolenaarf2330482008-06-24 20:19:36 +0000645" call Dret("s:RecordInFile")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000646endfun
647
648" ---------------------------------------------------------------------
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000649" s:VimballHome: determine/get home directory path (usually from rtp) {{{2
650fun! s:VimballHome()
651" call Dfunc("VimballHome()")
652 if exists("g:vimball_home")
653 let home= g:vimball_home
654 else
655 " go to vim plugin home
656 for home in split(&rtp,',') + ['']
657 if isdirectory(home) && filewritable(home) | break | endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000658 let basehome= substitute(home,'[/\\]\.vim$','','')
659 if isdirectory(basehome) && filewritable(basehome)
660 let home= basehome."/.vim"
661 break
662 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000663 endfor
664 if home == ""
665 " just pick the first directory
666 let home= substitute(&rtp,',.*$','','')
667 endif
668 if (has("win32") || has("win95") || has("win64") || has("win16"))
669 let home= substitute(home,'/','\\','g')
670 endif
671 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000672 " insure that the home directory exists
673" call Decho("picked home<".home.">")
674 if !isdirectory(home)
675 if exists("g:vimball_mkdir")
676" call Decho("home<".home."> isn't a directory -- making it now with g:vimball_mkdir<".g:vimball_mkdir.">")
677" call Decho("system(".g:vimball_mkdir." ".s:Escape(home).")")
678 call system(g:vimball_mkdir." ".s:Escape(home))
679 else
680" call Decho("home<".home."> isn't a directory -- making it now with mkdir()")
681 call mkdir(home)
682 endif
683 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000684" call Dret("VimballHome <".home.">")
685 return home
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000686endfun
687
688" ---------------------------------------------------------------------
Bram Moolenaarf2330482008-06-24 20:19:36 +0000689" vimball#SaveSettings: {{{2
690fun! vimball#SaveSettings()
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000691" call Dfunc("SaveSettings()")
692 let s:makeep = getpos("'a")
693 let s:regakeep= @a
Bram Moolenaard68071d2006-05-02 22:08:30 +0000694 if exists("&acd")
695 let s:acdkeep = &acd
696 endif
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000697 let s:eikeep = &ei
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000698 let s:fenkeep = &l:fen
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000699 let s:hidkeep = &hidden
700 let s:ickeep = &ic
Bram Moolenaar143c38c2007-05-10 16:41:10 +0000701 let s:lzkeep = &lz
702 let s:pmkeep = &pm
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000703 let s:repkeep = &report
704 let s:vekeep = &ve
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000705 let s:ffkeep = &l:ff
Bram Moolenaard68071d2006-05-02 22:08:30 +0000706 if exists("&acd")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000707 setlocal ei=all ve=all noacd nofen noic report=999 nohid bt= ma lz pm= ff=unix
Bram Moolenaard68071d2006-05-02 22:08:30 +0000708 else
Bram Moolenaarf2330482008-06-24 20:19:36 +0000709 setlocal ei=all ve=all nofen noic report=999 nohid bt= ma lz pm= ff=unix
Bram Moolenaard68071d2006-05-02 22:08:30 +0000710 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000711 " vimballs should be in unix format
712 setlocal ff=unix
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000713" call Dret("SaveSettings")
714endfun
715
716" ---------------------------------------------------------------------
Bram Moolenaarf2330482008-06-24 20:19:36 +0000717" vimball#RestoreSettings: {{{2
718fun! vimball#RestoreSettings()
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000719" call Dfunc("RestoreSettings()")
720 let @a = s:regakeep
Bram Moolenaard68071d2006-05-02 22:08:30 +0000721 if exists("&acd")
722 let &acd = s:acdkeep
723 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000724 let &l:fen = s:fenkeep
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000725 let &hidden = s:hidkeep
726 let &ic = s:ickeep
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000727 let &lz = s:lzkeep
Bram Moolenaar143c38c2007-05-10 16:41:10 +0000728 let &pm = s:pmkeep
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000729 let &report = s:repkeep
730 let &ve = s:vekeep
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000731 let &ei = s:eikeep
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000732 let &l:ff = s:ffkeep
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000733 if s:makeep[0] != 0
734 " restore mark a
735" call Decho("restore mark-a: makeep=".string(makeep))
736 call setpos("'a",s:makeep)
737 endif
Bram Moolenaard68071d2006-05-02 22:08:30 +0000738 if exists("&acd")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000739 unlet s:acdkeep
Bram Moolenaard68071d2006-05-02 22:08:30 +0000740 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000741 unlet s:regakeep s:eikeep s:fenkeep s:hidkeep s:ickeep s:repkeep s:vekeep s:makeep s:lzkeep s:pmkeep s:ffkeep
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000742" call Dret("RestoreSettings")
743endfun
744
745" ---------------------------------------------------------------------
Bram Moolenaarf2330482008-06-24 20:19:36 +0000746" s:Escape: {{{2
747fun s:Escape(name)
748 " shellescape() was added by patch 7.0.111
749 if exists("*shellescape")
750 return shellescape(a:name)
751 endif
752 return g:netrw_shq . a:name . g:netrw_shq
753endfun
754
755" ---------------------------------------------------------------------
756" Restore:
757let &cpo= s:keepcpo
758unlet s:keepcpo
759
760" ---------------------------------------------------------------------
Bram Moolenaareee697b2006-03-21 21:20:39 +0000761" Modelines: {{{1
762" vim: fdm=marker