19964e468SBram Moolenaar" ---------------------------------------------------------------------
29964e468SBram Moolenaar" getscript.vim
39964e468SBram Moolenaar"  Author:	Charles E. Campbell, Jr.
4*5c73622aSBram Moolenaar"  Date:	Dec 28, 2009
5*5c73622aSBram Moolenaar"  Version:	32
69964e468SBram Moolenaar"  Installing:	:help glvs-install
79964e468SBram Moolenaar"  Usage:	:help glvs
89964e468SBram Moolenaar"
99964e468SBram Moolenaar" GetLatestVimScripts: 642 1 :AutoInstall: getscript.vim
109e368dbaSBram Moolenaar"redraw!|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
119964e468SBram Moolenaar" ---------------------------------------------------------------------
129964e468SBram Moolenaar" Initialization:	{{{1
139964e468SBram Moolenaar" if you're sourcing this file, surely you can't be
143577c6faSBram Moolenaar" expecting vim to be in its vi-compatible mode!
15*5c73622aSBram Moolenaarif exists("g:loaded_getscript")
16*5c73622aSBram Moolenaar finish
17*5c73622aSBram Moolenaarendif
18*5c73622aSBram Moolenaarlet g:loaded_getscript= "v32"
199964e468SBram Moolenaarif &cp
209964e468SBram Moolenaar echoerr "GetLatestVimScripts is not vi-compatible; not loaded (you need to set nocp)"
219964e468SBram Moolenaar finish
229964e468SBram Moolenaarendif
23*5c73622aSBram Moolenaarif v:version < 702
24*5c73622aSBram Moolenaar echohl WarningMsg
25*5c73622aSBram Moolenaar echo "***warning*** this version of getscript needs vim 7.2"
26*5c73622aSBram Moolenaar echohl Normal
27*5c73622aSBram Moolenaar finish
28*5c73622aSBram Moolenaarendif
299964e468SBram Moolenaarlet s:keepcpo = &cpo
309964e468SBram Moolenaarset cpo&vim
3182038d73SBram Moolenaar"DechoTabOn
329964e468SBram Moolenaar
333577c6faSBram Moolenaar" ---------------------------
349964e468SBram Moolenaar" Global Variables: {{{1
353577c6faSBram Moolenaar" ---------------------------
363577c6faSBram Moolenaar" Cygwin Detection ------- {{{2
373577c6faSBram Moolenaarif !exists("g:getscript_cygwin")
383577c6faSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16")
393577c6faSBram Moolenaar  if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
403577c6faSBram Moolenaar   let g:getscript_cygwin= 1
413577c6faSBram Moolenaar  else
423577c6faSBram Moolenaar   let g:getscript_cygwin= 0
433577c6faSBram Moolenaar  endif
443577c6faSBram Moolenaar else
453577c6faSBram Moolenaar  let g:getscript_cygwin= 0
463577c6faSBram Moolenaar endif
473577c6faSBram Moolenaarendif
483577c6faSBram Moolenaar
493577c6faSBram Moolenaar" wget vs curl {{{2
509964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_wget")
519964e468SBram Moolenaar if executable("wget")
529964e468SBram Moolenaar  let g:GetLatestVimScripts_wget= "wget"
539964e468SBram Moolenaar elseif executable("curl")
549964e468SBram Moolenaar  let g:GetLatestVimScripts_wget= "curl"
559964e468SBram Moolenaar else
569964e468SBram Moolenaar  let g:GetLatestVimScripts_wget    = 'echo "GetLatestVimScripts needs wget or curl"'
579964e468SBram Moolenaar  let g:GetLatestVimScripts_options = ""
589964e468SBram Moolenaar endif
599964e468SBram Moolenaarendif
609964e468SBram Moolenaar
619964e468SBram Moolenaar" options that wget and curl require:
629964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_options")
639964e468SBram Moolenaar if g:GetLatestVimScripts_wget == "wget"
649964e468SBram Moolenaar  let g:GetLatestVimScripts_options= "-q -O"
659964e468SBram Moolenaar elseif g:GetLatestVimScripts_wget == "curl"
669964e468SBram Moolenaar  let g:GetLatestVimScripts_options= "-s -O"
679964e468SBram Moolenaar else
689964e468SBram Moolenaar  let g:GetLatestVimScripts_options= ""
699964e468SBram Moolenaar endif
709964e468SBram Moolenaarendif
719964e468SBram Moolenaar
729964e468SBram Moolenaar" by default, allow autoinstall lines to work
739964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_allowautoinstall")
749964e468SBram Moolenaar let g:GetLatestVimScripts_allowautoinstall= 1
759964e468SBram Moolenaarendif
769964e468SBram Moolenaar
779964e468SBram Moolenaar"" For debugging:
789964e468SBram Moolenaar"let g:GetLatestVimScripts_wget    = "echo"
799964e468SBram Moolenaar"let g:GetLatestVimScripts_options = "options"
809964e468SBram Moolenaar
819964e468SBram Moolenaar" ---------------------------------------------------------------------
829964e468SBram Moolenaar" Check If AutoInstall Capable: {{{1
839964e468SBram Moolenaarlet s:autoinstall= ""
849964e468SBram Moolenaarif g:GetLatestVimScripts_allowautoinstall
859964e468SBram Moolenaar
869964e468SBram Moolenaar if (has("win32") || has("gui_win32") || has("gui_win32s") || has("win16") || has("win64") || has("win32unix") || has("win95")) && &shell != "bash"
879964e468SBram Moolenaar  " windows (but not cygwin/bash)
889964e468SBram Moolenaar  let s:dotvim= "vimfiles"
899964e468SBram Moolenaar  if !exists("g:GetLatestVimScripts_mv")
909964e468SBram Moolenaar   let g:GetLatestVimScripts_mv= "ren"
919964e468SBram Moolenaar  endif
929964e468SBram Moolenaar
939964e468SBram Moolenaar else
949964e468SBram Moolenaar  " unix
959964e468SBram Moolenaar  let s:dotvim= ".vim"
969964e468SBram Moolenaar  if !exists("g:GetLatestVimScripts_mv")
979964e468SBram Moolenaar   let g:GetLatestVimScripts_mv= "mv"
989964e468SBram Moolenaar  endif
999964e468SBram Moolenaar endif
1009964e468SBram Moolenaar
101*5c73622aSBram Moolenaar if exists("g:GetLatestVimScripts_autoinstalldir") && isdirectory(g:GetLatestVimScripts_autoinstalldir)
102*5c73622aSBram Moolenaar  let s:autoinstall= g:GetLatestVimScripts_autoinstalldir"
103*5c73622aSBram Moolenaar elseif exists('$HOME') && isdirectory(expand("$HOME")."/".s:dotvim)
1049964e468SBram Moolenaar  let s:autoinstall= $HOME."/".s:dotvim
1059964e468SBram Moolenaar endif
1069964e468SBram Moolenaar" call Decho("s:autoinstall<".s:autoinstall.">")
1079964e468SBram Moolenaar"else "Decho
1089964e468SBram Moolenaar" call Decho("g:GetLatestVimScripts_allowautoinstall=".g:GetLatestVimScripts_allowautoinstall.": :AutoInstall: disabled")
1099964e468SBram Moolenaarendif
1109964e468SBram Moolenaar
1119964e468SBram Moolenaar" ---------------------------------------------------------------------
1129964e468SBram Moolenaar"  Public Interface: {{{1
1139964e468SBram Moolenaarcom!        -nargs=0 GetLatestVimScripts call getscript#GetLatestVimScripts()
1149964e468SBram Moolenaarcom!        -nargs=0 GetScript           call getscript#GetLatestVimScripts()
1159964e468SBram Moolenaarsilent! com -nargs=0 GLVS                call getscript#GetLatestVimScripts()
1169964e468SBram Moolenaar
1179964e468SBram Moolenaar" ---------------------------------------------------------------------
1189964e468SBram Moolenaar" GetLatestVimScripts: this function gets the latest versions of {{{1
1199964e468SBram Moolenaar"                      scripts based on the list in
1209964e468SBram Moolenaar"   (first dir in runtimepath)/GetLatest/GetLatestVimScripts.dat
1219964e468SBram Moolenaarfun! getscript#GetLatestVimScripts()
1229964e468SBram Moolenaar"  call Dfunc("GetLatestVimScripts() autoinstall<".s:autoinstall.">")
1239964e468SBram Moolenaar
1249964e468SBram Moolenaar" insure that wget is executable
1259964e468SBram Moolenaar  if executable(g:GetLatestVimScripts_wget) != 1
1269964e468SBram Moolenaar   echoerr "GetLatestVimScripts needs ".g:GetLatestVimScripts_wget." which apparently is not available on your system"
1279964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : wget not executable/availble")
1289964e468SBram Moolenaar   return
1299964e468SBram Moolenaar  endif
1309964e468SBram Moolenaar
131c236c16dSBram Moolenaar  " insure that fnameescape() is available
132c236c16dSBram Moolenaar  if !exists("*fnameescape")
133c236c16dSBram Moolenaar   echoerr "GetLatestVimScripts needs fnameescape() (provided by 7.1.299 or later)"
134c236c16dSBram Moolenaar   return
135c236c16dSBram Moolenaar  endif
136c236c16dSBram Moolenaar
1379964e468SBram Moolenaar  " Find the .../GetLatest subdirectory under the runtimepath
1389964e468SBram Moolenaar  for datadir in split(&rtp,',') + ['']
1399964e468SBram Moolenaar   if isdirectory(datadir."/GetLatest")
1409964e468SBram Moolenaar"    call Decho("found directory<".datadir.">")
1419964e468SBram Moolenaar    let datadir= datadir . "/GetLatest"
1429964e468SBram Moolenaar    break
1439964e468SBram Moolenaar   endif
1449964e468SBram Moolenaar   if filereadable(datadir."GetLatestVimScripts.dat")
1459964e468SBram Moolenaar"    call Decho("found ".datadir."/GetLatestVimScripts.dat")
1469964e468SBram Moolenaar    break
1479964e468SBram Moolenaar   endif
1489964e468SBram Moolenaar  endfor
14982038d73SBram Moolenaar
1509964e468SBram Moolenaar  " Sanity checks: readability and writability
1519964e468SBram Moolenaar  if datadir == ""
1529964e468SBram Moolenaar   echoerr 'Missing "GetLatest/" on your runtimepath - see :help glvs-dist-install'
1539964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : unable to find a GetLatest subdirectory")
1549964e468SBram Moolenaar   return
1559964e468SBram Moolenaar  endif
1569964e468SBram Moolenaar  if filewritable(datadir) != 2
1579964e468SBram Moolenaar   echoerr "(getLatestVimScripts) Your ".datadir." isn't writable"
1589964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : non-writable directory<".datadir.">")
1599964e468SBram Moolenaar   return
1609964e468SBram Moolenaar  endif
1619964e468SBram Moolenaar  let datafile= datadir."/GetLatestVimScripts.dat"
1629964e468SBram Moolenaar  if !filereadable(datafile)
1639964e468SBram Moolenaar   echoerr "Your data file<".datafile."> isn't readable"
1649964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : non-readable datafile<".datafile.">")
1659964e468SBram Moolenaar   return
1669964e468SBram Moolenaar  endif
1679964e468SBram Moolenaar  if !filewritable(datafile)
1689964e468SBram Moolenaar   echoerr "Your data file<".datafile."> isn't writable"
1699964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : non-writable datafile<".datafile.">")
1709964e468SBram Moolenaar   return
1719964e468SBram Moolenaar  endif
172*5c73622aSBram Moolenaar  " --------------------
173*5c73622aSBram Moolenaar  " Passed sanity checks
174*5c73622aSBram Moolenaar  " --------------------
175*5c73622aSBram Moolenaar
1769964e468SBram Moolenaar"  call Decho("datadir  <".datadir.">")
1779964e468SBram Moolenaar"  call Decho("datafile <".datafile.">")
1789964e468SBram Moolenaar
179*5c73622aSBram Moolenaar  " don't let any event handlers interfere (like winmanager's, taglist's, etc)
1809964e468SBram Moolenaar  let eikeep  = &ei
181c236c16dSBram Moolenaar  let hlskeep = &hls
182*5c73622aSBram Moolenaar  let acdkeep = &acd
183*5c73622aSBram Moolenaar  set ei=all hls&vim noacd
1849964e468SBram Moolenaar
185*5c73622aSBram Moolenaar  " Edit the datafile (ie. GetLatestVimScripts.dat):
186*5c73622aSBram Moolenaar  " 1. record current directory (origdir),
187*5c73622aSBram Moolenaar  " 2. change directory to datadir,
188*5c73622aSBram Moolenaar  " 3. split window
189*5c73622aSBram Moolenaar  " 4. edit datafile
1909964e468SBram Moolenaar  let origdir= getcwd()
1913577c6faSBram Moolenaar"  call Decho("exe cd ".fnameescape(substitute(datadir,'\','/','ge')))
1923577c6faSBram Moolenaar  exe "cd ".fnameescape(substitute(datadir,'\','/','ge'))
1939964e468SBram Moolenaar  split
1943577c6faSBram Moolenaar"  call Decho("exe  e ".fnameescape(substitute(datafile,'\','/','ge')))
1953577c6faSBram Moolenaar  exe "e ".fnameescape(substitute(datafile,'\','/','ge'))
1969964e468SBram Moolenaar  res 1000
1979964e468SBram Moolenaar  let s:downloads = 0
1989964e468SBram Moolenaar  let s:downerrors= 0
1999964e468SBram Moolenaar
2009964e468SBram Moolenaar  " Check on dependencies mentioned in plugins
2019964e468SBram Moolenaar"  call Decho(" ")
2029964e468SBram Moolenaar"  call Decho("searching plugins for GetLatestVimScripts dependencies")
2039964e468SBram Moolenaar  let lastline    = line("$")
20482038d73SBram Moolenaar"  call Decho("lastline#".lastline)
205*5c73622aSBram Moolenaar  let firstdir    = substitute(&rtp,',.*$','','')
206*5c73622aSBram Moolenaar  let plugins     = split(globpath(firstdir,"plugin/*.vim"),'\n')
207*5c73622aSBram Moolenaar  let plugins     = plugins + split(globpath(firstdir,"AsNeeded/*.vim"),'\n')
2089964e468SBram Moolenaar  let foundscript = 0
2099964e468SBram Moolenaar
210*5c73622aSBram Moolenaar  " this loop updates the GetLatestVimScripts.dat file
211*5c73622aSBram Moolenaar  " with dependencies explicitly mentioned in the plugins
212*5c73622aSBram Moolenaar  " via   GetLatestVimScripts: ... lines
213*5c73622aSBram Moolenaar  " It reads the plugin script at the end of the GetLatestVimScripts.dat
214*5c73622aSBram Moolenaar  " file, examines it, and then removes it.
21582038d73SBram Moolenaar  for plugin in plugins
216*5c73622aSBram Moolenaar"   call Decho(" ")
2173577c6faSBram Moolenaar"   call Decho("plugin<".plugin.">")
21882038d73SBram Moolenaar
21982038d73SBram Moolenaar   " read plugin in
2203577c6faSBram Moolenaar   " evidently a :r creates a new buffer (the "#" buffer) that is subsequently unused -- bwiping it
2219964e468SBram Moolenaar   $
2229964e468SBram Moolenaar"   call Decho(".dependency checking<".plugin."> line$=".line("$"))
223*5c73622aSBram Moolenaar"   call Decho("..exe silent r ".fnameescape(plugin))
2243577c6faSBram Moolenaar   exe "silent r ".fnameescape(plugin)
2253577c6faSBram Moolenaar   exe "silent bwipe ".bufnr("#")
22682038d73SBram Moolenaar
2279964e468SBram Moolenaar   while search('^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+','W') != 0
228*5c73622aSBram Moolenaar    let depscript   = substitute(getline("."),'^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+\s\+\(.*\)$','\1','e')
229*5c73622aSBram Moolenaar    let depscriptid = substitute(getline("."),'^"\s\+GetLatestVimScripts:\s\+\(\d\+\)\s\+.*$','\1','')
2309964e468SBram Moolenaar    let llp1        = lastline+1
231*5c73622aSBram Moolenaar"    call Decho("..depscript<".depscript.">")
2329964e468SBram Moolenaar
233*5c73622aSBram Moolenaar    " found a "GetLatestVimScripts: # #" line in the script;
234*5c73622aSBram Moolenaar    " check if its already in the datafile by searching backwards from llp1,
235*5c73622aSBram Moolenaar    " the (prior to reading in the plugin script) last line plus one of the GetLatestVimScripts.dat file,
236*5c73622aSBram Moolenaar    " for the script-id with no wrapping allowed.
2379964e468SBram Moolenaar    let curline     = line(".")
238*5c73622aSBram Moolenaar    let noai_script = substitute(depscript,'\s*:AutoInstall:\s*','','e')
2399964e468SBram Moolenaar    exe llp1
240*5c73622aSBram Moolenaar    let srchline    = search('^\s*'.depscriptid.'\s\+\d\+\s\+.*$','bW')
241*5c73622aSBram Moolenaar    if srchline == 0
242*5c73622aSBram Moolenaar     " this second search is taken when, for example, a   0 0 scriptname  is to be skipped over
2439964e468SBram Moolenaar     let srchline= search('\<'.noai_script.'\>','bW')
244*5c73622aSBram Moolenaar    endif
245*5c73622aSBram Moolenaar"    call Decho("..noai_script<".noai_script."> depscriptid#".depscriptid." srchline#".srchline." curline#".line(".")." lastline#".lastline)
2469964e468SBram Moolenaar
2479964e468SBram Moolenaar    if srchline == 0
2489964e468SBram Moolenaar     " found a new script to permanently include in the datafile
2499964e468SBram Moolenaar     let keep_rega   = @a
2509964e468SBram Moolenaar     let @a          = substitute(getline(curline),'^"\s\+GetLatestVimScripts:\s\+','','')
251*5c73622aSBram Moolenaar     echomsg "Appending <".@a."> to ".datafile." for ".depscript
252*5c73622aSBram Moolenaar"     call Decho("..Appending <".@a."> to ".datafile." for ".depscript)
2539964e468SBram Moolenaar     exe lastline."put a"
2549964e468SBram Moolenaar     let @a          = keep_rega
2559964e468SBram Moolenaar     let lastline    = llp1
2569964e468SBram Moolenaar     let curline     = curline     + 1
2579964e468SBram Moolenaar     let foundscript = foundscript + 1
2589964e468SBram Moolenaar"    else	" Decho
2599964e468SBram Moolenaar"     call Decho("..found <".noai_script."> (already in datafile at line#".srchline.")")
2609964e468SBram Moolenaar    endif
2619964e468SBram Moolenaar
2629964e468SBram Moolenaar    let curline = curline + 1
2639964e468SBram Moolenaar    exe curline
2649964e468SBram Moolenaar   endwhile
26582038d73SBram Moolenaar
266*5c73622aSBram Moolenaar   " llp1: last line plus one
2679964e468SBram Moolenaar   let llp1= lastline + 1
2689964e468SBram Moolenaar"   call Decho(".deleting lines: ".llp1.",$d")
2699964e468SBram Moolenaar   exe "silent! ".llp1.",$d"
27082038d73SBram Moolenaar  endfor
27182038d73SBram Moolenaar"  call Decho("--- end dependency checking loop ---  foundscript=".foundscript)
27282038d73SBram Moolenaar"  call Decho(" ")
2733577c6faSBram Moolenaar"  call Dredir("BUFFER TEST (GetLatestVimScripts 1)","ls!")
2749964e468SBram Moolenaar
2759964e468SBram Moolenaar  if foundscript == 0
2763577c6faSBram Moolenaar   setlocal nomod
2779964e468SBram Moolenaar  endif
2789964e468SBram Moolenaar
279*5c73622aSBram Moolenaar  " --------------------------------------------------------------------
2809964e468SBram Moolenaar  " Check on out-of-date scripts using GetLatest/GetLatestVimScripts.dat
281*5c73622aSBram Moolenaar  " --------------------------------------------------------------------
28282038d73SBram Moolenaar"  call Decho("begin: checking out-of-date scripts using datafile<".datafile.">")
2833577c6faSBram Moolenaar  setlocal lz
2849964e468SBram Moolenaar  1
28582038d73SBram Moolenaar"  /^-----/,$g/^\s*\d/call Decho(getline("."))
28682038d73SBram Moolenaar  1
28782038d73SBram Moolenaar  /^-----/,$g/^\s*\d/call s:GetOneScript()
28882038d73SBram Moolenaar"  call Decho("--- end out-of-date checking --- ")
2899964e468SBram Moolenaar
2909964e468SBram Moolenaar  " Final report (an echomsg)
2919964e468SBram Moolenaar  try
2929964e468SBram Moolenaar   silent! ?^-------?
2939964e468SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E114/
2949964e468SBram Moolenaar"   call Dret("GetLatestVimScripts : nothing done!")
2959964e468SBram Moolenaar   return
2969964e468SBram Moolenaar  endtry
2979964e468SBram Moolenaar  exe "norm! kz\<CR>"
2989964e468SBram Moolenaar  redraw!
2999964e468SBram Moolenaar  let s:msg = ""
3009964e468SBram Moolenaar  if s:downloads == 1
3019964e468SBram Moolenaar  let s:msg = "Downloaded one updated script to <".datadir.">"
3029964e468SBram Moolenaar  elseif s:downloads == 2
3039964e468SBram Moolenaar   let s:msg= "Downloaded two updated scripts to <".datadir.">"
3049964e468SBram Moolenaar  elseif s:downloads > 1
3059964e468SBram Moolenaar   let s:msg= "Downloaded ".s:downloads." updated scripts to <".datadir.">"
3069964e468SBram Moolenaar  else
3079964e468SBram Moolenaar   let s:msg= "Everything was already current"
3089964e468SBram Moolenaar  endif
3099964e468SBram Moolenaar  if s:downerrors > 0
3109964e468SBram Moolenaar   let s:msg= s:msg." (".s:downerrors." downloading errors)"
3119964e468SBram Moolenaar  endif
3129964e468SBram Moolenaar  echomsg s:msg
3139964e468SBram Moolenaar  " save the file
3149964e468SBram Moolenaar  if &mod
3159964e468SBram Moolenaar   silent! w!
3169964e468SBram Moolenaar  endif
3179964e468SBram Moolenaar  q
3189964e468SBram Moolenaar
3199964e468SBram Moolenaar  " restore events and current directory
3203577c6faSBram Moolenaar  exe "cd ".fnameescape(substitute(origdir,'\','/','ge'))
3219964e468SBram Moolenaar  let &ei  = eikeep
322c236c16dSBram Moolenaar  let &hls = hlskeep
323*5c73622aSBram Moolenaar  let &acd = acdkeep
3243577c6faSBram Moolenaar  setlocal nolz
3253577c6faSBram Moolenaar"  call Dredir("BUFFER TEST (GetLatestVimScripts 2)","ls!")
3269964e468SBram Moolenaar"  call Dret("GetLatestVimScripts : did ".s:downloads." downloads")
3279964e468SBram Moolenaarendfun
3289964e468SBram Moolenaar
3293577c6faSBram Moolenaar" ---------------------------------------------------------------------
3303577c6faSBram Moolenaar"  GetOneScript: (Get Latest Vim Script) this function operates {{{1
3313577c6faSBram Moolenaar"    on the current line, interpreting two numbers and text as
3323577c6faSBram Moolenaar"    ScriptID, SourceID, and Filename.
333*5c73622aSBram Moolenaar"    It downloads any scripts that have newer versions from vim.sourceforge.net.
3343577c6faSBram Moolenaarfun! s:GetOneScript(...)
3353577c6faSBram Moolenaar"   call Dfunc("GetOneScript()")
3363577c6faSBram Moolenaar
3373577c6faSBram Moolenaar " set options to allow progress to be shown on screen
3383577c6faSBram Moolenaar  let rega= @a
3393577c6faSBram Moolenaar  let t_ti= &t_ti
3403577c6faSBram Moolenaar  let t_te= &t_te
3413577c6faSBram Moolenaar  let rs  = &rs
3423577c6faSBram Moolenaar  set t_ti= t_te= nors
3433577c6faSBram Moolenaar
3443577c6faSBram Moolenaar " put current line on top-of-screen and interpret it into
3453577c6faSBram Moolenaar " a      script identifer  : used to obtain webpage
3463577c6faSBram Moolenaar "        source identifier : used to identify current version
3473577c6faSBram Moolenaar " and an associated comment: used to report on what's being considered
3483577c6faSBram Moolenaar  if a:0 >= 3
3493577c6faSBram Moolenaar   let scriptid = a:1
3503577c6faSBram Moolenaar   let srcid    = a:2
3513577c6faSBram Moolenaar   let fname    = a:3
3523577c6faSBram Moolenaar   let cmmnt    = ""
3533577c6faSBram Moolenaar"   call Decho("scriptid<".scriptid.">")
3543577c6faSBram Moolenaar"   call Decho("srcid   <".srcid.">")
3553577c6faSBram Moolenaar"   call Decho("fname   <".fname.">")
3563577c6faSBram Moolenaar  else
3573577c6faSBram Moolenaar   let curline  = getline(".")
3583577c6faSBram Moolenaar   if curline =~ '^\s*#'
3593577c6faSBram Moolenaar    let @a= rega
3603577c6faSBram Moolenaar"    call Dret("GetOneScript : skipping a pure comment line")
3613577c6faSBram Moolenaar    return
3623577c6faSBram Moolenaar   endif
3633577c6faSBram Moolenaar   let parsepat = '^\s*\(\d\+\)\s\+\(\d\+\)\s\+\(.\{-}\)\(\s*#.*\)\=$'
3643577c6faSBram Moolenaar   try
3653577c6faSBram Moolenaar    let scriptid = substitute(curline,parsepat,'\1','e')
3663577c6faSBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
3673577c6faSBram Moolenaar    let scriptid= 0
3683577c6faSBram Moolenaar   endtry
3693577c6faSBram Moolenaar   try
3703577c6faSBram Moolenaar    let srcid    = substitute(curline,parsepat,'\2','e')
3713577c6faSBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
3723577c6faSBram Moolenaar    let srcid= 0
3733577c6faSBram Moolenaar   endtry
3743577c6faSBram Moolenaar   try
3753577c6faSBram Moolenaar    let fname= substitute(curline,parsepat,'\3','e')
3763577c6faSBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
3773577c6faSBram Moolenaar    let fname= ""
3783577c6faSBram Moolenaar   endtry
3793577c6faSBram Moolenaar   try
3803577c6faSBram Moolenaar    let cmmnt= substitute(curline,parsepat,'\4','e')
3813577c6faSBram Moolenaar   catch /^Vim\%((\a\+)\)\=:E486/
3823577c6faSBram Moolenaar    let cmmnt= ""
3833577c6faSBram Moolenaar   endtry
3843577c6faSBram Moolenaar"   call Decho("curline <".curline.">")
3853577c6faSBram Moolenaar"   call Decho("parsepat<".parsepat.">")
3863577c6faSBram Moolenaar"   call Decho("scriptid<".scriptid.">")
3873577c6faSBram Moolenaar"   call Decho("srcid   <".srcid.">")
3883577c6faSBram Moolenaar"   call Decho("fname   <".fname.">")
3893577c6faSBram Moolenaar  endif
3903577c6faSBram Moolenaar
391*5c73622aSBram Moolenaar  " plugin author protection from downloading his/her own scripts atop their latest work
3923577c6faSBram Moolenaar  if scriptid == 0 || srcid == 0
3933577c6faSBram Moolenaar   " When looking for :AutoInstall: lines, skip scripts that have   0 0 scriptname
3943577c6faSBram Moolenaar   let @a= rega
3953577c6faSBram Moolenaar"   call Dret("GetOneScript : skipping a scriptid==srcid==0 line")
3963577c6faSBram Moolenaar   return
3973577c6faSBram Moolenaar  endif
3983577c6faSBram Moolenaar
3993577c6faSBram Moolenaar  let doautoinstall= 0
4003577c6faSBram Moolenaar  if fname =~ ":AutoInstall:"
4013577c6faSBram Moolenaar"   call Decho("case AutoInstall: fname<".fname.">")
4023577c6faSBram Moolenaar   let aicmmnt= substitute(fname,'\s\+:AutoInstall:\s\+',' ','')
4033577c6faSBram Moolenaar"   call Decho("aicmmnt<".aicmmnt."> s:autoinstall=".s:autoinstall)
4043577c6faSBram Moolenaar   if s:autoinstall != ""
4053577c6faSBram Moolenaar    let doautoinstall = g:GetLatestVimScripts_allowautoinstall
4063577c6faSBram Moolenaar   endif
4073577c6faSBram Moolenaar  else
4083577c6faSBram Moolenaar   let aicmmnt= fname
4093577c6faSBram Moolenaar  endif
4103577c6faSBram Moolenaar"  call Decho("aicmmnt<".aicmmnt.">: doautoinstall=".doautoinstall)
4113577c6faSBram Moolenaar
4123577c6faSBram Moolenaar  exe "norm z\<CR>"
4133577c6faSBram Moolenaar  redraw!
4143577c6faSBram Moolenaar"  call Decho('considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid)
4153577c6faSBram Moolenaar  echo 'considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid
4163577c6faSBram Moolenaar
417*5c73622aSBram Moolenaar  " grab a copy of the plugin's vim.sourceforge.net webpage
418*5c73622aSBram Moolenaar  let scriptaddr = 'http://vim.sourceforge.net/script.php?script_id='.scriptid
4193577c6faSBram Moolenaar  let tmpfile    = tempname()
4203577c6faSBram Moolenaar  let v:errmsg   = ""
4213577c6faSBram Moolenaar
4223577c6faSBram Moolenaar  " make up to three tries at downloading the description
4233577c6faSBram Moolenaar  let itry= 1
4243577c6faSBram Moolenaar  while itry <= 3
425*5c73622aSBram Moolenaar"   call Decho(".try#".itry." to download description of <".aicmmnt."> with addr=".scriptaddr)
4263577c6faSBram Moolenaar   if has("win32") || has("win16") || has("win95")
427*5c73622aSBram Moolenaar"    call Decho(".new|exe silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(tmpfile).' '.shellescape(scriptaddr)."|bw!")
428*5c73622aSBram Moolenaar    new|exe "silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(tmpfile).' '.shellescape(scriptaddr)|bw!
4293577c6faSBram Moolenaar   else
430*5c73622aSBram Moolenaar"    call Decho(".exe silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(tmpfile)." ".shellescape(scriptaddr))
431*5c73622aSBram Moolenaar    exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(tmpfile)." ".shellescape(scriptaddr)
4323577c6faSBram Moolenaar   endif
4333577c6faSBram Moolenaar   if itry == 1
4343577c6faSBram Moolenaar    exe "silent vsplit ".fnameescape(tmpfile)
4353577c6faSBram Moolenaar   else
4363577c6faSBram Moolenaar    silent! e %
4373577c6faSBram Moolenaar   endif
4383577c6faSBram Moolenaar   setlocal bh=wipe
4393577c6faSBram Moolenaar
4403577c6faSBram Moolenaar   " find the latest source-id in the plugin's webpage
4413577c6faSBram Moolenaar   silent! 1
4423577c6faSBram Moolenaar   let findpkg= search('Click on the package to download','W')
4433577c6faSBram Moolenaar   if findpkg > 0
4443577c6faSBram Moolenaar    break
4453577c6faSBram Moolenaar   endif
4463577c6faSBram Moolenaar   let itry= itry + 1
4473577c6faSBram Moolenaar  endwhile
4483577c6faSBram Moolenaar"  call Decho(" --- end downloading tries while loop --- itry=".itry)
4493577c6faSBram Moolenaar
4503577c6faSBram Moolenaar  " testing: did finding "Click on the package..." fail?
4513577c6faSBram Moolenaar  if findpkg == 0 || itry >= 4
4523577c6faSBram Moolenaar   silent q!
4533577c6faSBram Moolenaar   call delete(tmpfile)
4543577c6faSBram Moolenaar  " restore options
4553577c6faSBram Moolenaar   let &t_ti        = t_ti
4563577c6faSBram Moolenaar   let &t_te        = t_te
4573577c6faSBram Moolenaar   let &rs          = rs
4583577c6faSBram Moolenaar   let s:downerrors = s:downerrors + 1
4593577c6faSBram Moolenaar"   call Decho("***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">")
4603577c6faSBram Moolenaar   echomsg "***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">"
4613577c6faSBram Moolenaar"   call Dret("GetOneScript : srch for /Click on the package/ failed")
4623577c6faSBram Moolenaar   let @a= rega
4633577c6faSBram Moolenaar   return
4643577c6faSBram Moolenaar  endif
4653577c6faSBram Moolenaar"  call Decho('found "Click on the package to download"')
4663577c6faSBram Moolenaar
4673577c6faSBram Moolenaar  let findsrcid= search('src_id=','W')
4683577c6faSBram Moolenaar  if findsrcid == 0
4693577c6faSBram Moolenaar   silent q!
4703577c6faSBram Moolenaar   call delete(tmpfile)
4713577c6faSBram Moolenaar  " restore options
4723577c6faSBram Moolenaar   let &t_ti        = t_ti
4733577c6faSBram Moolenaar   let &t_te        = t_te
4743577c6faSBram Moolenaar   let &rs          = rs
4753577c6faSBram Moolenaar   let s:downerrors = s:downerrors + 1
4763577c6faSBram Moolenaar"   call Decho("***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">")
4773577c6faSBram Moolenaar   echomsg "***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">"
4783577c6faSBram Moolenaar   let @a= rega
4793577c6faSBram Moolenaar"  call Dret("GetOneScript : srch for /src_id/ failed")
4803577c6faSBram Moolenaar   return
4813577c6faSBram Moolenaar  endif
4823577c6faSBram Moolenaar"  call Decho('found "src_id=" in description page')
4833577c6faSBram Moolenaar
4843577c6faSBram Moolenaar  let srcidpat   = '^\s*<td class.*src_id=\(\d\+\)">\([^<]\+\)<.*$'
4853577c6faSBram Moolenaar  let latestsrcid= substitute(getline("."),srcidpat,'\1','')
4863577c6faSBram Moolenaar  let sname      = substitute(getline("."),srcidpat,'\2','') " script name actually downloaded
4873577c6faSBram Moolenaar"  call Decho("srcidpat<".srcidpat."> latestsrcid<".latestsrcid."> sname<".sname.">")
4883577c6faSBram Moolenaar  silent q!
4893577c6faSBram Moolenaar  call delete(tmpfile)
4903577c6faSBram Moolenaar
4913577c6faSBram Moolenaar  " convert the strings-of-numbers into numbers
4923577c6faSBram Moolenaar  let srcid       = srcid       + 0
4933577c6faSBram Moolenaar  let latestsrcid = latestsrcid + 0
4943577c6faSBram Moolenaar"  call Decho("srcid=".srcid." latestsrcid=".latestsrcid." sname<".sname.">")
4953577c6faSBram Moolenaar
496*5c73622aSBram Moolenaar  " has the plugin's most-recent srcid increased, which indicates that it has been updated
4973577c6faSBram Moolenaar  if latestsrcid > srcid
4983577c6faSBram Moolenaar"   call Decho("[latestsrcid=".latestsrcid."] <= [srcid=".srcid."]: need to update <".sname.">")
4993577c6faSBram Moolenaar
5003577c6faSBram Moolenaar   let s:downloads= s:downloads + 1
5013577c6faSBram Moolenaar   if sname == bufname("%")
5023577c6faSBram Moolenaar    " GetLatestVimScript has to be careful about downloading itself
5033577c6faSBram Moolenaar    let sname= "NEW_".sname
5043577c6faSBram Moolenaar   endif
5053577c6faSBram Moolenaar
506*5c73622aSBram Moolenaar   " -----------------------------------------------------------------------------
5073577c6faSBram Moolenaar   " the plugin has been updated since we last obtained it, so download a new copy
508*5c73622aSBram Moolenaar   " -----------------------------------------------------------------------------
509*5c73622aSBram Moolenaar"   call Decho(".downloading new <".sname.">")
510*5c73622aSBram Moolenaar   echomsg ".downloading new <".sname.">"
5113577c6faSBram Moolenaar   if has("win32") || has("win16") || has("win95")
512*5c73622aSBram Moolenaar"    call Decho(".new|exe silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(sname)." ".shellescape('http://vim.sourceforge.net/scripts/download_script.php?src_id='.latestsrcid)."|q")
513*5c73622aSBram Moolenaar    new|exe "silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(sname)." ".shellescape('http://vim.sourceforge.net/scripts/download_script.php?src_id='.latestsrcid)|q
5143577c6faSBram Moolenaar   else
515*5c73622aSBram Moolenaar"    call Decho(".exe silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(sname)." ".shellescape('http://vim.sourceforge.net/scripts/download_script.php?src_id='))
516*5c73622aSBram Moolenaar    exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(sname)." ".shellescape('http://vim.sourceforge.net/scripts/download_script.php?src_id=').latestsrcid
5173577c6faSBram Moolenaar   endif
5183577c6faSBram Moolenaar
519*5c73622aSBram Moolenaar   " --------------------------------------------------------------------------
5203577c6faSBram Moolenaar   " AutoInstall: only if doautoinstall has been requested by the plugin itself
521*5c73622aSBram Moolenaar   " --------------------------------------------------------------------------
5223577c6faSBram Moolenaar   if doautoinstall
523*5c73622aSBram Moolenaar"    call Decho(" ")
524*5c73622aSBram Moolenaar"    call Decho("Autoinstall: getcwd<".getcwd()."> filereadable(".sname.")=".filereadable(sname))
5253577c6faSBram Moolenaar    if filereadable(sname)
526*5c73622aSBram Moolenaar"     call Decho("<".sname."> is readable")
527*5c73622aSBram Moolenaar"     call Decho("exe silent !".g:GetLatestVimScripts_mv." ".shellescape(sname)." ".shellescape(s:autoinstall))
528*5c73622aSBram Moolenaar     exe "silent !".g:GetLatestVimScripts_mv." ".shellescape(sname)." ".shellescape(s:autoinstall)
5293577c6faSBram Moolenaar     let curdir    = escape(substitute(getcwd(),'\','/','ge'),"|[]*'\" #")
5303577c6faSBram Moolenaar     let installdir= curdir."/Installed"
5313577c6faSBram Moolenaar     if !isdirectory(installdir)
5323577c6faSBram Moolenaar      call mkdir(installdir)
5333577c6faSBram Moolenaar     endif
534*5c73622aSBram Moolenaar"     call Decho("curdir<".curdir."> installdir<".installdir.">")
5353577c6faSBram Moolenaar"     call Decho("exe cd ".fnameescape(s:autoinstall))
5363577c6faSBram Moolenaar     exe "cd ".fnameescape(s:autoinstall)
5373577c6faSBram Moolenaar
538*5c73622aSBram Moolenaar     " determine target directory for moves
539*5c73622aSBram Moolenaar     let firstdir= substitute(&rtp,',.*$','','')
540*5c73622aSBram Moolenaar     let pname   = substitute(sname,'\..*','.vim','')
541*5c73622aSBram Moolenaar"     call Decho("determine tgtdir: is <".firstdir.'/AsNeeded/'.pname." readable?")
542*5c73622aSBram Moolenaar     if filereadable(firstdir.'/AsNeeded/'.pname)
543*5c73622aSBram Moolenaar      let tgtdir= "AsNeeded"
544*5c73622aSBram Moolenaar     else
545*5c73622aSBram Moolenaar      let tgtdir= "plugin"
546*5c73622aSBram Moolenaar     endif
547*5c73622aSBram Moolenaar"     call Decho("tgtdir<".tgtdir.">  pname<".pname.">")
548*5c73622aSBram Moolenaar
5493577c6faSBram Moolenaar     " decompress
5503577c6faSBram Moolenaar     if sname =~ '\.bz2$'
5513577c6faSBram Moolenaar"      call Decho("decompress: attempt to bunzip2 ".sname)
552*5c73622aSBram Moolenaar      exe "silent !bunzip2 ".shellescape(sname)
5533577c6faSBram Moolenaar      let sname= substitute(sname,'\.bz2$','','')
5543577c6faSBram Moolenaar"      call Decho("decompress: new sname<".sname."> after bunzip2")
5553577c6faSBram Moolenaar     elseif sname =~ '\.gz$'
5563577c6faSBram Moolenaar"      call Decho("decompress: attempt to gunzip ".sname)
557*5c73622aSBram Moolenaar      exe "silent !gunzip ".shellescape(sname)
5583577c6faSBram Moolenaar      let sname= substitute(sname,'\.gz$','','')
5593577c6faSBram Moolenaar"      call Decho("decompress: new sname<".sname."> after gunzip")
560*5c73622aSBram Moolenaar     else
561*5c73622aSBram Moolenaar"      call Decho("no decompression needed")
5623577c6faSBram Moolenaar     endif
5633577c6faSBram Moolenaar
5643577c6faSBram Moolenaar     " distribute archive(.zip, .tar, .vba) contents
5653577c6faSBram Moolenaar     if sname =~ '\.zip$'
5663577c6faSBram Moolenaar"      call Decho("dearchive: attempt to unzip ".sname)
567*5c73622aSBram Moolenaar      exe "silent !unzip -o ".shellescape(sname)
5683577c6faSBram Moolenaar     elseif sname =~ '\.tar$'
5693577c6faSBram Moolenaar"      call Decho("dearchive: attempt to untar ".sname)
570*5c73622aSBram Moolenaar      exe "silent !tar -xvf ".shellescape(sname)
5713577c6faSBram Moolenaar     elseif sname =~ '\.vba$'
5723577c6faSBram Moolenaar"      call Decho("dearchive: attempt to handle a vimball: ".sname)
5733577c6faSBram Moolenaar      silent 1split
574*5c73622aSBram Moolenaar      if exists("g:vimball_home")
575*5c73622aSBram Moolenaar       let oldvimballhome= g:vimball_home
576*5c73622aSBram Moolenaar      endif
577*5c73622aSBram Moolenaar      let g:vimball_home= s:autoinstall
5783577c6faSBram Moolenaar      exe "silent e ".fnameescape(sname)
5793577c6faSBram Moolenaar      silent so %
5803577c6faSBram Moolenaar      silent q
581*5c73622aSBram Moolenaar      if exists("oldvimballhome")
582*5c73622aSBram Moolenaar       let g:vimball_home= oldvimballhome
583*5c73622aSBram Moolenaar      else
584*5c73622aSBram Moolenaar       unlet g:vimball_home
585*5c73622aSBram Moolenaar      endif
586*5c73622aSBram Moolenaar     else
587*5c73622aSBram Moolenaar"      call Decho("no dearchiving needed")
5883577c6faSBram Moolenaar     endif
5893577c6faSBram Moolenaar
590*5c73622aSBram Moolenaar     " ---------------------------------------------
591*5c73622aSBram Moolenaar     " move plugin to plugin/ or AsNeeded/ directory
592*5c73622aSBram Moolenaar     " ---------------------------------------------
5933577c6faSBram Moolenaar     if sname =~ '.vim$'
594*5c73622aSBram Moolenaar"      call Decho("dearchive: attempt to simply move ".sname." to ".tgtdir)
595*5c73622aSBram Moolenaar      exe "silent !".g:GetLatestVimScripts_mv." ".shellescape(sname)." ".tgtdir
5963577c6faSBram Moolenaar     else
5973577c6faSBram Moolenaar"      call Decho("dearchive: move <".sname."> to installdir<".installdir.">")
598*5c73622aSBram Moolenaar      exe "silent !".g:GetLatestVimScripts_mv." ".shellescape(sname)." ".installdir
599*5c73622aSBram Moolenaar     endif
600*5c73622aSBram Moolenaar     if tgtdir != "plugin"
601*5c73622aSBram Moolenaar"      call Decho("exe silent !".g:GetLatestVimScripts_mv." plugin/".shellescape(pname)." ".tgtdir)
602*5c73622aSBram Moolenaar      exe "silent !".g:GetLatestVimScripts_mv." plugin/".shellescape(pname)." ".tgtdir
6033577c6faSBram Moolenaar     endif
6043577c6faSBram Moolenaar
6053577c6faSBram Moolenaar     " helptags step
6063577c6faSBram Moolenaar     let docdir= substitute(&rtp,',.*','','e')."/doc"
6073577c6faSBram Moolenaar"     call Decho("helptags: docdir<".docdir.">")
6083577c6faSBram Moolenaar     exe "helptags ".fnameescape(docdir)
6093577c6faSBram Moolenaar     exe "cd ".fnameescape(curdir)
6103577c6faSBram Moolenaar    endif
6113577c6faSBram Moolenaar    if fname !~ ':AutoInstall:'
6123577c6faSBram Moolenaar     let modline=scriptid." ".latestsrcid." :AutoInstall: ".fname.cmmnt
6133577c6faSBram Moolenaar    else
6143577c6faSBram Moolenaar     let modline=scriptid." ".latestsrcid." ".fname.cmmnt
6153577c6faSBram Moolenaar    endif
6163577c6faSBram Moolenaar   else
6173577c6faSBram Moolenaar    let modline=scriptid." ".latestsrcid." ".fname.cmmnt
6183577c6faSBram Moolenaar   endif
6193577c6faSBram Moolenaar
6203577c6faSBram Moolenaar   " update the data in the <GetLatestVimScripts.dat> file
6213577c6faSBram Moolenaar   call setline(line("."),modline)
6223577c6faSBram Moolenaar"   call Decho("update data in ".expand("%")."#".line(".").": modline<".modline.">")
6233577c6faSBram Moolenaar"  else " Decho
6243577c6faSBram Moolenaar"   call Decho("[latestsrcid=".latestsrcid."] <= [srcid=".srcid."], no need to update")
6253577c6faSBram Moolenaar  endif
6263577c6faSBram Moolenaar
6273577c6faSBram Moolenaar " restore options
6283577c6faSBram Moolenaar  let &t_ti = t_ti
6293577c6faSBram Moolenaar  let &t_te = t_te
6303577c6faSBram Moolenaar  let &rs   = rs
6313577c6faSBram Moolenaar  let @a    = rega
6323577c6faSBram Moolenaar"  call Dredir("BUFFER TEST (GetOneScript)","ls!")
6333577c6faSBram Moolenaar
6343577c6faSBram Moolenaar"  call Dret("GetOneScript")
6353577c6faSBram Moolenaarendfun
6363577c6faSBram Moolenaar
6373577c6faSBram Moolenaar" ---------------------------------------------------------------------
6389964e468SBram Moolenaar" Restore Options: {{{1
6399964e468SBram Moolenaarlet &cpo= s:keepcpo
6403577c6faSBram Moolenaarunlet s:keepcpo
6419964e468SBram Moolenaar
6423577c6faSBram Moolenaar" ---------------------------------------------------------------------
6433577c6faSBram Moolenaar"  Modelines: {{{1
6449964e468SBram Moolenaar" vim: ts=8 sts=2 fdm=marker nowrap
645