home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / runtime / dos / autoload / vimball.vim < prev    next >
Encoding:
Text File  |  2012-05-31  |  24.5 KB  |  776 lines

  1. " vimball.vim : construct a file containing both paths and files
  2. " Author:    Charles E. Campbell, Jr.
  3. " Date:        Jan 17, 2012
  4. " Version:    35
  5. " GetLatestVimScripts: 1502 1 :AutoInstall: vimball.vim
  6. " Copyright: (c) 2004-2011 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 g:loaded_vimball = "v35"
  18. if v:version < 702
  19.  echohl WarningMsg
  20.  echo "***warning*** this version of vimball needs vim 7.2"
  21.  echohl Normal
  22.  finish
  23. endif
  24. let s:keepcpo= &cpo
  25. set cpo&vim
  26. "DechoTabOn
  27.  
  28. " =====================================================================
  29. " Constants: {{{1
  30. if !exists("s:USAGE")
  31.  let s:USAGE   = 0
  32.  let s:WARNING = 1
  33.  let s:ERROR   = 2
  34.  
  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
  61. endif
  62.  
  63. " =====================================================================
  64. "  Functions: {{{1
  65.  
  66. " ---------------------------------------------------------------------
  67. " vimball#MkVimball: creates a vimball given a list of paths to files {{{2
  68. " 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.vmb, even if it exists
  71. "                  (usually accomplished with :MkVimball! ...
  72. "     filename   : base name of file to be created (ie. filename.vmb)
  73. " Output: a filename.vmb using vimball format:
  74. "     path
  75. "     filesize
  76. "     [file]
  77. "     path
  78. "     filesize
  79. "     [file]
  80. fun! 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)
  82.   if a:1 =~ '\.vim$' || a:1 =~ '\.txt$'
  83.    let vbname= substitute(a:1,'\.\a\{3}$','.vmb','')
  84.   else
  85.    let vbname= a:1
  86.   endif
  87.   if vbname !~ '\.vmb$'
  88.    let vbname= vbname.'.vmb'
  89.   endif
  90. "  call Decho("vbname<".vbname.">")
  91.   if !a:writelevel && a:1 =~ '[\/]'
  92.    call vimball#ShowMesg(s:ERROR,"(MkVimball) vimball name<".a:1."> should not include slashes; use ! to insist")
  93. "   call Dret("MkVimball : vimball name<".a:1."> should not include slashes")
  94.    return
  95.   endif
  96.   if !a:writelevel && filereadable(vbname)
  97.    call vimball#ShowMesg(s:ERROR,"(MkVimball) file<".vbname."> exists; use ! to insist")
  98. "   call Dret("MkVimball : file<".vbname."> already exists; use ! to insist")
  99.    return
  100.   endif
  101.  
  102.   " user option bypass
  103.   call vimball#SaveSettings()
  104.  
  105.   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
  110.    let home= vimball#VimballHome()
  111.   endif
  112.  
  113.   " save current directory
  114.   let curdir = getcwd()
  115.   call s:ChgDir(home)
  116.  
  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)
  127.     call vimball#ShowMesg(s:ERROR,"unable to read file<".svfile.">")
  128.     call s:ChgDir(curdir)
  129.     call vimball#RestoreSettings()
  130. "    call Dret("MkVimball")
  131.     return
  132.    endif
  133.  
  134.    " create/switch to mkvimball tab
  135.    if !exists("vbtabnr")
  136.     tabnew
  137.     sil! 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')
  148.     let lastline= line("$") + 1
  149.    endif
  150.    call setline(lastline  ,substitute(svfile,'$','    [[[1',''))
  151.    call setline(lastline+1,0)
  152.  
  153.    " write the file from the tab
  154. "   call Decho("exe $r ".fnameescape(svfile))
  155.    exe "$r ".fnameescape(svfile)
  156.  
  157.    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
  167.   call s:ChgDir(curdir)
  168.   setlocal ff=unix
  169.   if a:writelevel
  170. "   call Decho("exe w! ".fnameescape(vbname))
  171.    exe "w! ".fnameescape(vbname)
  172.   else
  173. "   call Decho("exe w ".fnameescape(vbname))
  174.    exe "w ".fnameescape(vbname)
  175.   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
  185.   call vimball#RestoreSettings()
  186.  
  187. "  call Dret("MkVimball")
  188. endfun
  189.  
  190. " ---------------------------------------------------------------------
  191. " vimball#Vimball: extract and distribute contents from a vimball {{{2
  192. "                  (invoked the the UseVimball command embedded in 
  193. "                  vimballs' prologue)
  194. fun! vimball#Vimball(really,...)
  195. "  call Dfunc("vimball#Vimball(really=".a:really.") a:0=".a:0)
  196.  
  197.   if v:version < 701 || (v:version == 701 && !exists('*fnameescape'))
  198.    echoerr "your vim is missing the fnameescape() function (pls upgrade to vim 7.2 or later)"
  199. "   call Dret("vimball#Vimball : needs 7.1 with patch 299 or later")
  200.    return
  201.   endif
  202.  
  203.   if getline(1) !~ '^" Vimball Archiver'
  204.    echoerr "(Vimball) The current file does not appear to be a Vimball!"
  205. "   call Dret("vimball#Vimball")
  206.    return
  207.   endif
  208.  
  209.   " set up standard settings
  210.   call vimball#SaveSettings()
  211.   let curtabnr    = tabpagenr()
  212.   let vimballfile = expand("%:tr")
  213.  
  214.   " set up vimball tab
  215. "  call Decho("setting up vimball tab")
  216.   tabnew
  217.   sil! file Vimball
  218.   let vbtabnr= tabpagenr()
  219.   let didhelp= ""
  220.  
  221.   " go to vim plugin home
  222.   if a:0 > 0
  223.    " let user specify the directory where the vimball is to be unpacked.
  224.    " If, however, the user did not specify a full path, set the home to be below the current directory
  225.    let home= expand(a:1)
  226.    if has("win32") || has("win95") || has("win64") || has("win16")
  227.     if home !~ '^\a:[/\\]'
  228.      let home= getcwd().'/'.a:1
  229.     endif
  230.    elseif home !~ '^/'
  231.     let home= getcwd().'/'.a:1
  232.    endif
  233.   else
  234.    let home= vimball#VimballHome()
  235.   endif
  236. "  call Decho("home<".home.">")
  237.  
  238.   " save current directory and remove older same-named vimball, if any
  239.   let curdir = getcwd()
  240. "  call Decho("home<".home.">")
  241. "  call Decho("curdir<".curdir.">")
  242.  
  243.   call s:ChgDir(home)
  244.   let s:ok_unablefind= 1
  245.   call vimball#RmVimball(vimballfile)
  246.   unlet s:ok_unablefind
  247.  
  248.   let linenr  = 4
  249.   let filecnt = 0
  250.  
  251.   " give title to listing of (extracted) files from Vimball Archive
  252.   if a:really
  253.    echohl Title     | echomsg "Vimball Archive"         | echohl None
  254.   else             
  255.    echohl Title     | echomsg "Vimball Archive Listing" | echohl None
  256.    echohl Statement | echomsg "files would be placed under: ".home | echohl None
  257.   endif
  258.  
  259.   " apportion vimball contents to various files
  260. "  call Decho("exe tabn ".curtabnr)
  261.   exe "tabn ".curtabnr
  262. "  call Decho("linenr=".linenr." line$=".line("$"))
  263.   while 1 < linenr && linenr < line("$")
  264.    let fname   = substitute(getline(linenr),'\t\[\[\[1$','','')
  265.    let fname   = substitute(fname,'\\','/','g')
  266.    let fsize   = substitute(getline(linenr+1),'^\(\d\+\).\{-}$','\1','')+0
  267.    let fenc    = substitute(getline(linenr+1),'^\d\+\s*\(\S\{-}\)$','\1','')
  268.    let filecnt = filecnt + 1
  269. "   call Decho("fname<".fname."> fsize=".fsize." filecnt=".filecnt. " fenc=".fenc)
  270.  
  271.    if a:really
  272.     echomsg "extracted <".fname.">: ".fsize." lines"
  273.    else
  274.     echomsg "would extract <".fname.">: ".fsize." lines"
  275.    endif
  276. "   call Decho("using L#".linenr.": will extract file<".fname.">")
  277. "   call Decho("using L#".(linenr+1).": fsize=".fsize)
  278.  
  279.    " Allow AsNeeded/ directory to take place of plugin/ directory
  280.    " when AsNeeded/filename is filereadable or was present in VimballRecord
  281.    if fname =~ '\<plugin/'
  282.        let anfname= substitute(fname,'\<plugin/','AsNeeded/','')
  283.     if filereadable(anfname) || (exists("s:VBRstring") && s:VBRstring =~ anfname)
  284. "     call Decho("using anfname<".anfname."> instead of <".fname.">")
  285.      let fname= anfname
  286.     endif
  287.    endif
  288.  
  289.    " make directories if they don't exist yet
  290.    if a:really
  291. "    call Decho("making directories if they don't exist yet (fname<".fname.">)")
  292.     let fnamebuf= substitute(fname,'\\','/','g')
  293.     let dirpath = substitute(home,'\\','/','g')
  294. "    call Decho("init: fnamebuf<".fnamebuf.">")
  295. "    call Decho("init: dirpath <".dirpath.">")
  296.     while fnamebuf =~ '/'
  297.      let dirname  = dirpath."/".substitute(fnamebuf,'/.*$','','')
  298.      let dirpath  = dirname
  299.      let fnamebuf = substitute(fnamebuf,'^.\{-}/\(.*\)$','\1','')
  300. "     call Decho("dirname<".dirname.">")
  301. "     call Decho("dirpath<".dirpath.">")
  302.      if !isdirectory(dirname)
  303. "      call Decho("making <".dirname.">")
  304.       if exists("g:vimball_mkdir")
  305.        call system(g:vimball_mkdir." ".shellescape(dirname))
  306.       else
  307.        call mkdir(dirname)
  308.       endif
  309.       call s:RecordInVar(home,"rmdir('".dirname."')")
  310.      endif
  311.     endwhile
  312.    endif
  313.    call s:ChgDir(home)
  314.  
  315.    " grab specified qty of lines and place into "a" buffer
  316.    " (skip over path/filename and qty-lines)
  317.    let linenr   = linenr + 2
  318.    let lastline = linenr + fsize - 1
  319. "   call Decho("exe ".linenr.",".lastline."yank a")
  320.    " no point in handling a zero-length file
  321.    if lastline >= linenr
  322.     exe "silent ".linenr.",".lastline."yank a"
  323.  
  324.     " copy "a" buffer into tab
  325. "   call Decho('copy "a buffer into tab#'.vbtabnr)
  326.     exe "tabn ".vbtabnr
  327.     setlocal ma
  328.     sil! %d
  329.     silent put a
  330.     1
  331.     sil! d
  332.  
  333.     " write tab to file
  334.     if a:really
  335.      let fnamepath= home."/".fname
  336. "    call Decho("exe w! ".fnameescape(fnamepath))
  337.     if fenc != ""
  338.      exe "silent w! ++enc=".fnameescape(fenc)." ".fnameescape(fnamepath)
  339.     else
  340.      exe "silent w! ".fnameescape(fnamepath)
  341.     endif
  342.     echo "wrote ".fnameescape(fnamepath)
  343.     call s:RecordInVar(home,"call delete('".fnamepath."')")
  344.     endif
  345.  
  346.     " return to tab with vimball
  347. "   call Decho("exe tabn ".curtabnr)
  348.     exe "tabn ".curtabnr
  349.  
  350.     " set up help if its a doc/*.txt file
  351. "   call Decho("didhelp<".didhelp."> fname<".fname.">")
  352.     if a:really && didhelp == "" && fname =~ 'doc/[^/]\+\.\(txt\|..x\)$'
  353.         let didhelp= substitute(fname,'^\(.*\<doc\)[/\\][^.]*\.\(txt\|..x\)$','\1','')
  354. "    call Decho("didhelp<".didhelp.">")
  355.     endif
  356.    endif
  357.  
  358.    " update for next file
  359. "   call Decho("update linenr= [linenr=".linenr."] + [fsize=".fsize."] = ".(linenr+fsize))
  360.    let linenr= linenr + fsize
  361.   endwhile
  362.  
  363.   " set up help
  364. "  call Decho("about to set up help: didhelp<".didhelp.">")
  365.   if didhelp != ""
  366.    let htpath= home."/".didhelp
  367. "   call Decho("exe helptags ".htpath)
  368.    exe "helptags ".fnameescape(htpath)
  369.    echo "did helptags"
  370.   endif
  371.  
  372.   " make sure a "Press ENTER..." prompt appears to keep the messages showing!
  373.   while filecnt <= &ch
  374.    echomsg " "
  375.    let filecnt= filecnt + 1
  376.   endwhile
  377.  
  378.   " record actions in <.VimballRecord>
  379.   call s:RecordInFile(home)
  380.  
  381.   " restore events, delete tab and buffer
  382.   exe "tabn ".vbtabnr
  383.   setlocal nomod bh=wipe
  384.   exe "tabn ".curtabnr
  385.   exe "tabc ".vbtabnr
  386.   call vimball#RestoreSettings()
  387.   call s:ChgDir(curdir)
  388.  
  389. "  call Dret("vimball#Vimball")
  390. endfun
  391.  
  392. " ---------------------------------------------------------------------
  393. " vimball#RmVimball: remove any files, remove any directories made by any {{{2
  394. "               previous vimball extraction based on a file of the current
  395. "               name.
  396. "  Usage:  RmVimball  (assume current file is a vimball; remove)
  397. "          RmVimball vimballname
  398. fun! vimball#RmVimball(...)
  399. "  call Dfunc("vimball#RmVimball() a:0=".a:0)
  400.   if exists("g:vimball_norecord")
  401. "   call Dret("vimball#RmVimball : (g:vimball_norecord)")
  402.    return
  403.   endif
  404.  
  405.   if a:0 == 0
  406.    let curfile= expand("%:tr")
  407. "   call Decho("case a:0=0: curfile<".curfile."> (used expand(%:tr))")
  408.   else
  409.    if a:1 =~ '[\/]'
  410.     call vimball#ShowMesg(s:USAGE,"RmVimball vimballname [path]")
  411. "    call Dret("vimball#RmVimball : suspect a:1<".a:1.">")
  412.     return
  413.    endif
  414.    let curfile= a:1
  415. "   call Decho("case a:0=".a:0.": curfile<".curfile.">")
  416.   endif
  417.   if curfile =~ '\.vmb$'
  418.    let curfile= substitute(curfile,'\.vmb','','')
  419.   elseif curfile =~ '\.vba$'
  420.    let curfile= substitute(curfile,'\.vba','','')
  421.   endif
  422.   if a:0 >= 2
  423.    let home= expand(a:2)
  424.   else
  425.    let home= vimball#VimballHome()
  426.   endif
  427.   let curdir = getcwd()
  428. "  call Decho("home   <".home.">")
  429. "  call Decho("curfile<".curfile.">")
  430. "  call Decho("curdir <".curdir.">")
  431.  
  432.   call s:ChgDir(home)
  433.   if filereadable(".VimballRecord")
  434. "   call Decho(".VimballRecord is readable")
  435. "   call Decho("curfile<".curfile.">")
  436.    keepalt keepjumps 1split 
  437.    sil! keepalt keepjumps e .VimballRecord
  438.    let keepsrch= @/
  439. "   call Decho('search for ^\M'.curfile.'.\m: ')
  440. "   call Decho('search for ^\M'.curfile.'.\m{vba|vmb}: ')
  441. "   call Decho('search for ^\M'.curfile.'\m[-0-9.]*\.{vba|vmb}: ')
  442.    if search('^\M'.curfile."\m: ".'cw')
  443.     let foundit= 1
  444.    elseif search('^\M'.curfile.".\mvmb: ",'cw')
  445.     let foundit= 2
  446.    elseif search('^\M'.curfile.'\m[-0-9.]*\.vmb: ','cw')
  447.     let foundit= 2
  448.    elseif search('^\M'.curfile.".\mvba: ",'cw')
  449.     let foundit= 1
  450.    elseif search('^\M'.curfile.'\m[-0-9.]*\.vba: ','cw')
  451.     let foundit= 1
  452.    else
  453.     let foundit = 0
  454.    endif
  455.    if foundit
  456.     if foundit == 1
  457.      let exestring  = substitute(getline("."),'^\M'.curfile.'\m\S\{-}\.vba: ','','')
  458.     else
  459.      let exestring  = substitute(getline("."),'^\M'.curfile.'\m\S\{-}\.vmb: ','','')
  460.     endif
  461.     let s:VBRstring= substitute(exestring,'call delete(','','g')
  462.     let s:VBRstring= substitute(s:VBRstring,"[')]",'','g')
  463. "    call Decho("exe ".exestring)
  464.     sil! keepalt keepjumps exe exestring
  465.     sil! keepalt keepjumps d
  466.     let exestring= strlen(substitute(exestring,'call delete(.\{-})|\=',"D","g"))
  467. "    call Decho("exestring<".exestring.">")
  468.     echomsg "removed ".exestring." files"
  469.    else
  470.     let s:VBRstring= ''
  471.     let curfile    = substitute(curfile,'\.vmb','','')
  472. "    call Decho("unable to find <".curfile."> in .VimballRecord")
  473.     if !exists("s:ok_unablefind")
  474.      call vimball#ShowMesg(s:WARNING,"(RmVimball) unable to find <".curfile."> in .VimballRecord")
  475.     endif
  476.    endif
  477.    sil! keepalt keepjumps g/^\s*$/d
  478.    sil! keepalt keepjumps wq!
  479.    let @/= keepsrch
  480.   endif
  481.   call s:ChgDir(curdir)
  482.  
  483. "  call Dret("vimball#RmVimball")
  484. endfun
  485.  
  486. " ---------------------------------------------------------------------
  487. " vimball#Decompress: attempts to automatically decompress vimballs {{{2
  488. fun! vimball#Decompress(fname,...)
  489. "  call Dfunc("Decompress(fname<".a:fname.">) a:0=".a:0)
  490.  
  491.   " decompression:
  492.   if     expand("%") =~ '.*\.gz'  && executable("gunzip")
  493.    " handle *.gz with gunzip
  494.    silent exe "!gunzip ".shellescape(a:fname)
  495.    if v:shell_error != 0
  496.     call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) gunzip may have failed with <".a:fname.">")
  497.    endif
  498.    let fname= substitute(a:fname,'\.gz$','','')
  499.    exe "e ".escape(fname,' \')
  500.    if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
  501.  
  502.   elseif expand("%") =~ '.*\.gz' && executable("gzip")
  503.    " handle *.gz with gzip -d
  504.    silent exe "!gzip -d ".shellescape(a:fname)
  505.    if v:shell_error != 0
  506.     call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "gzip -d" may have failed with <'.a:fname.">")
  507.    endif
  508.    let fname= substitute(a:fname,'\.gz$','','')
  509.    exe "e ".escape(fname,' \')
  510.    if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
  511.  
  512.   elseif expand("%") =~ '.*\.bz2' && executable("bunzip2")
  513.    " handle *.bz2 with bunzip2
  514.    silent exe "!bunzip2 ".shellescape(a:fname)
  515.    if v:shell_error != 0
  516.     call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) bunzip2 may have failed with <".a:fname.">")
  517.    endif
  518.    let fname= substitute(a:fname,'\.bz2$','','')
  519.    exe "e ".escape(fname,' \')
  520.    if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
  521.  
  522.   elseif expand("%") =~ '.*\.bz2' && executable("bzip2")
  523.    " handle *.bz2 with bzip2 -d
  524.    silent exe "!bzip2 -d ".shellescape(a:fname)
  525.    if v:shell_error != 0
  526.     call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "bzip2 -d" may have failed with <'.a:fname.">")
  527.    endif
  528.    let fname= substitute(a:fname,'\.bz2$','','')
  529.    exe "e ".escape(fname,' \')
  530.    if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
  531.  
  532.   elseif expand("%") =~ '.*\.zip' && executable("unzip")
  533.    " handle *.zip with unzip
  534.    silent exe "!unzip ".shellescape(a:fname)
  535.    if v:shell_error != 0
  536.     call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) unzip may have failed with <".a:fname.">")
  537.    endif
  538.    let fname= substitute(a:fname,'\.zip$','','')
  539.    exe "e ".escape(fname,' \')
  540.    if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
  541.   endif
  542.  
  543.   if a:0 == 0| setlocal noma bt=nofile fmr=[[[,]]] fdm=marker | endif
  544.  
  545. "  call Dret("Decompress")
  546. endfun
  547.  
  548. " ---------------------------------------------------------------------
  549. " vimball#ShowMesg: {{{2
  550. fun! vimball#ShowMesg(level,msg)
  551. "  call Dfunc("vimball#ShowMesg(level=".a:level." msg<".a:msg.">)")
  552.  
  553.   let rulerkeep   = &ruler
  554.   let showcmdkeep = &showcmd
  555.   set noruler noshowcmd
  556.   redraw!
  557.  
  558.   if &fo =~ '[ta]'
  559.    echomsg "***vimball*** ".a:msg
  560.   else
  561.    if a:level == s:WARNING || a:level == s:USAGE
  562.     echohl WarningMsg
  563.    elseif a:level == s:ERROR
  564.     echohl Error
  565.    endif
  566.    echomsg "***vimball*** ".a:msg
  567.    echohl None
  568.   endif
  569.  
  570.   if a:level != s:USAGE
  571.    call inputsave()|let ok= input("Press <cr> to continue")|call inputrestore()
  572.   endif
  573.  
  574.   let &ruler   = rulerkeep
  575.   let &showcmd = showcmdkeep
  576.  
  577. "  call Dret("vimball#ShowMesg")
  578. endfun
  579. " =====================================================================
  580. " s:ChgDir: change directory (in spite of Windoze) {{{2
  581. fun! s:ChgDir(newdir)
  582. "  call Dfunc("ChgDir(newdir<".a:newdir.">)")
  583.   if (has("win32") || has("win95") || has("win64") || has("win16"))
  584.    try
  585.     exe 'silent cd '.fnameescape(substitute(a:newdir,'/','\\','g'))
  586.    catch  /^Vim\%((\a\+)\)\=:E/
  587.     call mkdir(fnameescape(substitute(a:newdir,'/','\\','g')))
  588.     exe 'silent cd '.fnameescape(substitute(a:newdir,'/','\\','g'))
  589.    endtry
  590.   else
  591.    try
  592.     exe 'silent cd '.fnameescape(a:newdir)
  593.    catch  /^Vim\%((\a\+)\)\=:E/
  594.     call mkdir(fnameescape(a:newdir))
  595.     exe 'silent cd '.fnameescape(a:newdir)
  596.    endtry
  597.   endif
  598. "  call Dret("ChgDir : curdir<".getcwd().">")
  599. endfun
  600.  
  601. " ---------------------------------------------------------------------
  602. " s:RecordInVar: record a un-vimball command in the .VimballRecord file {{{2
  603. fun! s:RecordInVar(home,cmd)
  604. "  call Dfunc("RecordInVar(home<".a:home."> cmd<".a:cmd.">)")
  605.   if a:cmd =~ '^rmdir'
  606. "   if !exists("s:recorddir")
  607. "    let s:recorddir= substitute(a:cmd,'^rmdir',"call s:Rmdir",'')
  608. "   else
  609. "    let s:recorddir= s:recorddir."|".substitute(a:cmd,'^rmdir',"call s:Rmdir",'')
  610. "   endif
  611.   elseif !exists("s:recordfile")
  612.    let s:recordfile= a:cmd
  613.   else
  614.    let s:recordfile= s:recordfile."|".a:cmd
  615.   endif
  616. "  call Dret("RecordInVar : s:recordfile<".(exists("s:recordfile")? s:recordfile : "")."> s:recorddir<".(exists("s:recorddir")? s:recorddir : "").">")
  617. endfun
  618.  
  619. " ---------------------------------------------------------------------
  620. " s:RecordInFile: {{{2
  621. fun! s:RecordInFile(home)
  622. "  call Dfunc("s:RecordInFile()")
  623.   if exists("g:vimball_norecord")
  624. "   call Dret("s:RecordInFile : g:vimball_norecord")
  625.    return
  626.   endif
  627.  
  628.   if exists("s:recordfile") || exists("s:recorddir")
  629.    let curdir= getcwd()
  630.    call s:ChgDir(a:home)
  631.    keepalt keepjumps 1split 
  632.  
  633.    let cmd= expand("%:tr").": "
  634. "   call Decho("cmd<".cmd.">")
  635.  
  636.    sil! keepalt keepjumps e .VimballRecord
  637.    setlocal ma
  638.    $
  639.    if exists("s:recordfile") && exists("s:recorddir")
  640.        let cmd= cmd.s:recordfile."|".s:recorddir
  641.    elseif exists("s:recorddir")
  642.        let cmd= cmd.s:recorddir
  643.    elseif exists("s:recordfile")
  644.        let cmd= cmd.s:recordfile
  645.    else
  646. "    call Dret("s:RecordInFile : neither recordfile nor recorddir exist")
  647.     return
  648.    endif
  649. "   call Decho("cmd<".cmd.">")
  650.  
  651.    " put command into buffer, write .VimballRecord `file
  652.    keepalt keepjumps put=cmd
  653.    sil! keepalt keepjumps g/^\s*$/d
  654.    sil! keepalt keepjumps wq!
  655.    call s:ChgDir(curdir)
  656.  
  657.    if exists("s:recorddir")
  658. "    call Decho("unlet s:recorddir<".s:recorddir.">")
  659.        unlet s:recorddir
  660.    endif
  661.    if exists("s:recordfile")
  662. "    call Decho("unlet s:recordfile<".s:recordfile.">")
  663.        unlet s:recordfile
  664.    endif
  665.   else
  666. "   call Decho("s:record[file|dir] doesn't exist")
  667.   endif
  668.  
  669. "  call Dret("s:RecordInFile")
  670. endfun
  671.  
  672. " ---------------------------------------------------------------------
  673. " vimball#VimballHome: determine/get home directory path (usually from rtp) {{{2
  674. fun! vimball#VimballHome()
  675. "  call Dfunc("vimball#VimballHome()")
  676.   if exists("g:vimball_home")
  677.    let home= g:vimball_home
  678.   else
  679.    " go to vim plugin home
  680.    for home in split(&rtp,',') + ['']
  681.     if isdirectory(home) && filewritable(home) | break | endif
  682.     let basehome= substitute(home,'[/\\]\.vim$','','')
  683.     if isdirectory(basehome) && filewritable(basehome)
  684.      let home= basehome."/.vim"
  685.      break
  686.     endif
  687.    endfor
  688.    if home == ""
  689.     " just pick the first directory
  690.     let home= substitute(&rtp,',.*$','','')
  691.    endif
  692.    if (has("win32") || has("win95") || has("win64") || has("win16"))
  693.     let home= substitute(home,'/','\\','g')
  694.    endif
  695.   endif
  696.   " insure that the home directory exists
  697. "  call Decho("picked home<".home.">")
  698.   if !isdirectory(home)
  699.    if exists("g:vimball_mkdir")
  700. "    call Decho("home<".home."> isn't a directory -- making it now with g:vimball_mkdir<".g:vimball_mkdir.">")
  701. "    call Decho("system(".g:vimball_mkdir." ".shellescape(home).")")
  702.     call system(g:vimball_mkdir." ".shellescape(home))
  703.    else
  704. "    call Decho("home<".home."> isn't a directory -- making it now with mkdir()")
  705.     call mkdir(home)
  706.    endif
  707.   endif
  708. "  call Dret("vimball#VimballHome <".home.">")
  709.   return home
  710. endfun
  711.  
  712. " ---------------------------------------------------------------------
  713. " vimball#SaveSettings: {{{2
  714. fun! vimball#SaveSettings()
  715. "  call Dfunc("SaveSettings()")
  716.   let s:makeep  = getpos("'a")
  717.   let s:regakeep= @a
  718.   if exists("&acd")
  719.    let s:acdkeep = &acd
  720.   endif
  721.   let s:eikeep  = &ei
  722.   let s:fenkeep = &l:fen
  723.   let s:hidkeep = &hidden
  724.   let s:ickeep  = &ic
  725.   let s:lzkeep  = &lz
  726.   let s:pmkeep  = &pm
  727.   let s:repkeep = &report
  728.   let s:vekeep  = &ve
  729.   let s:ffkeep  = &l:ff
  730.   let s:swfkeep = &l:swf
  731.   if exists("&acd")
  732.    setlocal ei=all ve=all noacd nofen noic report=999 nohid bt= ma lz pm= ff=unix noswf
  733.   else
  734.    setlocal ei=all ve=all       nofen noic report=999 nohid bt= ma lz pm= ff=unix noswf
  735.   endif
  736.   " vimballs should be in unix format
  737.   setlocal ff=unix
  738. "  call Dret("SaveSettings")
  739. endfun
  740.  
  741. " ---------------------------------------------------------------------
  742. " vimball#RestoreSettings: {{{2
  743. fun! vimball#RestoreSettings()
  744. "  call Dfunc("RestoreSettings()")
  745.   let @a      = s:regakeep
  746.   if exists("&acd")
  747.    let &acd   = s:acdkeep
  748.   endif
  749.   let &l:fen  = s:fenkeep
  750.   let &hidden = s:hidkeep
  751.   let &ic     = s:ickeep
  752.   let &lz     = s:lzkeep
  753.   let &pm     = s:pmkeep
  754.   let &report = s:repkeep
  755.   let &ve     = s:vekeep
  756.   let &ei     = s:eikeep
  757.   let &l:ff   = s:ffkeep
  758.   if s:makeep[0] != 0
  759.    " restore mark a
  760. "   call Decho("restore mark-a: makeep=".string(makeep))
  761.    call setpos("'a",s:makeep)
  762.   endif
  763.   if exists("&acd")
  764.    unlet s:acdkeep
  765.   endif
  766.   unlet s:regakeep s:eikeep s:fenkeep s:hidkeep s:ickeep s:repkeep s:vekeep s:makeep s:lzkeep s:pmkeep s:ffkeep
  767. "  call Dret("RestoreSettings")
  768. endfun
  769.  
  770. let &cpo = s:keepcpo
  771. unlet s:keepcpo
  772.  
  773. " ---------------------------------------------------------------------
  774. " Modelines: {{{1
  775. " vim: fdm=marker
  776.