1071d4279SBram Moolenaar" Vim syntax file 2071d4279SBram Moolenaar" Language: Speedup, plant simulator from AspenTech 3071d4279SBram Moolenaar" Maintainer: Stefan.Schwarzer <[email protected]> 4071d4279SBram Moolenaar" URL: http://www.ndh.net/home/sschwarzer/download/spup.vim 5b8ff1fb5SBram Moolenaar" Last Change: 2012 Feb 03 by Thilo Six 6071d4279SBram Moolenaar" Filename: spup.vim 7071d4279SBram Moolenaar 8071d4279SBram Moolenaar" Bugs 9071d4279SBram Moolenaar" - in the appropriate sections keywords are always highlighted 10071d4279SBram Moolenaar" even if they are not used with the appropriate meaning; 11071d4279SBram Moolenaar" example: in 12071d4279SBram Moolenaar" MODEL demonstration 13071d4279SBram Moolenaar" TYPE 14071d4279SBram Moolenaar" *area AS area 15071d4279SBram Moolenaar" both "area" are highlighted as spupType. 16071d4279SBram Moolenaar" 17071d4279SBram Moolenaar" If you encounter problems or have questions or suggestions, mail me 18071d4279SBram Moolenaar 19071d4279SBram Moolenaar" Remove old syntax stuff 2089bcfda6SBram Moolenaar" quit when a syntax file was already loaded 2189bcfda6SBram Moolenaarif exists("b:current_syntax") 22071d4279SBram Moolenaar finish 23071d4279SBram Moolenaarendif 24071d4279SBram Moolenaar 25b8ff1fb5SBram Moolenaarlet s:cpo_save = &cpo 26b8ff1fb5SBram Moolenaarset cpo&vim 27b8ff1fb5SBram Moolenaar 28*6c391a74SBram Moolenaar" don't highlight several keywords like subsections 29071d4279SBram Moolenaar"let strict_subsections = 1 30071d4279SBram Moolenaar 31071d4279SBram Moolenaar" highlight types usually found in DECLARE section 32071d4279SBram Moolenaarif !exists("hightlight_types") 33071d4279SBram Moolenaar let highlight_types = 1 34071d4279SBram Moolenaarendif 35071d4279SBram Moolenaar 36071d4279SBram Moolenaar" one line comment syntax (# comments) 37071d4279SBram Moolenaar" 1. allow appended code after comment, do not complain 38*6c391a74SBram Moolenaar" 2. show code beginning with the second # as an error 39071d4279SBram Moolenaar" 3. show whole lines with more than one # as an error 40071d4279SBram Moolenaarif !exists("oneline_comments") 41071d4279SBram Moolenaar let oneline_comments = 2 42071d4279SBram Moolenaarendif 43071d4279SBram Moolenaar 44071d4279SBram Moolenaar" Speedup SECTION regions 45071d4279SBram Moolenaarsyn case ignore 46071d4279SBram Moolenaarsyn region spupCdi matchgroup=spupSection start="^CDI" end="^\*\*\*\*" contains=spupCdiSubs,@spupOrdinary 47071d4279SBram Moolenaarsyn region spupConditions matchgroup=spupSection start="^CONDITIONS" end="^\*\*\*\*" contains=spupConditionsSubs,@spupOrdinary,spupConditional,spupOperator,spupCode 48071d4279SBram Moolenaarsyn region spupDeclare matchgroup=spupSection start="^DECLARE" end="^\*\*\*\*" contains=spupDeclareSubs,@spupOrdinary,spupTypes,spupCode 49071d4279SBram Moolenaarsyn region spupEstimation matchgroup=spupSection start="^ESTIMATION" end="^\*\*\*\*" contains=spupEstimationSubs,@spupOrdinary 50071d4279SBram Moolenaarsyn region spupExternal matchgroup=spupSection start="^EXTERNAL" end="^\*\*\*\*" contains=spupExternalSubs,@spupOrdinary 51071d4279SBram Moolenaarsyn region spupFlowsheet matchgroup=spupSection start="^FLOWSHEET" end="^\*\*\*\*" contains=spupFlowsheetSubs,@spupOrdinary,spupStreams,@spupTextproc 52071d4279SBram Moolenaarsyn region spupFunction matchgroup=spupSection start="^FUNCTION" end="^\*\*\*\*" contains=spupFunctionSubs,@spupOrdinary,spupHelp,spupCode,spupTypes 53071d4279SBram Moolenaarsyn region spupGlobal matchgroup=spupSection start="^GLOBAL" end="^\*\*\*\*" contains=spupGlobalSubs,@spupOrdinary 54071d4279SBram Moolenaarsyn region spupHomotopy matchgroup=spupSection start="^HOMOTOPY" end="^\*\*\*\*" contains=spupHomotopySubs,@spupOrdinary 55071d4279SBram Moolenaarsyn region spupMacro matchgroup=spupSection start="^MACRO" end="^\*\*\*\*" contains=spupMacroSubs,@spupOrdinary,@spupTextproc,spupTypes,spupStreams,spupOperator 56071d4279SBram Moolenaarsyn region spupModel matchgroup=spupSection start="^MODEL" end="^\*\*\*\*" contains=spupModelSubs,@spupOrdinary,spupConditional,spupOperator,spupTypes,spupStreams,@spupTextproc,spupHelp 57071d4279SBram Moolenaarsyn region spupOperation matchgroup=spupSection start="^OPERATION" end="^\*\*\*\*" contains=spupOperationSubs,@spupOrdinary,@spupTextproc 58071d4279SBram Moolenaarsyn region spupOptions matchgroup=spupSection start="^OPTIONS" end="^\*\*\*\*" contains=spupOptionsSubs,@spupOrdinary 59071d4279SBram Moolenaarsyn region spupProcedure matchgroup=spupSection start="^PROCEDURE" end="^\*\*\*\*" contains=spupProcedureSubs,@spupOrdinary,spupHelp,spupCode,spupTypes 60071d4279SBram Moolenaarsyn region spupProfiles matchgroup=spupSection start="^PROFILES" end="^\*\*\*\*" contains=@spupOrdinary,@spupTextproc 61071d4279SBram Moolenaarsyn region spupReport matchgroup=spupSection start="^REPORT" end="^\*\*\*\*" contains=spupReportSubs,@spupOrdinary,spupHelp,@spupTextproc 62071d4279SBram Moolenaarsyn region spupTitle matchgroup=spupSection start="^TITLE" end="^\*\*\*\*" contains=spupTitleSubs,spupComment,spupConstant,spupError 63071d4279SBram Moolenaarsyn region spupUnit matchgroup=spupSection start="^UNIT" end="^\*\*\*\*" contains=spupUnitSubs,@spupOrdinary 64071d4279SBram Moolenaar 65071d4279SBram Moolenaar" Subsections 66071d4279SBram Moolenaarsyn keyword spupCdiSubs INPUT FREE OUTPUT LINEARTIME MINNONZERO CALCULATE FILES SCALING contained 67071d4279SBram Moolenaarsyn keyword spupDeclareSubs TYPE STREAM contained 68071d4279SBram Moolenaarsyn keyword spupEstimationSubs ESTIMATE SSEXP DYNEXP RESULT contained 69071d4279SBram Moolenaarsyn keyword spupExternalSubs TRANSMIT RECEIVE contained 70071d4279SBram Moolenaarsyn keyword spupFlowsheetSubs STREAM contained 71071d4279SBram Moolenaarsyn keyword spupFunctionSubs INPUT OUTPUT contained 72071d4279SBram Moolenaarsyn keyword spupGlobalSubs VARIABLES MAXIMIZE MINIMIZE CONSTRAINT contained 73071d4279SBram Moolenaarsyn keyword spupHomotopySubs VARY OPTIONS contained 74071d4279SBram Moolenaarsyn keyword spupMacroSubs MODEL FLOWSHEET contained 75071d4279SBram Moolenaarsyn keyword spupModelSubs CATEGORY SET TYPE STREAM EQUATION PROCEDURE contained 76071d4279SBram Moolenaarsyn keyword spupOperationSubs SET PRESET INITIAL SSTATE FREE contained 77071d4279SBram Moolenaarsyn keyword spupOptionsSubs ROUTINES TRANSLATE EXECUTION contained 78071d4279SBram Moolenaarsyn keyword spupProcedureSubs INPUT OUTPUT SPACE PRECALL POSTCALL DERIVATIVE STREAM contained 79071d4279SBram Moolenaar" no subsections for Profiles 80071d4279SBram Moolenaarsyn keyword spupReportSubs SET INITIAL FIELDS FIELDMARK DISPLAY WITHIN contained 81071d4279SBram Moolenaarsyn keyword spupUnitSubs ROUTINES SET contained 82071d4279SBram Moolenaar 83071d4279SBram Moolenaar" additional keywords for subsections 84071d4279SBram Moolenaarif !exists( "strict_subsections" ) 85071d4279SBram Moolenaar syn keyword spupConditionsSubs STOP PRINT contained 86071d4279SBram Moolenaar syn keyword spupDeclareSubs UNIT SET COMPONENTS THERMO OPTIONS contained 87071d4279SBram Moolenaar syn keyword spupEstimationSubs VARY MEASURE INITIAL contained 88071d4279SBram Moolenaar syn keyword spupFlowsheetSubs TYPE FEED PRODUCT INPUT OUTPUT CONNECTION OF IS contained 89071d4279SBram Moolenaar syn keyword spupMacroSubs CONNECTION STREAM SET INPUT OUTPUT OF IS FEED PRODUCT TYPE contained 90071d4279SBram Moolenaar syn keyword spupModelSubs AS ARRAY OF INPUT OUTPUT CONNECTION contained 91071d4279SBram Moolenaar syn keyword spupOperationSubs WITHIN contained 92071d4279SBram Moolenaar syn keyword spupReportSubs LEFT RIGHT CENTER CENTRE UOM TIME DATE VERSION RELDATE contained 93071d4279SBram Moolenaar syn keyword spupUnitSubs IS A contained 94071d4279SBram Moolenaarendif 95071d4279SBram Moolenaar 96071d4279SBram Moolenaar" Speedup data types 97071d4279SBram Moolenaarif exists( "highlight_types" ) 98071d4279SBram Moolenaar syn keyword spupTypes act_coeff_liq area coefficient concentration contained 99071d4279SBram Moolenaar syn keyword spupTypes control_signal cond_liq cond_vap cp_mass_liq contained 100071d4279SBram Moolenaar syn keyword spupTypes cp_mol_liq cp_mol_vap cv_mol_liq cv_mol_vap contained 101071d4279SBram Moolenaar syn keyword spupTypes diffus_liq diffus_vap delta_p dens_mass contained 102071d4279SBram Moolenaar syn keyword spupTypes dens_mass_sol dens_mass_liq dens_mass_vap dens_mol contained 103071d4279SBram Moolenaar syn keyword spupTypes dens_mol_sol dens_mol_liq dens_mol_vap enthflow contained 104071d4279SBram Moolenaar syn keyword spupTypes enth_mass enth_mass_liq enth_mass_vap enth_mol contained 105071d4279SBram Moolenaar syn keyword spupTypes enth_mol_sol enth_mol_liq enth_mol_vap entr_mol contained 106071d4279SBram Moolenaar syn keyword spupTypes entr_mol_sol entr_mol_liq entr_mol_vap fraction contained 107071d4279SBram Moolenaar syn keyword spupTypes flow_mass flow_mass_liq flow_mass_vap flow_mol contained 108071d4279SBram Moolenaar syn keyword spupTypes flow_mol_vap flow_mol_liq flow_vol flow_vol_vap contained 109071d4279SBram Moolenaar syn keyword spupTypes flow_vol_liq fuga_vap fuga_liq fuga_sol contained 110071d4279SBram Moolenaar syn keyword spupTypes gibb_mol_sol heat_react heat_trans_coeff contained 111071d4279SBram Moolenaar syn keyword spupTypes holdup_heat holdup_heat_liq holdup_heat_vap contained 112071d4279SBram Moolenaar syn keyword spupTypes holdup_mass holdup_mass_liq holdup_mass_vap contained 113071d4279SBram Moolenaar syn keyword spupTypes holdup_mol holdup_mol_liq holdup_mol_vap k_value contained 114071d4279SBram Moolenaar syn keyword spupTypes length length_delta length_short liqfraction contained 115071d4279SBram Moolenaar syn keyword spupTypes liqmassfraction mass massfraction molefraction contained 116071d4279SBram Moolenaar syn keyword spupTypes molweight moment_inertia negative notype percent contained 117071d4279SBram Moolenaar syn keyword spupTypes positive pressure press_diff press_drop press_rise contained 118071d4279SBram Moolenaar syn keyword spupTypes ratio reaction reaction_mass rotation surf_tens contained 119071d4279SBram Moolenaar syn keyword spupTypes temperature temperature_abs temp_diff temp_drop contained 120071d4279SBram Moolenaar syn keyword spupTypes temp_rise time vapfraction vapmassfraction contained 121071d4279SBram Moolenaar syn keyword spupTypes velocity visc_liq visc_vap volume zmom_rate contained 122071d4279SBram Moolenaar syn keyword spupTypes seg_rate smom_rate tmom_rate zmom_mass seg_mass contained 123071d4279SBram Moolenaar syn keyword spupTypes smom_mass tmom_mass zmom_holdup seg_holdup contained 124071d4279SBram Moolenaar syn keyword spupTypes smom_holdup tmom_holdup contained 125071d4279SBram Moolenaarendif 126071d4279SBram Moolenaar 127071d4279SBram Moolenaar" stream types 128071d4279SBram Moolenaarsyn keyword spupStreams mainstream vapour liquid contained 129071d4279SBram Moolenaar 130071d4279SBram Moolenaar" "conditional" keywords 131071d4279SBram Moolenaarsyn keyword spupConditional IF THEN ELSE ENDIF contained 132071d4279SBram Moolenaar" Operators, symbols etc. 133071d4279SBram Moolenaarsyn keyword spupOperator AND OR NOT contained 134071d4279SBram Moolenaarsyn match spupSymbol "[,\-+=:;*/\"<>@%()]" contained 135071d4279SBram Moolenaarsyn match spupSpecial "[&\$?]" contained 136071d4279SBram Moolenaar" Surprisingly, Speedup allows no unary + instead of the - 137071d4279SBram Moolenaarsyn match spupError "[(=+\-*/]\s*+\d\+\([ed][+-]\=\d\+\)\=\>"lc=1 contained 138071d4279SBram Moolenaarsyn match spupError "[(=+\-*/]\s*+\d\+\.\([ed][+-]\=\d\+\)\=\>"lc=1 contained 139071d4279SBram Moolenaarsyn match spupError "[(=+\-*/]\s*+\d*\.\d\+\([ed][+-]\=\d\+\)\=\>"lc=1 contained 140071d4279SBram Moolenaar" String 141071d4279SBram Moolenaarsyn region spupString start=+"+ end=+"+ oneline contained 142071d4279SBram Moolenaarsyn region spupString start=+'+ end=+'+ oneline contained 143071d4279SBram Moolenaar" Identifier 144071d4279SBram Moolenaarsyn match spupIdentifier "\<[a-z][a-z0-9_]*\>" contained 145071d4279SBram Moolenaar" Textprocessor directives 146071d4279SBram Moolenaarsyn match spupTextprocGeneric "?[a-z][a-z0-9_]*\>" contained 147071d4279SBram Moolenaarsyn region spupTextprocError matchgroup=spupTextprocGeneric start="?ERROR" end="?END"he=s-1 contained 148071d4279SBram Moolenaar" Number, without decimal point 149071d4279SBram Moolenaarsyn match spupNumber "-\=\d\+\([ed][+-]\=\d\+\)\=" contained 150071d4279SBram Moolenaar" Number, allows 1. before exponent 151071d4279SBram Moolenaarsyn match spupNumber "-\=\d\+\.\([ed][+-]\=\d\+\)\=" contained 152071d4279SBram Moolenaar" Number allows .1 before exponent 153071d4279SBram Moolenaarsyn match spupNumber "-\=\d*\.\d\+\([ed][+-]\=\d\+\)\=" contained 154071d4279SBram Moolenaar" Help subsections 155071d4279SBram Moolenaarsyn region spupHelp start="^HELP"hs=e+1 end="^\$ENDHELP"he=s-1 contained 156071d4279SBram Moolenaar" Fortran code 157071d4279SBram Moolenaarsyn region spupCode start="^CODE"hs=e+1 end="^\$ENDCODE"he=s-1 contained 158071d4279SBram Moolenaar" oneline comments 159071d4279SBram Moolenaarif oneline_comments > 3 160071d4279SBram Moolenaar oneline_comments = 2 " default 161071d4279SBram Moolenaarendif 162071d4279SBram Moolenaarif oneline_comments == 1 163071d4279SBram Moolenaar syn match spupComment "#[^#]*#\=" 164071d4279SBram Moolenaarelseif oneline_comments == 2 165071d4279SBram Moolenaar syn match spupError "#.*$" 166071d4279SBram Moolenaar syn match spupComment "#[^#]*" nextgroup=spupError 167071d4279SBram Moolenaarelseif oneline_comments == 3 168071d4279SBram Moolenaar syn match spupComment "#[^#]*" 169071d4279SBram Moolenaar syn match spupError "#[^#]*#.*" 170071d4279SBram Moolenaarendif 171071d4279SBram Moolenaar" multiline comments 172071d4279SBram Moolenaarsyn match spupOpenBrace "{" contained 173071d4279SBram Moolenaarsyn match spupError "}" 174071d4279SBram Moolenaarsyn region spupComment matchgroup=spupComment2 start="{" end="}" keepend contains=spupOpenBrace 175071d4279SBram Moolenaar 176071d4279SBram Moolenaarsyn cluster spupOrdinary contains=spupNumber,spupIdentifier,spupSymbol 177071d4279SBram Moolenaarsyn cluster spupOrdinary add=spupError,spupString,spupComment 178071d4279SBram Moolenaarsyn cluster spupTextproc contains=spupTextprocGeneric,spupTextprocError 179071d4279SBram Moolenaar 180*6c391a74SBram Moolenaar" define synchronizing; especially OPERATION sections can become very large 181071d4279SBram Moolenaarsyn sync clear 182071d4279SBram Moolenaarsyn sync minlines=100 183071d4279SBram Moolenaarsyn sync maxlines=500 184071d4279SBram Moolenaar 185071d4279SBram Moolenaarsyn sync match spupSyncOperation grouphere spupOperation "^OPERATION" 186071d4279SBram Moolenaarsyn sync match spupSyncCdi grouphere spupCdi "^CDI" 187071d4279SBram Moolenaarsyn sync match spupSyncConditions grouphere spupConditions "^CONDITIONS" 188071d4279SBram Moolenaarsyn sync match spupSyncDeclare grouphere spupDeclare "^DECLARE" 189071d4279SBram Moolenaarsyn sync match spupSyncEstimation grouphere spupEstimation "^ESTIMATION" 190071d4279SBram Moolenaarsyn sync match spupSyncExternal grouphere spupExternal "^EXTERNAL" 191071d4279SBram Moolenaarsyn sync match spupSyncFlowsheet grouphere spupFlowsheet "^FLOWSHEET" 192071d4279SBram Moolenaarsyn sync match spupSyncFunction grouphere spupFunction "^FUNCTION" 193071d4279SBram Moolenaarsyn sync match spupSyncGlobal grouphere spupGlobal "^GLOBAL" 194071d4279SBram Moolenaarsyn sync match spupSyncHomotopy grouphere spupHomotopy "^HOMOTOPY" 195071d4279SBram Moolenaarsyn sync match spupSyncMacro grouphere spupMacro "^MACRO" 196071d4279SBram Moolenaarsyn sync match spupSyncModel grouphere spupModel "^MODEL" 197071d4279SBram Moolenaarsyn sync match spupSyncOperation grouphere spupOperation "^OPERATION" 198071d4279SBram Moolenaarsyn sync match spupSyncOptions grouphere spupOptions "^OPTIONS" 199071d4279SBram Moolenaarsyn sync match spupSyncProcedure grouphere spupProcedure "^PROCEDURE" 200071d4279SBram Moolenaarsyn sync match spupSyncProfiles grouphere spupProfiles "^PROFILES" 201071d4279SBram Moolenaarsyn sync match spupSyncReport grouphere spupReport "^REPORT" 202071d4279SBram Moolenaarsyn sync match spupSyncTitle grouphere spupTitle "^TITLE" 203071d4279SBram Moolenaarsyn sync match spupSyncUnit grouphere spupUnit "^UNIT" 204071d4279SBram Moolenaar 205071d4279SBram Moolenaar" Define the default highlighting. 20689bcfda6SBram Moolenaar" Only when an item doesn't have highlighting yet 207071d4279SBram Moolenaar 208f37506f6SBram Moolenaarhi def link spupCdi spupSection 209f37506f6SBram Moolenaarhi def link spupConditions spupSection 210f37506f6SBram Moolenaarhi def link spupDeclare spupSection 211f37506f6SBram Moolenaarhi def link spupEstimation spupSection 212f37506f6SBram Moolenaarhi def link spupExternal spupSection 213f37506f6SBram Moolenaarhi def link spupFlowsheet spupSection 214f37506f6SBram Moolenaarhi def link spupFunction spupSection 215f37506f6SBram Moolenaarhi def link spupGlobal spupSection 216f37506f6SBram Moolenaarhi def link spupHomotopy spupSection 217f37506f6SBram Moolenaarhi def link spupMacro spupSection 218f37506f6SBram Moolenaarhi def link spupModel spupSection 219f37506f6SBram Moolenaarhi def link spupOperation spupSection 220f37506f6SBram Moolenaarhi def link spupOptions spupSection 221f37506f6SBram Moolenaarhi def link spupProcedure spupSection 222f37506f6SBram Moolenaarhi def link spupProfiles spupSection 223f37506f6SBram Moolenaarhi def link spupReport spupSection 224f37506f6SBram Moolenaarhi def link spupTitle spupConstant " this is correct, truly ;) 225f37506f6SBram Moolenaarhi def link spupUnit spupSection 226071d4279SBram Moolenaar 227f37506f6SBram Moolenaarhi def link spupCdiSubs spupSubs 228f37506f6SBram Moolenaarhi def link spupConditionsSubs spupSubs 229f37506f6SBram Moolenaarhi def link spupDeclareSubs spupSubs 230f37506f6SBram Moolenaarhi def link spupEstimationSubs spupSubs 231f37506f6SBram Moolenaarhi def link spupExternalSubs spupSubs 232f37506f6SBram Moolenaarhi def link spupFlowsheetSubs spupSubs 233f37506f6SBram Moolenaarhi def link spupFunctionSubs spupSubs 234f37506f6SBram Moolenaarhi def link spupHomotopySubs spupSubs 235f37506f6SBram Moolenaarhi def link spupMacroSubs spupSubs 236f37506f6SBram Moolenaarhi def link spupModelSubs spupSubs 237f37506f6SBram Moolenaarhi def link spupOperationSubs spupSubs 238f37506f6SBram Moolenaarhi def link spupOptionsSubs spupSubs 239f37506f6SBram Moolenaarhi def link spupProcedureSubs spupSubs 240f37506f6SBram Moolenaarhi def link spupReportSubs spupSubs 241f37506f6SBram Moolenaarhi def link spupUnitSubs spupSubs 242071d4279SBram Moolenaar 243f37506f6SBram Moolenaarhi def link spupCode Normal 244f37506f6SBram Moolenaarhi def link spupComment Comment 245f37506f6SBram Moolenaarhi def link spupComment2 spupComment 246f37506f6SBram Moolenaarhi def link spupConditional Statement 247f37506f6SBram Moolenaarhi def link spupConstant Constant 248f37506f6SBram Moolenaarhi def link spupError Error 249f37506f6SBram Moolenaarhi def link spupHelp Normal 250f37506f6SBram Moolenaarhi def link spupIdentifier Identifier 251f37506f6SBram Moolenaarhi def link spupNumber Constant 252f37506f6SBram Moolenaarhi def link spupOperator Special 253f37506f6SBram Moolenaarhi def link spupOpenBrace spupError 254f37506f6SBram Moolenaarhi def link spupSection Statement 255f37506f6SBram Moolenaarhi def link spupSpecial spupTextprocGeneric 256f37506f6SBram Moolenaarhi def link spupStreams Type 257f37506f6SBram Moolenaarhi def link spupString Constant 258f37506f6SBram Moolenaarhi def link spupSubs Statement 259f37506f6SBram Moolenaarhi def link spupSymbol Special 260f37506f6SBram Moolenaarhi def link spupTextprocError Normal 261f37506f6SBram Moolenaarhi def link spupTextprocGeneric PreProc 262f37506f6SBram Moolenaarhi def link spupTypes Type 263071d4279SBram Moolenaar 264071d4279SBram Moolenaar 265071d4279SBram Moolenaarlet b:current_syntax = "spup" 266071d4279SBram Moolenaar 267b8ff1fb5SBram Moolenaarlet &cpo = s:cpo_save 268b8ff1fb5SBram Moolenaarunlet s:cpo_save 269b8ff1fb5SBram Moolenaar" vim:ts=8 270