19964e468SBram Moolenaar" --------------------------------------------------------------------- 29964e468SBram Moolenaar" getscript.vim 39964e468SBram Moolenaar" Author: Charles E. Campbell, Jr. 4*3577c6faSBram Moolenaar" Date: May 30, 2008 5*3577c6faSBram Moolenaar" Version: 30 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 14*3577c6faSBram 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*3577c6faSBram Moolenaarlet g:loaded_getscript= "v30" 279964e468SBram Moolenaar 28*3577c6faSBram Moolenaar" --------------------------- 299964e468SBram Moolenaar" Global Variables: {{{1 30*3577c6faSBram Moolenaar" --------------------------- 31*3577c6faSBram Moolenaar" Cygwin Detection ------- {{{2 32*3577c6faSBram Moolenaarif !exists("g:getscript_cygwin") 33*3577c6faSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 34*3577c6faSBram Moolenaar if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$' 35*3577c6faSBram Moolenaar let g:getscript_cygwin= 1 36*3577c6faSBram Moolenaar else 37*3577c6faSBram Moolenaar let g:getscript_cygwin= 0 38*3577c6faSBram Moolenaar endif 39*3577c6faSBram Moolenaar else 40*3577c6faSBram Moolenaar let g:getscript_cygwin= 0 41*3577c6faSBram Moolenaar endif 42*3577c6faSBram Moolenaarendif 43*3577c6faSBram Moolenaar" shell quoting character {{{2 44*3577c6faSBram Moolenaarif exists("g:netrw_shq") && !exists("g:getscript_shq") 45*3577c6faSBram Moolenaar let g:getscript_shq= g:netrw_shq 46*3577c6faSBram Moolenaarelseif !exists("g:getscript_shq") 47*3577c6faSBram Moolenaar if exists("&shq") && &shq != "" 48*3577c6faSBram Moolenaar let g:getscript_shq= &shq 49*3577c6faSBram Moolenaar elseif exists("&sxq") && &sxq != "" 50*3577c6faSBram Moolenaar let g:getscript_shq= &sxq 51*3577c6faSBram Moolenaar elseif has("win32") || has("win95") || has("win64") || has("win16") 52*3577c6faSBram Moolenaar if g:getscript_cygwin 53*3577c6faSBram Moolenaar let g:getscript_shq= "'" 54*3577c6faSBram Moolenaar else 55*3577c6faSBram Moolenaar let g:getscript_shq= '"' 56*3577c6faSBram Moolenaar endif 57*3577c6faSBram Moolenaar else 58*3577c6faSBram Moolenaar let g:getscript_shq= "'" 59*3577c6faSBram Moolenaar endif 60*3577c6faSBram Moolenaar" call Decho("g:getscript_shq<".g:getscript_shq.">") 61*3577c6faSBram Moolenaarendif 62*3577c6faSBram Moolenaar 63*3577c6faSBram Moolenaar" wget vs curl {{{2 649964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_wget") 659964e468SBram Moolenaar if executable("wget") 669964e468SBram Moolenaar let g:GetLatestVimScripts_wget= "wget" 679964e468SBram Moolenaar elseif executable("curl") 689964e468SBram Moolenaar let g:GetLatestVimScripts_wget= "curl" 699964e468SBram Moolenaar else 709964e468SBram Moolenaar let g:GetLatestVimScripts_wget = 'echo "GetLatestVimScripts needs wget or curl"' 719964e468SBram Moolenaar let g:GetLatestVimScripts_options = "" 729964e468SBram Moolenaar endif 739964e468SBram Moolenaarendif 749964e468SBram Moolenaar 759964e468SBram Moolenaar" options that wget and curl require: 769964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_options") 779964e468SBram Moolenaar if g:GetLatestVimScripts_wget == "wget" 789964e468SBram Moolenaar let g:GetLatestVimScripts_options= "-q -O" 799964e468SBram Moolenaar elseif g:GetLatestVimScripts_wget == "curl" 809964e468SBram Moolenaar let g:GetLatestVimScripts_options= "-s -O" 819964e468SBram Moolenaar else 829964e468SBram Moolenaar let g:GetLatestVimScripts_options= "" 839964e468SBram Moolenaar endif 849964e468SBram Moolenaarendif 859964e468SBram Moolenaar 869964e468SBram Moolenaar" by default, allow autoinstall lines to work 879964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_allowautoinstall") 889964e468SBram Moolenaar let g:GetLatestVimScripts_allowautoinstall= 1 899964e468SBram Moolenaarendif 909964e468SBram Moolenaar 919964e468SBram Moolenaar"" For debugging: 929964e468SBram Moolenaar"let g:GetLatestVimScripts_wget = "echo" 939964e468SBram Moolenaar"let g:GetLatestVimScripts_options = "options" 949964e468SBram Moolenaar 959964e468SBram Moolenaar" --------------------------------------------------------------------- 969964e468SBram Moolenaar" Check If AutoInstall Capable: {{{1 979964e468SBram Moolenaarlet s:autoinstall= "" 989964e468SBram Moolenaarif g:GetLatestVimScripts_allowautoinstall 999964e468SBram Moolenaar 1009964e468SBram Moolenaar if (has("win32") || has("gui_win32") || has("gui_win32s") || has("win16") || has("win64") || has("win32unix") || has("win95")) && &shell != "bash" 1019964e468SBram Moolenaar " windows (but not cygwin/bash) 1029964e468SBram Moolenaar let s:dotvim= "vimfiles" 1039964e468SBram Moolenaar if !exists("g:GetLatestVimScripts_mv") 1049964e468SBram Moolenaar let g:GetLatestVimScripts_mv= "ren" 1059964e468SBram Moolenaar endif 1069964e468SBram Moolenaar 1079964e468SBram Moolenaar else 1089964e468SBram Moolenaar " unix 1099964e468SBram Moolenaar let s:dotvim= ".vim" 1109964e468SBram Moolenaar if !exists("g:GetLatestVimScripts_mv") 1119964e468SBram Moolenaar let g:GetLatestVimScripts_mv= "mv" 1129964e468SBram Moolenaar endif 1139964e468SBram Moolenaar endif 1149964e468SBram Moolenaar 1159964e468SBram Moolenaar if exists('$HOME') && isdirectory(expand("$HOME")."/".s:dotvim) 1169964e468SBram Moolenaar let s:autoinstall= $HOME."/".s:dotvim 1179964e468SBram Moolenaar endif 1189964e468SBram Moolenaar" call Decho("s:autoinstall<".s:autoinstall.">") 1199964e468SBram Moolenaar"else "Decho 1209964e468SBram Moolenaar" call Decho("g:GetLatestVimScripts_allowautoinstall=".g:GetLatestVimScripts_allowautoinstall.": :AutoInstall: disabled") 1219964e468SBram Moolenaarendif 1229964e468SBram Moolenaar 1239964e468SBram Moolenaar" --------------------------------------------------------------------- 1249964e468SBram Moolenaar" Public Interface: {{{1 1259964e468SBram Moolenaarcom! -nargs=0 GetLatestVimScripts call getscript#GetLatestVimScripts() 1269964e468SBram Moolenaarcom! -nargs=0 GetScript call getscript#GetLatestVimScripts() 1279964e468SBram Moolenaarsilent! com -nargs=0 GLVS call getscript#GetLatestVimScripts() 1289964e468SBram Moolenaar 1299964e468SBram Moolenaar" --------------------------------------------------------------------- 1309964e468SBram Moolenaar" GetLatestVimScripts: this function gets the latest versions of {{{1 1319964e468SBram Moolenaar" scripts based on the list in 1329964e468SBram Moolenaar" (first dir in runtimepath)/GetLatest/GetLatestVimScripts.dat 1339964e468SBram Moolenaarfun! getscript#GetLatestVimScripts() 1349964e468SBram Moolenaar" call Dfunc("GetLatestVimScripts() autoinstall<".s:autoinstall.">") 1359964e468SBram Moolenaar 1369964e468SBram Moolenaar" insure that wget is executable 1379964e468SBram Moolenaar if executable(g:GetLatestVimScripts_wget) != 1 1389964e468SBram Moolenaar echoerr "GetLatestVimScripts needs ".g:GetLatestVimScripts_wget." which apparently is not available on your system" 1399964e468SBram Moolenaar" call Dret("GetLatestVimScripts : wget not executable/availble") 1409964e468SBram Moolenaar return 1419964e468SBram Moolenaar endif 1429964e468SBram Moolenaar 1439964e468SBram Moolenaar " Find the .../GetLatest subdirectory under the runtimepath 1449964e468SBram Moolenaar for datadir in split(&rtp,',') + [''] 1459964e468SBram Moolenaar if isdirectory(datadir."/GetLatest") 1469964e468SBram Moolenaar" call Decho("found directory<".datadir.">") 1479964e468SBram Moolenaar let datadir= datadir . "/GetLatest" 1489964e468SBram Moolenaar break 1499964e468SBram Moolenaar endif 1509964e468SBram Moolenaar if filereadable(datadir."GetLatestVimScripts.dat") 1519964e468SBram Moolenaar" call Decho("found ".datadir."/GetLatestVimScripts.dat") 1529964e468SBram Moolenaar break 1539964e468SBram Moolenaar endif 1549964e468SBram Moolenaar endfor 15582038d73SBram Moolenaar 1569964e468SBram Moolenaar " Sanity checks: readability and writability 1579964e468SBram Moolenaar if datadir == "" 1589964e468SBram Moolenaar echoerr 'Missing "GetLatest/" on your runtimepath - see :help glvs-dist-install' 1599964e468SBram Moolenaar" call Dret("GetLatestVimScripts : unable to find a GetLatest subdirectory") 1609964e468SBram Moolenaar return 1619964e468SBram Moolenaar endif 1629964e468SBram Moolenaar 1639964e468SBram Moolenaar if filewritable(datadir) != 2 1649964e468SBram Moolenaar echoerr "(getLatestVimScripts) Your ".datadir." isn't writable" 1659964e468SBram Moolenaar" call Dret("GetLatestVimScripts : non-writable directory<".datadir.">") 1669964e468SBram Moolenaar return 1679964e468SBram Moolenaar endif 1689964e468SBram Moolenaar let datafile= datadir."/GetLatestVimScripts.dat" 1699964e468SBram Moolenaar if !filereadable(datafile) 1709964e468SBram Moolenaar echoerr "Your data file<".datafile."> isn't readable" 1719964e468SBram Moolenaar" call Dret("GetLatestVimScripts : non-readable datafile<".datafile.">") 1729964e468SBram Moolenaar return 1739964e468SBram Moolenaar endif 1749964e468SBram Moolenaar if !filewritable(datafile) 1759964e468SBram Moolenaar echoerr "Your data file<".datafile."> isn't writable" 1769964e468SBram Moolenaar" call Dret("GetLatestVimScripts : non-writable datafile<".datafile.">") 1779964e468SBram Moolenaar return 1789964e468SBram Moolenaar endif 1799964e468SBram Moolenaar" call Decho("datadir <".datadir.">") 1809964e468SBram Moolenaar" call Decho("datafile <".datafile.">") 1819964e468SBram Moolenaar 1829964e468SBram Moolenaar " don't let any events interfere (like winmanager's, taglist's, etc) 1839964e468SBram Moolenaar let eikeep= &ei 1849964e468SBram Moolenaar set ei=all 1859964e468SBram Moolenaar 1869964e468SBram Moolenaar " record current directory, change to datadir, open split window with 1879964e468SBram Moolenaar " datafile 1889964e468SBram Moolenaar let origdir= getcwd() 189*3577c6faSBram Moolenaar" call Decho("exe cd ".fnameescape(substitute(datadir,'\','/','ge'))) 190*3577c6faSBram Moolenaar exe "cd ".fnameescape(substitute(datadir,'\','/','ge')) 1919964e468SBram Moolenaar split 192*3577c6faSBram Moolenaar" call Decho("exe e ".fnameescape(substitute(datafile,'\','/','ge'))) 193*3577c6faSBram Moolenaar exe "e ".fnameescape(substitute(datafile,'\','/','ge')) 1949964e468SBram Moolenaar res 1000 1959964e468SBram Moolenaar let s:downloads = 0 1969964e468SBram Moolenaar let s:downerrors= 0 1979964e468SBram Moolenaar 1989964e468SBram Moolenaar " Check on dependencies mentioned in plugins 1999964e468SBram Moolenaar" call Decho(" ") 2009964e468SBram Moolenaar" call Decho("searching plugins for GetLatestVimScripts dependencies") 2019964e468SBram Moolenaar let lastline = line("$") 20282038d73SBram Moolenaar" call Decho("lastline#".lastline) 203*3577c6faSBram Moolenaar let plugins = split(globpath(&rtp,"plugin/*.vim"),'\n') 2049964e468SBram Moolenaar let foundscript = 0 20582038d73SBram Moolenaar let firstdir= "" 2069964e468SBram Moolenaar 20782038d73SBram Moolenaar for plugin in plugins 208*3577c6faSBram Moolenaar" call Decho("plugin<".plugin.">") 20982038d73SBram Moolenaar 21082038d73SBram Moolenaar " don't process plugins in system directories 21182038d73SBram Moolenaar if firstdir == "" 21282038d73SBram Moolenaar let firstdir= substitute(plugin,'[/\\][^/\\]\+$','','') 213*3577c6faSBram Moolenaar" call Decho("setting firstdir<".firstdir.">") 21482038d73SBram Moolenaar else 21582038d73SBram Moolenaar let curdir= substitute(plugin,'[/\\][^/\\]\+$','','') 21682038d73SBram Moolenaar" call Decho("curdir<".curdir.">") 21782038d73SBram Moolenaar if curdir != firstdir 218*3577c6faSBram Moolenaar" call Decho("skipping subsequent plugins: curdir<".curdir."> != firstdir<".firstdir.">") 21982038d73SBram Moolenaar break 22082038d73SBram Moolenaar endif 22182038d73SBram Moolenaar endif 22282038d73SBram Moolenaar 22382038d73SBram Moolenaar " read plugin in 224*3577c6faSBram Moolenaar " evidently a :r creates a new buffer (the "#" buffer) that is subsequently unused -- bwiping it 2259964e468SBram Moolenaar $ 22682038d73SBram Moolenaar" call Decho(" ") 2279964e468SBram Moolenaar" call Decho(".dependency checking<".plugin."> line$=".line("$")) 228*3577c6faSBram Moolenaar" call Decho("exe silent r ".fnameescape(plugin)) 229*3577c6faSBram Moolenaar exe "silent r ".fnameescape(plugin) 230*3577c6faSBram Moolenaar exe "silent bwipe ".bufnr("#") 23182038d73SBram Moolenaar 2329964e468SBram Moolenaar while search('^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+','W') != 0 2339964e468SBram Moolenaar let newscript= substitute(getline("."),'^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+\s\+\(.*\)$','\1','e') 2349964e468SBram Moolenaar let llp1 = lastline+1 23582038d73SBram Moolenaar" call Decho("..newscript<".newscript.">") 2369964e468SBram Moolenaar 237*3577c6faSBram Moolenaar " don't process ""GetLatestVimScripts lines -- those that have been doubly-commented out 2389964e468SBram Moolenaar if newscript !~ '^"' 2399964e468SBram Moolenaar " found a "GetLatestVimScripts: # #" line in the script; check if its already in the datafile 2409964e468SBram Moolenaar let curline = line(".") 2419964e468SBram Moolenaar let noai_script = substitute(newscript,'\s*:AutoInstall:\s*','','e') 2429964e468SBram Moolenaar exe llp1 2439964e468SBram Moolenaar let srchline = search('\<'.noai_script.'\>','bW') 24482038d73SBram Moolenaar" call Decho("..noai_script<".noai_script."> srch=".srchline."curline#".line(".")." lastline#".lastline) 2459964e468SBram Moolenaar 2469964e468SBram Moolenaar if srchline == 0 2479964e468SBram Moolenaar " found a new script to permanently include in the datafile 2489964e468SBram Moolenaar let keep_rega = @a 2499964e468SBram Moolenaar let @a = substitute(getline(curline),'^"\s\+GetLatestVimScripts:\s\+','','') 2509964e468SBram Moolenaar exe lastline."put a" 2519964e468SBram Moolenaar echomsg "Appending <".@a."> to ".datafile." for ".newscript 2529964e468SBram Moolenaar" call Decho("..APPEND (".noai_script.")<".@a."> to GetLatestVimScripts.dat") 2539964e468SBram Moolenaar let @a = keep_rega 2549964e468SBram Moolenaar let lastline = llp1 2559964e468SBram Moolenaar let curline = curline + 1 2569964e468SBram Moolenaar let foundscript = foundscript + 1 2579964e468SBram Moolenaar" else " Decho 2589964e468SBram Moolenaar" call Decho("..found <".noai_script."> (already in datafile at line#".srchline.")") 2599964e468SBram Moolenaar endif 2609964e468SBram Moolenaar 2619964e468SBram Moolenaar let curline = curline + 1 2629964e468SBram Moolenaar exe curline 2639964e468SBram Moolenaar endif 2649964e468SBram Moolenaar endwhile 26582038d73SBram Moolenaar 2669964e468SBram Moolenaar let llp1= lastline + 1 2679964e468SBram Moolenaar" call Decho(".deleting lines: ".llp1.",$d") 2689964e468SBram Moolenaar exe "silent! ".llp1.",$d" 26982038d73SBram Moolenaar endfor 27082038d73SBram Moolenaar" call Decho("--- end dependency checking loop --- foundscript=".foundscript) 27182038d73SBram Moolenaar" call Decho(" ") 272*3577c6faSBram Moolenaar" call Dredir("BUFFER TEST (GetLatestVimScripts 1)","ls!") 2739964e468SBram Moolenaar 2749964e468SBram Moolenaar if foundscript == 0 275*3577c6faSBram Moolenaar setlocal nomod 2769964e468SBram Moolenaar endif 2779964e468SBram Moolenaar 2789964e468SBram Moolenaar " Check on out-of-date scripts using GetLatest/GetLatestVimScripts.dat 27982038d73SBram Moolenaar" call Decho("begin: checking out-of-date scripts using datafile<".datafile.">") 280*3577c6faSBram Moolenaar setlocal lz 2819964e468SBram Moolenaar 1 28282038d73SBram Moolenaar" /^-----/,$g/^\s*\d/call Decho(getline(".")) 28382038d73SBram Moolenaar 1 28482038d73SBram Moolenaar /^-----/,$g/^\s*\d/call s:GetOneScript() 28582038d73SBram Moolenaar" call Decho("--- end out-of-date checking --- ") 2869964e468SBram Moolenaar 2879964e468SBram Moolenaar " Final report (an echomsg) 2889964e468SBram Moolenaar try 2899964e468SBram Moolenaar silent! ?^-------? 2909964e468SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E114/ 2919964e468SBram Moolenaar" call Dret("GetLatestVimScripts : nothing done!") 2929964e468SBram Moolenaar return 2939964e468SBram Moolenaar endtry 2949964e468SBram Moolenaar exe "norm! kz\<CR>" 2959964e468SBram Moolenaar redraw! 2969964e468SBram Moolenaar let s:msg = "" 2979964e468SBram Moolenaar if s:downloads == 1 2989964e468SBram Moolenaar let s:msg = "Downloaded one updated script to <".datadir.">" 2999964e468SBram Moolenaar elseif s:downloads == 2 3009964e468SBram Moolenaar let s:msg= "Downloaded two updated scripts to <".datadir.">" 3019964e468SBram Moolenaar elseif s:downloads > 1 3029964e468SBram Moolenaar let s:msg= "Downloaded ".s:downloads." updated scripts to <".datadir.">" 3039964e468SBram Moolenaar else 3049964e468SBram Moolenaar let s:msg= "Everything was already current" 3059964e468SBram Moolenaar endif 3069964e468SBram Moolenaar if s:downerrors > 0 3079964e468SBram Moolenaar let s:msg= s:msg." (".s:downerrors." downloading errors)" 3089964e468SBram Moolenaar endif 3099964e468SBram Moolenaar echomsg s:msg 3109964e468SBram Moolenaar " save the file 3119964e468SBram Moolenaar if &mod 3129964e468SBram Moolenaar silent! w! 3139964e468SBram Moolenaar endif 3149964e468SBram Moolenaar q 3159964e468SBram Moolenaar 3169964e468SBram Moolenaar " restore events and current directory 317*3577c6faSBram Moolenaar exe "cd ".fnameescape(substitute(origdir,'\','/','ge')) 3189964e468SBram Moolenaar let &ei= eikeep 319*3577c6faSBram Moolenaar setlocal nolz 320*3577c6faSBram Moolenaar" call Dredir("BUFFER TEST (GetLatestVimScripts 2)","ls!") 3219964e468SBram Moolenaar" call Dret("GetLatestVimScripts : did ".s:downloads." downloads") 3229964e468SBram Moolenaarendfun 3239964e468SBram Moolenaar 324*3577c6faSBram Moolenaar" --------------------------------------------------------------------- 325*3577c6faSBram Moolenaar" GetOneScript: (Get Latest Vim Script) this function operates {{{1 326*3577c6faSBram Moolenaar" on the current line, interpreting two numbers and text as 327*3577c6faSBram Moolenaar" ScriptID, SourceID, and Filename. 328*3577c6faSBram Moolenaar" It downloads any scripts that have newer versions from vim.sf.net. 329*3577c6faSBram Moolenaarfun! s:GetOneScript(...) 330*3577c6faSBram Moolenaar" call Dfunc("GetOneScript()") 331*3577c6faSBram Moolenaar 332*3577c6faSBram Moolenaar " set options to allow progress to be shown on screen 333*3577c6faSBram Moolenaar let rega= @a 334*3577c6faSBram Moolenaar let t_ti= &t_ti 335*3577c6faSBram Moolenaar let t_te= &t_te 336*3577c6faSBram Moolenaar let rs = &rs 337*3577c6faSBram Moolenaar set t_ti= t_te= nors 338*3577c6faSBram Moolenaar 339*3577c6faSBram Moolenaar " put current line on top-of-screen and interpret it into 340*3577c6faSBram Moolenaar " a script identifer : used to obtain webpage 341*3577c6faSBram Moolenaar " source identifier : used to identify current version 342*3577c6faSBram Moolenaar " and an associated comment: used to report on what's being considered 343*3577c6faSBram Moolenaar if a:0 >= 3 344*3577c6faSBram Moolenaar let scriptid = a:1 345*3577c6faSBram Moolenaar let srcid = a:2 346*3577c6faSBram Moolenaar let fname = a:3 347*3577c6faSBram Moolenaar let cmmnt = "" 348*3577c6faSBram Moolenaar" call Decho("scriptid<".scriptid.">") 349*3577c6faSBram Moolenaar" call Decho("srcid <".srcid.">") 350*3577c6faSBram Moolenaar" call Decho("fname <".fname.">") 351*3577c6faSBram Moolenaar else 352*3577c6faSBram Moolenaar let curline = getline(".") 353*3577c6faSBram Moolenaar if curline =~ '^\s*#' 354*3577c6faSBram Moolenaar let @a= rega 355*3577c6faSBram Moolenaar" call Dret("GetOneScript : skipping a pure comment line") 356*3577c6faSBram Moolenaar return 357*3577c6faSBram Moolenaar endif 358*3577c6faSBram Moolenaar let parsepat = '^\s*\(\d\+\)\s\+\(\d\+\)\s\+\(.\{-}\)\(\s*#.*\)\=$' 359*3577c6faSBram Moolenaar try 360*3577c6faSBram Moolenaar let scriptid = substitute(curline,parsepat,'\1','e') 361*3577c6faSBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 362*3577c6faSBram Moolenaar let scriptid= 0 363*3577c6faSBram Moolenaar endtry 364*3577c6faSBram Moolenaar try 365*3577c6faSBram Moolenaar let srcid = substitute(curline,parsepat,'\2','e') 366*3577c6faSBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 367*3577c6faSBram Moolenaar let srcid= 0 368*3577c6faSBram Moolenaar endtry 369*3577c6faSBram Moolenaar try 370*3577c6faSBram Moolenaar let fname= substitute(curline,parsepat,'\3','e') 371*3577c6faSBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 372*3577c6faSBram Moolenaar let fname= "" 373*3577c6faSBram Moolenaar endtry 374*3577c6faSBram Moolenaar try 375*3577c6faSBram Moolenaar let cmmnt= substitute(curline,parsepat,'\4','e') 376*3577c6faSBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 377*3577c6faSBram Moolenaar let cmmnt= "" 378*3577c6faSBram Moolenaar endtry 379*3577c6faSBram Moolenaar" call Decho("curline <".curline.">") 380*3577c6faSBram Moolenaar" call Decho("parsepat<".parsepat.">") 381*3577c6faSBram Moolenaar" call Decho("scriptid<".scriptid.">") 382*3577c6faSBram Moolenaar" call Decho("srcid <".srcid.">") 383*3577c6faSBram Moolenaar" call Decho("fname <".fname.">") 384*3577c6faSBram Moolenaar endif 385*3577c6faSBram Moolenaar 386*3577c6faSBram Moolenaar if scriptid == 0 || srcid == 0 387*3577c6faSBram Moolenaar " When looking for :AutoInstall: lines, skip scripts that have 0 0 scriptname 388*3577c6faSBram Moolenaar let @a= rega 389*3577c6faSBram Moolenaar" call Dret("GetOneScript : skipping a scriptid==srcid==0 line") 390*3577c6faSBram Moolenaar return 391*3577c6faSBram Moolenaar endif 392*3577c6faSBram Moolenaar 393*3577c6faSBram Moolenaar let doautoinstall= 0 394*3577c6faSBram Moolenaar if fname =~ ":AutoInstall:" 395*3577c6faSBram Moolenaar" call Decho("case AutoInstall: fname<".fname.">") 396*3577c6faSBram Moolenaar let aicmmnt= substitute(fname,'\s\+:AutoInstall:\s\+',' ','') 397*3577c6faSBram Moolenaar" call Decho("aicmmnt<".aicmmnt."> s:autoinstall=".s:autoinstall) 398*3577c6faSBram Moolenaar if s:autoinstall != "" 399*3577c6faSBram Moolenaar let doautoinstall = g:GetLatestVimScripts_allowautoinstall 400*3577c6faSBram Moolenaar endif 401*3577c6faSBram Moolenaar else 402*3577c6faSBram Moolenaar let aicmmnt= fname 403*3577c6faSBram Moolenaar endif 404*3577c6faSBram Moolenaar" call Decho("aicmmnt<".aicmmnt.">: doautoinstall=".doautoinstall) 405*3577c6faSBram Moolenaar 406*3577c6faSBram Moolenaar exe "norm z\<CR>" 407*3577c6faSBram Moolenaar redraw! 408*3577c6faSBram Moolenaar" call Decho('considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid) 409*3577c6faSBram Moolenaar echo 'considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid 410*3577c6faSBram Moolenaar 411*3577c6faSBram Moolenaar " grab a copy of the plugin's vim.sf.net webpage 412*3577c6faSBram Moolenaar let scriptaddr = 'http://vim.sf.net/script.php?script_id='.scriptid 413*3577c6faSBram Moolenaar let tmpfile = tempname() 414*3577c6faSBram Moolenaar let v:errmsg = "" 415*3577c6faSBram Moolenaar 416*3577c6faSBram Moolenaar " make up to three tries at downloading the description 417*3577c6faSBram Moolenaar let itry= 1 418*3577c6faSBram Moolenaar while itry <= 3 419*3577c6faSBram Moolenaar" call Decho("try#".itry." to download description of <".aicmmnt."> with addr=".scriptaddr) 420*3577c6faSBram Moolenaar if has("win32") || has("win16") || has("win95") 421*3577c6faSBram Moolenaar" call Decho("new|exe silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(tmpfile).' '.s:Escape(scriptaddr)."|bw!") 422*3577c6faSBram Moolenaar new|exe "silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(tmpfile).' '.s:Escape(scriptaddr)|bw! 423*3577c6faSBram Moolenaar else 424*3577c6faSBram Moolenaar" call Decho("exe silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(tmpfile)." ".s:Escape(scriptaddr)) 425*3577c6faSBram Moolenaar exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(tmpfile)." ".s:Escape(scriptaddr) 426*3577c6faSBram Moolenaar endif 427*3577c6faSBram Moolenaar if itry == 1 428*3577c6faSBram Moolenaar exe "silent vsplit ".fnameescape(tmpfile) 429*3577c6faSBram Moolenaar else 430*3577c6faSBram Moolenaar silent! e % 431*3577c6faSBram Moolenaar endif 432*3577c6faSBram Moolenaar setlocal bh=wipe 433*3577c6faSBram Moolenaar 434*3577c6faSBram Moolenaar " find the latest source-id in the plugin's webpage 435*3577c6faSBram Moolenaar silent! 1 436*3577c6faSBram Moolenaar let findpkg= search('Click on the package to download','W') 437*3577c6faSBram Moolenaar if findpkg > 0 438*3577c6faSBram Moolenaar break 439*3577c6faSBram Moolenaar endif 440*3577c6faSBram Moolenaar let itry= itry + 1 441*3577c6faSBram Moolenaar endwhile 442*3577c6faSBram Moolenaar" call Decho(" --- end downloading tries while loop --- itry=".itry) 443*3577c6faSBram Moolenaar 444*3577c6faSBram Moolenaar " testing: did finding "Click on the package..." fail? 445*3577c6faSBram Moolenaar if findpkg == 0 || itry >= 4 446*3577c6faSBram Moolenaar silent q! 447*3577c6faSBram Moolenaar call delete(tmpfile) 448*3577c6faSBram Moolenaar " restore options 449*3577c6faSBram Moolenaar let &t_ti = t_ti 450*3577c6faSBram Moolenaar let &t_te = t_te 451*3577c6faSBram Moolenaar let &rs = rs 452*3577c6faSBram Moolenaar let s:downerrors = s:downerrors + 1 453*3577c6faSBram Moolenaar" call Decho("***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">") 454*3577c6faSBram Moolenaar echomsg "***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">" 455*3577c6faSBram Moolenaar" call Dret("GetOneScript : srch for /Click on the package/ failed") 456*3577c6faSBram Moolenaar let @a= rega 457*3577c6faSBram Moolenaar return 458*3577c6faSBram Moolenaar endif 459*3577c6faSBram Moolenaar" call Decho('found "Click on the package to download"') 460*3577c6faSBram Moolenaar 461*3577c6faSBram Moolenaar let findsrcid= search('src_id=','W') 462*3577c6faSBram Moolenaar if findsrcid == 0 463*3577c6faSBram Moolenaar silent q! 464*3577c6faSBram Moolenaar call delete(tmpfile) 465*3577c6faSBram Moolenaar " restore options 466*3577c6faSBram Moolenaar let &t_ti = t_ti 467*3577c6faSBram Moolenaar let &t_te = t_te 468*3577c6faSBram Moolenaar let &rs = rs 469*3577c6faSBram Moolenaar let s:downerrors = s:downerrors + 1 470*3577c6faSBram Moolenaar" call Decho("***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">") 471*3577c6faSBram Moolenaar echomsg "***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">" 472*3577c6faSBram Moolenaar let @a= rega 473*3577c6faSBram Moolenaar" call Dret("GetOneScript : srch for /src_id/ failed") 474*3577c6faSBram Moolenaar return 475*3577c6faSBram Moolenaar endif 476*3577c6faSBram Moolenaar" call Decho('found "src_id=" in description page') 477*3577c6faSBram Moolenaar 478*3577c6faSBram Moolenaar let srcidpat = '^\s*<td class.*src_id=\(\d\+\)">\([^<]\+\)<.*$' 479*3577c6faSBram Moolenaar let latestsrcid= substitute(getline("."),srcidpat,'\1','') 480*3577c6faSBram Moolenaar let sname = substitute(getline("."),srcidpat,'\2','') " script name actually downloaded 481*3577c6faSBram Moolenaar" call Decho("srcidpat<".srcidpat."> latestsrcid<".latestsrcid."> sname<".sname.">") 482*3577c6faSBram Moolenaar silent q! 483*3577c6faSBram Moolenaar call delete(tmpfile) 484*3577c6faSBram Moolenaar 485*3577c6faSBram Moolenaar " convert the strings-of-numbers into numbers 486*3577c6faSBram Moolenaar let srcid = srcid + 0 487*3577c6faSBram Moolenaar let latestsrcid = latestsrcid + 0 488*3577c6faSBram Moolenaar" call Decho("srcid=".srcid." latestsrcid=".latestsrcid." sname<".sname.">") 489*3577c6faSBram Moolenaar 490*3577c6faSBram Moolenaar " has the plugin's most-recent srcid increased, which indicates 491*3577c6faSBram Moolenaar " that it has been updated 492*3577c6faSBram Moolenaar if latestsrcid > srcid 493*3577c6faSBram Moolenaar" call Decho("[latestsrcid=".latestsrcid."] <= [srcid=".srcid."]: need to update <".sname.">") 494*3577c6faSBram Moolenaar 495*3577c6faSBram Moolenaar let s:downloads= s:downloads + 1 496*3577c6faSBram Moolenaar if sname == bufname("%") 497*3577c6faSBram Moolenaar " GetLatestVimScript has to be careful about downloading itself 498*3577c6faSBram Moolenaar let sname= "NEW_".sname 499*3577c6faSBram Moolenaar endif 500*3577c6faSBram Moolenaar 501*3577c6faSBram Moolenaar " the plugin has been updated since we last obtained it, so download a new copy 502*3577c6faSBram Moolenaar" call Decho("...downloading new <".sname.">") 503*3577c6faSBram Moolenaar echomsg "...downloading new <".sname.">" 504*3577c6faSBram Moolenaar if has("win32") || has("win16") || has("win95") 505*3577c6faSBram Moolenaar" call Decho("new|exe silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(sname)." ".s:Escape('http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid)."|q") 506*3577c6faSBram Moolenaar new|exe "silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(sname)." ".s:Escape('http://vim.sf.net/scripts/download_script.php?src_id='.latestsrcid)|q 507*3577c6faSBram Moolenaar else 508*3577c6faSBram Moolenaar" call Decho("exe silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(sname)." ".s:Escape('http://vim.sf.net/scripts/download_script.php?src_id=')) 509*3577c6faSBram Moolenaar exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".s:Escape(sname)." ".s:Escape('http://vim.sf.net/scripts/download_script.php?src_id=') 510*3577c6faSBram Moolenaar endif 511*3577c6faSBram Moolenaar 512*3577c6faSBram Moolenaar " AutoInstall: only if doautoinstall has been requested by the plugin itself 513*3577c6faSBram Moolenaar if doautoinstall 514*3577c6faSBram Moolenaar" call Decho("attempting to do autoinstall: getcwd<".getcwd()."> filereadable(".sname.")=".filereadable(sname)) 515*3577c6faSBram Moolenaar if filereadable(sname) 516*3577c6faSBram Moolenaar call Decho("exe silent !".g:GetLatestVimScripts_mv." ".s:Escape(sname)." ".s:Escape(s:autoinstall)) 517*3577c6faSBram Moolenaar exe "silent !".g:GetLatestVimScripts_mv." ".s:Escape(sname)." ".s:Escape(s:autoinstall) 518*3577c6faSBram Moolenaar let curdir = escape(substitute(getcwd(),'\','/','ge'),"|[]*'\" #") 519*3577c6faSBram Moolenaar let installdir= curdir."/Installed" 520*3577c6faSBram Moolenaar if !isdirectory(installdir) 521*3577c6faSBram Moolenaar call mkdir(installdir) 522*3577c6faSBram Moolenaar endif 523*3577c6faSBram Moolenaar" call Decho("exe cd ".fnameescape(s:autoinstall)) 524*3577c6faSBram Moolenaar exe "cd ".fnameescape(s:autoinstall) 525*3577c6faSBram Moolenaar 526*3577c6faSBram Moolenaar " decompress 527*3577c6faSBram Moolenaar if sname =~ '\.bz2$' 528*3577c6faSBram Moolenaar" call Decho("decompress: attempt to bunzip2 ".sname) 529*3577c6faSBram Moolenaar exe "silent !bunzip2 ".s:Escape(sname) 530*3577c6faSBram Moolenaar let sname= substitute(sname,'\.bz2$','','') 531*3577c6faSBram Moolenaar" call Decho("decompress: new sname<".sname."> after bunzip2") 532*3577c6faSBram Moolenaar elseif sname =~ '\.gz$' 533*3577c6faSBram Moolenaar" call Decho("decompress: attempt to gunzip ".sname) 534*3577c6faSBram Moolenaar exe "silent !gunzip ".s:Escape(sname) 535*3577c6faSBram Moolenaar let sname= substitute(sname,'\.gz$','','') 536*3577c6faSBram Moolenaar" call Decho("decompress: new sname<".sname."> after gunzip") 537*3577c6faSBram Moolenaar endif 538*3577c6faSBram Moolenaar 539*3577c6faSBram Moolenaar " distribute archive(.zip, .tar, .vba) contents 540*3577c6faSBram Moolenaar if sname =~ '\.zip$' 541*3577c6faSBram Moolenaar" call Decho("dearchive: attempt to unzip ".sname) 542*3577c6faSBram Moolenaar exe "silent !unzip -o ".s:Escape(sname) 543*3577c6faSBram Moolenaar elseif sname =~ '\.tar$' 544*3577c6faSBram Moolenaar" call Decho("dearchive: attempt to untar ".sname) 545*3577c6faSBram Moolenaar exe "silent !tar -xvf ".s:Escape(sname) 546*3577c6faSBram Moolenaar elseif sname =~ '\.vba$' 547*3577c6faSBram Moolenaar" call Decho("dearchive: attempt to handle a vimball: ".sname) 548*3577c6faSBram Moolenaar silent 1split 549*3577c6faSBram Moolenaar exe "silent e ".fnameescape(sname) 550*3577c6faSBram Moolenaar silent so % 551*3577c6faSBram Moolenaar silent q 552*3577c6faSBram Moolenaar endif 553*3577c6faSBram Moolenaar 554*3577c6faSBram Moolenaar if sname =~ '.vim$' 555*3577c6faSBram Moolenaar" call Decho("dearchive: attempt to simply move ".sname." to plugin") 556*3577c6faSBram Moolenaar exe "silent !".g:GetLatestVimScripts_mv." ".s:Escape(sname)." plugin" 557*3577c6faSBram Moolenaar else 558*3577c6faSBram Moolenaar" call Decho("dearchive: move <".sname."> to installdir<".installdir.">") 559*3577c6faSBram Moolenaar exe "silent !".g:GetLatestVimScripts_mv." ".s:Escape(sname)." ".installdir 560*3577c6faSBram Moolenaar endif 561*3577c6faSBram Moolenaar 562*3577c6faSBram Moolenaar " helptags step 563*3577c6faSBram Moolenaar let docdir= substitute(&rtp,',.*','','e')."/doc" 564*3577c6faSBram Moolenaar" call Decho("helptags: docdir<".docdir.">") 565*3577c6faSBram Moolenaar exe "helptags ".fnameescape(docdir) 566*3577c6faSBram Moolenaar exe "cd ".fnameescape(curdir) 567*3577c6faSBram Moolenaar endif 568*3577c6faSBram Moolenaar if fname !~ ':AutoInstall:' 569*3577c6faSBram Moolenaar let modline=scriptid." ".latestsrcid." :AutoInstall: ".fname.cmmnt 570*3577c6faSBram Moolenaar else 571*3577c6faSBram Moolenaar let modline=scriptid." ".latestsrcid." ".fname.cmmnt 572*3577c6faSBram Moolenaar endif 573*3577c6faSBram Moolenaar else 574*3577c6faSBram Moolenaar let modline=scriptid." ".latestsrcid." ".fname.cmmnt 575*3577c6faSBram Moolenaar endif 576*3577c6faSBram Moolenaar 577*3577c6faSBram Moolenaar " update the data in the <GetLatestVimScripts.dat> file 578*3577c6faSBram Moolenaar call setline(line("."),modline) 579*3577c6faSBram Moolenaar" call Decho("update data in ".expand("%")."#".line(".").": modline<".modline.">") 580*3577c6faSBram Moolenaar" else " Decho 581*3577c6faSBram Moolenaar" call Decho("[latestsrcid=".latestsrcid."] <= [srcid=".srcid."], no need to update") 582*3577c6faSBram Moolenaar endif 583*3577c6faSBram Moolenaar 584*3577c6faSBram Moolenaar " restore options 585*3577c6faSBram Moolenaar let &t_ti = t_ti 586*3577c6faSBram Moolenaar let &t_te = t_te 587*3577c6faSBram Moolenaar let &rs = rs 588*3577c6faSBram Moolenaar let @a = rega 589*3577c6faSBram Moolenaar" call Dredir("BUFFER TEST (GetOneScript)","ls!") 590*3577c6faSBram Moolenaar 591*3577c6faSBram Moolenaar" call Dret("GetOneScript") 592*3577c6faSBram Moolenaarendfun 593*3577c6faSBram Moolenaar 594*3577c6faSBram Moolenaar" --------------------------------------------------------------------- 595*3577c6faSBram Moolenaar" s:Escape: makes a string safe&suitable for the shell {{{2 596*3577c6faSBram Moolenaarfun! s:Escape(name) 597*3577c6faSBram Moolenaar" call Dfunc("s:Escape(name<".a:name.">)") 598*3577c6faSBram Moolenaar if exists("*shellescape") 599*3577c6faSBram Moolenaar " shellescape() was added by patch 7.0.111 600*3577c6faSBram Moolenaar let name= shellescape(a:name) 601*3577c6faSBram Moolenaar else 602*3577c6faSBram Moolenaar let name= g:getscript_shq . a:name . g:getscript_shq 603*3577c6faSBram Moolenaar endif 604*3577c6faSBram Moolenaar" call Dret("s:Escape ".name) 605*3577c6faSBram Moolenaar return name 606*3577c6faSBram Moolenaarendfun 607*3577c6faSBram Moolenaar 608*3577c6faSBram Moolenaar" --------------------------------------------------------------------- 6099964e468SBram Moolenaar" Restore Options: {{{1 6109964e468SBram Moolenaarlet &cpo= s:keepcpo 611*3577c6faSBram Moolenaarunlet s:keepcpo 6129964e468SBram Moolenaar 613*3577c6faSBram Moolenaar" --------------------------------------------------------------------- 614*3577c6faSBram Moolenaar" Modelines: {{{1 6159964e468SBram Moolenaar" vim: ts=8 sts=2 fdm=marker nowrap 616