19964e468SBram Moolenaar" --------------------------------------------------------------------- 29964e468SBram Moolenaar" getscript.vim 39964e468SBram Moolenaar" Author: Charles E. Campbell, Jr. 4*9e368dbaSBram Moolenaar" Date: May 11, 2007 5*9e368dbaSBram Moolenaar" Version: 27 69964e468SBram Moolenaar" Installing: :help glvs-install 79964e468SBram Moolenaar" Usage: :help glvs 89964e468SBram Moolenaar" 99964e468SBram Moolenaar" GetLatestVimScripts: 642 1 :AutoInstall: getscript.vim 10*9e368dbaSBram 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 149964e468SBram Moolenaar" expecting vim to be in its vi-compatible mode 159964e468SBram Moolenaarif &cp 169964e468SBram Moolenaar echoerr "GetLatestVimScripts is not vi-compatible; not loaded (you need to set nocp)" 179964e468SBram Moolenaar finish 189964e468SBram Moolenaarendif 199964e468SBram Moolenaarlet s:keepcpo = &cpo 209964e468SBram Moolenaarset cpo&vim 2182038d73SBram Moolenaar"DechoTabOn 229964e468SBram Moolenaar 239964e468SBram Moolenaarif exists("g:loaded_getscript") 249964e468SBram Moolenaar finish 259964e468SBram Moolenaarendif 26*9e368dbaSBram Moolenaarlet g:loaded_getscript= "v27" 279964e468SBram Moolenaar 289964e468SBram Moolenaar" --------------------------------------------------------------------- 299964e468SBram Moolenaar" Global Variables: {{{1 309964e468SBram Moolenaar" allow user to change the command for obtaining scripts (does fetch work?) 319964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_wget") 329964e468SBram Moolenaar if executable("wget") 339964e468SBram Moolenaar let g:GetLatestVimScripts_wget= "wget" 349964e468SBram Moolenaar elseif executable("curl") 359964e468SBram Moolenaar let g:GetLatestVimScripts_wget= "curl" 369964e468SBram Moolenaar else 379964e468SBram Moolenaar let g:GetLatestVimScripts_wget = 'echo "GetLatestVimScripts needs wget or curl"' 389964e468SBram Moolenaar let g:GetLatestVimScripts_options = "" 399964e468SBram Moolenaar endif 409964e468SBram Moolenaarendif 419964e468SBram Moolenaar 429964e468SBram Moolenaar" options that wget and curl require: 439964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_options") 449964e468SBram Moolenaar if g:GetLatestVimScripts_wget == "wget" 459964e468SBram Moolenaar let g:GetLatestVimScripts_options= "-q -O" 469964e468SBram Moolenaar elseif g:GetLatestVimScripts_wget == "curl" 479964e468SBram Moolenaar let g:GetLatestVimScripts_options= "-s -O" 489964e468SBram Moolenaar else 499964e468SBram Moolenaar let g:GetLatestVimScripts_options= "" 509964e468SBram Moolenaar endif 519964e468SBram Moolenaarendif 529964e468SBram Moolenaar 539964e468SBram Moolenaar" by default, allow autoinstall lines to work 549964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_allowautoinstall") 559964e468SBram Moolenaar let g:GetLatestVimScripts_allowautoinstall= 1 569964e468SBram Moolenaarendif 579964e468SBram Moolenaar 589964e468SBram Moolenaar"" For debugging: 599964e468SBram Moolenaar"let g:GetLatestVimScripts_wget = "echo" 609964e468SBram Moolenaar"let g:GetLatestVimScripts_options = "options" 619964e468SBram Moolenaar 629964e468SBram Moolenaar" --------------------------------------------------------------------- 639964e468SBram Moolenaar" Check If AutoInstall Capable: {{{1 649964e468SBram Moolenaarlet s:autoinstall= "" 659964e468SBram Moolenaarif g:GetLatestVimScripts_allowautoinstall 669964e468SBram Moolenaar 679964e468SBram Moolenaar if (has("win32") || has("gui_win32") || has("gui_win32s") || has("win16") || has("win64") || has("win32unix") || has("win95")) && &shell != "bash" 689964e468SBram Moolenaar " windows (but not cygwin/bash) 699964e468SBram Moolenaar let s:dotvim= "vimfiles" 709964e468SBram Moolenaar if !exists("g:GetLatestVimScripts_mv") 719964e468SBram Moolenaar let g:GetLatestVimScripts_mv= "ren" 729964e468SBram Moolenaar endif 739964e468SBram Moolenaar 749964e468SBram Moolenaar else 759964e468SBram Moolenaar " unix 769964e468SBram Moolenaar let s:dotvim= ".vim" 779964e468SBram Moolenaar if !exists("g:GetLatestVimScripts_mv") 789964e468SBram Moolenaar let g:GetLatestVimScripts_mv= "mv" 799964e468SBram Moolenaar endif 809964e468SBram Moolenaar endif 819964e468SBram Moolenaar 829964e468SBram Moolenaar if exists('$HOME') && isdirectory(expand("$HOME")."/".s:dotvim) 839964e468SBram Moolenaar let s:autoinstall= $HOME."/".s:dotvim 849964e468SBram Moolenaar endif 859964e468SBram Moolenaar" call Decho("s:autoinstall<".s:autoinstall.">") 869964e468SBram Moolenaar"else "Decho 879964e468SBram Moolenaar" call Decho("g:GetLatestVimScripts_allowautoinstall=".g:GetLatestVimScripts_allowautoinstall.": :AutoInstall: disabled") 889964e468SBram Moolenaarendif 899964e468SBram Moolenaar 909964e468SBram Moolenaar" --------------------------------------------------------------------- 919964e468SBram Moolenaar" Public Interface: {{{1 929964e468SBram Moolenaarcom! -nargs=0 GetLatestVimScripts call getscript#GetLatestVimScripts() 939964e468SBram Moolenaarcom! -nargs=0 GetScript call getscript#GetLatestVimScripts() 949964e468SBram Moolenaarsilent! com -nargs=0 GLVS call getscript#GetLatestVimScripts() 959964e468SBram Moolenaar 969964e468SBram Moolenaar" --------------------------------------------------------------------- 979964e468SBram Moolenaar" GetOneScript: (Get Latest Vim Script) this function operates {{{1 989964e468SBram Moolenaar" on the current line, interpreting two numbers and text as 999964e468SBram Moolenaar" ScriptID, SourceID, and Filename. 1009964e468SBram Moolenaar" It downloads any scripts that have newer versions from vim.sf.net. 1019964e468SBram Moolenaarfun! s:GetOneScript(...) 1029964e468SBram Moolenaar" call Dfunc("GetOneScript()") 1039964e468SBram Moolenaar 1049964e468SBram Moolenaar " set options to allow progress to be shown on screen 1059964e468SBram Moolenaar let t_ti= &t_ti 1069964e468SBram Moolenaar let t_te= &t_te 1079964e468SBram Moolenaar let rs = &rs 1089964e468SBram Moolenaar set t_ti= t_te= nors 1099964e468SBram Moolenaar 1109964e468SBram Moolenaar " put current line on top-of-screen and interpret it into 1119964e468SBram Moolenaar " a script identifer : used to obtain webpage 1129964e468SBram Moolenaar " source identifier : used to identify current version 1139964e468SBram Moolenaar " and an associated comment: used to report on what's being considered 1149964e468SBram Moolenaar if a:0 >= 3 1159964e468SBram Moolenaar let scriptid = a:1 1169964e468SBram Moolenaar let srcid = a:2 1179964e468SBram Moolenaar let fname = a:3 1189964e468SBram Moolenaar let cmmnt = "" 1199964e468SBram Moolenaar" call Decho("scriptid<".scriptid.">") 1209964e468SBram Moolenaar" call Decho("srcid <".srcid.">") 1219964e468SBram Moolenaar" call Decho("fname <".fname.">") 1229964e468SBram Moolenaar else 1239964e468SBram Moolenaar let curline = getline(".") 1249964e468SBram Moolenaar if curline =~ '^\s*#' 1259964e468SBram Moolenaar" call Dret("GetOneScript : skipping a pure comment line") 1269964e468SBram Moolenaar return 1279964e468SBram Moolenaar endif 1289964e468SBram Moolenaar let parsepat = '^\s*\(\d\+\)\s\+\(\d\+\)\s\+\(.\{-}\)\(\s*#.*\)\=$' 1299964e468SBram Moolenaar try 1309964e468SBram Moolenaar let scriptid = substitute(curline,parsepat,'\1','e') 1319964e468SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 1329964e468SBram Moolenaar let scriptid= 0 1339964e468SBram Moolenaar endtry 1349964e468SBram Moolenaar try 1359964e468SBram Moolenaar let srcid = substitute(curline,parsepat,'\2','e') 1369964e468SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 1379964e468SBram Moolenaar let srcid= 0 1389964e468SBram Moolenaar endtry 1399964e468SBram Moolenaar try 1409964e468SBram Moolenaar let fname= substitute(curline,parsepat,'\3','e') 1419964e468SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 1429964e468SBram Moolenaar let fname= "" 1439964e468SBram Moolenaar endtry 1449964e468SBram Moolenaar try 1459964e468SBram Moolenaar let cmmnt= substitute(curline,parsepat,'\4','e') 1469964e468SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 1479964e468SBram Moolenaar let cmmnt= "" 1489964e468SBram Moolenaar endtry 1499964e468SBram Moolenaar" call Decho("curline <".curline.">") 1509964e468SBram Moolenaar" call Decho("parsepat<".parsepat.">") 1519964e468SBram Moolenaar" call Decho("scriptid<".scriptid.">") 1529964e468SBram Moolenaar" call Decho("srcid <".srcid.">") 1539964e468SBram Moolenaar" call Decho("fname <".fname.">") 1549964e468SBram Moolenaar endif 1559964e468SBram Moolenaar 1569964e468SBram Moolenaar if scriptid == 0 || srcid == 0 1579964e468SBram Moolenaar " When looking for :AutoInstall: lines, skip scripts that 1589964e468SBram Moolenaar " have 0 0 scriptname 1599964e468SBram Moolenaar" call Dret("GetOneScript : skipping a scriptid==srcid==0 line") 1609964e468SBram Moolenaar return 1619964e468SBram Moolenaar endif 1629964e468SBram Moolenaar 1639964e468SBram Moolenaar let doautoinstall= 0 1649964e468SBram Moolenaar if fname =~ ":AutoInstall:" 1659964e468SBram Moolenaar" call Decho("fname<".fname."> has :AutoInstall:...") 1669964e468SBram Moolenaar let aicmmnt= substitute(fname,'\s\+:AutoInstall:\s\+',' ','') 1679964e468SBram Moolenaar" call Decho("aicmmnt<".aicmmnt."> s:autoinstall=".s:autoinstall) 1689964e468SBram Moolenaar if s:autoinstall != "" 1699964e468SBram Moolenaar let doautoinstall = g:GetLatestVimScripts_allowautoinstall 1709964e468SBram Moolenaar endif 1719964e468SBram Moolenaar else 1729964e468SBram Moolenaar let aicmmnt= fname 1739964e468SBram Moolenaar endif 1749964e468SBram Moolenaar" call Decho("aicmmnt<".aicmmnt.">: doautoinstall=".doautoinstall) 1759964e468SBram Moolenaar 1769964e468SBram Moolenaar exe "norm z\<CR>" 1779964e468SBram Moolenaar redraw! 1789964e468SBram Moolenaar" call Decho('considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid) 1799964e468SBram Moolenaar echomsg 'considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid 1809964e468SBram Moolenaar 1819964e468SBram Moolenaar " grab a copy of the plugin's vim.sf.net webpage 1829964e468SBram Moolenaar let scriptaddr = 'http://vim.sf.net/script.php?script_id='.scriptid 1839964e468SBram Moolenaar let tmpfile = tempname() 1849964e468SBram Moolenaar let v:errmsg = "" 1859964e468SBram Moolenaar 186*9e368dbaSBram Moolenaar " make up to three tries at downloading the description 1879964e468SBram Moolenaar let itry= 1 1889964e468SBram Moolenaar while itry <= 3 1899964e468SBram Moolenaar" call Decho("try#".itry." to download description of <".aicmmnt."> with addr=".scriptaddr) 1909964e468SBram Moolenaar if has("win32") || has("win16") || has("win95") 1919964e468SBram Moolenaar" call Decho("silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile.' "'.scriptaddr.'"') 1929964e468SBram Moolenaar exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile.' "'.scriptaddr.'"' 1939964e468SBram Moolenaar else 1949964e468SBram Moolenaar" call Decho("silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile." '".scriptaddr."'") 1959964e468SBram Moolenaar exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile." '".scriptaddr."'" 1969964e468SBram Moolenaar endif 1979964e468SBram Moolenaar if itry == 1 1989964e468SBram Moolenaar exe "silent vsplit ".tmpfile 1999964e468SBram Moolenaar else 2009964e468SBram Moolenaar silent! e % 2019964e468SBram Moolenaar endif 2029964e468SBram Moolenaar 2039964e468SBram Moolenaar " find the latest source-id in the plugin's webpage 2049964e468SBram Moolenaar silent! 1 2059964e468SBram Moolenaar let findpkg= search('Click on the package to download','W') 2069964e468SBram Moolenaar if findpkg > 0 2079964e468SBram Moolenaar break 2089964e468SBram Moolenaar endif 2099964e468SBram Moolenaar let itry= itry + 1 2109964e468SBram Moolenaar endwhile 2119964e468SBram Moolenaar" call Decho(" --- end downloading tries while loop --- itry=".itry) 2129964e468SBram Moolenaar 213*9e368dbaSBram Moolenaar " testing: did finding "Click on the package..." fail? 2149964e468SBram Moolenaar if findpkg == 0 || itry >= 4 2159964e468SBram Moolenaar silent q! 2169964e468SBram Moolenaar call delete(tmpfile) 2179964e468SBram Moolenaar " restore options 2189964e468SBram Moolenaar let &t_ti = t_ti 2199964e468SBram Moolenaar let &t_te = t_te 2209964e468SBram Moolenaar let &rs = rs 2219964e468SBram Moolenaar let s:downerrors = s:downerrors + 1 2229964e468SBram Moolenaar" call Decho("***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">") 2239964e468SBram Moolenaar echomsg "***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">" 2249964e468SBram Moolenaar" call Dret("GetOneScript : srch for /Click on the package/ failed") 2259964e468SBram Moolenaar return 2269964e468SBram Moolenaar endif 2279964e468SBram Moolenaar" call Decho('found "Click on the package to download"') 2289964e468SBram Moolenaar 2299964e468SBram Moolenaar let findsrcid= search('src_id=','W') 2309964e468SBram Moolenaar if findsrcid == 0 2319964e468SBram Moolenaar silent q! 2329964e468SBram Moolenaar call delete(tmpfile) 2339964e468SBram Moolenaar " restore options 2349964e468SBram Moolenaar let &t_ti = t_ti 2359964e468SBram Moolenaar let &t_te = t_te 2369964e468SBram Moolenaar let &rs = rs 2379964e468SBram Moolenaar let s:downerrors = s:downerrors + 1 2389964e468SBram Moolenaar" call Decho("***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">") 2399964e468SBram Moolenaar echomsg "***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">" 2409964e468SBram Moolenaar" call Dret("GetOneScript : srch for /src_id/ failed") 2419964e468SBram Moolenaar return 2429964e468SBram Moolenaar endif 2439964e468SBram Moolenaar" call Decho('found "src_id=" in description page') 2449964e468SBram Moolenaar 2459964e468SBram Moolenaar let srcidpat = '^\s*<td class.*src_id=\(\d\+\)">\([^<]\+\)<.*$' 2469964e468SBram Moolenaar let latestsrcid= substitute(getline("."),srcidpat,'\1','') 247*9e368dbaSBram Moolenaar let sname = substitute(getline("."),srcidpat,'\2','') " script name actually downloaded 248*9e368dbaSBram Moolenaar" call Decho("srcidpat<".srcidpat."> latestsrcid<".latestsrcid."> sname<".sname.">") 2499964e468SBram Moolenaar silent q! 2509964e468SBram Moolenaar call delete(tmpfile) 2519964e468SBram Moolenaar 2529964e468SBram Moolenaar " convert the strings-of-numbers into numbers 2539964e468SBram Moolenaar let srcid = srcid + 0 2549964e468SBram Moolenaar let latestsrcid = latestsrcid + 0 255*9e368dbaSBram Moolenaar" call Decho("srcid=".srcid." latestsrcid=".latestsrcid." sname<".sname.">") 2569964e468SBram Moolenaar 2579964e468SBram Moolenaar " has the plugin's most-recent srcid increased, which indicates 2589964e468SBram Moolenaar " that it has been updated 2599964e468SBram Moolenaar if latestsrcid > srcid 260*9e368dbaSBram Moolenaar" call Decho("[latestsrcid=".latestsrcid."] <= [srcid=".srcid."]: need to update <".sname.">") 261*9e368dbaSBram Moolenaar 2629964e468SBram Moolenaar let s:downloads= s:downloads + 1 263*9e368dbaSBram Moolenaar if sname == bufname("%") 2649964e468SBram Moolenaar " GetLatestVimScript has to be careful about downloading itself 265*9e368dbaSBram Moolenaar let sname= "NEW_".sname 2669964e468SBram Moolenaar endif 2679964e468SBram Moolenaar 2689964e468SBram Moolenaar " the plugin has been updated since we last obtained it, so download a new copy 269*9e368dbaSBram Moolenaar" call Decho("...downloading new <".sname.">") 270*9e368dbaSBram Moolenaar echomsg "...downloading new <".sname.">" 2719964e468SBram Moolenaar if has("win32") || has("gui_win32") || has("gui_win32s") || has("win16") || has("win64") || has("win32unix") || has("win95") 272*9e368dbaSBram Moolenaar" call Decho("windows: silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".sname.' "'.'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid.'"') 273*9e368dbaSBram Moolenaar exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".sname.' "'.'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid.'"' 2749964e468SBram Moolenaar else 275*9e368dbaSBram Moolenaar" call Decho("unix: silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".sname." '".'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid."'") 276*9e368dbaSBram Moolenaar exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".sname." '".'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid."'" 2779964e468SBram Moolenaar endif 2789964e468SBram Moolenaar 2799964e468SBram Moolenaar " AutoInstall: only if doautoinstall is so indicating 2809964e468SBram Moolenaar if doautoinstall 281*9e368dbaSBram Moolenaar" call Decho("attempting to do autoinstall: getcwd<".getcwd()."> filereadable(".sname.")=".filereadable(sname)) 282*9e368dbaSBram Moolenaar if filereadable(sname) 283*9e368dbaSBram Moolenaar" call Decho("move <".sname."> to ".s:autoinstall) 284*9e368dbaSBram Moolenaar exe "silent !".g:GetLatestVimScripts_mv." ".sname." ".s:autoinstall 2859964e468SBram Moolenaar let curdir= escape(substitute(getcwd(),'\','/','ge'),"|[]*'\" #") 28682038d73SBram Moolenaar" call Decho("exe cd ".s:autoinstall) 2879964e468SBram Moolenaar exe "cd ".s:autoinstall 28882038d73SBram Moolenaar 28982038d73SBram Moolenaar " decompress 290*9e368dbaSBram Moolenaar if sname =~ '\.bz2$' 291*9e368dbaSBram Moolenaar" call Decho("decompress: attempt to bunzip2 ".sname) 292*9e368dbaSBram Moolenaar exe "silent !bunzip2 ".sname 293*9e368dbaSBram Moolenaar let sname= substitute(sname,'\.bz2$','','') 294*9e368dbaSBram Moolenaar" call Decho("decompress: new sname<".sname."> after bunzip2") 295*9e368dbaSBram Moolenaar elseif sname =~ '\.gz$' 296*9e368dbaSBram Moolenaar" call Decho("decompress: attempt to gunzip ".sname) 297*9e368dbaSBram Moolenaar exe "silent !gunzip ".sname 298*9e368dbaSBram Moolenaar let sname= substitute(sname,'\.gz$','','') 299*9e368dbaSBram Moolenaar" call Decho("decompress: new sname<".sname."> after gunzip") 3009964e468SBram Moolenaar endif 30182038d73SBram Moolenaar 30282038d73SBram Moolenaar " distribute archive(.zip, .tar, .vba) contents 303*9e368dbaSBram Moolenaar if sname =~ '\.zip$' 304*9e368dbaSBram Moolenaar" call Decho("dearchive: attempt to unzip ".sname) 305*9e368dbaSBram Moolenaar exe "silent !unzip -o ".sname 306*9e368dbaSBram Moolenaar elseif sname =~ '\.tar$' 307*9e368dbaSBram Moolenaar" call Decho("dearchive: attempt to untar ".sname) 308*9e368dbaSBram Moolenaar exe "silent !tar -xvf ".sname 309*9e368dbaSBram Moolenaar elseif sname =~ '\.vba$' 310*9e368dbaSBram Moolenaar" call Decho("dearchive: attempt to handle a vimball: ".sname) 311*9e368dbaSBram Moolenaar silent 1split 312*9e368dbaSBram Moolenaar exe "silent e ".sname 313*9e368dbaSBram Moolenaar silent so % 314*9e368dbaSBram Moolenaar silent q 3159964e468SBram Moolenaar endif 31682038d73SBram Moolenaar 317*9e368dbaSBram Moolenaar if sname =~ '.vim$' 318*9e368dbaSBram Moolenaar" call Decho("dearchive: attempt to simply move ".sname." to plugin") 319*9e368dbaSBram Moolenaar exe "silent !".g:GetLatestVimScripts_mv." ".sname." plugin" 3209964e468SBram Moolenaar endif 32182038d73SBram Moolenaar 32282038d73SBram Moolenaar " helptags step 3239964e468SBram Moolenaar let docdir= substitute(&rtp,',.*','','e')."/doc" 324*9e368dbaSBram Moolenaar" call Decho("helptags: docdir<".docdir.">") 3259964e468SBram Moolenaar exe "helptags ".docdir 3269964e468SBram Moolenaar exe "cd ".curdir 3279964e468SBram Moolenaar endif 328*9e368dbaSBram Moolenaar if fname !~ ':AutoInstall:' 329*9e368dbaSBram Moolenaar let modline=scriptid." ".latestsrcid." :AutoInstall: ".fname.cmmnt 330*9e368dbaSBram Moolenaar else 331*9e368dbaSBram Moolenaar let modline=scriptid." ".latestsrcid." ".fname.cmmnt 332*9e368dbaSBram Moolenaar endif 333*9e368dbaSBram Moolenaar else 334*9e368dbaSBram Moolenaar let modline=scriptid." ".latestsrcid." ".fname.cmmnt 3359964e468SBram Moolenaar endif 3369964e468SBram Moolenaar 3379964e468SBram Moolenaar " update the data in the <GetLatestVimScripts.dat> file 3389964e468SBram Moolenaar call setline(line("."),modline) 33982038d73SBram Moolenaar" call Decho("update data in ".expand("%")."#".line(".").": modline<".modline.">") 340*9e368dbaSBram Moolenaar" else " Decho 341*9e368dbaSBram Moolenaar" call Decho("[latestsrcid=".latestsrcid."] <= [srcid=".srcid."], no need to update") 3429964e468SBram Moolenaar endif 3439964e468SBram Moolenaar 3449964e468SBram Moolenaar " restore options 3459964e468SBram Moolenaar let &t_ti= t_ti 3469964e468SBram Moolenaar let &t_te= t_te 3479964e468SBram Moolenaar let &rs = rs 3489964e468SBram Moolenaar 3499964e468SBram Moolenaar" call Dret("GetOneScript") 3509964e468SBram Moolenaarendfun 3519964e468SBram Moolenaar 3529964e468SBram Moolenaar" --------------------------------------------------------------------- 3539964e468SBram Moolenaar" GetLatestVimScripts: this function gets the latest versions of {{{1 3549964e468SBram Moolenaar" scripts based on the list in 3559964e468SBram Moolenaar" (first dir in runtimepath)/GetLatest/GetLatestVimScripts.dat 3569964e468SBram Moolenaarfun! getscript#GetLatestVimScripts() 3579964e468SBram Moolenaar" call Dfunc("GetLatestVimScripts() autoinstall<".s:autoinstall.">") 3589964e468SBram Moolenaar 3599964e468SBram Moolenaar" insure that wget is executable 3609964e468SBram Moolenaar if executable(g:GetLatestVimScripts_wget) != 1 3619964e468SBram Moolenaar echoerr "GetLatestVimScripts needs ".g:GetLatestVimScripts_wget." which apparently is not available on your system" 3629964e468SBram Moolenaar" call Dret("GetLatestVimScripts : wget not executable/availble") 3639964e468SBram Moolenaar return 3649964e468SBram Moolenaar endif 3659964e468SBram Moolenaar 3669964e468SBram Moolenaar " Find the .../GetLatest subdirectory under the runtimepath 3679964e468SBram Moolenaar for datadir in split(&rtp,',') + [''] 3689964e468SBram Moolenaar if isdirectory(datadir."/GetLatest") 3699964e468SBram Moolenaar" call Decho("found directory<".datadir.">") 3709964e468SBram Moolenaar let datadir= datadir . "/GetLatest" 3719964e468SBram Moolenaar break 3729964e468SBram Moolenaar endif 3739964e468SBram Moolenaar if filereadable(datadir."GetLatestVimScripts.dat") 3749964e468SBram Moolenaar" call Decho("found ".datadir."/GetLatestVimScripts.dat") 3759964e468SBram Moolenaar break 3769964e468SBram Moolenaar endif 3779964e468SBram Moolenaar endfor 37882038d73SBram Moolenaar 3799964e468SBram Moolenaar " Sanity checks: readability and writability 3809964e468SBram Moolenaar if datadir == "" 3819964e468SBram Moolenaar echoerr 'Missing "GetLatest/" on your runtimepath - see :help glvs-dist-install' 3829964e468SBram Moolenaar" call Dret("GetLatestVimScripts : unable to find a GetLatest subdirectory") 3839964e468SBram Moolenaar return 3849964e468SBram Moolenaar endif 3859964e468SBram Moolenaar 3869964e468SBram Moolenaar if filewritable(datadir) != 2 3879964e468SBram Moolenaar echoerr "(getLatestVimScripts) Your ".datadir." isn't writable" 3889964e468SBram Moolenaar" call Dret("GetLatestVimScripts : non-writable directory<".datadir.">") 3899964e468SBram Moolenaar return 3909964e468SBram Moolenaar endif 3919964e468SBram Moolenaar let datafile= datadir."/GetLatestVimScripts.dat" 3929964e468SBram Moolenaar if !filereadable(datafile) 3939964e468SBram Moolenaar echoerr "Your data file<".datafile."> isn't readable" 3949964e468SBram Moolenaar" call Dret("GetLatestVimScripts : non-readable datafile<".datafile.">") 3959964e468SBram Moolenaar return 3969964e468SBram Moolenaar endif 3979964e468SBram Moolenaar if !filewritable(datafile) 3989964e468SBram Moolenaar echoerr "Your data file<".datafile."> isn't writable" 3999964e468SBram Moolenaar" call Dret("GetLatestVimScripts : non-writable datafile<".datafile.">") 4009964e468SBram Moolenaar return 4019964e468SBram Moolenaar endif 4029964e468SBram Moolenaar" call Decho("datadir <".datadir.">") 4039964e468SBram Moolenaar" call Decho("datafile <".datafile.">") 4049964e468SBram Moolenaar 4059964e468SBram Moolenaar " don't let any events interfere (like winmanager's, taglist's, etc) 4069964e468SBram Moolenaar let eikeep= &ei 4079964e468SBram Moolenaar set ei=all 4089964e468SBram Moolenaar 4099964e468SBram Moolenaar " record current directory, change to datadir, open split window with 4109964e468SBram Moolenaar " datafile 4119964e468SBram Moolenaar let origdir= getcwd() 4129964e468SBram Moolenaar exe "cd ".escape(substitute(datadir,'\','/','ge'),"|[]*'\" #") 4139964e468SBram Moolenaar split 4149964e468SBram Moolenaar exe "e ".escape(substitute(datafile,'\','/','ge'),"|[]*'\" #") 4159964e468SBram Moolenaar res 1000 4169964e468SBram Moolenaar let s:downloads = 0 4179964e468SBram Moolenaar let s:downerrors= 0 4189964e468SBram Moolenaar 4199964e468SBram Moolenaar " Check on dependencies mentioned in plugins 4209964e468SBram Moolenaar" call Decho(" ") 4219964e468SBram Moolenaar" call Decho("searching plugins for GetLatestVimScripts dependencies") 4229964e468SBram Moolenaar let lastline = line("$") 42382038d73SBram Moolenaar" call Decho("lastline#".lastline) 42482038d73SBram Moolenaar let plugins = split(globpath(&rtp,"plugin/*.vim")) 4259964e468SBram Moolenaar let foundscript = 0 42682038d73SBram Moolenaar let firstdir= "" 4279964e468SBram Moolenaar 42882038d73SBram Moolenaar for plugin in plugins 42982038d73SBram Moolenaar 43082038d73SBram Moolenaar " don't process plugins in system directories 43182038d73SBram Moolenaar if firstdir == "" 43282038d73SBram Moolenaar let firstdir= substitute(plugin,'[/\\][^/\\]\+$','','') 43382038d73SBram Moolenaar" call Decho("firstdir<".firstdir.">") 43482038d73SBram Moolenaar else 43582038d73SBram Moolenaar let curdir= substitute(plugin,'[/\\][^/\\]\+$','','') 43682038d73SBram Moolenaar" call Decho("curdir<".curdir.">") 43782038d73SBram Moolenaar if curdir != firstdir 43882038d73SBram Moolenaar break 43982038d73SBram Moolenaar endif 44082038d73SBram Moolenaar endif 44182038d73SBram Moolenaar 44282038d73SBram Moolenaar " read plugin in 4439964e468SBram Moolenaar $ 44482038d73SBram Moolenaar" call Decho(" ") 4459964e468SBram Moolenaar" call Decho(".dependency checking<".plugin."> line$=".line("$")) 4469964e468SBram Moolenaar exe "silent r ".plugin 44782038d73SBram Moolenaar 4489964e468SBram Moolenaar while search('^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+','W') != 0 4499964e468SBram Moolenaar let newscript= substitute(getline("."),'^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+\s\+\(.*\)$','\1','e') 4509964e468SBram Moolenaar let llp1 = lastline+1 45182038d73SBram Moolenaar" call Decho("..newscript<".newscript.">") 4529964e468SBram Moolenaar 45382038d73SBram Moolenaar " don't process ""GetLatestVimScripts lines 4549964e468SBram Moolenaar if newscript !~ '^"' 4559964e468SBram Moolenaar " found a "GetLatestVimScripts: # #" line in the script; check if its already in the datafile 4569964e468SBram Moolenaar let curline = line(".") 4579964e468SBram Moolenaar let noai_script = substitute(newscript,'\s*:AutoInstall:\s*','','e') 4589964e468SBram Moolenaar exe llp1 4599964e468SBram Moolenaar let srchline = search('\<'.noai_script.'\>','bW') 46082038d73SBram Moolenaar" call Decho("..noai_script<".noai_script."> srch=".srchline."curline#".line(".")." lastline#".lastline) 4619964e468SBram Moolenaar 4629964e468SBram Moolenaar if srchline == 0 4639964e468SBram Moolenaar " found a new script to permanently include in the datafile 4649964e468SBram Moolenaar let keep_rega = @a 4659964e468SBram Moolenaar let @a = substitute(getline(curline),'^"\s\+GetLatestVimScripts:\s\+','','') 4669964e468SBram Moolenaar exe lastline."put a" 4679964e468SBram Moolenaar echomsg "Appending <".@a."> to ".datafile." for ".newscript 4689964e468SBram Moolenaar" call Decho("..APPEND (".noai_script.")<".@a."> to GetLatestVimScripts.dat") 4699964e468SBram Moolenaar let @a = keep_rega 4709964e468SBram Moolenaar let lastline = llp1 4719964e468SBram Moolenaar let curline = curline + 1 4729964e468SBram Moolenaar let foundscript = foundscript + 1 4739964e468SBram Moolenaar" else " Decho 4749964e468SBram Moolenaar" call Decho("..found <".noai_script."> (already in datafile at line#".srchline.")") 4759964e468SBram Moolenaar endif 4769964e468SBram Moolenaar 4779964e468SBram Moolenaar let curline = curline + 1 4789964e468SBram Moolenaar exe curline 4799964e468SBram Moolenaar endif 4809964e468SBram Moolenaar endwhile 48182038d73SBram Moolenaar 4829964e468SBram Moolenaar let llp1= lastline + 1 4839964e468SBram Moolenaar" call Decho(".deleting lines: ".llp1.",$d") 4849964e468SBram Moolenaar exe "silent! ".llp1.",$d" 48582038d73SBram Moolenaar endfor 48682038d73SBram Moolenaar" call Decho("--- end dependency checking loop --- foundscript=".foundscript) 48782038d73SBram Moolenaar" call Decho(" ") 4889964e468SBram Moolenaar 4899964e468SBram Moolenaar if foundscript == 0 4909964e468SBram Moolenaar set nomod 4919964e468SBram Moolenaar endif 4929964e468SBram Moolenaar 4939964e468SBram Moolenaar " Check on out-of-date scripts using GetLatest/GetLatestVimScripts.dat 49482038d73SBram Moolenaar" call Decho("begin: checking out-of-date scripts using datafile<".datafile.">") 4959964e468SBram Moolenaar set lz 4969964e468SBram Moolenaar 1 49782038d73SBram Moolenaar" /^-----/,$g/^\s*\d/call Decho(getline(".")) 49882038d73SBram Moolenaar 1 49982038d73SBram Moolenaar /^-----/,$g/^\s*\d/call s:GetOneScript() 50082038d73SBram Moolenaar" call Decho("--- end out-of-date checking --- ") 5019964e468SBram Moolenaar 5029964e468SBram Moolenaar " Final report (an echomsg) 5039964e468SBram Moolenaar try 5049964e468SBram Moolenaar silent! ?^-------? 5059964e468SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E114/ 5069964e468SBram Moolenaar" call Dret("GetLatestVimScripts : nothing done!") 5079964e468SBram Moolenaar return 5089964e468SBram Moolenaar endtry 5099964e468SBram Moolenaar exe "norm! kz\<CR>" 5109964e468SBram Moolenaar redraw! 5119964e468SBram Moolenaar let s:msg = "" 5129964e468SBram Moolenaar if s:downloads == 1 5139964e468SBram Moolenaar let s:msg = "Downloaded one updated script to <".datadir.">" 5149964e468SBram Moolenaar elseif s:downloads == 2 5159964e468SBram Moolenaar let s:msg= "Downloaded two updated scripts to <".datadir.">" 5169964e468SBram Moolenaar elseif s:downloads > 1 5179964e468SBram Moolenaar let s:msg= "Downloaded ".s:downloads." updated scripts to <".datadir.">" 5189964e468SBram Moolenaar else 5199964e468SBram Moolenaar let s:msg= "Everything was already current" 5209964e468SBram Moolenaar endif 5219964e468SBram Moolenaar if s:downerrors > 0 5229964e468SBram Moolenaar let s:msg= s:msg." (".s:downerrors." downloading errors)" 5239964e468SBram Moolenaar endif 5249964e468SBram Moolenaar echomsg s:msg 5259964e468SBram Moolenaar " save the file 5269964e468SBram Moolenaar if &mod 5279964e468SBram Moolenaar silent! w! 5289964e468SBram Moolenaar endif 5299964e468SBram Moolenaar q 5309964e468SBram Moolenaar 5319964e468SBram Moolenaar " restore events and current directory 5329964e468SBram Moolenaar exe "cd ".escape(substitute(origdir,'\','/','ge'),"|[]*'\" #") 5339964e468SBram Moolenaar let &ei= eikeep 5349964e468SBram Moolenaar set nolz 5359964e468SBram Moolenaar" call Dret("GetLatestVimScripts : did ".s:downloads." downloads") 5369964e468SBram Moolenaarendfun 5379964e468SBram Moolenaar" --------------------------------------------------------------------- 5389964e468SBram Moolenaar 5399964e468SBram Moolenaar" Restore Options: {{{1 5409964e468SBram Moolenaarlet &cpo= s:keepcpo 5419964e468SBram Moolenaar 5429964e468SBram Moolenaar" vim: ts=8 sts=2 fdm=marker nowrap 543