1" Vim syntax file 2" Language: SML 3" Filenames: *.sml *.sig 4" Maintainers: Markus Mottl <[email protected]> 5" Fabrizio Zeno Cornelli <[email protected]> 6" URL: http://www.ocaml.info/vim/syntax/sml.vim 7" Last Change: 2006 Oct 23 - Fixed character highlighting bug (MM) 8" 2002 Jun 02 - Fixed small typo (MM) 9" 2001 Nov 20 - Fixed small highlighting bug with modules (MM) 10 11" quit when a syntax file was already loaded 12if exists("b:current_syntax") 13 finish 14endif 15 16" SML is case sensitive. 17syn case match 18 19" lowercase identifier - the standard way to match 20syn match smlLCIdentifier /\<\(\l\|_\)\(\w\|'\)*\>/ 21 22syn match smlKeyChar "|" 23 24" Errors 25syn match smlBraceErr "}" 26syn match smlBrackErr "\]" 27syn match smlParenErr ")" 28syn match smlCommentErr "\*)" 29syn match smlThenErr "\<then\>" 30 31" Error-highlighting of "end" without synchronization: 32" as keyword or as error (default) 33if exists("sml_noend_error") 34 syn match smlKeyword "\<end\>" 35else 36 syn match smlEndErr "\<end\>" 37endif 38 39" Some convenient clusters 40syn cluster smlAllErrs contains=smlBraceErr,smlBrackErr,smlParenErr,smlCommentErr,smlEndErr,smlThenErr 41 42syn cluster smlAENoParen contains=smlBraceErr,smlBrackErr,smlCommentErr,smlEndErr,smlThenErr 43 44syn cluster smlContained contains=smlTodo,smlPreDef,smlModParam,smlModParam1,smlPreMPRestr,smlMPRestr,smlMPRestr1,smlMPRestr2,smlMPRestr3,smlModRHS,smlFuncWith,smlFuncStruct,smlModTypeRestr,smlModTRWith,smlWith,smlWithRest,smlModType,smlFullMod 45 46 47" Enclosing delimiters 48syn region smlEncl transparent matchgroup=smlKeyword start="(" matchgroup=smlKeyword end=")" contains=ALLBUT,@smlContained,smlParenErr 49syn region smlEncl transparent matchgroup=smlKeyword start="{" matchgroup=smlKeyword end="}" contains=ALLBUT,@smlContained,smlBraceErr 50syn region smlEncl transparent matchgroup=smlKeyword start="\[" matchgroup=smlKeyword end="\]" contains=ALLBUT,@smlContained,smlBrackErr 51syn region smlEncl transparent matchgroup=smlKeyword start="#\[" matchgroup=smlKeyword end="\]" contains=ALLBUT,@smlContained,smlBrackErr 52 53 54" Comments 55syn region smlComment start="(\*" end="\*)" contains=smlComment,smlTodo 56syn keyword smlTodo contained TODO FIXME XXX 57 58 59" let 60syn region smlEnd matchgroup=smlKeyword start="\<let\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr 61 62" local 63syn region smlEnd matchgroup=smlKeyword start="\<local\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr 64 65" abstype 66syn region smlNone matchgroup=smlKeyword start="\<abstype\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr 67 68" begin 69syn region smlEnd matchgroup=smlKeyword start="\<begin\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr 70 71" if 72syn region smlNone matchgroup=smlKeyword start="\<if\>" matchgroup=smlKeyword end="\<then\>" contains=ALLBUT,@smlContained,smlThenErr 73 74 75"" Modules 76 77" "struct" 78syn region smlStruct matchgroup=smlModule start="\<struct\>" matchgroup=smlModule end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr 79 80" "sig" 81syn region smlSig matchgroup=smlModule start="\<sig\>" matchgroup=smlModule end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr,smlModule 82syn region smlModSpec matchgroup=smlKeyword start="\<structure\>" matchgroup=smlModule end="\<\u\(\w\|'\)*\>" contained contains=@smlAllErrs,smlComment skipwhite skipempty nextgroup=smlModTRWith,smlMPRestr 83 84" "open" 85syn region smlNone matchgroup=smlKeyword start="\<open\>" matchgroup=smlModule end="\<\u\(\w\|'\)*\(\.\u\(\w\|'\)*\)*\>" contains=@smlAllErrs,smlComment 86 87" "structure" - somewhat complicated stuff ;-) 88syn region smlModule matchgroup=smlKeyword start="\<\(structure\|functor\)\>" matchgroup=smlModule end="\<\u\(\w\|'\)*\>" contains=@smlAllErrs,smlComment skipwhite skipempty nextgroup=smlPreDef 89syn region smlPreDef start="."me=e-1 matchgroup=smlKeyword end="\l\|="me=e-1 contained contains=@smlAllErrs,smlComment,smlModParam,smlModTypeRestr,smlModTRWith nextgroup=smlModPreRHS 90syn region smlModParam start="([^*]" end=")" contained contains=@smlAENoParen,smlModParam1 91syn match smlModParam1 "\<\u\(\w\|'\)*\>" contained skipwhite skipempty nextgroup=smlPreMPRestr 92 93syn region smlPreMPRestr start="."me=e-1 end=")"me=e-1 contained contains=@smlAllErrs,smlComment,smlMPRestr,smlModTypeRestr 94 95syn region smlMPRestr start=":" end="."me=e-1 contained contains=@smlComment skipwhite skipempty nextgroup=smlMPRestr1,smlMPRestr2,smlMPRestr3 96syn region smlMPRestr1 matchgroup=smlModule start="\ssig\s\=" matchgroup=smlModule end="\<end\>" contained contains=ALLBUT,@smlContained,smlEndErr,smlModule 97syn region smlMPRestr2 start="\sfunctor\(\s\|(\)\="me=e-1 matchgroup=smlKeyword end="->" contained contains=@smlAllErrs,smlComment,smlModParam skipwhite skipempty nextgroup=smlFuncWith 98syn match smlMPRestr3 "\w\(\w\|'\)*\(\.\w\(\w\|'\)*\)*" contained 99syn match smlModPreRHS "=" contained skipwhite skipempty nextgroup=smlModParam,smlFullMod 100syn region smlModRHS start="." end=".\w\|([^*]"me=e-2 contained contains=smlComment skipwhite skipempty nextgroup=smlModParam,smlFullMod 101syn match smlFullMod "\<\u\(\w\|'\)*\(\.\u\(\w\|'\)*\)*" contained skipwhite skipempty nextgroup=smlFuncWith 102 103syn region smlFuncWith start="([^*]"me=e-1 end=")" contained contains=smlComment,smlWith,smlFuncStruct 104syn region smlFuncStruct matchgroup=smlModule start="[^a-zA-Z]struct\>"hs=s+1 matchgroup=smlModule end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr 105 106syn match smlModTypeRestr "\<\w\(\w\|'\)*\(\.\w\(\w\|'\)*\)*\>" contained 107syn region smlModTRWith start=":\s*("hs=s+1 end=")" contained contains=@smlAENoParen,smlWith 108syn match smlWith "\<\(\u\(\w\|'\)*\.\)*\w\(\w\|'\)*\>" contained skipwhite skipempty nextgroup=smlWithRest 109syn region smlWithRest start="[^)]" end=")"me=e-1 contained contains=ALLBUT,@smlContained 110 111" "signature" 112syn region smlKeyword start="\<signature\>" matchgroup=smlModule end="\<\w\(\w\|'\)*\>" contains=smlComment skipwhite skipempty nextgroup=smlMTDef 113syn match smlMTDef "=\s*\w\(\w\|'\)*\>"hs=s+1,me=s 114 115syn keyword smlKeyword and andalso case 116syn keyword smlKeyword datatype else eqtype 117syn keyword smlKeyword exception fn fun handle 118syn keyword smlKeyword in infix infixl infixr 119syn keyword smlKeyword match nonfix of orelse 120syn keyword smlKeyword raise handle type 121syn keyword smlKeyword val where while with withtype 122 123syn keyword smlType bool char exn int list option 124syn keyword smlType real string unit 125 126syn keyword smlOperator div mod not or quot rem 127 128syn keyword smlBoolean true false 129syn match smlConstructor "(\s*)" 130syn match smlConstructor "\[\s*\]" 131syn match smlConstructor "#\[\s*\]" 132syn match smlConstructor "\u\(\w\|'\)*\>" 133 134" Module prefix 135syn match smlModPath "\u\(\w\|'\)*\."he=e-1 136 137syn match smlCharacter +#"\\""\|#"."\|#"\\\d\d\d"+ 138syn match smlCharErr +#"\\\d\d"\|#"\\\d"+ 139syn region smlString start=+"+ skip=+\\\\\|\\"+ end=+"+ 140 141syn match smlFunDef "=>" 142syn match smlRefAssign ":=" 143syn match smlTopStop ";;" 144syn match smlOperator "\^" 145syn match smlOperator "::" 146syn match smlAnyVar "\<_\>" 147syn match smlKeyChar "!" 148syn match smlKeyChar ";" 149syn match smlKeyChar "\*" 150syn match smlKeyChar "=" 151 152syn match smlNumber "\<-\=\d\+\>" 153syn match smlNumber "\<-\=0[x|X]\x\+\>" 154syn match smlReal "\<-\=\d\+\.\d*\([eE][-+]\=\d\+\)\=[fl]\=\>" 155 156" Synchronization 157syn sync minlines=20 158syn sync maxlines=500 159 160syn sync match smlEndSync grouphere smlEnd "\<begin\>" 161syn sync match smlEndSync groupthere smlEnd "\<end\>" 162syn sync match smlStructSync grouphere smlStruct "\<struct\>" 163syn sync match smlStructSync groupthere smlStruct "\<end\>" 164syn sync match smlSigSync grouphere smlSig "\<sig\>" 165syn sync match smlSigSync groupthere smlSig "\<end\>" 166 167" Define the default highlighting. 168" Only when an item doesn't have highlighting yet 169command -nargs=+ HiLink hi def link <args> 170 171HiLink smlBraceErr Error 172HiLink smlBrackErr Error 173HiLink smlParenErr Error 174 175HiLink smlCommentErr Error 176 177HiLink smlEndErr Error 178HiLink smlThenErr Error 179 180HiLink smlCharErr Error 181 182HiLink smlComment Comment 183 184HiLink smlModPath Include 185HiLink smlModule Include 186HiLink smlModParam1 Include 187HiLink smlModType Include 188HiLink smlMPRestr3 Include 189HiLink smlFullMod Include 190HiLink smlModTypeRestr Include 191HiLink smlWith Include 192HiLink smlMTDef Include 193 194HiLink smlConstructor Constant 195 196HiLink smlModPreRHS Keyword 197HiLink smlMPRestr2 Keyword 198HiLink smlKeyword Keyword 199HiLink smlFunDef Keyword 200HiLink smlRefAssign Keyword 201HiLink smlKeyChar Keyword 202HiLink smlAnyVar Keyword 203HiLink smlTopStop Keyword 204HiLink smlOperator Keyword 205 206HiLink smlBoolean Boolean 207HiLink smlCharacter Character 208HiLink smlNumber Number 209HiLink smlReal Float 210HiLink smlString String 211HiLink smlType Type 212HiLink smlTodo Todo 213HiLink smlEncl Keyword 214 215delcommand HiLink 216 217let b:current_syntax = "sml" 218 219" vim: ts=8 220