xref: /vim-8.2.3635/runtime/autoload/vimball.vim (revision 3e496b0e)
1dd2a3cdaSBram Moolenaar" vimball.vim : construct a file containing both paths and files
203413f44SBram Moolenaar" Author:	Charles E. Campbell
303413f44SBram Moolenaar" Date:		Apr 11, 2016
403413f44SBram Moolenaar" Version:	37
5eee697b7SBram Moolenaar" GetLatestVimScripts: 1502 1 :AutoInstall: vimball.vim
603413f44SBram Moolenaar" Copyright: (c) 2004-2011 by Charles E. Campbell
7eee697b7SBram Moolenaar"            The VIM LICENSE applies to Vimball.vim, and Vimball.txt
8eee697b7SBram Moolenaar"            (see |copyright|) except use "Vimball" instead of "Vim".
9eee697b7SBram Moolenaar"            No warranty, express or implied.
10eee697b7SBram Moolenaar"  *** ***   Use At-Your-Own-Risk!   *** ***
11eee697b7SBram Moolenaar
12eee697b7SBram Moolenaar" ---------------------------------------------------------------------
13eee697b7SBram Moolenaar"  Load Once: {{{1
145c73622aSBram Moolenaarif &cp || exists("g:loaded_vimball")
155c73622aSBram Moolenaar finish
165c73622aSBram Moolenaarendif
1703413f44SBram Moolenaarlet g:loaded_vimball = "v37"
185c73622aSBram Moolenaarif v:version < 702
195c73622aSBram Moolenaar echohl WarningMsg
205c73622aSBram Moolenaar echo "***warning*** this version of vimball needs vim 7.2"
215c73622aSBram Moolenaar echohl Normal
22eee697b7SBram Moolenaar finish
23eee697b7SBram Moolenaarendif
24eee697b7SBram Moolenaarlet s:keepcpo= &cpo
25eee697b7SBram Moolenaarset cpo&vim
26f233048aSBram Moolenaar"DechoTabOn
27eee697b7SBram Moolenaar
28eee697b7SBram Moolenaar" =====================================================================
29dd2a3cdaSBram Moolenaar" Constants: {{{1
30dd2a3cdaSBram Moolenaarif !exists("s:USAGE")
31dd2a3cdaSBram Moolenaar let s:USAGE   = 0
32dd2a3cdaSBram Moolenaar let s:WARNING = 1
33dd2a3cdaSBram Moolenaar let s:ERROR   = 2
34f233048aSBram Moolenaar
35f233048aSBram Moolenaar " determine if cygwin is in use or not
36f233048aSBram Moolenaar if !exists("g:netrw_cygwin")
37f233048aSBram Moolenaar  if has("win32") || has("win95") || has("win64") || has("win16")
38f233048aSBram Moolenaar   if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
39f233048aSBram Moolenaar    let g:netrw_cygwin= 1
40f233048aSBram Moolenaar   else
41f233048aSBram Moolenaar    let g:netrw_cygwin= 0
42f233048aSBram Moolenaar   endif
43f233048aSBram Moolenaar  else
44f233048aSBram Moolenaar   let g:netrw_cygwin= 0
45f233048aSBram Moolenaar  endif
46f233048aSBram Moolenaar endif
47f233048aSBram Moolenaar
48f233048aSBram Moolenaar " set up g:vimball_mkdir if the mkdir() call isn't defined
49f233048aSBram Moolenaar if !exists("*mkdir")
50f233048aSBram Moolenaar  if exists("g:netrw_local_mkdir")
51f233048aSBram Moolenaar   let g:vimball_mkdir= g:netrw_local_mkdir
52f233048aSBram Moolenaar  elseif executable("mkdir")
53f233048aSBram Moolenaar   let g:vimball_mkdir= "mkdir"
54f233048aSBram Moolenaar  elseif executable("makedir")
55f233048aSBram Moolenaar   let g:vimball_mkdir= "makedir"
56f233048aSBram Moolenaar  endif
57f233048aSBram Moolenaar  if !exists(g:vimball_mkdir)
58f233048aSBram Moolenaar   call vimball#ShowMesg(s:WARNING,"(vimball) g:vimball_mkdir undefined")
59f233048aSBram Moolenaar  endif
60f233048aSBram Moolenaar endif
61dd2a3cdaSBram Moolenaarendif
62dd2a3cdaSBram Moolenaar
63dd2a3cdaSBram Moolenaar" =====================================================================
64eee697b7SBram Moolenaar"  Functions: {{{1
65eee697b7SBram Moolenaar
66eee697b7SBram Moolenaar" ---------------------------------------------------------------------
67dd2a3cdaSBram Moolenaar" vimball#MkVimball: creates a vimball given a list of paths to files {{{2
68f233048aSBram Moolenaar" Input:
69f233048aSBram Moolenaar"     line1,line2: a range of lines containing paths to files to be included in the vimball
70251e1912SBram Moolenaar"     writelevel : if true, force a write to filename.vmb, even if it exists
71f233048aSBram Moolenaar"                  (usually accomplished with :MkVimball! ...
72251e1912SBram Moolenaar"     filename   : base name of file to be created (ie. filename.vmb)
73251e1912SBram Moolenaar" Output: a filename.vmb using vimball format:
74eee697b7SBram Moolenaar"     path
75eee697b7SBram Moolenaar"     filesize
76eee697b7SBram Moolenaar"     [file]
77eee697b7SBram Moolenaar"     path
78eee697b7SBram Moolenaar"     filesize
79eee697b7SBram Moolenaar"     [file]
80dd2a3cdaSBram Moolenaarfun! vimball#MkVimball(line1,line2,writelevel,...) range
81dd2a3cdaSBram Moolenaar"  call Dfunc("MkVimball(line1=".a:line1." line2=".a:line2." writelevel=".a:writelevel." vimballname<".a:1.">) a:0=".a:0)
82f233048aSBram Moolenaar  if a:1 =~ '\.vim$' || a:1 =~ '\.txt$'
83251e1912SBram Moolenaar   let vbname= substitute(a:1,'\.\a\{3}$','.vmb','')
84dd2a3cdaSBram Moolenaar  else
85dd2a3cdaSBram Moolenaar   let vbname= a:1
86dd2a3cdaSBram Moolenaar  endif
87251e1912SBram Moolenaar  if vbname !~ '\.vmb$'
88251e1912SBram Moolenaar   let vbname= vbname.'.vmb'
89dd2a3cdaSBram Moolenaar  endif
90dd2a3cdaSBram Moolenaar"  call Decho("vbname<".vbname.">")
915c73622aSBram Moolenaar  if !a:writelevel && a:1 =~ '[\/]'
925c73622aSBram Moolenaar   call vimball#ShowMesg(s:ERROR,"(MkVimball) vimball name<".a:1."> should not include slashes; use ! to insist")
93dd2a3cdaSBram Moolenaar"   call Dret("MkVimball : vimball name<".a:1."> should not include slashes")
94dd2a3cdaSBram Moolenaar   return
95dd2a3cdaSBram Moolenaar  endif
96eee697b7SBram Moolenaar  if !a:writelevel && filereadable(vbname)
97dd2a3cdaSBram Moolenaar   call vimball#ShowMesg(s:ERROR,"(MkVimball) file<".vbname."> exists; use ! to insist")
98eee697b7SBram Moolenaar"   call Dret("MkVimball : file<".vbname."> already exists; use ! to insist")
99eee697b7SBram Moolenaar   return
100eee697b7SBram Moolenaar  endif
101eee697b7SBram Moolenaar
102eee697b7SBram Moolenaar  " user option bypass
103f233048aSBram Moolenaar  call vimball#SaveSettings()
104eee697b7SBram Moolenaar
105dd2a3cdaSBram Moolenaar  if a:0 >= 2
106dd2a3cdaSBram Moolenaar   " allow user to specify where to get the files
107dd2a3cdaSBram Moolenaar   let home= expand(a:2)
108dd2a3cdaSBram Moolenaar  else
109dd2a3cdaSBram Moolenaar   " use first existing directory from rtp
1105c73622aSBram Moolenaar   let home= vimball#VimballHome()
111f193fffdSBram Moolenaar  endif
112f193fffdSBram Moolenaar
113f193fffdSBram Moolenaar  " save current directory
114eee697b7SBram Moolenaar  let curdir = getcwd()
115f193fffdSBram Moolenaar  call s:ChgDir(home)
116eee697b7SBram Moolenaar
117eee697b7SBram Moolenaar  " record current tab, initialize while loop index
118eee697b7SBram Moolenaar  let curtabnr = tabpagenr()
119eee697b7SBram Moolenaar  let linenr   = a:line1
120eee697b7SBram Moolenaar"  call Decho("curtabnr=".curtabnr)
121eee697b7SBram Moolenaar
122eee697b7SBram Moolenaar  while linenr <= a:line2
123eee697b7SBram Moolenaar   let svfile  = getline(linenr)
124eee697b7SBram Moolenaar"   call Decho("svfile<".svfile.">")
125eee697b7SBram Moolenaar
126eee697b7SBram Moolenaar   if !filereadable(svfile)
127dd2a3cdaSBram Moolenaar    call vimball#ShowMesg(s:ERROR,"unable to read file<".svfile.">")
128f193fffdSBram Moolenaar	call s:ChgDir(curdir)
129f233048aSBram Moolenaar	call vimball#RestoreSettings()
130eee697b7SBram Moolenaar"    call Dret("MkVimball")
131eee697b7SBram Moolenaar    return
132eee697b7SBram Moolenaar   endif
133eee697b7SBram Moolenaar
134eee697b7SBram Moolenaar   " create/switch to mkvimball tab
135eee697b7SBram Moolenaar   if !exists("vbtabnr")
136eee697b7SBram Moolenaar    tabnew
137251e1912SBram Moolenaar    sil! file Vimball
138eee697b7SBram Moolenaar    let vbtabnr= tabpagenr()
139eee697b7SBram Moolenaar   else
140eee697b7SBram Moolenaar    exe "tabn ".vbtabnr
141eee697b7SBram Moolenaar   endif
142eee697b7SBram Moolenaar
143eee697b7SBram Moolenaar   let lastline= line("$") + 1
144eee697b7SBram Moolenaar   if lastline == 2 && getline("$") == ""
14503413f44SBram Moolenaar	call setline(1,'" Vimball Archiver by Charles E. Campbell')
146eee697b7SBram Moolenaar	call setline(2,'UseVimball')
147eee697b7SBram Moolenaar	call setline(3,'finish')
148dd2a3cdaSBram Moolenaar	let lastline= line("$") + 1
149eee697b7SBram Moolenaar   endif
150dd2a3cdaSBram Moolenaar   call setline(lastline  ,substitute(svfile,'$','	[[[1',''))
151eee697b7SBram Moolenaar   call setline(lastline+1,0)
152f193fffdSBram Moolenaar
153f193fffdSBram Moolenaar   " write the file from the tab
154e37d50a5SBram Moolenaar"   call Decho("exe $r ".fnameescape(svfile))
155e37d50a5SBram Moolenaar   exe "$r ".fnameescape(svfile)
156f193fffdSBram Moolenaar
157eee697b7SBram Moolenaar   call setline(lastline+1,line("$") - lastline - 1)
158eee697b7SBram Moolenaar"   call Decho("lastline=".lastline." line$=".line("$"))
159eee697b7SBram Moolenaar
160eee697b7SBram Moolenaar  " restore to normal tab
161eee697b7SBram Moolenaar   exe "tabn ".curtabnr
162eee697b7SBram Moolenaar   let linenr= linenr + 1
163eee697b7SBram Moolenaar  endwhile
164eee697b7SBram Moolenaar
165eee697b7SBram Moolenaar  " write the vimball
166eee697b7SBram Moolenaar  exe "tabn ".vbtabnr
167f193fffdSBram Moolenaar  call s:ChgDir(curdir)
168f233048aSBram Moolenaar  setlocal ff=unix
169eee697b7SBram Moolenaar  if a:writelevel
170e37d50a5SBram Moolenaar"   call Decho("exe w! ".fnameescape(vbname))
171e37d50a5SBram Moolenaar   exe "w! ".fnameescape(vbname)
172eee697b7SBram Moolenaar  else
173e37d50a5SBram Moolenaar"   call Decho("exe w ".fnameescape(vbname))
174e37d50a5SBram Moolenaar   exe "w ".fnameescape(vbname)
175eee697b7SBram Moolenaar  endif
176eee697b7SBram Moolenaar"  call Decho("Vimball<".vbname."> created")
177eee697b7SBram Moolenaar  echo "Vimball<".vbname."> created"
178eee697b7SBram Moolenaar
179eee697b7SBram Moolenaar  " remove the evidence
180eee697b7SBram Moolenaar  setlocal nomod bh=wipe
181eee697b7SBram Moolenaar  exe "tabn ".curtabnr
18203413f44SBram Moolenaar  exe "tabc! ".vbtabnr
183eee697b7SBram Moolenaar
184eee697b7SBram Moolenaar  " restore options
185f233048aSBram Moolenaar  call vimball#RestoreSettings()
186eee697b7SBram Moolenaar
187eee697b7SBram Moolenaar"  call Dret("MkVimball")
188eee697b7SBram Moolenaarendfun
189eee697b7SBram Moolenaar
190eee697b7SBram Moolenaar" ---------------------------------------------------------------------
191dd2a3cdaSBram Moolenaar" vimball#Vimball: extract and distribute contents from a vimball {{{2
192f233048aSBram Moolenaar"                  (invoked the the UseVimball command embedded in
193f233048aSBram Moolenaar"                  vimballs' prologue)
194dd2a3cdaSBram Moolenaarfun! vimball#Vimball(really,...)
195dd2a3cdaSBram Moolenaar"  call Dfunc("vimball#Vimball(really=".a:really.") a:0=".a:0)
196eee697b7SBram Moolenaar
197e37d50a5SBram Moolenaar  if v:version < 701 || (v:version == 701 && !exists('*fnameescape'))
198251e1912SBram Moolenaar   echoerr "your vim is missing the fnameescape() function (pls upgrade to vim 7.2 or later)"
199251e1912SBram Moolenaar"   call Dret("vimball#Vimball : needs 7.1 with patch 299 or later")
200f233048aSBram Moolenaar   return
201f233048aSBram Moolenaar  endif
202f233048aSBram Moolenaar
2035c73622aSBram Moolenaar  if getline(1) !~ '^" Vimball Archiver'
204eee697b7SBram Moolenaar   echoerr "(Vimball) The current file does not appear to be a Vimball!"
205dd2a3cdaSBram Moolenaar"   call Dret("vimball#Vimball")
206eee697b7SBram Moolenaar   return
207eee697b7SBram Moolenaar  endif
208eee697b7SBram Moolenaar
20925e2c9e3SBram Moolenaar  " set up standard settings
210f233048aSBram Moolenaar  call vimball#SaveSettings()
211eee697b7SBram Moolenaar  let curtabnr    = tabpagenr()
212f233048aSBram Moolenaar  let vimballfile = expand("%:tr")
213eee697b7SBram Moolenaar
214eee697b7SBram Moolenaar  " set up vimball tab
215dd2a3cdaSBram Moolenaar"  call Decho("setting up vimball tab")
216eee697b7SBram Moolenaar  tabnew
217251e1912SBram Moolenaar  sil! file Vimball
218eee697b7SBram Moolenaar  let vbtabnr= tabpagenr()
219eee697b7SBram Moolenaar  let didhelp= ""
220eee697b7SBram Moolenaar
221eee697b7SBram Moolenaar  " go to vim plugin home
222dd2a3cdaSBram Moolenaar  if a:0 > 0
2231514667aSBram Moolenaar   " let user specify the directory where the vimball is to be unpacked.
2241514667aSBram Moolenaar   " If, however, the user did not specify a full path, set the home to be below the current directory
225dd2a3cdaSBram Moolenaar   let home= expand(a:1)
2261514667aSBram Moolenaar   if has("win32") || has("win95") || has("win64") || has("win16")
2271514667aSBram Moolenaar	if home !~ '^\a:[/\\]'
2281514667aSBram Moolenaar	 let home= getcwd().'/'.a:1
2291514667aSBram Moolenaar	endif
2301514667aSBram Moolenaar   elseif home !~ '^/'
2311514667aSBram Moolenaar	let home= getcwd().'/'.a:1
2321514667aSBram Moolenaar   endif
233dd2a3cdaSBram Moolenaar  else
2345c73622aSBram Moolenaar   let home= vimball#VimballHome()
235f193fffdSBram Moolenaar  endif
236f193fffdSBram Moolenaar"  call Decho("home<".home.">")
237f193fffdSBram Moolenaar
238dd2a3cdaSBram Moolenaar  " save current directory and remove older same-named vimball, if any
239eee697b7SBram Moolenaar  let curdir = getcwd()
240dd2a3cdaSBram Moolenaar"  call Decho("home<".home.">")
241dd2a3cdaSBram Moolenaar"  call Decho("curdir<".curdir.">")
242dd2a3cdaSBram Moolenaar
243f193fffdSBram Moolenaar  call s:ChgDir(home)
244f233048aSBram Moolenaar  let s:ok_unablefind= 1
245f233048aSBram Moolenaar  call vimball#RmVimball(vimballfile)
246f233048aSBram Moolenaar  unlet s:ok_unablefind
247f193fffdSBram Moolenaar
248eee697b7SBram Moolenaar  let linenr  = 4
249eee697b7SBram Moolenaar  let filecnt = 0
250eee697b7SBram Moolenaar
251eee697b7SBram Moolenaar  " give title to listing of (extracted) files from Vimball Archive
252eee697b7SBram Moolenaar  if a:really
253eee697b7SBram Moolenaar   echohl Title     | echomsg "Vimball Archive"         | echohl None
254eee697b7SBram Moolenaar  else
255eee697b7SBram Moolenaar   echohl Title     | echomsg "Vimball Archive Listing" | echohl None
25625e2c9e3SBram Moolenaar   echohl Statement | echomsg "files would be placed under: ".home | echohl None
257eee697b7SBram Moolenaar  endif
258eee697b7SBram Moolenaar
259eee697b7SBram Moolenaar  " apportion vimball contents to various files
260eee697b7SBram Moolenaar"  call Decho("exe tabn ".curtabnr)
261eee697b7SBram Moolenaar  exe "tabn ".curtabnr
262eee697b7SBram Moolenaar"  call Decho("linenr=".linenr." line$=".line("$"))
263eee697b7SBram Moolenaar  while 1 < linenr && linenr < line("$")
264dd2a3cdaSBram Moolenaar   let fname   = substitute(getline(linenr),'\t\[\[\[1$','','')
265dd2a3cdaSBram Moolenaar   let fname   = substitute(fname,'\\','/','g')
2665c73622aSBram Moolenaar   let fsize   = substitute(getline(linenr+1),'^\(\d\+\).\{-}$','\1','')+0
267251e1912SBram Moolenaar   let fenc    = substitute(getline(linenr+1),'^\d\+\s*\(\S\{-}\)$','\1','')
268eee697b7SBram Moolenaar   let filecnt = filecnt + 1
269251e1912SBram Moolenaar"   call Decho("fname<".fname."> fsize=".fsize." filecnt=".filecnt. " fenc=".fenc)
270dd2a3cdaSBram Moolenaar
271eee697b7SBram Moolenaar   if a:really
272eee697b7SBram Moolenaar    echomsg "extracted <".fname.">: ".fsize." lines"
273eee697b7SBram Moolenaar   else
274eee697b7SBram Moolenaar    echomsg "would extract <".fname.">: ".fsize." lines"
275eee697b7SBram Moolenaar   endif
276f9393ef5SBram Moolenaar"   call Decho("using L#".linenr.": will extract file<".fname.">")
277f9393ef5SBram Moolenaar"   call Decho("using L#".(linenr+1).": fsize=".fsize)
278eee697b7SBram Moolenaar
279dd2a3cdaSBram Moolenaar   " Allow AsNeeded/ directory to take place of plugin/ directory
280f233048aSBram Moolenaar   " when AsNeeded/filename is filereadable or was present in VimballRecord
281dd2a3cdaSBram Moolenaar   if fname =~ '\<plugin/'
282dd2a3cdaSBram Moolenaar   	let anfname= substitute(fname,'\<plugin/','AsNeeded/','')
28303413f44SBram Moolenaar	if filereadable(anfname) || (exists("s:VBRstring") && s:VBRstring =~# anfname)
284dd2a3cdaSBram Moolenaar"	 call Decho("using anfname<".anfname."> instead of <".fname.">")
285dd2a3cdaSBram Moolenaar	 let fname= anfname
286dd2a3cdaSBram Moolenaar	endif
287dd2a3cdaSBram Moolenaar   endif
288dd2a3cdaSBram Moolenaar
289eee697b7SBram Moolenaar   " make directories if they don't exist yet
29025e2c9e3SBram Moolenaar   if a:really
291dd2a3cdaSBram Moolenaar"    call Decho("making directories if they don't exist yet (fname<".fname.">)")
292dd2a3cdaSBram Moolenaar    let fnamebuf= substitute(fname,'\\','/','g')
293dd2a3cdaSBram Moolenaar	let dirpath = substitute(home,'\\','/','g')
2941514667aSBram Moolenaar"	call Decho("init: fnamebuf<".fnamebuf.">")
2951514667aSBram Moolenaar"	call Decho("init: dirpath <".dirpath.">")
296eee697b7SBram Moolenaar    while fnamebuf =~ '/'
297dd2a3cdaSBram Moolenaar     let dirname  = dirpath."/".substitute(fnamebuf,'/.*$','','')
298dd2a3cdaSBram Moolenaar	 let dirpath  = dirname
299dd2a3cdaSBram Moolenaar     let fnamebuf = substitute(fnamebuf,'^.\{-}/\(.*\)$','\1','')
300dd2a3cdaSBram Moolenaar"	 call Decho("dirname<".dirname.">")
3011514667aSBram Moolenaar"	 call Decho("dirpath<".dirpath.">")
302eee697b7SBram Moolenaar     if !isdirectory(dirname)
303eee697b7SBram Moolenaar"      call Decho("making <".dirname.">")
304f233048aSBram Moolenaar      if exists("g:vimball_mkdir")
3055c73622aSBram Moolenaar	   call system(g:vimball_mkdir." ".shellescape(dirname))
306f233048aSBram Moolenaar      else
307eee697b7SBram Moolenaar       call mkdir(dirname)
308f233048aSBram Moolenaar      endif
309dd2a3cdaSBram Moolenaar	  call s:RecordInVar(home,"rmdir('".dirname."')")
310eee697b7SBram Moolenaar     endif
311eee697b7SBram Moolenaar    endwhile
31225e2c9e3SBram Moolenaar   endif
313f193fffdSBram Moolenaar   call s:ChgDir(home)
314eee697b7SBram Moolenaar
315eee697b7SBram Moolenaar   " grab specified qty of lines and place into "a" buffer
316f9393ef5SBram Moolenaar   " (skip over path/filename and qty-lines)
317f9393ef5SBram Moolenaar   let linenr   = linenr + 2
318f9393ef5SBram Moolenaar   let lastline = linenr + fsize - 1
319f9393ef5SBram Moolenaar"   call Decho("exe ".linenr.",".lastline."yank a")
320251e1912SBram Moolenaar   " no point in handling a zero-length file
321251e1912SBram Moolenaar   if lastline >= linenr
322f193fffdSBram Moolenaar    exe "silent ".linenr.",".lastline."yank a"
323eee697b7SBram Moolenaar
324eee697b7SBram Moolenaar    " copy "a" buffer into tab
325eee697b7SBram Moolenaar"   call Decho('copy "a buffer into tab#'.vbtabnr)
326eee697b7SBram Moolenaar    exe "tabn ".vbtabnr
327f233048aSBram Moolenaar    setlocal ma
328251e1912SBram Moolenaar    sil! %d
329f193fffdSBram Moolenaar    silent put a
330f9393ef5SBram Moolenaar    1
331251e1912SBram Moolenaar    sil! d
332eee697b7SBram Moolenaar
333eee697b7SBram Moolenaar    " write tab to file
3348ab561d3SBram Moolenaar    if a:really
335e37d50a5SBram Moolenaar     let fnamepath= home."/".fname
336f233048aSBram Moolenaar"    call Decho("exe w! ".fnameescape(fnamepath))
3375c73622aSBram Moolenaar	if fenc != ""
3385c73622aSBram Moolenaar	 exe "silent w! ++enc=".fnameescape(fenc)." ".fnameescape(fnamepath)
3395c73622aSBram Moolenaar	else
340f233048aSBram Moolenaar	 exe "silent w! ".fnameescape(fnamepath)
3415c73622aSBram Moolenaar	endif
3425c73622aSBram Moolenaar	echo "wrote ".fnameescape(fnamepath)
3435c73622aSBram Moolenaar	call s:RecordInVar(home,"call delete('".fnamepath."')")
3448ab561d3SBram Moolenaar    endif
345eee697b7SBram Moolenaar
346f9393ef5SBram Moolenaar    " return to tab with vimball
347eee697b7SBram Moolenaar"   call Decho("exe tabn ".curtabnr)
348eee697b7SBram Moolenaar    exe "tabn ".curtabnr
349f9393ef5SBram Moolenaar
350*3e496b0eSBram Moolenaar    " set up help if it's a doc/*.txt file
351f9393ef5SBram Moolenaar"   call Decho("didhelp<".didhelp."> fname<".fname.">")
352f233048aSBram Moolenaar    if a:really && didhelp == "" && fname =~ 'doc/[^/]\+\.\(txt\|..x\)$'
353f233048aSBram Moolenaar    	let didhelp= substitute(fname,'^\(.*\<doc\)[/\\][^.]*\.\(txt\|..x\)$','\1','')
354f9393ef5SBram Moolenaar"	call Decho("didhelp<".didhelp.">")
355f9393ef5SBram Moolenaar    endif
356251e1912SBram Moolenaar   endif
357f9393ef5SBram Moolenaar
358f9393ef5SBram Moolenaar   " update for next file
359f233048aSBram Moolenaar"   call Decho("update linenr= [linenr=".linenr."] + [fsize=".fsize."] = ".(linenr+fsize))
360f9393ef5SBram Moolenaar   let linenr= linenr + fsize
361eee697b7SBram Moolenaar  endwhile
362eee697b7SBram Moolenaar
363eee697b7SBram Moolenaar  " set up help
364eee697b7SBram Moolenaar"  call Decho("about to set up help: didhelp<".didhelp.">")
365eee697b7SBram Moolenaar  if didhelp != ""
366e37d50a5SBram Moolenaar   let htpath= home."/".didhelp
367f193fffdSBram Moolenaar"   call Decho("exe helptags ".htpath)
368e37d50a5SBram Moolenaar   exe "helptags ".fnameescape(htpath)
369f193fffdSBram Moolenaar   echo "did helptags"
370eee697b7SBram Moolenaar  endif
371eee697b7SBram Moolenaar
372eee697b7SBram Moolenaar  " make sure a "Press ENTER..." prompt appears to keep the messages showing!
3738ab561d3SBram Moolenaar  while filecnt <= &ch
374eee697b7SBram Moolenaar   echomsg " "
375eee697b7SBram Moolenaar   let filecnt= filecnt + 1
376eee697b7SBram Moolenaar  endwhile
377eee697b7SBram Moolenaar
378dd2a3cdaSBram Moolenaar  " record actions in <.VimballRecord>
379dd2a3cdaSBram Moolenaar  call s:RecordInFile(home)
380dd2a3cdaSBram Moolenaar
381eee697b7SBram Moolenaar  " restore events, delete tab and buffer
38203413f44SBram Moolenaar  exe "sil! tabn ".vbtabnr
383eee697b7SBram Moolenaar  setlocal nomod bh=wipe
38403413f44SBram Moolenaar  exe "sil! tabn ".curtabnr
38503413f44SBram Moolenaar  exe "sil! tabc! ".vbtabnr
386f233048aSBram Moolenaar  call vimball#RestoreSettings()
387f193fffdSBram Moolenaar  call s:ChgDir(curdir)
388eee697b7SBram Moolenaar
389dd2a3cdaSBram Moolenaar"  call Dret("vimball#Vimball")
390dd2a3cdaSBram Moolenaarendfun
391dd2a3cdaSBram Moolenaar
392dd2a3cdaSBram Moolenaar" ---------------------------------------------------------------------
393dd2a3cdaSBram Moolenaar" vimball#RmVimball: remove any files, remove any directories made by any {{{2
394dd2a3cdaSBram Moolenaar"               previous vimball extraction based on a file of the current
395dd2a3cdaSBram Moolenaar"               name.
396dd2a3cdaSBram Moolenaar"  Usage:  RmVimball  (assume current file is a vimball; remove)
397dd2a3cdaSBram Moolenaar"          RmVimball vimballname
398dd2a3cdaSBram Moolenaarfun! vimball#RmVimball(...)
399dd2a3cdaSBram Moolenaar"  call Dfunc("vimball#RmVimball() a:0=".a:0)
400dd2a3cdaSBram Moolenaar  if exists("g:vimball_norecord")
401dd2a3cdaSBram Moolenaar"   call Dret("vimball#RmVimball : (g:vimball_norecord)")
402dd2a3cdaSBram Moolenaar   return
403dd2a3cdaSBram Moolenaar  endif
404dd2a3cdaSBram Moolenaar
405dd2a3cdaSBram Moolenaar  if a:0 == 0
406f233048aSBram Moolenaar   let curfile= expand("%:tr")
407f233048aSBram Moolenaar"   call Decho("case a:0=0: curfile<".curfile."> (used expand(%:tr))")
408dd2a3cdaSBram Moolenaar  else
409dd2a3cdaSBram Moolenaar   if a:1 =~ '[\/]'
410dd2a3cdaSBram Moolenaar    call vimball#ShowMesg(s:USAGE,"RmVimball vimballname [path]")
411dd2a3cdaSBram Moolenaar"    call Dret("vimball#RmVimball : suspect a:1<".a:1.">")
412dd2a3cdaSBram Moolenaar    return
413dd2a3cdaSBram Moolenaar   endif
414dd2a3cdaSBram Moolenaar   let curfile= a:1
415f233048aSBram Moolenaar"   call Decho("case a:0=".a:0.": curfile<".curfile.">")
416dd2a3cdaSBram Moolenaar  endif
417251e1912SBram Moolenaar  if curfile =~ '\.vmb$'
418251e1912SBram Moolenaar   let curfile= substitute(curfile,'\.vmb','','')
419251e1912SBram Moolenaar  elseif curfile =~ '\.vba$'
420f233048aSBram Moolenaar   let curfile= substitute(curfile,'\.vba','','')
421dd2a3cdaSBram Moolenaar  endif
422dd2a3cdaSBram Moolenaar  if a:0 >= 2
423dd2a3cdaSBram Moolenaar   let home= expand(a:2)
424dd2a3cdaSBram Moolenaar  else
4255c73622aSBram Moolenaar   let home= vimball#VimballHome()
426dd2a3cdaSBram Moolenaar  endif
427dd2a3cdaSBram Moolenaar  let curdir = getcwd()
428dd2a3cdaSBram Moolenaar"  call Decho("home   <".home.">")
429dd2a3cdaSBram Moolenaar"  call Decho("curfile<".curfile.">")
430dd2a3cdaSBram Moolenaar"  call Decho("curdir <".curdir.">")
431dd2a3cdaSBram Moolenaar
432dd2a3cdaSBram Moolenaar  call s:ChgDir(home)
433dd2a3cdaSBram Moolenaar  if filereadable(".VimballRecord")
434dd2a3cdaSBram Moolenaar"   call Decho(".VimballRecord is readable")
435dd2a3cdaSBram Moolenaar"   call Decho("curfile<".curfile.">")
436dd2a3cdaSBram Moolenaar   keepalt keepjumps 1split
437251e1912SBram Moolenaar   sil! keepalt keepjumps e .VimballRecord
438dd2a3cdaSBram Moolenaar   let keepsrch= @/
4395c73622aSBram Moolenaar"   call Decho('search for ^\M'.curfile.'.\m: ')
440251e1912SBram Moolenaar"   call Decho('search for ^\M'.curfile.'.\m{vba|vmb}: ')
441251e1912SBram Moolenaar"   call Decho('search for ^\M'.curfile.'\m[-0-9.]*\.{vba|vmb}: ')
4425c73622aSBram Moolenaar   if search('^\M'.curfile."\m: ".'cw')
443f233048aSBram Moolenaar	let foundit= 1
444251e1912SBram Moolenaar   elseif search('^\M'.curfile.".\mvmb: ",'cw')
445251e1912SBram Moolenaar	let foundit= 2
446251e1912SBram Moolenaar   elseif search('^\M'.curfile.'\m[-0-9.]*\.vmb: ','cw')
447251e1912SBram Moolenaar	let foundit= 2
4485c73622aSBram Moolenaar   elseif search('^\M'.curfile.".\mvba: ",'cw')
449f233048aSBram Moolenaar	let foundit= 1
4505c73622aSBram Moolenaar   elseif search('^\M'.curfile.'\m[-0-9.]*\.vba: ','cw')
451f233048aSBram Moolenaar	let foundit= 1
452f233048aSBram Moolenaar   else
453f233048aSBram Moolenaar    let foundit = 0
454f233048aSBram Moolenaar   endif
455f233048aSBram Moolenaar   if foundit
456251e1912SBram Moolenaar	if foundit == 1
4575c73622aSBram Moolenaar	 let exestring  = substitute(getline("."),'^\M'.curfile.'\m\S\{-}\.vba: ','','')
458251e1912SBram Moolenaar	else
459251e1912SBram Moolenaar	 let exestring  = substitute(getline("."),'^\M'.curfile.'\m\S\{-}\.vmb: ','','')
460251e1912SBram Moolenaar	endif
461f233048aSBram Moolenaar    let s:VBRstring= substitute(exestring,'call delete(','','g')
462f233048aSBram Moolenaar    let s:VBRstring= substitute(s:VBRstring,"[')]",'','g')
463dd2a3cdaSBram Moolenaar"	call Decho("exe ".exestring)
464251e1912SBram Moolenaar	sil! keepalt keepjumps exe exestring
465251e1912SBram Moolenaar	sil! keepalt keepjumps d
466f233048aSBram Moolenaar	let exestring= strlen(substitute(exestring,'call delete(.\{-})|\=',"D","g"))
467f233048aSBram Moolenaar"	call Decho("exestring<".exestring.">")
468f233048aSBram Moolenaar	echomsg "removed ".exestring." files"
469dd2a3cdaSBram Moolenaar   else
470f233048aSBram Moolenaar    let s:VBRstring= ''
471251e1912SBram Moolenaar	let curfile    = substitute(curfile,'\.vmb','','')
472dd2a3cdaSBram Moolenaar"    call Decho("unable to find <".curfile."> in .VimballRecord")
473f233048aSBram Moolenaar	if !exists("s:ok_unablefind")
474f233048aSBram Moolenaar     call vimball#ShowMesg(s:WARNING,"(RmVimball) unable to find <".curfile."> in .VimballRecord")
475f233048aSBram Moolenaar	endif
476dd2a3cdaSBram Moolenaar   endif
477251e1912SBram Moolenaar   sil! keepalt keepjumps g/^\s*$/d
478251e1912SBram Moolenaar   sil! keepalt keepjumps wq!
479dd2a3cdaSBram Moolenaar   let @/= keepsrch
480dd2a3cdaSBram Moolenaar  endif
481dd2a3cdaSBram Moolenaar  call s:ChgDir(curdir)
482dd2a3cdaSBram Moolenaar
483dd2a3cdaSBram Moolenaar"  call Dret("vimball#RmVimball")
484eee697b7SBram Moolenaarendfun
485eee697b7SBram Moolenaar
486551dbcc9SBram Moolenaar" ---------------------------------------------------------------------
487551dbcc9SBram Moolenaar" vimball#Decompress: attempts to automatically decompress vimballs {{{2
4885c73622aSBram Moolenaarfun! vimball#Decompress(fname,...)
4895c73622aSBram Moolenaar"  call Dfunc("Decompress(fname<".a:fname.">) a:0=".a:0)
490551dbcc9SBram Moolenaar
491551dbcc9SBram Moolenaar  " decompression:
492551dbcc9SBram Moolenaar  if     expand("%") =~ '.*\.gz'  && executable("gunzip")
493f233048aSBram Moolenaar   " handle *.gz with gunzip
4945c73622aSBram Moolenaar   silent exe "!gunzip ".shellescape(a:fname)
495f233048aSBram Moolenaar   if v:shell_error != 0
496f233048aSBram Moolenaar	call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) gunzip may have failed with <".a:fname.">")
497f233048aSBram Moolenaar   endif
498551dbcc9SBram Moolenaar   let fname= substitute(a:fname,'\.gz$','','')
499f193fffdSBram Moolenaar   exe "e ".escape(fname,' \')
5005c73622aSBram Moolenaar   if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
501f233048aSBram Moolenaar
502f233048aSBram Moolenaar  elseif expand("%") =~ '.*\.gz' && executable("gzip")
503f233048aSBram Moolenaar   " handle *.gz with gzip -d
5045c73622aSBram Moolenaar   silent exe "!gzip -d ".shellescape(a:fname)
505f233048aSBram Moolenaar   if v:shell_error != 0
506f233048aSBram Moolenaar	call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "gzip -d" may have failed with <'.a:fname.">")
507f233048aSBram Moolenaar   endif
508f233048aSBram Moolenaar   let fname= substitute(a:fname,'\.gz$','','')
509f233048aSBram Moolenaar   exe "e ".escape(fname,' \')
5105c73622aSBram Moolenaar   if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
511f233048aSBram Moolenaar
512551dbcc9SBram Moolenaar  elseif expand("%") =~ '.*\.bz2' && executable("bunzip2")
513f233048aSBram Moolenaar   " handle *.bz2 with bunzip2
5145c73622aSBram Moolenaar   silent exe "!bunzip2 ".shellescape(a:fname)
515f233048aSBram Moolenaar   if v:shell_error != 0
516f233048aSBram Moolenaar	call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) bunzip2 may have failed with <".a:fname.">")
517f233048aSBram Moolenaar   endif
518551dbcc9SBram Moolenaar   let fname= substitute(a:fname,'\.bz2$','','')
519f193fffdSBram Moolenaar   exe "e ".escape(fname,' \')
5205c73622aSBram Moolenaar   if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
521f233048aSBram Moolenaar
522f233048aSBram Moolenaar  elseif expand("%") =~ '.*\.bz2' && executable("bzip2")
523f233048aSBram Moolenaar   " handle *.bz2 with bzip2 -d
5245c73622aSBram Moolenaar   silent exe "!bzip2 -d ".shellescape(a:fname)
525f233048aSBram Moolenaar   if v:shell_error != 0
526f233048aSBram Moolenaar	call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "bzip2 -d" may have failed with <'.a:fname.">")
527f233048aSBram Moolenaar   endif
528f233048aSBram Moolenaar   let fname= substitute(a:fname,'\.bz2$','','')
529f233048aSBram Moolenaar   exe "e ".escape(fname,' \')
5305c73622aSBram Moolenaar   if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
531f233048aSBram Moolenaar
532551dbcc9SBram Moolenaar  elseif expand("%") =~ '.*\.zip' && executable("unzip")
533f233048aSBram Moolenaar   " handle *.zip with unzip
5345c73622aSBram Moolenaar   silent exe "!unzip ".shellescape(a:fname)
535f233048aSBram Moolenaar   if v:shell_error != 0
536f233048aSBram Moolenaar	call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) unzip may have failed with <".a:fname.">")
537f233048aSBram Moolenaar   endif
538551dbcc9SBram Moolenaar   let fname= substitute(a:fname,'\.zip$','','')
539f193fffdSBram Moolenaar   exe "e ".escape(fname,' \')
5405c73622aSBram Moolenaar   if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
541551dbcc9SBram Moolenaar  endif
542f233048aSBram Moolenaar
5435c73622aSBram Moolenaar  if a:0 == 0| setlocal noma bt=nofile fmr=[[[,]]] fdm=marker | endif
544551dbcc9SBram Moolenaar
545551dbcc9SBram Moolenaar"  call Dret("Decompress")
546551dbcc9SBram Moolenaarendfun
547551dbcc9SBram Moolenaar
548f193fffdSBram Moolenaar" ---------------------------------------------------------------------
549dd2a3cdaSBram Moolenaar" vimball#ShowMesg: {{{2
550dd2a3cdaSBram Moolenaarfun! vimball#ShowMesg(level,msg)
551dd2a3cdaSBram Moolenaar"  call Dfunc("vimball#ShowMesg(level=".a:level." msg<".a:msg.">)")
5525c73622aSBram Moolenaar
553dd2a3cdaSBram Moolenaar  let rulerkeep   = &ruler
554dd2a3cdaSBram Moolenaar  let showcmdkeep = &showcmd
555dd2a3cdaSBram Moolenaar  set noruler noshowcmd
556dd2a3cdaSBram Moolenaar  redraw!
557dd2a3cdaSBram Moolenaar
55803413f44SBram Moolenaar  if &fo =~# '[ta]'
5595c73622aSBram Moolenaar   echomsg "***vimball*** ".a:msg
560dd2a3cdaSBram Moolenaar  else
561dd2a3cdaSBram Moolenaar   if a:level == s:WARNING || a:level == s:USAGE
562dd2a3cdaSBram Moolenaar    echohl WarningMsg
563dd2a3cdaSBram Moolenaar   elseif a:level == s:ERROR
564dd2a3cdaSBram Moolenaar    echohl Error
565dd2a3cdaSBram Moolenaar   endif
5665c73622aSBram Moolenaar   echomsg "***vimball*** ".a:msg
567dd2a3cdaSBram Moolenaar   echohl None
568dd2a3cdaSBram Moolenaar  endif
569dd2a3cdaSBram Moolenaar
570dd2a3cdaSBram Moolenaar  if a:level != s:USAGE
571dd2a3cdaSBram Moolenaar   call inputsave()|let ok= input("Press <cr> to continue")|call inputrestore()
572dd2a3cdaSBram Moolenaar  endif
573dd2a3cdaSBram Moolenaar
574dd2a3cdaSBram Moolenaar  let &ruler   = rulerkeep
575dd2a3cdaSBram Moolenaar  let &showcmd = showcmdkeep
576dd2a3cdaSBram Moolenaar
577dd2a3cdaSBram Moolenaar"  call Dret("vimball#ShowMesg")
578dd2a3cdaSBram Moolenaarendfun
579dd2a3cdaSBram Moolenaar" =====================================================================
580dd2a3cdaSBram Moolenaar" s:ChgDir: change directory (in spite of Windoze) {{{2
581f193fffdSBram Moolenaarfun! s:ChgDir(newdir)
582f193fffdSBram Moolenaar"  call Dfunc("ChgDir(newdir<".a:newdir.">)")
583f193fffdSBram Moolenaar  if (has("win32") || has("win95") || has("win64") || has("win16"))
5841514667aSBram Moolenaar   try
585f233048aSBram Moolenaar    exe 'silent cd '.fnameescape(substitute(a:newdir,'/','\\','g'))
5861514667aSBram Moolenaar   catch  /^Vim\%((\a\+)\)\=:E/
5871514667aSBram Moolenaar    call mkdir(fnameescape(substitute(a:newdir,'/','\\','g')))
5881514667aSBram Moolenaar    exe 'silent cd '.fnameescape(substitute(a:newdir,'/','\\','g'))
5891514667aSBram Moolenaar   endtry
590f193fffdSBram Moolenaar  else
5911514667aSBram Moolenaar   try
592f233048aSBram Moolenaar    exe 'silent cd '.fnameescape(a:newdir)
5931514667aSBram Moolenaar   catch  /^Vim\%((\a\+)\)\=:E/
5941514667aSBram Moolenaar    call mkdir(fnameescape(a:newdir))
5951514667aSBram Moolenaar    exe 'silent cd '.fnameescape(a:newdir)
5961514667aSBram Moolenaar   endtry
597f193fffdSBram Moolenaar  endif
598f233048aSBram Moolenaar"  call Dret("ChgDir : curdir<".getcwd().">")
599f193fffdSBram Moolenaarendfun
600f193fffdSBram Moolenaar
601f193fffdSBram Moolenaar" ---------------------------------------------------------------------
602dd2a3cdaSBram Moolenaar" s:RecordInVar: record a un-vimball command in the .VimballRecord file {{{2
603dd2a3cdaSBram Moolenaarfun! s:RecordInVar(home,cmd)
604dd2a3cdaSBram Moolenaar"  call Dfunc("RecordInVar(home<".a:home."> cmd<".a:cmd.">)")
605dd2a3cdaSBram Moolenaar  if a:cmd =~ '^rmdir'
606dd2a3cdaSBram Moolenaar"   if !exists("s:recorddir")
607dd2a3cdaSBram Moolenaar"    let s:recorddir= substitute(a:cmd,'^rmdir',"call s:Rmdir",'')
608dd2a3cdaSBram Moolenaar"   else
609dd2a3cdaSBram Moolenaar"    let s:recorddir= s:recorddir."|".substitute(a:cmd,'^rmdir',"call s:Rmdir",'')
610dd2a3cdaSBram Moolenaar"   endif
611dd2a3cdaSBram Moolenaar  elseif !exists("s:recordfile")
612dd2a3cdaSBram Moolenaar   let s:recordfile= a:cmd
613dd2a3cdaSBram Moolenaar  else
614dd2a3cdaSBram Moolenaar   let s:recordfile= s:recordfile."|".a:cmd
615dd2a3cdaSBram Moolenaar  endif
616f233048aSBram Moolenaar"  call Dret("RecordInVar : s:recordfile<".(exists("s:recordfile")? s:recordfile : "")."> s:recorddir<".(exists("s:recorddir")? s:recorddir : "").">")
617dd2a3cdaSBram Moolenaarendfun
618dd2a3cdaSBram Moolenaar
619dd2a3cdaSBram Moolenaar" ---------------------------------------------------------------------
620dd2a3cdaSBram Moolenaar" s:RecordInFile: {{{2
621dd2a3cdaSBram Moolenaarfun! s:RecordInFile(home)
622f233048aSBram Moolenaar"  call Dfunc("s:RecordInFile()")
623dd2a3cdaSBram Moolenaar  if exists("g:vimball_norecord")
624f233048aSBram Moolenaar"   call Dret("s:RecordInFile : g:vimball_norecord")
625dd2a3cdaSBram Moolenaar   return
626dd2a3cdaSBram Moolenaar  endif
627dd2a3cdaSBram Moolenaar
628dd2a3cdaSBram Moolenaar  if exists("s:recordfile") || exists("s:recorddir")
629dd2a3cdaSBram Moolenaar   let curdir= getcwd()
630dd2a3cdaSBram Moolenaar   call s:ChgDir(a:home)
631dd2a3cdaSBram Moolenaar   keepalt keepjumps 1split
632f233048aSBram Moolenaar
633dd2a3cdaSBram Moolenaar   let cmd= expand("%:tr").": "
634f233048aSBram Moolenaar"   call Decho("cmd<".cmd.">")
635f233048aSBram Moolenaar
636251e1912SBram Moolenaar   sil! keepalt keepjumps e .VimballRecord
637f233048aSBram Moolenaar   setlocal ma
638dd2a3cdaSBram Moolenaar   $
639dd2a3cdaSBram Moolenaar   if exists("s:recordfile") && exists("s:recorddir")
640dd2a3cdaSBram Moolenaar   	let cmd= cmd.s:recordfile."|".s:recorddir
641dd2a3cdaSBram Moolenaar   elseif exists("s:recorddir")
642dd2a3cdaSBram Moolenaar   	let cmd= cmd.s:recorddir
643dd2a3cdaSBram Moolenaar   elseif exists("s:recordfile")
644dd2a3cdaSBram Moolenaar   	let cmd= cmd.s:recordfile
645dd2a3cdaSBram Moolenaar   else
646f233048aSBram Moolenaar"    call Dret("s:RecordInFile : neither recordfile nor recorddir exist")
647dd2a3cdaSBram Moolenaar	return
648dd2a3cdaSBram Moolenaar   endif
649f233048aSBram Moolenaar"   call Decho("cmd<".cmd.">")
650f233048aSBram Moolenaar
651f233048aSBram Moolenaar   " put command into buffer, write .VimballRecord `file
652dd2a3cdaSBram Moolenaar   keepalt keepjumps put=cmd
653251e1912SBram Moolenaar   sil! keepalt keepjumps g/^\s*$/d
654251e1912SBram Moolenaar   sil! keepalt keepjumps wq!
655dd2a3cdaSBram Moolenaar   call s:ChgDir(curdir)
656f233048aSBram Moolenaar
657f233048aSBram Moolenaar   if exists("s:recorddir")
658f233048aSBram Moolenaar"	call Decho("unlet s:recorddir<".s:recorddir.">")
659f233048aSBram Moolenaar   	unlet s:recorddir
660f233048aSBram Moolenaar   endif
661f233048aSBram Moolenaar   if exists("s:recordfile")
662f233048aSBram Moolenaar"	call Decho("unlet s:recordfile<".s:recordfile.">")
663f233048aSBram Moolenaar   	unlet s:recordfile
664f233048aSBram Moolenaar   endif
665dd2a3cdaSBram Moolenaar  else
666dd2a3cdaSBram Moolenaar"   call Decho("s:record[file|dir] doesn't exist")
667dd2a3cdaSBram Moolenaar  endif
668dd2a3cdaSBram Moolenaar
669f233048aSBram Moolenaar"  call Dret("s:RecordInFile")
670dd2a3cdaSBram Moolenaarendfun
671dd2a3cdaSBram Moolenaar
672dd2a3cdaSBram Moolenaar" ---------------------------------------------------------------------
6735c73622aSBram Moolenaar" vimball#VimballHome: determine/get home directory path (usually from rtp) {{{2
6745c73622aSBram Moolenaarfun! vimball#VimballHome()
6755c73622aSBram Moolenaar"  call Dfunc("vimball#VimballHome()")
676dd2a3cdaSBram Moolenaar  if exists("g:vimball_home")
677dd2a3cdaSBram Moolenaar   let home= g:vimball_home
678dd2a3cdaSBram Moolenaar  else
679dd2a3cdaSBram Moolenaar   " go to vim plugin home
680dd2a3cdaSBram Moolenaar   for home in split(&rtp,',') + ['']
681dd2a3cdaSBram Moolenaar    if isdirectory(home) && filewritable(home) | break | endif
682f233048aSBram Moolenaar	let basehome= substitute(home,'[/\\]\.vim$','','')
683f233048aSBram Moolenaar    if isdirectory(basehome) && filewritable(basehome)
684f233048aSBram Moolenaar	 let home= basehome."/.vim"
685f233048aSBram Moolenaar	 break
686f233048aSBram Moolenaar	endif
687dd2a3cdaSBram Moolenaar   endfor
688dd2a3cdaSBram Moolenaar   if home == ""
689dd2a3cdaSBram Moolenaar    " just pick the first directory
690dd2a3cdaSBram Moolenaar    let home= substitute(&rtp,',.*$','','')
691dd2a3cdaSBram Moolenaar   endif
692dd2a3cdaSBram Moolenaar   if (has("win32") || has("win95") || has("win64") || has("win16"))
693dd2a3cdaSBram Moolenaar    let home= substitute(home,'/','\\','g')
694dd2a3cdaSBram Moolenaar   endif
695dd2a3cdaSBram Moolenaar  endif
696f233048aSBram Moolenaar  " insure that the home directory exists
697f233048aSBram Moolenaar"  call Decho("picked home<".home.">")
698f233048aSBram Moolenaar  if !isdirectory(home)
699f233048aSBram Moolenaar   if exists("g:vimball_mkdir")
700f233048aSBram Moolenaar"	call Decho("home<".home."> isn't a directory -- making it now with g:vimball_mkdir<".g:vimball_mkdir.">")
7015c73622aSBram Moolenaar"    call Decho("system(".g:vimball_mkdir." ".shellescape(home).")")
7025c73622aSBram Moolenaar    call system(g:vimball_mkdir." ".shellescape(home))
703f233048aSBram Moolenaar   else
704f233048aSBram Moolenaar"	call Decho("home<".home."> isn't a directory -- making it now with mkdir()")
705f233048aSBram Moolenaar    call mkdir(home)
706f233048aSBram Moolenaar   endif
707f233048aSBram Moolenaar  endif
7085c73622aSBram Moolenaar"  call Dret("vimball#VimballHome <".home.">")
709dd2a3cdaSBram Moolenaar  return home
710f193fffdSBram Moolenaarendfun
711f193fffdSBram Moolenaar
712f193fffdSBram Moolenaar" ---------------------------------------------------------------------
713f233048aSBram Moolenaar" vimball#SaveSettings: {{{2
714f233048aSBram Moolenaarfun! vimball#SaveSettings()
71525e2c9e3SBram Moolenaar"  call Dfunc("SaveSettings()")
71625e2c9e3SBram Moolenaar  let s:makeep  = getpos("'a")
71725e2c9e3SBram Moolenaar  let s:regakeep= @a
71803413f44SBram Moolenaar  if exists("+acd")
71925e2c9e3SBram Moolenaar   let s:acdkeep = &acd
720d68071d8SBram Moolenaar  endif
72125e2c9e3SBram Moolenaar  let s:eikeep  = &ei
722e37d50a5SBram Moolenaar  let s:fenkeep = &l:fen
72325e2c9e3SBram Moolenaar  let s:hidkeep = &hidden
72425e2c9e3SBram Moolenaar  let s:ickeep  = &ic
725143c38cdSBram Moolenaar  let s:lzkeep  = &lz
726143c38cdSBram Moolenaar  let s:pmkeep  = &pm
72725e2c9e3SBram Moolenaar  let s:repkeep = &report
72825e2c9e3SBram Moolenaar  let s:vekeep  = &ve
729e37d50a5SBram Moolenaar  let s:ffkeep  = &l:ff
730251e1912SBram Moolenaar  let s:swfkeep = &l:swf
73103413f44SBram Moolenaar  if exists("+acd")
732251e1912SBram Moolenaar   setlocal ei=all ve=all noacd nofen noic report=999 nohid bt= ma lz pm= ff=unix noswf
733d68071d8SBram Moolenaar  else
734251e1912SBram Moolenaar   setlocal ei=all ve=all       nofen noic report=999 nohid bt= ma lz pm= ff=unix noswf
735d68071d8SBram Moolenaar  endif
736f233048aSBram Moolenaar  " vimballs should be in unix format
737f233048aSBram Moolenaar  setlocal ff=unix
73825e2c9e3SBram Moolenaar"  call Dret("SaveSettings")
73925e2c9e3SBram Moolenaarendfun
74025e2c9e3SBram Moolenaar
74125e2c9e3SBram Moolenaar" ---------------------------------------------------------------------
742f233048aSBram Moolenaar" vimball#RestoreSettings: {{{2
743f233048aSBram Moolenaarfun! vimball#RestoreSettings()
74425e2c9e3SBram Moolenaar"  call Dfunc("RestoreSettings()")
74525e2c9e3SBram Moolenaar  let @a      = s:regakeep
74603413f44SBram Moolenaar  if exists("+acd")
74725e2c9e3SBram Moolenaar   let &acd   = s:acdkeep
748d68071d8SBram Moolenaar  endif
749e37d50a5SBram Moolenaar  let &l:fen  = s:fenkeep
75025e2c9e3SBram Moolenaar  let &hidden = s:hidkeep
75125e2c9e3SBram Moolenaar  let &ic     = s:ickeep
752dd2a3cdaSBram Moolenaar  let &lz     = s:lzkeep
753143c38cdSBram Moolenaar  let &pm     = s:pmkeep
75425e2c9e3SBram Moolenaar  let &report = s:repkeep
75525e2c9e3SBram Moolenaar  let &ve     = s:vekeep
756dd2a3cdaSBram Moolenaar  let &ei     = s:eikeep
757e37d50a5SBram Moolenaar  let &l:ff   = s:ffkeep
75825e2c9e3SBram Moolenaar  if s:makeep[0] != 0
75925e2c9e3SBram Moolenaar   " restore mark a
76025e2c9e3SBram Moolenaar"   call Decho("restore mark-a: makeep=".string(makeep))
76125e2c9e3SBram Moolenaar   call setpos("'a",s:makeep)
76225e2c9e3SBram Moolenaar  endif
76303413f44SBram Moolenaar  if exists("+acd")
764f233048aSBram Moolenaar   unlet s:acdkeep
765d68071d8SBram Moolenaar  endif
766f233048aSBram Moolenaar  unlet s:regakeep s:eikeep s:fenkeep s:hidkeep s:ickeep s:repkeep s:vekeep s:makeep s:lzkeep s:pmkeep s:ffkeep
76725e2c9e3SBram Moolenaar"  call Dret("RestoreSettings")
76825e2c9e3SBram Moolenaarendfun
76925e2c9e3SBram Moolenaar
7706be7f873SBram Moolenaarlet &cpo = s:keepcpo
7716be7f873SBram Moolenaarunlet s:keepcpo
7726be7f873SBram Moolenaar
77325e2c9e3SBram Moolenaar" ---------------------------------------------------------------------
774eee697b7SBram Moolenaar" Modelines: {{{1
775eee697b7SBram Moolenaar" vim: fdm=marker
776