19964e468SBram Moolenaar" --------------------------------------------------------------------- 29964e468SBram Moolenaar" getscript.vim 3ff034194SBram Moolenaar" Author: Charles E. Campbell 48d043171SBram Moolenaar" Date: Jan 21, 2014 58d043171SBram Moolenaar" Version: 36 69964e468SBram Moolenaar" Installing: :help glvs-install 79964e468SBram Moolenaar" Usage: :help glvs 89964e468SBram Moolenaar" 99964e468SBram Moolenaar" GetLatestVimScripts: 642 1 :AutoInstall: getscript.vim 109e368dbaSBram Moolenaar"redraw!|call inputsave()|call input("Press <cr> to continue")|call inputrestore() 119964e468SBram Moolenaar" --------------------------------------------------------------------- 129964e468SBram Moolenaar" Initialization: {{{1 139964e468SBram Moolenaar" if you're sourcing this file, surely you can't be 143577c6faSBram Moolenaar" expecting vim to be in its vi-compatible mode! 155c73622aSBram Moolenaarif exists("g:loaded_getscript") 165c73622aSBram Moolenaar finish 175c73622aSBram Moolenaarendif 188d043171SBram Moolenaarlet g:loaded_getscript= "v36" 199964e468SBram Moolenaarif &cp 209964e468SBram Moolenaar echoerr "GetLatestVimScripts is not vi-compatible; not loaded (you need to set nocp)" 219964e468SBram Moolenaar finish 229964e468SBram Moolenaarendif 235c73622aSBram Moolenaarif v:version < 702 245c73622aSBram Moolenaar echohl WarningMsg 252963456fSBram Moolenaar echo "***warning*** this version of GetLatestVimScripts needs vim 7.2" 265c73622aSBram Moolenaar echohl Normal 275c73622aSBram Moolenaar finish 285c73622aSBram Moolenaarendif 299964e468SBram Moolenaarlet s:keepcpo = &cpo 309964e468SBram Moolenaarset cpo&vim 3182038d73SBram Moolenaar"DechoTabOn 329964e468SBram Moolenaar 333577c6faSBram Moolenaar" --------------------------- 349964e468SBram Moolenaar" Global Variables: {{{1 353577c6faSBram Moolenaar" --------------------------- 363577c6faSBram Moolenaar" Cygwin Detection ------- {{{2 373577c6faSBram Moolenaarif !exists("g:getscript_cygwin") 383577c6faSBram Moolenaar if has("win32") || has("win95") || has("win64") || has("win16") 393577c6faSBram Moolenaar if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$' 403577c6faSBram Moolenaar let g:getscript_cygwin= 1 413577c6faSBram Moolenaar else 423577c6faSBram Moolenaar let g:getscript_cygwin= 0 433577c6faSBram Moolenaar endif 443577c6faSBram Moolenaar else 453577c6faSBram Moolenaar let g:getscript_cygwin= 0 463577c6faSBram Moolenaar endif 473577c6faSBram Moolenaarendif 483577c6faSBram Moolenaar 493577c6faSBram Moolenaar" wget vs curl {{{2 509964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_wget") 519964e468SBram Moolenaar if executable("wget") 529964e468SBram Moolenaar let g:GetLatestVimScripts_wget= "wget" 539964e468SBram Moolenaar elseif executable("curl") 549964e468SBram Moolenaar let g:GetLatestVimScripts_wget= "curl" 559964e468SBram Moolenaar else 569964e468SBram Moolenaar let g:GetLatestVimScripts_wget = 'echo "GetLatestVimScripts needs wget or curl"' 579964e468SBram Moolenaar let g:GetLatestVimScripts_options = "" 589964e468SBram Moolenaar endif 599964e468SBram Moolenaarendif 609964e468SBram Moolenaar 619964e468SBram Moolenaar" options that wget and curl require: 629964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_options") 639964e468SBram Moolenaar if g:GetLatestVimScripts_wget == "wget" 649964e468SBram Moolenaar let g:GetLatestVimScripts_options= "-q -O" 659964e468SBram Moolenaar elseif g:GetLatestVimScripts_wget == "curl" 669964e468SBram Moolenaar let g:GetLatestVimScripts_options= "-s -O" 679964e468SBram Moolenaar else 689964e468SBram Moolenaar let g:GetLatestVimScripts_options= "" 699964e468SBram Moolenaar endif 709964e468SBram Moolenaarendif 719964e468SBram Moolenaar 729964e468SBram Moolenaar" by default, allow autoinstall lines to work 739964e468SBram Moolenaarif !exists("g:GetLatestVimScripts_allowautoinstall") 749964e468SBram Moolenaar let g:GetLatestVimScripts_allowautoinstall= 1 759964e468SBram Moolenaarendif 769964e468SBram Moolenaar 77ff034194SBram Moolenaar" set up default scriptaddr address 78ff034194SBram Moolenaarif !exists("g:GetLatestVimScripts_scriptaddr") 79ff034194SBram Moolenaar let g:GetLatestVimScripts_scriptaddr = 'http://vim.sourceforge.net/script.php?script_id=' 80ff034194SBram Moolenaarendif 81ff034194SBram Moolenaar 829964e468SBram Moolenaar"" For debugging: 839964e468SBram Moolenaar"let g:GetLatestVimScripts_wget = "echo" 849964e468SBram Moolenaar"let g:GetLatestVimScripts_options = "options" 859964e468SBram Moolenaar 869964e468SBram Moolenaar" --------------------------------------------------------------------- 879964e468SBram Moolenaar" Check If AutoInstall Capable: {{{1 889964e468SBram Moolenaarlet s:autoinstall= "" 899964e468SBram Moolenaarif g:GetLatestVimScripts_allowautoinstall 909964e468SBram Moolenaar 919964e468SBram Moolenaar if (has("win32") || has("gui_win32") || has("gui_win32s") || has("win16") || has("win64") || has("win32unix") || has("win95")) && &shell != "bash" 929964e468SBram Moolenaar " windows (but not cygwin/bash) 939964e468SBram Moolenaar let s:dotvim= "vimfiles" 949964e468SBram Moolenaar if !exists("g:GetLatestVimScripts_mv") 959964e468SBram Moolenaar let g:GetLatestVimScripts_mv= "ren" 969964e468SBram Moolenaar endif 979964e468SBram Moolenaar 989964e468SBram Moolenaar else 999964e468SBram Moolenaar " unix 1009964e468SBram Moolenaar let s:dotvim= ".vim" 1019964e468SBram Moolenaar if !exists("g:GetLatestVimScripts_mv") 1029964e468SBram Moolenaar let g:GetLatestVimScripts_mv= "mv" 1039964e468SBram Moolenaar endif 1049964e468SBram Moolenaar endif 1059964e468SBram Moolenaar 1065c73622aSBram Moolenaar if exists("g:GetLatestVimScripts_autoinstalldir") && isdirectory(g:GetLatestVimScripts_autoinstalldir) 1075c73622aSBram Moolenaar let s:autoinstall= g:GetLatestVimScripts_autoinstalldir" 1085c73622aSBram Moolenaar elseif exists('$HOME') && isdirectory(expand("$HOME")."/".s:dotvim) 1099964e468SBram Moolenaar let s:autoinstall= $HOME."/".s:dotvim 1109964e468SBram Moolenaar endif 1119964e468SBram Moolenaar" call Decho("s:autoinstall<".s:autoinstall.">") 1129964e468SBram Moolenaar"else "Decho 1139964e468SBram Moolenaar" call Decho("g:GetLatestVimScripts_allowautoinstall=".g:GetLatestVimScripts_allowautoinstall.": :AutoInstall: disabled") 1149964e468SBram Moolenaarendif 1159964e468SBram Moolenaar 1169964e468SBram Moolenaar" --------------------------------------------------------------------- 1179964e468SBram Moolenaar" Public Interface: {{{1 1189964e468SBram Moolenaarcom! -nargs=0 GetLatestVimScripts call getscript#GetLatestVimScripts() 1199964e468SBram Moolenaarcom! -nargs=0 GetScript call getscript#GetLatestVimScripts() 1209964e468SBram Moolenaarsilent! com -nargs=0 GLVS call getscript#GetLatestVimScripts() 1219964e468SBram Moolenaar 1229964e468SBram Moolenaar" --------------------------------------------------------------------- 1239964e468SBram Moolenaar" GetLatestVimScripts: this function gets the latest versions of {{{1 1249964e468SBram Moolenaar" scripts based on the list in 1259964e468SBram Moolenaar" (first dir in runtimepath)/GetLatest/GetLatestVimScripts.dat 1269964e468SBram Moolenaarfun! getscript#GetLatestVimScripts() 1279964e468SBram Moolenaar" call Dfunc("GetLatestVimScripts() autoinstall<".s:autoinstall.">") 1289964e468SBram Moolenaar 1299964e468SBram Moolenaar" insure that wget is executable 1309964e468SBram Moolenaar if executable(g:GetLatestVimScripts_wget) != 1 1319964e468SBram Moolenaar echoerr "GetLatestVimScripts needs ".g:GetLatestVimScripts_wget." which apparently is not available on your system" 132*6c391a74SBram Moolenaar" call Dret("GetLatestVimScripts : wget not executable/available") 1339964e468SBram Moolenaar return 1349964e468SBram Moolenaar endif 1359964e468SBram Moolenaar 136c236c16dSBram Moolenaar " insure that fnameescape() is available 137c236c16dSBram Moolenaar if !exists("*fnameescape") 138c236c16dSBram Moolenaar echoerr "GetLatestVimScripts needs fnameescape() (provided by 7.1.299 or later)" 139c236c16dSBram Moolenaar return 140c236c16dSBram Moolenaar endif 141c236c16dSBram Moolenaar 1429964e468SBram Moolenaar " Find the .../GetLatest subdirectory under the runtimepath 1439964e468SBram Moolenaar for datadir in split(&rtp,',') + [''] 1449964e468SBram Moolenaar if isdirectory(datadir."/GetLatest") 1459964e468SBram Moolenaar" call Decho("found directory<".datadir.">") 1469964e468SBram Moolenaar let datadir= datadir . "/GetLatest" 1479964e468SBram Moolenaar break 1489964e468SBram Moolenaar endif 1499964e468SBram Moolenaar if filereadable(datadir."GetLatestVimScripts.dat") 1509964e468SBram Moolenaar" call Decho("found ".datadir."/GetLatestVimScripts.dat") 1519964e468SBram Moolenaar break 1529964e468SBram Moolenaar endif 1539964e468SBram Moolenaar endfor 15482038d73SBram Moolenaar 1559964e468SBram Moolenaar " Sanity checks: readability and writability 1569964e468SBram Moolenaar if datadir == "" 1579964e468SBram Moolenaar echoerr 'Missing "GetLatest/" on your runtimepath - see :help glvs-dist-install' 1589964e468SBram Moolenaar" call Dret("GetLatestVimScripts : unable to find a GetLatest subdirectory") 1599964e468SBram Moolenaar return 1609964e468SBram Moolenaar endif 1619964e468SBram Moolenaar if filewritable(datadir) != 2 1629964e468SBram Moolenaar echoerr "(getLatestVimScripts) Your ".datadir." isn't writable" 1639964e468SBram Moolenaar" call Dret("GetLatestVimScripts : non-writable directory<".datadir.">") 1649964e468SBram Moolenaar return 1659964e468SBram Moolenaar endif 1669964e468SBram Moolenaar let datafile= datadir."/GetLatestVimScripts.dat" 1679964e468SBram Moolenaar if !filereadable(datafile) 1689964e468SBram Moolenaar echoerr "Your data file<".datafile."> isn't readable" 1699964e468SBram Moolenaar" call Dret("GetLatestVimScripts : non-readable datafile<".datafile.">") 1709964e468SBram Moolenaar return 1719964e468SBram Moolenaar endif 1729964e468SBram Moolenaar if !filewritable(datafile) 1739964e468SBram Moolenaar echoerr "Your data file<".datafile."> isn't writable" 1749964e468SBram Moolenaar" call Dret("GetLatestVimScripts : non-writable datafile<".datafile.">") 1759964e468SBram Moolenaar return 1769964e468SBram Moolenaar endif 1775c73622aSBram Moolenaar " -------------------- 1785c73622aSBram Moolenaar " Passed sanity checks 1795c73622aSBram Moolenaar " -------------------- 1805c73622aSBram Moolenaar 1819964e468SBram Moolenaar" call Decho("datadir <".datadir.">") 1829964e468SBram Moolenaar" call Decho("datafile <".datafile.">") 1839964e468SBram Moolenaar 1845c73622aSBram Moolenaar " don't let any event handlers interfere (like winmanager's, taglist's, etc) 1859964e468SBram Moolenaar let eikeep = &ei 186c236c16dSBram Moolenaar let hlskeep = &hls 1875c73622aSBram Moolenaar let acdkeep = &acd 1885c73622aSBram Moolenaar set ei=all hls&vim noacd 1899964e468SBram Moolenaar 1905c73622aSBram Moolenaar " Edit the datafile (ie. GetLatestVimScripts.dat): 1915c73622aSBram Moolenaar " 1. record current directory (origdir), 1925c73622aSBram Moolenaar " 2. change directory to datadir, 1935c73622aSBram Moolenaar " 3. split window 1945c73622aSBram Moolenaar " 4. edit datafile 1959964e468SBram Moolenaar let origdir= getcwd() 1963577c6faSBram Moolenaar" call Decho("exe cd ".fnameescape(substitute(datadir,'\','/','ge'))) 1973577c6faSBram Moolenaar exe "cd ".fnameescape(substitute(datadir,'\','/','ge')) 1989964e468SBram Moolenaar split 1993577c6faSBram Moolenaar" call Decho("exe e ".fnameescape(substitute(datafile,'\','/','ge'))) 2003577c6faSBram Moolenaar exe "e ".fnameescape(substitute(datafile,'\','/','ge')) 2019964e468SBram Moolenaar res 1000 2029964e468SBram Moolenaar let s:downloads = 0 2039964e468SBram Moolenaar let s:downerrors= 0 2049964e468SBram Moolenaar 2059964e468SBram Moolenaar " Check on dependencies mentioned in plugins 2069964e468SBram Moolenaar" call Decho(" ") 2079964e468SBram Moolenaar" call Decho("searching plugins for GetLatestVimScripts dependencies") 2089964e468SBram Moolenaar let lastline = line("$") 20982038d73SBram Moolenaar" call Decho("lastline#".lastline) 2105c73622aSBram Moolenaar let firstdir = substitute(&rtp,',.*$','','') 2118d043171SBram Moolenaar let plugins = split(globpath(firstdir,"plugin/**/*.vim"),'\n') 2128d043171SBram Moolenaar let plugins = plugins + split(globpath(firstdir,"AsNeeded/**/*.vim"),'\n') 2139964e468SBram Moolenaar let foundscript = 0 2149964e468SBram Moolenaar 2155c73622aSBram Moolenaar " this loop updates the GetLatestVimScripts.dat file 2165c73622aSBram Moolenaar " with dependencies explicitly mentioned in the plugins 2175c73622aSBram Moolenaar " via GetLatestVimScripts: ... lines 2185c73622aSBram Moolenaar " It reads the plugin script at the end of the GetLatestVimScripts.dat 2195c73622aSBram Moolenaar " file, examines it, and then removes it. 22082038d73SBram Moolenaar for plugin in plugins 2215c73622aSBram Moolenaar" call Decho(" ") 2223577c6faSBram Moolenaar" call Decho("plugin<".plugin.">") 22382038d73SBram Moolenaar 22482038d73SBram Moolenaar " read plugin in 2253577c6faSBram Moolenaar " evidently a :r creates a new buffer (the "#" buffer) that is subsequently unused -- bwiping it 2269964e468SBram Moolenaar $ 2279964e468SBram Moolenaar" call Decho(".dependency checking<".plugin."> line$=".line("$")) 2285c73622aSBram Moolenaar" call Decho("..exe silent r ".fnameescape(plugin)) 2293577c6faSBram Moolenaar exe "silent r ".fnameescape(plugin) 2303577c6faSBram Moolenaar exe "silent bwipe ".bufnr("#") 23182038d73SBram Moolenaar 2329964e468SBram Moolenaar while search('^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+','W') != 0 2335c73622aSBram Moolenaar let depscript = substitute(getline("."),'^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+\s\+\(.*\)$','\1','e') 2345c73622aSBram Moolenaar let depscriptid = substitute(getline("."),'^"\s\+GetLatestVimScripts:\s\+\(\d\+\)\s\+.*$','\1','') 2359964e468SBram Moolenaar let llp1 = lastline+1 2365c73622aSBram Moolenaar" call Decho("..depscript<".depscript.">") 2379964e468SBram Moolenaar 2385c73622aSBram Moolenaar " found a "GetLatestVimScripts: # #" line in the script; 2398024f936SBram Moolenaar " check if it's already in the datafile by searching backwards from llp1, 2405c73622aSBram Moolenaar " the (prior to reading in the plugin script) last line plus one of the GetLatestVimScripts.dat file, 2415c73622aSBram Moolenaar " for the script-id with no wrapping allowed. 2429964e468SBram Moolenaar let curline = line(".") 2435c73622aSBram Moolenaar let noai_script = substitute(depscript,'\s*:AutoInstall:\s*','','e') 2449964e468SBram Moolenaar exe llp1 2455c73622aSBram Moolenaar let srchline = search('^\s*'.depscriptid.'\s\+\d\+\s\+.*$','bW') 2465c73622aSBram Moolenaar if srchline == 0 2475c73622aSBram Moolenaar " this second search is taken when, for example, a 0 0 scriptname is to be skipped over 2489964e468SBram Moolenaar let srchline= search('\<'.noai_script.'\>','bW') 2495c73622aSBram Moolenaar endif 2505c73622aSBram Moolenaar" call Decho("..noai_script<".noai_script."> depscriptid#".depscriptid." srchline#".srchline." curline#".line(".")." lastline#".lastline) 2519964e468SBram Moolenaar 2529964e468SBram Moolenaar if srchline == 0 2539964e468SBram Moolenaar " found a new script to permanently include in the datafile 2549964e468SBram Moolenaar let keep_rega = @a 2559964e468SBram Moolenaar let @a = substitute(getline(curline),'^"\s\+GetLatestVimScripts:\s\+','','') 2565c73622aSBram Moolenaar echomsg "Appending <".@a."> to ".datafile." for ".depscript 2575c73622aSBram Moolenaar" call Decho("..Appending <".@a."> to ".datafile." for ".depscript) 2589964e468SBram Moolenaar exe lastline."put a" 2599964e468SBram Moolenaar let @a = keep_rega 2609964e468SBram Moolenaar let lastline = llp1 2619964e468SBram Moolenaar let curline = curline + 1 2629964e468SBram Moolenaar let foundscript = foundscript + 1 2639964e468SBram Moolenaar" else " Decho 2649964e468SBram Moolenaar" call Decho("..found <".noai_script."> (already in datafile at line#".srchline.")") 2659964e468SBram Moolenaar endif 2669964e468SBram Moolenaar 2679964e468SBram Moolenaar let curline = curline + 1 2689964e468SBram Moolenaar exe curline 2699964e468SBram Moolenaar endwhile 27082038d73SBram Moolenaar 2715c73622aSBram Moolenaar " llp1: last line plus one 2729964e468SBram Moolenaar let llp1= lastline + 1 2739964e468SBram Moolenaar" call Decho(".deleting lines: ".llp1.",$d") 2749964e468SBram Moolenaar exe "silent! ".llp1.",$d" 27582038d73SBram Moolenaar endfor 27682038d73SBram Moolenaar" call Decho("--- end dependency checking loop --- foundscript=".foundscript) 27782038d73SBram Moolenaar" call Decho(" ") 2783577c6faSBram Moolenaar" call Dredir("BUFFER TEST (GetLatestVimScripts 1)","ls!") 2799964e468SBram Moolenaar 2809964e468SBram Moolenaar if foundscript == 0 2813577c6faSBram Moolenaar setlocal nomod 2829964e468SBram Moolenaar endif 2839964e468SBram Moolenaar 2845c73622aSBram Moolenaar " -------------------------------------------------------------------- 2859964e468SBram Moolenaar " Check on out-of-date scripts using GetLatest/GetLatestVimScripts.dat 2865c73622aSBram Moolenaar " -------------------------------------------------------------------- 28782038d73SBram Moolenaar" call Decho("begin: checking out-of-date scripts using datafile<".datafile.">") 2883577c6faSBram Moolenaar setlocal lz 2899964e468SBram Moolenaar 1 29082038d73SBram Moolenaar" /^-----/,$g/^\s*\d/call Decho(getline(".")) 29182038d73SBram Moolenaar 1 29282038d73SBram Moolenaar /^-----/,$g/^\s*\d/call s:GetOneScript() 29382038d73SBram Moolenaar" call Decho("--- end out-of-date checking --- ") 2949964e468SBram Moolenaar 2959964e468SBram Moolenaar " Final report (an echomsg) 2969964e468SBram Moolenaar try 2979964e468SBram Moolenaar silent! ?^-------? 2989964e468SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E114/ 2999964e468SBram Moolenaar" call Dret("GetLatestVimScripts : nothing done!") 3009964e468SBram Moolenaar return 3019964e468SBram Moolenaar endtry 3029964e468SBram Moolenaar exe "norm! kz\<CR>" 3039964e468SBram Moolenaar redraw! 3049964e468SBram Moolenaar let s:msg = "" 3059964e468SBram Moolenaar if s:downloads == 1 3069964e468SBram Moolenaar let s:msg = "Downloaded one updated script to <".datadir.">" 3079964e468SBram Moolenaar elseif s:downloads == 2 3089964e468SBram Moolenaar let s:msg= "Downloaded two updated scripts to <".datadir.">" 3099964e468SBram Moolenaar elseif s:downloads > 1 3109964e468SBram Moolenaar let s:msg= "Downloaded ".s:downloads." updated scripts to <".datadir.">" 3119964e468SBram Moolenaar else 3129964e468SBram Moolenaar let s:msg= "Everything was already current" 3139964e468SBram Moolenaar endif 3149964e468SBram Moolenaar if s:downerrors > 0 3159964e468SBram Moolenaar let s:msg= s:msg." (".s:downerrors." downloading errors)" 3169964e468SBram Moolenaar endif 3179964e468SBram Moolenaar echomsg s:msg 3189964e468SBram Moolenaar " save the file 3199964e468SBram Moolenaar if &mod 3209964e468SBram Moolenaar silent! w! 3219964e468SBram Moolenaar endif 322ff034194SBram Moolenaar q! 3239964e468SBram Moolenaar 3249964e468SBram Moolenaar " restore events and current directory 3253577c6faSBram Moolenaar exe "cd ".fnameescape(substitute(origdir,'\','/','ge')) 3269964e468SBram Moolenaar let &ei = eikeep 327c236c16dSBram Moolenaar let &hls = hlskeep 3285c73622aSBram Moolenaar let &acd = acdkeep 3293577c6faSBram Moolenaar setlocal nolz 3303577c6faSBram Moolenaar" call Dredir("BUFFER TEST (GetLatestVimScripts 2)","ls!") 3319964e468SBram Moolenaar" call Dret("GetLatestVimScripts : did ".s:downloads." downloads") 3329964e468SBram Moolenaarendfun 3339964e468SBram Moolenaar 3343577c6faSBram Moolenaar" --------------------------------------------------------------------- 3353577c6faSBram Moolenaar" GetOneScript: (Get Latest Vim Script) this function operates {{{1 3363577c6faSBram Moolenaar" on the current line, interpreting two numbers and text as 3373577c6faSBram Moolenaar" ScriptID, SourceID, and Filename. 3385c73622aSBram Moolenaar" It downloads any scripts that have newer versions from vim.sourceforge.net. 3393577c6faSBram Moolenaarfun! s:GetOneScript(...) 3403577c6faSBram Moolenaar" call Dfunc("GetOneScript()") 3413577c6faSBram Moolenaar 3423577c6faSBram Moolenaar " set options to allow progress to be shown on screen 3433577c6faSBram Moolenaar let rega= @a 3443577c6faSBram Moolenaar let t_ti= &t_ti 3453577c6faSBram Moolenaar let t_te= &t_te 3463577c6faSBram Moolenaar let rs = &rs 3473577c6faSBram Moolenaar set t_ti= t_te= nors 3483577c6faSBram Moolenaar 3493577c6faSBram Moolenaar " put current line on top-of-screen and interpret it into 350*6c391a74SBram Moolenaar " a script identifier : used to obtain webpage 3513577c6faSBram Moolenaar " source identifier : used to identify current version 3523577c6faSBram Moolenaar " and an associated comment: used to report on what's being considered 3533577c6faSBram Moolenaar if a:0 >= 3 3543577c6faSBram Moolenaar let scriptid = a:1 3553577c6faSBram Moolenaar let srcid = a:2 3563577c6faSBram Moolenaar let fname = a:3 3573577c6faSBram Moolenaar let cmmnt = "" 3583577c6faSBram Moolenaar" call Decho("scriptid<".scriptid.">") 3593577c6faSBram Moolenaar" call Decho("srcid <".srcid.">") 3603577c6faSBram Moolenaar" call Decho("fname <".fname.">") 3613577c6faSBram Moolenaar else 3623577c6faSBram Moolenaar let curline = getline(".") 3633577c6faSBram Moolenaar if curline =~ '^\s*#' 3643577c6faSBram Moolenaar let @a= rega 3653577c6faSBram Moolenaar" call Dret("GetOneScript : skipping a pure comment line") 3663577c6faSBram Moolenaar return 3673577c6faSBram Moolenaar endif 3683577c6faSBram Moolenaar let parsepat = '^\s*\(\d\+\)\s\+\(\d\+\)\s\+\(.\{-}\)\(\s*#.*\)\=$' 3693577c6faSBram Moolenaar try 3703577c6faSBram Moolenaar let scriptid = substitute(curline,parsepat,'\1','e') 3713577c6faSBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 3723577c6faSBram Moolenaar let scriptid= 0 3733577c6faSBram Moolenaar endtry 3743577c6faSBram Moolenaar try 3753577c6faSBram Moolenaar let srcid = substitute(curline,parsepat,'\2','e') 3763577c6faSBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 3773577c6faSBram Moolenaar let srcid= 0 3783577c6faSBram Moolenaar endtry 3793577c6faSBram Moolenaar try 3803577c6faSBram Moolenaar let fname= substitute(curline,parsepat,'\3','e') 3813577c6faSBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 3823577c6faSBram Moolenaar let fname= "" 3833577c6faSBram Moolenaar endtry 3843577c6faSBram Moolenaar try 3853577c6faSBram Moolenaar let cmmnt= substitute(curline,parsepat,'\4','e') 3863577c6faSBram Moolenaar catch /^Vim\%((\a\+)\)\=:E486/ 3873577c6faSBram Moolenaar let cmmnt= "" 3883577c6faSBram Moolenaar endtry 3893577c6faSBram Moolenaar" call Decho("curline <".curline.">") 3903577c6faSBram Moolenaar" call Decho("parsepat<".parsepat.">") 3913577c6faSBram Moolenaar" call Decho("scriptid<".scriptid.">") 3923577c6faSBram Moolenaar" call Decho("srcid <".srcid.">") 3933577c6faSBram Moolenaar" call Decho("fname <".fname.">") 3943577c6faSBram Moolenaar endif 3953577c6faSBram Moolenaar 3965c73622aSBram Moolenaar " plugin author protection from downloading his/her own scripts atop their latest work 3973577c6faSBram Moolenaar if scriptid == 0 || srcid == 0 3983577c6faSBram Moolenaar " When looking for :AutoInstall: lines, skip scripts that have 0 0 scriptname 3993577c6faSBram Moolenaar let @a= rega 4003577c6faSBram Moolenaar" call Dret("GetOneScript : skipping a scriptid==srcid==0 line") 4013577c6faSBram Moolenaar return 4023577c6faSBram Moolenaar endif 4033577c6faSBram Moolenaar 4043577c6faSBram Moolenaar let doautoinstall= 0 4053577c6faSBram Moolenaar if fname =~ ":AutoInstall:" 4063577c6faSBram Moolenaar" call Decho("case AutoInstall: fname<".fname.">") 4073577c6faSBram Moolenaar let aicmmnt= substitute(fname,'\s\+:AutoInstall:\s\+',' ','') 4083577c6faSBram Moolenaar" call Decho("aicmmnt<".aicmmnt."> s:autoinstall=".s:autoinstall) 4093577c6faSBram Moolenaar if s:autoinstall != "" 4103577c6faSBram Moolenaar let doautoinstall = g:GetLatestVimScripts_allowautoinstall 4113577c6faSBram Moolenaar endif 4123577c6faSBram Moolenaar else 4133577c6faSBram Moolenaar let aicmmnt= fname 4143577c6faSBram Moolenaar endif 4153577c6faSBram Moolenaar" call Decho("aicmmnt<".aicmmnt.">: doautoinstall=".doautoinstall) 4163577c6faSBram Moolenaar 4173577c6faSBram Moolenaar exe "norm z\<CR>" 4183577c6faSBram Moolenaar redraw! 4193577c6faSBram Moolenaar" call Decho('considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid) 4203577c6faSBram Moolenaar echo 'considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid 4213577c6faSBram Moolenaar 4225c73622aSBram Moolenaar " grab a copy of the plugin's vim.sourceforge.net webpage 423ff034194SBram Moolenaar let scriptaddr = g:GetLatestVimScripts_scriptaddr.scriptid 4243577c6faSBram Moolenaar let tmpfile = tempname() 4253577c6faSBram Moolenaar let v:errmsg = "" 4263577c6faSBram Moolenaar 4273577c6faSBram Moolenaar " make up to three tries at downloading the description 4283577c6faSBram Moolenaar let itry= 1 4293577c6faSBram Moolenaar while itry <= 3 4305c73622aSBram Moolenaar" call Decho(".try#".itry." to download description of <".aicmmnt."> with addr=".scriptaddr) 4313577c6faSBram Moolenaar if has("win32") || has("win16") || has("win95") 4325c73622aSBram Moolenaar" call Decho(".new|exe silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(tmpfile).' '.shellescape(scriptaddr)."|bw!") 4335c73622aSBram Moolenaar new|exe "silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(tmpfile).' '.shellescape(scriptaddr)|bw! 4343577c6faSBram Moolenaar else 4355c73622aSBram Moolenaar" call Decho(".exe silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(tmpfile)." ".shellescape(scriptaddr)) 4365c73622aSBram Moolenaar exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(tmpfile)." ".shellescape(scriptaddr) 4373577c6faSBram Moolenaar endif 4383577c6faSBram Moolenaar if itry == 1 4393577c6faSBram Moolenaar exe "silent vsplit ".fnameescape(tmpfile) 4403577c6faSBram Moolenaar else 4413577c6faSBram Moolenaar silent! e % 4423577c6faSBram Moolenaar endif 4433577c6faSBram Moolenaar setlocal bh=wipe 4443577c6faSBram Moolenaar 4453577c6faSBram Moolenaar " find the latest source-id in the plugin's webpage 4463577c6faSBram Moolenaar silent! 1 4473577c6faSBram Moolenaar let findpkg= search('Click on the package to download','W') 4483577c6faSBram Moolenaar if findpkg > 0 4493577c6faSBram Moolenaar break 4503577c6faSBram Moolenaar endif 4513577c6faSBram Moolenaar let itry= itry + 1 4523577c6faSBram Moolenaar endwhile 4533577c6faSBram Moolenaar" call Decho(" --- end downloading tries while loop --- itry=".itry) 4543577c6faSBram Moolenaar 4553577c6faSBram Moolenaar " testing: did finding "Click on the package..." fail? 4563577c6faSBram Moolenaar if findpkg == 0 || itry >= 4 4573577c6faSBram Moolenaar silent q! 4583577c6faSBram Moolenaar call delete(tmpfile) 4593577c6faSBram Moolenaar " restore options 4603577c6faSBram Moolenaar let &t_ti = t_ti 4613577c6faSBram Moolenaar let &t_te = t_te 4623577c6faSBram Moolenaar let &rs = rs 4633577c6faSBram Moolenaar let s:downerrors = s:downerrors + 1 4643577c6faSBram Moolenaar" call Decho("***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">") 4653577c6faSBram Moolenaar echomsg "***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">" 4663577c6faSBram Moolenaar" call Dret("GetOneScript : srch for /Click on the package/ failed") 4673577c6faSBram Moolenaar let @a= rega 4683577c6faSBram Moolenaar return 4693577c6faSBram Moolenaar endif 4703577c6faSBram Moolenaar" call Decho('found "Click on the package to download"') 4713577c6faSBram Moolenaar 4723577c6faSBram Moolenaar let findsrcid= search('src_id=','W') 4733577c6faSBram Moolenaar if findsrcid == 0 4743577c6faSBram Moolenaar silent q! 4753577c6faSBram Moolenaar call delete(tmpfile) 4763577c6faSBram Moolenaar " restore options 4773577c6faSBram Moolenaar let &t_ti = t_ti 4783577c6faSBram Moolenaar let &t_te = t_te 4793577c6faSBram Moolenaar let &rs = rs 4803577c6faSBram Moolenaar let s:downerrors = s:downerrors + 1 4813577c6faSBram Moolenaar" call Decho("***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">") 4823577c6faSBram Moolenaar echomsg "***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">" 4833577c6faSBram Moolenaar let @a= rega 4843577c6faSBram Moolenaar" call Dret("GetOneScript : srch for /src_id/ failed") 4853577c6faSBram Moolenaar return 4863577c6faSBram Moolenaar endif 4873577c6faSBram Moolenaar" call Decho('found "src_id=" in description page') 4883577c6faSBram Moolenaar 4893577c6faSBram Moolenaar let srcidpat = '^\s*<td class.*src_id=\(\d\+\)">\([^<]\+\)<.*$' 4903577c6faSBram Moolenaar let latestsrcid= substitute(getline("."),srcidpat,'\1','') 4913577c6faSBram Moolenaar let sname = substitute(getline("."),srcidpat,'\2','') " script name actually downloaded 4923577c6faSBram Moolenaar" call Decho("srcidpat<".srcidpat."> latestsrcid<".latestsrcid."> sname<".sname.">") 4933577c6faSBram Moolenaar silent q! 4943577c6faSBram Moolenaar call delete(tmpfile) 4953577c6faSBram Moolenaar 4963577c6faSBram Moolenaar " convert the strings-of-numbers into numbers 4973577c6faSBram Moolenaar let srcid = srcid + 0 4983577c6faSBram Moolenaar let latestsrcid = latestsrcid + 0 4993577c6faSBram Moolenaar" call Decho("srcid=".srcid." latestsrcid=".latestsrcid." sname<".sname.">") 5003577c6faSBram Moolenaar 5015c73622aSBram Moolenaar " has the plugin's most-recent srcid increased, which indicates that it has been updated 5023577c6faSBram Moolenaar if latestsrcid > srcid 5033577c6faSBram Moolenaar" call Decho("[latestsrcid=".latestsrcid."] <= [srcid=".srcid."]: need to update <".sname.">") 5043577c6faSBram Moolenaar 5053577c6faSBram Moolenaar let s:downloads= s:downloads + 1 5063577c6faSBram Moolenaar if sname == bufname("%") 5073577c6faSBram Moolenaar " GetLatestVimScript has to be careful about downloading itself 5083577c6faSBram Moolenaar let sname= "NEW_".sname 5093577c6faSBram Moolenaar endif 5103577c6faSBram Moolenaar 5115c73622aSBram Moolenaar " ----------------------------------------------------------------------------- 5123577c6faSBram Moolenaar " the plugin has been updated since we last obtained it, so download a new copy 5135c73622aSBram Moolenaar " ----------------------------------------------------------------------------- 5145c73622aSBram Moolenaar" call Decho(".downloading new <".sname.">") 5155c73622aSBram Moolenaar echomsg ".downloading new <".sname.">" 5163577c6faSBram Moolenaar if has("win32") || has("win16") || has("win95") 5175c73622aSBram Moolenaar" call Decho(".new|exe silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(sname)." ".shellescape('http://vim.sourceforge.net/scripts/download_script.php?src_id='.latestsrcid)."|q") 5185c73622aSBram Moolenaar new|exe "silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(sname)." ".shellescape('http://vim.sourceforge.net/scripts/download_script.php?src_id='.latestsrcid)|q 5193577c6faSBram Moolenaar else 5205c73622aSBram Moolenaar" call Decho(".exe silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(sname)." ".shellescape('http://vim.sourceforge.net/scripts/download_script.php?src_id=')) 5215c73622aSBram Moolenaar exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(sname)." ".shellescape('http://vim.sourceforge.net/scripts/download_script.php?src_id=').latestsrcid 5223577c6faSBram Moolenaar endif 5233577c6faSBram Moolenaar 5245c73622aSBram Moolenaar " -------------------------------------------------------------------------- 5253577c6faSBram Moolenaar " AutoInstall: only if doautoinstall has been requested by the plugin itself 5265c73622aSBram Moolenaar " -------------------------------------------------------------------------- 527251e1912SBram Moolenaar" call Decho("checking if plugin requested autoinstall: doautoinstall=".doautoinstall) 5283577c6faSBram Moolenaar if doautoinstall 5295c73622aSBram Moolenaar" call Decho(" ") 5305c73622aSBram Moolenaar" call Decho("Autoinstall: getcwd<".getcwd()."> filereadable(".sname.")=".filereadable(sname)) 5313577c6faSBram Moolenaar if filereadable(sname) 5325c73622aSBram Moolenaar" call Decho("<".sname."> is readable") 5335c73622aSBram Moolenaar" call Decho("exe silent !".g:GetLatestVimScripts_mv." ".shellescape(sname)." ".shellescape(s:autoinstall)) 5345c73622aSBram Moolenaar exe "silent !".g:GetLatestVimScripts_mv." ".shellescape(sname)." ".shellescape(s:autoinstall) 535251e1912SBram Moolenaar let curdir = fnameescape(substitute(getcwd(),'\','/','ge')) 5363577c6faSBram Moolenaar let installdir= curdir."/Installed" 5373577c6faSBram Moolenaar if !isdirectory(installdir) 5383577c6faSBram Moolenaar call mkdir(installdir) 5393577c6faSBram Moolenaar endif 5405c73622aSBram Moolenaar" call Decho("curdir<".curdir."> installdir<".installdir.">") 5413577c6faSBram Moolenaar" call Decho("exe cd ".fnameescape(s:autoinstall)) 5423577c6faSBram Moolenaar exe "cd ".fnameescape(s:autoinstall) 5433577c6faSBram Moolenaar 5445c73622aSBram Moolenaar " determine target directory for moves 5455c73622aSBram Moolenaar let firstdir= substitute(&rtp,',.*$','','') 5465c73622aSBram Moolenaar let pname = substitute(sname,'\..*','.vim','') 5475c73622aSBram Moolenaar" call Decho("determine tgtdir: is <".firstdir.'/AsNeeded/'.pname." readable?") 5485c73622aSBram Moolenaar if filereadable(firstdir.'/AsNeeded/'.pname) 5495c73622aSBram Moolenaar let tgtdir= "AsNeeded" 5505c73622aSBram Moolenaar else 5515c73622aSBram Moolenaar let tgtdir= "plugin" 5525c73622aSBram Moolenaar endif 5535c73622aSBram Moolenaar" call Decho("tgtdir<".tgtdir."> pname<".pname.">") 5545c73622aSBram Moolenaar 5553577c6faSBram Moolenaar " decompress 5563577c6faSBram Moolenaar if sname =~ '\.bz2$' 5573577c6faSBram Moolenaar" call Decho("decompress: attempt to bunzip2 ".sname) 5586be7f873SBram Moolenaar exe "sil !bunzip2 ".shellescape(sname) 5593577c6faSBram Moolenaar let sname= substitute(sname,'\.bz2$','','') 5603577c6faSBram Moolenaar" call Decho("decompress: new sname<".sname."> after bunzip2") 5613577c6faSBram Moolenaar elseif sname =~ '\.gz$' 5623577c6faSBram Moolenaar" call Decho("decompress: attempt to gunzip ".sname) 5636be7f873SBram Moolenaar exe "sil !gunzip ".shellescape(sname) 5643577c6faSBram Moolenaar let sname= substitute(sname,'\.gz$','','') 5653577c6faSBram Moolenaar" call Decho("decompress: new sname<".sname."> after gunzip") 566251e1912SBram Moolenaar elseif sname =~ '\.xz$' 567251e1912SBram Moolenaar" call Decho("decompress: attempt to unxz ".sname) 5686be7f873SBram Moolenaar exe "sil !unxz ".shellescape(sname) 569251e1912SBram Moolenaar let sname= substitute(sname,'\.xz$','','') 570251e1912SBram Moolenaar" call Decho("decompress: new sname<".sname."> after unxz") 5715c73622aSBram Moolenaar else 5725c73622aSBram Moolenaar" call Decho("no decompression needed") 5733577c6faSBram Moolenaar endif 5743577c6faSBram Moolenaar 5756be7f873SBram Moolenaar " distribute archive(.zip, .tar, .vba, ...) contents 5763577c6faSBram Moolenaar if sname =~ '\.zip$' 5773577c6faSBram Moolenaar" call Decho("dearchive: attempt to unzip ".sname) 5785c73622aSBram Moolenaar exe "silent !unzip -o ".shellescape(sname) 5793577c6faSBram Moolenaar elseif sname =~ '\.tar$' 5803577c6faSBram Moolenaar" call Decho("dearchive: attempt to untar ".sname) 5815c73622aSBram Moolenaar exe "silent !tar -xvf ".shellescape(sname) 5826be7f873SBram Moolenaar elseif sname =~ '\.tgz$' 5836be7f873SBram Moolenaar" call Decho("dearchive: attempt to untar+gunzip ".sname) 5846be7f873SBram Moolenaar exe "silent !tar -zxvf ".shellescape(sname) 5856be7f873SBram Moolenaar elseif sname =~ '\.taz$' 5866be7f873SBram Moolenaar" call Decho("dearchive: attempt to untar+uncompress ".sname) 5876be7f873SBram Moolenaar exe "silent !tar -Zxvf ".shellescape(sname) 5886be7f873SBram Moolenaar elseif sname =~ '\.tbz$' 5896be7f873SBram Moolenaar" call Decho("dearchive: attempt to untar+bunzip2 ".sname) 5906be7f873SBram Moolenaar exe "silent !tar -jxvf ".shellescape(sname) 5916be7f873SBram Moolenaar elseif sname =~ '\.txz$' 5926be7f873SBram Moolenaar" call Decho("dearchive: attempt to untar+xz ".sname) 5936be7f873SBram Moolenaar exe "silent !tar -Jxvf ".shellescape(sname) 5943577c6faSBram Moolenaar elseif sname =~ '\.vba$' 5953577c6faSBram Moolenaar" call Decho("dearchive: attempt to handle a vimball: ".sname) 5963577c6faSBram Moolenaar silent 1split 5975c73622aSBram Moolenaar if exists("g:vimball_home") 5985c73622aSBram Moolenaar let oldvimballhome= g:vimball_home 5995c73622aSBram Moolenaar endif 6005c73622aSBram Moolenaar let g:vimball_home= s:autoinstall 6013577c6faSBram Moolenaar exe "silent e ".fnameescape(sname) 6023577c6faSBram Moolenaar silent so % 6033577c6faSBram Moolenaar silent q 6045c73622aSBram Moolenaar if exists("oldvimballhome") 6055c73622aSBram Moolenaar let g:vimball_home= oldvimballhome 6065c73622aSBram Moolenaar else 6075c73622aSBram Moolenaar unlet g:vimball_home 6085c73622aSBram Moolenaar endif 6095c73622aSBram Moolenaar else 6105c73622aSBram Moolenaar" call Decho("no dearchiving needed") 6113577c6faSBram Moolenaar endif 6123577c6faSBram Moolenaar 6135c73622aSBram Moolenaar " --------------------------------------------- 6145c73622aSBram Moolenaar " move plugin to plugin/ or AsNeeded/ directory 6155c73622aSBram Moolenaar " --------------------------------------------- 6163577c6faSBram Moolenaar if sname =~ '.vim$' 6175c73622aSBram Moolenaar" call Decho("dearchive: attempt to simply move ".sname." to ".tgtdir) 6185c73622aSBram Moolenaar exe "silent !".g:GetLatestVimScripts_mv." ".shellescape(sname)." ".tgtdir 6193577c6faSBram Moolenaar else 6203577c6faSBram Moolenaar" call Decho("dearchive: move <".sname."> to installdir<".installdir.">") 6215c73622aSBram Moolenaar exe "silent !".g:GetLatestVimScripts_mv." ".shellescape(sname)." ".installdir 6225c73622aSBram Moolenaar endif 6235c73622aSBram Moolenaar if tgtdir != "plugin" 6245c73622aSBram Moolenaar" call Decho("exe silent !".g:GetLatestVimScripts_mv." plugin/".shellescape(pname)." ".tgtdir) 6255c73622aSBram Moolenaar exe "silent !".g:GetLatestVimScripts_mv." plugin/".shellescape(pname)." ".tgtdir 6263577c6faSBram Moolenaar endif 6273577c6faSBram Moolenaar 6283577c6faSBram Moolenaar " helptags step 6293577c6faSBram Moolenaar let docdir= substitute(&rtp,',.*','','e')."/doc" 6303577c6faSBram Moolenaar" call Decho("helptags: docdir<".docdir.">") 6313577c6faSBram Moolenaar exe "helptags ".fnameescape(docdir) 6323577c6faSBram Moolenaar exe "cd ".fnameescape(curdir) 6333577c6faSBram Moolenaar endif 6343577c6faSBram Moolenaar if fname !~ ':AutoInstall:' 6353577c6faSBram Moolenaar let modline=scriptid." ".latestsrcid." :AutoInstall: ".fname.cmmnt 6363577c6faSBram Moolenaar else 6373577c6faSBram Moolenaar let modline=scriptid." ".latestsrcid." ".fname.cmmnt 6383577c6faSBram Moolenaar endif 6393577c6faSBram Moolenaar else 6403577c6faSBram Moolenaar let modline=scriptid." ".latestsrcid." ".fname.cmmnt 6413577c6faSBram Moolenaar endif 6423577c6faSBram Moolenaar 6433577c6faSBram Moolenaar " update the data in the <GetLatestVimScripts.dat> file 6443577c6faSBram Moolenaar call setline(line("."),modline) 6453577c6faSBram Moolenaar" call Decho("update data in ".expand("%")."#".line(".").": modline<".modline.">") 6463577c6faSBram Moolenaar" else " Decho 6473577c6faSBram Moolenaar" call Decho("[latestsrcid=".latestsrcid."] <= [srcid=".srcid."], no need to update") 6483577c6faSBram Moolenaar endif 6493577c6faSBram Moolenaar 6503577c6faSBram Moolenaar " restore options 6513577c6faSBram Moolenaar let &t_ti = t_ti 6523577c6faSBram Moolenaar let &t_te = t_te 6533577c6faSBram Moolenaar let &rs = rs 6543577c6faSBram Moolenaar let @a = rega 6553577c6faSBram Moolenaar" call Dredir("BUFFER TEST (GetOneScript)","ls!") 6563577c6faSBram Moolenaar 6573577c6faSBram Moolenaar" call Dret("GetOneScript") 6583577c6faSBram Moolenaarendfun 6593577c6faSBram Moolenaar 6603577c6faSBram Moolenaar" --------------------------------------------------------------------- 6619964e468SBram Moolenaar" Restore Options: {{{1 6629964e468SBram Moolenaarlet &cpo= s:keepcpo 6633577c6faSBram Moolenaarunlet s:keepcpo 6649964e468SBram Moolenaar 6653577c6faSBram Moolenaar" --------------------------------------------------------------------- 6663577c6faSBram Moolenaar" Modelines: {{{1 6679964e468SBram Moolenaar" vim: ts=8 sts=2 fdm=marker nowrap 668