comparison runtime/autoload/vimball.vim @ 792:860b73800cd7

updated for version 7.0231
author vimboss
date Tue, 21 Mar 2006 21:20:39 +0000
parents
children cc3902a09300
comparison
equal deleted inserted replaced
791:98a88a884610 792:860b73800cd7
1 " vimball : construct a file containing both paths and files
2 " Author: Charles E. Campbell, Jr.
3 " Date: Mar 20, 2006
4 " Version: 4
5 " GetLatestVimScripts: 1502 1 :AutoInstall: vimball.vim
6 " Copyright: (c) 2004-2006 by Charles E. Campbell, Jr.
7 " 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
14 if &cp || exists("g:loaded_vimball")
15 finish
16 endif
17 let s:keepcpo = &cpo
18 let g:loaded_vimball = "v4"
19 set cpo&vim
20
21 " =====================================================================
22 " Functions: {{{1
23
24 " ---------------------------------------------------------------------
25 " MkVimball: creates a vimball given a list of paths to files {{{2
26 " Vimball Format:
27 " path
28 " filesize
29 " [file]
30 " path
31 " filesize
32 " [file]
33 fun! vimball#MkVimball(line1,line2,writelevel,vimballname) range
34 " call Dfunc("MkVimball(line1=".a:line1." line2=".a:line2." writelevel=".a:writelevel." vimballname<".a:vimballname.">")
35 let vbname= substitute(a:vimballname,'\.[^.]*$','','e').'.vba'
36 if !a:writelevel && filereadable(vbname)
37 echohl Error | echoerr "(MkVimball) file<".vbname."> exists; use ! to insist" | echohl None
38 " call Dret("MkVimball : file<".vbname."> already exists; use ! to insist")
39 return
40 endif
41
42 " user option bypass
43 let eikeep= &ei
44 set ei=all
45
46 let home = substitute(&rtp,',.*$','','')
47 let curdir = getcwd()
48 exe "cd ".home
49
50 " record current tab, initialize while loop index
51 let curtabnr = tabpagenr()
52 let linenr = a:line1
53 " call Decho("curtabnr=".curtabnr)
54
55 while linenr <= a:line2
56 let svfile = getline(linenr)
57 " call Decho("svfile<".svfile.">")
58
59 if !filereadable(svfile)
60 echohl Error | echo "unable to read file<".svfile.">" | echohl None
61 let &ei= eikeep
62 exe "cd ".curdir
63 " call Dret("MkVimball")
64 return
65 endif
66
67 " create/switch to mkvimball tab
68 if !exists("vbtabnr")
69 tabnew
70 silent! file Vimball
71 let vbtabnr= tabpagenr()
72 else
73 exe "tabn ".vbtabnr
74 endif
75
76 let lastline= line("$") + 1
77 if lastline == 2 && getline("$") == ""
78 call setline(1,'" Vimball Archiver by Charles E. Campbell, Jr., Ph.D.')
79 call setline(2,'UseVimball')
80 call setline(3,'finish')
81 let lastline= 4
82 endif
83 call setline(lastline ,svfile)
84 call setline(lastline+1,0)
85 exe "$r ".svfile
86 call setline(lastline+1,line("$") - lastline - 1)
87 " call Decho("lastline=".lastline." line$=".line("$"))
88
89 " restore to normal tab
90 exe "tabn ".curtabnr
91 let linenr= linenr + 1
92 endwhile
93
94 " write the vimball
95 exe "tabn ".vbtabnr
96 exe "cd ".curdir
97 if a:really
98 if a:writelevel
99 exe "w! ".vbname
100 else
101 exe "w ".vbname
102 endif
103 endif
104 " call Decho("Vimball<".vbname."> created")
105 echo "Vimball<".vbname."> created"
106
107 " remove the evidence
108 setlocal nomod bh=wipe
109 exe "tabn ".curtabnr
110 exe "tabc ".vbtabnr
111
112 " restore options
113 let &ei= eikeep
114
115 " call Dret("MkVimball")
116 endfun
117
118 " ---------------------------------------------------------------------
119 " Vimball: {{{2
120 fun! vimball#Vimball(really)
121 " call Dfunc("Vimball(really=".a:really.")")
122
123 if getline(1) !~ '^" Vimball Archiver by Charles E. Campbell, Jr., Ph.D.$'
124 echoerr "(Vimball) The current file does not appear to be a Vimball!"
125 " call Dret("Vimball")
126 return
127 endif
128
129 " initialize
130 let regakeep = @a
131 let eikeep = &ei
132 let vekeep = &ve
133 let makeep = getpos("'a")
134 let curtabnr = tabpagenr()
135 set ei=all ve=all
136
137 " set up vimball tab
138 tabnew
139 silent! file Vimball
140 let vbtabnr= tabpagenr()
141 let didhelp= ""
142
143 " go to vim plugin home
144 let home = substitute(&rtp,',.*$','','')
145 let curdir = getcwd()
146 " call Decho("exe cd ".home)
147 exe "cd ".home
148 let linenr = 4
149 let filecnt = 0
150
151 " give title to listing of (extracted) files from Vimball Archive
152 if a:really
153 echohl Title | echomsg "Vimball Archive" | echohl None
154 else
155 echohl Title | echomsg "Vimball Archive Listing" | echohl None
156 endif
157
158 " apportion vimball contents to various files
159 " call Decho("exe tabn ".curtabnr)
160 exe "tabn ".curtabnr
161 " call Decho("linenr=".linenr." line$=".line("$"))
162 while 1 < linenr && linenr < line("$")
163 let fname = getline(linenr)
164 let fsize = getline(linenr+1)
165 let filecnt = filecnt + 1
166 if a:really
167 echomsg "extracted <".fname.">: ".fsize." lines"
168 else
169 echomsg "would extract <".fname.">: ".fsize." lines"
170 endif
171 " call Decho(linenr.": will extract file<".fname.">")
172 " call Decho((linenr+1).": fsize=".fsize)
173
174 " make directories if they don't exist yet
175 let fnamebuf= fname
176 while fnamebuf =~ '/'
177 let dirname = substitute(fnamebuf,'/.*$','','e')
178 let fnamebuf = substitute(fnamebuf,'^.\{-}/\(.*\)$','\1','e')
179 if !isdirectory(dirname)
180 " call Decho("making <".dirname.">")
181 call mkdir(dirname)
182 endif
183 exe "cd ".dirname
184 endwhile
185 exe "cd ".home
186
187 " grab specified qty of lines and place into "a" buffer
188 exe linenr
189 norm! jjma
190 exe (linenr + fsize + 1)
191 silent norm! "ay'a
192 " call Decho("yanked ".fsize." lines into register-a")
193
194 " call Decho("didhelp<".didhelp."> fname<".fname.">")
195 if didhelp == "" && fname =~ 'doc/[^/]\+\.txt$'
196 let didhelp= substitute(fname,'^\(.*\<doc\)[/\\][^.]*\.txt$','\1','e')
197 " call Decho("didhelp<".didhelp.">")
198 endif
199
200 " copy "a" buffer into tab
201 " call Decho('copy "a buffer into tab#'.vbtabnr)
202 exe "tabn ".vbtabnr
203 silent! %d
204 silent norm! "aPGdd1G
205 " call Decho("rega<".@a.">")
206
207 " write tab to file
208 " call Decho("exe w! ".fname)
209 exe "silent w! ".fname
210
211 " call Decho("exe tabn ".curtabnr)
212 exe "tabn ".curtabnr
213 " let oldlinenr = linenr " Decho
214 let linenr = linenr + fsize + 2
215 " call Decho("update linenr= [linenr=".oldlinenr."] + [fsize=".fsize."] + 2 = ".linenr)
216 endwhile
217
218 " set up help
219 " call Decho("about to set up help: didhelp<".didhelp.">")
220 if didhelp != ""
221 " call Decho("exe helptags ".home."/".didhelp)
222 exe "helptags ".home."/".didhelp
223 echomsg "did helptags"
224 endif
225
226 " make sure a "Press ENTER..." prompt appears to keep the messages showing!
227 while filecnt < &ch
228 echomsg " "
229 let filecnt= filecnt + 1
230 endwhile
231
232 " restore events, delete tab and buffer
233 exe "tabn ".vbtabnr
234 setlocal nomod bh=wipe
235 exe "tabn ".curtabnr
236 exe "tabc ".vbtabnr
237 let &ei= eikeep
238 let @a = regakeep
239 if makeep[0] != 0
240 " restore mark a
241 " call Decho("restore mark-a: makeep=".string(makeep))
242 call setpos("'a",makeep)
243 ka
244 endif
245 exe "cd ".curdir
246
247 " call Dret("Vimball")
248 endfun
249
250 let &cpo= s:keepcpo
251 unlet s:keepcpo
252 " =====================================================================
253 " Modelines: {{{1
254 " vim: fdm=marker