xref: /vim-8.2.3635/runtime/syntax/ocaml.vim (revision 00a927d6)
1" Vim syntax file
2" Language:     OCaml
3" Filenames:    *.ml *.mli *.mll *.mly
4" Maintainers:  Markus Mottl      <[email protected]>
5"               Karl-Heinz Sylla  <[email protected]>
6"               Issac Trotts      <[email protected]>
7" URL:          http://www.ocaml.info/vim/syntax/ocaml.vim
8" Last Change:  2007 Apr 13 - Added highlighting of nativeints (MM)
9"               2006 Oct 09 - More highlighting improvements to numbers (MM)
10"               2006 Sep 19 - Improved highlighting of numbers (Florent Monnier)
11
12" A minor patch was applied to the official version so that object/end
13" can be distinguished from begin/end, which is used for indentation,
14" and folding. (David Baelde)
15
16" For version 5.x: Clear all syntax items
17" For version 6.x: Quit when a syntax file was already loaded
18if version < 600
19  syntax clear
20elseif exists("b:current_syntax") && b:current_syntax == "ocaml"
21  finish
22endif
23
24" OCaml is case sensitive.
25syn case match
26
27" Script headers highlighted like comments
28syn match    ocamlComment   "^#!.*"
29
30" Scripting directives
31syn match    ocamlScript "^#\<\(quit\|labels\|warnings\|directory\|cd\|load\|use\|install_printer\|remove_printer\|require\|thread\|trace\|untrace\|untrace_all\|print_depth\|print_length\)\>"
32
33" Script headers highlighted like comments
34syn match    ocamlComment      "^#!.*"
35
36" lowercase identifier - the standard way to match
37syn match    ocamlLCIdentifier /\<\(\l\|_\)\(\w\|'\)*\>/
38
39syn match    ocamlKeyChar    "|"
40
41" Errors
42syn match    ocamlBraceErr   "}"
43syn match    ocamlBrackErr   "\]"
44syn match    ocamlParenErr   ")"
45syn match    ocamlArrErr     "|]"
46
47syn match    ocamlCommentErr "\*)"
48
49syn match    ocamlCountErr   "\<downto\>"
50syn match    ocamlCountErr   "\<to\>"
51
52if !exists("ocaml_revised")
53  syn match    ocamlDoErr      "\<do\>"
54endif
55
56syn match    ocamlDoneErr    "\<done\>"
57syn match    ocamlThenErr    "\<then\>"
58
59" Error-highlighting of "end" without synchronization:
60" as keyword or as error (default)
61if exists("ocaml_noend_error")
62  syn match    ocamlKeyword    "\<end\>"
63else
64  syn match    ocamlEndErr     "\<end\>"
65endif
66
67" Some convenient clusters
68syn cluster  ocamlAllErrs contains=ocamlBraceErr,ocamlBrackErr,ocamlParenErr,ocamlCommentErr,ocamlCountErr,ocamlDoErr,ocamlDoneErr,ocamlEndErr,ocamlThenErr
69
70syn cluster  ocamlAENoParen contains=ocamlBraceErr,ocamlBrackErr,ocamlCommentErr,ocamlCountErr,ocamlDoErr,ocamlDoneErr,ocamlEndErr,ocamlThenErr
71
72syn cluster  ocamlContained contains=ocamlTodo,ocamlPreDef,ocamlModParam,ocamlModParam1,ocamlPreMPRestr,ocamlMPRestr,ocamlMPRestr1,ocamlMPRestr2,ocamlMPRestr3,ocamlModRHS,ocamlFuncWith,ocamlFuncStruct,ocamlModTypeRestr,ocamlModTRWith,ocamlWith,ocamlWithRest,ocamlModType,ocamlFullMod
73
74
75" Enclosing delimiters
76syn region   ocamlEncl transparent matchgroup=ocamlKeyword start="(" matchgroup=ocamlKeyword end=")" contains=ALLBUT,@ocamlContained,ocamlParenErr
77syn region   ocamlEncl transparent matchgroup=ocamlKeyword start="{" matchgroup=ocamlKeyword end="}"  contains=ALLBUT,@ocamlContained,ocamlBraceErr
78syn region   ocamlEncl transparent matchgroup=ocamlKeyword start="\[" matchgroup=ocamlKeyword end="\]" contains=ALLBUT,@ocamlContained,ocamlBrackErr
79syn region   ocamlEncl transparent matchgroup=ocamlKeyword start="\[|" matchgroup=ocamlKeyword end="|\]" contains=ALLBUT,@ocamlContained,ocamlArrErr
80
81
82" Comments
83syn region   ocamlComment start="(\*" end="\*)" contains=ocamlComment,ocamlTodo
84syn keyword  ocamlTodo contained TODO FIXME XXX NOTE
85
86
87" Objects
88syn region   ocamlEnd matchgroup=ocamlObject start="\<object\>" matchgroup=ocamlObject end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
89
90
91" Blocks
92if !exists("ocaml_revised")
93  syn region   ocamlEnd matchgroup=ocamlKeyword start="\<begin\>" matchgroup=ocamlKeyword end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
94endif
95
96
97" "for"
98syn region   ocamlNone matchgroup=ocamlKeyword start="\<for\>" matchgroup=ocamlKeyword end="\<\(to\|downto\)\>" contains=ALLBUT,@ocamlContained,ocamlCountErr
99
100
101" "do"
102if !exists("ocaml_revised")
103  syn region   ocamlDo matchgroup=ocamlKeyword start="\<do\>" matchgroup=ocamlKeyword end="\<done\>" contains=ALLBUT,@ocamlContained,ocamlDoneErr
104endif
105
106" "if"
107syn region   ocamlNone matchgroup=ocamlKeyword start="\<if\>" matchgroup=ocamlKeyword end="\<then\>" contains=ALLBUT,@ocamlContained,ocamlThenErr
108
109
110"" Modules
111
112" "struct"
113syn region   ocamlStruct matchgroup=ocamlModule start="\<struct\>" matchgroup=ocamlModule end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
114
115" "sig"
116syn region   ocamlSig matchgroup=ocamlModule start="\<sig\>" matchgroup=ocamlModule end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr,ocamlModule
117syn region   ocamlModSpec matchgroup=ocamlKeyword start="\<module\>" matchgroup=ocamlModule end="\<\u\(\w\|'\)*\>" contained contains=@ocamlAllErrs,ocamlComment skipwhite skipempty nextgroup=ocamlModTRWith,ocamlMPRestr
118
119" "open"
120syn region   ocamlNone matchgroup=ocamlKeyword start="\<open\>" matchgroup=ocamlModule end="\<\u\(\w\|'\)*\(\.\u\(\w\|'\)*\)*\>" contains=@ocamlAllErrs,ocamlComment
121
122" "include"
123syn match    ocamlKeyword "\<include\>" skipwhite skipempty nextgroup=ocamlModParam,ocamlFullMod
124
125" "module" - somewhat complicated stuff ;-)
126syn region   ocamlModule matchgroup=ocamlKeyword start="\<module\>" matchgroup=ocamlModule end="\<\u\(\w\|'\)*\>" contains=@ocamlAllErrs,ocamlComment skipwhite skipempty nextgroup=ocamlPreDef
127syn region   ocamlPreDef start="."me=e-1 matchgroup=ocamlKeyword end="\l\|="me=e-1 contained contains=@ocamlAllErrs,ocamlComment,ocamlModParam,ocamlModTypeRestr,ocamlModTRWith nextgroup=ocamlModPreRHS
128syn region   ocamlModParam start="([^*]" end=")" contained contains=@ocamlAENoParen,ocamlModParam1
129syn match    ocamlModParam1 "\<\u\(\w\|'\)*\>" contained skipwhite skipempty nextgroup=ocamlPreMPRestr
130
131syn region   ocamlPreMPRestr start="."me=e-1 end=")"me=e-1 contained contains=@ocamlAllErrs,ocamlComment,ocamlMPRestr,ocamlModTypeRestr
132
133syn region   ocamlMPRestr start=":" end="."me=e-1 contained contains=@ocamlComment skipwhite skipempty nextgroup=ocamlMPRestr1,ocamlMPRestr2,ocamlMPRestr3
134syn region   ocamlMPRestr1 matchgroup=ocamlModule start="\ssig\s\=" matchgroup=ocamlModule end="\<end\>" contained contains=ALLBUT,@ocamlContained,ocamlEndErr,ocamlModule
135syn region   ocamlMPRestr2 start="\sfunctor\(\s\|(\)\="me=e-1 matchgroup=ocamlKeyword end="->" contained contains=@ocamlAllErrs,ocamlComment,ocamlModParam skipwhite skipempty nextgroup=ocamlFuncWith,ocamlMPRestr2
136syn match    ocamlMPRestr3 "\w\(\w\|'\)*\(\.\w\(\w\|'\)*\)*" contained
137syn match    ocamlModPreRHS "=" contained skipwhite skipempty nextgroup=ocamlModParam,ocamlFullMod
138syn region   ocamlModRHS start="." end=".\w\|([^*]"me=e-2 contained contains=ocamlComment skipwhite skipempty nextgroup=ocamlModParam,ocamlFullMod
139syn match    ocamlFullMod "\<\u\(\w\|'\)*\(\.\u\(\w\|'\)*\)*" contained skipwhite skipempty nextgroup=ocamlFuncWith
140
141syn region   ocamlFuncWith start="([^*]"me=e-1 end=")" contained contains=ocamlComment,ocamlWith,ocamlFuncStruct skipwhite skipempty nextgroup=ocamlFuncWith
142syn region   ocamlFuncStruct matchgroup=ocamlModule start="[^a-zA-Z]struct\>"hs=s+1 matchgroup=ocamlModule end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
143
144syn match    ocamlModTypeRestr "\<\w\(\w\|'\)*\(\.\w\(\w\|'\)*\)*\>" contained
145syn region   ocamlModTRWith start=":\s*("hs=s+1 end=")" contained contains=@ocamlAENoParen,ocamlWith
146syn match    ocamlWith "\<\(\u\(\w\|'\)*\.\)*\w\(\w\|'\)*\>" contained skipwhite skipempty nextgroup=ocamlWithRest
147syn region   ocamlWithRest start="[^)]" end=")"me=e-1 contained contains=ALLBUT,@ocamlContained
148
149" "module type"
150syn region   ocamlKeyword start="\<module\>\s*\<type\>" matchgroup=ocamlModule end="\<\w\(\w\|'\)*\>" contains=ocamlComment skipwhite skipempty nextgroup=ocamlMTDef
151syn match    ocamlMTDef "=\s*\w\(\w\|'\)*\>"hs=s+1,me=s
152
153syn keyword  ocamlKeyword  and as assert class
154syn keyword  ocamlKeyword  constraint else
155syn keyword  ocamlKeyword  exception external fun
156
157syn keyword  ocamlKeyword  in inherit initializer
158syn keyword  ocamlKeyword  land lazy let match
159syn keyword  ocamlKeyword  method mutable new of
160syn keyword  ocamlKeyword  parser private raise rec
161syn keyword  ocamlKeyword  try type
162syn keyword  ocamlKeyword  val virtual when while with
163
164if exists("ocaml_revised")
165  syn keyword  ocamlKeyword  do value
166  syn keyword  ocamlBoolean  True False
167else
168  syn keyword  ocamlKeyword  function
169  syn keyword  ocamlBoolean  true false
170  syn match    ocamlKeyChar  "!"
171endif
172
173syn keyword  ocamlType     array bool char exn float format format4
174syn keyword  ocamlType     int int32 int64 lazy_t list nativeint option
175syn keyword  ocamlType     string unit
176
177syn keyword  ocamlOperator asr lor lsl lsr lxor mod not
178
179syn match    ocamlConstructor  "(\s*)"
180syn match    ocamlConstructor  "\[\s*\]"
181syn match    ocamlConstructor  "\[|\s*>|]"
182syn match    ocamlConstructor  "\[<\s*>\]"
183syn match    ocamlConstructor  "\u\(\w\|'\)*\>"
184
185" Polymorphic variants
186syn match    ocamlConstructor  "`\w\(\w\|'\)*\>"
187
188" Module prefix
189syn match    ocamlModPath      "\u\(\w\|'\)*\."he=e-1
190
191syn match    ocamlCharacter    "'\\\d\d\d'\|'\\[\'ntbr]'\|'.'"
192syn match    ocamlCharErr      "'\\\d\d'\|'\\\d'"
193syn match    ocamlCharErr      "'\\[^\'ntbr]'"
194syn region   ocamlString       start=+"+ skip=+\\\\\|\\"+ end=+"+
195
196syn match    ocamlFunDef       "->"
197syn match    ocamlRefAssign    ":="
198syn match    ocamlTopStop      ";;"
199syn match    ocamlOperator     "\^"
200syn match    ocamlOperator     "::"
201
202syn match    ocamlOperator     "&&"
203syn match    ocamlOperator     "<"
204syn match    ocamlOperator     ">"
205syn match    ocamlAnyVar       "\<_\>"
206syn match    ocamlKeyChar      "|[^\]]"me=e-1
207syn match    ocamlKeyChar      ";"
208syn match    ocamlKeyChar      "\~"
209syn match    ocamlKeyChar      "?"
210syn match    ocamlKeyChar      "\*"
211syn match    ocamlKeyChar      "="
212
213if exists("ocaml_revised")
214  syn match    ocamlErr        "<-"
215else
216  syn match    ocamlOperator   "<-"
217endif
218
219syn match    ocamlNumber        "\<-\=\d\(_\|\d\)*[l|L|n]\?\>"
220syn match    ocamlNumber        "\<-\=0[x|X]\(\x\|_\)\+[l|L|n]\?\>"
221syn match    ocamlNumber        "\<-\=0[o|O]\(\o\|_\)\+[l|L|n]\?\>"
222syn match    ocamlNumber        "\<-\=0[b|B]\([01]\|_\)\+[l|L|n]\?\>"
223syn match    ocamlFloat         "\<-\=\d\(_\|\d\)*\.\(_\|\d\)*\([eE][-+]\=\d\(_\|\d\)*\)\=\>"
224
225" Labels
226syn match    ocamlLabel        "\~\(\l\|_\)\(\w\|'\)*"lc=1
227syn match    ocamlLabel        "?\(\l\|_\)\(\w\|'\)*"lc=1
228syn region   ocamlLabel transparent matchgroup=ocamlLabel start="?(\(\l\|_\)\(\w\|'\)*"lc=2 end=")"me=e-1 contains=ALLBUT,@ocamlContained,ocamlParenErr
229
230
231" Synchronization
232syn sync minlines=50
233syn sync maxlines=500
234
235if !exists("ocaml_revised")
236  syn sync match ocamlDoSync      grouphere  ocamlDo      "\<do\>"
237  syn sync match ocamlDoSync      groupthere ocamlDo      "\<done\>"
238endif
239
240if exists("ocaml_revised")
241  syn sync match ocamlEndSync     grouphere  ocamlEnd     "\<\(object\)\>"
242else
243  syn sync match ocamlEndSync     grouphere  ocamlEnd     "\<\(begin\|object\)\>"
244endif
245
246syn sync match ocamlEndSync     groupthere ocamlEnd     "\<end\>"
247syn sync match ocamlStructSync  grouphere  ocamlStruct  "\<struct\>"
248syn sync match ocamlStructSync  groupthere ocamlStruct  "\<end\>"
249syn sync match ocamlSigSync     grouphere  ocamlSig     "\<sig\>"
250syn sync match ocamlSigSync     groupthere ocamlSig     "\<end\>"
251
252" Define the default highlighting.
253" For version 5.7 and earlier: only when not done already
254" For version 5.8 and later: only when an item doesn't have highlighting yet
255if version >= 508 || !exists("did_ocaml_syntax_inits")
256  if version < 508
257    let did_ocaml_syntax_inits = 1
258    command -nargs=+ HiLink hi link <args>
259  else
260    command -nargs=+ HiLink hi def link <args>
261  endif
262
263  HiLink ocamlBraceErr	   Error
264  HiLink ocamlBrackErr	   Error
265  HiLink ocamlParenErr	   Error
266  HiLink ocamlArrErr	   Error
267
268  HiLink ocamlCommentErr   Error
269
270  HiLink ocamlCountErr	   Error
271  HiLink ocamlDoErr	   Error
272  HiLink ocamlDoneErr	   Error
273  HiLink ocamlEndErr	   Error
274  HiLink ocamlThenErr	   Error
275
276  HiLink ocamlCharErr	   Error
277
278  HiLink ocamlErr	   Error
279
280  HiLink ocamlComment	   Comment
281
282  HiLink ocamlModPath	   Include
283  HiLink ocamlObject	   Include
284  HiLink ocamlModule	   Include
285  HiLink ocamlModParam1    Include
286  HiLink ocamlModType	   Include
287  HiLink ocamlMPRestr3	   Include
288  HiLink ocamlFullMod	   Include
289  HiLink ocamlModTypeRestr Include
290  HiLink ocamlWith	   Include
291  HiLink ocamlMTDef	   Include
292
293  HiLink ocamlScript	   Include
294
295  HiLink ocamlConstructor  Constant
296
297  HiLink ocamlModPreRHS    Keyword
298  HiLink ocamlMPRestr2	   Keyword
299  HiLink ocamlKeyword	   Keyword
300  HiLink ocamlMethod	   Include
301  HiLink ocamlFunDef	   Keyword
302  HiLink ocamlRefAssign    Keyword
303  HiLink ocamlKeyChar	   Keyword
304  HiLink ocamlAnyVar	   Keyword
305  HiLink ocamlTopStop	   Keyword
306  HiLink ocamlOperator	   Keyword
307
308  HiLink ocamlBoolean	   Boolean
309  HiLink ocamlCharacter    Character
310  HiLink ocamlNumber	   Number
311  HiLink ocamlFloat	   Float
312  HiLink ocamlString	   String
313
314  HiLink ocamlLabel	   Identifier
315
316  HiLink ocamlType	   Type
317
318  HiLink ocamlTodo	   Todo
319
320  HiLink ocamlEncl	   Keyword
321
322  delcommand HiLink
323endif
324
325let b:current_syntax = "ocaml"
326
327" vim: ts=8
328