blob: d69c64532d1520c3bbd6640b3a19d890dcf52673 [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 Moolenaarf2330482008-06-24 20:19:36 +00003" Date: Jun 05, 2008
4" Version: 27
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 Moolenaarf2330482008-06-24 20:19:36 +000018let g:loaded_vimball = "v27"
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
172 let svfilepath= s:Path(svfile,'')
Bram Moolenaarf2330482008-06-24 20:19:36 +0000173" call Decho("exe $r ".fnameescape(svfilepath))
174 exe "$r ".fnameescape(svfilepath)
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000175
Bram Moolenaareee697b2006-03-21 21:20:39 +0000176 call setline(lastline+1,line("$") - lastline - 1)
177" call Decho("lastline=".lastline." line$=".line("$"))
178
179 " restore to normal tab
180 exe "tabn ".curtabnr
181 let linenr= linenr + 1
182 endwhile
183
184 " write the vimball
185 exe "tabn ".vbtabnr
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000186 call s:ChgDir(curdir)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000187 setlocal ff=unix
Bram Moolenaar8ab561d2006-03-23 22:44:10 +0000188 if a:writelevel
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000189 let vbnamepath= s:Path(vbname,'')
Bram Moolenaarf2330482008-06-24 20:19:36 +0000190" call Decho("exe w! ".fnameescape(vbnamepath))
191 exe "w! ".fnameescape(vbnamepath)
Bram Moolenaar8ab561d2006-03-23 22:44:10 +0000192 else
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000193 let vbnamepath= s:Path(vbname,'')
Bram Moolenaarf2330482008-06-24 20:19:36 +0000194" call Decho("exe w ".fnameescape(vbnamepath))
195 exe "w ".fnameescape(vbnamepath)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000196 endif
197" call Decho("Vimball<".vbname."> created")
198 echo "Vimball<".vbname."> created"
199
200 " remove the evidence
201 setlocal nomod bh=wipe
202 exe "tabn ".curtabnr
203 exe "tabc ".vbtabnr
204
205 " restore options
Bram Moolenaarf2330482008-06-24 20:19:36 +0000206 call vimball#RestoreSettings()
Bram Moolenaareee697b2006-03-21 21:20:39 +0000207
208" call Dret("MkVimball")
209endfun
210
211" ---------------------------------------------------------------------
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000212" vimball#Vimball: extract and distribute contents from a vimball {{{2
Bram Moolenaarf2330482008-06-24 20:19:36 +0000213" (invoked the the UseVimball command embedded in
214" vimballs' prologue)
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000215fun! vimball#Vimball(really,...)
216" call Dfunc("vimball#Vimball(really=".a:really.") a:0=".a:0)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000217
Bram Moolenaarf2330482008-06-24 20:19:36 +0000218 if v:version < 701 || (v:version == 701 && !has("patch299"))
219 echoerr "This version of vimball requires vim 7.1 with patch 299"
220" call Dret("vimball#Vimball : needs 7.1 with patch 299")
221 return
222 endif
223
Bram Moolenaareee697b2006-03-21 21:20:39 +0000224 if getline(1) !~ '^" Vimball Archiver by Charles E. Campbell, Jr., Ph.D.$'
225 echoerr "(Vimball) The current file does not appear to be a Vimball!"
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000226" call Dret("vimball#Vimball")
Bram Moolenaareee697b2006-03-21 21:20:39 +0000227 return
228 endif
229
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000230 " set up standard settings
Bram Moolenaarf2330482008-06-24 20:19:36 +0000231 call vimball#SaveSettings()
232 let curtabnr = tabpagenr()
233 let vimballfile = expand("%:tr")
Bram Moolenaareee697b2006-03-21 21:20:39 +0000234
235 " set up vimball tab
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000236" call Decho("setting up vimball tab")
Bram Moolenaareee697b2006-03-21 21:20:39 +0000237 tabnew
238 silent! file Vimball
239 let vbtabnr= tabpagenr()
240 let didhelp= ""
241
242 " go to vim plugin home
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000243 if a:0 > 0
244 let home= expand(a:1)
245 else
246 let home= s:VimballHome()
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000247 endif
248" call Decho("home<".home.">")
249
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000250 " save current directory and remove older same-named vimball, if any
Bram Moolenaareee697b2006-03-21 21:20:39 +0000251 let curdir = getcwd()
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000252" call Decho("home<".home.">")
253" call Decho("curdir<".curdir.">")
254
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000255 call s:ChgDir(home)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000256 let s:ok_unablefind= 1
257 call vimball#RmVimball(vimballfile)
258 unlet s:ok_unablefind
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000259
Bram Moolenaareee697b2006-03-21 21:20:39 +0000260 let linenr = 4
261 let filecnt = 0
262
263 " give title to listing of (extracted) files from Vimball Archive
264 if a:really
Bram Moolenaarf2330482008-06-24 20:19:36 +0000265 echohl Title | echomsg "Vimball Archive" | echohl None
266 else
267 echohl Title | echomsg "Vimball Archive Listing" | echohl None
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000268 echohl Statement | echomsg "files would be placed under: ".home | echohl None
Bram Moolenaareee697b2006-03-21 21:20:39 +0000269 endif
270
271 " apportion vimball contents to various files
272" call Decho("exe tabn ".curtabnr)
273 exe "tabn ".curtabnr
274" call Decho("linenr=".linenr." line$=".line("$"))
275 while 1 < linenr && linenr < line("$")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000276 let fname = substitute(getline(linenr),'\t\[\[\[1$','','')
277 let fname = substitute(fname,'\\','/','g')
Bram Moolenaarf2330482008-06-24 20:19:36 +0000278 let fsize = getline(linenr+1)+0
Bram Moolenaareee697b2006-03-21 21:20:39 +0000279 let filecnt = filecnt + 1
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000280" call Decho("fname<".fname."> fsize=".fsize." filecnt=".filecnt)
281
Bram Moolenaareee697b2006-03-21 21:20:39 +0000282 if a:really
283 echomsg "extracted <".fname.">: ".fsize." lines"
284 else
285 echomsg "would extract <".fname.">: ".fsize." lines"
286 endif
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000287" call Decho("using L#".linenr.": will extract file<".fname.">")
288" call Decho("using L#".(linenr+1).": fsize=".fsize)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000289
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000290 " Allow AsNeeded/ directory to take place of plugin/ directory
Bram Moolenaarf2330482008-06-24 20:19:36 +0000291 " when AsNeeded/filename is filereadable or was present in VimballRecord
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000292 if fname =~ '\<plugin/'
293 let anfname= substitute(fname,'\<plugin/','AsNeeded/','')
Bram Moolenaarf2330482008-06-24 20:19:36 +0000294 if filereadable(anfname) || (exists("s:VBRstring") && s:VBRstring =~ anfname)
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000295" call Decho("using anfname<".anfname."> instead of <".fname.">")
296 let fname= anfname
297 endif
298 endif
299
Bram Moolenaareee697b2006-03-21 21:20:39 +0000300 " make directories if they don't exist yet
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000301 if a:really
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000302" call Decho("making directories if they don't exist yet (fname<".fname.">)")
303 let fnamebuf= substitute(fname,'\\','/','g')
304 let dirpath = substitute(home,'\\','/','g')
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000305 while fnamebuf =~ '/'
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000306 let dirname = dirpath."/".substitute(fnamebuf,'/.*$','','')
307 let dirpath = dirname
308 let fnamebuf = substitute(fnamebuf,'^.\{-}/\(.*\)$','\1','')
309" call Decho("dirname<".dirname.">")
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000310 if !isdirectory(dirname)
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000311" call Decho("making <".dirname.">")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000312 if exists("g:vimball_mkdir")
313 call system(g:vimball_mkdir." ".s:Escape(dirname))
314 else
315 call mkdir(dirname)
316 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000317 call s:RecordInVar(home,"rmdir('".dirname."')")
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000318 endif
319 endwhile
320 endif
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000321 call s:ChgDir(home)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000322
323 " grab specified qty of lines and place into "a" buffer
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000324 " (skip over path/filename and qty-lines)
325 let linenr = linenr + 2
326 let lastline = linenr + fsize - 1
327" call Decho("exe ".linenr.",".lastline."yank a")
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000328 exe "silent ".linenr.",".lastline."yank a"
Bram Moolenaareee697b2006-03-21 21:20:39 +0000329
330 " copy "a" buffer into tab
331" call Decho('copy "a buffer into tab#'.vbtabnr)
332 exe "tabn ".vbtabnr
Bram Moolenaarf2330482008-06-24 20:19:36 +0000333 setlocal ma
Bram Moolenaareee697b2006-03-21 21:20:39 +0000334 silent! %d
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000335 silent put a
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000336 1
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000337 silent d
Bram Moolenaareee697b2006-03-21 21:20:39 +0000338
339 " write tab to file
Bram Moolenaar8ab561d2006-03-23 22:44:10 +0000340 if a:really
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000341 let fnamepath= s:Path(home."/".fname,'')
Bram Moolenaarf2330482008-06-24 20:19:36 +0000342" call Decho("exe w! ".fnameescape(fnamepath))
343 exe "silent w! ".fnameescape(fnamepath)
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000344 echo "wrote ".fnamepath
Bram Moolenaarf2330482008-06-24 20:19:36 +0000345 call s:RecordInVar(home,"call delete('".fnameescape(fnamepath)."')")
Bram Moolenaar8ab561d2006-03-23 22:44:10 +0000346 endif
Bram Moolenaareee697b2006-03-21 21:20:39 +0000347
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000348 " return to tab with vimball
Bram Moolenaareee697b2006-03-21 21:20:39 +0000349" call Decho("exe tabn ".curtabnr)
350 exe "tabn ".curtabnr
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000351
352 " set up help if its a doc/*.txt file
353" call Decho("didhelp<".didhelp."> fname<".fname.">")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000354 if a:really && didhelp == "" && fname =~ 'doc/[^/]\+\.\(txt\|..x\)$'
355 let didhelp= substitute(fname,'^\(.*\<doc\)[/\\][^.]*\.\(txt\|..x\)$','\1','')
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000356" call Decho("didhelp<".didhelp.">")
357 endif
358
359 " update for next file
Bram Moolenaarf2330482008-06-24 20:19:36 +0000360" call Decho("update linenr= [linenr=".linenr."] + [fsize=".fsize."] = ".(linenr+fsize))
361 let linenr= linenr + fsize
Bram Moolenaareee697b2006-03-21 21:20:39 +0000362 endwhile
363
364 " set up help
365" call Decho("about to set up help: didhelp<".didhelp.">")
366 if didhelp != ""
Bram Moolenaarf2330482008-06-24 20:19:36 +0000367 let htpath= s:Path(home."/".didhelp,"")
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000368" call Decho("exe helptags ".htpath)
369 exe "helptags ".htpath
370 echo "did helptags"
Bram Moolenaareee697b2006-03-21 21:20:39 +0000371 endif
372
373 " make sure a "Press ENTER..." prompt appears to keep the messages showing!
Bram Moolenaar8ab561d2006-03-23 22:44:10 +0000374 while filecnt <= &ch
Bram Moolenaareee697b2006-03-21 21:20:39 +0000375 echomsg " "
376 let filecnt= filecnt + 1
377 endwhile
378
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000379 " record actions in <.VimballRecord>
380 call s:RecordInFile(home)
381
Bram Moolenaareee697b2006-03-21 21:20:39 +0000382 " restore events, delete tab and buffer
383 exe "tabn ".vbtabnr
384 setlocal nomod bh=wipe
385 exe "tabn ".curtabnr
386 exe "tabc ".vbtabnr
Bram Moolenaarf2330482008-06-24 20:19:36 +0000387 call vimball#RestoreSettings()
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000388 call s:ChgDir(curdir)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000389
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000390" call Dret("vimball#Vimball")
391endfun
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
399fun! 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
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000405
406 if a:0 == 0
Bram Moolenaarf2330482008-06-24 20:19:36 +0000407 let curfile= expand("%:tr")
408" call Decho("case a:0=0: curfile<".curfile."> (used expand(%:tr))")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000409 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
Bram Moolenaarf2330482008-06-24 20:19:36 +0000416" call Decho("case a:0=".a:0.": curfile<".curfile.">")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000417 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000418 if curfile =~ '\.vba$'
419 let curfile= substitute(curfile,'\.vba','','')
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000420 endif
421 if a:0 >= 2
422 let home= expand(a:2)
423 else
424 let home= s:VimballHome()
425 endif
426 let curdir = getcwd()
427" call Decho("home <".home.">")
428" call Decho("curfile<".curfile.">")
429" call Decho("curdir <".curdir.">")
430
431 call s:ChgDir(home)
432 if filereadable(".VimballRecord")
433" call Decho(".VimballRecord is readable")
434" call Decho("curfile<".curfile.">")
435 keepalt keepjumps 1split
436 silent! keepalt keepjumps e .VimballRecord
437 let keepsrch= @/
Bram Moolenaarf2330482008-06-24 20:19:36 +0000438" call Decho("search for ^".curfile.".vba:")
439" call Decho("search for ^".curfile."[-0-9.]*.vba:")
440 if search('^'.curfile.": ".'cw')
441 let foundit= 1
442 elseif search('^'.curfile.".vba: ",'cw')
443 let foundit= 1
444 elseif search('^'.curfile.'[-0-9.]*.vba: ','cw')
445 let foundit= 1
446 else
447 let foundit = 0
448 endif
449 if foundit
450 let exestring = substitute(getline("."),'^'.curfile.'\S\{-}\.vba: ','','')
451 let s:VBRstring= substitute(exestring,'call delete(','','g')
452 let s:VBRstring= substitute(s:VBRstring,"[')]",'','g')
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000453" call Decho("exe ".exestring)
454 silent! keepalt keepjumps exe exestring
455 silent! keepalt keepjumps d
Bram Moolenaarf2330482008-06-24 20:19:36 +0000456 let exestring= strlen(substitute(exestring,'call delete(.\{-})|\=',"D","g"))
457" call Decho("exestring<".exestring.">")
458 echomsg "removed ".exestring." files"
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000459 else
Bram Moolenaarf2330482008-06-24 20:19:36 +0000460 let s:VBRstring= ''
461 let curfile = substitute(curfile,'\.vba','','')
462" call Decho("unable to find <".curfile."> in .VimballRecord")
463 if !exists("s:ok_unablefind")
464 call vimball#ShowMesg(s:WARNING,"(RmVimball) unable to find <".curfile."> in .VimballRecord")
465 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000466 endif
467 silent! keepalt keepjumps g/^\s*$/d
468 silent! keepalt keepjumps wq!
469 let @/= keepsrch
470 endif
471 call s:ChgDir(curdir)
472
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000473" call Dret("vimball#RmVimball")
Bram Moolenaareee697b2006-03-21 21:20:39 +0000474endfun
475
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000476" ---------------------------------------------------------------------
477" vimball#Decompress: attempts to automatically decompress vimballs {{{2
478fun! vimball#Decompress(fname)
479" call Dfunc("Decompress(fname<".a:fname.">)")
480
481 " decompression:
482 if expand("%") =~ '.*\.gz' && executable("gunzip")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000483 " handle *.gz with gunzip
484 silent exe "!gunzip ".s:Escape(a:fname)
485 if v:shell_error != 0
486 call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) gunzip may have failed with <".a:fname.">")
487 endif
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000488 let fname= substitute(a:fname,'\.gz$','','')
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000489 exe "e ".escape(fname,' \')
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000490 call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000491
492 elseif expand("%") =~ '.*\.gz' && executable("gzip")
493 " handle *.gz with gzip -d
494 silent exe "!gzip -d ".s:Escape(a:fname)
495 if v:shell_error != 0
496 call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "gzip -d" may have failed with <'.a:fname.">")
497 endif
498 let fname= substitute(a:fname,'\.gz$','','')
499 exe "e ".escape(fname,' \')
500 call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)")
501
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000502 elseif expand("%") =~ '.*\.bz2' && executable("bunzip2")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000503 " handle *.bz2 with bunzip2
504 silent exe "!bunzip2 ".s:Escape(a:fname)
505 if v:shell_error != 0
506 call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) bunzip2 may have failed with <".a:fname.">")
507 endif
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000508 let fname= substitute(a:fname,'\.bz2$','','')
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000509 exe "e ".escape(fname,' \')
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000510 call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000511
512 elseif expand("%") =~ '.*\.bz2' && executable("bzip2")
513 " handle *.bz2 with bzip2 -d
514 silent exe "!bzip2 -d ".s:Escape(a:fname)
515 if v:shell_error != 0
516 call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "bzip2 -d" may have failed with <'.a:fname.">")
517 endif
518 let fname= substitute(a:fname,'\.bz2$','','')
519 exe "e ".escape(fname,' \')
520 call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)")
521
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000522 elseif expand("%") =~ '.*\.zip' && executable("unzip")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000523 " handle *.zip with unzip
524 silent exe "!unzip ".s:Escape(a:fname)
525 if v:shell_error != 0
526 call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) unzip may have failed with <".a:fname.">")
527 endif
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000528 let fname= substitute(a:fname,'\.zip$','','')
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000529 exe "e ".escape(fname,' \')
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000530 call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)")
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000531 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000532
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000533 set noma bt=nofile fmr=[[[,]]] fdm=marker
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000534
535" call Dret("Decompress")
536endfun
537
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000538" ---------------------------------------------------------------------
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000539" vimball#ShowMesg: {{{2
540fun! vimball#ShowMesg(level,msg)
541" call Dfunc("vimball#ShowMesg(level=".a:level." msg<".a:msg.">)")
542 let rulerkeep = &ruler
543 let showcmdkeep = &showcmd
544 set noruler noshowcmd
545 redraw!
546
547 if &fo =~ '[ta]'
548 echomsg "***vimball*** " a:msg
549 else
550 if a:level == s:WARNING || a:level == s:USAGE
551 echohl WarningMsg
552 elseif a:level == s:ERROR
553 echohl Error
554 endif
555 echomsg "***vimball*** " a:msg
556 echohl None
557 endif
558
559 if a:level != s:USAGE
560 call inputsave()|let ok= input("Press <cr> to continue")|call inputrestore()
561 endif
562
563 let &ruler = rulerkeep
564 let &showcmd = showcmdkeep
565
566" call Dret("vimball#ShowMesg")
567endfun
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000568" =====================================================================
569" s:ChgDir: change directory (in spite of Windoze) {{{2
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000570fun! s:ChgDir(newdir)
571" call Dfunc("ChgDir(newdir<".a:newdir.">)")
572 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaarf2330482008-06-24 20:19:36 +0000573 exe 'silent cd '.fnameescape(substitute(a:newdir,'/','\\','g'))
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000574 else
Bram Moolenaarf2330482008-06-24 20:19:36 +0000575 exe 'silent cd '.fnameescape(a:newdir)
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000576 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000577" call Dret("ChgDir : curdir<".getcwd().">")
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000578endfun
579
580" ---------------------------------------------------------------------
Bram Moolenaarf2330482008-06-24 20:19:36 +0000581" s:Path: prepend and append quotes and do escaping {{{2
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000582fun! s:Path(cmd,quote)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000583" call Dfunc("Path(cmd<".a:cmd."> quote<".a:quote.">) vimball_path_escape<".g:vimball_path_escape.">")
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000584 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaarf2330482008-06-24 20:19:36 +0000585" let cmdpath= a:quote.substitute(a:cmd,'/','\\','g').a:quote
586 let cmdpath= a:quote.substitute(a:cmd,'\\','/','g').a:quote
587" call Decho("cmdpath<".cmdpath."> (win32 mod)")
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000588 else
589 let cmdpath= a:quote.a:cmd.a:quote
Bram Moolenaarf2330482008-06-24 20:19:36 +0000590" call Decho("cmdpath<".cmdpath."> (not-win32 mod)")
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000591 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000592 if a:quote == "" && g:vimball_path_escape !~ ' '
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000593 let cmdpath= escape(cmdpath,' ')
Bram Moolenaarf2330482008-06-24 20:19:36 +0000594" call Decho("cmdpath<".cmdpath."> (empty quote case)")
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000595 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000596 let cmdpath= escape(cmdpath,g:vimball_path_escape)
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000597" call Dret("Path <".cmdpath.">")
598 return cmdpath
599endfun
600
601" ---------------------------------------------------------------------
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000602" s:RecordInVar: record a un-vimball command in the .VimballRecord file {{{2
603fun! s:RecordInVar(home,cmd)
604" call Dfunc("RecordInVar(home<".a:home."> cmd<".a:cmd.">)")
605 if a:cmd =~ '^rmdir'
606" if !exists("s:recorddir")
607" let s:recorddir= substitute(a:cmd,'^rmdir',"call s:Rmdir",'')
608" else
609" let s:recorddir= s:recorddir."|".substitute(a:cmd,'^rmdir',"call s:Rmdir",'')
610" endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000611 elseif !exists("s:recordfile")
612 let s:recordfile= a:cmd
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000613 else
614 let s:recordfile= s:recordfile."|".a:cmd
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000615 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000616" call Dret("RecordInVar : s:recordfile<".(exists("s:recordfile")? s:recordfile : "")."> s:recorddir<".(exists("s:recorddir")? s:recorddir : "").">")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000617endfun
618
619" ---------------------------------------------------------------------
620" s:RecordInFile: {{{2
621fun! s:RecordInFile(home)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000622" call Dfunc("s:RecordInFile()")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000623 if exists("g:vimball_norecord")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000624" call Dret("s:RecordInFile : g:vimball_norecord")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000625 return
626 endif
627
628 if exists("s:recordfile") || exists("s:recorddir")
629 let curdir= getcwd()
630 call s:ChgDir(a:home)
631 keepalt keepjumps 1split
Bram Moolenaarf2330482008-06-24 20:19:36 +0000632
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000633 let cmd= expand("%:tr").": "
Bram Moolenaarf2330482008-06-24 20:19:36 +0000634" call Decho("cmd<".cmd.">")
635
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000636 silent! keepalt keepjumps e .VimballRecord
Bram Moolenaarf2330482008-06-24 20:19:36 +0000637 setlocal ma
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000638 $
639 if exists("s:recordfile") && exists("s:recorddir")
640 let cmd= cmd.s:recordfile."|".s:recorddir
641 elseif exists("s:recorddir")
642 let cmd= cmd.s:recorddir
643 elseif exists("s:recordfile")
644 let cmd= cmd.s:recordfile
645 else
Bram Moolenaarf2330482008-06-24 20:19:36 +0000646" call Dret("s:RecordInFile : neither recordfile nor recorddir exist")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000647 return
648 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000649" call Decho("cmd<".cmd.">")
650
651 " put command into buffer, write .VimballRecord `file
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000652 keepalt keepjumps put=cmd
653 silent! keepalt keepjumps g/^\s*$/d
654 silent! keepalt keepjumps wq!
655 call s:ChgDir(curdir)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000656
657 if exists("s:recorddir")
658" call Decho("unlet s:recorddir<".s:recorddir.">")
659 unlet s:recorddir
660 endif
661 if exists("s:recordfile")
662" call Decho("unlet s:recordfile<".s:recordfile.">")
663 unlet s:recordfile
664 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000665 else
666" call Decho("s:record[file|dir] doesn't exist")
667 endif
668
Bram Moolenaarf2330482008-06-24 20:19:36 +0000669" call Dret("s:RecordInFile")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000670endfun
671
672" ---------------------------------------------------------------------
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000673" s:VimballHome: determine/get home directory path (usually from rtp) {{{2
674fun! s:VimballHome()
675" call Dfunc("VimballHome()")
676 if exists("g:vimball_home")
677 let home= g:vimball_home
678 else
679 " go to vim plugin home
680 for home in split(&rtp,',') + ['']
681 if isdirectory(home) && filewritable(home) | break | endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000682 let basehome= substitute(home,'[/\\]\.vim$','','')
683 if isdirectory(basehome) && filewritable(basehome)
684 let home= basehome."/.vim"
685 break
686 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000687 endfor
688 if home == ""
689 " just pick the first directory
690 let home= substitute(&rtp,',.*$','','')
691 endif
692 if (has("win32") || has("win95") || has("win64") || has("win16"))
693 let home= substitute(home,'/','\\','g')
694 endif
695 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000696 " insure that the home directory exists
697" call Decho("picked home<".home.">")
698 if !isdirectory(home)
699 if exists("g:vimball_mkdir")
700" call Decho("home<".home."> isn't a directory -- making it now with g:vimball_mkdir<".g:vimball_mkdir.">")
701" call Decho("system(".g:vimball_mkdir." ".s:Escape(home).")")
702 call system(g:vimball_mkdir." ".s:Escape(home))
703 else
704" call Decho("home<".home."> isn't a directory -- making it now with mkdir()")
705 call mkdir(home)
706 endif
707 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000708" call Dret("VimballHome <".home.">")
709 return home
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000710endfun
711
712" ---------------------------------------------------------------------
Bram Moolenaarf2330482008-06-24 20:19:36 +0000713" vimball#SaveSettings: {{{2
714fun! vimball#SaveSettings()
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000715" call Dfunc("SaveSettings()")
716 let s:makeep = getpos("'a")
717 let s:regakeep= @a
Bram Moolenaard68071d2006-05-02 22:08:30 +0000718 if exists("&acd")
719 let s:acdkeep = &acd
720 endif
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000721 let s:eikeep = &ei
722 let s:fenkeep = &fen
723 let s:hidkeep = &hidden
724 let s:ickeep = &ic
Bram Moolenaar143c38c2007-05-10 16:41:10 +0000725 let s:lzkeep = &lz
726 let s:pmkeep = &pm
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000727 let s:repkeep = &report
728 let s:vekeep = &ve
Bram Moolenaarf2330482008-06-24 20:19:36 +0000729 let s:ffkeep = &ff
Bram Moolenaard68071d2006-05-02 22:08:30 +0000730 if exists("&acd")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000731 setlocal ei=all ve=all noacd nofen noic report=999 nohid bt= ma lz pm= ff=unix
Bram Moolenaard68071d2006-05-02 22:08:30 +0000732 else
Bram Moolenaarf2330482008-06-24 20:19:36 +0000733 setlocal ei=all ve=all nofen noic report=999 nohid bt= ma lz pm= ff=unix
Bram Moolenaard68071d2006-05-02 22:08:30 +0000734 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000735 " vimballs should be in unix format
736 setlocal ff=unix
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000737" call Dret("SaveSettings")
738endfun
739
740" ---------------------------------------------------------------------
Bram Moolenaarf2330482008-06-24 20:19:36 +0000741" vimball#RestoreSettings: {{{2
742fun! vimball#RestoreSettings()
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000743" call Dfunc("RestoreSettings()")
744 let @a = s:regakeep
Bram Moolenaard68071d2006-05-02 22:08:30 +0000745 if exists("&acd")
746 let &acd = s:acdkeep
747 endif
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000748 let &fen = s:fenkeep
749 let &hidden = s:hidkeep
750 let &ic = s:ickeep
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000751 let &lz = s:lzkeep
Bram Moolenaar143c38c2007-05-10 16:41:10 +0000752 let &pm = s:pmkeep
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000753 let &report = s:repkeep
754 let &ve = s:vekeep
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000755 let &ei = s:eikeep
Bram Moolenaarf2330482008-06-24 20:19:36 +0000756 let &ff = s:ffkeep
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000757 if s:makeep[0] != 0
758 " restore mark a
759" call Decho("restore mark-a: makeep=".string(makeep))
760 call setpos("'a",s:makeep)
761 endif
Bram Moolenaard68071d2006-05-02 22:08:30 +0000762 if exists("&acd")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000763 unlet s:acdkeep
Bram Moolenaard68071d2006-05-02 22:08:30 +0000764 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000765 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 +0000766" call Dret("RestoreSettings")
767endfun
768
769" ---------------------------------------------------------------------
Bram Moolenaarf2330482008-06-24 20:19:36 +0000770" s:Escape: {{{2
771fun s:Escape(name)
772 " shellescape() was added by patch 7.0.111
773 if exists("*shellescape")
774 return shellescape(a:name)
775 endif
776 return g:netrw_shq . a:name . g:netrw_shq
777endfun
778
779" ---------------------------------------------------------------------
780" Restore:
781let &cpo= s:keepcpo
782unlet s:keepcpo
783
784" ---------------------------------------------------------------------
Bram Moolenaareee697b2006-03-21 21:20:39 +0000785" Modelines: {{{1
786" vim: fdm=marker