19964e468SBram Moolenaar" --------------------------------------------------------------------- 29964e468SBram Moolenaar" getscript.vim 39964e468SBram Moolenaar" Author: Charles E. Campbell, Jr. 4*82038d73SBram Moolenaar" Date: May 05, 2007 5*82038d73SBram Moolenaar" Version: 25 69964e468SBram Moolenaar" Installing: :help glvs-install 79964e468SBram Moolenaar" Usage: :help glvs 89964e468SBram Moolenaar" 99964e468SBram Moolenaar" GetLatestVimScripts: 642 1 :AutoInstall: getscript.vim 109964e468SBram Moolenaar" --------------------------------------------------------------------- 119964e468SBram Moolenaar" Initialization: {{{1 129964e468SBram Moolenaar" if you're sourcing this file, surely you can't be 139964e468SBram Moolenaar" expecting vim to be in its vi-compatible mode 149964e468SBram Moolenaarif &cp 159964e468SBram Moolenaar echoerr "GetLatestVimScripts is not vi-compatible; not loaded (you need to set nocp)" 169964e468SBram Moolenaar finish 179964e468SBram Moolenaarendif 189964e468SBram Moolenaarlet s:keepcpo = &cpo 199964e468SBram Moolenaarset cpo&vim 20*82038d73SBram Moolenaar"DechoTabOn 219964e468SBram Moolenaar 229964e468SBram Moolenaarif exists("g:loaded_getscript") 239964e468SBram Moolenaar finish 249964e468SBram Moolenaarendif 25*82038d73SBram Moolenaarlet g:loaded_getscript= "v25" 269964e468SBram Moolenaar 279964e468SBram Moolenaar" --------------------------------------------------------------------- 289964e468SBram Moolenaar" Global Variables: {{{1 299964e468SBram Moolenaar" allow user to change the command for obtaining scripts (does fetch work?) 309964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_wget") 319964e468SBram Moolenaar if executable("wget") 329964e468SBram Moolenaar let g:GetLatestVimScripts_wget= "wget" 339964e468SBram Moolenaar elseif executable("curl") 349964e468SBram Moolenaar let g:GetLatestVimScripts_wget= "curl" 359964e468SBram Moolenaar else 369964e468SBram Moolenaar let g:GetLatestVimScripts_wget = 'echo "GetLatestVimScripts needs wget or curl"' 379964e468SBram Moolenaar let g:GetLatestVimScripts_options = "" 389964e468SBram Moolenaar endif 399964e468SBram Moolenaarendif 409964e468SBram Moolenaar 419964e468SBram Moolenaar" options that wget and curl require: 429964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_options") 439964e468SBram Moolenaar if g:GetLatestVimScripts_wget == "wget" 449964e468SBram Moolenaar let g:GetLatestVimScripts_options= "-q -O" 459964e468SBram Moolenaar elseif g:GetLatestVimScripts_wget == "curl" 469964e468SBram Moolenaar let g:GetLatestVimScripts_options= "-s -O" 479964e468SBram Moolenaar else 489964e468SBram Moolenaar let g:GetLatestVimScripts_options= "" 499964e468SBram Moolenaar endif 509964e468SBram Moolenaarendif 519964e468SBram Moolenaar 529964e468SBram Moolenaar" by default, allow autoinstall lines to work 539964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_allowautoinstall") 549964e468SBram Moolenaar let g:GetLatestVimScripts_allowautoinstall= 1 559964e468SBram Moolenaarendif 569964e468SBram Moolenaar 579964e468SBram Moolenaar"" For debugging: 589964e468SBram Moolenaar"let g:GetLatestVimScripts_wget = "echo" 599964e468SBram Moolenaar"let g:GetLatestVimScripts_options = "options" 609964e468SBram Moolenaar 619964e468SBram Moolenaar" --------------------------------------------------------------------- 629964e468SBram Moolenaar" Check If AutoInstall Capable: {{{1 639964e468SBram Moolenaarlet s:autoinstall= "" 649964e468SBram Moolenaarif g:GetLatestVimScripts_allowautoinstall 659964e468SBram Moolenaar 669964e468SBram Moolenaar if (has("win32") || has("gui_win32") || has("gui_win32s") || has("win16") || has("win64") || has("win32unix") || has("win95")) && &shell != "bash" 679964e468SBram Moolenaar " windows (but not cygwin/bash) 689964e468SBram Moolenaar let s:dotvim= "vimfiles" 699964e468SBram Moolenaar if !exists("g:GetLatestVimScripts_mv") 709964e468SBram Moolenaar let g:GetLatestVimScripts_mv= "ren" 719964e468SBram Moolenaar endif 729964e468SBram Moolenaar 739964e468SBram Moolenaar else 749964e468SBram Moolenaar " unix 759964e468SBram Moolenaar let s:dotvim= ".vim" 769964e468SBram Moolenaar if !exists("g:GetLatestVimScripts_mv") 779964e468SBram Moolenaar let g:GetLatestVimScripts_mv= "mv" 789964e468SBram Moolenaar endif 799964e468SBram Moolenaar endif 809964e468SBram Moolenaar 819964e468SBram Moolenaar if exists('$HOME') && isdirectory(expand("$HOME")."/".s:dotvim) 829964e468SBram Moolenaar let s:autoinstall= $HOME."/".s:dotvim 839964e468SBram Moolenaar endif 849964e468SBram Moolenaar" call Decho("s:autoinstall<".s:autoinstall.">") 859964e468SBram Moolenaar"else "Decho 869964e468SBram Moolenaar" call Decho("g:GetLatestVimScripts_allowautoinstall=".g:GetLatestVimScripts_allowautoinstall.": :AutoInstall: disabled") 879964e468SBram Moolenaarendif 889964e468SBram Moolenaar 899964e468SBram Moolenaar" --------------------------------------------------------------------- 909964e468SBram Moolenaar" Public Interface: {{{1 919964e468SBram Moolenaarcom! -nargs=0 GetLatestVimScripts call getscript#GetLatestVimScripts() 929964e468SBram Moolenaarcom! -nargs=0 GetScript call getscript#GetLatestVimScripts() 939964e468SBram Moolenaarsilent! com -nargs=0 GLVS call getscript#GetLatestVimScripts() 949964e468SBram Moolenaar 959964e468SBram Moolenaar" --------------------------------------------------------------------- 969964e468SBram Moolenaar" GetOneScript: (Get Latest Vim Script) this function operates {{{1 979964e468SBram Moolenaar" on the current line, interpreting two numbers and text as 989964e468SBram Moolenaar" ScriptID, SourceID, and Filename. 999964e468SBram Moolenaar" It downloads any scripts that have newer versions from vim.sf.net. 1009964e468SBram Moolenaarfun! s:GetOneScript(...) 1019964e468SBram Moolenaar" call Dfunc("GetOneScript()") 1029964e468SBram Moolenaar 1039964e468SBram Moolenaar " set options to allow progress to be shown on screen 1049964e468SBram Moolenaar let t_ti= &t_ti 1059964e468SBram Moolenaar let t_te= &t_te 1069964e468SBram Moolenaar let rs = &rs 1079964e468SBram Moolenaar set t_ti= t_te= nors 1089964e468SBram Moolenaar 1099964e468SBram Moolenaar " put current line on top-of-screen and interpret it into 1109964e468SBram Moolenaar " a script identifer : used to obtain webpage 1119964e468SBram Moolenaar " source identifier : used to identify current version 1129964e468SBram Moolenaar " and an associated comment: used to report on what's being considered 1139964e468SBram Moolenaar if a:0 >= 3 1149964e468SBram Moolenaar let scriptid = a:1 1159964e468SBram Moolenaar let srcid = a:2 1169964e468SBram Moolenaar let fname = a:3 1179964e468SBram Moolenaar let cmmnt = "" 1189964e468SBram Moolenaar" call Decho("scriptid<".scriptid.">") 1199964e468SBram Moolenaar" call Decho("srcid <".srcid.">") 1209964e468SBram Moolenaar" call Decho("fname <".fname.">") 1219964e468SBram Moolenaar else 1229964e468SBram Moolenaar let curline = getline(".") 1239964e468SBram Moolenaar if curline =~ '^\s*#' 1249964e468SBram Moolenaar" call Dret("GetOneScript : skipping a pure comment line") 1259964e468SBram Moolenaar return 1269964e468SBram Moolenaar endif 1279964e468SBram Moolenaar let parsepat = '^\s*\(\d\+\)\s\+\(\d\+\)\s\+\(.\{-}\)\(\s*#.*\)\=$' 1289964e468SBram Moolenaar try 1299964e468SBram Moolenaar let scriptid = substitute(curline,parsepat,'\1','e') 1309964e468SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 1319964e468SBram Moolenaar let scriptid= 0 1329964e468SBram Moolenaar endtry 1339964e468SBram Moolenaar try 1349964e468SBram Moolenaar let srcid = substitute(curline,parsepat,'\2','e') 1359964e468SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 1369964e468SBram Moolenaar let srcid= 0 1379964e468SBram Moolenaar endtry 1389964e468SBram Moolenaar try 1399964e468SBram Moolenaar let fname= substitute(curline,parsepat,'\3','e') 1409964e468SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 1419964e468SBram Moolenaar let fname= "" 1429964e468SBram Moolenaar endtry 1439964e468SBram Moolenaar try 1449964e468SBram Moolenaar let cmmnt= substitute(curline,parsepat,'\4','e') 1459964e468SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 1469964e468SBram Moolenaar let cmmnt= "" 1479964e468SBram Moolenaar endtry 1489964e468SBram Moolenaar" call Decho("curline <".curline.">") 1499964e468SBram Moolenaar" call Decho("parsepat<".parsepat.">") 1509964e468SBram Moolenaar" call Decho("scriptid<".scriptid.">") 1519964e468SBram Moolenaar" call Decho("srcid <".srcid.">") 1529964e468SBram Moolenaar" call Decho("fname <".fname.">") 1539964e468SBram Moolenaar endif 1549964e468SBram Moolenaar 1559964e468SBram Moolenaar if scriptid == 0 || srcid == 0 1569964e468SBram Moolenaar " When looking for :AutoInstall: lines, skip scripts that 1579964e468SBram Moolenaar " have 0 0 scriptname 1589964e468SBram Moolenaar" call Dret("GetOneScript : skipping a scriptid==srcid==0 line") 1599964e468SBram Moolenaar return 1609964e468SBram Moolenaar endif 1619964e468SBram Moolenaar 1629964e468SBram Moolenaar let doautoinstall= 0 1639964e468SBram Moolenaar if fname =~ ":AutoInstall:" 1649964e468SBram Moolenaar" call Decho("fname<".fname."> has :AutoInstall:...") 1659964e468SBram Moolenaar let aicmmnt= substitute(fname,'\s\+:AutoInstall:\s\+',' ','') 1669964e468SBram Moolenaar" call Decho("aicmmnt<".aicmmnt."> s:autoinstall=".s:autoinstall) 1679964e468SBram Moolenaar if s:autoinstall != "" 1689964e468SBram Moolenaar let doautoinstall = g:GetLatestVimScripts_allowautoinstall 1699964e468SBram Moolenaar endif 1709964e468SBram Moolenaar else 1719964e468SBram Moolenaar let aicmmnt= fname 1729964e468SBram Moolenaar endif 1739964e468SBram Moolenaar" call Decho("aicmmnt<".aicmmnt.">: doautoinstall=".doautoinstall) 1749964e468SBram Moolenaar 1759964e468SBram Moolenaar exe "norm z\<CR>" 1769964e468SBram Moolenaar redraw! 1779964e468SBram Moolenaar" call Decho('considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid) 1789964e468SBram Moolenaar echomsg 'considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid 1799964e468SBram Moolenaar 1809964e468SBram Moolenaar " grab a copy of the plugin's vim.sf.net webpage 1819964e468SBram Moolenaar let scriptaddr = 'http://vim.sf.net/script.php?script_id='.scriptid 1829964e468SBram Moolenaar let tmpfile = tempname() 1839964e468SBram Moolenaar let v:errmsg = "" 1849964e468SBram Moolenaar 1859964e468SBram Moolenaar " make three tries at downloading the description 1869964e468SBram Moolenaar let itry= 1 1879964e468SBram Moolenaar while itry <= 3 1889964e468SBram Moolenaar" call Decho("try#".itry." to download description of <".aicmmnt."> with addr=".scriptaddr) 1899964e468SBram Moolenaar if has("win32") || has("win16") || has("win95") 1909964e468SBram Moolenaar" call Decho("silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile.' "'.scriptaddr.'"') 1919964e468SBram Moolenaar exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile.' "'.scriptaddr.'"' 1929964e468SBram Moolenaar else 1939964e468SBram Moolenaar" call Decho("silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile." '".scriptaddr."'") 1949964e468SBram Moolenaar exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".tmpfile." '".scriptaddr."'" 1959964e468SBram Moolenaar endif 1969964e468SBram Moolenaar if itry == 1 1979964e468SBram Moolenaar exe "silent vsplit ".tmpfile 1989964e468SBram Moolenaar else 1999964e468SBram Moolenaar silent! e % 2009964e468SBram Moolenaar endif 2019964e468SBram Moolenaar 2029964e468SBram Moolenaar " find the latest source-id in the plugin's webpage 2039964e468SBram Moolenaar silent! 1 2049964e468SBram Moolenaar let findpkg= search('Click on the package to download','W') 2059964e468SBram Moolenaar if findpkg > 0 2069964e468SBram Moolenaar break 2079964e468SBram Moolenaar endif 2089964e468SBram Moolenaar let itry= itry + 1 2099964e468SBram Moolenaar endwhile 2109964e468SBram Moolenaar" call Decho(" --- end downloading tries while loop --- itry=".itry) 2119964e468SBram Moolenaar 2129964e468SBram Moolenaar " testing: did finding /Click on the package.../ fail? 2139964e468SBram Moolenaar if findpkg == 0 || itry >= 4 2149964e468SBram Moolenaar silent q! 2159964e468SBram Moolenaar call delete(tmpfile) 2169964e468SBram Moolenaar " restore options 2179964e468SBram Moolenaar let &t_ti = t_ti 2189964e468SBram Moolenaar let &t_te = t_te 2199964e468SBram Moolenaar let &rs = rs 2209964e468SBram Moolenaar let s:downerrors = s:downerrors + 1 2219964e468SBram Moolenaar" call Decho("***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">") 2229964e468SBram Moolenaar echomsg "***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">" 2239964e468SBram Moolenaar" call Dret("GetOneScript : srch for /Click on the package/ failed") 2249964e468SBram Moolenaar return 2259964e468SBram Moolenaar endif 2269964e468SBram Moolenaar" call Decho('found "Click on the package to download"') 2279964e468SBram Moolenaar 2289964e468SBram Moolenaar let findsrcid= search('src_id=','W') 2299964e468SBram Moolenaar if findsrcid == 0 2309964e468SBram Moolenaar silent q! 2319964e468SBram Moolenaar call delete(tmpfile) 2329964e468SBram Moolenaar " restore options 2339964e468SBram Moolenaar let &t_ti = t_ti 2349964e468SBram Moolenaar let &t_te = t_te 2359964e468SBram Moolenaar let &rs = rs 2369964e468SBram Moolenaar let s:downerrors = s:downerrors + 1 2379964e468SBram Moolenaar" call Decho("***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">") 2389964e468SBram Moolenaar echomsg "***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">" 2399964e468SBram Moolenaar" call Dret("GetOneScript : srch for /src_id/ failed") 2409964e468SBram Moolenaar return 2419964e468SBram Moolenaar endif 2429964e468SBram Moolenaar" call Decho('found "src_id=" in description page') 2439964e468SBram Moolenaar 2449964e468SBram Moolenaar let srcidpat = '^\s*<td class.*src_id=\(\d\+\)">\([^<]\+\)<.*$' 2459964e468SBram Moolenaar let latestsrcid= substitute(getline("."),srcidpat,'\1','') 2469964e468SBram Moolenaar let fname = substitute(getline("."),srcidpat,'\2','') 2479964e468SBram Moolenaar" call Decho("srcidpat<".srcidpat."> latestsrcid<".latestsrcid."> fname<".fname.">") 2489964e468SBram Moolenaar silent q! 2499964e468SBram Moolenaar call delete(tmpfile) 2509964e468SBram Moolenaar 2519964e468SBram Moolenaar " convert the strings-of-numbers into numbers 2529964e468SBram Moolenaar let srcid = srcid + 0 2539964e468SBram Moolenaar let latestsrcid = latestsrcid + 0 2549964e468SBram Moolenaar" call Decho("srcid=".srcid." latestsrcid=".latestsrcid." fname<".fname.">") 2559964e468SBram Moolenaar 2569964e468SBram Moolenaar " has the plugin's most-recent srcid increased, which indicates 2579964e468SBram Moolenaar " that it has been updated 2589964e468SBram Moolenaar if latestsrcid > srcid 2599964e468SBram Moolenaar let s:downloads= s:downloads + 1 2609964e468SBram Moolenaar if fname == bufname("%") 2619964e468SBram Moolenaar " GetLatestVimScript has to be careful about downloading itself 2629964e468SBram Moolenaar let fname= "NEW_".fname 2639964e468SBram Moolenaar endif 2649964e468SBram Moolenaar 2659964e468SBram Moolenaar " the plugin has been updated since we last obtained it, so download a new copy 2669964e468SBram Moolenaar" call Decho("...downloading new <".fname.">") 2679964e468SBram Moolenaar echomsg "...downloading new <".fname.">" 2689964e468SBram Moolenaar if has("win32") || has("gui_win32") || has("gui_win32s") || has("win16") || has("win64") || has("win32unix") || has("win95") 2699964e468SBram Moolenaar" call Decho("windows: silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".fname.' "'.'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid.'"') 2709964e468SBram Moolenaar exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".fname.' "'.'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid.'"' 2719964e468SBram Moolenaar else 2729964e468SBram Moolenaar" call Decho("unix: silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".fname." '".'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid."'") 2739964e468SBram Moolenaar exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".fname." '".'http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid."'" 2749964e468SBram Moolenaar endif 2759964e468SBram Moolenaar 2769964e468SBram Moolenaar " AutoInstall: only if doautoinstall is so indicating 2779964e468SBram Moolenaar if doautoinstall 2789964e468SBram Moolenaar" call Decho("attempting to do autoinstall: getcwd<".getcwd()."> filereadable(".fname.")=".filereadable(fname)) 2799964e468SBram Moolenaar if filereadable(fname) 2809964e468SBram Moolenaar" call Decho("move <".fname."> to ".s:autoinstall) 2819964e468SBram Moolenaar exe "silent !".g:GetLatestVimScripts_mv." ".fname." ".s:autoinstall 2829964e468SBram Moolenaar let curdir= escape(substitute(getcwd(),'\','/','ge'),"|[]*'\" #") 283*82038d73SBram Moolenaar" call Decho("exe cd ".s:autoinstall) 2849964e468SBram Moolenaar exe "cd ".s:autoinstall 285*82038d73SBram Moolenaar 286*82038d73SBram Moolenaar " decompress 2879964e468SBram Moolenaar if fname =~ '\.bz2$' 2889964e468SBram Moolenaar" call Decho("attempt to bunzip2 ".fname) 2899964e468SBram Moolenaar exe "silent !bunzip2 ".fname 2909964e468SBram Moolenaar let fname= substitute(fname,'\.bz2$','','') 291*82038d73SBram Moolenaar" call Decho("new fname<".fname."> after bunzip2") 2929964e468SBram Moolenaar elseif fname =~ '\.gz$' 2939964e468SBram Moolenaar" call Decho("attempt to gunzip ".fname) 2949964e468SBram Moolenaar exe "silent !gunzip ".fname 2959964e468SBram Moolenaar let fname= substitute(fname,'\.gz$','','') 296*82038d73SBram Moolenaar" call Decho("new fname<".fname."> after gunzip") 2979964e468SBram Moolenaar endif 298*82038d73SBram Moolenaar 299*82038d73SBram Moolenaar " distribute archive(.zip, .tar, .vba) contents 3009964e468SBram Moolenaar if fname =~ '\.zip$' 3019964e468SBram Moolenaar" call Decho("attempt to unzip ".fname) 3029964e468SBram Moolenaar exe "silent !unzip -o ".fname 3039964e468SBram Moolenaar elseif fname =~ '\.tar$' 3049964e468SBram Moolenaar" call Decho("attempt to untar ".fname) 3059964e468SBram Moolenaar exe "silent !tar -xvf ".fname 3069964e468SBram Moolenaar elseif fname =~ '\.vba$' 3079964e468SBram Moolenaar" call Decho("attempt to handle a vimball: ".fname) 3089964e468SBram Moolenaar 1split 3099964e468SBram Moolenaar exe "e ".fname 3109964e468SBram Moolenaar so % 3119964e468SBram Moolenaar q 3129964e468SBram Moolenaar endif 313*82038d73SBram Moolenaar 3149964e468SBram Moolenaar if fname =~ '.vim$' 3159964e468SBram Moolenaar" call Decho("attempt to simply move ".fname." to plugin") 3169964e468SBram Moolenaar exe "silent !".g:GetLatestVimScripts_mv." ".fname." plugin" 3179964e468SBram Moolenaar endif 318*82038d73SBram Moolenaar 319*82038d73SBram Moolenaar " helptags step 3209964e468SBram Moolenaar let docdir= substitute(&rtp,',.*','','e')."/doc" 3219964e468SBram Moolenaar" call Decho("helptags docdir<".docdir.">") 3229964e468SBram Moolenaar exe "helptags ".docdir 3239964e468SBram Moolenaar exe "cd ".curdir 3249964e468SBram Moolenaar endif 3259964e468SBram Moolenaar endif 3269964e468SBram Moolenaar 3279964e468SBram Moolenaar " update the data in the <GetLatestVimScripts.dat> file 3289964e468SBram Moolenaar let modline=scriptid." ".latestsrcid." ".fname.cmmnt 3299964e468SBram Moolenaar call setline(line("."),modline) 330*82038d73SBram Moolenaar" call Decho("update data in ".expand("%")."#".line(".").": modline<".modline.">") 3319964e468SBram Moolenaar endif 3329964e468SBram Moolenaar 3339964e468SBram Moolenaar " restore options 3349964e468SBram Moolenaar let &t_ti= t_ti 3359964e468SBram Moolenaar let &t_te= t_te 3369964e468SBram Moolenaar let &rs = rs 3379964e468SBram Moolenaar 3389964e468SBram Moolenaar" call Dret("GetOneScript") 3399964e468SBram Moolenaarendfun 3409964e468SBram Moolenaar 3419964e468SBram Moolenaar" --------------------------------------------------------------------- 3429964e468SBram Moolenaar" GetLatestVimScripts: this function gets the latest versions of {{{1 3439964e468SBram Moolenaar" scripts based on the list in 3449964e468SBram Moolenaar" (first dir in runtimepath)/GetLatest/GetLatestVimScripts.dat 3459964e468SBram Moolenaarfun! getscript#GetLatestVimScripts() 3469964e468SBram Moolenaar" call Dfunc("GetLatestVimScripts() autoinstall<".s:autoinstall.">") 3479964e468SBram Moolenaar 3489964e468SBram Moolenaar" insure that wget is executable 3499964e468SBram Moolenaar if executable(g:GetLatestVimScripts_wget) != 1 3509964e468SBram Moolenaar echoerr "GetLatestVimScripts needs ".g:GetLatestVimScripts_wget." which apparently is not available on your system" 3519964e468SBram Moolenaar" call Dret("GetLatestVimScripts : wget not executable/availble") 3529964e468SBram Moolenaar return 3539964e468SBram Moolenaar endif 3549964e468SBram Moolenaar 3559964e468SBram Moolenaar " Find the .../GetLatest subdirectory under the runtimepath 3569964e468SBram Moolenaar for datadir in split(&rtp,',') + [''] 3579964e468SBram Moolenaar if isdirectory(datadir."/GetLatest") 3589964e468SBram Moolenaar" call Decho("found directory<".datadir.">") 3599964e468SBram Moolenaar let datadir= datadir . "/GetLatest" 3609964e468SBram Moolenaar break 3619964e468SBram Moolenaar endif 3629964e468SBram Moolenaar if filereadable(datadir."GetLatestVimScripts.dat") 3639964e468SBram Moolenaar" call Decho("found ".datadir."/GetLatestVimScripts.dat") 3649964e468SBram Moolenaar break 3659964e468SBram Moolenaar endif 3669964e468SBram Moolenaar endfor 367*82038d73SBram Moolenaar 3689964e468SBram Moolenaar " Sanity checks: readability and writability 3699964e468SBram Moolenaar if datadir == "" 3709964e468SBram Moolenaar echoerr 'Missing "GetLatest/" on your runtimepath - see :help glvs-dist-install' 3719964e468SBram Moolenaar" call Dret("GetLatestVimScripts : unable to find a GetLatest subdirectory") 3729964e468SBram Moolenaar return 3739964e468SBram Moolenaar endif 3749964e468SBram Moolenaar 3759964e468SBram Moolenaar if filewritable(datadir) != 2 3769964e468SBram Moolenaar echoerr "(getLatestVimScripts) Your ".datadir." isn't writable" 3779964e468SBram Moolenaar" call Dret("GetLatestVimScripts : non-writable directory<".datadir.">") 3789964e468SBram Moolenaar return 3799964e468SBram Moolenaar endif 3809964e468SBram Moolenaar let datafile= datadir."/GetLatestVimScripts.dat" 3819964e468SBram Moolenaar if !filereadable(datafile) 3829964e468SBram Moolenaar echoerr "Your data file<".datafile."> isn't readable" 3839964e468SBram Moolenaar" call Dret("GetLatestVimScripts : non-readable datafile<".datafile.">") 3849964e468SBram Moolenaar return 3859964e468SBram Moolenaar endif 3869964e468SBram Moolenaar if !filewritable(datafile) 3879964e468SBram Moolenaar echoerr "Your data file<".datafile."> isn't writable" 3889964e468SBram Moolenaar" call Dret("GetLatestVimScripts : non-writable datafile<".datafile.">") 3899964e468SBram Moolenaar return 3909964e468SBram Moolenaar endif 3919964e468SBram Moolenaar" call Decho("datadir <".datadir.">") 3929964e468SBram Moolenaar" call Decho("datafile <".datafile.">") 3939964e468SBram Moolenaar 3949964e468SBram Moolenaar " don't let any events interfere (like winmanager's, taglist's, etc) 3959964e468SBram Moolenaar let eikeep= &ei 3969964e468SBram Moolenaar set ei=all 3979964e468SBram Moolenaar 3989964e468SBram Moolenaar " record current directory, change to datadir, open split window with 3999964e468SBram Moolenaar " datafile 4009964e468SBram Moolenaar let origdir= getcwd() 4019964e468SBram Moolenaar exe "cd ".escape(substitute(datadir,'\','/','ge'),"|[]*'\" #") 4029964e468SBram Moolenaar split 4039964e468SBram Moolenaar exe "e ".escape(substitute(datafile,'\','/','ge'),"|[]*'\" #") 4049964e468SBram Moolenaar res 1000 4059964e468SBram Moolenaar let s:downloads = 0 4069964e468SBram Moolenaar let s:downerrors= 0 4079964e468SBram Moolenaar 4089964e468SBram Moolenaar " Check on dependencies mentioned in plugins 4099964e468SBram Moolenaar" call Decho(" ") 4109964e468SBram Moolenaar" call Decho("searching plugins for GetLatestVimScripts dependencies") 4119964e468SBram Moolenaar let lastline = line("$") 412*82038d73SBram Moolenaar" call Decho("lastline#".lastline) 413*82038d73SBram Moolenaar let plugins = split(globpath(&rtp,"plugin/*.vim")) 4149964e468SBram Moolenaar let foundscript = 0 415*82038d73SBram Moolenaar let firstdir= "" 4169964e468SBram Moolenaar 417*82038d73SBram Moolenaar for plugin in plugins 418*82038d73SBram Moolenaar 419*82038d73SBram Moolenaar " don't process plugins in system directories 420*82038d73SBram Moolenaar if firstdir == "" 421*82038d73SBram Moolenaar let firstdir= substitute(plugin,'[/\\][^/\\]\+$','','') 422*82038d73SBram Moolenaar" call Decho("firstdir<".firstdir.">") 423*82038d73SBram Moolenaar else 424*82038d73SBram Moolenaar let curdir= substitute(plugin,'[/\\][^/\\]\+$','','') 425*82038d73SBram Moolenaar" call Decho("curdir<".curdir.">") 426*82038d73SBram Moolenaar if curdir != firstdir 427*82038d73SBram Moolenaar break 428*82038d73SBram Moolenaar endif 429*82038d73SBram Moolenaar endif 430*82038d73SBram Moolenaar 431*82038d73SBram Moolenaar " read plugin in 4329964e468SBram Moolenaar $ 433*82038d73SBram Moolenaar" call Decho(" ") 4349964e468SBram Moolenaar" call Decho(".dependency checking<".plugin."> line$=".line("$")) 4359964e468SBram Moolenaar exe "silent r ".plugin 436*82038d73SBram Moolenaar 4379964e468SBram Moolenaar while search('^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+','W') != 0 4389964e468SBram Moolenaar let newscript= substitute(getline("."),'^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+\s\+\(.*\)$','\1','e') 4399964e468SBram Moolenaar let llp1 = lastline+1 440*82038d73SBram Moolenaar" call Decho("..newscript<".newscript.">") 4419964e468SBram Moolenaar 442*82038d73SBram Moolenaar " don't process ""GetLatestVimScripts lines 4439964e468SBram Moolenaar if newscript !~ '^"' 4449964e468SBram Moolenaar " found a "GetLatestVimScripts: # #" line in the script; check if its already in the datafile 4459964e468SBram Moolenaar let curline = line(".") 4469964e468SBram Moolenaar let noai_script = substitute(newscript,'\s*:AutoInstall:\s*','','e') 4479964e468SBram Moolenaar exe llp1 4489964e468SBram Moolenaar let srchline = search('\<'.noai_script.'\>','bW') 449*82038d73SBram Moolenaar" call Decho("..noai_script<".noai_script."> srch=".srchline."curline#".line(".")." lastline#".lastline) 4509964e468SBram Moolenaar 4519964e468SBram Moolenaar if srchline == 0 4529964e468SBram Moolenaar " found a new script to permanently include in the datafile 4539964e468SBram Moolenaar let keep_rega = @a 4549964e468SBram Moolenaar let @a = substitute(getline(curline),'^"\s\+GetLatestVimScripts:\s\+','','') 4559964e468SBram Moolenaar exe lastline."put a" 4569964e468SBram Moolenaar echomsg "Appending <".@a."> to ".datafile." for ".newscript 4579964e468SBram Moolenaar" call Decho("..APPEND (".noai_script.")<".@a."> to GetLatestVimScripts.dat") 4589964e468SBram Moolenaar let @a = keep_rega 4599964e468SBram Moolenaar let lastline = llp1 4609964e468SBram Moolenaar let curline = curline + 1 4619964e468SBram Moolenaar let foundscript = foundscript + 1 4629964e468SBram Moolenaar" else " Decho 4639964e468SBram Moolenaar" call Decho("..found <".noai_script."> (already in datafile at line#".srchline.")") 4649964e468SBram Moolenaar endif 4659964e468SBram Moolenaar 4669964e468SBram Moolenaar let curline = curline + 1 4679964e468SBram Moolenaar exe curline 4689964e468SBram Moolenaar endif 4699964e468SBram Moolenaar endwhile 470*82038d73SBram Moolenaar 4719964e468SBram Moolenaar let llp1= lastline + 1 4729964e468SBram Moolenaar" call Decho(".deleting lines: ".llp1.",$d") 4739964e468SBram Moolenaar exe "silent! ".llp1.",$d" 474*82038d73SBram Moolenaar endfor 475*82038d73SBram Moolenaar" call Decho("--- end dependency checking loop --- foundscript=".foundscript) 476*82038d73SBram Moolenaar" call Decho(" ") 4779964e468SBram Moolenaar 4789964e468SBram Moolenaar if foundscript == 0 4799964e468SBram Moolenaar set nomod 4809964e468SBram Moolenaar endif 4819964e468SBram Moolenaar 4829964e468SBram Moolenaar " Check on out-of-date scripts using GetLatest/GetLatestVimScripts.dat 483*82038d73SBram Moolenaar" call Decho("begin: checking out-of-date scripts using datafile<".datafile.">") 4849964e468SBram Moolenaar set lz 4859964e468SBram Moolenaar 1 486*82038d73SBram Moolenaar" /^-----/,$g/^\s*\d/call Decho(getline(".")) 487*82038d73SBram Moolenaar 1 488*82038d73SBram Moolenaar /^-----/,$g/^\s*\d/call s:GetOneScript() 489*82038d73SBram Moolenaar" call Decho("--- end out-of-date checking --- ") 4909964e468SBram Moolenaar 4919964e468SBram Moolenaar " Final report (an echomsg) 4929964e468SBram Moolenaar try 4939964e468SBram Moolenaar silent! ?^-------? 4949964e468SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E114/ 4959964e468SBram Moolenaar" call Dret("GetLatestVimScripts : nothing done!") 4969964e468SBram Moolenaar return 4979964e468SBram Moolenaar endtry 4989964e468SBram Moolenaar exe "norm! kz\<CR>" 4999964e468SBram Moolenaar redraw! 5009964e468SBram Moolenaar let s:msg = "" 5019964e468SBram Moolenaar if s:downloads == 1 5029964e468SBram Moolenaar let s:msg = "Downloaded one updated script to <".datadir.">" 5039964e468SBram Moolenaar elseif s:downloads == 2 5049964e468SBram Moolenaar let s:msg= "Downloaded two updated scripts to <".datadir.">" 5059964e468SBram Moolenaar elseif s:downloads > 1 5069964e468SBram Moolenaar let s:msg= "Downloaded ".s:downloads." updated scripts to <".datadir.">" 5079964e468SBram Moolenaar else 5089964e468SBram Moolenaar let s:msg= "Everything was already current" 5099964e468SBram Moolenaar endif 5109964e468SBram Moolenaar if s:downerrors > 0 5119964e468SBram Moolenaar let s:msg= s:msg." (".s:downerrors." downloading errors)" 5129964e468SBram Moolenaar endif 5139964e468SBram Moolenaar echomsg s:msg 5149964e468SBram Moolenaar " save the file 5159964e468SBram Moolenaar if &mod 5169964e468SBram Moolenaar silent! w! 5179964e468SBram Moolenaar endif 5189964e468SBram Moolenaar q 5199964e468SBram Moolenaar 5209964e468SBram Moolenaar " restore events and current directory 5219964e468SBram Moolenaar exe "cd ".escape(substitute(origdir,'\','/','ge'),"|[]*'\" #") 5229964e468SBram Moolenaar let &ei= eikeep 5239964e468SBram Moolenaar set nolz 5249964e468SBram Moolenaar" call Dret("GetLatestVimScripts : did ".s:downloads." downloads") 5259964e468SBram Moolenaarendfun 5269964e468SBram Moolenaar" --------------------------------------------------------------------- 5279964e468SBram Moolenaar 5289964e468SBram Moolenaar" Restore Options: {{{1 5299964e468SBram Moolenaarlet &cpo= s:keepcpo 5309964e468SBram Moolenaar 5319964e468SBram Moolenaar" vim: ts=8 sts=2 fdm=marker nowrap 532