blob: 13e82ac49f206ba20defaa05424d3a08eedcd529 [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 Moolenaar00a927d2010-05-14 23:24:24 +02003" Date: Apr 12, 2010
4" Version: 31
Bram Moolenaareee697b2006-03-21 21:20:39 +00005" GetLatestVimScripts: 1502 1 :AutoInstall: vimball.vim
Bram Moolenaar5c736222010-01-06 20:54:52 +01006" Copyright: (c) 2004-2009 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 Moolenaar5c736222010-01-06 20:54:52 +010014if &cp || exists("g:loaded_vimball")
Bram Moolenaareee697b2006-03-21 21:20:39 +000015 finish
16endif
Bram Moolenaar00a927d2010-05-14 23:24:24 +020017let g:loaded_vimball = "v31"
Bram Moolenaar5c736222010-01-06 20:54:52 +010018if v:version < 702
19 echohl WarningMsg
20 echo "***warning*** this version of vimball needs vim 7.2"
21 echohl Normal
22 finish
23endif
24let s:keepcpo= &cpo
Bram Moolenaareee697b2006-03-21 21:20:39 +000025set cpo&vim
Bram Moolenaarf2330482008-06-24 20:19:36 +000026"DechoTabOn
Bram Moolenaareee697b2006-03-21 21:20:39 +000027
28" =====================================================================
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000029" Constants: {{{1
30if !exists("s:USAGE")
31 let s:USAGE = 0
32 let s:WARNING = 1
33 let s:ERROR = 2
Bram Moolenaarf2330482008-06-24 20:19:36 +000034
35 " determine if cygwin is in use or not
36 if !exists("g:netrw_cygwin")
37 if has("win32") || has("win95") || has("win64") || has("win16")
38 if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
39 let g:netrw_cygwin= 1
40 else
41 let g:netrw_cygwin= 0
42 endif
43 else
44 let g:netrw_cygwin= 0
45 endif
46 endif
47
48 " set up g:vimball_mkdir if the mkdir() call isn't defined
49 if !exists("*mkdir")
50 if exists("g:netrw_local_mkdir")
51 let g:vimball_mkdir= g:netrw_local_mkdir
52 elseif executable("mkdir")
53 let g:vimball_mkdir= "mkdir"
54 elseif executable("makedir")
55 let g:vimball_mkdir= "makedir"
56 endif
57 if !exists(g:vimball_mkdir)
58 call vimball#ShowMesg(s:WARNING,"(vimball) g:vimball_mkdir undefined")
59 endif
60 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000061endif
62
63" =====================================================================
Bram Moolenaareee697b2006-03-21 21:20:39 +000064" Functions: {{{1
65
66" ---------------------------------------------------------------------
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000067" vimball#MkVimball: creates a vimball given a list of paths to files {{{2
Bram Moolenaarf2330482008-06-24 20:19:36 +000068" Input:
69" line1,line2: a range of lines containing paths to files to be included in the vimball
70" writelevel : if true, force a write to filename.vba, even if it exists
71" (usually accomplished with :MkVimball! ...
72" filename : base name of file to be created (ie. filename.vba)
73" Output: a filename.vba using vimball format:
Bram Moolenaareee697b2006-03-21 21:20:39 +000074" path
75" filesize
76" [file]
77" path
78" filesize
79" [file]
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000080fun! vimball#MkVimball(line1,line2,writelevel,...) range
81" 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 +000082 if a:1 =~ '\.vim$' || a:1 =~ '\.txt$'
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000083 let vbname= substitute(a:1,'\.\a\{3}$','.vba','')
84 else
85 let vbname= a:1
86 endif
87 if vbname !~ '\.vba$'
88 let vbname= vbname.'.vba'
89 endif
90" call Decho("vbname<".vbname.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +010091 if !a:writelevel && a:1 =~ '[\/]'
92 call vimball#ShowMesg(s:ERROR,"(MkVimball) vimball name<".a:1."> should not include slashes; use ! to insist")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000093" call Dret("MkVimball : vimball name<".a:1."> should not include slashes")
94 return
95 endif
Bram Moolenaareee697b2006-03-21 21:20:39 +000096 if !a:writelevel && filereadable(vbname)
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +000097 call vimball#ShowMesg(s:ERROR,"(MkVimball) file<".vbname."> exists; use ! to insist")
Bram Moolenaareee697b2006-03-21 21:20:39 +000098" call Dret("MkVimball : file<".vbname."> already exists; use ! to insist")
99 return
100 endif
101
102 " user option bypass
Bram Moolenaarf2330482008-06-24 20:19:36 +0000103 call vimball#SaveSettings()
Bram Moolenaareee697b2006-03-21 21:20:39 +0000104
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000105 if a:0 >= 2
106 " allow user to specify where to get the files
107 let home= expand(a:2)
108 else
109 " use first existing directory from rtp
Bram Moolenaar5c736222010-01-06 20:54:52 +0100110 let home= vimball#VimballHome()
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000111 endif
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000112
113 " save current directory
Bram Moolenaareee697b2006-03-21 21:20:39 +0000114 let curdir = getcwd()
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000115 call s:ChgDir(home)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000116
117 " record current tab, initialize while loop index
118 let curtabnr = tabpagenr()
119 let linenr = a:line1
120" call Decho("curtabnr=".curtabnr)
121
122 while linenr <= a:line2
123 let svfile = getline(linenr)
124" call Decho("svfile<".svfile.">")
125
126 if !filereadable(svfile)
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000127 call vimball#ShowMesg(s:ERROR,"unable to read file<".svfile.">")
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000128 call s:ChgDir(curdir)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000129 call vimball#RestoreSettings()
Bram Moolenaareee697b2006-03-21 21:20:39 +0000130" call Dret("MkVimball")
131 return
132 endif
133
134 " create/switch to mkvimball tab
135 if !exists("vbtabnr")
136 tabnew
137 silent! file Vimball
138 let vbtabnr= tabpagenr()
139 else
140 exe "tabn ".vbtabnr
141 endif
142
143 let lastline= line("$") + 1
144 if lastline == 2 && getline("$") == ""
145 call setline(1,'" Vimball Archiver by Charles E. Campbell, Jr., Ph.D.')
146 call setline(2,'UseVimball')
147 call setline(3,'finish')
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000148 let lastline= line("$") + 1
Bram Moolenaareee697b2006-03-21 21:20:39 +0000149 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000150 call setline(lastline ,substitute(svfile,'$',' [[[1',''))
Bram Moolenaareee697b2006-03-21 21:20:39 +0000151 call setline(lastline+1,0)
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000152
153 " write the file from the tab
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000154" call Decho("exe $r ".fnameescape(svfile))
155 exe "$r ".fnameescape(svfile)
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000156
Bram Moolenaareee697b2006-03-21 21:20:39 +0000157 call setline(lastline+1,line("$") - lastline - 1)
158" call Decho("lastline=".lastline." line$=".line("$"))
159
160 " restore to normal tab
161 exe "tabn ".curtabnr
162 let linenr= linenr + 1
163 endwhile
164
165 " write the vimball
166 exe "tabn ".vbtabnr
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000167 call s:ChgDir(curdir)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000168 setlocal ff=unix
Bram Moolenaar8ab561d2006-03-23 22:44:10 +0000169 if a:writelevel
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000170" call Decho("exe w! ".fnameescape(vbname))
171 exe "w! ".fnameescape(vbname)
Bram Moolenaar8ab561d2006-03-23 22:44:10 +0000172 else
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000173" call Decho("exe w ".fnameescape(vbname))
174 exe "w ".fnameescape(vbname)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000175 endif
176" call Decho("Vimball<".vbname."> created")
177 echo "Vimball<".vbname."> created"
178
179 " remove the evidence
180 setlocal nomod bh=wipe
181 exe "tabn ".curtabnr
182 exe "tabc ".vbtabnr
183
184 " restore options
Bram Moolenaarf2330482008-06-24 20:19:36 +0000185 call vimball#RestoreSettings()
Bram Moolenaareee697b2006-03-21 21:20:39 +0000186
187" call Dret("MkVimball")
188endfun
189
190" ---------------------------------------------------------------------
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000191" vimball#Vimball: extract and distribute contents from a vimball {{{2
Bram Moolenaarf2330482008-06-24 20:19:36 +0000192" (invoked the the UseVimball command embedded in
193" vimballs' prologue)
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000194fun! vimball#Vimball(really,...)
195" call Dfunc("vimball#Vimball(really=".a:really.") a:0=".a:0)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000196
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000197 if v:version < 701 || (v:version == 701 && !exists('*fnameescape'))
198 echoerr "your vim is missing the fnameescape() function"
Bram Moolenaarf2330482008-06-24 20:19:36 +0000199" call Dret("vimball#Vimball : needs 7.1 with patch 299")
200 return
201 endif
202
Bram Moolenaar5c736222010-01-06 20:54:52 +0100203 if getline(1) !~ '^" Vimball Archiver'
Bram Moolenaareee697b2006-03-21 21:20:39 +0000204 echoerr "(Vimball) The current file does not appear to be a Vimball!"
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000205" call Dret("vimball#Vimball")
Bram Moolenaareee697b2006-03-21 21:20:39 +0000206 return
207 endif
208
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000209 " set up standard settings
Bram Moolenaarf2330482008-06-24 20:19:36 +0000210 call vimball#SaveSettings()
211 let curtabnr = tabpagenr()
212 let vimballfile = expand("%:tr")
Bram Moolenaareee697b2006-03-21 21:20:39 +0000213
214 " set up vimball tab
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000215" call Decho("setting up vimball tab")
Bram Moolenaareee697b2006-03-21 21:20:39 +0000216 tabnew
217 silent! file Vimball
218 let vbtabnr= tabpagenr()
219 let didhelp= ""
220
221 " go to vim plugin home
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000222 if a:0 > 0
223 let home= expand(a:1)
224 else
Bram Moolenaar5c736222010-01-06 20:54:52 +0100225 let home= vimball#VimballHome()
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000226 endif
227" call Decho("home<".home.">")
228
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000229 " save current directory and remove older same-named vimball, if any
Bram Moolenaareee697b2006-03-21 21:20:39 +0000230 let curdir = getcwd()
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000231" call Decho("home<".home.">")
232" call Decho("curdir<".curdir.">")
233
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000234 call s:ChgDir(home)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000235 let s:ok_unablefind= 1
236 call vimball#RmVimball(vimballfile)
237 unlet s:ok_unablefind
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000238
Bram Moolenaareee697b2006-03-21 21:20:39 +0000239 let linenr = 4
240 let filecnt = 0
241
242 " give title to listing of (extracted) files from Vimball Archive
243 if a:really
Bram Moolenaarf2330482008-06-24 20:19:36 +0000244 echohl Title | echomsg "Vimball Archive" | echohl None
245 else
246 echohl Title | echomsg "Vimball Archive Listing" | echohl None
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000247 echohl Statement | echomsg "files would be placed under: ".home | echohl None
Bram Moolenaareee697b2006-03-21 21:20:39 +0000248 endif
249
250 " apportion vimball contents to various files
251" call Decho("exe tabn ".curtabnr)
252 exe "tabn ".curtabnr
253" call Decho("linenr=".linenr." line$=".line("$"))
254 while 1 < linenr && linenr < line("$")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000255 let fname = substitute(getline(linenr),'\t\[\[\[1$','','')
256 let fname = substitute(fname,'\\','/','g')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100257" let fsize = getline(linenr+1)+0
258 let fsize = substitute(getline(linenr+1),'^\(\d\+\).\{-}$','\1','')+0
259 let fenc = substitute(getline(linenr+1),'^\d\+\s*\(\S\+\)$','\1','')
Bram Moolenaareee697b2006-03-21 21:20:39 +0000260 let filecnt = filecnt + 1
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000261" call Decho("fname<".fname."> fsize=".fsize." filecnt=".filecnt)
262
Bram Moolenaareee697b2006-03-21 21:20:39 +0000263 if a:really
264 echomsg "extracted <".fname.">: ".fsize." lines"
265 else
266 echomsg "would extract <".fname.">: ".fsize." lines"
267 endif
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000268" call Decho("using L#".linenr.": will extract file<".fname.">")
269" call Decho("using L#".(linenr+1).": fsize=".fsize)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000270
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000271 " Allow AsNeeded/ directory to take place of plugin/ directory
Bram Moolenaarf2330482008-06-24 20:19:36 +0000272 " when AsNeeded/filename is filereadable or was present in VimballRecord
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000273 if fname =~ '\<plugin/'
274 let anfname= substitute(fname,'\<plugin/','AsNeeded/','')
Bram Moolenaarf2330482008-06-24 20:19:36 +0000275 if filereadable(anfname) || (exists("s:VBRstring") && s:VBRstring =~ anfname)
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000276" call Decho("using anfname<".anfname."> instead of <".fname.">")
277 let fname= anfname
278 endif
279 endif
280
Bram Moolenaareee697b2006-03-21 21:20:39 +0000281 " make directories if they don't exist yet
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000282 if a:really
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000283" call Decho("making directories if they don't exist yet (fname<".fname.">)")
284 let fnamebuf= substitute(fname,'\\','/','g')
285 let dirpath = substitute(home,'\\','/','g')
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000286 while fnamebuf =~ '/'
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000287 let dirname = dirpath."/".substitute(fnamebuf,'/.*$','','')
288 let dirpath = dirname
289 let fnamebuf = substitute(fnamebuf,'^.\{-}/\(.*\)$','\1','')
290" call Decho("dirname<".dirname.">")
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000291 if !isdirectory(dirname)
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000292" call Decho("making <".dirname.">")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000293 if exists("g:vimball_mkdir")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100294 call system(g:vimball_mkdir." ".shellescape(dirname))
Bram Moolenaarf2330482008-06-24 20:19:36 +0000295 else
296 call mkdir(dirname)
297 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000298 call s:RecordInVar(home,"rmdir('".dirname."')")
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000299 endif
300 endwhile
301 endif
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000302 call s:ChgDir(home)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000303
304 " grab specified qty of lines and place into "a" buffer
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000305 " (skip over path/filename and qty-lines)
306 let linenr = linenr + 2
307 let lastline = linenr + fsize - 1
308" call Decho("exe ".linenr.",".lastline."yank a")
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000309 exe "silent ".linenr.",".lastline."yank a"
Bram Moolenaareee697b2006-03-21 21:20:39 +0000310
311 " copy "a" buffer into tab
312" call Decho('copy "a buffer into tab#'.vbtabnr)
313 exe "tabn ".vbtabnr
Bram Moolenaarf2330482008-06-24 20:19:36 +0000314 setlocal ma
Bram Moolenaareee697b2006-03-21 21:20:39 +0000315 silent! %d
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000316 silent put a
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000317 1
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000318 silent d
Bram Moolenaareee697b2006-03-21 21:20:39 +0000319
320 " write tab to file
Bram Moolenaar8ab561d2006-03-23 22:44:10 +0000321 if a:really
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000322 let fnamepath= home."/".fname
Bram Moolenaarf2330482008-06-24 20:19:36 +0000323" call Decho("exe w! ".fnameescape(fnamepath))
Bram Moolenaar5c736222010-01-06 20:54:52 +0100324 if fenc != ""
325 exe "silent w! ++enc=".fnameescape(fenc)." ".fnameescape(fnamepath)
326 else
327 exe "silent w! ".fnameescape(fnamepath)
328 endif
329 echo "wrote ".fnameescape(fnamepath)
330 call s:RecordInVar(home,"call delete('".fnamepath."')")
Bram Moolenaar8ab561d2006-03-23 22:44:10 +0000331 endif
Bram Moolenaareee697b2006-03-21 21:20:39 +0000332
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000333 " return to tab with vimball
Bram Moolenaareee697b2006-03-21 21:20:39 +0000334" call Decho("exe tabn ".curtabnr)
335 exe "tabn ".curtabnr
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000336
337 " set up help if its a doc/*.txt file
338" call Decho("didhelp<".didhelp."> fname<".fname.">")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000339 if a:really && didhelp == "" && fname =~ 'doc/[^/]\+\.\(txt\|..x\)$'
340 let didhelp= substitute(fname,'^\(.*\<doc\)[/\\][^.]*\.\(txt\|..x\)$','\1','')
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000341" call Decho("didhelp<".didhelp.">")
342 endif
343
344 " update for next file
Bram Moolenaarf2330482008-06-24 20:19:36 +0000345" call Decho("update linenr= [linenr=".linenr."] + [fsize=".fsize."] = ".(linenr+fsize))
346 let linenr= linenr + fsize
Bram Moolenaareee697b2006-03-21 21:20:39 +0000347 endwhile
348
349 " set up help
350" call Decho("about to set up help: didhelp<".didhelp.">")
351 if didhelp != ""
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000352 let htpath= home."/".didhelp
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000353" call Decho("exe helptags ".htpath)
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000354 exe "helptags ".fnameescape(htpath)
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000355 echo "did helptags"
Bram Moolenaareee697b2006-03-21 21:20:39 +0000356 endif
357
358 " make sure a "Press ENTER..." prompt appears to keep the messages showing!
Bram Moolenaar8ab561d2006-03-23 22:44:10 +0000359 while filecnt <= &ch
Bram Moolenaareee697b2006-03-21 21:20:39 +0000360 echomsg " "
361 let filecnt= filecnt + 1
362 endwhile
363
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000364 " record actions in <.VimballRecord>
365 call s:RecordInFile(home)
366
Bram Moolenaareee697b2006-03-21 21:20:39 +0000367 " restore events, delete tab and buffer
368 exe "tabn ".vbtabnr
369 setlocal nomod bh=wipe
370 exe "tabn ".curtabnr
371 exe "tabc ".vbtabnr
Bram Moolenaarf2330482008-06-24 20:19:36 +0000372 call vimball#RestoreSettings()
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000373 call s:ChgDir(curdir)
Bram Moolenaareee697b2006-03-21 21:20:39 +0000374
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000375" call Dret("vimball#Vimball")
376endfun
377
378" ---------------------------------------------------------------------
379" vimball#RmVimball: remove any files, remove any directories made by any {{{2
380" previous vimball extraction based on a file of the current
381" name.
382" Usage: RmVimball (assume current file is a vimball; remove)
383" RmVimball vimballname
384fun! vimball#RmVimball(...)
385" call Dfunc("vimball#RmVimball() a:0=".a:0)
386 if exists("g:vimball_norecord")
387" call Dret("vimball#RmVimball : (g:vimball_norecord)")
388 return
389 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000390
391 if a:0 == 0
Bram Moolenaarf2330482008-06-24 20:19:36 +0000392 let curfile= expand("%:tr")
393" call Decho("case a:0=0: curfile<".curfile."> (used expand(%:tr))")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000394 else
395 if a:1 =~ '[\/]'
396 call vimball#ShowMesg(s:USAGE,"RmVimball vimballname [path]")
397" call Dret("vimball#RmVimball : suspect a:1<".a:1.">")
398 return
399 endif
400 let curfile= a:1
Bram Moolenaarf2330482008-06-24 20:19:36 +0000401" call Decho("case a:0=".a:0.": curfile<".curfile.">")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000402 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000403 if curfile =~ '\.vba$'
404 let curfile= substitute(curfile,'\.vba','','')
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000405 endif
406 if a:0 >= 2
407 let home= expand(a:2)
408 else
Bram Moolenaar5c736222010-01-06 20:54:52 +0100409 let home= vimball#VimballHome()
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000410 endif
411 let curdir = getcwd()
412" call Decho("home <".home.">")
413" call Decho("curfile<".curfile.">")
414" call Decho("curdir <".curdir.">")
415
416 call s:ChgDir(home)
417 if filereadable(".VimballRecord")
418" call Decho(".VimballRecord is readable")
419" call Decho("curfile<".curfile.">")
420 keepalt keepjumps 1split
421 silent! keepalt keepjumps e .VimballRecord
422 let keepsrch= @/
Bram Moolenaar5c736222010-01-06 20:54:52 +0100423" call Decho('search for ^\M'.curfile.'.\m: ')
424" call Decho('search for ^\M'.curfile.'.\mvba: ')
425" call Decho('search for ^\M'.curfile.'\m[-0-9.]*\.vba: ')
426 if search('^\M'.curfile."\m: ".'cw')
Bram Moolenaarf2330482008-06-24 20:19:36 +0000427 let foundit= 1
Bram Moolenaar5c736222010-01-06 20:54:52 +0100428 elseif search('^\M'.curfile.".\mvba: ",'cw')
Bram Moolenaarf2330482008-06-24 20:19:36 +0000429 let foundit= 1
Bram Moolenaar5c736222010-01-06 20:54:52 +0100430 elseif search('^\M'.curfile.'\m[-0-9.]*\.vba: ','cw')
Bram Moolenaarf2330482008-06-24 20:19:36 +0000431 let foundit= 1
432 else
433 let foundit = 0
434 endif
435 if foundit
Bram Moolenaar5c736222010-01-06 20:54:52 +0100436 let exestring = substitute(getline("."),'^\M'.curfile.'\m\S\{-}\.vba: ','','')
Bram Moolenaarf2330482008-06-24 20:19:36 +0000437 let s:VBRstring= substitute(exestring,'call delete(','','g')
438 let s:VBRstring= substitute(s:VBRstring,"[')]",'','g')
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000439" call Decho("exe ".exestring)
440 silent! keepalt keepjumps exe exestring
441 silent! keepalt keepjumps d
Bram Moolenaarf2330482008-06-24 20:19:36 +0000442 let exestring= strlen(substitute(exestring,'call delete(.\{-})|\=',"D","g"))
443" call Decho("exestring<".exestring.">")
444 echomsg "removed ".exestring." files"
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000445 else
Bram Moolenaarf2330482008-06-24 20:19:36 +0000446 let s:VBRstring= ''
447 let curfile = substitute(curfile,'\.vba','','')
448" call Decho("unable to find <".curfile."> in .VimballRecord")
449 if !exists("s:ok_unablefind")
450 call vimball#ShowMesg(s:WARNING,"(RmVimball) unable to find <".curfile."> in .VimballRecord")
451 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000452 endif
453 silent! keepalt keepjumps g/^\s*$/d
454 silent! keepalt keepjumps wq!
455 let @/= keepsrch
456 endif
457 call s:ChgDir(curdir)
458
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000459" call Dret("vimball#RmVimball")
Bram Moolenaareee697b2006-03-21 21:20:39 +0000460endfun
461
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000462" ---------------------------------------------------------------------
463" vimball#Decompress: attempts to automatically decompress vimballs {{{2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100464fun! vimball#Decompress(fname,...)
465" call Dfunc("Decompress(fname<".a:fname.">) a:0=".a:0)
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000466
467 " decompression:
468 if expand("%") =~ '.*\.gz' && executable("gunzip")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000469 " handle *.gz with gunzip
Bram Moolenaar5c736222010-01-06 20:54:52 +0100470 silent exe "!gunzip ".shellescape(a:fname)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000471 if v:shell_error != 0
472 call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) gunzip may have failed with <".a:fname.">")
473 endif
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000474 let fname= substitute(a:fname,'\.gz$','','')
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000475 exe "e ".escape(fname,' \')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100476 if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000477
478 elseif expand("%") =~ '.*\.gz' && executable("gzip")
479 " handle *.gz with gzip -d
Bram Moolenaar5c736222010-01-06 20:54:52 +0100480 silent exe "!gzip -d ".shellescape(a:fname)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000481 if v:shell_error != 0
482 call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "gzip -d" may have failed with <'.a:fname.">")
483 endif
484 let fname= substitute(a:fname,'\.gz$','','')
485 exe "e ".escape(fname,' \')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100486 if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000487
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000488 elseif expand("%") =~ '.*\.bz2' && executable("bunzip2")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000489 " handle *.bz2 with bunzip2
Bram Moolenaar5c736222010-01-06 20:54:52 +0100490 silent exe "!bunzip2 ".shellescape(a:fname)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000491 if v:shell_error != 0
492 call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) bunzip2 may have failed with <".a:fname.">")
493 endif
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000494 let fname= substitute(a:fname,'\.bz2$','','')
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000495 exe "e ".escape(fname,' \')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100496 if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000497
498 elseif expand("%") =~ '.*\.bz2' && executable("bzip2")
499 " handle *.bz2 with bzip2 -d
Bram Moolenaar5c736222010-01-06 20:54:52 +0100500 silent exe "!bzip2 -d ".shellescape(a:fname)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000501 if v:shell_error != 0
502 call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "bzip2 -d" may have failed with <'.a:fname.">")
503 endif
504 let fname= substitute(a:fname,'\.bz2$','','')
505 exe "e ".escape(fname,' \')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100506 if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000507
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000508 elseif expand("%") =~ '.*\.zip' && executable("unzip")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000509 " handle *.zip with unzip
Bram Moolenaar5c736222010-01-06 20:54:52 +0100510 silent exe "!unzip ".shellescape(a:fname)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000511 if v:shell_error != 0
512 call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) unzip may have failed with <".a:fname.">")
513 endif
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000514 let fname= substitute(a:fname,'\.zip$','','')
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000515 exe "e ".escape(fname,' \')
Bram Moolenaar5c736222010-01-06 20:54:52 +0100516 if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000517 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000518
Bram Moolenaar5c736222010-01-06 20:54:52 +0100519 if a:0 == 0| setlocal noma bt=nofile fmr=[[[,]]] fdm=marker | endif
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000520
521" call Dret("Decompress")
522endfun
523
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000524" ---------------------------------------------------------------------
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000525" vimball#ShowMesg: {{{2
526fun! vimball#ShowMesg(level,msg)
527" call Dfunc("vimball#ShowMesg(level=".a:level." msg<".a:msg.">)")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100528
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000529 let rulerkeep = &ruler
530 let showcmdkeep = &showcmd
531 set noruler noshowcmd
532 redraw!
533
534 if &fo =~ '[ta]'
Bram Moolenaar5c736222010-01-06 20:54:52 +0100535 echomsg "***vimball*** ".a:msg
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000536 else
537 if a:level == s:WARNING || a:level == s:USAGE
538 echohl WarningMsg
539 elseif a:level == s:ERROR
540 echohl Error
541 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100542 echomsg "***vimball*** ".a:msg
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000543 echohl None
544 endif
545
546 if a:level != s:USAGE
547 call inputsave()|let ok= input("Press <cr> to continue")|call inputrestore()
548 endif
549
550 let &ruler = rulerkeep
551 let &showcmd = showcmdkeep
552
553" call Dret("vimball#ShowMesg")
554endfun
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000555" =====================================================================
556" s:ChgDir: change directory (in spite of Windoze) {{{2
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000557fun! s:ChgDir(newdir)
558" call Dfunc("ChgDir(newdir<".a:newdir.">)")
559 if (has("win32") || has("win95") || has("win64") || has("win16"))
Bram Moolenaarf2330482008-06-24 20:19:36 +0000560 exe 'silent cd '.fnameescape(substitute(a:newdir,'/','\\','g'))
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000561 else
Bram Moolenaarf2330482008-06-24 20:19:36 +0000562 exe 'silent cd '.fnameescape(a:newdir)
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000563 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000564" call Dret("ChgDir : curdir<".getcwd().">")
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000565endfun
566
567" ---------------------------------------------------------------------
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000568" s:RecordInVar: record a un-vimball command in the .VimballRecord file {{{2
569fun! s:RecordInVar(home,cmd)
570" call Dfunc("RecordInVar(home<".a:home."> cmd<".a:cmd.">)")
571 if a:cmd =~ '^rmdir'
572" if !exists("s:recorddir")
573" let s:recorddir= substitute(a:cmd,'^rmdir',"call s:Rmdir",'')
574" else
575" let s:recorddir= s:recorddir."|".substitute(a:cmd,'^rmdir',"call s:Rmdir",'')
576" endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000577 elseif !exists("s:recordfile")
578 let s:recordfile= a:cmd
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000579 else
580 let s:recordfile= s:recordfile."|".a:cmd
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000581 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000582" call Dret("RecordInVar : s:recordfile<".(exists("s:recordfile")? s:recordfile : "")."> s:recorddir<".(exists("s:recorddir")? s:recorddir : "").">")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000583endfun
584
585" ---------------------------------------------------------------------
586" s:RecordInFile: {{{2
587fun! s:RecordInFile(home)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000588" call Dfunc("s:RecordInFile()")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000589 if exists("g:vimball_norecord")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000590" call Dret("s:RecordInFile : g:vimball_norecord")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000591 return
592 endif
593
594 if exists("s:recordfile") || exists("s:recorddir")
595 let curdir= getcwd()
596 call s:ChgDir(a:home)
597 keepalt keepjumps 1split
Bram Moolenaarf2330482008-06-24 20:19:36 +0000598
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000599 let cmd= expand("%:tr").": "
Bram Moolenaarf2330482008-06-24 20:19:36 +0000600" call Decho("cmd<".cmd.">")
601
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000602 silent! keepalt keepjumps e .VimballRecord
Bram Moolenaarf2330482008-06-24 20:19:36 +0000603 setlocal ma
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000604 $
605 if exists("s:recordfile") && exists("s:recorddir")
606 let cmd= cmd.s:recordfile."|".s:recorddir
607 elseif exists("s:recorddir")
608 let cmd= cmd.s:recorddir
609 elseif exists("s:recordfile")
610 let cmd= cmd.s:recordfile
611 else
Bram Moolenaarf2330482008-06-24 20:19:36 +0000612" call Dret("s:RecordInFile : neither recordfile nor recorddir exist")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000613 return
614 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000615" call Decho("cmd<".cmd.">")
616
617 " put command into buffer, write .VimballRecord `file
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000618 keepalt keepjumps put=cmd
619 silent! keepalt keepjumps g/^\s*$/d
620 silent! keepalt keepjumps wq!
621 call s:ChgDir(curdir)
Bram Moolenaarf2330482008-06-24 20:19:36 +0000622
623 if exists("s:recorddir")
624" call Decho("unlet s:recorddir<".s:recorddir.">")
625 unlet s:recorddir
626 endif
627 if exists("s:recordfile")
628" call Decho("unlet s:recordfile<".s:recordfile.">")
629 unlet s:recordfile
630 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000631 else
632" call Decho("s:record[file|dir] doesn't exist")
633 endif
634
Bram Moolenaarf2330482008-06-24 20:19:36 +0000635" call Dret("s:RecordInFile")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000636endfun
637
638" ---------------------------------------------------------------------
Bram Moolenaar5c736222010-01-06 20:54:52 +0100639" vimball#VimballHome: determine/get home directory path (usually from rtp) {{{2
640fun! vimball#VimballHome()
641" call Dfunc("vimball#VimballHome()")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000642 if exists("g:vimball_home")
643 let home= g:vimball_home
644 else
645 " go to vim plugin home
646 for home in split(&rtp,',') + ['']
647 if isdirectory(home) && filewritable(home) | break | endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000648 let basehome= substitute(home,'[/\\]\.vim$','','')
649 if isdirectory(basehome) && filewritable(basehome)
650 let home= basehome."/.vim"
651 break
652 endif
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000653 endfor
654 if home == ""
655 " just pick the first directory
656 let home= substitute(&rtp,',.*$','','')
657 endif
658 if (has("win32") || has("win95") || has("win64") || has("win16"))
659 let home= substitute(home,'/','\\','g')
660 endif
661 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000662 " insure that the home directory exists
663" call Decho("picked home<".home.">")
664 if !isdirectory(home)
665 if exists("g:vimball_mkdir")
666" call Decho("home<".home."> isn't a directory -- making it now with g:vimball_mkdir<".g:vimball_mkdir.">")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100667" call Decho("system(".g:vimball_mkdir." ".shellescape(home).")")
668 call system(g:vimball_mkdir." ".shellescape(home))
Bram Moolenaarf2330482008-06-24 20:19:36 +0000669 else
670" call Decho("home<".home."> isn't a directory -- making it now with mkdir()")
671 call mkdir(home)
672 endif
673 endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100674" call Dret("vimball#VimballHome <".home.">")
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000675 return home
Bram Moolenaarf193fff2006-04-27 00:02:13 +0000676endfun
677
678" ---------------------------------------------------------------------
Bram Moolenaarf2330482008-06-24 20:19:36 +0000679" vimball#SaveSettings: {{{2
680fun! vimball#SaveSettings()
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000681" call Dfunc("SaveSettings()")
682 let s:makeep = getpos("'a")
683 let s:regakeep= @a
Bram Moolenaard68071d2006-05-02 22:08:30 +0000684 if exists("&acd")
685 let s:acdkeep = &acd
686 endif
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000687 let s:eikeep = &ei
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000688 let s:fenkeep = &l:fen
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000689 let s:hidkeep = &hidden
690 let s:ickeep = &ic
Bram Moolenaar143c38c2007-05-10 16:41:10 +0000691 let s:lzkeep = &lz
692 let s:pmkeep = &pm
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000693 let s:repkeep = &report
694 let s:vekeep = &ve
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000695 let s:ffkeep = &l:ff
Bram Moolenaard68071d2006-05-02 22:08:30 +0000696 if exists("&acd")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000697 setlocal ei=all ve=all noacd nofen noic report=999 nohid bt= ma lz pm= ff=unix
Bram Moolenaard68071d2006-05-02 22:08:30 +0000698 else
Bram Moolenaarf2330482008-06-24 20:19:36 +0000699 setlocal ei=all ve=all nofen noic report=999 nohid bt= ma lz pm= ff=unix
Bram Moolenaard68071d2006-05-02 22:08:30 +0000700 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000701 " vimballs should be in unix format
702 setlocal ff=unix
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000703" call Dret("SaveSettings")
704endfun
705
706" ---------------------------------------------------------------------
Bram Moolenaarf2330482008-06-24 20:19:36 +0000707" vimball#RestoreSettings: {{{2
708fun! vimball#RestoreSettings()
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000709" call Dfunc("RestoreSettings()")
710 let @a = s:regakeep
Bram Moolenaard68071d2006-05-02 22:08:30 +0000711 if exists("&acd")
712 let &acd = s:acdkeep
713 endif
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000714 let &l:fen = s:fenkeep
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000715 let &hidden = s:hidkeep
716 let &ic = s:ickeep
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000717 let &lz = s:lzkeep
Bram Moolenaar143c38c2007-05-10 16:41:10 +0000718 let &pm = s:pmkeep
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000719 let &report = s:repkeep
720 let &ve = s:vekeep
Bram Moolenaardd2a3cd2007-05-05 17:10:09 +0000721 let &ei = s:eikeep
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000722 let &l:ff = s:ffkeep
Bram Moolenaar25e2c9e2006-04-27 21:40:34 +0000723 if s:makeep[0] != 0
724 " restore mark a
725" call Decho("restore mark-a: makeep=".string(makeep))
726 call setpos("'a",s:makeep)
727 endif
Bram Moolenaard68071d2006-05-02 22:08:30 +0000728 if exists("&acd")
Bram Moolenaarf2330482008-06-24 20:19:36 +0000729 unlet s:acdkeep
Bram Moolenaard68071d2006-05-02 22:08:30 +0000730 endif
Bram Moolenaarf2330482008-06-24 20:19:36 +0000731 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 +0000732" call Dret("RestoreSettings")
733endfun
734
735" ---------------------------------------------------------------------
Bram Moolenaareee697b2006-03-21 21:20:39 +0000736" Modelines: {{{1
737" vim: fdm=marker