1071d4279SBram Moolenaar" Vim syntax file 2071d4279SBram Moolenaar" Language: OCaml 3071d4279SBram Moolenaar" Filenames: *.ml *.mli *.mll *.mly 4202795beSBram Moolenaar" Maintainers: Markus Mottl <[email protected]> 5071d4279SBram Moolenaar" Karl-Heinz Sylla <[email protected]> 65eb86f91SBram Moolenaar" Issac Trotts <[email protected]> 7*7e6a515eSBram Moolenaar" URL: https://github.com/ocaml/vim-ocaml 8773a97c2SBram Moolenaar" Last Change: 9773a97c2SBram Moolenaar" 2018 Nov 08 - Improved highlighting of operators (Maëlan) 10773a97c2SBram Moolenaar" 2018 Apr 22 - Improved support for PPX (Andrey Popp) 11773a97c2SBram Moolenaar" 2018 Mar 16 - Remove raise, lnot and not from keywords (Étienne Millon, "copy") 12773a97c2SBram Moolenaar" 2017 Apr 11 - Improved matching of negative numbers (MM) 13773a97c2SBram Moolenaar" 2016 Mar 11 - Improved support for quoted strings (Glen Mével) 14773a97c2SBram Moolenaar" 2015 Aug 13 - Allow apostrophes in identifiers (Jonathan Chan, Einar Lielmanis) 15773a97c2SBram Moolenaar" 2015 Jun 17 - Added new "nonrec" keyword (MM) 16202795beSBram Moolenaar 17202795beSBram Moolenaar" A minor patch was applied to the official version so that object/end 18202795beSBram Moolenaar" can be distinguished from begin/end, which is used for indentation, 19202795beSBram Moolenaar" and folding. (David Baelde) 20071d4279SBram Moolenaar 21*7e6a515eSBram Moolenaar" Quit when a syntax file was already loaded 2289bcfda6SBram Moolenaarif exists("b:current_syntax") && b:current_syntax == "ocaml" 23071d4279SBram Moolenaar finish 24071d4279SBram Moolenaarendif 25071d4279SBram Moolenaar 26*7e6a515eSBram Moolenaarlet s:keepcpo = &cpo 27*7e6a515eSBram Moolenaarset cpo&vim 28*7e6a515eSBram Moolenaar 29773a97c2SBram Moolenaar" ' can be used in OCaml identifiers 30773a97c2SBram Moolenaarsetlocal iskeyword+=' 31773a97c2SBram Moolenaar 32*7e6a515eSBram Moolenaar" ` is part of the name of polymorphic variants 33*7e6a515eSBram Moolenaarsetlocal iskeyword+=` 34*7e6a515eSBram Moolenaar 35071d4279SBram Moolenaar" OCaml is case sensitive. 36071d4279SBram Moolenaarsyn case match 37071d4279SBram Moolenaar 3820f90cf9SBram Moolenaar" Access to the method of an object 3920f90cf9SBram Moolenaarsyn match ocamlMethod "#" 4020f90cf9SBram Moolenaar 41071d4279SBram Moolenaar" Script headers highlighted like comments 4216ea3676SBram Moolenaarsyn match ocamlComment "^#!.*" contains=@Spell 43071d4279SBram Moolenaar 44071d4279SBram Moolenaar" Scripting directives 45773a97c2SBram Moolenaarsyn match ocamlScript "^#\<\(quit\|labels\|warnings\|warn_error\|directory\|remove_directory\|cd\|load\|load_rec\|use\|mod_use\|install_printer\|remove_printer\|require\|list\|ppx\|principal\|predicates\|rectypes\|thread\|trace\|untrace\|untrace_all\|print_depth\|print_length\|camlp4o\|camlp4r\|topfind_log\|topfind_verbose\)\>" 469964e468SBram Moolenaar 47071d4279SBram Moolenaar" lowercase identifier - the standard way to match 48071d4279SBram Moolenaarsyn match ocamlLCIdentifier /\<\(\l\|_\)\(\w\|'\)*\>/ 49071d4279SBram Moolenaar 50071d4279SBram Moolenaarsyn match ocamlKeyChar "|" 51071d4279SBram Moolenaar 52071d4279SBram Moolenaar" Errors 53071d4279SBram Moolenaarsyn match ocamlBraceErr "}" 54071d4279SBram Moolenaarsyn match ocamlBrackErr "\]" 55071d4279SBram Moolenaarsyn match ocamlParenErr ")" 56071d4279SBram Moolenaarsyn match ocamlArrErr "|]" 57071d4279SBram Moolenaar 58071d4279SBram Moolenaarsyn match ocamlCommentErr "\*)" 59071d4279SBram Moolenaar 60071d4279SBram Moolenaarsyn match ocamlCountErr "\<downto\>" 61071d4279SBram Moolenaarsyn match ocamlCountErr "\<to\>" 62071d4279SBram Moolenaar 63071d4279SBram Moolenaarif !exists("ocaml_revised") 64071d4279SBram Moolenaar syn match ocamlDoErr "\<do\>" 65071d4279SBram Moolenaarendif 66071d4279SBram Moolenaar 67071d4279SBram Moolenaarsyn match ocamlDoneErr "\<done\>" 68071d4279SBram Moolenaarsyn match ocamlThenErr "\<then\>" 69071d4279SBram Moolenaar 70071d4279SBram Moolenaar" Error-highlighting of "end" without synchronization: 71071d4279SBram Moolenaar" as keyword or as error (default) 72071d4279SBram Moolenaarif exists("ocaml_noend_error") 73071d4279SBram Moolenaar syn match ocamlKeyword "\<end\>" 74071d4279SBram Moolenaarelse 75071d4279SBram Moolenaar syn match ocamlEndErr "\<end\>" 76071d4279SBram Moolenaarendif 77071d4279SBram Moolenaar 78071d4279SBram Moolenaar" Some convenient clusters 79071d4279SBram Moolenaarsyn cluster ocamlAllErrs contains=ocamlBraceErr,ocamlBrackErr,ocamlParenErr,ocamlCommentErr,ocamlCountErr,ocamlDoErr,ocamlDoneErr,ocamlEndErr,ocamlThenErr 80071d4279SBram Moolenaar 81071d4279SBram Moolenaarsyn cluster ocamlAENoParen contains=ocamlBraceErr,ocamlBrackErr,ocamlCommentErr,ocamlCountErr,ocamlDoErr,ocamlDoneErr,ocamlEndErr,ocamlThenErr 82071d4279SBram Moolenaar 83773a97c2SBram Moolenaarsyn cluster ocamlContained contains=ocamlTodo,ocamlPreDef,ocamlModParam,ocamlModParam1,ocamlMPRestr,ocamlMPRestr1,ocamlMPRestr2,ocamlMPRestr3,ocamlModRHS,ocamlFuncWith,ocamlFuncStruct,ocamlModTypeRestr,ocamlModTRWith,ocamlWith,ocamlWithRest,ocamlModType,ocamlFullMod,ocamlVal 84071d4279SBram Moolenaar 85071d4279SBram Moolenaar 86071d4279SBram Moolenaar" Enclosing delimiters 87071d4279SBram Moolenaarsyn region ocamlEncl transparent matchgroup=ocamlKeyword start="(" matchgroup=ocamlKeyword end=")" contains=ALLBUT,@ocamlContained,ocamlParenErr 88071d4279SBram Moolenaarsyn region ocamlEncl transparent matchgroup=ocamlKeyword start="{" matchgroup=ocamlKeyword end="}" contains=ALLBUT,@ocamlContained,ocamlBraceErr 89071d4279SBram Moolenaarsyn region ocamlEncl transparent matchgroup=ocamlKeyword start="\[" matchgroup=ocamlKeyword end="\]" contains=ALLBUT,@ocamlContained,ocamlBrackErr 90071d4279SBram Moolenaarsyn region ocamlEncl transparent matchgroup=ocamlKeyword start="\[|" matchgroup=ocamlKeyword end="|\]" contains=ALLBUT,@ocamlContained,ocamlArrErr 91071d4279SBram Moolenaar 92071d4279SBram Moolenaar 93071d4279SBram Moolenaar" Comments 9416ea3676SBram Moolenaarsyn region ocamlComment start="(\*" end="\*)" contains=@Spell,ocamlComment,ocamlTodo 95202795beSBram Moolenaarsyn keyword ocamlTodo contained TODO FIXME XXX NOTE 96071d4279SBram Moolenaar 97071d4279SBram Moolenaar 98071d4279SBram Moolenaar" Objects 99202795beSBram Moolenaarsyn region ocamlEnd matchgroup=ocamlObject start="\<object\>" matchgroup=ocamlObject end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr 100071d4279SBram Moolenaar 101071d4279SBram Moolenaar 102071d4279SBram Moolenaar" Blocks 103071d4279SBram Moolenaarif !exists("ocaml_revised") 104071d4279SBram Moolenaar syn region ocamlEnd matchgroup=ocamlKeyword start="\<begin\>" matchgroup=ocamlKeyword end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr 105071d4279SBram Moolenaarendif 106071d4279SBram Moolenaar 107071d4279SBram Moolenaar 108071d4279SBram Moolenaar" "for" 109071d4279SBram Moolenaarsyn region ocamlNone matchgroup=ocamlKeyword start="\<for\>" matchgroup=ocamlKeyword end="\<\(to\|downto\)\>" contains=ALLBUT,@ocamlContained,ocamlCountErr 110071d4279SBram Moolenaar 111071d4279SBram Moolenaar 112071d4279SBram Moolenaar" "do" 113071d4279SBram Moolenaarif !exists("ocaml_revised") 114071d4279SBram Moolenaar syn region ocamlDo matchgroup=ocamlKeyword start="\<do\>" matchgroup=ocamlKeyword end="\<done\>" contains=ALLBUT,@ocamlContained,ocamlDoneErr 115071d4279SBram Moolenaarendif 116071d4279SBram Moolenaar 117071d4279SBram Moolenaar" "if" 118071d4279SBram Moolenaarsyn region ocamlNone matchgroup=ocamlKeyword start="\<if\>" matchgroup=ocamlKeyword end="\<then\>" contains=ALLBUT,@ocamlContained,ocamlThenErr 119071d4279SBram Moolenaar 120773a97c2SBram Moolenaar"" PPX nodes 121773a97c2SBram Moolenaar 122773a97c2SBram Moolenaarsyn match ocamlPpxIdentifier /\(\[@\{1,3\}\)\@<=\w\+\(\.\w\+\)*/ 123773a97c2SBram Moolenaarsyn region ocamlPpx matchgroup=ocamlPpxEncl start="\[@\{1,3\}" contains=TOP end="\]" 124071d4279SBram Moolenaar 125071d4279SBram Moolenaar"" Modules 126071d4279SBram Moolenaar 127071d4279SBram Moolenaar" "sig" 128773a97c2SBram Moolenaarsyn region ocamlSig matchgroup=ocamlSigEncl start="\<sig\>" matchgroup=ocamlSigEncl end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr,ocamlModule 129071d4279SBram Moolenaarsyn region ocamlModSpec matchgroup=ocamlKeyword start="\<module\>" matchgroup=ocamlModule end="\<\u\(\w\|'\)*\>" contained contains=@ocamlAllErrs,ocamlComment skipwhite skipempty nextgroup=ocamlModTRWith,ocamlMPRestr 130071d4279SBram Moolenaar 131071d4279SBram Moolenaar" "open" 132*7e6a515eSBram Moolenaarsyn match ocamlKeyword "\<open\>" skipwhite skipempty nextgroup=ocamlFullMod 133071d4279SBram Moolenaar 134071d4279SBram Moolenaar" "include" 135202795beSBram Moolenaarsyn match ocamlKeyword "\<include\>" skipwhite skipempty nextgroup=ocamlModParam,ocamlFullMod 136071d4279SBram Moolenaar 137071d4279SBram Moolenaar" "module" - somewhat complicated stuff ;-) 138071d4279SBram Moolenaarsyn region ocamlModule matchgroup=ocamlKeyword start="\<module\>" matchgroup=ocamlModule end="\<\u\(\w\|'\)*\>" contains=@ocamlAllErrs,ocamlComment skipwhite skipempty nextgroup=ocamlPreDef 139773a97c2SBram Moolenaarsyn region ocamlPreDef start="."me=e-1 matchgroup=ocamlKeyword end="\l\|=\|)"me=e-1 contained contains=@ocamlAllErrs,ocamlComment,ocamlModParam,ocamlGenMod,ocamlModTypeRestr,ocamlModTRWith nextgroup=ocamlModPreRHS 140773a97c2SBram Moolenaarsyn region ocamlModParam start="([^*]" end=")" contained contains=ocamlGenMod,ocamlModParam1,ocamlSig,ocamlVal 141773a97c2SBram Moolenaarsyn match ocamlModParam1 "\<\u\(\w\|'\)*\>" contained skipwhite skipempty 142773a97c2SBram Moolenaarsyn match ocamlGenMod "()" contained skipwhite skipempty 143071d4279SBram Moolenaar 144071d4279SBram Moolenaarsyn region ocamlMPRestr start=":" end="."me=e-1 contained contains=@ocamlComment skipwhite skipempty nextgroup=ocamlMPRestr1,ocamlMPRestr2,ocamlMPRestr3 145773a97c2SBram Moolenaarsyn region ocamlMPRestr1 matchgroup=ocamlSigEncl start="\ssig\s\=" matchgroup=ocamlSigEncl end="\<end\>" contained contains=ALLBUT,@ocamlContained,ocamlEndErr,ocamlModule 146773a97c2SBram Moolenaarsyn region ocamlMPRestr2 start="\sfunctor\(\s\|(\)\="me=e-1 matchgroup=ocamlKeyword end="->" contained contains=@ocamlAllErrs,ocamlComment,ocamlModParam,ocamlGenMod skipwhite skipempty nextgroup=ocamlFuncWith,ocamlMPRestr2 14716ea3676SBram Moolenaarsyn match ocamlMPRestr3 "\w\(\w\|'\)*\( *\. *\w\(\w\|'\)*\)*" contained 148071d4279SBram Moolenaarsyn match ocamlModPreRHS "=" contained skipwhite skipempty nextgroup=ocamlModParam,ocamlFullMod 14920f90cf9SBram Moolenaarsyn keyword ocamlKeyword val 15016ea3676SBram Moolenaarsyn region ocamlVal matchgroup=ocamlKeyword start="\<val\>" matchgroup=ocamlLCIdentifier end="\<\l\(\w\|'\)*\>" contains=@ocamlAllErrs,ocamlComment,ocamlFullMod skipwhite skipempty nextgroup=ocamlMPRestr 15116ea3676SBram Moolenaarsyn region ocamlModRHS start="." end=". *\w\|([^*]"me=e-2 contained contains=ocamlComment skipwhite skipempty nextgroup=ocamlModParam,ocamlFullMod 15216ea3676SBram Moolenaarsyn match ocamlFullMod "\<\u\(\w\|'\)*\( *\. *\u\(\w\|'\)*\)*" contained skipwhite skipempty nextgroup=ocamlFuncWith 153071d4279SBram Moolenaar 154773a97c2SBram Moolenaarsyn region ocamlFuncWith start="([^*)]"me=e-1 end=")" contained contains=ocamlComment,ocamlWith,ocamlFuncStruct skipwhite skipempty nextgroup=ocamlFuncWith 155773a97c2SBram Moolenaarsyn region ocamlFuncStruct matchgroup=ocamlStructEncl start="[^a-zA-Z]struct\>"hs=s+1 matchgroup=ocamlStructEncl end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr 156071d4279SBram Moolenaar 15716ea3676SBram Moolenaarsyn match ocamlModTypeRestr "\<\w\(\w\|'\)*\( *\. *\w\(\w\|'\)*\)*\>" contained 158071d4279SBram Moolenaarsyn region ocamlModTRWith start=":\s*("hs=s+1 end=")" contained contains=@ocamlAENoParen,ocamlWith 15916ea3676SBram Moolenaarsyn match ocamlWith "\<\(\u\(\w\|'\)* *\. *\)*\w\(\w\|'\)*\>" contained skipwhite skipempty nextgroup=ocamlWithRest 160071d4279SBram Moolenaarsyn region ocamlWithRest start="[^)]" end=")"me=e-1 contained contains=ALLBUT,@ocamlContained 161071d4279SBram Moolenaar 16220f90cf9SBram Moolenaar" "struct" 163773a97c2SBram Moolenaarsyn region ocamlStruct matchgroup=ocamlStructEncl start="\<\(module\s\+\)\=struct\>" matchgroup=ocamlStructEncl end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr 16420f90cf9SBram Moolenaar 165071d4279SBram Moolenaar" "module type" 16620f90cf9SBram Moolenaarsyn region ocamlKeyword start="\<module\>\s*\<type\>\(\s*\<of\>\)\=" matchgroup=ocamlModule end="\<\w\(\w\|'\)*\>" contains=ocamlComment skipwhite skipempty nextgroup=ocamlMTDef 16716ea3676SBram Moolenaarsyn match ocamlMTDef "=\s*\w\(\w\|'\)*\>"hs=s+1,me=s+1 skipwhite skipempty nextgroup=ocamlFullMod 168071d4279SBram Moolenaar 169773a97c2SBram Moolenaar" Quoted strings 170773a97c2SBram Moolenaarsyn region ocamlString matchgroup=ocamlQuotedStringDelim start="{\z\([a-z_]*\)|" end="|\z1}" contains=@Spell 171773a97c2SBram Moolenaar 172071d4279SBram Moolenaarsyn keyword ocamlKeyword and as assert class 173071d4279SBram Moolenaarsyn keyword ocamlKeyword constraint else 174071d4279SBram Moolenaarsyn keyword ocamlKeyword exception external fun 175071d4279SBram Moolenaar 176071d4279SBram Moolenaarsyn keyword ocamlKeyword in inherit initializer 177773a97c2SBram Moolenaarsyn keyword ocamlKeyword lazy let match 178773a97c2SBram Moolenaarsyn keyword ocamlKeyword method mutable new nonrec of 179773a97c2SBram Moolenaarsyn keyword ocamlKeyword parser private rec 180071d4279SBram Moolenaarsyn keyword ocamlKeyword try type 18120f90cf9SBram Moolenaarsyn keyword ocamlKeyword virtual when while with 182071d4279SBram Moolenaar 183071d4279SBram Moolenaarif exists("ocaml_revised") 184071d4279SBram Moolenaar syn keyword ocamlKeyword do value 185071d4279SBram Moolenaar syn keyword ocamlBoolean True False 186071d4279SBram Moolenaarelse 187071d4279SBram Moolenaar syn keyword ocamlKeyword function 188071d4279SBram Moolenaar syn keyword ocamlBoolean true false 189071d4279SBram Moolenaarendif 190071d4279SBram Moolenaar 191202795beSBram Moolenaarsyn keyword ocamlType array bool char exn float format format4 192202795beSBram Moolenaarsyn keyword ocamlType int int32 int64 lazy_t list nativeint option 193773a97c2SBram Moolenaarsyn keyword ocamlType bytes string unit 194071d4279SBram Moolenaar 195071d4279SBram Moolenaarsyn match ocamlConstructor "(\s*)" 196071d4279SBram Moolenaarsyn match ocamlConstructor "\[\s*\]" 197071d4279SBram Moolenaarsyn match ocamlConstructor "\[|\s*>|]" 198071d4279SBram Moolenaarsyn match ocamlConstructor "\[<\s*>\]" 199071d4279SBram Moolenaarsyn match ocamlConstructor "\u\(\w\|'\)*\>" 200071d4279SBram Moolenaar 201071d4279SBram Moolenaar" Polymorphic variants 202071d4279SBram Moolenaarsyn match ocamlConstructor "`\w\(\w\|'\)*\>" 203071d4279SBram Moolenaar 204071d4279SBram Moolenaar" Module prefix 20516ea3676SBram Moolenaarsyn match ocamlModPath "\u\(\w\|'\)* *\."he=e-1 206071d4279SBram Moolenaar 207071d4279SBram Moolenaarsyn match ocamlCharacter "'\\\d\d\d'\|'\\[\'ntbr]'\|'.'" 20820f90cf9SBram Moolenaarsyn match ocamlCharacter "'\\x\x\x'" 209071d4279SBram Moolenaarsyn match ocamlCharErr "'\\\d\d'\|'\\\d'" 210071d4279SBram Moolenaarsyn match ocamlCharErr "'\\[^\'ntbr]'" 21116ea3676SBram Moolenaarsyn region ocamlString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@Spell 212071d4279SBram Moolenaar 213071d4279SBram Moolenaarsyn match ocamlTopStop ";;" 214071d4279SBram Moolenaar 215071d4279SBram Moolenaarsyn match ocamlAnyVar "\<_\>" 216071d4279SBram Moolenaarsyn match ocamlKeyChar "|[^\]]"me=e-1 217071d4279SBram Moolenaarsyn match ocamlKeyChar ";" 218071d4279SBram Moolenaarsyn match ocamlKeyChar "\~" 219071d4279SBram Moolenaarsyn match ocamlKeyChar "?" 220071d4279SBram Moolenaar 221773a97c2SBram Moolenaar"" Operators 222773a97c2SBram Moolenaar 223773a97c2SBram Moolenaar" The grammar of operators is found there: 224773a97c2SBram Moolenaar" https://caml.inria.fr/pub/docs/manual-ocaml/names.html#operator-name 225773a97c2SBram Moolenaar" https://caml.inria.fr/pub/docs/manual-ocaml/extn.html#s:ext-ops 226773a97c2SBram Moolenaar" https://caml.inria.fr/pub/docs/manual-ocaml/extn.html#s:index-operators 227773a97c2SBram Moolenaar" =, *, < and > are both operator names and keywords, we let the user choose how 228773a97c2SBram Moolenaar" to display them (has to be declared before regular infix operators): 229773a97c2SBram Moolenaarsyn match ocamlEqual "=" 230773a97c2SBram Moolenaarsyn match ocamlStar "*" 231773a97c2SBram Moolenaarsyn match ocamlAngle "<" 232773a97c2SBram Moolenaarsyn match ocamlAngle ">" 233773a97c2SBram Moolenaar" Custom indexing operators: 234*7e6a515eSBram Moolenaarsyn region ocamlIndexing matchgroup=ocamlIndexingOp 235*7e6a515eSBram Moolenaar \ start="\.[~?!:|&$%=>@^/*+-][~?!.:|&$%<=>@^*/+-]*\_s*(" 236*7e6a515eSBram Moolenaar \ end=")\(\_s*<-\)\?" 237*7e6a515eSBram Moolenaar \ contains=ALLBUT,@ocamlContained,ocamlParenErr 238*7e6a515eSBram Moolenaarsyn region ocamlIndexing matchgroup=ocamlIndexingOp 239*7e6a515eSBram Moolenaar \ start="\.[~?!:|&$%=>@^/*+-][~?!.:|&$%<=>@^*/+-]*\_s*\[" 240*7e6a515eSBram Moolenaar \ end="]\(\_s*<-\)\?" 241*7e6a515eSBram Moolenaar \ contains=ALLBUT,@ocamlContained,ocamlBrackErr 242*7e6a515eSBram Moolenaarsyn region ocamlIndexing matchgroup=ocamlIndexingOp 243*7e6a515eSBram Moolenaar \ start="\.[~?!:|&$%=>@^/*+-][~?!.:|&$%<=>@^*/+-]*\_s*{" 244*7e6a515eSBram Moolenaar \ end="}\(\_s*<-\)\?" 245*7e6a515eSBram Moolenaar \ contains=ALLBUT,@ocamlContained,ocamlBraceErr 246773a97c2SBram Moolenaar" Extension operators (has to be declared before regular infix operators): 247773a97c2SBram Moolenaarsyn match ocamlExtensionOp "#[#~?!.:|&$%<=>@^*/+-]\+" 248773a97c2SBram Moolenaar" Infix and prefix operators: 249773a97c2SBram Moolenaarsyn match ocamlPrefixOp "![~?!.:|&$%<=>@^*/+-]*" 250773a97c2SBram Moolenaarsyn match ocamlPrefixOp "[~?][~?!.:|&$%<=>@^*/+-]\+" 251773a97c2SBram Moolenaarsyn match ocamlInfixOp "[&$%@^/+-][~?!.:|&$%<=>@^*/+-]*" 252773a97c2SBram Moolenaarsyn match ocamlInfixOp "[|<=>*][~?!.:|&$%<=>@^*/+-]\+" 253773a97c2SBram Moolenaarsyn match ocamlInfixOp "#[~?!.:|&$%<=>@^*/+-]\+#\@!" 254773a97c2SBram Moolenaarsyn match ocamlInfixOp "!=[~?!.:|&$%<=>@^*/+-]\@!" 255773a97c2SBram Moolenaarsyn keyword ocamlInfixOpKeyword asr land lor lsl lsr lxor mod or 256773a97c2SBram Moolenaar" := is technically an infix operator, but we may want to show it as a keyword 257773a97c2SBram Moolenaar" (somewhat analogously to = for let‐bindings and <- for assignations): 258773a97c2SBram Moolenaarsyn match ocamlRefAssign ":=" 259773a97c2SBram Moolenaar" :: is technically not an operator, but we may want to show it as such: 260773a97c2SBram Moolenaarsyn match ocamlCons "::" 261773a97c2SBram Moolenaar" -> and <- are keywords, not operators (but can appear in longer operators): 262773a97c2SBram Moolenaarsyn match ocamlArrow "->[~?!.:|&$%<=>@^*/+-]\@!" 263071d4279SBram Moolenaarif exists("ocaml_revised") 264773a97c2SBram Moolenaar syn match ocamlErr "<-[~?!.:|&$%<=>@^*/+-]\@!" 265071d4279SBram Moolenaarelse 266773a97c2SBram Moolenaar syn match ocamlKeyChar "<-[~?!.:|&$%<=>@^*/+-]\@!" 267071d4279SBram Moolenaarendif 268071d4279SBram Moolenaar 269773a97c2SBram Moolenaarsyn match ocamlNumber "-\=\<\d\(_\|\d\)*[l|L|n]\?\>" 270773a97c2SBram Moolenaarsyn match ocamlNumber "-\=\<0[x|X]\(\x\|_\)\+[l|L|n]\?\>" 271773a97c2SBram Moolenaarsyn match ocamlNumber "-\=\<0[o|O]\(\o\|_\)\+[l|L|n]\?\>" 272773a97c2SBram Moolenaarsyn match ocamlNumber "-\=\<0[b|B]\([01]\|_\)\+[l|L|n]\?\>" 273773a97c2SBram Moolenaarsyn match ocamlFloat "-\=\<\d\(_\|\d\)*\.\?\(_\|\d\)*\([eE][-+]\=\d\(_\|\d\)*\)\=\>" 274071d4279SBram Moolenaar 275071d4279SBram Moolenaar" Labels 276071d4279SBram Moolenaarsyn match ocamlLabel "\~\(\l\|_\)\(\w\|'\)*"lc=1 277071d4279SBram Moolenaarsyn match ocamlLabel "?\(\l\|_\)\(\w\|'\)*"lc=1 278773a97c2SBram Moolenaarsyn region ocamlLabel transparent matchgroup=ocamlLabel start="[~?](\(\l\|_\)\(\w\|'\)*"lc=2 end=")"me=e-1 contains=ALLBUT,@ocamlContained,ocamlParenErr 279071d4279SBram Moolenaar 280071d4279SBram Moolenaar 281071d4279SBram Moolenaar" Synchronization 282071d4279SBram Moolenaarsyn sync minlines=50 283071d4279SBram Moolenaarsyn sync maxlines=500 284071d4279SBram Moolenaar 285071d4279SBram Moolenaarif !exists("ocaml_revised") 286071d4279SBram Moolenaar syn sync match ocamlDoSync grouphere ocamlDo "\<do\>" 287071d4279SBram Moolenaar syn sync match ocamlDoSync groupthere ocamlDo "\<done\>" 288071d4279SBram Moolenaarendif 289071d4279SBram Moolenaar 290071d4279SBram Moolenaarif exists("ocaml_revised") 291071d4279SBram Moolenaar syn sync match ocamlEndSync grouphere ocamlEnd "\<\(object\)\>" 292071d4279SBram Moolenaarelse 293071d4279SBram Moolenaar syn sync match ocamlEndSync grouphere ocamlEnd "\<\(begin\|object\)\>" 294071d4279SBram Moolenaarendif 295071d4279SBram Moolenaar 296071d4279SBram Moolenaarsyn sync match ocamlEndSync groupthere ocamlEnd "\<end\>" 297071d4279SBram Moolenaarsyn sync match ocamlStructSync grouphere ocamlStruct "\<struct\>" 298071d4279SBram Moolenaarsyn sync match ocamlStructSync groupthere ocamlStruct "\<end\>" 299071d4279SBram Moolenaarsyn sync match ocamlSigSync grouphere ocamlSig "\<sig\>" 300071d4279SBram Moolenaarsyn sync match ocamlSigSync groupthere ocamlSig "\<end\>" 301071d4279SBram Moolenaar 302071d4279SBram Moolenaar" Define the default highlighting. 303071d4279SBram Moolenaar 304f37506f6SBram Moolenaarhi def link ocamlBraceErr Error 305f37506f6SBram Moolenaarhi def link ocamlBrackErr Error 306f37506f6SBram Moolenaarhi def link ocamlParenErr Error 307f37506f6SBram Moolenaarhi def link ocamlArrErr Error 308071d4279SBram Moolenaar 309f37506f6SBram Moolenaarhi def link ocamlCommentErr Error 310071d4279SBram Moolenaar 311f37506f6SBram Moolenaarhi def link ocamlCountErr Error 312f37506f6SBram Moolenaarhi def link ocamlDoErr Error 313f37506f6SBram Moolenaarhi def link ocamlDoneErr Error 314f37506f6SBram Moolenaarhi def link ocamlEndErr Error 315f37506f6SBram Moolenaarhi def link ocamlThenErr Error 316071d4279SBram Moolenaar 317f37506f6SBram Moolenaarhi def link ocamlCharErr Error 318071d4279SBram Moolenaar 319f37506f6SBram Moolenaarhi def link ocamlErr Error 320071d4279SBram Moolenaar 321f37506f6SBram Moolenaarhi def link ocamlComment Comment 322071d4279SBram Moolenaar 323f37506f6SBram Moolenaarhi def link ocamlModPath Include 324f37506f6SBram Moolenaarhi def link ocamlObject Include 325f37506f6SBram Moolenaarhi def link ocamlModule Include 326f37506f6SBram Moolenaarhi def link ocamlModParam1 Include 327*7e6a515eSBram Moolenaarhi def link ocamlGenMod Include 328f37506f6SBram Moolenaarhi def link ocamlModType Include 329f37506f6SBram Moolenaarhi def link ocamlMPRestr3 Include 330f37506f6SBram Moolenaarhi def link ocamlFullMod Include 331*7e6a515eSBram Moolenaarhi def link ocamlFuncWith Include 332*7e6a515eSBram Moolenaarhi def link ocamlModParam Include 333f37506f6SBram Moolenaarhi def link ocamlModTypeRestr Include 334f37506f6SBram Moolenaarhi def link ocamlWith Include 335f37506f6SBram Moolenaarhi def link ocamlMTDef Include 336773a97c2SBram Moolenaarhi def link ocamlSigEncl ocamlModule 337773a97c2SBram Moolenaarhi def link ocamlStructEncl ocamlModule 338071d4279SBram Moolenaar 339f37506f6SBram Moolenaarhi def link ocamlScript Include 340071d4279SBram Moolenaar 341f37506f6SBram Moolenaarhi def link ocamlConstructor Constant 342071d4279SBram Moolenaar 343f37506f6SBram Moolenaarhi def link ocamlVal Keyword 344f37506f6SBram Moolenaarhi def link ocamlModPreRHS Keyword 345f37506f6SBram Moolenaarhi def link ocamlMPRestr2 Keyword 346f37506f6SBram Moolenaarhi def link ocamlKeyword Keyword 347f37506f6SBram Moolenaarhi def link ocamlMethod Include 348*7e6a515eSBram Moolenaarhi def link ocamlArrow Keyword 349f37506f6SBram Moolenaarhi def link ocamlKeyChar Keyword 350f37506f6SBram Moolenaarhi def link ocamlAnyVar Keyword 351f37506f6SBram Moolenaarhi def link ocamlTopStop Keyword 352773a97c2SBram Moolenaar 353773a97c2SBram Moolenaarhi def link ocamlRefAssign ocamlKeyChar 354773a97c2SBram Moolenaarhi def link ocamlEqual ocamlKeyChar 355773a97c2SBram Moolenaarhi def link ocamlStar ocamlInfixOp 356773a97c2SBram Moolenaarhi def link ocamlAngle ocamlInfixOp 357773a97c2SBram Moolenaarhi def link ocamlCons ocamlInfixOp 358773a97c2SBram Moolenaar 359773a97c2SBram Moolenaarhi def link ocamlPrefixOp ocamlOperator 360773a97c2SBram Moolenaarhi def link ocamlInfixOp ocamlOperator 361773a97c2SBram Moolenaarhi def link ocamlExtensionOp ocamlOperator 362773a97c2SBram Moolenaarhi def link ocamlIndexingOp ocamlOperator 363773a97c2SBram Moolenaar 364773a97c2SBram Moolenaarif exists("ocaml_highlight_operators") 365773a97c2SBram Moolenaar hi def link ocamlInfixOpKeyword ocamlOperator 366773a97c2SBram Moolenaar hi def link ocamlOperator Operator 367773a97c2SBram Moolenaarelse 368773a97c2SBram Moolenaar hi def link ocamlInfixOpKeyword Keyword 369773a97c2SBram Moolenaarendif 370071d4279SBram Moolenaar 371f37506f6SBram Moolenaarhi def link ocamlBoolean Boolean 372f37506f6SBram Moolenaarhi def link ocamlCharacter Character 373f37506f6SBram Moolenaarhi def link ocamlNumber Number 374f37506f6SBram Moolenaarhi def link ocamlFloat Float 375f37506f6SBram Moolenaarhi def link ocamlString String 376773a97c2SBram Moolenaarhi def link ocamlQuotedStringDelim Identifier 377071d4279SBram Moolenaar 378f37506f6SBram Moolenaarhi def link ocamlLabel Identifier 379071d4279SBram Moolenaar 380f37506f6SBram Moolenaarhi def link ocamlType Type 381071d4279SBram Moolenaar 382f37506f6SBram Moolenaarhi def link ocamlTodo Todo 383071d4279SBram Moolenaar 384f37506f6SBram Moolenaarhi def link ocamlEncl Keyword 385071d4279SBram Moolenaar 386773a97c2SBram Moolenaarhi def link ocamlPpxEncl ocamlEncl 387071d4279SBram Moolenaar 388071d4279SBram Moolenaarlet b:current_syntax = "ocaml" 389071d4279SBram Moolenaar 390*7e6a515eSBram Moolenaarlet &cpo = s:keepcpo 391*7e6a515eSBram Moolenaarunlet s:keepcpo 392*7e6a515eSBram Moolenaar 393071d4279SBram Moolenaar" vim: ts=8 394