" vimball : construct a file containing both paths and files " Author: Charles E. Campbell, Jr. " Date: Mar 20, 2006 " Version: 3 " GetLatestVimScripts: 1502 1 :AutoInstall: vimball.vim " Copyright: (c) 2004-2006 by Charles E. Campbell, Jr. " The VIM LICENSE applies to Vimball.vim, and Vimball.txt " (see |copyright|) except use "Vimball" instead of "Vim". " No warranty, express or implied. " *** *** Use At-Your-Own-Risk! *** *** " --------------------------------------------------------------------- " Load Once: {{{1 if &cp || exists("g:loaded_vimball") finish endif let s:keepcpo = &cpo let g:loaded_vimball = "v3" set cpo&vim " ------------------------------------------------------------------------------ " Public Interface: {{{1 com! -ra -na=+ -bang MkVimball call s:MkVimball(,,0,) com! -na=0 UseVimball call s:Vimball(1) com! -na=0 VimballList call s:Vimball(0) au BufReadPost *.vba echohl WarningMsg | echo "Source this file to extract it! (:so %)" | echohl None " ===================================================================== " Functions: {{{1 " --------------------------------------------------------------------- " MkVimball: creates a vimball given a list of paths to files {{{2 " Vimball Format: " path " filesize " [file] " path " filesize " [file] fun! s:MkVimball(line1,line2,writelevel,vimballname) range " call Dfunc("MkVimball(line1=".a:line1." line2=".a:line2." writelevel=".a:writelevel." vimballname<".a:vimballname.">") let vbname= substitute(a:vimballname,'\.[^.]*$','','e').'.vba' if !a:writelevel && filereadable(vbname) echohl Error | echoerr "(MkVimball) file<".vbname."> exists; use ! to insist" | echohl None " call Dret("MkVimball : file<".vbname."> already exists; use ! to insist") return endif " user option bypass let eikeep= &ei set ei=all let home = substitute(&rtp,',.*$','','') let curdir = getcwd() exe "cd ".home " record current tab, initialize while loop index let curtabnr = tabpagenr() let linenr = a:line1 " call Decho("curtabnr=".curtabnr) while linenr <= a:line2 let svfile = getline(linenr) " call Decho("svfile<".svfile.">") if !filereadable(svfile) echohl Error | echo "unable to read file<".svfile.">" | echohl None let &ei= eikeep exe "cd ".curdir " call Dret("MkVimball") return endif " create/switch to mkvimball tab if !exists("vbtabnr") tabnew silent! file Vimball let vbtabnr= tabpagenr() else exe "tabn ".vbtabnr endif let lastline= line("$") + 1 if lastline == 2 && getline("$") == "" call setline(1,'" Vimball Archiver by Charles E. Campbell, Jr., Ph.D.') call setline(2,'UseVimball') call setline(3,'finish') let lastline= 4 endif call setline(lastline ,svfile) call setline(lastline+1,0) exe "$r ".svfile call setline(lastline+1,line("$") - lastline - 1) " call Decho("lastline=".lastline." line$=".line("$")) " restore to normal tab exe "tabn ".curtabnr let linenr= linenr + 1 endwhile " write the vimball exe "tabn ".vbtabnr exe "cd ".curdir if a:really if a:writelevel exe "w! ".vbname else exe "w ".vbname endif endif " call Decho("Vimball<".vbname."> created") echo "Vimball<".vbname."> created" " remove the evidence setlocal nomod bh=wipe exe "tabn ".curtabnr exe "tabc ".vbtabnr " restore options let &ei= eikeep " call Dret("MkVimball") endfun " --------------------------------------------------------------------- " Vimball: {{{2 fun! s:Vimball(really) " call Dfunc("Vimball(really=".a:really.")") if getline(1) !~ '^" Vimball Archiver by Charles E. Campbell, Jr., Ph.D.$' echoerr "(Vimball) The current file does not appear to be a Vimball!" " call Dret("Vimball") return endif " initialize let regakeep = @a let eikeep = &ei let vekeep = &ve let makeep = getpos("'a") let curtabnr = tabpagenr() set ei=all ve=all " set up vimball tab tabnew silent! file Vimball let vbtabnr= tabpagenr() let didhelp= "" " go to vim plugin home let home = substitute(&rtp,',.*$','','') let curdir = getcwd() " call Decho("exe cd ".home) exe "cd ".home let linenr = 4 let filecnt = 0 " give title to listing of (extracted) files from Vimball Archive if a:really echohl Title | echomsg "Vimball Archive" | echohl None else echohl Title | echomsg "Vimball Archive Listing" | echohl None endif " apportion vimball contents to various files " call Decho("exe tabn ".curtabnr) exe "tabn ".curtabnr " call Decho("linenr=".linenr." line$=".line("$")) while 1 < linenr && linenr < line("$") let fname = getline(linenr) let fsize = getline(linenr+1) let filecnt = filecnt + 1 if a:really echomsg "extracted <".fname.">: ".fsize." lines" else echomsg "would extract <".fname.">: ".fsize." lines" endif " call Decho(linenr.": will extract file<".fname.">") " call Decho((linenr+1).": fsize=".fsize) " make directories if they don't exist yet let fnamebuf= fname while fnamebuf =~ '/' let dirname = substitute(fnamebuf,'/.*$','','e') let fnamebuf = substitute(fnamebuf,'^.\{-}/\(.*\)$','\1','e') if !isdirectory(dirname) " call Decho("making <".dirname.">") call mkdir(dirname) endif exe "cd ".dirname endwhile exe "cd ".home " grab specified qty of lines and place into "a" buffer exe linenr norm! jjma exe (linenr + fsize + 1) silent norm! "ay'a " call Decho("yanked ".fsize." lines into register-a") " call Decho("didhelp<".didhelp."> fname<".fname.">") if didhelp == "" && fname =~ 'doc/[^/]\+\.txt$' let didhelp= substitute(fname,'^\(.*\") endif " copy "a" buffer into tab " call Decho('copy "a buffer into tab#'.vbtabnr) exe "tabn ".vbtabnr silent! %d silent norm! "aPGdd1G " call Decho("rega<".@a.">") " write tab to file " call Decho("exe w! ".fname) exe "silent w! ".fname " call Decho("exe tabn ".curtabnr) exe "tabn ".curtabnr " let oldlinenr = linenr " Decho let linenr = linenr + fsize + 2 " call Decho("update linenr= [linenr=".oldlinenr."] + [fsize=".fsize."] + 2 = ".linenr) endwhile " set up help " call Decho("about to set up help: didhelp<".didhelp.">") if didhelp != "" " call Decho("exe helptags ".home."/".didhelp) exe "helptags ".home."/".didhelp echomsg "did helptags" endif " make sure a "Press ENTER..." prompt appears to keep the messages showing! while filecnt < &ch echomsg " " let filecnt= filecnt + 1 endwhile " restore events, delete tab and buffer exe "tabn ".vbtabnr setlocal nomod bh=wipe exe "tabn ".curtabnr exe "tabc ".vbtabnr let &ei= eikeep let @a = regakeep if makeep[0] != 0 " restore mark a " call Decho("restore mark-a: makeep=".string(makeep)) call setpos("'a",makeep) ka endif exe "cd ".curdir " call Dret("Vimball") endfun